summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/bgfx/uniformreader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/render/bgfx/uniformreader.cpp')
0 files changed, 0 insertions, 0 deletions
/> -rw-r--r--.github/ISSUE_TEMPLATE/config.yml14
-rw-r--r--.github/workflows/bgfxshaders.yml44
-rw-r--r--.github/workflows/ci-linux.yml76
-rw-r--r--.github/workflows/ci-macos.yml47
-rw-r--r--.github/workflows/ci-windows.yml86
-rw-r--r--.github/workflows/docs.yml38
-rw-r--r--.github/workflows/hash.yml38
-rw-r--r--.github/workflows/includeguards.yml26
-rw-r--r--.github/workflows/language.yml29
-rw-r--r--.gitignore51
-rw-r--r--.travis.yml44
-rw-r--r--3rdparty/README.md75
-rw-r--r--3rdparty/aes256cbc/AES_256_CBC.h993
-rw-r--r--3rdparty/aes256cbc/LICENSE21
-rw-r--r--3rdparty/aes256cbc/README.md231
-rw-r--r--3rdparty/asio/COPYING4
-rw-r--r--3rdparty/asio/INSTALL5
-rw-r--r--3rdparty/asio/LICENSE_1_0.txt23
-rw-r--r--3rdparty/asio/Makefile.am22
-rw-r--r--3rdparty/asio/Makefile.in845
-rw-r--r--3rdparty/asio/README4
-rw-r--r--3rdparty/asio/aclocal.m41462
-rw-r--r--3rdparty/asio/asio.pc.in11
-rwxr-xr-x3rdparty/asio/compile348
-rwxr-xr-x3rdparty/asio/config.guess1748
-rwxr-xr-x3rdparty/asio/config.sub1884
-rwxr-xr-x3rdparty/asio/configure7133
-rw-r--r--3rdparty/asio/configure.ac258
-rw-r--r--3rdparty/asio/depcomp791
-rw-r--r--3rdparty/asio/include/Makefile.am626
-rw-r--r--3rdparty/asio/include/Makefile.in1164
-rw-r--r--3rdparty/asio/include/asio.hpp199
-rw-r--r--3rdparty/asio/include/asio/any_completion_executor.hpp336
-rw-r--r--3rdparty/asio/include/asio/any_completion_handler.hpp822
-rw-r--r--3rdparty/asio/include/asio/any_io_executor.hpp351
-rw-r--r--3rdparty/asio/include/asio/append.hpp65
-rw-r--r--3rdparty/asio/include/asio/as_tuple.hpp126
-rw-r--r--3rdparty/asio/include/asio/associated_allocator.hpp214
-rw-r--r--3rdparty/asio/include/asio/associated_cancellation_slot.hpp221
-rw-r--r--3rdparty/asio/include/asio/associated_executor.hpp235
-rw-r--r--3rdparty/asio/include/asio/associated_immediate_executor.hpp280
-rw-r--r--3rdparty/asio/include/asio/associator.hpp35
-rw-r--r--3rdparty/asio/include/asio/async_result.hpp942
-rw-r--r--3rdparty/asio/include/asio/awaitable.hpp142
-rw-r--r--3rdparty/asio/include/asio/basic_datagram_socket.hpp1362
-rw-r--r--3rdparty/asio/include/asio/basic_deadline_timer.hpp710
-rw-r--r--3rdparty/asio/include/asio/basic_file.hpp824
-rw-r--r--3rdparty/asio/include/asio/basic_io_object.hpp286
-rw-r--r--3rdparty/asio/include/asio/basic_random_access_file.hpp689
-rw-r--r--3rdparty/asio/include/asio/basic_raw_socket.hpp1356
-rw-r--r--3rdparty/asio/include/asio/basic_readable_pipe.hpp626
-rw-r--r--3rdparty/asio/include/asio/basic_seq_packet_socket.hpp823
-rw-r--r--3rdparty/asio/include/asio/basic_serial_port.hpp987
-rw-r--r--3rdparty/asio/include/asio/basic_signal_set.hpp648
-rw-r--r--3rdparty/asio/include/asio/basic_socket.hpp1936
-rw-r--r--3rdparty/asio/include/asio/basic_socket_acceptor.hpp2708
-rw-r--r--3rdparty/asio/include/asio/basic_socket_iostream.hpp331
-rw-r--r--3rdparty/asio/include/asio/basic_socket_streambuf.hpp642
-rw-r--r--3rdparty/asio/include/asio/basic_stream_file.hpp744
-rw-r--r--3rdparty/asio/include/asio/basic_stream_socket.hpp1163
-rw-r--r--3rdparty/asio/include/asio/basic_streambuf.hpp450
-rw-r--r--3rdparty/asio/include/asio/basic_streambuf_fwd.hpp36
-rw-r--r--3rdparty/asio/include/asio/basic_waitable_timer.hpp824
-rw-r--r--3rdparty/asio/include/asio/basic_writable_pipe.hpp622
-rw-r--r--3rdparty/asio/include/asio/bind_allocator.hpp530
-rw-r--r--3rdparty/asio/include/asio/bind_cancellation_slot.hpp544
-rw-r--r--3rdparty/asio/include/asio/bind_executor.hpp582
-rw-r--r--3rdparty/asio/include/asio/bind_immediate_executor.hpp549
-rw-r--r--3rdparty/asio/include/asio/buffer.hpp2751
-rw-r--r--3rdparty/asio/include/asio/buffer_registration.hpp318
-rw-r--r--3rdparty/asio/include/asio/buffered_read_stream.hpp273
-rw-r--r--3rdparty/asio/include/asio/buffered_read_stream_fwd.hpp25
-rw-r--r--3rdparty/asio/include/asio/buffered_stream.hpp292
-rw-r--r--3rdparty/asio/include/asio/buffered_stream_fwd.hpp25
-rw-r--r--3rdparty/asio/include/asio/buffered_write_stream.hpp265
-rw-r--r--3rdparty/asio/include/asio/buffered_write_stream_fwd.hpp25
-rw-r--r--3rdparty/asio/include/asio/buffers_iterator.hpp521
-rw-r--r--3rdparty/asio/include/asio/cancellation_signal.hpp245
-rw-r--r--3rdparty/asio/include/asio/cancellation_state.hpp235
-rw-r--r--3rdparty/asio/include/asio/cancellation_type.hpp157
-rw-r--r--3rdparty/asio/include/asio/co_spawn.hpp523
-rw-r--r--3rdparty/asio/include/asio/completion_condition.hpp218
-rw-r--r--3rdparty/asio/include/asio/compose.hpp319
-rw-r--r--3rdparty/asio/include/asio/connect.hpp1180
-rw-r--r--3rdparty/asio/include/asio/connect_pipe.hpp83
-rw-r--r--3rdparty/asio/include/asio/consign.hpp75
-rw-r--r--3rdparty/asio/include/asio/coroutine.hpp329
-rw-r--r--3rdparty/asio/include/asio/deadline_timer.hpp38
-rw-r--r--3rdparty/asio/include/asio/defer.hpp218
-rw-r--r--3rdparty/asio/include/asio/deferred.hpp715
-rw-r--r--3rdparty/asio/include/asio/detached.hpp105
-rw-r--r--3rdparty/asio/include/asio/detail/array.hpp30
-rw-r--r--3rdparty/asio/include/asio/detail/array_fwd.hpp32
-rw-r--r--3rdparty/asio/include/asio/detail/assert.hpp32
-rw-r--r--3rdparty/asio/include/asio/detail/atomic_count.hpp59
-rw-r--r--3rdparty/asio/include/asio/detail/base_from_cancellation_state.hpp164
-rw-r--r--3rdparty/asio/include/asio/detail/base_from_completion_cond.hpp69
-rw-r--r--3rdparty/asio/include/asio/detail/bind_handler.hpp711
-rw-r--r--3rdparty/asio/include/asio/detail/blocking_executor_op.hpp107
-rw-r--r--3rdparty/asio/include/asio/detail/buffer_resize_guard.hpp66
-rw-r--r--3rdparty/asio/include/asio/detail/buffer_sequence_adapter.hpp837
-rw-r--r--3rdparty/asio/include/asio/detail/buffered_stream_storage.hpp126
-rw-r--r--3rdparty/asio/include/asio/detail/call_stack.hpp125
-rw-r--r--3rdparty/asio/include/asio/detail/chrono.hpp45
-rw-r--r--3rdparty/asio/include/asio/detail/chrono_time_traits.hpp190
-rw-r--r--3rdparty/asio/include/asio/detail/completion_handler.hpp88
-rw-r--r--3rdparty/asio/include/asio/detail/composed_work.hpp252
-rw-r--r--3rdparty/asio/include/asio/detail/concurrency_hint.hpp94
-rw-r--r--3rdparty/asio/include/asio/detail/conditionally_enabled_event.hpp120
-rw-r--r--3rdparty/asio/include/asio/detail/conditionally_enabled_mutex.hpp149
-rw-r--r--3rdparty/asio/include/asio/detail/config.hpp1422
-rw-r--r--3rdparty/asio/include/asio/detail/consuming_buffers.hpp443
-rw-r--r--3rdparty/asio/include/asio/detail/cstddef.hpp27
-rw-r--r--3rdparty/asio/include/asio/detail/cstdint.hpp40
-rw-r--r--3rdparty/asio/include/asio/detail/date_time_fwd.hpp34
-rw-r--r--3rdparty/asio/include/asio/detail/deadline_timer_service.hpp335
-rw-r--r--3rdparty/asio/include/asio/detail/dependent_type.hpp36
-rw-r--r--3rdparty/asio/include/asio/detail/descriptor_ops.hpp179
-rw-r--r--3rdparty/asio/include/asio/detail/descriptor_read_op.hpp188
-rw-r--r--3rdparty/asio/include/asio/detail/descriptor_write_op.hpp187
-rw-r--r--3rdparty/asio/include/asio/detail/dev_poll_reactor.hpp247
-rw-r--r--3rdparty/asio/include/asio/detail/epoll_reactor.hpp295
-rw-r--r--3rdparty/asio/include/asio/detail/event.hpp46
-rw-r--r--3rdparty/asio/include/asio/detail/eventfd_select_interrupter.hpp83
-rw-r--r--3rdparty/asio/include/asio/detail/exception.hpp29
-rw-r--r--3rdparty/asio/include/asio/detail/executor_function.hpp152
-rw-r--r--3rdparty/asio/include/asio/detail/executor_op.hpp84
-rw-r--r--3rdparty/asio/include/asio/detail/fd_set_adapter.hpp39
-rw-r--r--3rdparty/asio/include/asio/detail/fenced_block.hpp40
-rw-r--r--3rdparty/asio/include/asio/detail/functional.hpp33
-rw-r--r--3rdparty/asio/include/asio/detail/future.hpp32
-rw-r--r--3rdparty/asio/include/asio/detail/global.hpp50
-rw-r--r--3rdparty/asio/include/asio/detail/handler_alloc_helpers.hpp225
-rw-r--r--3rdparty/asio/include/asio/detail/handler_cont_helpers.hpp45
-rw-r--r--3rdparty/asio/include/asio/detail/handler_tracking.hpp264
-rw-r--r--3rdparty/asio/include/asio/detail/handler_type_requirements.hpp553
-rw-r--r--3rdparty/asio/include/asio/detail/handler_work.hpp511
-rw-r--r--3rdparty/asio/include/asio/detail/hash_map.hpp331
-rw-r--r--3rdparty/asio/include/asio/detail/impl/buffer_sequence_adapter.ipp118
-rw-r--r--3rdparty/asio/include/asio/detail/impl/descriptor_ops.ipp991
-rw-r--r--3rdparty/asio/include/asio/detail/impl/dev_poll_reactor.hpp111
-rw-r--r--3rdparty/asio/include/asio/detail/impl/dev_poll_reactor.ipp469
-rw-r--r--3rdparty/asio/include/asio/detail/impl/epoll_reactor.hpp109
-rw-r--r--3rdparty/asio/include/asio/detail/impl/epoll_reactor.ipp826
-rw-r--r--3rdparty/asio/include/asio/detail/impl/eventfd_select_interrupter.ipp171
-rw-r--r--3rdparty/asio/include/asio/detail/impl/handler_tracking.ipp398
-rw-r--r--3rdparty/asio/include/asio/detail/impl/io_uring_descriptor_service.ipp205
-rw-r--r--3rdparty/asio/include/asio/detail/impl/io_uring_file_service.ipp140
-rw-r--r--3rdparty/asio/include/asio/detail/impl/io_uring_service.hpp112
-rw-r--r--3rdparty/asio/include/asio/detail/impl/io_uring_service.ipp914
-rw-r--r--3rdparty/asio/include/asio/detail/impl/io_uring_socket_service_base.ipp249
-rw-r--r--3rdparty/asio/include/asio/detail/impl/kqueue_reactor.hpp113
-rw-r--r--3rdparty/asio/include/asio/detail/impl/kqueue_reactor.ipp608
-rw-r--r--3rdparty/asio/include/asio/detail/impl/null_event.ipp74
-rw-r--r--3rdparty/asio/include/asio/detail/impl/pipe_select_interrupter.ipp129
-rw-r--r--3rdparty/asio/include/asio/detail/impl/posix_event.ipp63
-rw-r--r--3rdparty/asio/include/asio/detail/impl/posix_mutex.ipp46
-rw-r--r--3rdparty/asio/include/asio/detail/impl/posix_serial_port_service.ipp168
-rw-r--r--3rdparty/asio/include/asio/detail/impl/posix_thread.ipp84
-rw-r--r--3rdparty/asio/include/asio/detail/impl/posix_tss_ptr.ipp46
-rw-r--r--3rdparty/asio/include/asio/detail/impl/reactive_descriptor_service.ipp230
-rw-r--r--3rdparty/asio/include/asio/detail/impl/reactive_socket_service_base.ipp310
-rw-r--r--3rdparty/asio/include/asio/detail/impl/resolver_service_base.ipp158
-rw-r--r--3rdparty/asio/include/asio/detail/impl/scheduler.ipp675
-rw-r--r--3rdparty/asio/include/asio/detail/impl/select_reactor.hpp124
-rw-r--r--3rdparty/asio/include/asio/detail/impl/select_reactor.ipp400
-rw-r--r--3rdparty/asio/include/asio/detail/impl/service_registry.hpp93
-rw-r--r--3rdparty/asio/include/asio/detail/impl/service_registry.ipp197
-rw-r--r--3rdparty/asio/include/asio/detail/impl/signal_set_service.ipp826
-rw-r--r--3rdparty/asio/include/asio/detail/impl/socket_ops.ipp4035
-rw-r--r--3rdparty/asio/include/asio/detail/impl/socket_select_interrupter.ipp185
-rw-r--r--3rdparty/asio/include/asio/detail/impl/strand_executor_service.hpp346
-rw-r--r--3rdparty/asio/include/asio/detail/impl/strand_executor_service.ipp158
-rw-r--r--3rdparty/asio/include/asio/detail/impl/strand_service.hpp86
-rw-r--r--3rdparty/asio/include/asio/detail/impl/strand_service.ipp202
-rw-r--r--3rdparty/asio/include/asio/detail/impl/thread_context.ipp35
-rw-r--r--3rdparty/asio/include/asio/detail/impl/throw_error.ipp49
-rw-r--r--3rdparty/asio/include/asio/detail/impl/timer_queue_ptime.ipp97
-rw-r--r--3rdparty/asio/include/asio/detail/impl/timer_queue_set.ipp101
-rw-r--r--3rdparty/asio/include/asio/detail/impl/win_event.ipp76
-rw-r--r--3rdparty/asio/include/asio/detail/impl/win_iocp_file_service.ipp280
-rw-r--r--3rdparty/asio/include/asio/detail/impl/win_iocp_handle_service.ipp619
-rw-r--r--3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.hpp119
-rw-r--r--3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.ipp614
-rw-r--r--3rdparty/asio/include/asio/detail/impl/win_iocp_serial_port_service.ipp200
-rw-r--r--3rdparty/asio/include/asio/detail/impl/win_iocp_socket_service_base.ipp821
-rw-r--r--3rdparty/asio/include/asio/detail/impl/win_mutex.ipp84
-rw-r--r--3rdparty/asio/include/asio/detail/impl/win_object_handle_service.ipp452
-rw-r--r--3rdparty/asio/include/asio/detail/impl/win_static_mutex.ipp136
-rw-r--r--3rdparty/asio/include/asio/detail/impl/win_thread.ipp150
-rw-r--r--3rdparty/asio/include/asio/detail/impl/win_tss_ptr.ipp57
-rw-r--r--3rdparty/asio/include/asio/detail/impl/winrt_ssocket_service_base.ipp626
-rw-r--r--3rdparty/asio/include/asio/detail/impl/winrt_timer_scheduler.hpp92
-rw-r--r--3rdparty/asio/include/asio/detail/impl/winrt_timer_scheduler.ipp121
-rw-r--r--3rdparty/asio/include/asio/detail/impl/winsock_init.ipp82
-rw-r--r--3rdparty/asio/include/asio/detail/initiate_defer.hpp207
-rw-r--r--3rdparty/asio/include/asio/detail/initiate_dispatch.hpp193
-rw-r--r--3rdparty/asio/include/asio/detail/initiate_post.hpp207
-rw-r--r--3rdparty/asio/include/asio/detail/io_control.hpp84
-rw-r--r--3rdparty/asio/include/asio/detail/io_object_impl.hpp177
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_descriptor_read_at_op.hpp195
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_descriptor_read_op.hpp190
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_descriptor_service.hpp687
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_descriptor_write_at_op.hpp189
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_descriptor_write_op.hpp185
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_file_service.hpp261
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_null_buffers_op.hpp114
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_operation.hpp84
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_service.hpp319
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_socket_accept_op.hpp280
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_socket_connect_op.hpp140
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_socket_recv_op.hpp205
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_socket_recvfrom_op.hpp206
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_socket_recvmsg_op.hpp192
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_socket_send_op.hpp191
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_socket_sendto_op.hpp194
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_socket_service.hpp629
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_socket_service_base.hpp663
-rw-r--r--3rdparty/asio/include/asio/detail/io_uring_wait_op.hpp112
-rw-r--r--3rdparty/asio/include/asio/detail/is_buffer_sequence.hpp296
-rw-r--r--3rdparty/asio/include/asio/detail/is_executor.hpp126
-rw-r--r--3rdparty/asio/include/asio/detail/keyword_tss_ptr.hpp70
-rw-r--r--3rdparty/asio/include/asio/detail/kqueue_reactor.hpp271
-rw-r--r--3rdparty/asio/include/asio/detail/limits.hpp21
-rw-r--r--3rdparty/asio/include/asio/detail/local_free_on_block_exit.hpp59
-rw-r--r--3rdparty/asio/include/asio/detail/memory.hpp126
-rw-r--r--3rdparty/asio/include/asio/detail/mutex.hpp46
-rw-r--r--3rdparty/asio/include/asio/detail/non_const_lvalue.hpp43
-rw-r--r--3rdparty/asio/include/asio/detail/noncopyable.hpp43
-rw-r--r--3rdparty/asio/include/asio/detail/null_event.hpp106
-rw-r--r--3rdparty/asio/include/asio/detail/null_fenced_block.hpp47
-rw-r--r--3rdparty/asio/include/asio/detail/null_global.hpp59
-rw-r--r--3rdparty/asio/include/asio/detail/null_mutex.hpp60
-rw-r--r--3rdparty/asio/include/asio/detail/null_reactor.hpp83
-rw-r--r--3rdparty/asio/include/asio/detail/null_signal_blocker.hpp69
-rw-r--r--3rdparty/asio/include/asio/detail/null_socket_service.hpp519
-rw-r--r--3rdparty/asio/include/asio/detail/null_static_mutex.hpp60
-rw-r--r--3rdparty/asio/include/asio/detail/null_thread.hpp67
-rw-r--r--3rdparty/asio/include/asio/detail/null_tss_ptr.hpp68
-rw-r--r--3rdparty/asio/include/asio/detail/object_pool.hpp171
-rw-r--r--3rdparty/asio/include/asio/detail/old_win_sdk_compat.hpp214
-rw-r--r--3rdparty/asio/include/asio/detail/op_queue.hpp162
-rw-r--r--3rdparty/asio/include/asio/detail/operation.hpp38
-rw-r--r--3rdparty/asio/include/asio/detail/pipe_select_interrupter.hpp89
-rw-r--r--3rdparty/asio/include/asio/detail/pop_options.hpp157
-rw-r--r--3rdparty/asio/include/asio/detail/posix_event.hpp175
-rw-r--r--3rdparty/asio/include/asio/detail/posix_fd_set_adapter.hpp118
-rw-r--r--3rdparty/asio/include/asio/detail/posix_global.hpp80
-rw-r--r--3rdparty/asio/include/asio/detail/posix_mutex.hpp76
-rw-r--r--3rdparty/asio/include/asio/detail/posix_serial_port_service.hpp249
-rw-r--r--3rdparty/asio/include/asio/detail/posix_signal_blocker.hpp85
-rw-r--r--3rdparty/asio/include/asio/detail/posix_static_mutex.hpp64
-rw-r--r--3rdparty/asio/include/asio/detail/posix_thread.hpp109
-rw-r--r--3rdparty/asio/include/asio/detail/posix_tss_ptr.hpp79
-rw-r--r--3rdparty/asio/include/asio/detail/push_options.hpp228
-rw-r--r--3rdparty/asio/include/asio/detail/reactive_descriptor_service.hpp566
-rw-r--r--3rdparty/asio/include/asio/detail/reactive_null_buffers_op.hpp131
-rw-r--r--3rdparty/asio/include/asio/detail/reactive_socket_accept_op.hpp323
-rw-r--r--3rdparty/asio/include/asio/detail/reactive_socket_connect_op.hpp162
-rw-r--r--3rdparty/asio/include/asio/detail/reactive_socket_recv_op.hpp197
-rw-r--r--3rdparty/asio/include/asio/detail/reactive_socket_recvfrom_op.hpp203
-rw-r--r--3rdparty/asio/include/asio/detail/reactive_socket_recvmsg_op.hpp184
-rw-r--r--3rdparty/asio/include/asio/detail/reactive_socket_send_op.hpp201
-rw-r--r--3rdparty/asio/include/asio/detail/reactive_socket_sendto_op.hpp194
-rw-r--r--3rdparty/asio/include/asio/detail/reactive_socket_service.hpp633
-rw-r--r--3rdparty/asio/include/asio/detail/reactive_socket_service_base.hpp750
-rw-r--r--3rdparty/asio/include/asio/detail/reactive_wait_op.hpp131
-rw-r--r--3rdparty/asio/include/asio/detail/reactor.hpp54
-rw-r--r--3rdparty/asio/include/asio/detail/reactor_op.hpp71
-rw-r--r--3rdparty/asio/include/asio/detail/reactor_op_queue.hpp212
-rw-r--r--3rdparty/asio/include/asio/detail/recycling_allocator.hpp105
-rw-r--r--3rdparty/asio/include/asio/detail/regex_fwd.hpp35
-rw-r--r--3rdparty/asio/include/asio/detail/resolve_endpoint_op.hpp140
-rw-r--r--3rdparty/asio/include/asio/detail/resolve_op.hpp45
-rw-r--r--3rdparty/asio/include/asio/detail/resolve_query_op.hpp150
-rw-r--r--3rdparty/asio/include/asio/detail/resolver_service.hpp147
-rw-r--r--3rdparty/asio/include/asio/detail/resolver_service_base.hpp158
-rw-r--r--3rdparty/asio/include/asio/detail/scheduler.hpp241
-rw-r--r--3rdparty/asio/include/asio/detail/scheduler_operation.hpp78
-rw-r--r--3rdparty/asio/include/asio/detail/scheduler_task.hpp49
-rw-r--r--3rdparty/asio/include/asio/detail/scheduler_thread_info.hpp40
-rw-r--r--3rdparty/asio/include/asio/detail/scoped_lock.hpp101
-rw-r--r--3rdparty/asio/include/asio/detail/scoped_ptr.hpp87
-rw-r--r--3rdparty/asio/include/asio/detail/select_interrupter.hpp46
-rw-r--r--3rdparty/asio/include/asio/detail/select_reactor.hpp291
-rw-r--r--3rdparty/asio/include/asio/detail/service_registry.hpp163
-rw-r--r--3rdparty/asio/include/asio/detail/signal_blocker.hpp44
-rw-r--r--3rdparty/asio/include/asio/detail/signal_handler.hpp90
-rw-r--r--3rdparty/asio/include/asio/detail/signal_init.hpp47
-rw-r--r--3rdparty/asio/include/asio/detail/signal_op.hpp53
-rw-r--r--3rdparty/asio/include/asio/detail/signal_set_service.hpp292
-rw-r--r--3rdparty/asio/include/asio/detail/socket_holder.hpp98
-rw-r--r--3rdparty/asio/include/asio/detail/socket_ops.hpp375
-rw-r--r--3rdparty/asio/include/asio/detail/socket_option.hpp316
-rw-r--r--3rdparty/asio/include/asio/detail/socket_select_interrupter.hpp91
-rw-r--r--3rdparty/asio/include/asio/detail/socket_types.hpp427
-rw-r--r--3rdparty/asio/include/asio/detail/source_location.hpp45
-rw-r--r--3rdparty/asio/include/asio/detail/static_mutex.hpp50
-rw-r--r--3rdparty/asio/include/asio/detail/std_event.hpp183
-rw-r--r--3rdparty/asio/include/asio/detail/std_fenced_block.hpp57
-rw-r--r--3rdparty/asio/include/asio/detail/std_global.hpp65
-rw-r--r--3rdparty/asio/include/asio/detail/std_mutex.hpp68
-rw-r--r--3rdparty/asio/include/asio/detail/std_static_mutex.hpp76
-rw-r--r--3rdparty/asio/include/asio/detail/std_thread.hpp66
-rw-r--r--3rdparty/asio/include/asio/detail/strand_executor_service.hpp173
-rw-r--r--3rdparty/asio/include/asio/detail/strand_service.hpp144
-rw-r--r--3rdparty/asio/include/asio/detail/string_view.hpp47
-rw-r--r--3rdparty/asio/include/asio/detail/thread.hpp58
-rw-r--r--3rdparty/asio/include/asio/detail/thread_context.hpp51
-rw-r--r--3rdparty/asio/include/asio/detail/thread_group.hpp99
-rw-r--r--3rdparty/asio/include/asio/detail/thread_info_base.hpp250
-rw-r--r--3rdparty/asio/include/asio/detail/throw_error.hpp62
-rw-r--r--3rdparty/asio/include/asio/detail/throw_exception.hpp55
-rw-r--r--3rdparty/asio/include/asio/detail/timer_queue.hpp389
-rw-r--r--3rdparty/asio/include/asio/detail/timer_queue_base.hpp68
-rw-r--r--3rdparty/asio/include/asio/detail/timer_queue_ptime.hpp103
-rw-r--r--3rdparty/asio/include/asio/detail/timer_queue_set.hpp66
-rw-r--r--3rdparty/asio/include/asio/detail/timer_scheduler.hpp37
-rw-r--r--3rdparty/asio/include/asio/detail/timer_scheduler_fwd.hpp42
-rw-r--r--3rdparty/asio/include/asio/detail/tss_ptr.hpp69
-rw-r--r--3rdparty/asio/include/asio/detail/type_traits.hpp178
-rw-r--r--3rdparty/asio/include/asio/detail/utility.hpp83
-rw-r--r--3rdparty/asio/include/asio/detail/wait_handler.hpp90
-rw-r--r--3rdparty/asio/include/asio/detail/wait_op.hpp49
-rw-r--r--3rdparty/asio/include/asio/detail/win_event.hpp164
-rw-r--r--3rdparty/asio/include/asio/detail/win_fd_set_adapter.hpp149
-rw-r--r--3rdparty/asio/include/asio/detail/win_global.hpp71
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_file_service.hpp287
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_handle_read_op.hpp119
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_handle_service.hpp431
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_handle_write_op.hpp114
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_io_context.hpp347
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_null_buffers_op.hpp129
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_operation.hpp96
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_overlapped_op.hpp100
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp171
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_serial_port_service.hpp233
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_socket_accept_op.hpp339
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_socket_connect_op.hpp138
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_socket_recv_op.hpp126
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_socket_recvfrom_op.hpp135
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_socket_recvmsg_op.hpp127
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_socket_send_op.hpp120
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_socket_service.hpp680
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_socket_service_base.hpp829
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_thread_info.hpp34
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_wait_op.hpp130
-rw-r--r--3rdparty/asio/include/asio/detail/win_mutex.hpp78
-rw-r--r--3rdparty/asio/include/asio/detail/win_object_handle_service.hpp194
-rw-r--r--3rdparty/asio/include/asio/detail/win_static_mutex.hpp74
-rw-r--r--3rdparty/asio/include/asio/detail/win_thread.hpp147
-rw-r--r--3rdparty/asio/include/asio/detail/win_tss_ptr.hpp79
-rw-r--r--3rdparty/asio/include/asio/detail/winapp_thread.hpp124
-rw-r--r--3rdparty/asio/include/asio/detail/wince_thread.hpp124
-rw-r--r--3rdparty/asio/include/asio/detail/winrt_async_manager.hpp305
-rw-r--r--3rdparty/asio/include/asio/detail/winrt_async_op.hpp65
-rw-r--r--3rdparty/asio/include/asio/detail/winrt_resolve_op.hpp125
-rw-r--r--3rdparty/asio/include/asio/detail/winrt_resolver_service.hpp212
-rw-r--r--3rdparty/asio/include/asio/detail/winrt_socket_connect_op.hpp98
-rw-r--r--3rdparty/asio/include/asio/detail/winrt_socket_recv_op.hpp119
-rw-r--r--3rdparty/asio/include/asio/detail/winrt_socket_send_op.hpp110
-rw-r--r--3rdparty/asio/include/asio/detail/winrt_ssocket_service.hpp250
-rw-r--r--3rdparty/asio/include/asio/detail/winrt_ssocket_service_base.hpp362
-rw-r--r--3rdparty/asio/include/asio/detail/winrt_timer_scheduler.hpp147
-rw-r--r--3rdparty/asio/include/asio/detail/winrt_utils.hpp106
-rw-r--r--3rdparty/asio/include/asio/detail/winsock_init.hpp128
-rw-r--r--3rdparty/asio/include/asio/detail/work_dispatcher.hpp143
-rw-r--r--3rdparty/asio/include/asio/detail/wrapped_handler.hpp217
-rw-r--r--3rdparty/asio/include/asio/dispatch.hpp197
-rw-r--r--3rdparty/asio/include/asio/error.hpp389
-rw-r--r--3rdparty/asio/include/asio/error_code.hpp39
-rw-r--r--3rdparty/asio/include/asio/execution.hpp33
-rw-r--r--3rdparty/asio/include/asio/execution/allocator.hpp278
-rw-r--r--3rdparty/asio/include/asio/execution/any_executor.hpp1933
-rw-r--r--3rdparty/asio/include/asio/execution/bad_executor.hpp46
-rw-r--r--3rdparty/asio/include/asio/execution/blocking.hpp1360
-rw-r--r--3rdparty/asio/include/asio/execution/blocking_adaptation.hpp1080
-rw-r--r--3rdparty/asio/include/asio/execution/context.hpp191
-rw-r--r--3rdparty/asio/include/asio/execution/context_as.hpp190
-rw-r--r--3rdparty/asio/include/asio/execution/executor.hpp116
-rw-r--r--3rdparty/asio/include/asio/execution/impl/bad_executor.ipp40
-rw-r--r--3rdparty/asio/include/asio/execution/invocable_archetype.hpp43
-rw-r--r--3rdparty/asio/include/asio/execution/mapping.hpp1002
-rw-r--r--3rdparty/asio/include/asio/execution/occupancy.hpp184
-rw-r--r--3rdparty/asio/include/asio/execution/outstanding_work.hpp753
-rw-r--r--3rdparty/asio/include/asio/execution/prefer_only.hpp328
-rw-r--r--3rdparty/asio/include/asio/execution/relationship.hpp751
-rw-r--r--3rdparty/asio/include/asio/execution_context.hpp388
-rw-r--r--3rdparty/asio/include/asio/executor.hpp363
-rw-r--r--3rdparty/asio/include/asio/executor_work_guard.hpp362
-rw-r--r--3rdparty/asio/include/asio/experimental/append.hpp36
-rw-r--r--3rdparty/asio/include/asio/experimental/as_single.hpp132
-rw-r--r--3rdparty/asio/include/asio/experimental/as_tuple.hpp36
-rw-r--r--3rdparty/asio/include/asio/experimental/awaitable_operators.hpp536
-rw-r--r--3rdparty/asio/include/asio/experimental/basic_channel.hpp513
-rw-r--r--3rdparty/asio/include/asio/experimental/basic_concurrent_channel.hpp513
-rw-r--r--3rdparty/asio/include/asio/experimental/cancellation_condition.hpp152
-rw-r--r--3rdparty/asio/include/asio/experimental/channel.hpp70
-rw-r--r--3rdparty/asio/include/asio/experimental/channel_error.hpp82
-rw-r--r--3rdparty/asio/include/asio/experimental/channel_traits.hpp301
-rw-r--r--3rdparty/asio/include/asio/experimental/co_composed.hpp145
-rw-r--r--3rdparty/asio/include/asio/experimental/co_spawn.hpp187
-rw-r--r--3rdparty/asio/include/asio/experimental/concurrent_channel.hpp70
-rw-r--r--3rdparty/asio/include/asio/experimental/coro.hpp293
-rw-r--r--3rdparty/asio/include/asio/experimental/coro_traits.hpp228
-rw-r--r--3rdparty/asio/include/asio/experimental/deferred.hpp36
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/channel_handler.hpp77
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/channel_message.hpp129
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/channel_operation.hpp361
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/channel_payload.hpp222
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/channel_receive_op.hpp127
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/channel_send_functions.hpp192
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/channel_send_op.hpp148
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/channel_service.hpp677
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/coro_completion_handler.hpp169
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/coro_promise_allocator.hpp141
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/has_signature.hpp54
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/impl/channel_service.hpp621
-rw-r--r--3rdparty/asio/include/asio/experimental/detail/partial_promise.hpp197
-rw-r--r--3rdparty/asio/include/asio/experimental/impl/as_single.hpp176
-rw-r--r--3rdparty/asio/include/asio/experimental/impl/channel_error.ipp61
-rw-r--r--3rdparty/asio/include/asio/experimental/impl/co_composed.hpp1174
-rw-r--r--3rdparty/asio/include/asio/experimental/impl/coro.hpp1222
-rw-r--r--3rdparty/asio/include/asio/experimental/impl/parallel_group.hpp788
-rw-r--r--3rdparty/asio/include/asio/experimental/impl/promise.hpp255
-rw-r--r--3rdparty/asio/include/asio/experimental/impl/use_coro.hpp214
-rw-r--r--3rdparty/asio/include/asio/experimental/impl/use_promise.hpp66
-rw-r--r--3rdparty/asio/include/asio/experimental/parallel_group.hpp457
-rw-r--r--3rdparty/asio/include/asio/experimental/prepend.hpp36
-rw-r--r--3rdparty/asio/include/asio/experimental/promise.hpp224
-rw-r--r--3rdparty/asio/include/asio/experimental/use_coro.hpp189
-rw-r--r--3rdparty/asio/include/asio/experimental/use_promise.hpp111
-rw-r--r--3rdparty/asio/include/asio/file_base.hpp166
-rw-r--r--3rdparty/asio/include/asio/generic/basic_endpoint.hpp189
-rw-r--r--3rdparty/asio/include/asio/generic/datagram_protocol.hpp123
-rw-r--r--3rdparty/asio/include/asio/generic/detail/endpoint.hpp133
-rw-r--r--3rdparty/asio/include/asio/generic/detail/impl/endpoint.ipp110
-rw-r--r--3rdparty/asio/include/asio/generic/raw_protocol.hpp121
-rw-r--r--3rdparty/asio/include/asio/generic/seq_packet_protocol.hpp122
-rw-r--r--3rdparty/asio/include/asio/generic/stream_protocol.hpp127
-rw-r--r--3rdparty/asio/include/asio/handler_continuation_hook.hpp54
-rw-r--r--3rdparty/asio/include/asio/high_resolution_timer.hpp39
-rw-r--r--3rdparty/asio/include/asio/impl/any_completion_executor.ipp126
-rw-r--r--3rdparty/asio/include/asio/impl/any_io_executor.ipp134
-rw-r--r--3rdparty/asio/include/asio/impl/append.hpp162
-rw-r--r--3rdparty/asio/include/asio/impl/as_tuple.hpp245
-rw-r--r--3rdparty/asio/include/asio/impl/awaitable.hpp1196
-rw-r--r--3rdparty/asio/include/asio/impl/buffered_read_stream.hpp404
-rw-r--r--3rdparty/asio/include/asio/impl/buffered_write_stream.hpp384
-rw-r--r--3rdparty/asio/include/asio/impl/cancellation_signal.ipp96
-rw-r--r--3rdparty/asio/include/asio/impl/co_spawn.hpp449
-rw-r--r--3rdparty/asio/include/asio/impl/connect.hpp809
-rw-r--r--3rdparty/asio/include/asio/impl/connect_pipe.hpp73
-rw-r--r--3rdparty/asio/include/asio/impl/connect_pipe.ipp149
-rw-r--r--3rdparty/asio/include/asio/impl/consign.hpp137
-rw-r--r--3rdparty/asio/include/asio/impl/deferred.hpp147
-rw-r--r--3rdparty/asio/include/asio/impl/detached.hpp77
-rw-r--r--3rdparty/asio/include/asio/impl/error.ipp128
-rw-r--r--3rdparty/asio/include/asio/impl/error_code.ipp206
-rw-r--r--3rdparty/asio/include/asio/impl/execution_context.hpp77
-rw-r--r--3rdparty/asio/include/asio/impl/execution_context.ipp82
-rw-r--r--3rdparty/asio/include/asio/impl/executor.hpp317
-rw-r--r--3rdparty/asio/include/asio/impl/executor.ipp43
-rw-r--r--3rdparty/asio/include/asio/impl/io_context.hpp433
-rw-r--r--3rdparty/asio/include/asio/impl/io_context.ipp176
-rw-r--r--3rdparty/asio/include/asio/impl/multiple_exceptions.ipp45
-rw-r--r--3rdparty/asio/include/asio/impl/prepend.hpp163
-rw-r--r--3rdparty/asio/include/asio/impl/read.hpp1053
-rw-r--r--3rdparty/asio/include/asio/impl/read_at.hpp628
-rw-r--r--3rdparty/asio/include/asio/impl/read_until.hpp2941
-rw-r--r--3rdparty/asio/include/asio/impl/redirect_error.hpp250
-rw-r--r--3rdparty/asio/include/asio/impl/serial_port_base.hpp59
-rw-r--r--3rdparty/asio/include/asio/impl/serial_port_base.ipp554
-rw-r--r--3rdparty/asio/include/asio/impl/spawn.hpp1400
-rw-r--r--3rdparty/asio/include/asio/impl/src.hpp94
-rw-r--r--3rdparty/asio/include/asio/impl/system_context.hpp34
-rw-r--r--3rdparty/asio/include/asio/impl/system_context.ipp92
-rw-r--r--3rdparty/asio/include/asio/impl/system_executor.hpp179
-rw-r--r--3rdparty/asio/include/asio/impl/thread_pool.hpp277
-rw-r--r--3rdparty/asio/include/asio/impl/thread_pool.ipp142
-rw-r--r--3rdparty/asio/include/asio/impl/use_awaitable.hpp301
-rw-r--r--3rdparty/asio/include/asio/impl/use_future.hpp707
-rw-r--r--3rdparty/asio/include/asio/impl/write.hpp939
-rw-r--r--3rdparty/asio/include/asio/impl/write_at.hpp551
-rw-r--r--3rdparty/asio/include/asio/io_context.hpp1505
-rw-r--r--3rdparty/asio/include/asio/io_context_strand.hpp396
-rw-r--r--3rdparty/asio/include/asio/io_service.hpp33
-rw-r--r--3rdparty/asio/include/asio/io_service_strand.hpp20
-rw-r--r--3rdparty/asio/include/asio/ip/address.hpp281
-rw-r--r--3rdparty/asio/include/asio/ip/address_v4.hpp421
-rw-r--r--3rdparty/asio/include/asio/ip/address_v4_iterator.hpp156
-rw-r--r--3rdparty/asio/include/asio/ip/address_v4_range.hpp128
-rw-r--r--3rdparty/asio/include/asio/ip/address_v6.hpp407
-rw-r--r--3rdparty/asio/include/asio/ip/address_v6_iterator.hpp178
-rw-r--r--3rdparty/asio/include/asio/ip/address_v6_range.hpp124
-rw-r--r--3rdparty/asio/include/asio/ip/bad_address_cast.hpp63
-rw-r--r--3rdparty/asio/include/asio/ip/basic_endpoint.hpp282
-rw-r--r--3rdparty/asio/include/asio/ip/basic_resolver.hpp1112
-rw-r--r--3rdparty/asio/include/asio/ip/basic_resolver_entry.hpp113
-rw-r--r--3rdparty/asio/include/asio/ip/basic_resolver_iterator.hpp188
-rw-r--r--3rdparty/asio/include/asio/ip/basic_resolver_query.hpp260
-rw-r--r--3rdparty/asio/include/asio/ip/basic_resolver_results.hpp307
-rw-r--r--3rdparty/asio/include/asio/ip/detail/endpoint.hpp141
-rw-r--r--3rdparty/asio/include/asio/ip/detail/impl/endpoint.ipp195
-rw-r--r--3rdparty/asio/include/asio/ip/detail/socket_option.hpp566
-rw-r--r--3rdparty/asio/include/asio/ip/host_name.hpp42
-rw-r--r--3rdparty/asio/include/asio/ip/icmp.hpp115
-rw-r--r--3rdparty/asio/include/asio/ip/impl/address.hpp67
-rw-r--r--3rdparty/asio/include/asio/ip/impl/address.ipp235
-rw-r--r--3rdparty/asio/include/asio/ip/impl/address_v4.hpp67
-rw-r--r--3rdparty/asio/include/asio/ip/impl/address_v4.ipp206
-rw-r--r--3rdparty/asio/include/asio/ip/impl/address_v6.hpp67
-rw-r--r--3rdparty/asio/include/asio/ip/impl/address_v6.ipp342
-rw-r--r--3rdparty/asio/include/asio/ip/impl/basic_endpoint.hpp43
-rw-r--r--3rdparty/asio/include/asio/ip/impl/host_name.ipp54
-rw-r--r--3rdparty/asio/include/asio/ip/impl/network_v4.hpp54
-rw-r--r--3rdparty/asio/include/asio/ip/impl/network_v4.ipp218
-rw-r--r--3rdparty/asio/include/asio/ip/impl/network_v6.hpp53
-rw-r--r--3rdparty/asio/include/asio/ip/impl/network_v6.ipp187
-rw-r--r--3rdparty/asio/include/asio/ip/multicast.hpp191
-rw-r--r--3rdparty/asio/include/asio/ip/network_v4.hpp257
-rw-r--r--3rdparty/asio/include/asio/ip/network_v6.hpp231
-rw-r--r--3rdparty/asio/include/asio/ip/resolver_base.hpp129
-rw-r--r--3rdparty/asio/include/asio/ip/resolver_query_base.hpp43
-rw-r--r--3rdparty/asio/include/asio/ip/tcp.hpp155
-rw-r--r--3rdparty/asio/include/asio/ip/udp.hpp111
-rw-r--r--3rdparty/asio/include/asio/ip/unicast.hpp70
-rw-r--r--3rdparty/asio/include/asio/ip/v6_only.hpp69
-rw-r--r--3rdparty/asio/include/asio/is_applicable_property.hpp61
-rw-r--r--3rdparty/asio/include/asio/is_contiguous_iterator.hpp45
-rw-r--r--3rdparty/asio/include/asio/is_executor.hpp46
-rw-r--r--3rdparty/asio/include/asio/is_read_buffered.hpp59
-rw-r--r--3rdparty/asio/include/asio/is_write_buffered.hpp59
-rw-r--r--3rdparty/asio/include/asio/local/basic_endpoint.hpp243
-rw-r--r--3rdparty/asio/include/asio/local/connect_pair.hpp101
-rw-r--r--3rdparty/asio/include/asio/local/datagram_protocol.hpp80
-rw-r--r--3rdparty/asio/include/asio/local/detail/endpoint.hpp139
-rw-r--r--3rdparty/asio/include/asio/local/detail/impl/endpoint.ipp131
-rw-r--r--3rdparty/asio/include/asio/local/seq_packet_protocol.hpp84
-rw-r--r--3rdparty/asio/include/asio/local/stream_protocol.hpp90
-rw-r--r--3rdparty/asio/include/asio/multiple_exceptions.hpp52
-rw-r--r--3rdparty/asio/include/asio/packaged_task.hpp66
-rw-r--r--3rdparty/asio/include/asio/placeholders.hpp75
-rw-r--r--3rdparty/asio/include/asio/posix/basic_descriptor.hpp773
-rw-r--r--3rdparty/asio/include/asio/posix/basic_stream_descriptor.hpp559
-rw-r--r--3rdparty/asio/include/asio/posix/descriptor.hpp37
-rw-r--r--3rdparty/asio/include/asio/posix/descriptor_base.hpp90
-rw-r--r--3rdparty/asio/include/asio/posix/stream_descriptor.hpp37
-rw-r--r--3rdparty/asio/include/asio/post.hpp213
-rw-r--r--3rdparty/asio/include/asio/prefer.hpp577
-rw-r--r--3rdparty/asio/include/asio/prepend.hpp66
-rw-r--r--3rdparty/asio/include/asio/query.hpp311
-rw-r--r--3rdparty/asio/include/asio/random_access_file.hpp35
-rw-r--r--3rdparty/asio/include/asio/read.hpp1448
-rw-r--r--3rdparty/asio/include/asio/read_at.hpp778
-rw-r--r--3rdparty/asio/include/asio/read_until.hpp3124
-rw-r--r--3rdparty/asio/include/asio/readable_pipe.hpp35
-rw-r--r--3rdparty/asio/include/asio/recycling_allocator.hpp138
-rw-r--r--3rdparty/asio/include/asio/redirect_error.hpp64
-rw-r--r--3rdparty/asio/include/asio/registered_buffer.hpp344
-rw-r--r--3rdparty/asio/include/asio/require.hpp433
-rw-r--r--3rdparty/asio/include/asio/require_concept.hpp343
-rw-r--r--3rdparty/asio/include/asio/serial_port.hpp36
-rw-r--r--3rdparty/asio/include/asio/serial_port_base.hpp167
-rw-r--r--3rdparty/asio/include/asio/signal_set.hpp28
-rw-r--r--3rdparty/asio/include/asio/signal_set_base.hpp171
-rw-r--r--3rdparty/asio/include/asio/socket_base.hpp559
-rw-r--r--3rdparty/asio/include/asio/spawn.hpp872
-rw-r--r--3rdparty/asio/include/asio/ssl.hpp28
-rw-r--r--3rdparty/asio/include/asio/ssl/context.hpp762
-rw-r--r--3rdparty/asio/include/asio/ssl/context_base.hpp209
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/buffered_handshake_op.hpp119
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/engine.hpp169
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/handshake_op.hpp67
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/impl/engine.ipp377
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/impl/openssl_init.ipp169
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/io.hpp376
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/openssl_init.hpp101
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/openssl_types.hpp34
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/password_callback.hpp66
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/read_op.hpp72
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/shutdown_op.hpp69
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/stream_core.hpp217
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/verify_callback.hpp62
-rw-r--r--3rdparty/asio/include/asio/ssl/detail/write_op.hpp76
-rw-r--r--3rdparty/asio/include/asio/ssl/error.hpp123
-rw-r--r--3rdparty/asio/include/asio/ssl/host_name_verification.hpp90
-rw-r--r--3rdparty/asio/include/asio/ssl/impl/context.hpp67
-rw-r--r--3rdparty/asio/include/asio/ssl/impl/context.ipp1319
-rw-r--r--3rdparty/asio/include/asio/ssl/impl/error.ipp124
-rw-r--r--3rdparty/asio/include/asio/ssl/impl/host_name_verification.ipp73
-rw-r--r--3rdparty/asio/include/asio/ssl/impl/rfc2818_verification.ipp164
-rw-r--r--3rdparty/asio/include/asio/ssl/impl/src.hpp29
-rw-r--r--3rdparty/asio/include/asio/ssl/rfc2818_verification.hpp98
-rw-r--r--3rdparty/asio/include/asio/ssl/stream.hpp1042
-rw-r--r--3rdparty/asio/include/asio/ssl/stream_base.hpp52
-rw-r--r--3rdparty/asio/include/asio/ssl/verify_context.hpp67
-rw-r--r--3rdparty/asio/include/asio/ssl/verify_mode.hpp63
-rw-r--r--3rdparty/asio/include/asio/static_thread_pool.hpp31
-rw-r--r--3rdparty/asio/include/asio/steady_timer.hpp37
-rw-r--r--3rdparty/asio/include/asio/strand.hpp557
-rw-r--r--3rdparty/asio/include/asio/stream_file.hpp35
-rw-r--r--3rdparty/asio/include/asio/streambuf.hpp33
-rw-r--r--3rdparty/asio/include/asio/system_context.hpp90
-rw-r--r--3rdparty/asio/include/asio/system_error.hpp31
-rw-r--r--3rdparty/asio/include/asio/system_executor.hpp671
-rw-r--r--3rdparty/asio/include/asio/system_timer.hpp37
-rw-r--r--3rdparty/asio/include/asio/this_coro.hpp267
-rw-r--r--3rdparty/asio/include/asio/thread.hpp92
-rw-r--r--3rdparty/asio/include/asio/thread_pool.hpp963
-rw-r--r--3rdparty/asio/include/asio/time_traits.hpp86
-rw-r--r--3rdparty/asio/include/asio/traits/equality_comparable.hpp100
-rw-r--r--3rdparty/asio/include/asio/traits/execute_member.hpp104
-rw-r--r--3rdparty/asio/include/asio/traits/prefer_free.hpp104
-rw-r--r--3rdparty/asio/include/asio/traits/prefer_member.hpp104
-rw-r--r--3rdparty/asio/include/asio/traits/query_free.hpp104
-rw-r--r--3rdparty/asio/include/asio/traits/query_member.hpp104
-rw-r--r--3rdparty/asio/include/asio/traits/query_static_constexpr_member.hpp101
-rw-r--r--3rdparty/asio/include/asio/traits/require_concept_free.hpp104
-rw-r--r--3rdparty/asio/include/asio/traits/require_concept_member.hpp104
-rw-r--r--3rdparty/asio/include/asio/traits/require_free.hpp104
-rw-r--r--3rdparty/asio/include/asio/traits/require_member.hpp104
-rw-r--r--3rdparty/asio/include/asio/traits/static_query.hpp102
-rw-r--r--3rdparty/asio/include/asio/traits/static_require.hpp115
-rw-r--r--3rdparty/asio/include/asio/traits/static_require_concept.hpp116
-rw-r--r--3rdparty/asio/include/asio/ts/buffer.hpp24
-rw-r--r--3rdparty/asio/include/asio/ts/executor.hpp35
-rw-r--r--3rdparty/asio/include/asio/ts/internet.hpp40
-rw-r--r--3rdparty/asio/include/asio/ts/io_context.hpp20
-rw-r--r--3rdparty/asio/include/asio/ts/net.hpp26
-rw-r--r--3rdparty/asio/include/asio/ts/netfwd.hpp236
-rw-r--r--3rdparty/asio/include/asio/ts/socket.hpp27
-rw-r--r--3rdparty/asio/include/asio/ts/timer.hpp26
-rw-r--r--3rdparty/asio/include/asio/unyield.hpp21
-rw-r--r--3rdparty/asio/include/asio/use_awaitable.hpp161
-rw-r--r--3rdparty/asio/include/asio/use_future.hpp159
-rw-r--r--3rdparty/asio/include/asio/uses_executor.hpp67
-rw-r--r--3rdparty/asio/include/asio/version.hpp23
-rw-r--r--3rdparty/asio/include/asio/wait_traits.hpp56
-rw-r--r--3rdparty/asio/include/asio/windows/basic_object_handle.hpp485
-rw-r--r--3rdparty/asio/include/asio/windows/basic_overlapped_handle.hpp455
-rw-r--r--3rdparty/asio/include/asio/windows/basic_random_access_handle.hpp567
-rw-r--r--3rdparty/asio/include/asio/windows/basic_stream_handle.hpp551
-rw-r--r--3rdparty/asio/include/asio/windows/object_handle.hpp38
-rw-r--r--3rdparty/asio/include/asio/windows/overlapped_handle.hpp39
-rw-r--r--3rdparty/asio/include/asio/windows/overlapped_ptr.hpp145
-rw-r--r--3rdparty/asio/include/asio/windows/random_access_handle.hpp37
-rw-r--r--3rdparty/asio/include/asio/windows/stream_handle.hpp37
-rw-r--r--3rdparty/asio/include/asio/writable_pipe.hpp35
-rw-r--r--3rdparty/asio/include/asio/write.hpp1414
-rw-r--r--3rdparty/asio/include/asio/write_at.hpp789
-rw-r--r--3rdparty/asio/include/asio/yield.hpp23
-rwxr-xr-x3rdparty/asio/install-sh541
-rwxr-xr-x3rdparty/asio/missing215
-rw-r--r--3rdparty/asio/src/Makefile.am39
-rw-r--r--3rdparty/asio/src/Makefile.in619
-rw-r--r--3rdparty/asio/src/Makefile.mgw291
-rw-r--r--3rdparty/asio/src/Makefile.msc550
-rw-r--r--3rdparty/asio/src/asio.cpp11
-rw-r--r--3rdparty/asio/src/asio_ssl.cpp11
-rw-r--r--3rdparty/asio/src/examples/cpp11/Makefile.am308
-rw-r--r--3rdparty/asio/src/examples/cpp11/Makefile.in2975
-rw-r--r--3rdparty/asio/src/examples/cpp11/allocation/server.cpp217
-rw-r--r--3rdparty/asio/src/examples/cpp11/buffers/reference_counted.cpp122
-rw-r--r--3rdparty/asio/src/examples/cpp11/chat/chat_client.cpp167
-rw-r--r--3rdparty/asio/src/examples/cpp11/chat/chat_message.hpp91
-rw-r--r--3rdparty/asio/src/examples/cpp11/chat/chat_server.cpp227
-rw-r--r--3rdparty/asio/src/examples/cpp11/chat/posix_chat_client.cpp198
-rw-r--r--3rdparty/asio/src/examples/cpp11/deferred/deferred_1.cpp35
-rw-r--r--3rdparty/asio/src/examples/cpp11/deferred/deferred_2.cpp44
-rw-r--r--3rdparty/asio/src/examples/cpp11/echo/async_tcp_echo_server.cpp114
-rw-r--r--3rdparty/asio/src/examples/cpp11/echo/async_udp_echo_server.cpp82
-rw-r--r--3rdparty/asio/src/examples/cpp11/echo/blocking_tcp_echo_client.cpp55
-rw-r--r--3rdparty/asio/src/examples/cpp11/echo/blocking_tcp_echo_server.cpp74
-rw-r--r--3rdparty/asio/src/examples/cpp11/echo/blocking_udp_echo_client.cpp58
-rw-r--r--3rdparty/asio/src/examples/cpp11/echo/blocking_udp_echo_server.cpp52
-rw-r--r--3rdparty/asio/src/examples/cpp11/executors/actor.cpp286
-rw-r--r--3rdparty/asio/src/examples/cpp11/executors/bank_account_1.cpp57
-rw-r--r--3rdparty/asio/src/examples/cpp11/executors/bank_account_2.cpp54
-rw-r--r--3rdparty/asio/src/examples/cpp11/executors/fork_join.cpp289
-rw-r--r--3rdparty/asio/src/examples/cpp11/executors/pipeline.cpp288
-rw-r--r--3rdparty/asio/src/examples/cpp11/executors/priority_scheduler.cpp148
-rw-r--r--3rdparty/asio/src/examples/cpp11/files/async_file_copy.cpp101
-rw-r--r--3rdparty/asio/src/examples/cpp11/files/blocking_file_copy.cpp65
-rw-r--r--3rdparty/asio/src/examples/cpp11/fork/daemon.cpp189
-rw-r--r--3rdparty/asio/src/examples/cpp11/fork/process_per_connection.cpp162
-rw-r--r--3rdparty/asio/src/examples/cpp11/futures/daytime_client.cpp94
-rw-r--r--3rdparty/asio/src/examples/cpp11/handler_tracking/async_tcp_echo_server.cpp135
-rw-r--r--3rdparty/asio/src/examples/cpp11/handler_tracking/custom_tracking.hpp211
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/client/async_client.cpp204
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/client/sync_client.cpp106
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/connection.cpp93
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/connection.hpp79
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/connection_manager.cpp40
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/connection_manager.hpp48
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/header.hpp28
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/main.cpp43
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/mime_types.cpp45
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/mime_types.hpp27
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/reply.cpp255
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/reply.hpp64
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/request.hpp34
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/request_handler.cpp121
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/request_handler.hpp47
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/request_parser.cpp315
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/request_parser.hpp96
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/server.cpp94
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server/server.hpp64
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/connection.cpp89
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/connection.hpp71
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/header.hpp28
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/io_context_pool.cpp64
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/io_context_pool.hpp59
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/main.cpp44
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/mime_types.cpp46
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/mime_types.hpp27
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/reply.cpp255
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/reply.hpp64
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/request.hpp34
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/request_handler.cpp121
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/request_handler.hpp47
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/request_parser.cpp315
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/request_parser.hpp96
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/server.cpp86
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server2/server.hpp60
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/connection.cpp89
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/connection.hpp71
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/header.hpp28
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/main.cpp44
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/mime_types.cpp46
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/mime_types.hpp27
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/reply.cpp255
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/reply.hpp64
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/request.hpp34
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/request_handler.cpp121
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/request_handler.hpp47
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/request_parser.cpp315
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/request_parser.hpp96
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/server.cpp97
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server3/server.hpp62
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/file_handler.cpp121
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/file_handler.hpp44
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/header.hpp28
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/main.cpp60
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/mime_types.cpp46
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/mime_types.hpp27
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/reply.cpp255
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/reply.hpp64
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/request.hpp34
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/request_parser.cpp315
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/request_parser.hpp96
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/server.cpp122
-rw-r--r--3rdparty/asio/src/examples/cpp11/http/server4/server.hpp73
-rw-r--r--3rdparty/asio/src/examples/cpp11/icmp/icmp_header.hpp94
-rw-r--r--3rdparty/asio/src/examples/cpp11/icmp/ipv4_header.hpp102
-rw-r--r--3rdparty/asio/src/examples/cpp11/icmp/ping.cpp162
-rw-r--r--3rdparty/asio/src/examples/cpp11/invocation/prioritised_handlers.cpp202
-rw-r--r--3rdparty/asio/src/examples/cpp11/iostreams/daytime_client.cpp44
-rw-r--r--3rdparty/asio/src/examples/cpp11/iostreams/daytime_server.cpp51
-rw-r--r--3rdparty/asio/src/examples/cpp11/iostreams/http_client.cpp91
-rw-r--r--3rdparty/asio/src/examples/cpp11/local/connect_pair.cpp129
-rw-r--r--3rdparty/asio/src/examples/cpp11/local/fd_passing_stream_client.cpp102
-rw-r--r--3rdparty/asio/src/examples/cpp11/local/fd_passing_stream_server.cpp160
-rw-r--r--3rdparty/asio/src/examples/cpp11/local/iostream_client.cpp61
-rw-r--r--3rdparty/asio/src/examples/cpp11/local/stream_client.cpp60
-rw-r--r--3rdparty/asio/src/examples/cpp11/local/stream_server.cpp121
-rw-r--r--3rdparty/asio/src/examples/cpp11/multicast/receiver.cpp88
-rw-r--r--3rdparty/asio/src/examples/cpp11/multicast/sender.cpp91
-rw-r--r--3rdparty/asio/src/examples/cpp11/nonblocking/third_party_lib.cpp212
-rw-r--r--3rdparty/asio/src/examples/cpp11/operations/composed_1.cpp159
-rw-r--r--3rdparty/asio/src/examples/cpp11/operations/composed_2.cpp229
-rw-r--r--3rdparty/asio/src/examples/cpp11/operations/composed_3.cpp238
-rw-r--r--3rdparty/asio/src/examples/cpp11/operations/composed_4.cpp252
-rw-r--r--3rdparty/asio/src/examples/cpp11/operations/composed_5.cpp289
-rw-r--r--3rdparty/asio/src/examples/cpp11/operations/composed_6.cpp349
-rw-r--r--3rdparty/asio/src/examples/cpp11/operations/composed_7.cpp268
-rw-r--r--3rdparty/asio/src/examples/cpp11/operations/composed_8.cpp263
-rw-r--r--3rdparty/asio/src/examples/cpp11/parallel_group/ranged_wait_for_all.cpp70
-rw-r--r--3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_all.cpp62
-rw-r--r--3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_one.cpp62
-rw-r--r--3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_one_error.cpp62
-rw-r--r--3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_one_success.cpp62
-rw-r--r--3rdparty/asio/src/examples/cpp11/porthopper/client.cpp188
-rw-r--r--3rdparty/asio/src/examples/cpp11/porthopper/protocol.hpp156
-rw-r--r--3rdparty/asio/src/examples/cpp11/porthopper/server.cpp187
-rw-r--r--3rdparty/asio/src/examples/cpp11/serialization/client.cpp125
-rw-r--r--3rdparty/asio/src/examples/cpp11/serialization/connection.hpp184
-rw-r--r--3rdparty/asio/src/examples/cpp11/serialization/server.cpp122
-rw-r--r--3rdparty/asio/src/examples/cpp11/serialization/stock.hpp50
-rw-r--r--3rdparty/asio/src/examples/cpp11/services/basic_logger.hpp78
-rw-r--r--3rdparty/asio/src/examples/cpp11/services/daytime_client.cpp101
-rw-r--r--3rdparty/asio/src/examples/cpp11/services/logger.hpp24
-rw-r--r--3rdparty/asio/src/examples/cpp11/services/logger_service.cpp11
-rw-r--r--3rdparty/asio/src/examples/cpp11/services/logger_service.hpp145
-rw-r--r--3rdparty/asio/src/examples/cpp11/socks4/socks4.hpp143
-rw-r--r--3rdparty/asio/src/examples/cpp11/socks4/sync_client.cpp94
-rw-r--r--3rdparty/asio/src/examples/cpp11/spawn/echo_server.cpp117
-rw-r--r--3rdparty/asio/src/examples/cpp11/spawn/parallel_grep.cpp86
-rw-r--r--3rdparty/asio/src/examples/cpp11/ssl/README8
-rw-r--r--3rdparty/asio/src/examples/cpp11/ssl/ca.pem50
-rw-r--r--3rdparty/asio/src/examples/cpp11/ssl/client.cpp165
-rw-r--r--3rdparty/asio/src/examples/cpp11/ssl/dh4096.pem25
-rw-r--r--3rdparty/asio/src/examples/cpp11/ssl/server.cpp145
-rw-r--r--3rdparty/asio/src/examples/cpp11/ssl/server.pem99
-rw-r--r--3rdparty/asio/src/examples/cpp11/timeouts/async_tcp_client.cpp311
-rw-r--r--3rdparty/asio/src/examples/cpp11/timeouts/blocking_tcp_client.cpp192
-rw-r--r--3rdparty/asio/src/examples/cpp11/timeouts/blocking_token_tcp_client.cpp171
-rw-r--r--3rdparty/asio/src/examples/cpp11/timeouts/blocking_udp_client.cpp155
-rw-r--r--3rdparty/asio/src/examples/cpp11/timeouts/server.cpp433
-rw-r--r--3rdparty/asio/src/examples/cpp11/timers/time_t_timer.cpp106
-rw-r--r--3rdparty/asio/src/examples/cpp11/tutorial/daytime1/client.cpp57
-rw-r--r--3rdparty/asio/src/examples/cpp11/tutorial/daytime2/server.cpp50
-rw-r--r--3rdparty/asio/src/examples/cpp11/tutorial/daytime3/server.cpp118
-rw-r--r--3rdparty/asio/src/examples/cpp11/tutorial/daytime4/client.cpp52
-rw-r--r--3rdparty/asio/src/examples/cpp11/tutorial/daytime5/server.cpp53
-rw-r--r--3rdparty/asio/src/examples/cpp11/tutorial/daytime6/server.cpp89
-rw-r--r--3rdparty/asio/src/examples/cpp11/tutorial/daytime7/server.cpp159
-rw-r--r--3rdparty/asio/src/examples/cpp11/tutorial/timer1/timer.cpp24
-rw-r--r--3rdparty/asio/src/examples/cpp11/tutorial/timer2/timer.cpp29
-rw-r--r--3rdparty/asio/src/examples/cpp11/tutorial/timer3/timer.cpp43
-rw-r--r--3rdparty/asio/src/examples/cpp11/tutorial/timer4/timer.cpp54
-rw-r--r--3rdparty/asio/src/examples/cpp11/tutorial/timer5/timer.cpp81
-rw-r--r--3rdparty/asio/src/examples/cpp11/type_erasure/line_reader.hpp48
-rw-r--r--3rdparty/asio/src/examples/cpp11/type_erasure/main.cpp60
-rw-r--r--3rdparty/asio/src/examples/cpp11/type_erasure/sleep.cpp22
-rw-r--r--3rdparty/asio/src/examples/cpp11/type_erasure/sleep.hpp35
-rw-r--r--3rdparty/asio/src/examples/cpp11/type_erasure/stdin_line_reader.cpp44
-rw-r--r--3rdparty/asio/src/examples/cpp11/type_erasure/stdin_line_reader.hpp30
-rw-r--r--3rdparty/asio/src/examples/cpp11/windows/transmit_file.cpp176
-rw-r--r--3rdparty/asio/src/examples/cpp14/Makefile.am95
-rw-r--r--3rdparty/asio/src/examples/cpp14/Makefile.in1378
-rw-r--r--3rdparty/asio/src/examples/cpp14/deferred/deferred_1.cpp35
-rw-r--r--3rdparty/asio/src/examples/cpp14/deferred/deferred_2.cpp44
-rw-r--r--3rdparty/asio/src/examples/cpp14/deferred/deferred_3.cpp51
-rw-r--r--3rdparty/asio/src/examples/cpp14/deferred/deferred_4.cpp59
-rw-r--r--3rdparty/asio/src/examples/cpp14/deferred/deferred_5.cpp66
-rw-r--r--3rdparty/asio/src/examples/cpp14/deferred/deferred_6.cpp75
-rw-r--r--3rdparty/asio/src/examples/cpp14/deferred/deferred_7.cpp71
-rw-r--r--3rdparty/asio/src/examples/cpp14/echo/async_tcp_echo_server.cpp117
-rw-r--r--3rdparty/asio/src/examples/cpp14/echo/async_udp_echo_server.cpp83
-rw-r--r--3rdparty/asio/src/examples/cpp14/echo/blocking_tcp_echo_client.cpp55
-rw-r--r--3rdparty/asio/src/examples/cpp14/echo/blocking_tcp_echo_server.cpp77
-rw-r--r--3rdparty/asio/src/examples/cpp14/echo/blocking_udp_echo_client.cpp59
-rw-r--r--3rdparty/asio/src/examples/cpp14/echo/blocking_udp_echo_server.cpp53
-rw-r--r--3rdparty/asio/src/examples/cpp14/executors/actor.cpp285
-rw-r--r--3rdparty/asio/src/examples/cpp14/executors/async_1.cpp54
-rw-r--r--3rdparty/asio/src/examples/cpp14/executors/async_2.cpp79
-rw-r--r--3rdparty/asio/src/examples/cpp14/executors/bank_account_1.cpp57
-rw-r--r--3rdparty/asio/src/examples/cpp14/executors/bank_account_2.cpp55
-rw-r--r--3rdparty/asio/src/examples/cpp14/executors/fork_join.cpp289
-rw-r--r--3rdparty/asio/src/examples/cpp14/executors/pipeline.cpp280
-rw-r--r--3rdparty/asio/src/examples/cpp14/executors/priority_scheduler.cpp181
-rw-r--r--3rdparty/asio/src/examples/cpp14/iostreams/http_client.cpp91
-rw-r--r--3rdparty/asio/src/examples/cpp14/operations/c_callback_wrapper.cpp230
-rw-r--r--3rdparty/asio/src/examples/cpp14/operations/callback_wrapper.cpp152
-rw-r--r--3rdparty/asio/src/examples/cpp14/operations/composed_1.cpp155
-rw-r--r--3rdparty/asio/src/examples/cpp14/operations/composed_2.cpp219
-rw-r--r--3rdparty/asio/src/examples/cpp14/operations/composed_3.cpp228
-rw-r--r--3rdparty/asio/src/examples/cpp14/operations/composed_4.cpp242
-rw-r--r--3rdparty/asio/src/examples/cpp14/operations/composed_5.cpp280
-rw-r--r--3rdparty/asio/src/examples/cpp14/operations/composed_6.cpp340
-rw-r--r--3rdparty/asio/src/examples/cpp14/operations/composed_7.cpp261
-rw-r--r--3rdparty/asio/src/examples/cpp14/operations/composed_8.cpp254
-rw-r--r--3rdparty/asio/src/examples/cpp14/parallel_group/parallel_sort.cpp133
-rw-r--r--3rdparty/asio/src/examples/cpp14/parallel_group/ranged_wait_for_all.cpp70
-rw-r--r--3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_all.cpp64
-rw-r--r--3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_one.cpp64
-rw-r--r--3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_one_error.cpp64
-rw-r--r--3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_one_success.cpp64
-rw-r--r--3rdparty/asio/src/examples/cpp17/Makefile.am37
-rw-r--r--3rdparty/asio/src/examples/cpp17/Makefile.in738
-rw-r--r--3rdparty/asio/src/examples/cpp17/coroutines_ts/chat_server.cpp222
-rw-r--r--3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server.cpp76
-rw-r--r--3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server_with_as_single_default.cpp71
-rw-r--r--3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server_with_as_tuple_default.cpp71
-rw-r--r--3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server_with_default.cpp73
-rw-r--r--3rdparty/asio/src/examples/cpp17/coroutines_ts/range_based_for.cpp102
-rw-r--r--3rdparty/asio/src/examples/cpp17/coroutines_ts/refactored_echo_server.cpp80
-rw-r--r--3rdparty/asio/src/examples/cpp20/Makefile.am79
-rw-r--r--3rdparty/asio/src/examples/cpp20/Makefile.in1173
-rw-r--r--3rdparty/asio/src/examples/cpp20/channels/mutual_exclusion_1.cpp182
-rw-r--r--3rdparty/asio/src/examples/cpp20/channels/mutual_exclusion_2.cpp192
-rw-r--r--3rdparty/asio/src/examples/cpp20/channels/throttling_proxy.cpp135
-rw-r--r--3rdparty/asio/src/examples/cpp20/coroutines/chat_server.cpp222
-rw-r--r--3rdparty/asio/src/examples/cpp20/coroutines/echo_server.cpp76
-rw-r--r--3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_as_single_default.cpp71
-rw-r--r--3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_as_tuple_default.cpp71
-rw-r--r--3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_default.cpp73
-rw-r--r--3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_deferred.cpp72
-rw-r--r--3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_deferred_default.cpp74
-rw-r--r--3rdparty/asio/src/examples/cpp20/coroutines/refactored_echo_server.cpp80
-rw-r--r--3rdparty/asio/src/examples/cpp20/coroutines/timeout.cpp66
-rw-r--r--3rdparty/asio/src/examples/cpp20/invocation/completion_executor.cpp83
-rw-r--r--3rdparty/asio/src/examples/cpp20/operations/c_callback_wrapper.cpp232
-rw-r--r--3rdparty/asio/src/examples/cpp20/operations/callback_wrapper.cpp154
-rw-r--r--3rdparty/asio/src/examples/cpp20/operations/composed_1.cpp157
-rw-r--r--3rdparty/asio/src/examples/cpp20/operations/composed_2.cpp225
-rw-r--r--3rdparty/asio/src/examples/cpp20/operations/composed_3.cpp232
-rw-r--r--3rdparty/asio/src/examples/cpp20/operations/composed_4.cpp247
-rw-r--r--3rdparty/asio/src/examples/cpp20/operations/composed_5.cpp284
-rw-r--r--3rdparty/asio/src/examples/cpp20/operations/composed_6.cpp345
-rw-r--r--3rdparty/asio/src/examples/cpp20/operations/composed_7.cpp262
-rw-r--r--3rdparty/asio/src/examples/cpp20/operations/composed_8.cpp255
-rw-r--r--3rdparty/asio/src/examples/cpp20/type_erasure/line_reader.hpp39
-rw-r--r--3rdparty/asio/src/examples/cpp20/type_erasure/main.cpp35
-rw-r--r--3rdparty/asio/src/examples/cpp20/type_erasure/sleep.cpp22
-rw-r--r--3rdparty/asio/src/examples/cpp20/type_erasure/sleep.hpp32
-rw-r--r--3rdparty/asio/src/examples/cpp20/type_erasure/stdin_line_reader.cpp44
-rw-r--r--3rdparty/asio/src/examples/cpp20/type_erasure/stdin_line_reader.hpp30
-rw-r--r--3rdparty/asio/src/tests/Makefile.am656
-rw-r--r--3rdparty/asio/src/tests/Makefile.in6367
-rw-r--r--3rdparty/asio/src/tests/latency/allocator.hpp52
-rw-r--r--3rdparty/asio/src/tests/latency/high_res_clock.hpp53
-rw-r--r--3rdparty/asio/src/tests/latency/tcp_client.cpp124
-rw-r--r--3rdparty/asio/src/tests/latency/tcp_server.cpp114
-rw-r--r--3rdparty/asio/src/tests/latency/udp_client.cpp104
-rw-r--r--3rdparty/asio/src/tests/latency/udp_server.cpp125
-rw-r--r--3rdparty/asio/src/tests/performance/client.cpp286
-rw-r--r--3rdparty/asio/src/tests/performance/handler_allocator.hpp112
-rw-r--r--3rdparty/asio/src/tests/performance/server.cpp233
-rw-r--r--3rdparty/asio/src/tests/properties/Makefile.am367
-rw-r--r--3rdparty/asio/src/tests/properties/Makefile.in5585
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_free_prefer.cpp59
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_free_require.cpp59
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_member_prefer.cpp59
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_member_require.cpp59
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_free_prefer.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_free_require.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_member_prefer.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_member_require.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_static.cpp45
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_unsupported.cpp33
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_free_prefer.cpp59
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_free_require.cpp59
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_member_prefer.cpp59
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_member_require.cpp59
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_static.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_unsupported.cpp43
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_static.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_prefer_unsupported.cpp43
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_query_free.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_query_member.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_free.cpp41
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_member.cpp41
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_static.cpp41
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_unsupported.cpp26
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_query_static.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_query_unsupported.cpp36
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_concept_free.cpp55
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_concept_member.cpp55
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_free.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_member.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_static.cpp41
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_unsupported.cpp28
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_concept_static.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_concept_unsupported.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_free.cpp59
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_member.cpp59
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_free.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_member.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_static.cpp45
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_unsupported.cpp32
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_static.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/can_require_unsupported.cpp42
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/prefer_free_prefer.cpp68
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/prefer_free_require.cpp68
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/prefer_member_prefer.cpp68
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/prefer_member_require.cpp68
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/prefer_static.cpp61
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/prefer_unsupported.cpp46
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/query_free.cpp55
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/query_member.cpp55
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/query_static.cpp55
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/require_concept_free.cpp60
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/require_concept_member.cpp60
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/require_concept_static.cpp55
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/require_free.cpp68
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/require_member.cpp68
-rw-r--r--3rdparty/asio/src/tests/properties/cpp03/require_static.cpp61
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_free_prefer.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_free_require.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_member_prefer.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_member_require.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_free_prefer.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_free_require.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_member_prefer.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_member_require.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_static.cpp45
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_unsupported.cpp33
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_free_prefer.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_free_require.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_member_prefer.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_member_require.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_static.cpp43
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_unsupported.cpp43
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_static.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_prefer_unsupported.cpp43
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_query_free.cpp37
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_query_member.cpp37
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_free.cpp27
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_member.cpp27
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_static.cpp41
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_unsupported.cpp26
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_query_static.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_query_unsupported.cpp36
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_concept_free.cpp44
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_concept_member.cpp44
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_free.cpp34
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_member.cpp34
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_static.cpp41
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_unsupported.cpp28
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_concept_static.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_concept_unsupported.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_free.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_member.cpp48
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_free.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_member.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_static.cpp45
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_unsupported.cpp32
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_static.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/can_require_unsupported.cpp42
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/prefer_free_prefer.cpp64
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/prefer_free_require.cpp64
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/prefer_member_prefer.cpp64
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/prefer_member_require.cpp64
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/prefer_static.cpp68
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/prefer_unsupported.cpp59
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/query_free.cpp49
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/query_member.cpp49
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/query_static.cpp60
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/require_concept_free.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/require_concept_member.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/require_concept_static.cpp58
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/require_free.cpp64
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/require_member.cpp64
-rw-r--r--3rdparty/asio/src/tests/properties/cpp11/require_static.cpp68
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_free_prefer.cpp39
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_free_require.cpp39
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_member_prefer.cpp39
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_member_require.cpp39
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_free_prefer.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_free_require.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_member_prefer.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_member_require.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_static.cpp35
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_unsupported.cpp32
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_free_prefer.cpp39
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_free_require.cpp39
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_member_prefer.cpp39
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_member_require.cpp39
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_static.cpp34
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_unsupported.cpp34
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_static.cpp36
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_prefer_unsupported.cpp42
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_query_free.cpp28
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_query_member.cpp28
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_free.cpp27
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_member.cpp27
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_static.cpp27
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_unsupported.cpp26
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_query_static.cpp28
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_query_unsupported.cpp27
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_concept_free.cpp35
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_concept_member.cpp35
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_free.cpp34
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_member.cpp34
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_static.cpp31
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_unsupported.cpp28
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_concept_static.cpp32
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_concept_unsupported.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_free.cpp39
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_member.cpp39
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_free.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_member.cpp38
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_static.cpp35
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_unsupported.cpp32
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_static.cpp36
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/can_require_unsupported.cpp42
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/prefer_free_prefer.cpp55
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/prefer_free_require.cpp55
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/prefer_member_prefer.cpp55
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/prefer_member_require.cpp55
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/prefer_static.cpp52
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/prefer_unsupported.cpp50
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/query_free.cpp40
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/query_member.cpp40
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/query_static.cpp40
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/require_concept_free.cpp43
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/require_concept_member.cpp43
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/require_concept_static.cpp42
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/require_free.cpp55
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/require_member.cpp55
-rw-r--r--3rdparty/asio/src/tests/properties/cpp14/require_static.cpp52
-rw-r--r--3rdparty/asio/src/tests/unit/any_completion_executor.cpp463
-rw-r--r--3rdparty/asio/src/tests/unit/any_completion_handler.cpp260
-rw-r--r--3rdparty/asio/src/tests/unit/any_io_executor.cpp515
-rw-r--r--3rdparty/asio/src/tests/unit/append.cpp58
-rw-r--r--3rdparty/asio/src/tests/unit/archetypes/async_ops.hpp413
-rw-r--r--3rdparty/asio/src/tests/unit/archetypes/async_result.hpp150
-rw-r--r--3rdparty/asio/src/tests/unit/archetypes/gettable_socket_option.hpp54
-rw-r--r--3rdparty/asio/src/tests/unit/archetypes/io_control_command.hpp32
-rw-r--r--3rdparty/asio/src/tests/unit/archetypes/settable_socket_option.hpp49
-rw-r--r--3rdparty/asio/src/tests/unit/as_tuple.cpp122
-rw-r--r--3rdparty/asio/src/tests/unit/associated_allocator.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/associated_cancellation_slot.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/associated_executor.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/associated_immediate_executor.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/associator.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/async_result.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/awaitable.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_datagram_socket.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_deadline_timer.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_file.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_random_access_file.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_raw_socket.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_readable_pipe.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_seq_packet_socket.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_serial_port.cpp26
-rw-r--r--3rdparty/asio/src/tests/unit/basic_signal_set.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_socket.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_socket_acceptor.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_stream_file.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_stream_socket.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_streambuf.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_waitable_timer.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/basic_writable_pipe.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/bind_allocator.cpp237
-rw-r--r--3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp202
-rw-r--r--3rdparty/asio/src/tests/unit/bind_executor.cpp189
-rw-r--r--3rdparty/asio/src/tests/unit/bind_immediate_executor.cpp199
-rw-r--r--3rdparty/asio/src/tests/unit/buffer.cpp913
-rw-r--r--3rdparty/asio/src/tests/unit/buffer_registration.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/buffered_read_stream.cpp329
-rw-r--r--3rdparty/asio/src/tests/unit/buffered_stream.cpp355
-rw-r--r--3rdparty/asio/src/tests/unit/buffered_write_stream.cpp344
-rw-r--r--3rdparty/asio/src/tests/unit/buffers_iterator.cpp281
-rw-r--r--3rdparty/asio/src/tests/unit/cancellation_signal.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/cancellation_state.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/cancellation_type.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/co_spawn.cpp133
-rw-r--r--3rdparty/asio/src/tests/unit/completion_condition.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/compose.cpp528
-rw-r--r--3rdparty/asio/src/tests/unit/connect.cpp1180
-rw-r--r--3rdparty/asio/src/tests/unit/connect_pipe.cpp154
-rw-r--r--3rdparty/asio/src/tests/unit/consign.cpp56
-rw-r--r--3rdparty/asio/src/tests/unit/coroutine.cpp112
-rw-r--r--3rdparty/asio/src/tests/unit/deadline_timer.cpp444
-rw-r--r--3rdparty/asio/src/tests/unit/defer.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/deferred.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/detached.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/dispatch.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/error.cpp89
-rw-r--r--3rdparty/asio/src/tests/unit/execution/any_executor.cpp1202
-rw-r--r--3rdparty/asio/src/tests/unit/execution/blocking.cpp1921
-rw-r--r--3rdparty/asio/src/tests/unit/execution/blocking_adaptation.cpp1323
-rw-r--r--3rdparty/asio/src/tests/unit/execution/context_as.cpp147
-rw-r--r--3rdparty/asio/src/tests/unit/execution/executor.cpp106
-rw-r--r--3rdparty/asio/src/tests/unit/execution/invocable_archetype.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/execution/mapping.cpp1985
-rw-r--r--3rdparty/asio/src/tests/unit/execution/outstanding_work.cpp1252
-rw-r--r--3rdparty/asio/src/tests/unit/execution/prefer_only.cpp533
-rw-r--r--3rdparty/asio/src/tests/unit/execution/relationship.cpp1252
-rw-r--r--3rdparty/asio/src/tests/unit/execution_context.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/executor.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/executor_work_guard.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/awaitable_operators.cpp297
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/basic_channel.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/basic_concurrent_channel.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/channel.cpp888
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/channel_traits.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/co_composed.cpp518
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/concurrent_channel.cpp165
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/coro/allocator.cpp113
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/coro/cancel.cpp179
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/coro/co_spawn.cpp67
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/coro/exception.cpp172
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/coro/executor.cpp116
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/coro/partial.cpp45
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/coro/simple_test.cpp264
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/coro/stack_test.cpp83
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/coro/use_coro.cpp77
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/parallel_group.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/experimental/promise.cpp226
-rw-r--r--3rdparty/asio/src/tests/unit/file_base.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/generic/basic_endpoint.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/generic/datagram_protocol.cpp292
-rw-r--r--3rdparty/asio/src/tests/unit/generic/raw_protocol.cpp293
-rw-r--r--3rdparty/asio/src/tests/unit/generic/seq_packet_protocol.cpp212
-rw-r--r--3rdparty/asio/src/tests/unit/generic/stream_protocol.cpp263
-rw-r--r--3rdparty/asio/src/tests/unit/high_resolution_timer.cpp30
-rw-r--r--3rdparty/asio/src/tests/unit/io_context.cpp566
-rw-r--r--3rdparty/asio/src/tests/unit/io_context_strand.cpp316
-rw-r--r--3rdparty/asio/src/tests/unit/ip/address.cpp147
-rw-r--r--3rdparty/asio/src/tests/unit/ip/address_v4.cpp329
-rw-r--r--3rdparty/asio/src/tests/unit/ip/address_v4_iterator.cpp27
-rw-r--r--3rdparty/asio/src/tests/unit/ip/address_v4_range.cpp27
-rw-r--r--3rdparty/asio/src/tests/unit/ip/address_v6.cpp414
-rw-r--r--3rdparty/asio/src/tests/unit/ip/address_v6_iterator.cpp27
-rw-r--r--3rdparty/asio/src/tests/unit/ip/address_v6_range.cpp27
-rw-r--r--3rdparty/asio/src/tests/unit/ip/basic_endpoint.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/ip/basic_resolver.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/ip/basic_resolver_entry.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/ip/basic_resolver_iterator.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/ip/basic_resolver_query.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/ip/host_name.cpp55
-rw-r--r--3rdparty/asio/src/tests/unit/ip/icmp.cpp606
-rw-r--r--3rdparty/asio/src/tests/unit/ip/multicast.cpp363
-rw-r--r--3rdparty/asio/src/tests/unit/ip/network_v4.cpp314
-rw-r--r--3rdparty/asio/src/tests/unit/ip/network_v6.cpp238
-rw-r--r--3rdparty/asio/src/tests/unit/ip/resolver_query_base.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/ip/tcp.cpp1336
-rw-r--r--3rdparty/asio/src/tests/unit/ip/udp.cpp692
-rw-r--r--3rdparty/asio/src/tests/unit/ip/unicast.cpp171
-rw-r--r--3rdparty/asio/src/tests/unit/ip/v6_only.cpp135
-rw-r--r--3rdparty/asio/src/tests/unit/is_read_buffered.cpp129
-rw-r--r--3rdparty/asio/src/tests/unit/is_write_buffered.cpp129
-rw-r--r--3rdparty/asio/src/tests/unit/local/basic_endpoint.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/local/connect_pair.cpp76
-rw-r--r--3rdparty/asio/src/tests/unit/local/datagram_protocol.cpp242
-rw-r--r--3rdparty/asio/src/tests/unit/local/seq_packet_protocol.cpp209
-rw-r--r--3rdparty/asio/src/tests/unit/local/stream_protocol.cpp219
-rw-r--r--3rdparty/asio/src/tests/unit/packaged_task.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/placeholders.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/posix/basic_descriptor.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/posix/basic_stream_descriptor.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/posix/descriptor.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/posix/descriptor_base.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/posix/stream_descriptor.cpp190
-rw-r--r--3rdparty/asio/src/tests/unit/post.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/prepend.cpp58
-rw-r--r--3rdparty/asio/src/tests/unit/random_access_file.cpp171
-rw-r--r--3rdparty/asio/src/tests/unit/read.cpp4933
-rw-r--r--3rdparty/asio/src/tests/unit/read_at.cpp7446
-rw-r--r--3rdparty/asio/src/tests/unit/read_until.cpp1629
-rw-r--r--3rdparty/asio/src/tests/unit/readable_pipe.cpp131
-rw-r--r--3rdparty/asio/src/tests/unit/recycling_allocator.cpp80
-rw-r--r--3rdparty/asio/src/tests/unit/redirect_error.cpp121
-rw-r--r--3rdparty/asio/src/tests/unit/registered_buffer.cpp111
-rw-r--r--3rdparty/asio/src/tests/unit/serial_port.cpp169
-rw-r--r--3rdparty/asio/src/tests/unit/serial_port_base.cpp99
-rw-r--r--3rdparty/asio/src/tests/unit/signal_set.cpp98
-rw-r--r--3rdparty/asio/src/tests/unit/signal_set_base.cpp30
-rw-r--r--3rdparty/asio/src/tests/unit/socket_base.cpp650
-rw-r--r--3rdparty/asio/src/tests/unit/ssl/context.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/ssl/context_base.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/ssl/error.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/ssl/host_name_verification.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/ssl/rfc2818_verification.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/ssl/stream.cpp199
-rw-r--r--3rdparty/asio/src/tests/unit/ssl/stream_base.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/static_thread_pool.cpp30
-rw-r--r--3rdparty/asio/src/tests/unit/steady_timer.cpp30
-rw-r--r--3rdparty/asio/src/tests/unit/strand.cpp458
-rw-r--r--3rdparty/asio/src/tests/unit/stream_file.cpp173
-rw-r--r--3rdparty/asio/src/tests/unit/streambuf.cpp62
-rw-r--r--3rdparty/asio/src/tests/unit/system_context.cpp30
-rw-r--r--3rdparty/asio/src/tests/unit/system_executor.cpp147
-rw-r--r--3rdparty/asio/src/tests/unit/system_timer.cpp500
-rw-r--r--3rdparty/asio/src/tests/unit/this_coro.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/thread.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/thread_pool.cpp283
-rw-r--r--3rdparty/asio/src/tests/unit/time_traits.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/ts/buffer.cpp30
-rw-r--r--3rdparty/asio/src/tests/unit/ts/executor.cpp30
-rw-r--r--3rdparty/asio/src/tests/unit/ts/internet.cpp30
-rw-r--r--3rdparty/asio/src/tests/unit/ts/io_context.cpp30
-rw-r--r--3rdparty/asio/src/tests/unit/ts/net.cpp30
-rw-r--r--3rdparty/asio/src/tests/unit/ts/netfwd.cpp33
-rw-r--r--3rdparty/asio/src/tests/unit/ts/socket.cpp30
-rw-r--r--3rdparty/asio/src/tests/unit/ts/timer.cpp30
-rw-r--r--3rdparty/asio/src/tests/unit/unit_test.hpp190
-rw-r--r--3rdparty/asio/src/tests/unit/use_awaitable.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/use_future.cpp670
-rw-r--r--3rdparty/asio/src/tests/unit/uses_executor.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/wait_traits.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/windows/basic_object_handle.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/windows/basic_overlapped_handle.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/windows/basic_random_access_handle.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/windows/basic_stream_handle.cpp25
-rw-r--r--3rdparty/asio/src/tests/unit/windows/object_handle.cpp130
-rw-r--r--3rdparty/asio/src/tests/unit/windows/overlapped_handle.cpp26
-rw-r--r--3rdparty/asio/src/tests/unit/windows/overlapped_ptr.cpp119
-rw-r--r--3rdparty/asio/src/tests/unit/windows/random_access_handle.cpp162
-rw-r--r--3rdparty/asio/src/tests/unit/windows/stream_handle.cpp155
-rw-r--r--3rdparty/asio/src/tests/unit/writable_pipe.cpp136
-rw-r--r--3rdparty/asio/src/tests/unit/write.cpp4832
-rw-r--r--3rdparty/asio/src/tests/unit/write_at.cpp7499
-rwxr-xr-x3rdparty/asio/src/tools/handlerlive.pl89
-rwxr-xr-x3rdparty/asio/src/tools/handlertree.pl140
-rwxr-xr-x3rdparty/asio/src/tools/handlerviz.pl375
-rwxr-xr-x3rdparty/asio/test-driver153
-rw-r--r--3rdparty/asmjit/.editorconfig10
-rw-r--r--3rdparty/asmjit/.gitignore3
-rw-r--r--3rdparty/asmjit/CMakeLists.txt716
-rw-r--r--3rdparty/asmjit/CMakePresets.json53
-rw-r--r--3rdparty/asmjit/CONTRIBUTING.md104
-rw-r--r--3rdparty/asmjit/LICENSE.md17
-rw-r--r--3rdparty/asmjit/README.md79
-rw-r--r--3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen.cpp83
-rw-r--r--3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen.h117
-rw-r--r--3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen_a64.cpp707
-rw-r--r--3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_codegen_x86.cpp5336
-rw-r--r--3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_overhead.cpp431
-rw-r--r--3rdparty/asmjit/asmjit-testing/bench/asmjit_bench_regalloc.cpp517
-rw-r--r--3rdparty/asmjit/asmjit-testing/commons/asmjitutils.h228
-rw-r--r--3rdparty/asmjit/asmjit-testing/commons/cmdline.h63
-rw-r--r--3rdparty/asmjit/asmjit-testing/commons/performancetimer.h27
-rw-r--r--3rdparty/asmjit/asmjit-testing/commons/random.h77
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler.cpp107
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler.h109
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler_a64.cpp4057
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler_x64.cpp18073
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_assembler_x86.cpp8492
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler.cpp407
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler.h83
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler_a64.cpp688
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_compiler_x86.cpp4694
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_emitters.cpp328
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_environment.cpp302
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_instinfo.cpp206
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_misc.h265
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_runner.cpp171
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler.cpp5674
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_avx2fma.cpp49
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_unicompiler_sse2.cpp72
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/asmjit_test_x86_sections.cpp169
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/broken.cpp310
-rw-r--r--3rdparty/asmjit/asmjit-testing/tests/broken.h200
-rw-r--r--3rdparty/asmjit/asmjit/a64.h55
-rw-r--r--3rdparty/asmjit/asmjit/arm.h57
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64archtraits_p.h82
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64assembler.cpp5338
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64assembler.h61
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64builder.cpp57
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64builder.h57
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64compiler.cpp72
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64compiler.h267
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64emithelper.cpp481
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64emithelper_p.h59
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64emitter.h1299
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64formatter.cpp66
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64formatter_p.h43
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64func.cpp212
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64func_p.h33
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64globals.h1917
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64instapi.cpp252
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64instapi_p.h38
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64instdb.cpp2707
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64instdb.h77
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64instdb_p.h885
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64operand.cpp85
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64operand.h1105
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64rapass.cpp909
-rw-r--r--3rdparty/asmjit/asmjit/arm/a64rapass_p.h113
-rw-r--r--3rdparty/asmjit/asmjit/arm/armformatter.cpp620
-rw-r--r--3rdparty/asmjit/asmjit/arm/armformatter_p.h69
-rw-r--r--3rdparty/asmjit/asmjit/arm/armglobals.h17
-rw-r--r--3rdparty/asmjit/asmjit/arm/armutils.h247
-rw-r--r--3rdparty/asmjit/asmjit/asmjit-scope-begin.h17
-rw-r--r--3rdparty/asmjit/asmjit/asmjit-scope-end.h9
-rw-r--r--3rdparty/asmjit/asmjit/asmjit.h35
-rw-r--r--3rdparty/asmjit/asmjit/asmjit.natvis245
-rw-r--r--3rdparty/asmjit/asmjit/core.h2320
-rw-r--r--3rdparty/asmjit/asmjit/core/api-build_p.h74
-rw-r--r--3rdparty/asmjit/asmjit/core/api-config.h695
-rw-r--r--3rdparty/asmjit/asmjit/core/archcommons.h268
-rw-r--r--3rdparty/asmjit/asmjit/core/archtraits.cpp167
-rw-r--r--3rdparty/asmjit/asmjit/core/archtraits.h310
-rw-r--r--3rdparty/asmjit/asmjit/core/assembler.cpp444
-rw-r--r--3rdparty/asmjit/asmjit/core/assembler.h147
-rw-r--r--3rdparty/asmjit/asmjit/core/builder.cpp938
-rw-r--r--3rdparty/asmjit/asmjit/core/builder.h1664
-rw-r--r--3rdparty/asmjit/asmjit/core/builder_p.h38
-rw-r--r--3rdparty/asmjit/asmjit/core/codebuffer.h135
-rw-r--r--3rdparty/asmjit/asmjit/core/codeholder.cpp1451
-rw-r--r--3rdparty/asmjit/asmjit/core/codeholder.h1318
-rw-r--r--3rdparty/asmjit/asmjit/core/codewriter.cpp302
-rw-r--r--3rdparty/asmjit/asmjit/core/codewriter_p.h188
-rw-r--r--3rdparty/asmjit/asmjit/core/compiler.cpp615
-rw-r--r--3rdparty/asmjit/asmjit/core/compiler.h859
-rw-r--r--3rdparty/asmjit/asmjit/core/compilerdefs.h247
-rw-r--r--3rdparty/asmjit/asmjit/core/constpool.cpp371
-rw-r--r--3rdparty/asmjit/asmjit/core/constpool.h280
-rw-r--r--3rdparty/asmjit/asmjit/core/cpuinfo.cpp2386
-rw-r--r--3rdparty/asmjit/asmjit/core/cpuinfo.h1413
-rw-r--r--3rdparty/asmjit/asmjit/core/emithelper.cpp365
-rw-r--r--3rdparty/asmjit/asmjit/core/emithelper_p.h61
-rw-r--r--3rdparty/asmjit/asmjit/core/emitter.cpp443
-rw-r--r--3rdparty/asmjit/asmjit/core/emitter.h938
-rw-r--r--3rdparty/asmjit/asmjit/core/emitterutils.cpp129
-rw-r--r--3rdparty/asmjit/asmjit/core/emitterutils_p.h107
-rw-r--r--3rdparty/asmjit/asmjit/core/environment.cpp47
-rw-r--r--3rdparty/asmjit/asmjit/core/environment.h622
-rw-r--r--3rdparty/asmjit/asmjit/core/errorhandler.cpp19
-rw-r--r--3rdparty/asmjit/asmjit/core/errorhandler.h228
-rw-r--r--3rdparty/asmjit/asmjit/core/fixup.h282
-rw-r--r--3rdparty/asmjit/asmjit/core/formatter.cpp628
-rw-r--r--3rdparty/asmjit/asmjit/core/formatter.h266
-rw-r--r--3rdparty/asmjit/asmjit/core/formatter_p.h40
-rw-r--r--3rdparty/asmjit/asmjit/core/func.cpp316
-rw-r--r--3rdparty/asmjit/asmjit/core/func.h1878
-rw-r--r--3rdparty/asmjit/asmjit/core/funcargscontext.cpp340
-rw-r--r--3rdparty/asmjit/asmjit/core/funcargscontext_p.h226
-rw-r--r--3rdparty/asmjit/asmjit/core/globals.cpp135
-rw-r--r--3rdparty/asmjit/asmjit/core/globals.h458
-rw-r--r--3rdparty/asmjit/asmjit/core/inst.cpp129
-rw-r--r--3rdparty/asmjit/asmjit/core/inst.h924
-rw-r--r--3rdparty/asmjit/asmjit/core/instdb.cpp142
-rw-r--r--3rdparty/asmjit/asmjit/core/instdb_p.h41
-rw-r--r--3rdparty/asmjit/asmjit/core/jitallocator.cpp1646
-rw-r--r--3rdparty/asmjit/asmjit/core/jitallocator.h615
-rw-r--r--3rdparty/asmjit/asmjit/core/jitruntime.cpp86
-rw-r--r--3rdparty/asmjit/asmjit/core/jitruntime.h107
-rw-r--r--3rdparty/asmjit/asmjit/core/logger.cpp79
-rw-r--r--3rdparty/asmjit/asmjit/core/logger.h222
-rw-r--r--3rdparty/asmjit/asmjit/core/misc_p.h33
-rw-r--r--3rdparty/asmjit/asmjit/core/operand.cpp132
-rw-r--r--3rdparty/asmjit/asmjit/core/operand.h2690
-rw-r--r--3rdparty/asmjit/asmjit/core/osutils.cpp41
-rw-r--r--3rdparty/asmjit/asmjit/core/osutils.h54
-rw-r--r--3rdparty/asmjit/asmjit/core/osutils_p.h78
-rw-r--r--3rdparty/asmjit/asmjit/core/raassignment_p.h495
-rw-r--r--3rdparty/asmjit/asmjit/core/racfgblock_p.h390
-rw-r--r--3rdparty/asmjit/asmjit/core/racfgbuilder_p.h653
-rw-r--r--3rdparty/asmjit/asmjit/core/raconstraints_p.h65
-rw-r--r--3rdparty/asmjit/asmjit/core/radefs_p.h1038
-rw-r--r--3rdparty/asmjit/asmjit/core/rainst_p.h438
-rw-r--r--3rdparty/asmjit/asmjit/core/ralocal.cpp1272
-rw-r--r--3rdparty/asmjit/asmjit/core/ralocal_p.h302
-rw-r--r--3rdparty/asmjit/asmjit/core/rapass.cpp2352
-rw-r--r--3rdparty/asmjit/asmjit/core/rapass_p.h732
-rw-r--r--3rdparty/asmjit/asmjit/core/rareg_p.h353
-rw-r--r--3rdparty/asmjit/asmjit/core/rastack.cpp193
-rw-r--r--3rdparty/asmjit/asmjit/core/rastack_p.h194
-rw-r--r--3rdparty/asmjit/asmjit/core/string.cpp666
-rw-r--r--3rdparty/asmjit/asmjit/core/string.h417
-rw-r--r--3rdparty/asmjit/asmjit/core/target.cpp17
-rw-r--r--3rdparty/asmjit/asmjit/core/target.h71
-rw-r--r--3rdparty/asmjit/asmjit/core/type.cpp70
-rw-r--r--3rdparty/asmjit/asmjit/core/type.h512
-rw-r--r--3rdparty/asmjit/asmjit/core/virtmem.cpp1257
-rw-r--r--3rdparty/asmjit/asmjit/core/virtmem.h338
-rw-r--r--3rdparty/asmjit/asmjit/host.h33
-rw-r--r--3rdparty/asmjit/asmjit/support/arena.cpp515
-rw-r--r--3rdparty/asmjit/asmjit/support/arena.h498
-rw-r--r--3rdparty/asmjit/asmjit/support/arenabitset.cpp253
-rw-r--r--3rdparty/asmjit/asmjit/support/arenabitset_p.h436
-rw-r--r--3rdparty/asmjit/asmjit/support/arenahash.cpp309
-rw-r--r--3rdparty/asmjit/asmjit/support/arenahash.h198
-rw-r--r--3rdparty/asmjit/asmjit/support/arenalist.cpp163
-rw-r--r--3rdparty/asmjit/asmjit/support/arenalist.h221
-rw-r--r--3rdparty/asmjit/asmjit/support/arenapool.h66
-rw-r--r--3rdparty/asmjit/asmjit/support/arenastring.h123
-rw-r--r--3rdparty/asmjit/asmjit/support/arenatree.cpp98
-rw-r--r--3rdparty/asmjit/asmjit/support/arenatree.h407
-rw-r--r--3rdparty/asmjit/asmjit/support/arenavector.cpp316
-rw-r--r--3rdparty/asmjit/asmjit/support/arenavector.h641
-rw-r--r--3rdparty/asmjit/asmjit/support/span.h337
-rw-r--r--3rdparty/asmjit/asmjit/support/support.cpp679
-rw-r--r--3rdparty/asmjit/asmjit/support/support.h1898
-rw-r--r--3rdparty/asmjit/asmjit/support/support_p.h255
-rw-r--r--3rdparty/asmjit/asmjit/ujit.h17
-rw-r--r--3rdparty/asmjit/asmjit/ujit/ujitbase.h734
-rw-r--r--3rdparty/asmjit/asmjit/ujit/unicompiler.h2097
-rw-r--r--3rdparty/asmjit/asmjit/ujit/unicompiler_a64.cpp4391
-rw-r--r--3rdparty/asmjit/asmjit/ujit/unicompiler_utils_p.h32
-rw-r--r--3rdparty/asmjit/asmjit/ujit/unicompiler_x86.cpp7591
-rw-r--r--3rdparty/asmjit/asmjit/ujit/unicondition.h293
-rw-r--r--3rdparty/asmjit/asmjit/ujit/uniop.h819
-rw-r--r--3rdparty/asmjit/asmjit/ujit/vecconsttable.cpp20
-rw-r--r--3rdparty/asmjit/asmjit/ujit/vecconsttable.h454
-rw-r--r--3rdparty/asmjit/asmjit/x86.h84
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86archtraits_p.h165
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86assembler.cpp5141
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86assembler.h706
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86builder.cpp58
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86builder.h354
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86compiler.cpp73
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86compiler.h828
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86emithelper.cpp708
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86emithelper_p.h121
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86emitter.h4445
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86formatter.cpp1015
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86formatter_p.h58
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86func.cpp523
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86func_p.h33
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86globals.h2206
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86instapi.cpp1938
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86instapi_p.h39
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86instdb.cpp6182
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86instdb.h704
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86instdb_p.h315
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86opcode_p.h434
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86operand.cpp249
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86operand.h1195
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86rapass.cpp1653
-rw-r--r--3rdparty/asmjit/asmjit/x86/x86rapass_p.h96
-rw-r--r--3rdparty/asmjit/configure.sh9
-rw-r--r--3rdparty/asmjit/configure_sanitizers.sh13
-rw-r--r--3rdparty/asmjit/configure_vs2022_x64.bat2
-rw-r--r--3rdparty/asmjit/configure_vs2022_x86.bat2
-rw-r--r--3rdparty/asmjit/db/LICENSE.md17
-rw-r--r--3rdparty/asmjit/db/README.md21
-rw-r--r--3rdparty/asmjit/db/aarch32.js987
-rw-r--r--3rdparty/asmjit/db/aarch64.js920
-rw-r--r--3rdparty/asmjit/db/base.js707
-rw-r--r--3rdparty/asmjit/db/exp.js760
-rw-r--r--3rdparty/asmjit/db/index.js11
-rw-r--r--3rdparty/asmjit/db/isa_aarch32.json2783
-rw-r--r--3rdparty/asmjit/db/isa_aarch64.json3820
-rw-r--r--3rdparty/asmjit/db/isa_aarch64_sme.json15
-rw-r--r--3rdparty/asmjit/db/isa_x86.json4244
-rw-r--r--3rdparty/asmjit/db/isa_x86.md145
-rw-r--r--3rdparty/asmjit/db/package.json29
-rw-r--r--3rdparty/asmjit/db/x86.js1273
-rw-r--r--3rdparty/asmjit/tools/enumgen.js414
-rwxr-xr-x3rdparty/asmjit/tools/enumgen.sh3
-rw-r--r--3rdparty/asmjit/tools/generator-commons.js594
-rw-r--r--3rdparty/asmjit/tools/generator-cxx.js274
-rw-r--r--3rdparty/asmjit/tools/tablegen-a64.js351
-rwxr-xr-x3rdparty/asmjit/tools/tablegen-a64.sh3
-rw-r--r--3rdparty/asmjit/tools/tablegen-x86.js2644
-rwxr-xr-x3rdparty/asmjit/tools/tablegen-x86.sh3
-rw-r--r--3rdparty/asmjit/tools/tablegen.js655
-rwxr-xr-x3rdparty/asmjit/tools/tablegen.sh5
-rw-r--r--3rdparty/benchmark/.clang-format96
-rw-r--r--3rdparty/benchmark/.gitignore46
-rw-r--r--3rdparty/benchmark/.travis-libcxx-setup.sh22
-rw-r--r--3rdparty/benchmark/.travis.yml92
-rw-r--r--3rdparty/benchmark/.ycm_extra_conf.py115
-rw-r--r--3rdparty/benchmark/AUTHORS34
-rw-r--r--3rdparty/benchmark/CMakeLists.txt166
-rw-r--r--3rdparty/benchmark/CONTRIBUTING.md58
-rw-r--r--3rdparty/benchmark/CONTRIBUTORS52
-rw-r--r--3rdparty/benchmark/LICENSE202
-rw-r--r--3rdparty/benchmark/README.md578
-rw-r--r--3rdparty/benchmark/appveyor.yml54
-rw-r--r--3rdparty/benchmark/cmake/AddCXXCompilerFlag.cmake37
-rw-r--r--3rdparty/benchmark/cmake/CXXFeatureCheck.cmake44
-rw-r--r--3rdparty/benchmark/cmake/GetGitVersion.cmake51
-rw-r--r--3rdparty/benchmark/cmake/gnu_posix_regex.cpp12
-rw-r--r--3rdparty/benchmark/cmake/posix_regex.cpp14
-rw-r--r--3rdparty/benchmark/cmake/std_regex.cpp10
-rw-r--r--3rdparty/benchmark/cmake/steady_clock.cpp7
-rw-r--r--3rdparty/benchmark/cmake/thread_safety_attributes.cpp4
-rw-r--r--3rdparty/benchmark/include/benchmark/benchmark.h21
-rw-r--r--3rdparty/benchmark/include/benchmark/benchmark_api.h844
-rw-r--r--3rdparty/benchmark/include/benchmark/macros.h66
-rw-r--r--3rdparty/benchmark/include/benchmark/reporter.h225
-rw-r--r--3rdparty/benchmark/mingw.py320
-rw-r--r--3rdparty/benchmark/src/CMakeLists.txt66
-rw-r--r--3rdparty/benchmark/src/arraysize.h34
-rw-r--r--3rdparty/benchmark/src/benchmark.cc1143
-rw-r--r--3rdparty/benchmark/src/check.h70
-rw-r--r--3rdparty/benchmark/src/colorprint.cc154
-rw-r--r--3rdparty/benchmark/src/colorprint.h28
-rw-r--r--3rdparty/benchmark/src/commandlineflags.cc220
-rw-r--r--3rdparty/benchmark/src/commandlineflags.h76
-rw-r--r--3rdparty/benchmark/src/complexity.cc283
-rw-r--r--3rdparty/benchmark/src/complexity.h64
-rw-r--r--3rdparty/benchmark/src/console_reporter.cc133
-rw-r--r--3rdparty/benchmark/src/csv_reporter.cc118
-rw-r--r--3rdparty/benchmark/src/cycleclock.h145
-rw-r--r--3rdparty/benchmark/src/internal_macros.h43
-rw-r--r--3rdparty/benchmark/src/json_reporter.cc178
-rw-r--r--3rdparty/benchmark/src/log.h72
-rw-r--r--3rdparty/benchmark/src/mutex.h166
-rw-r--r--3rdparty/benchmark/src/re.h60
-rw-r--r--3rdparty/benchmark/src/re_posix.cc59
-rw-r--r--3rdparty/benchmark/src/re_std.cc44
-rw-r--r--3rdparty/benchmark/src/reporter.cc75
-rw-r--r--3rdparty/benchmark/src/sleep.cc50
-rw-r--r--3rdparty/benchmark/src/sleep.h17
-rw-r--r--3rdparty/benchmark/src/stat.h307
-rw-r--r--3rdparty/benchmark/src/string_util.cc169
-rw-r--r--3rdparty/benchmark/src/string_util.h44
-rw-r--r--3rdparty/benchmark/src/sysinfo.cc332
-rw-r--r--3rdparty/benchmark/src/sysinfo.h10
-rw-r--r--3rdparty/benchmark/src/timers.cc195
-rw-r--r--3rdparty/benchmark/src/timers.h48
-rw-r--r--3rdparty/benchmark/test/CMakeLists.txt139
-rw-r--r--3rdparty/benchmark/test/basic_test.cc102
-rw-r--r--3rdparty/benchmark/test/benchmark_test.cc224
-rw-r--r--3rdparty/benchmark/test/complexity_test.cc153
-rw-r--r--3rdparty/benchmark/test/cxx03_test.cc42
-rw-r--r--3rdparty/benchmark/test/diagnostics_test.cc61
-rw-r--r--3rdparty/benchmark/test/donotoptimize_test.cc36
-rw-r--r--3rdparty/benchmark/test/filter_test.cc105
-rw-r--r--3rdparty/benchmark/test/fixture_test.cc52
-rw-r--r--3rdparty/benchmark/test/map_test.cc58
-rw-r--r--3rdparty/benchmark/test/multiple_ranges_test.cc61
-rw-r--r--3rdparty/benchmark/test/options_test.cc44
-rw-r--r--3rdparty/benchmark/test/output_test.h72
-rw-r--r--3rdparty/benchmark/test/output_test_helper.cc224
-rw-r--r--3rdparty/benchmark/test/register_benchmark_test.cc149
-rw-r--r--3rdparty/benchmark/test/reporter_output_test.cc158
-rw-r--r--3rdparty/benchmark/test/skip_with_error_test.cc161
-rw-r--r--3rdparty/benchmark/tools/compare_bench.py30
-rw-r--r--3rdparty/benchmark/tools/gbench/Inputs/test1_run1.json46
-rw-r--r--3rdparty/benchmark/tools/gbench/Inputs/test1_run2.json46
-rw-r--r--3rdparty/benchmark/tools/gbench/__init__.py8
-rw-r--r--3rdparty/benchmark/tools/gbench/report.py141
-rw-r--r--3rdparty/benchmark/tools/gbench/util.py130
-rw-r--r--3rdparty/bgfx/.editorconfig24
-rw-r--r--3rdparty/bgfx/.gitattributes12
-rw-r--r--3rdparty/bgfx/.github/ISSUE_TEMPLATE/bug_report.md54
-rw-r--r--3rdparty/bgfx/.github/workflows/main.yml250
-rw-r--r--3rdparty/bgfx/.gitignore11
-rw-r--r--3rdparty/bgfx/3rdparty/.editorconfig37
-rw-r--r--3rdparty/bgfx/3rdparty/cgltf/LICENSE7
-rw-r--r--3rdparty/bgfx/3rdparty/cgltf/cgltf.h6820
-rw-r--r--3rdparty/bgfx/3rdparty/cgltf/cgltf_write.h1488
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/LICENSE.txt21
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imconfig.h145
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui.cpp17061
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui.h3770
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui_demo.cpp10686
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui_draw.cpp4828
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui_internal.h3636
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui_tables.cpp4525
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui_user.h52
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui_user.inl81
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imgui_widgets.cpp10455
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imstb_rectpack.h1
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imstb_textedit.h1
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/imstb_truetype.h1
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/color_picker.h24
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/color_picker.inl122
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/color_wheel.h7
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/color_wheel.inl39
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/dock.h21
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/dock.inl1088
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/file_list.h28
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/file_list.inl127
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/gizmo.h223
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/gizmo.inl2883
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/markdown.h146
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/markdown.inl461
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/memory_editor.h27
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/memory_editor.inl252
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/range_slider.h5
-rw-r--r--3rdparty/bgfx/3rdparty/dear-imgui/widgets/range_slider.inl217
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/LICENSE21
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/PIXEventsCommon.h483
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/PIXEventsGenerated.h10748
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d10.h1
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d10_1.h1
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d10_1shader.h1
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d10effect.h1
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d10misc.h1
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d10sdklayers.h1
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d10shader.h1
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d11.h14600
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d11_1.h5220
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d11_2.h2721
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d11_3.h6826
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d11_4.h4759
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d11sdklayers.h2606
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d11shader.h601
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d11shadertracing.h570
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d12.h28706
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d12compatibility.h739
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d12sdklayers.h4110
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d12shader.h490
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d12video.h8584
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d9.h2794
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d9caps.h571
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3d9types.h2444
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3dcommon.h1116
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/d3dcompiler.h586
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxcore.h41
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxcore_interface.h316
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxgi.h2953
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxgi1_2.h2466
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxgi1_3.h2108
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxgi1_4.h1489
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxgi1_5.h1540
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxgi1_6.h1511
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxgicommon.h57
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxgidebug.h986
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxgiformat.h142
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxgitype.h111
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/dxva2api.h1945
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/pix3.h116
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/pix3_win.h53
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/directx/winapifamily.h30
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/stubs/basetsd.h347
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/stubs/oaidl.h5
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/stubs/objbase.h1
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/stubs/ocidl.h5
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/stubs/rpc.h5
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/stubs/rpcndr.h82
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/stubs/unknwn.h3
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/stubs/unknwnbase.h124
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/stubs/winapifamily.h6
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/stubs/windows.h18
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/stubs/wrl/client.h6
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/stubs/wrl/implements.h6
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/winadapter.h6
-rw-r--r--3rdparty/bgfx/3rdparty/directx-headers/include/wsl/wrladapter.h803
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/.gitignore3
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/COPYING38
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/FPPBase.h56
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/FPP_protos.h35
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/README13
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/cpp.h251
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/cpp1.c605
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/cpp2.c774
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/cpp3.c413
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/cpp4.c634
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/cpp5.c904
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/cpp6.c1168
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/cppadd.h418
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/cppdef.h383
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/fpp.exp2
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/fpp.fd4
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/fpp.h176
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/fpp_pragmas.h20
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/makefile61
-rw-r--r--3rdparty/bgfx/3rdparty/fcpp/usecpp.c602
-rwxr-xr-x3rdparty/bgfx/3rdparty/glsl-optimizer/generateParsers.sh5
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/include/c99/inttypes.h305
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/include/c99/stdbool.h47
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/include/c99/stdint.h247
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/include/c99_compat.h180
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/license.txt21
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/getopt/getopt.h82
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/getopt/getopt_long.c511
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/Makefile131
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ast.h1129
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ast_array_index.cpp268
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ast_expr.cpp95
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ast_function.cpp1846
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ast_to_hir.cpp6124
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ast_type.cpp363
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/builtin_functions.cpp4680
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/builtin_type_macros.h156
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/builtin_types.cpp369
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/builtin_variables.cpp1111
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-lex.c3139
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-lex.l578
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.c4889
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.h114
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.y2521
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp.h253
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glcpp/pp.c242
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.cpp4358
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_lexer.ll596
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_optimizer.cpp831
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_optimizer.h92
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_parser.cpp6892
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_parser.h352
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_parser.yy2681
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_parser_extras.cpp1680
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_parser_extras.h601
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_symbol_table.cpp250
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_symbol_table.h108
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_types.cpp1098
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glsl_types.h752
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/hir_field_selection.cpp121
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir.cpp2019
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir.h2533
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_basic_block.cpp125
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_basic_block.h28
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_builder.cpp572
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_builder.h222
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_clone.cpp446
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_constant_expression.cpp1978
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_equals.cpp202
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_expression_flattening.cpp86
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_expression_flattening.h38
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_function.cpp401
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_function_can_inline.cpp76
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_function_detect_recursion.cpp358
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_function_inlining.h30
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_hierarchical_visitor.cpp392
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_hierarchical_visitor.h210
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_hv_accept.cpp430
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_import_prototypes.cpp125
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_optimization.h136
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.cpp1789
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_print_glsl_visitor.h105
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_print_metal_visitor.cpp2039
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_print_metal_visitor.h36
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_print_visitor.cpp561
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_print_visitor.h97
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_rvalue_visitor.cpp293
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_rvalue_visitor.h80
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_stats.cpp64
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_stats.h3
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_uniform.h195
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_unused_structs.cpp139
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_unused_structs.h26
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_validate.cpp859
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_variable_refcount.cpp160
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_variable_refcount.h76
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/ir_visitor.h93
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/link_atomics.cpp277
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/link_functions.cpp348
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/link_interface_blocks.cpp385
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/link_uniform_block_active_visitor.cpp221
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/link_uniform_block_active_visitor.h64
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/link_uniform_blocks.cpp363
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/link_uniform_initializers.cpp315
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/link_uniforms.cpp988
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/link_varyings.cpp1582
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/link_varyings.h266
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/linker.cpp2904
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/linker.h199
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/list.h658
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/loop_analysis.cpp813
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/loop_analysis.h280
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/loop_controls.cpp253
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/loop_unroll.cpp408
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_clip_distance.cpp549
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_discard.cpp201
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_discard_flow.cpp148
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_if_to_cond_assign.cpp252
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_instructions.cpp578
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_jumps.cpp1032
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_mat_op_to_vec.cpp432
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_named_interface_blocks.cpp251
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_noise.cpp71
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_offset_array.cpp91
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_output_reads.cpp173
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_packed_varyings.cpp681
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_packing_builtins.cpp1314
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_ubo_reference.cpp553
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_variable_index_to_cond_assign.cpp550
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_vec_index_to_cond_assign.cpp238
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_vec_index_to_swizzle.cpp171
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_vector.cpp228
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_vector_insert.cpp142
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/lower_vertex_id.cpp144
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/main.cpp415
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_algebraic.cpp842
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_array_splitting.cpp415
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_constant_folding.cpp166
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_constant_propagation.cpp464
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_constant_variable.cpp224
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_copy_propagation.cpp350
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_copy_propagation_elements.cpp505
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_cse.cpp419
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_dead_builtin_variables.cpp81
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_dead_builtin_varyings.cpp586
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_dead_code.cpp169
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_dead_code_local.cpp331
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_dead_functions.cpp152
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_flatten_nested_if_blocks.cpp103
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_flip_matrices.cpp123
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_function_inlining.cpp380
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_if_simplification.cpp126
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_minmax.cpp475
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_noop_swizzle.cpp83
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_rebalance_tree.cpp321
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_redundant_jumps.cpp124
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_structure_splitting.cpp366
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_swizzle_swizzle.cpp97
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_tree_grafting.cpp421
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/opt_vectorize.cpp408
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/program.h52
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/s_expression.cpp217
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/s_expression.h180
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/standalone_scaffolding.cpp163
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/standalone_scaffolding.h77
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/strtod.c79
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/strtod.h46
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl_optimizer_lib.gyp190
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/compiler.h364
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/config.h322
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/context.h85
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/core.h53
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/dd.h54
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/errors.h53
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/glheader.h264
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/glminimal.h479
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/imports.c554
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/imports.h551
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/macros.h824
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/mtypes.h1693
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/main/simple_list.h205
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/program/hash_table.h288
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/program/prog_hash_table.c245
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/program/prog_instruction.h430
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/program/prog_parameter.h58
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/program/prog_statevars.h139
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/program/symbol_table.c435
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/mesa/program/symbol_table.h49
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/node/binding.cpp22
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/node/compiler.cpp87
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/node/compiler.h27
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/node/shader.cpp182
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/node/shader.h37
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/util/Makefile.sources9
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/util/hash_table.c440
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/util/hash_table.h107
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/util/macros.h129
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/util/ralloc.c492
-rw-r--r--3rdparty/bgfx/3rdparty/glsl-optimizer/src/util/ralloc.h449
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/LICENSE.txt1016
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/OGLCompilersDLL/InitializeDll.cpp165
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/OGLCompilersDLL/InitializeDll.h49
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/CInterface/spirv_c_interface.cpp124
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/GLSL.ext.AMD.h108
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/GLSL.ext.EXT.h44
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/GLSL.ext.KHR.h58
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/GLSL.ext.NV.h84
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/GLSL.std.450.h131
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/GlslangToSpv.cpp9656
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/GlslangToSpv.h61
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/InReadableOrder.cpp131
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/Logger.cpp72
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/Logger.h83
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/NonSemanticDebugPrintf.h50
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/NonSemanticShaderDebugInfo100.h171
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/SPVRemapper.cpp1532
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/SPVRemapper.h312
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/SpvBuilder.cpp4036
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/SpvBuilder.h960
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/SpvPostProcess.cpp495
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/SpvTools.cpp248
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/SpvTools.h93
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/bitutils.h81
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/disassemble.cpp761
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/disassemble.h53
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/doc.cpp3035
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/doc.h259
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/hex_float.h1078
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/spirv.hpp2533
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/SPIRV/spvIR.h520
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/StandAlone/DirStackFileIncluder.h149
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/StandAlone/ResourceLimits.cpp540
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/StandAlone/StandAlone.cpp2140
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/StandAlone/Worklist.h95
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/StandAlone/resource_limits_c.cpp70
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/StandAlone/spirv-remap.cpp375
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/build_info.h62
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/CInterface/glslang_c_interface.cpp486
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl38
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/GenericCodeGen/CodeGen.cpp76
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/GenericCodeGen/Link.cpp91
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslAttributes.cpp149
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslAttributes.h59
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslGrammar.cpp4192
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslGrammar.h142
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslOpMap.cpp173
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslOpMap.h69
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslParseHelper.cpp10282
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslParseHelper.h517
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslParseables.cpp1259
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslParseables.h64
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslScanContext.cpp903
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslScanContext.h109
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslTokenStream.cpp150
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslTokenStream.h96
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/hlslTokens.h374
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/HLSL/pch.h53
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/BaseTypes.h609
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/Common.h341
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/ConstantUnion.h974
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/InfoSink.h144
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/InitializeGlobals.h44
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/PoolAlloc.h318
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/ResourceLimits.h159
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/ShHandle.h176
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/SpirvIntrinsics.h128
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/Types.h2901
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/arrays.h341
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/glslang_c_interface.h279
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/glslang_c_shader_types.h227
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Include/intermediate.h1850
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/Constant.cpp1398
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/InfoSink.cpp113
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/Initialize.cpp9897
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/Initialize.h112
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/IntermTraverse.cpp309
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/Intermediate.cpp4027
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/LiveTraverser.h168
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/ParseContextBase.cpp738
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/ParseHelper.cpp9475
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/ParseHelper.h588
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/PoolAlloc.cpp315
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/RemoveTree.cpp118
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/RemoveTree.h41
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/Scan.cpp1967
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/Scan.h276
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/ScanContext.h93
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/ShaderLang.cpp2241
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/SpirvIntrinsics.cpp350
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/SymbolTable.cpp477
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/SymbolTable.h958
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/Versions.cpp1369
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/Versions.h359
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/attribute.cpp371
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/attribute.h150
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/gl_types.h218
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/glslang.m44422
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/glslang.y4422
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/glslang_tab.cpp12492
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/glslang_tab.cpp.h571
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/intermOut.cpp1566
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/iomapper.cpp1713
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/iomapper.h361
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/limits.cpp200
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/linkValidate.cpp2349
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/localintermediate.h1222
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/parseConst.cpp213
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/parseVersions.h240
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/pch.h49
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/preprocessor/Pp.cpp1346
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpAtom.cpp181
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpContext.cpp120
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpContext.h703
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpScanner.cpp1317
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpTokens.cpp221
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/preprocessor/PpTokens.h179
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/propagateNoContraction.cpp870
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/propagateNoContraction.h55
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/reflection.cpp1274
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/reflection.h223
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/OSDependent/Unix/ossource.cpp167
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/OSDependent/Windows/ossource.cpp147
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/OSDependent/osinclude.h61
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Public/ResourceLimits.h57
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Public/ShaderLang.h987
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/glslang/Public/resource_limits_c.h57
-rwxr-xr-x3rdparty/bgfx/3rdparty/glslang/glslang/updateGrammar49
-rw-r--r--3rdparty/bgfx/3rdparty/glslang/hlsl/stub.cpp41
-rw-r--r--3rdparty/bgfx/3rdparty/iconfontheaders/GenerateIconFontCppHeaders.py532
-rw-r--r--3rdparty/bgfx/3rdparty/iconfontheaders/LICENSE22
-rw-r--r--3rdparty/bgfx/3rdparty/iconfontheaders/icons_font_awesome.h682
-rw-r--r--3rdparty/bgfx/3rdparty/iconfontheaders/icons_font_awesome_4.h684
-rw-r--r--3rdparty/bgfx/3rdparty/iconfontheaders/icons_font_awesome_5.h750
-rw-r--r--3rdparty/bgfx/3rdparty/iconfontheaders/icons_font_awesome_5_brands.h382
-rw-r--r--3rdparty/bgfx/3rdparty/iconfontheaders/icons_fork_awesome.h727
-rw-r--r--3rdparty/bgfx/3rdparty/iconfontheaders/icons_ionicons.h742
-rw-r--r--3rdparty/bgfx/3rdparty/iconfontheaders/icons_kenney.h237
-rw-r--r--3rdparty/bgfx/3rdparty/iconfontheaders/icons_material_design.h941
-rw-r--r--3rdparty/bgfx/3rdparty/iconfontheaders/icons_material_design_icons.h2604
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/EGL/egl.h303
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/EGL/eglext.h1334
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/EGL/eglplatform.h164
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/GLES2/gl2.h675
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/GLES2/gl2ext.h3707
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/GLES2/gl2platform.h38
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/GLES3/gl3.h1211
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/GLES3/gl31.h1528
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/GLES3/gl32.h1829
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/GLES3/gl3ext.h24
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/GLES3/gl3platform.h38
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/KHR/khrplatform.h282
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/gl/GRemedyGLExtensions.h67
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/gl/glcorearb.h5866
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/gl/glext.h12742
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/glx/glxext.h838
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vk_icd.h252
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vk_layer.h210
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vk_platform.h84
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vk_sdk_platform.h71
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan.h91
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_android.h125
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_beta.h1014
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_core.h16392
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_directfb.h54
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_fuchsia.h258
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_ggp.h58
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_ios.h47
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_macos.h47
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_metal.h193
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_screen.h54
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_vi.h47
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_wayland.h54
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_win32.h315
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_xcb.h55
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_xlib.h55
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/vulkan-local/vulkan_xlib_xrandr.h45
-rw-r--r--3rdparty/bgfx/3rdparty/khronos/wgl/wglext.h833
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/LICENSE.md21
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/allocator.cpp8
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/clusterizer.cpp884
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/indexcodec.cpp674
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/indexgenerator.cpp551
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/meshoptimizer.h1069
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/overdrawanalyzer.cpp230
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/overdrawoptimizer.cpp333
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/simplifier.cpp1677
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/spatialorder.cpp194
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/stripifier.cpp295
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/vcacheanalyzer.cpp73
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/vcacheoptimizer.cpp473
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/vertexcodec.cpp1249
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/vertexfilter.cpp962
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/vfetchanalyzer.cpp58
-rw-r--r--3rdparty/bgfx/3rdparty/meshoptimizer/src/vfetchoptimizer.cpp74
-rw-r--r--3rdparty/bgfx/3rdparty/native_app_glue/LICENSE13
-rw-r--r--3rdparty/bgfx/3rdparty/native_app_glue/android_native_app_glue.c457
-rw-r--r--3rdparty/bgfx/3rdparty/native_app_glue/android_native_app_glue.h350
-rw-r--r--3rdparty/bgfx/3rdparty/renderdoc/renderdoc_app.h724
-rw-r--r--3rdparty/bgfx/3rdparty/sdf/LICENSE.txt22
-rw-r--r--3rdparty/bgfx/3rdparty/sdf/sdf.h385
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/GLSL.std.450.h114
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/LICENSE202
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/include/spirv_cross/barrier.hpp80
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/include/spirv_cross/external_interface.h127
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/include/spirv_cross/image.hpp63
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/include/spirv_cross/internal_interface.hpp604
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/include/spirv_cross/sampler.hpp106
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/include/spirv_cross/thread_group.hpp114
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/main.cpp1948
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv.h2568
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv.hpp2579
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cfg.cpp430
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cfg.hpp168
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_common.hpp1920
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cpp.cpp553
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cpp.hpp93
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cross.cpp5432
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cross.hpp1171
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cross_c.cpp2770
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cross_c.h1074
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cross_containers.hpp754
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cross_error_handling.hpp94
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cross_parsed_ir.cpp1074
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cross_parsed_ir.hpp256
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cross_util.cpp77
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_cross_util.hpp37
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_glsl.cpp17529
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_glsl.hpp1001
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_hlsl.cpp6664
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_hlsl.hpp406
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_msl.cpp17545
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_msl.hpp1273
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_parser.cpp1330
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_parser.hpp103
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_reflect.cpp706
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-cross/spirv_reflect.hpp91
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/LICENSE25
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.0/GLSL.std.450.h131
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.0/OpenCL.std.h210
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.0/extinst.glsl.std.450.grammar.json642
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.0/extinst.opencl.std.100.grammar.json1279
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.0/spirv.core.grammar.json5775
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.0/spirv.h993
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.0/spirv.json1020
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.1/GLSL.std.450.h131
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.1/OpenCL.std.h210
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.1/extinst.glsl.std.450.grammar.json642
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.1/extinst.opencl.std.100.grammar.json1279
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.1/spirv.core.grammar.json5938
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.1/spirv.h1015
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.1/spirv.json1040
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.2/GLSL.std.450.h131
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.2/OpenCL.std.h210
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.2/extinst.glsl.std.450.grammar.json642
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.2/extinst.opencl.std.100.grammar.json1279
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.2/spirv.core.grammar.json5986
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.2/spirv.h1021
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/1.2/spirv.json1046
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/spir-v.xml282
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/AMD_gcn_shader.h52
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/AMD_shader_ballot.h53
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/AMD_shader_explicit_vertex_parameter.h50
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/AMD_shader_trinary_minmax.h58
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/DebugInfo.h144
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/GLSL.std.450.h131
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/NonSemanticClspvReflection.h84
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/NonSemanticDebugPrintf.h50
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/NonSemanticShaderDebugInfo100.h171
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/OpenCL.std.h401
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/OpenCLDebugInfo100.h158
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/extinst.debuginfo.grammar.json572
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/extinst.glsl.std.450.grammar.json642
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/extinst.nonsemantic.clspvreflection.grammar.json352
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/extinst.nonsemantic.debugprintf.grammar.json13
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/extinst.nonsemantic.shader.debuginfo.100.grammar.json713
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/extinst.opencl.debuginfo.100.grammar.json651
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/extinst.opencl.std.100.grammar.json1279
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/extinst.spv-amd-gcn-shader.grammar.json26
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/extinst.spv-amd-shader-ballot.grammar.json41
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json14
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/extinst.spv-amd-shader-trinary-minmax.grammar.json95
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/spirv.core.grammar.json14427
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/spirv.h2577
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-headers/include/spirv/unified1/spirv.json1895
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/LICENSE202
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/DebugInfo.h138
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/NonSemanticShaderDebugInfo100.h165
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/OpenCLDebugInfo100.h152
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/build-version.inc1
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/core.insts-unified1.inc779
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/debuginfo.insts.inc38
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/enum_string_mapping.inc651
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/extension_enum.inc107
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/generators.inc36
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/glsl.std.450.insts.inc86
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/nonsemantic.clspvreflection.insts.inc39
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/nonsemantic.shader.debuginfo.100.insts.inc48
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/opencl.debuginfo.100.insts.inc41
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/opencl.std.insts.inc166
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/operand.kinds-unified1.inc1405
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/spv-amd-gcn-shader.insts.inc7
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/spv-amd-shader-ballot.insts.inc8
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/spv-amd-shader-explicit-vertex-parameter.insts.inc5
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/generated/spv-amd-shader-trinary-minmax.insts.inc13
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/spirv-tools/instrument.hpp259
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/spirv-tools/libspirv.h908
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/spirv-tools/libspirv.hpp375
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/spirv-tools/linker.hpp97
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/spirv-tools/linter.hpp48
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/include/spirv-tools/optimizer.hpp922
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/assembly_grammar.cpp264
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/assembly_grammar.h138
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/binary.cpp839
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/binary.h43
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/cfa.h396
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/common_debug_info.h64
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/diagnostic.cpp193
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/diagnostic.h79
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/diff/diff.cpp2869
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/diff/diff.h48
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/diff/lcs.h224
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/disassemble.cpp565
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/disassemble.h98
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/enum_set.h208
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/enum_string_mapping.cpp29
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/enum_string_mapping.h36
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/ext_inst.cpp209
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/ext_inst.h46
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/extensions.cpp46
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/extensions.h40
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/instruction.h49
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/latest_version_glsl_std_450_header.h20
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/latest_version_opencl_std_header.h20
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/latest_version_spirv_header.h20
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/libspirv.cpp137
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/link/linker.cpp826
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/lint/divergence_analysis.cpp245
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/lint/divergence_analysis.h163
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/lint/lint_divergent_derivatives.cpp169
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/lint/linter.cpp60
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/lint/lints.h34
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/macro.h25
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/name_mapper.cpp331
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/name_mapper.h122
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opcode.cpp767
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opcode.h159
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/operand.cpp621
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/operand.h151
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/aggressive_dead_code_elim_pass.cpp1103
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/aggressive_dead_code_elim_pass.h258
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/amd_ext_to_khr.cpp970
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/amd_ext_to_khr.h51
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/basic_block.cpp287
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/basic_block.h342
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/block_merge_pass.cpp54
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/block_merge_pass.h62
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/block_merge_util.cpp216
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/block_merge_util.h44
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/build_module.cpp88
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/build_module.h54
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/ccp_pass.cpp381
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/ccp_pass.h133
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/cfg.cpp354
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/cfg.h189
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/cfg_cleanup_pass.cpp39
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/cfg_cleanup_pass.h41
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/code_sink.cpp322
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/code_sink.h107
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/combine_access_chains.cpp294
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/combine_access_chains.h83
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/compact_ids_pass.cpp106
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/compact_ids_pass.h42
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/composite.cpp52
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/composite.h51
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/const_folding_rules.cpp1551
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/const_folding_rules.h130
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/constants.cpp483
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/constants.h727
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/control_dependence.cpp156
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/control_dependence.h197
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/convert_to_half_pass.cpp483
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/convert_to_half_pass.h148
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/convert_to_sampled_image_pass.cpp437
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/convert_to_sampled_image_pass.h207
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/copy_prop_arrays.cpp886
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/copy_prop_arrays.h261
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/dataflow.cpp91
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/dataflow.h148
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/dead_branch_elim_pass.cpp654
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/dead_branch_elim_pass.h176
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/dead_insert_elim_pass.cpp264
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/dead_insert_elim_pass.h90
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/dead_variable_elimination.cpp111
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/dead_variable_elimination.h56
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/debug_info_manager.cpp929
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/debug_info_manager.h285
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/decoration_manager.cpp636
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/decoration_manager.h210
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/def_use_manager.cpp313
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/def_use_manager.h252
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/desc_sroa.cpp416
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/desc_sroa.h144
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/desc_sroa_util.cpp117
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/desc_sroa_util.h54
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/dominator_analysis.cpp81
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/dominator_analysis.h138
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/dominator_tree.cpp386
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/dominator_tree.h305
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/eliminate_dead_constant_pass.cpp104
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/eliminate_dead_constant_pass.h35
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/eliminate_dead_functions_pass.cpp52
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/eliminate_dead_functions_pass.h44
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/eliminate_dead_functions_util.cpp66
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/eliminate_dead_functions_util.h36
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/eliminate_dead_input_components_pass.cpp189
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/eliminate_dead_input_components_pass.h65
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/eliminate_dead_members_pass.cpp691
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/eliminate_dead_members_pass.h146
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/empty_pass.h36
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/feature_manager.cpp119
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/feature_manager.h108
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/fix_func_call_arguments.cpp90
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/fix_func_call_arguments.h47
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/fix_storage_class.cpp340
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/fix_storage_class.h93
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/flatten_decoration_pass.cpp165
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/flatten_decoration_pass.h35
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/fold.cpp710
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/fold.h187
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/fold_spec_constant_op_and_composite_pass.cpp354
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/fold_spec_constant_op_and_composite_pass.h71
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/folding_rules.cpp2982
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/folding_rules.h118
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/freeze_spec_constant_value_pass.cpp53
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/freeze_spec_constant_value_pass.h35
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/function.cpp282
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/function.h309
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/graphics_robust_access_pass.cpp1058
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/graphics_robust_access_pass.h156
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/if_conversion.cpp294
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/if_conversion.h89
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/inline_exhaustive_pass.cpp80
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/inline_exhaustive_pass.h53
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/inline_opaque_pass.cpp120
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/inline_opaque_pass.h60
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/inline_pass.cpp845
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/inline_pass.h249
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/inst_bindless_check_pass.cpp834
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/inst_bindless_check_pass.h209
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/inst_buff_addr_check_pass.cpp495
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/inst_buff_addr_check_pass.h135
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/inst_debug_printf_pass.cpp264
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/inst_debug_printf_pass.h95
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instruction.cpp1052
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instruction.h914
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instruction_list.cpp36
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instruction_list.h140
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instrument_pass.cpp1190
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/instrument_pass.h488
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/interface_var_sroa.cpp968
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/interface_var_sroa.h401
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/interp_fixup_pass.cpp124
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/interp_fixup_pass.h54
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/ir_builder.h645
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/ir_context.cpp1062
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/ir_context.h1189
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/ir_loader.cpp368
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/ir_loader.h101
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/iterator.h350
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/licm_pass.cpp140
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/licm_pass.h72
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/local_access_chain_convert_pass.cpp496
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/local_access_chain_convert_pass.h145
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/local_redundancy_elimination.cpp67
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/local_redundancy_elimination.h68
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/local_single_block_elim_pass.cpp295
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/local_single_block_elim_pass.h107
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/local_single_store_elim_pass.cpp310
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/local_single_store_elim_pass.h108
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/log.h235
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_dependence.cpp1675
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_dependence.h560
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_dependence_helpers.cpp541
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_descriptor.cpp1030
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_descriptor.h577
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_fission.cpp513
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_fission.h78
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_fusion.cpp730
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_fusion.h114
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_fusion_pass.cpp69
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_fusion_pass.h51
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_peeling.cpp1085
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_peeling.h336
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_unroller.cpp1145
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_unroller.h49
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_unswitch_pass.cpp620
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_unswitch_pass.h43
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_utils.cpp694
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/loop_utils.h182
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/mem_pass.cpp509
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/mem_pass.h164
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/merge_return_pass.cpp889
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/merge_return_pass.h335
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/module.cpp283
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/module.h549
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/null_pass.h34
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/optimizer.cpp1043
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/pass.cpp155
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/pass.h171
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/pass_manager.cpp93
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/pass_manager.h158
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/passes.h89
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/pch_source_opt.cpp15
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/pch_source_opt.h32
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/private_to_local_pass.cpp237
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/private_to_local_pass.h73
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/propagator.cpp291
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/propagator.h317
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/reduce_load_size.cpp191
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/reduce_load_size.h73
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/redundancy_elimination.cpp60
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/redundancy_elimination.h56
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/reflect.h67
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/register_pressure.cpp583
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/register_pressure.h196
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/relax_float_ops_pass.cpp178
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/relax_float_ops_pass.h80
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/remove_dontinline_pass.cpp49
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/remove_dontinline_pass.h42
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/remove_duplicates_pass.cpp212
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/remove_duplicates_pass.h61
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/remove_unused_interface_variables_pass.cpp93
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/remove_unused_interface_variables_pass.h26
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/replace_desc_array_access_using_var_index.cpp429
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/replace_desc_array_access_using_var_index.h205
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/replace_invalid_opc.cpp217
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/replace_invalid_opc.h67
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/scalar_analysis.cpp988
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/scalar_analysis.h314
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/scalar_analysis_nodes.h347
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/scalar_analysis_simplification.cpp539
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/scalar_replacement_pass.cpp1009
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/scalar_replacement_pass.h277
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/set_spec_constant_default_value_pass.cpp393
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/set_spec_constant_default_value_pass.h114
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/simplification_pass.cpp169
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/simplification_pass.h58
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/spread_volatile_semantics.cpp298
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/spread_volatile_semantics.h116
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/ssa_rewrite_pass.cpp710
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/ssa_rewrite_pass.h306
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/strength_reduction_pass.cpp200
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/strength_reduction_pass.h65
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/strip_debug_info_pass.cpp110
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/strip_debug_info_pass.h35
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/strip_nonsemantic_info_pass.cpp115
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/strip_nonsemantic_info_pass.h44
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/struct_cfg_analysis.cpp250
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/struct_cfg_analysis.h160
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/tree_iterator.h246
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/type_manager.cpp1052
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/type_manager.h292
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/types.cpp712
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/types.h657
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/unify_const_pass.cpp177
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/unify_const_pass.h35
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/upgrade_memory_model.cpp768
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/upgrade_memory_model.h150
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/value_number_table.cpp240
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/value_number_table.h91
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/vector_dce.cpp433
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/vector_dce.h160
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/workaround1209.cpp69
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/workaround1209.h41
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/wrap_opkill.cpp199
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/opt/wrap_opkill.h80
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/parsed_operand.cpp76
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/parsed_operand.h33
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/pch_source.cpp15
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/pch_source.h15
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/print.cpp127
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/print.h75
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/change_operand_reduction_opportunity.cpp35
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/change_operand_reduction_opportunity.h54
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/change_operand_to_undef_reduction_opportunity.cpp42
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/change_operand_to_undef_reduction_opportunity.h53
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/conditional_branch_to_simple_conditional_branch_opportunity_finder.cpp87
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/conditional_branch_to_simple_conditional_branch_opportunity_finder.h37
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/conditional_branch_to_simple_conditional_branch_reduction_opportunity.cpp68
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/conditional_branch_to_simple_conditional_branch_reduction_opportunity.h54
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/merge_blocks_reduction_opportunity.cpp81
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/merge_blocks_reduction_opportunity.h53
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/merge_blocks_reduction_opportunity_finder.cpp46
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/merge_blocks_reduction_opportunity_finder.h42
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/operand_to_const_reduction_opportunity_finder.cpp81
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/operand_to_const_reduction_opportunity_finder.h44
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/operand_to_dominating_id_reduction_opportunity_finder.cpp114
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/operand_to_dominating_id_reduction_opportunity_finder.h56
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/operand_to_undef_reduction_opportunity_finder.cpp92
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/operand_to_undef_reduction_opportunity_finder.h43
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/pch_source_reduce.cpp15
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/pch_source_reduce.h23
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/reducer.cpp249
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/reducer.h122
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/reduction_opportunity.cpp27
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/reduction_opportunity.h47
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/reduction_opportunity_finder.cpp34
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/reduction_opportunity_finder.h58
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/reduction_pass.cpp86
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/reduction_pass.h86
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/reduction_util.cpp119
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/reduction_util.h51
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_block_reduction_opportunity.cpp51
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_block_reduction_opportunity.h48
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_block_reduction_opportunity_finder.cpp95
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_block_reduction_opportunity_finder.h55
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_function_reduction_opportunity.cpp41
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_function_reduction_opportunity.h49
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_function_reduction_opportunity_finder.cpp50
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_function_reduction_opportunity_finder.h42
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_instruction_reduction_opportunity.cpp41
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_instruction_reduction_opportunity.h44
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_selection_reduction_opportunity.cpp31
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_selection_reduction_opportunity.h47
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_selection_reduction_opportunity_finder.cpp146
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_selection_reduction_opportunity_finder.h49
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_struct_member_reduction_opportunity.cpp210
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_struct_member_reduction_opportunity.h84
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_unused_instruction_reduction_opportunity_finder.cpp176
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_unused_instruction_reduction_opportunity_finder.h61
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_unused_struct_member_reduction_opportunity_finder.cpp200
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/remove_unused_struct_member_reduction_opportunity_finder.h61
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/simple_conditional_branch_to_branch_opportunity_finder.cpp62
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/simple_conditional_branch_to_branch_opportunity_finder.h37
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/simple_conditional_branch_to_branch_reduction_opportunity.cpp59
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/simple_conditional_branch_to_branch_reduction_opportunity.h45
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/structured_construct_to_block_reduction_opportunity.cpp67
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/structured_construct_to_block_reduction_opportunity.h49
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/structured_construct_to_block_reduction_opportunity_finder.cpp185
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/structured_construct_to_block_reduction_opportunity_finder.h57
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity.cpp285
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity.h93
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity_finder.cpp102
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/reduce/structured_loop_to_selection_reduction_opportunity_finder.h57
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/software_version.cpp27
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_constant.h101
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_definition.h33
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_endian.cpp77
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_endian.h37
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_fuzzer_options.cpp68
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_fuzzer_options.h48
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_optimizer_options.cpp51
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_optimizer_options.h49
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_reducer_options.cpp51
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_reducer_options.h38
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_target_env.cpp424
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_target_env.h49
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_validator_options.cpp132
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/spirv_validator_options.h67
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/table.cpp68
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/table.h133
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/text.cpp850
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/text.h53
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/text_handler.cpp394
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/text_handler.h264
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/bit_vector.cpp82
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/bit_vector.h119
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/bitutils.h187
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/hash_combine.h53
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/hex_float.h1212
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/ilist.h366
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/ilist_node.h265
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/make_unique.h30
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/parse_number.cpp217
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/parse_number.h252
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/small_vector.h483
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/string_utils.cpp58
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/string_utils.h131
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/timer.cpp102
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/util/timer.h392
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/basic_block.cpp188
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/basic_block.h320
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/construct.cpp221
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/construct.h170
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/decoration.h98
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/function.cpp436
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/function.h400
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/instruction.cpp55
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/instruction.h155
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate.cpp466
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate.h251
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_adjacency.cpp131
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_annotation.cpp521
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_arithmetics.cpp550
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_atomics.cpp399
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_barriers.cpp137
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_bitwise.cpp232
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_builtins.cpp4389
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_capability.cpp361
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_cfg.cpp1169
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_composites.cpp615
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_constants.cpp466
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_conversion.cpp582
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_debug.cpp74
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_decorations.cpp1860
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_derivatives.cpp112
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_execution_limitations.cpp71
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_extensions.cpp3413
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_function.cpp356
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_id.cpp245
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_image.cpp2191
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_instruction.cpp516
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_interfaces.cpp563
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_layout.cpp387
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_literals.cpp99
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_logicals.cpp295
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_memory.cpp1753
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_memory_semantics.cpp261
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_memory_semantics.h29
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_mesh_shading.cpp123
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_misc.cpp201
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_mode_setting.cpp649
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_non_uniform.cpp145
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_primitives.cpp75
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_ray_query.cpp273
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_ray_tracing.cpp209
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_scopes.cpp315
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_scopes.h33
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_small_type_uses.cpp57
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validate_type.cpp642
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validation_state.cpp2160
-rw-r--r--3rdparty/bgfx/3rdparty/spirv-tools/source/val/validation_state.h949
-rw-r--r--3rdparty/bgfx/3rdparty/stb/LICENSE37
-rw-r--r--3rdparty/bgfx/3rdparty/stb/stb_rect_pack.h627
-rw-r--r--3rdparty/bgfx/3rdparty/stb/stb_textedit.h1469
-rw-r--r--3rdparty/bgfx/3rdparty/stb/stb_truetype.h5085
-rw-r--r--3rdparty/bgfx/3rdparty/webgpu/include/webgpu/EnumClassBitmasks.h144
-rw-r--r--3rdparty/bgfx/3rdparty/webgpu/include/webgpu/webgpu.h1362
-rw-r--r--3rdparty/bgfx/3rdparty/webgpu/include/webgpu/webgpu_cpp.h1418
-rw-r--r--3rdparty/bgfx/3rdparty/webgpu/webgpu_cpp.cpp2053
-rw-r--r--3rdparty/bgfx/CODEOWNERS10
-rw-r--r--3rdparty/bgfx/CONTRIBUTING.md28
-rw-r--r--3rdparty/bgfx/LICENSE22
-rw-r--r--3rdparty/bgfx/README.md561
-rw-r--r--3rdparty/bgfx/bindings/bf/bgfx.bf4700
-rw-r--r--3rdparty/bgfx/bindings/cs/bgfx.cs4647
-rw-r--r--3rdparty/bgfx/bindings/cs/bgfx_dllname.cs26
-rw-r--r--3rdparty/bgfx/bindings/d/funcs.d4569
-rw-r--r--3rdparty/bgfx/bindings/d/types.d1140
-rw-r--r--3rdparty/bgfx/bindings/zig/bgfx.zig3705
-rw-r--r--3rdparty/bgfx/docs/bgfx.rst605
-rw-r--r--3rdparty/bgfx/docs/build.rst215
-rw-r--r--3rdparty/bgfx/docs/examples.rst706
-rw-r--r--3rdparty/bgfx/docs/index.rst22
-rw-r--r--3rdparty/bgfx/docs/internals.rst50
-rw-r--r--3rdparty/bgfx/docs/license.rst132
-rw-r--r--3rdparty/bgfx/docs/overview.rst300
-rw-r--r--3rdparty/bgfx/docs/tools.rst243
-rw-r--r--3rdparty/bgfx/examples/00-helloworld/helloworld.cpp140
-rw-r--r--3rdparty/bgfx/examples/00-helloworld/logo.h253
-rw-r--r--3rdparty/bgfx/examples/00-helloworld/screenshot.pngbin0 -> 26485 bytes-rw-r--r--3rdparty/bgfx/examples/01-cubes/cubes.cpp373
-rw-r--r--3rdparty/bgfx/examples/01-cubes/fs_cubes.sc13
-rw-r--r--3rdparty/bgfx/examples/01-cubes/makefile10
-rw-r--r--3rdparty/bgfx/examples/01-cubes/screenshot.pngbin0 -> 142521 bytes-rw-r--r--3rdparty/bgfx/examples/01-cubes/varying.def.sc4
-rw-r--r--3rdparty/bgfx/examples/01-cubes/vs_cubes.sc15
-rw-r--r--3rdparty/bgfx/examples/02-metaballs/fs_metaballs.bin.h244
-rw-r--r--3rdparty/bgfx/examples/02-metaballs/fs_metaballs.sc16
-rw-r--r--3rdparty/bgfx/examples/02-metaballs/makefile9
-rw-r--r--3rdparty/bgfx/examples/02-metaballs/metaballs.cpp845
-rw-r--r--3rdparty/bgfx/examples/02-metaballs/screenshot.pngbin0 -> 54640 bytes-rw-r--r--3rdparty/bgfx/examples/02-metaballs/varying.def.sc6
-rw-r--r--3rdparty/bgfx/examples/02-metaballs/vs_metaballs.bin.h322
-rw-r--r--3rdparty/bgfx/examples/02-metaballs/vs_metaballs.sc16
-rw-r--r--3rdparty/bgfx/examples/03-raymarch/fs_raymarching.sc133
-rw-r--r--3rdparty/bgfx/examples/03-raymarch/iq_sdf.sh82
-rw-r--r--3rdparty/bgfx/examples/03-raymarch/makefile10
-rw-r--r--3rdparty/bgfx/examples/03-raymarch/raymarch.cpp275
-rw-r--r--3rdparty/bgfx/examples/03-raymarch/screenshot.pngbin0 -> 26722 bytes-rw-r--r--3rdparty/bgfx/examples/03-raymarch/varying.def.sc6
-rw-r--r--3rdparty/bgfx/examples/03-raymarch/vs_raymarching.sc16
-rw-r--r--3rdparty/bgfx/examples/04-mesh/fs_mesh.sc54
-rw-r--r--3rdparty/bgfx/examples/04-mesh/makefile10
-rw-r--r--3rdparty/bgfx/examples/04-mesh/mesh.cpp163
-rw-r--r--3rdparty/bgfx/examples/04-mesh/screenshot.pngbin0 -> 63226 bytes-rw-r--r--3rdparty/bgfx/examples/04-mesh/varying.def.sc10
-rw-r--r--3rdparty/bgfx/examples/04-mesh/vs_mesh.sc32
-rw-r--r--3rdparty/bgfx/examples/05-instancing/fs_instancing.sc13
-rw-r--r--3rdparty/bgfx/examples/05-instancing/instancing.cpp354
-rw-r--r--3rdparty/bgfx/examples/05-instancing/makefile10
-rw-r--r--3rdparty/bgfx/examples/05-instancing/screenshot.pngbin0 -> 124744 bytes-rw-r--r--3rdparty/bgfx/examples/05-instancing/varying.def.sc9
-rw-r--r--3rdparty/bgfx/examples/05-instancing/vs_instancing.sc18
-rw-r--r--3rdparty/bgfx/examples/06-bump/bump.cpp381
-rw-r--r--3rdparty/bgfx/examples/06-bump/fieldstone-n.tgabin0 -> 786450 bytes-rw-r--r--3rdparty/bgfx/examples/06-bump/fieldstone-rgba.tgabin0 -> 786476 bytes-rw-r--r--3rdparty/bgfx/examples/06-bump/fs_bump.sc76
-rw-r--r--3rdparty/bgfx/examples/06-bump/makefile10
-rw-r--r--3rdparty/bgfx/examples/06-bump/screenshot.pngbin0 -> 234470 bytes-rw-r--r--3rdparty/bgfx/examples/06-bump/varying.def.sc15
-rw-r--r--3rdparty/bgfx/examples/06-bump/vs_bump.sc35
-rw-r--r--3rdparty/bgfx/examples/06-bump/vs_bump_instanced.sc40
-rw-r--r--3rdparty/bgfx/examples/07-callback/callback.cpp510
-rw-r--r--3rdparty/bgfx/examples/07-callback/fs_callback.sc17
-rw-r--r--3rdparty/bgfx/examples/07-callback/makefile10
-rw-r--r--3rdparty/bgfx/examples/07-callback/varying.def.sc5
-rw-r--r--3rdparty/bgfx/examples/07-callback/vs_callback.sc16
-rw-r--r--3rdparty/bgfx/examples/08-update/cs_update.sc30
-rw-r--r--3rdparty/bgfx/examples/08-update/fs_update.sc15
-rw-r--r--3rdparty/bgfx/examples/08-update/fs_update_3d.sc17
-rw-r--r--3rdparty/bgfx/examples/08-update/fs_update_cmp.sc15
-rw-r--r--3rdparty/bgfx/examples/08-update/makefile10
-rw-r--r--3rdparty/bgfx/examples/08-update/update.cpp1016
-rw-r--r--3rdparty/bgfx/examples/08-update/varying.def.sc4
-rw-r--r--3rdparty/bgfx/examples/08-update/vs_update.sc15
-rw-r--r--3rdparty/bgfx/examples/09-hdr/common.sh53
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_blur.sc15
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_bright.sc39
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_lum.sc38
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_lumavg.sc33
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_mesh.sc55
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_skybox.sc18
-rw-r--r--3rdparty/bgfx/examples/09-hdr/fs_hdr_tonemap.sc42
-rw-r--r--3rdparty/bgfx/examples/09-hdr/hdr.cpp640
-rw-r--r--3rdparty/bgfx/examples/09-hdr/makefile10
-rw-r--r--3rdparty/bgfx/examples/09-hdr/screenshot.pngbin0 -> 316892 bytes-rw-r--r--3rdparty/bgfx/examples/09-hdr/varying.def.sc14
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_blur.sc27
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_bright.sc15
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_lum.sc15
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_lumavg.sc15
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_mesh.sc22
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_skybox.sc15
-rw-r--r--3rdparty/bgfx/examples/09-hdr/vs_hdr_tonemap.sc29
-rw-r--r--3rdparty/bgfx/examples/10-font/font.cpp345
-rw-r--r--3rdparty/bgfx/examples/10-font/screenshot.pngbin0 -> 99746 bytes-rw-r--r--3rdparty/bgfx/examples/11-fontsdf/fontsdf.cpp418
-rw-r--r--3rdparty/bgfx/examples/11-fontsdf/screenshot.pngbin0 -> 260611 bytes-rw-r--r--3rdparty/bgfx/examples/12-lod/fs_tree.sc42
-rw-r--r--3rdparty/bgfx/examples/12-lod/lod.cpp322
-rw-r--r--3rdparty/bgfx/examples/12-lod/makefile10
-rw-r--r--3rdparty/bgfx/examples/12-lod/screenshot.pngbin0 -> 52813 bytes-rw-r--r--3rdparty/bgfx/examples/12-lod/varying.def.sc8
-rw-r--r--3rdparty/bgfx/examples/12-lod/vs_tree.sc23
-rw-r--r--3rdparty/bgfx/examples/13-stencil/figure-rgba.tgabin0 -> 574054 bytes-rw-r--r--3rdparty/bgfx/examples/13-stencil/flare.tgabin0 -> 201851 bytes-rw-r--r--3rdparty/bgfx/examples/13-stencil/fs_stencil_color_black.sc11
-rw-r--r--3rdparty/bgfx/examples/13-stencil/fs_stencil_color_lighting.sc88
-rw-r--r--3rdparty/bgfx/examples/13-stencil/fs_stencil_color_texture.sc22
-rw-r--r--3rdparty/bgfx/examples/13-stencil/fs_stencil_texture.sc14
-rw-r--r--3rdparty/bgfx/examples/13-stencil/fs_stencil_texture_lighting.sc90
-rw-r--r--3rdparty/bgfx/examples/13-stencil/makefile10
-rw-r--r--3rdparty/bgfx/examples/13-stencil/screenshot.pngbin0 -> 191250 bytes-rw-r--r--3rdparty/bgfx/examples/13-stencil/stencil.cpp1418
-rw-r--r--3rdparty/bgfx/examples/13-stencil/varying.def.sc7
-rw-r--r--3rdparty/bgfx/examples/13-stencil/vs_stencil_color.sc13
-rw-r--r--3rdparty/bgfx/examples/13-stencil/vs_stencil_color_lighting.sc18
-rw-r--r--3rdparty/bgfx/examples/13-stencil/vs_stencil_color_texture.sc16
-rw-r--r--3rdparty/bgfx/examples/13-stencil/vs_stencil_texture.sc16
-rw-r--r--3rdparty/bgfx/examples/13-stencil/vs_stencil_texture_lighting.sc20
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/figure-rgba.tgabin0 -> 574054 bytes-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/flare.tgabin0 -> 201851 bytes-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_lighting.sc88
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_color_texture.sc22
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbackblank.sc11
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbackcolor.sc13
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbacktex1.sc26
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svbacktex2.sc26
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfrontblank.sc12
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfrontcolor.sc13
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfronttex1.sc26
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svfronttex2.sc24
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svside.sc24
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsideblank.sc13
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsidecolor.sc15
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_svsidetex.sc34
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture.sc14
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/fs_shadowvolume_texture_lighting.sc89
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/makefile10
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/screenshot.pngbin0 -> 253140 bytes-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/shadowvolumes.cpp2850
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/varying.def.sc10
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_lighting.sc18
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_color_texture.sc17
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svback.sc23
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svfront.sc13
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_svside.sc27
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture.sc16
-rw-r--r--3rdparty/bgfx/examples/14-shadowvolumes/vs_shadowvolume_texture_lighting.sc20
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_mesh.sc11
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_mesh_pd.sc11
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow.sc11
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow.sh100
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/fs_sms_shadow_pd.sc18
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/makefile10
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/screenshot.pngbin0 -> 28227 bytes-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/shadowmaps_simple.cpp526
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/varying.def.sc7
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_mesh.sc24
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_shadow.sc13
-rw-r--r--3rdparty/bgfx/examples/15-shadowmaps-simple/vs_sms_shadow_pd.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/common.sh235
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_black.sc11
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting.sh84
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_csm.sc17
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_linear.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_linear_csm.sc18
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_linear_omni.sc17
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_esm_omni.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_csm.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_linear.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_linear_csm.sc17
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_linear_omni.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_hard_omni.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_main.sh199
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_csm.sc17
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_linear.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_linear_csm.sc17
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_linear_omni.sc17
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_pcf_omni.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_csm.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_linear.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_linear_csm.sc17
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_linear_omni.sc17
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_lighting_vsm_omni.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_color_texture.sc22
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_hblur.sc20
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_hblur_vsm.sc20
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth.sc14
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_linear.sc13
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_packdepth_vsm_linear.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_texture.sc14
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_unpackdepth.sc19
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_unpackdepth_vsm.sc20
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_vblur.sc20
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/fs_shadowmaps_vblur_vsm.sc20
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/makefile10
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/screenshot.pngbin0 -> 61949 bytes-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/shadowmaps.cpp3115
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/varying.def.sc14
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color.sc13
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting.sc25
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_csm.sc36
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_linear.sc26
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_linear_csm.sc41
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_linear_omni.sc40
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_lighting_omni.sc35
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_color_texture.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_depth.sc13
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_hblur.sc32
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_packdepth.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_packdepth_linear.sc15
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_texture_lighting.sc20
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_unpackdepth.sc16
-rw-r--r--3rdparty/bgfx/examples/16-shadowmaps/vs_shadowmaps_vblur.sc32
-rw-r--r--3rdparty/bgfx/examples/17-drawstress/drawstress.cpp470
-rw-r--r--3rdparty/bgfx/examples/17-drawstress/fs_drawstress.bin.h113
-rw-r--r--3rdparty/bgfx/examples/17-drawstress/fs_drawstress.sc13
-rw-r--r--3rdparty/bgfx/examples/17-drawstress/makefile9
-rw-r--r--3rdparty/bgfx/examples/17-drawstress/varying.def.sc4
-rw-r--r--3rdparty/bgfx/examples/17-drawstress/vs_drawstress.bin.h224
-rw-r--r--3rdparty/bgfx/examples/17-drawstress/vs_drawstress.sc15
-rw-r--r--3rdparty/bgfx/examples/18-ibl/fs_ibl_mesh.sc105
-rw-r--r--3rdparty/bgfx/examples/18-ibl/fs_ibl_skybox.sc32
-rw-r--r--3rdparty/bgfx/examples/18-ibl/ibl.cpp843
-rw-r--r--3rdparty/bgfx/examples/18-ibl/makefile10
-rw-r--r--3rdparty/bgfx/examples/18-ibl/screenshot.pngbin0 -> 167265 bytes-rw-r--r--3rdparty/bgfx/examples/18-ibl/uniforms.sh28
-rw-r--r--3rdparty/bgfx/examples/18-ibl/varying.def.sc7
-rw-r--r--3rdparty/bgfx/examples/18-ibl/vs_ibl_mesh.sc20
-rw-r--r--3rdparty/bgfx/examples/18-ibl/vs_ibl_skybox.sc29
-rw-r--r--3rdparty/bgfx/examples/19-oit/fs_oit.sc15
-rw-r--r--3rdparty/bgfx/examples/19-oit/fs_oit_wb.sc22
-rw-r--r--3rdparty/bgfx/examples/19-oit/fs_oit_wb_blit.sc18
-rw-r--r--3rdparty/bgfx/examples/19-oit/fs_oit_wb_separate.sc21
-rw-r--r--3rdparty/bgfx/examples/19-oit/fs_oit_wb_separate_blit.sc19
-rw-r--r--3rdparty/bgfx/examples/19-oit/makefile10
-rw-r--r--3rdparty/bgfx/examples/19-oit/oit.cpp561
-rw-r--r--3rdparty/bgfx/examples/19-oit/screenshot.pngbin0 -> 59309 bytes-rw-r--r--3rdparty/bgfx/examples/19-oit/varying.def.sc5
-rw-r--r--3rdparty/bgfx/examples/19-oit/vs_oit.sc18
-rw-r--r--3rdparty/bgfx/examples/19-oit/vs_oit_blit.sc15
-rw-r--r--3rdparty/bgfx/examples/20-nanovg/blendish.h2399
-rw-r--r--3rdparty/bgfx/examples/20-nanovg/nanovg.cpp1516
-rw-r--r--3rdparty/bgfx/examples/20-nanovg/screenshot.pngbin0 -> 107905 bytes-rw-r--r--3rdparty/bgfx/examples/21-deferred/common.sh46
-rw-r--r--3rdparty/bgfx/examples/21-deferred/deferred.cpp977
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_clear_uav.sc16
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_combine.sc18
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_combine_ta.sc18
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_debug.sc15
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_debug_line.sc13
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_debug_ta.sc17
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_geom.sc31
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_light.sc35
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_light_ta.sc35
-rw-r--r--3rdparty/bgfx/examples/21-deferred/fs_deferred_light_uav.sc40
-rw-r--r--3rdparty/bgfx/examples/21-deferred/makefile10
-rw-r--r--3rdparty/bgfx/examples/21-deferred/screenshot.pngbin0 -> 304372 bytes-rw-r--r--3rdparty/bgfx/examples/21-deferred/varying.def.sc13
-rw-r--r--3rdparty/bgfx/examples/21-deferred/vs_deferred_combine.sc15
-rw-r--r--3rdparty/bgfx/examples/21-deferred/vs_deferred_debug.sc15
-rw-r--r--3rdparty/bgfx/examples/21-deferred/vs_deferred_debug_line.sc15
-rw-r--r--3rdparty/bgfx/examples/21-deferred/vs_deferred_geom.sc37
-rw-r--r--3rdparty/bgfx/examples/21-deferred/vs_deferred_light.sc15
-rw-r--r--3rdparty/bgfx/examples/22-windows/windows.cpp414
-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/fs_vectordisplay_blit.sc20
-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/fs_vectordisplay_blur.sc31
-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/fs_vectordisplay_fb.sc15
-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/main.cpp228
-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/makefile10
-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/screenshot.pngbin0 -> 129249 bytes-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/varying.def.sc6
-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.cpp1708
-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/vectordisplay.h198
-rw-r--r--3rdparty/bgfx/examples/23-vectordisplay/vs_vectordisplay_fb.sc10
-rw-r--r--3rdparty/bgfx/examples/24-nbody/cs_indirect.sc16
-rw-r--r--3rdparty/bgfx/examples/24-nbody/cs_init_instances.sc105
-rw-r--r--3rdparty/bgfx/examples/24-nbody/cs_update_instances.sc57
-rw-r--r--3rdparty/bgfx/examples/24-nbody/fs_particle.sc16
-rw-r--r--3rdparty/bgfx/examples/24-nbody/makefile10
-rw-r--r--3rdparty/bgfx/examples/24-nbody/nbody.cpp469
-rw-r--r--3rdparty/bgfx/examples/24-nbody/screenshot.pngbin0 -> 57618 bytes-rw-r--r--3rdparty/bgfx/examples/24-nbody/uniforms.sh22
-rw-r--r--3rdparty/bgfx/examples/24-nbody/varying.def.sc4
-rw-r--r--3rdparty/bgfx/examples/24-nbody/vs_particle.sc23
-rw-r--r--3rdparty/bgfx/examples/25-c99/helloworld.c87
-rw-r--r--3rdparty/bgfx/examples/26-occlusion/occlusion.cpp323
-rw-r--r--3rdparty/bgfx/examples/26-occlusion/screenshot.pngbin0 -> 38183 bytes-rw-r--r--3rdparty/bgfx/examples/27-terrain/fs_terrain.sc13
-rw-r--r--3rdparty/bgfx/examples/27-terrain/makefile10
-rw-r--r--3rdparty/bgfx/examples/27-terrain/screenshot.pngbin0 -> 121187 bytes-rw-r--r--3rdparty/bgfx/examples/27-terrain/terrain.cpp532
-rw-r--r--3rdparty/bgfx/examples/27-terrain/varying.def.sc13
-rw-r--r--3rdparty/bgfx/examples/27-terrain/vs_terrain.sc17
-rw-r--r--3rdparty/bgfx/examples/27-terrain/vs_terrain_height_texture.sc20
-rw-r--r--3rdparty/bgfx/examples/28-wireframe/fs_wf_mesh.sc78
-rw-r--r--3rdparty/bgfx/examples/28-wireframe/fs_wf_wireframe.sc26
-rw-r--r--3rdparty/bgfx/examples/28-wireframe/makefile10
-rw-r--r--3rdparty/bgfx/examples/28-wireframe/screenshot.pngbin0 -> 127897 bytes-rw-r--r--3rdparty/bgfx/examples/28-wireframe/uniforms.sh12
-rw-r--r--3rdparty/bgfx/examples/28-wireframe/varying.def.sc7
-rw-r--r--3rdparty/bgfx/examples/28-wireframe/vs_wf_mesh.sc21
-rw-r--r--3rdparty/bgfx/examples/28-wireframe/vs_wf_wireframe.sc19
-rw-r--r--3rdparty/bgfx/examples/28-wireframe/wireframe.cpp532
-rw-r--r--3rdparty/bgfx/examples/29-debugdraw/debugdraw.cpp1235
-rw-r--r--3rdparty/bgfx/examples/29-debugdraw/screenshot.pngbin0 -> 75915 bytes-rw-r--r--3rdparty/bgfx/examples/30-picking/fs_picking_id.sc16
-rw-r--r--3rdparty/bgfx/examples/30-picking/fs_picking_shaded.sc44
-rw-r--r--3rdparty/bgfx/examples/30-picking/makefile10
-rw-r--r--3rdparty/bgfx/examples/30-picking/picking.cpp453
-rw-r--r--3rdparty/bgfx/examples/30-picking/screenshot.pngbin0 -> 72262 bytes-rw-r--r--3rdparty/bgfx/examples/30-picking/varying.def.sc10
-rw-r--r--3rdparty/bgfx/examples/30-picking/vs_picking_shaded.sc25
-rw-r--r--3rdparty/bgfx/examples/31-rsm/fs_rsm_combine.sc118
-rw-r--r--3rdparty/bgfx/examples/31-rsm/fs_rsm_gbuffer.sc22
-rw-r--r--3rdparty/bgfx/examples/31-rsm/fs_rsm_lbuffer.sc52
-rw-r--r--3rdparty/bgfx/examples/31-rsm/fs_rsm_shadow.sc22
-rw-r--r--3rdparty/bgfx/examples/31-rsm/makefile10
-rw-r--r--3rdparty/bgfx/examples/31-rsm/reflectiveshadowmap.cpp768
-rw-r--r--3rdparty/bgfx/examples/31-rsm/screenshot.pngbin0 -> 207402 bytes-rw-r--r--3rdparty/bgfx/examples/31-rsm/varying.def.sc10
-rw-r--r--3rdparty/bgfx/examples/31-rsm/vs_rsm_combine.sc15
-rw-r--r--3rdparty/bgfx/examples/31-rsm/vs_rsm_gbuffer.sc27
-rw-r--r--3rdparty/bgfx/examples/31-rsm/vs_rsm_lbuffer.sc45
-rw-r--r--3rdparty/bgfx/examples/31-rsm/vs_rsm_shadow.sc24
-rw-r--r--3rdparty/bgfx/examples/32-particles/particles.cpp463
-rw-r--r--3rdparty/bgfx/examples/32-particles/screenshot.pngbin0 -> 142060 bytes-rw-r--r--3rdparty/bgfx/examples/33-pom/fs_pom.sc97
-rw-r--r--3rdparty/bgfx/examples/33-pom/makefile10
-rw-r--r--3rdparty/bgfx/examples/33-pom/pom.cpp396
-rw-r--r--3rdparty/bgfx/examples/33-pom/screenshot.pngbin0 -> 103862 bytes-rw-r--r--3rdparty/bgfx/examples/33-pom/varying.def.sc13
-rw-r--r--3rdparty/bgfx/examples/33-pom/vs_pom.sc29
-rw-r--r--3rdparty/bgfx/examples/34-mvs/mvs.cpp292
-rw-r--r--3rdparty/bgfx/examples/34-mvs/screenshot.pngbin0 -> 159938 bytes-rw-r--r--3rdparty/bgfx/examples/35-dynamic/dynamic.cpp293
-rw-r--r--3rdparty/bgfx/examples/35-dynamic/screenshot.pngbin0 -> 74844 bytes-rw-r--r--3rdparty/bgfx/examples/36-sky/fs_sky.sc26
-rw-r--r--3rdparty/bgfx/examples/36-sky/fs_sky_color_banding_fix.sc46
-rw-r--r--3rdparty/bgfx/examples/36-sky/fs_sky_landscape.sc58
-rw-r--r--3rdparty/bgfx/examples/36-sky/makefile10
-rw-r--r--3rdparty/bgfx/examples/36-sky/screenshot.pngbin0 -> 213889 bytes-rw-r--r--3rdparty/bgfx/examples/36-sky/sky.cpp670
-rw-r--r--3rdparty/bgfx/examples/36-sky/varying.def.sc9
-rw-r--r--3rdparty/bgfx/examples/36-sky/vs_sky.sc70
-rw-r--r--3rdparty/bgfx/examples/36-sky/vs_sky_landscape.sc19
-rw-r--r--3rdparty/bgfx/examples/37-gpudrivenrendering/cs_gdr_copy_z.sc26
-rw-r--r--3rdparty/bgfx/examples/37-gpudrivenrendering/cs_gdr_downscale_hi_z.sc39
-rw-r--r--3rdparty/bgfx/examples/37-gpudrivenrendering/cs_gdr_occlude_props.sc115
-rw-r--r--3rdparty/bgfx/examples/37-gpudrivenrendering/cs_gdr_stream_compaction.sc129
-rw-r--r--3rdparty/bgfx/examples/37-gpudrivenrendering/fs_gdr_instanced_indirect_rendering.sc26
-rw-r--r--3rdparty/bgfx/examples/37-gpudrivenrendering/gpudrivenrendering.cpp1154
-rw-r--r--3rdparty/bgfx/examples/37-gpudrivenrendering/makefile10
-rw-r--r--3rdparty/bgfx/examples/37-gpudrivenrendering/screenshot.pngbin0 -> 27162 bytes-rw-r--r--3rdparty/bgfx/examples/37-gpudrivenrendering/varying.def.sc9
-rw-r--r--3rdparty/bgfx/examples/37-gpudrivenrendering/vs_gdr_instanced_indirect_rendering.sc23
-rw-r--r--3rdparty/bgfx/examples/37-gpudrivenrendering/vs_gdr_render_occlusion.sc20
-rw-r--r--3rdparty/bgfx/examples/38-bloom/bloom.cpp662
-rw-r--r--3rdparty/bgfx/examples/38-bloom/fs_albedo_output.sc20
-rw-r--r--3rdparty/bgfx/examples/38-bloom/fs_bloom_combine.sc24
-rw-r--r--3rdparty/bgfx/examples/38-bloom/fs_downsample.sc42
-rw-r--r--3rdparty/bgfx/examples/38-bloom/fs_upsample.sc35
-rw-r--r--3rdparty/bgfx/examples/38-bloom/makefile10
-rw-r--r--3rdparty/bgfx/examples/38-bloom/screenshot.pngbin0 -> 34679 bytes-rw-r--r--3rdparty/bgfx/examples/38-bloom/varying.def.sc13
-rw-r--r--3rdparty/bgfx/examples/38-bloom/vs_albedo_output.sc17
-rw-r--r--3rdparty/bgfx/examples/38-bloom/vs_deferred_combine.sc15
-rw-r--r--3rdparty/bgfx/examples/38-bloom/vs_fullscreen.sc15
-rw-r--r--3rdparty/bgfx/examples/39-assao/assao.cpp1212
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_apply.sc103
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_generate_importance_map.sc50
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_generate_q.sh520
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_generate_q0.sc9
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_generate_q1.sc9
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_generate_q2.sc9
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_generate_q3.sc9
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_generate_q3base.sc9
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_load_counter_clear.sc15
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_non_smart_apply.sc29
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_non_smart_blur.sc37
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_non_smart_half_apply.sc26
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_postprocess_importance_map_a.sc47
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_postprocess_importance_map_b.sc55
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_prepare_depth_mip.sc103
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_prepare_depths.sc58
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_prepare_depths_and_normals.sc192
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_prepare_depths_and_normals_half.sc188
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_prepare_depths_half.sc48
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_smart_blur.sc82
-rw-r--r--3rdparty/bgfx/examples/39-assao/cs_assao_smart_blur_wide.sc83
-rw-r--r--3rdparty/bgfx/examples/39-assao/fs_assao_deferred_combine.sc43
-rw-r--r--3rdparty/bgfx/examples/39-assao/fs_assao_gbuffer.sc22
-rw-r--r--3rdparty/bgfx/examples/39-assao/makefile10
-rw-r--r--3rdparty/bgfx/examples/39-assao/screenshot.pngbin0 -> 290687 bytes-rw-r--r--3rdparty/bgfx/examples/39-assao/uniforms.sh42
-rw-r--r--3rdparty/bgfx/examples/39-assao/varying.def.sc7
-rw-r--r--3rdparty/bgfx/examples/39-assao/vs_assao.sc16
-rw-r--r--3rdparty/bgfx/examples/39-assao/vs_assao_gbuffer.sc27
-rw-r--r--3rdparty/bgfx/examples/40-svt/fs_vt_mip.sc24
-rw-r--r--3rdparty/bgfx/examples/40-svt/fs_vt_unlit.sc21
-rw-r--r--3rdparty/bgfx/examples/40-svt/makefile10
-rw-r--r--3rdparty/bgfx/examples/40-svt/screenshot.pngbin0 -> 343847 bytes-rw-r--r--3rdparty/bgfx/examples/40-svt/svt.cpp381
-rw-r--r--3rdparty/bgfx/examples/40-svt/varying.def.sc4
-rw-r--r--3rdparty/bgfx/examples/40-svt/virtualtexture.sh86
-rw-r--r--3rdparty/bgfx/examples/40-svt/vs_vt_generic.sc16
-rw-r--r--3rdparty/bgfx/examples/40-svt/vt.cpp1333
-rw-r--r--3rdparty/bgfx/examples/40-svt/vt.h443
-rw-r--r--3rdparty/bgfx/examples/41-tess/cs_terrain_init.sc43
-rw-r--r--3rdparty/bgfx/examples/41-tess/cs_terrain_lod.sc81
-rw-r--r--3rdparty/bgfx/examples/41-tess/cs_terrain_update_draw.sc19
-rw-r--r--3rdparty/bgfx/examples/41-tess/cs_terrain_update_indirect.sc23
-rw-r--r--3rdparty/bgfx/examples/41-tess/fcull.sh66
-rw-r--r--3rdparty/bgfx/examples/41-tess/fs_terrain_render.sc12
-rw-r--r--3rdparty/bgfx/examples/41-tess/fs_terrain_render_normal.sc10
-rw-r--r--3rdparty/bgfx/examples/41-tess/isubd.sh127
-rw-r--r--3rdparty/bgfx/examples/41-tess/makefile10
-rw-r--r--3rdparty/bgfx/examples/41-tess/matrices.sh68
-rw-r--r--3rdparty/bgfx/examples/41-tess/screenshot.pngbin0 -> 212185 bytes-rw-r--r--3rdparty/bgfx/examples/41-tess/terrain_common.sh99
-rw-r--r--3rdparty/bgfx/examples/41-tess/tess.cpp931
-rw-r--r--3rdparty/bgfx/examples/41-tess/uniforms.sh15
-rw-r--r--3rdparty/bgfx/examples/41-tess/varying.def.sc13
-rw-r--r--3rdparty/bgfx/examples/41-tess/vs_terrain_render.sc39
-rw-r--r--3rdparty/bgfx/examples/42-bunnylod/bunnylod.cpp506
-rw-r--r--3rdparty/bgfx/examples/42-bunnylod/fs_bunnylod.sc17
-rw-r--r--3rdparty/bgfx/examples/42-bunnylod/makefile10
-rw-r--r--3rdparty/bgfx/examples/42-bunnylod/progmesh.c555
-rw-r--r--3rdparty/bgfx/examples/42-bunnylod/screenshot.pngbin0 -> 53223 bytes-rw-r--r--3rdparty/bgfx/examples/42-bunnylod/varying.def.sc5
-rw-r--r--3rdparty/bgfx/examples/42-bunnylod/vs_bunnylod.sc16
-rw-r--r--3rdparty/bgfx/examples/43-denoise/denoise.cpp1128
-rw-r--r--3rdparty/bgfx/examples/43-denoise/fs_denoise_apply_lighting.sc25
-rw-r--r--3rdparty/bgfx/examples/43-denoise/fs_denoise_copy.sc18
-rw-r--r--3rdparty/bgfx/examples/43-denoise/fs_denoise_deferred_combine.sc61
-rw-r--r--3rdparty/bgfx/examples/43-denoise/fs_denoise_gbuffer.sc69
-rw-r--r--3rdparty/bgfx/examples/43-denoise/fs_denoise_spatial_3x3.sc12
-rw-r--r--3rdparty/bgfx/examples/43-denoise/fs_denoise_spatial_5x5.sc12
-rw-r--r--3rdparty/bgfx/examples/43-denoise/fs_denoise_spatial_implementation.sh97
-rw-r--r--3rdparty/bgfx/examples/43-denoise/fs_denoise_temporal.sc96
-rw-r--r--3rdparty/bgfx/examples/43-denoise/fs_denoise_txaa.sc208
-rw-r--r--3rdparty/bgfx/examples/43-denoise/makefile10
-rw-r--r--3rdparty/bgfx/examples/43-denoise/normal_encoding.sh92
-rw-r--r--3rdparty/bgfx/examples/43-denoise/parameters.sh32
-rw-r--r--3rdparty/bgfx/examples/43-denoise/screenshot.pngbin0 -> 273077 bytes-rw-r--r--3rdparty/bgfx/examples/43-denoise/shared_functions.sh25
-rw-r--r--3rdparty/bgfx/examples/43-denoise/varying.def.sc9
-rw-r--r--3rdparty/bgfx/examples/43-denoise/vs_denoise_gbuffer.sc54
-rw-r--r--3rdparty/bgfx/examples/43-denoise/vs_denoise_screenquad.sc10
-rw-r--r--3rdparty/bgfx/examples/44-sss/fs_screen_space_shadows.sc111
-rw-r--r--3rdparty/bgfx/examples/44-sss/fs_sss_deferred_combine.sc83
-rw-r--r--3rdparty/bgfx/examples/44-sss/fs_sss_gbuffer.sc62
-rw-r--r--3rdparty/bgfx/examples/44-sss/fs_sss_linear_depth.sc35
-rw-r--r--3rdparty/bgfx/examples/44-sss/fs_sss_unlit.sc21
-rw-r--r--3rdparty/bgfx/examples/44-sss/makefile10
-rw-r--r--3rdparty/bgfx/examples/44-sss/normal_encoding.sh92
-rw-r--r--3rdparty/bgfx/examples/44-sss/parameters.sh33
-rw-r--r--3rdparty/bgfx/examples/44-sss/screen_space_shadows.cpp849
-rw-r--r--3rdparty/bgfx/examples/44-sss/screenshot.pngbin0 -> 279420 bytes-rw-r--r--3rdparty/bgfx/examples/44-sss/varying.def.sc7
-rw-r--r--3rdparty/bgfx/examples/44-sss/vs_sss_gbuffer.sc30
-rw-r--r--3rdparty/bgfx/examples/44-sss/vs_sss_screenquad.sc10
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/bokeh.cpp1052
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/bokeh_dof.sh176
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/fs_bokeh_copy.sc18
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/fs_bokeh_copy_linear_to_gamma.sc22
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/fs_bokeh_dof_combine.sc29
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/fs_bokeh_dof_debug.sc44
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/fs_bokeh_dof_downsample.sc24
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/fs_bokeh_dof_second_pass.sc25
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/fs_bokeh_dof_single_pass.sc25
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/fs_bokeh_forward.sc80
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/fs_bokeh_forward_grid.sc58
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/fs_bokeh_linear_depth.sc35
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/makefile10
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/parameters.sh28
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/screenshot.pngbin0 -> 261456 bytes-rw-r--r--3rdparty/bgfx/examples/45-bokeh/varying.def.sc9
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/vs_bokeh_forward.sc34
-rw-r--r--3rdparty/bgfx/examples/45-bokeh/vs_bokeh_screenquad.sc10
-rw-r--r--3rdparty/bgfx/examples/46-fsr/app.cpp858
-rw-r--r--3rdparty/bgfx/examples/46-fsr/cs_fsr.h127
-rw-r--r--3rdparty/bgfx/examples/46-fsr/cs_fsr_bilinear_16.sc3
-rw-r--r--3rdparty/bgfx/examples/46-fsr/cs_fsr_bilinear_32.sc4
-rw-r--r--3rdparty/bgfx/examples/46-fsr/cs_fsr_easu_16.sc3
-rw-r--r--3rdparty/bgfx/examples/46-fsr/cs_fsr_easu_32.sc4
-rw-r--r--3rdparty/bgfx/examples/46-fsr/cs_fsr_rcas_16.sc3
-rw-r--r--3rdparty/bgfx/examples/46-fsr/cs_fsr_rcas_32.sc4
-rw-r--r--3rdparty/bgfx/examples/46-fsr/ffx_a.h2637
-rw-r--r--3rdparty/bgfx/examples/46-fsr/ffx_fsr1.h1199
-rw-r--r--3rdparty/bgfx/examples/46-fsr/fs_fsr_copy_linear_to_gamma.sc21
-rw-r--r--3rdparty/bgfx/examples/46-fsr/fs_fsr_forward.sc79
-rw-r--r--3rdparty/bgfx/examples/46-fsr/fs_fsr_forward_grid.sc58
-rw-r--r--3rdparty/bgfx/examples/46-fsr/fsr.cpp346
-rw-r--r--3rdparty/bgfx/examples/46-fsr/fsr.h46
-rw-r--r--3rdparty/bgfx/examples/46-fsr/makefile10
-rw-r--r--3rdparty/bgfx/examples/46-fsr/screenshot.pngbin0 -> 194145 bytes-rw-r--r--3rdparty/bgfx/examples/46-fsr/varying.def.sc9
-rw-r--r--3rdparty/bgfx/examples/46-fsr/vs_fsr_forward.sc34
-rw-r--r--3rdparty/bgfx/examples/46-fsr/vs_fsr_screenquad.sc10
-rw-r--r--3rdparty/bgfx/examples/47-pixelformats/makefile10
-rw-r--r--3rdparty/bgfx/examples/47-pixelformats/pixelformats.cpp828
-rw-r--r--3rdparty/bgfx/examples/47-pixelformats/screenshot.pngbin0 -> 154208 bytes-rw-r--r--3rdparty/bgfx/examples/48-drawindirect/cs_drawindirect.sc93
-rw-r--r--3rdparty/bgfx/examples/48-drawindirect/cs_drawindirect_count.sc2
-rw-r--r--3rdparty/bgfx/examples/48-drawindirect/drawindirect.cpp469
-rw-r--r--3rdparty/bgfx/examples/48-drawindirect/makefile10
-rw-r--r--3rdparty/bgfx/examples/48-drawindirect/screenshot.pngbin0 -> 211827 bytes-rw-r--r--3rdparty/bgfx/examples/49-hextile/fs_hextile.binbin0 -> 8741 bytes-rw-r--r--3rdparty/bgfx/examples/49-hextile/fs_hextile.sc226
-rw-r--r--3rdparty/bgfx/examples/49-hextile/hextile.cpp328
-rw-r--r--3rdparty/bgfx/examples/49-hextile/makefile10
-rw-r--r--3rdparty/bgfx/examples/49-hextile/screenshot.pngbin0 -> 2552337 bytes-rw-r--r--3rdparty/bgfx/examples/49-hextile/varying.def.sc13
-rw-r--r--3rdparty/bgfx/examples/49-hextile/vs_hextile.sc18
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/bunny.obj140236
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/bunny_decimated.obj27314
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/bunny_patched.obj139332
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/column.obj5857
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/cube.obj29
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/hollowcube.obj934
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/meshes.ninja18
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/orb.obj161081
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/platform.obj56
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/tree.obj14156
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/tree1b_lod0_1.obj7658
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/tree1b_lod0_2.obj7588
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/tree1b_lod1_1.obj5312
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/tree1b_lod1_2.obj5294
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/tree1b_lod2_1.obj2630
-rw-r--r--3rdparty/bgfx/examples/assets/meshes/tree1b_lod2_2.obj2612
-rw-r--r--3rdparty/bgfx/examples/assets/sky/lightmap.pngbin0 -> 507609 bytes-rw-r--r--3rdparty/bgfx/examples/assets/sky/test_scene.blendbin0 -> 889820 bytes-rw-r--r--3rdparty/bgfx/examples/assets/sky/test_scene.obj8878
-rw-r--r--3rdparty/bgfx/examples/assets/textures/aerial_rocks_04_diff_2k.jpgbin0 -> 3001368 bytes-rw-r--r--3rdparty/bgfx/examples/assets/textures/normalmap.pngbin0 -> 230773 bytes-rw-r--r--3rdparty/bgfx/examples/assets/textures/parallax-d.pngbin0 -> 105656 bytes-rw-r--r--3rdparty/bgfx/examples/assets/textures/parallax-h.pngbin0 -> 21523 bytes-rw-r--r--3rdparty/bgfx/examples/assets/textures/parallax-n.pngbin0 -> 34253 bytes-rw-r--r--3rdparty/bgfx/examples/assets/textures/texture-alpha-test.pngbin0 -> 1046 bytes-rw-r--r--3rdparty/bgfx/examples/assets/textures/texture-compression-test.pngbin0 -> 14941 bytes-rw-r--r--3rdparty/bgfx/examples/assets/textures/texture-cubemap-test.pngbin0 -> 5050 bytes-rw-r--r--3rdparty/bgfx/examples/assets/textures/texture-uv-filtering-test.pngbin0 -> 2686 bytes-rw-r--r--3rdparty/bgfx/examples/assets/textures/textures.ninja34
-rw-r--r--3rdparty/bgfx/examples/assets/textures/uffizi-large.exrbin0 -> 8085615 bytes-rw-r--r--3rdparty/bgfx/examples/common/aviwriter.h235
-rw-r--r--3rdparty/bgfx/examples/common/bgfx_utils.cpp806
-rw-r--r--3rdparty/bgfx/examples/common/bgfx_utils.h164
-rw-r--r--3rdparty/bgfx/examples/common/camera.cpp333
-rw-r--r--3rdparty/bgfx/examples/common/camera.h48
-rw-r--r--3rdparty/bgfx/examples/common/common.h14
-rw-r--r--3rdparty/bgfx/examples/common/common.sh7
-rw-r--r--3rdparty/bgfx/examples/common/cube_atlas.cpp513
-rw-r--r--3rdparty/bgfx/examples/common/cube_atlas.h154
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/debugdraw.cpp2564
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/debugdraw.h215
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/fs_debugdraw_fill.bin.h135
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/fs_debugdraw_fill.sc19
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/fs_debugdraw_fill_lit.bin.h300
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/fs_debugdraw_fill_lit.sc35
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/fs_debugdraw_fill_texture.bin.h192
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/fs_debugdraw_fill_texture.sc15
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/fs_debugdraw_lines.bin.h113
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/fs_debugdraw_lines.sc13
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/fs_debugdraw_lines_stipple.bin.h178
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/fs_debugdraw_lines_stipple.sc18
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/makefile9
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/varying.def.sc10
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_fill.bin.h258
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_fill.sc14
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_fill_lit.bin.h351
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_fill_lit.sc17
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_fill_lit_mesh.bin.h322
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_fill_lit_mesh.sc17
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_fill_mesh.bin.h227
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_fill_mesh.sc14
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_fill_texture.bin.h268
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_fill_texture.sc16
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_lines.bin.h224
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_lines.sc15
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_lines_stipple.bin.h269
-rw-r--r--3rdparty/bgfx/examples/common/debugdraw/vs_debugdraw_lines_stipple.sc16
-rw-r--r--3rdparty/bgfx/examples/common/entry/cmd.cpp135
-rw-r--r--3rdparty/bgfx/examples/common/entry/cmd.h27
-rw-r--r--3rdparty/bgfx/examples/common/entry/dbg.h16
-rw-r--r--3rdparty/bgfx/examples/common/entry/dialog.cpp243
-rw-r--r--3rdparty/bgfx/examples/common/entry/dialog.h33
-rw-r--r--3rdparty/bgfx/examples/common/entry/dialog_darwin.mm152
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry.cpp1047
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry.h375
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_android.cpp580
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_glfw.cpp890
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_html5.cpp444
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_ios.mm396
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_noop.cpp94
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_osx.mm843
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_p.h326
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_sdl.cpp1165
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_windows.cpp1198
-rw-r--r--3rdparty/bgfx/examples/common/entry/entry_x11.cpp788
-rw-r--r--3rdparty/bgfx/examples/common/entry/input.cpp397
-rw-r--r--3rdparty/bgfx/examples/common/entry/input.h99
-rw-r--r--3rdparty/bgfx/examples/common/example-glue.cpp485
-rw-r--r--3rdparty/bgfx/examples/common/font/font_manager.cpp561
-rw-r--r--3rdparty/bgfx/examples/common/font/font_manager.h222
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_basic.bin.h333
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_basic.sc15
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field.bin.h522
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field.sc27
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_drop_shadow.bin.h878
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_drop_shadow.sc49
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_drop_shadow_image.bin.h977
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_drop_shadow_image.sc56
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_outline.bin.h656
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_outline.sc32
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_outline_drop_shadow_image.bin.h1149
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_outline_drop_shadow_image.sc65
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_outline_image.bin.h773
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_outline_image.sc41
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_subpixel.bin.h508
-rw-r--r--3rdparty/bgfx/examples/common/font/fs_font_distance_field_subpixel.sc28
-rw-r--r--3rdparty/bgfx/examples/common/font/makefile9
-rw-r--r--3rdparty/bgfx/examples/common/font/text_buffer_manager.cpp1310
-rw-r--r--3rdparty/bgfx/examples/common/font/text_buffer_manager.h111
-rw-r--r--3rdparty/bgfx/examples/common/font/text_metrics.cpp143
-rw-r--r--3rdparty/bgfx/examples/common/font/text_metrics.h59
-rw-r--r--3rdparty/bgfx/examples/common/font/utf8.cpp57
-rw-r--r--3rdparty/bgfx/examples/common/font/utf8.h14
-rw-r--r--3rdparty/bgfx/examples/common/font/varying.def.sc14
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_basic.bin.h262
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_basic.sc11
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field.bin.h262
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field.sc11
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_drop_shadow.bin.h377
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_drop_shadow.sc14
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_drop_shadow_image.bin.h377
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_drop_shadow_image.sc14
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_outline.bin.h338
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_outline.sc13
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_outline_drop_shadow_image.bin.h377
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_outline_drop_shadow_image.sc14
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_outline_image.bin.h338
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_outline_image.sc13
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_subpixel.bin.h262
-rw-r--r--3rdparty/bgfx/examples/common/font/vs_font_distance_field_subpixel.sc11
-rw-r--r--3rdparty/bgfx/examples/common/imgui/droidsans.ttf.h11881
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_image.bin.h261
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_imgui_image.sc21
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_ocornut_imgui.bin.h186
-rw-r--r--3rdparty/bgfx/examples/common/imgui/fs_ocornut_imgui.sc11
-rw-r--r--3rdparty/bgfx/examples/common/imgui/icons_font_awesome.ttf.h10350
-rw-r--r--3rdparty/bgfx/examples/common/imgui/icons_kenney.ttf.h2890
-rw-r--r--3rdparty/bgfx/examples/common/imgui/imgui.cpp597
-rw-r--r--3rdparty/bgfx/examples/common/imgui/imgui.h131
-rw-r--r--3rdparty/bgfx/examples/common/imgui/makefile30
-rw-r--r--3rdparty/bgfx/examples/common/imgui/roboto_regular.ttf.h9088
-rw-r--r--3rdparty/bgfx/examples/common/imgui/robotomono_regular.ttf.h7097
-rw-r--r--3rdparty/bgfx/examples/common/imgui/varying.def.sc6
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_imgui_image.bin.h221
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_imgui_image.sc15
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_ocornut_imgui.bin.h278
-rw-r--r--3rdparty/bgfx/examples/common/imgui/vs_ocornut_imgui.sc13
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/fontstash.h1775
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/fs_nanovg_fill.bin.h1228
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/fs_nanovg_fill.sc94
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/makefile9
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/nanovg.cpp2887
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/nanovg.h679
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.cpp1355
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/nanovg_bgfx.h79
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/varying.def.sc5
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/vs_nanovg_fill.bin.h304
-rw-r--r--3rdparty/bgfx/examples/common/nanovg/vs_nanovg_fill.sc23
-rw-r--r--3rdparty/bgfx/examples/common/packrect.h177
-rw-r--r--3rdparty/bgfx/examples/common/ps/fs_particle.bin.h263
-rw-r--r--3rdparty/bgfx/examples/common/ps/fs_particle.sc19
-rw-r--r--3rdparty/bgfx/examples/common/ps/makefile9
-rw-r--r--3rdparty/bgfx/examples/common/ps/particle_system.cpp751
-rw-r--r--3rdparty/bgfx/examples/common/ps/particle_system.h105
-rw-r--r--3rdparty/bgfx/examples/common/ps/varying.def.sc6
-rw-r--r--3rdparty/bgfx/examples/common/ps/vs_particle.bin.h265
-rw-r--r--3rdparty/bgfx/examples/common/ps/vs_particle.sc16
-rw-r--r--3rdparty/bgfx/examples/common/shaderlib.sh431
-rw-r--r--3rdparty/bgfx/examples/makefile115
-rw-r--r--3rdparty/bgfx/examples/runtime/.gitignore4
-rw-r--r--3rdparty/bgfx/examples/runtime/font/NotoEmoji-Regular.ttfbin0 -> 418804 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/bleeding_cowboys.ttfbin0 -> 148896 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/chp-fire.ttfbin0 -> 46812 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/droidsans.ttfbin0 -> 190044 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/droidsansmono.ttfbin0 -> 117072 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/entypo.ttfbin0 -> 35392 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/five_minutes.otfbin0 -> 27156 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/fontawesome-webfont.ttfbin0 -> 165548 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/glyph_long.pngbin0 -> 12756 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/glyph_space.pngbin0 -> 2484 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/kenney-icon-font.ttfbin0 -> 46184 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/mias_scribblings.ttfbin0 -> 102032 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/roboto-bold.ttfbin0 -> 135820 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/roboto-regular.ttfbin0 -> 145348 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/robotomono-regular.ttfbin0 -> 113500 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/ruritania.ttfbin0 -> 126500 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/signika-regular.ttfbin0 -> 141132 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/special_elite.ttfbin0 -> 166224 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/font/visitor1.ttfbin0 -> 27552 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/gamecontrollerdb.txt175
-rw-r--r--3rdparty/bgfx/examples/runtime/images/SplashScreen.pngbin0 -> 4645 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/blender_icons16.pngbin0 -> 240844 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/image1.jpgbin0 -> 25760 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/image10.jpgbin0 -> 3439 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/image11.jpgbin0 -> 3818 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/image12.jpgbin0 -> 5452 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/image2.jpgbin0 -> 24091 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/image3.jpgbin0 -> 29282 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/image4.jpgbin0 -> 23830 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/image5.jpgbin0 -> 27131 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/image6.jpgbin0 -> 25116 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/image7.jpgbin0 -> 25590 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/image8.jpgbin0 -> 24607 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/images/image9.jpgbin0 -> 4035 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/ios-info.plist45
-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/bunny.binbin0 -> 2588410 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/bunny_decimated.binbin0 -> 100053 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/bunny_patched.binbin0 -> 975611 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/column.binbin0 -> 54019 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/cube.binbin0 -> 930 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/hollowcube.binbin0 -> 37881 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/orb.binbin0 -> 2818102 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/platform.binbin0 -> 1607 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/test_scene.binbin0 -> 141860 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/tree.binbin0 -> 54308 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/tree1b_lod0_1.binbin0 -> 25551 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/tree1b_lod0_2.binbin0 -> 17194 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/tree1b_lod1_1.binbin0 -> 18820 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/tree1b_lod1_2.binbin0 -> 9810 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/tree1b_lod2_1.binbin0 -> 11597 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/tree1b_lod2_2.binbin0 -> 4695 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/tricube.binbin0 -> 24175 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/meshes/unit_sphere.binbin0 -> 6513 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/osx-info.plist30
-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_apply.binbin0 -> 2152 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_generate_importance_map.binbin0 -> 2067 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_generate_q0.binbin0 -> 3518 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_generate_q1.binbin0 -> 5990 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_generate_q2.binbin0 -> 7282 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_generate_q3.binbin0 -> 8028 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_generate_q3base.binbin0 -> 3770 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_load_counter_clear.binbin0 -> 206 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_non_smart_apply.binbin0 -> 956 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_non_smart_blur.binbin0 -> 1224 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_non_smart_half_apply.binbin0 -> 764 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_postprocess_importance_map_a.binbin0 -> 843 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_postprocess_importance_map_b.binbin0 -> 1047 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_prepare_depth_mip.binbin0 -> 3294 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_prepare_depths.binbin0 -> 1217 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_prepare_depths_and_normals.binbin0 -> 8497 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_prepare_depths_and_normals_half.binbin0 -> 4917 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_prepare_depths_half.binbin0 -> 789 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_smart_blur.binbin0 -> 1396 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_assao_smart_blur_wide.binbin0 -> 2104 bytes-rwxr-xr-x3rdparty/bgfx/examples/runtime/shaders/dx11/cs_drawindirect.binbin0 -> 2589 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_drawindirect_count.binbin0 -> 2637 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_fsr_bilinear_16.binbin0 -> 1304 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_fsr_bilinear_32.binbin0 -> 1304 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_fsr_easu_16.binbin0 -> 33504 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_fsr_easu_32.binbin0 -> 38344 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_fsr_rcas_16.binbin0 -> 7729 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_fsr_rcas_32.binbin0 -> 6129 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_gdr_copy_z.binbin0 -> 456 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_gdr_downscale_hi_z.binbin0 -> 914 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_gdr_occlude_props.binbin0 -> 5017 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_gdr_stream_compaction.binbin0 -> 3256 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_indirect.binbin0 -> 447 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_init_instances.binbin0 -> 6775 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_terrain_init.binbin0 -> 1359 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_terrain_lod.binbin0 -> 7859 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_terrain_update_draw.binbin0 -> 583 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_terrain_update_indirect.binbin0 -> 442 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_update.binbin0 -> 793 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/cs_update_instances.binbin0 -> 1619 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_albedo_output.binbin0 -> 502 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_assao_deferred_combine.binbin0 -> 968 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_assao_gbuffer.binbin0 -> 445 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bloom_combine.binbin0 -> 600 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bokeh_copy.binbin0 -> 358 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bokeh_copy_linear_to_gamma.binbin0 -> 470 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bokeh_dof_combine.binbin0 -> 684 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bokeh_dof_debug.binbin0 -> 1019 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bokeh_dof_downsample.binbin0 -> 759 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bokeh_dof_second_pass.binbin0 -> 1930 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bokeh_dof_single_pass.binbin0 -> 2514 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bokeh_forward.binbin0 -> 2148 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bokeh_forward_grid.binbin0 -> 1316 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bokeh_linear_depth.binbin0 -> 467 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bump.binbin0 -> 3478 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_bunnylod.binbin0 -> 802 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_callback.binbin0 -> 802 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_cubes.binbin0 -> 270 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_deferred_clear_uav.binbin0 -> 294 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_deferred_combine.binbin0 -> 776 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_deferred_combine_ta.binbin0 -> 816 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_deferred_debug.binbin0 -> 368 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_deferred_debug_line.binbin0 -> 270 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_deferred_debug_ta.binbin0 -> 454 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_deferred_geom.binbin0 -> 1540 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_deferred_light.binbin0 -> 1462 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_deferred_light_ta.binbin0 -> 1502 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_deferred_light_uav.binbin0 -> 1578 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_denoise_apply_lighting.binbin0 -> 688 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_denoise_copy.binbin0 -> 358 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_denoise_deferred_combine.binbin0 -> 1409 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_denoise_gbuffer.binbin0 -> 2158 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_denoise_spatial_3x3.binbin0 -> 2193 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_denoise_spatial_5x5.binbin0 -> 2241 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_denoise_temporal.binbin0 -> 2755 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_denoise_txaa.binbin0 -> 5069 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_downsample.binbin0 -> 2022 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_fsr_copy_linear_to_gamma.binbin0 -> 474 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_fsr_forward.binbin0 -> 2158 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_fsr_forward_grid.binbin0 -> 1318 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_gdr_instanced_indirect_rendering.binbin0 -> 672 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_hdr_blur.binbin0 -> 1292 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_hdr_bright.binbin0 -> 2585 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_hdr_lum.binbin0 -> 2589 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_hdr_lumavg.binbin0 -> 3245 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_hdr_mesh.binbin0 -> 1912 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_hdr_skybox.binbin0 -> 840 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_hdr_tonemap.binbin0 -> 2688 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_hextile.binbin0 -> 8741 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_ibl_mesh.binbin0 -> 3557 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_ibl_skybox.binbin0 -> 1437 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_instancing.binbin0 -> 270 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_mesh.binbin0 -> 1669 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_oit.binbin0 -> 298 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_oit_wb.binbin0 -> 706 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_oit_wb_blit.binbin0 -> 590 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_oit_wb_separate.binbin0 -> 646 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_oit_wb_separate_blit.binbin0 -> 590 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_particle.binbin0 -> 615 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_picking_id.binbin0 -> 399 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_picking_shaded.binbin0 -> 1210 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_pom.binbin0 -> 7473 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_raymarching.binbin0 -> 10019 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_rsm_combine.binbin0 -> 3671 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_rsm_gbuffer.binbin0 -> 381 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_rsm_lbuffer.binbin0 -> 1293 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_rsm_shadow.binbin0 -> 329 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_screen_space_shadows.binbin0 -> 2415 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_black.binbin0 -> 238 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm.binbin0 -> 3638 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_csm.binbin0 -> 6692 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear.binbin0 -> 3610 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear_csm.binbin0 -> 6580 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_linear_omni.binbin0 -> 5276 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_esm_omni.binbin0 -> 5304 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard.binbin0 -> 3522 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_csm.binbin0 -> 6228 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear.binbin0 -> 3494 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear_csm.binbin0 -> 6116 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_linear_omni.binbin0 -> 5160 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_hard_omni.binbin0 -> 5188 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf.binbin0 -> 12105 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_csm.binbin0 -> 40711 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear.binbin0 -> 11037 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear_csm.binbin0 -> 36355 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_linear_omni.binbin0 -> 12631 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_pcf_omni.binbin0 -> 13719 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm.binbin0 -> 3782 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_csm.binbin0 -> 7364 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear.binbin0 -> 3754 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear_csm.binbin0 -> 7252 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_linear_omni.binbin0 -> 5420 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_lighting_vsm_omni.binbin0 -> 5448 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_color_texture.binbin0 -> 664 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_hblur.binbin0 -> 1928 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_hblur_vsm.binbin0 -> 2288 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_packdepth.binbin0 -> 438 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_packdepth_linear.binbin0 -> 366 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_packdepth_vsm.binbin0 -> 578 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_packdepth_vsm_linear.binbin0 -> 506 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_texture.binbin0 -> 364 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_unpackdepth.binbin0 -> 542 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_unpackdepth_vsm.binbin0 -> 542 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_vblur.binbin0 -> 1928 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowmaps_vblur_vsm.binbin0 -> 2288 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_color_lighting.binbin0 -> 2520 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_color_texture.binbin0 -> 664 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_svbackblank.binbin0 -> 238 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_svbackcolor.binbin0 -> 282 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_svbacktex1.binbin0 -> 358 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_svbacktex2.binbin0 -> 358 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_svfrontblank.binbin0 -> 238 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_svfrontcolor.binbin0 -> 282 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_svfronttex1.binbin0 -> 358 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_svfronttex2.binbin0 -> 358 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_svside.binbin0 -> 474 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_svsideblank.binbin0 -> 266 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_svsidecolor.binbin0 -> 310 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_svsidetex.binbin0 -> 581 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_texture.binbin0 -> 364 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_shadowvolume_texture_lighting.binbin0 -> 2726 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sky.binbin0 -> 1054 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sky_color_banding_fix.binbin0 -> 1726 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sky_landscape.binbin0 -> 1808 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_mesh.binbin0 -> 4401 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_mesh_pd.binbin0 -> 5793 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_shadow.binbin0 -> 158 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sms_shadow_pd.binbin0 -> 489 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sss_deferred_combine.binbin0 -> 2361 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sss_gbuffer.binbin0 -> 2482 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sss_linear_depth.binbin0 -> 467 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_sss_unlit.binbin0 -> 1206 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_color_black.binbin0 -> 238 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_color_lighting.binbin0 -> 2313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_color_texture.binbin0 -> 664 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_texture.binbin0 -> 364 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_stencil_texture_lighting.binbin0 -> 2535 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_terrain.binbin0 -> 358 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_terrain_render.binbin0 -> 581 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_terrain_render_normal.binbin0 -> 593 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_tree.binbin0 -> 1487 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_update.binbin0 -> 362 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_update_3d.binbin0 -> 547 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_update_cmp.binbin0 -> 432 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_upsample.binbin0 -> 1546 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_vectordisplay_blit.binbin0 -> 521 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_vectordisplay_blur.binbin0 -> 1581 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_vectordisplay_fb.binbin0 -> 525 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_vt_mip.binbin0 -> 930 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_vt_unlit.binbin0 -> 1288 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_wf_mesh.binbin0 -> 1567 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/fs_wf_wireframe.binbin0 -> 899 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_albedo_output.binbin0 -> 1117 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_assao.binbin0 -> 524 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_assao_gbuffer.binbin0 -> 952 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_bokeh_forward.binbin0 -> 1286 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_bokeh_screenquad.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_bump.binbin0 -> 1876 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_bump_instanced.binbin0 -> 1804 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_bunnylod.binbin0 -> 746 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_callback.binbin0 -> 726 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_cubes.binbin0 -> 522 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_deferred_combine.binbin0 -> 532 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_deferred_debug.binbin0 -> 532 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_deferred_debug_line.binbin0 -> 524 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_deferred_geom.binbin0 -> 2110 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_deferred_light.binbin0 -> 532 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_denoise_gbuffer.binbin0 -> 1539 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_denoise_screenquad.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_fsr_forward.binbin0 -> 1262 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_fsr_screenquad.binbin0 -> 532 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_fullscreen.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_gdr_instanced_indirect_rendering.binbin0 -> 1101 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_gdr_render_occlusion.binbin0 -> 709 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_hdr_blur.binbin0 -> 1094 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_hdr_bright.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_hdr_lum.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_hdr_lumavg.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_hdr_mesh.binbin0 -> 958 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_hdr_skybox.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_hdr_tonemap.binbin0 -> 1042 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_hextile.binbin0 -> 1181 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_ibl_mesh.binbin0 -> 931 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_ibl_skybox.binbin0 -> 822 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_instancing.binbin0 -> 861 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_mesh.binbin0 -> 1449 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_oit.binbin0 -> 818 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_oit_blit.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_particle.binbin0 -> 1165 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_picking_shaded.binbin0 -> 1061 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_pom.binbin0 -> 1888 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_raymarching.binbin0 -> 632 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_rsm_combine.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_rsm_gbuffer.binbin0 -> 826 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_rsm_lbuffer.binbin0 -> 1175 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_rsm_shadow.binbin0 -> 770 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color.binbin0 -> 416 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting.binbin0 -> 1215 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_csm.binbin0 -> 2172 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_linear.binbin0 -> 1255 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_linear_csm.binbin0 -> 2332 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_linear_omni.binbin0 -> 2243 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_lighting_omni.binbin0 -> 2083 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_color_texture.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_depth.binbin0 -> 416 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_hblur.binbin0 -> 1165 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_packdepth.binbin0 -> 504 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_packdepth_linear.binbin0 -> 512 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_texture.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_texture_lighting.binbin0 -> 988 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_unpackdepth.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowmaps_vblur.binbin0 -> 1165 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_color_lighting.binbin0 -> 950 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_color_texture.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_svback.binbin0 -> 608 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_svfront.binbin0 -> 416 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_svside.binbin0 -> 778 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_texture.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_shadowvolume_texture_lighting.binbin0 -> 988 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_sky.binbin0 -> 3081 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_sky_landscape.binbin0 -> 804 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_sms_mesh.binbin0 -> 1205 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_sms_shadow.binbin0 -> 416 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_sms_shadow_pd.binbin0 -> 504 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_sss_gbuffer.binbin0 -> 1080 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_sss_screenquad.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_color.binbin0 -> 416 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_color_lighting.binbin0 -> 920 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_color_texture.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_texture.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_stencil_texture_lighting.binbin0 -> 988 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_terrain.binbin0 -> 586 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_terrain_height_texture.binbin0 -> 755 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_terrain_render.binbin0 -> 2383 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_tree.binbin0 -> 1072 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_update.binbin0 -> 530 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_vectordisplay_fb.binbin0 -> 632 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_vt_generic.binbin0 -> 685 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_wf_mesh.binbin0 -> 1033 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx11/vs_wf_wireframe.binbin0 -> 775 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_albedo_output.binbin0 -> 195 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bloom_combine.binbin0 -> 444 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bokeh_copy.binbin0 -> 211 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bokeh_copy_linear_to_gamma.binbin0 -> 335 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bokeh_dof_combine.binbin0 -> 474 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bokeh_dof_debug.binbin0 -> 712 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bokeh_dof_downsample.binbin0 -> 504 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bokeh_dof_second_pass.binbin0 -> 1467 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bokeh_dof_single_pass.binbin0 -> 1823 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bokeh_forward.binbin0 -> 1227 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bokeh_forward_grid.binbin0 -> 769 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bokeh_linear_depth.binbin0 -> 320 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bump.binbin0 -> 2244 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_bunnylod.binbin0 -> 551 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_callback.binbin0 -> 551 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_cubes.binbin0 -> 135 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_combine.binbin0 -> 620 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_debug.binbin0 -> 218 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_debug_line.binbin0 -> 135 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_geom.binbin0 -> 700 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_deferred_light.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_denoise_apply_lighting.binbin0 -> 532 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_denoise_copy.binbin0 -> 211 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_denoise_deferred_combine.binbin0 -> 1169 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_denoise_gbuffer.binbin0 -> 1217 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_denoise_spatial_3x3.binbin0 -> 2685 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_denoise_spatial_5x5.binbin0 -> 6633 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_denoise_temporal.binbin0 -> 1683 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_denoise_txaa.binbin0 -> 3103 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_downsample.binbin0 -> 973 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_blur.binbin0 -> 618 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_bright.binbin0 -> 1666 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_lum.binbin0 -> 1471 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_lumavg.binbin0 -> 1795 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_mesh.binbin0 -> 1379 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_skybox.binbin0 -> 527 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_hdr_tonemap.binbin0 -> 1679 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_ibl_mesh.binbin0 -> 2027 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_ibl_skybox.binbin0 -> 1023 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_instancing.binbin0 -> 135 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_mesh.binbin0 -> 1202 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit.binbin0 -> 183 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb.binbin0 -> 459 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_blit.binbin0 -> 431 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_separate.binbin0 -> 431 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_oit_wb_separate_blit.binbin0 -> 431 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_particle.binbin0 -> 404 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_picking_id.binbin0 -> 224 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_picking_shaded.binbin0 -> 663 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_pom.binbin0 -> 5668 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_raymarching.binbin0 -> 47440 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_rsm_combine.binbin0 -> 2447 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_rsm_gbuffer.binbin0 -> 234 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_rsm_lbuffer.binbin0 -> 905 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_rsm_shadow.binbin0 -> 206 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_screen_space_shadows.binbin0 -> 1632 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_black.binbin0 -> 147 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm.binbin0 -> 2750 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_csm.binbin0 -> 4537 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_linear.binbin0 -> 2746 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_linear_csm.binbin0 -> 4501 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_linear_omni.binbin0 -> 3804 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_esm_omni.binbin0 -> 3808 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard.binbin0 -> 2710 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_csm.binbin0 -> 4405 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_linear.binbin0 -> 2706 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_linear_csm.binbin0 -> 4449 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_linear_omni.binbin0 -> 3776 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_hard_omni.binbin0 -> 3760 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf.binbin0 -> 7613 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_csm.binbin0 -> 24524 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear.binbin0 -> 7289 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear_csm.binbin0 -> 22344 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_linear_omni.binbin0 -> 7995 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_pcf_omni.binbin0 -> 8699 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm.binbin0 -> 2830 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_csm.binbin0 -> 4921 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear.binbin0 -> 2814 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear_csm.binbin0 -> 4857 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_linear_omni.binbin0 -> 3904 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_lighting_vsm_omni.binbin0 -> 3920 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_color_texture.binbin0 -> 574 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_hblur.binbin0 -> 960 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_hblur_vsm.binbin0 -> 1152 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth.binbin0 -> 267 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_linear.binbin0 -> 219 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm.binbin0 -> 331 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_packdepth_vsm_linear.binbin0 -> 259 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_texture.binbin0 -> 218 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth.binbin0 -> 382 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_unpackdepth_vsm.binbin0 -> 386 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_vblur.binbin0 -> 960 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowmaps_vblur_vsm.binbin0 -> 1152 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_lighting.binbin0 -> 1932 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_color_texture.binbin0 -> 574 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbackblank.binbin0 -> 147 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbackcolor.binbin0 -> 227 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbacktex1.binbin0 -> 179 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svbacktex2.binbin0 -> 179 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfrontblank.binbin0 -> 147 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfrontcolor.binbin0 -> 227 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfronttex1.binbin0 -> 179 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svfronttex2.binbin0 -> 179 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svside.binbin0 -> 255 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsideblank.binbin0 -> 147 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsidecolor.binbin0 -> 227 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_svsidetex.binbin0 -> 354 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture.binbin0 -> 218 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_shadowvolume_texture_lighting.binbin0 -> 2083 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sky.binbin0 -> 651 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sky_color_banding_fix.binbin0 -> 1287 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sky_landscape.binbin0 -> 1439 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_mesh.binbin0 -> 2466 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_mesh_pd.binbin0 -> 3302 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_shadow.binbin0 -> 147 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sms_shadow_pd.binbin0 -> 350 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sss_deferred_combine.binbin0 -> 1471 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sss_gbuffer.binbin0 -> 1401 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sss_linear_depth.binbin0 -> 320 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_sss_unlit.binbin0 -> 563 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_black.binbin0 -> 147 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_lighting.binbin0 -> 1990 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_color_texture.binbin0 -> 574 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture.binbin0 -> 218 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_stencil_texture_lighting.binbin0 -> 2185 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_terrain.binbin0 -> 195 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_tree.binbin0 -> 1024 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update.binbin0 -> 217 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_3d.binbin0 -> 429 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_update_cmp.binbin0 -> 262 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_upsample.binbin0 -> 801 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_blit.binbin0 -> 327 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_blur.binbin0 -> 815 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vectordisplay_fb.binbin0 -> 339 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vt_mip.binbin0 -> 667 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_vt_unlit.binbin0 -> 950 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_wf_mesh.binbin0 -> 1016 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/fs_wf_wireframe.binbin0 -> 520 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_albedo_output.binbin0 -> 586 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bokeh_forward.binbin0 -> 789 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bokeh_screenquad.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bump.binbin0 -> 973 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bump_instanced.binbin0 -> 941 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_bunnylod.binbin0 -> 495 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_callback.binbin0 -> 463 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_cubes.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_combine.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_debug.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_debug_line.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_geom.binbin0 -> 1093 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_deferred_light.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_denoise_gbuffer.binbin0 -> 970 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_denoise_screenquad.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_fullscreen.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_blur.binbin0 -> 667 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_bright.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_lum.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_lumavg.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_mesh.binbin0 -> 579 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_skybox.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_hdr_tonemap.binbin0 -> 655 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_ibl_mesh.binbin0 -> 632 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_ibl_skybox.binbin0 -> 607 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_instancing.binbin0 -> 476 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_mesh.binbin0 -> 986 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_oit.binbin0 -> 557 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_oit_blit.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_particle.binbin0 -> 686 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_picking_shaded.binbin0 -> 678 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_pom.binbin0 -> 1033 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_raymarching.binbin0 -> 355 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_rsm_combine.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_rsm_gbuffer.binbin0 -> 499 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_rsm_lbuffer.binbin0 -> 912 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_rsm_shadow.binbin0 -> 503 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color.binbin0 -> 283 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting.binbin0 -> 808 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_csm.binbin0 -> 1465 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear.binbin0 -> 824 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear_csm.binbin0 -> 1529 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_linear_omni.binbin0 -> 1476 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_lighting_omni.binbin0 -> 1412 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_color_texture.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_depth.binbin0 -> 283 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_hblur.binbin0 -> 758 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_packdepth_linear.binbin0 -> 351 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_texture_lighting.binbin0 -> 579 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_unpackdepth.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowmaps_vblur.binbin0 -> 758 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_lighting.binbin0 -> 543 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_color_texture.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svback.binbin0 -> 439 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svfront.binbin0 -> 283 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_svside.binbin0 -> 547 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_shadowvolume_texture_lighting.binbin0 -> 579 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sky.binbin0 -> 2124 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sky_landscape.binbin0 -> 503 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_mesh.binbin0 -> 742 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_shadow.binbin0 -> 283 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sms_shadow_pd.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sss_gbuffer.binbin0 -> 643 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_sss_screenquad.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color.binbin0 -> 283 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_lighting.binbin0 -> 543 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_color_texture.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_stencil_texture_lighting.binbin0 -> 579 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_terrain.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_terrain_height_texture.binbin0 -> 515 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_tree.binbin0 -> 631 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_update.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_vectordisplay_fb.binbin0 -> 355 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_vt_generic.binbin0 -> 442 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_wf_mesh.binbin0 -> 668 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/dx9/vs_wf_wireframe.binbin0 -> 544 bytes-rwxr-xr-x3rdparty/bgfx/examples/runtime/shaders/essl/cs_drawindirect.binbin0 -> 3029 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/cs_indirect.binbin0 -> 1684 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/cs_init_instances.binbin0 -> 3836 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/cs_update.binbin0 -> 1805 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/cs_update_instances.binbin0 -> 3144 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_albedo_output.binbin0 -> 137 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bloom_combine.binbin0 -> 386 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bokeh_copy.binbin0 -> 208 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bokeh_copy_linear_to_gamma.binbin0 -> 338 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bokeh_dof_combine.binbin0 -> 554 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bokeh_dof_debug.binbin0 -> 879 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bokeh_dof_downsample.binbin0 -> 451 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bokeh_dof_second_pass.binbin0 -> 2684 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bokeh_dof_single_pass.binbin0 -> 3162 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bokeh_forward.binbin0 -> 2044 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bokeh_forward_grid.binbin0 -> 1105 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bokeh_linear_depth.binbin0 -> 416 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bump.binbin0 -> 4759 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_bunnylod.binbin0 -> 499 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_callback.binbin0 -> 499 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_cubes.binbin0 -> 93 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_deferred_combine.binbin0 -> 779 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_deferred_debug.binbin0 -> 217 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_deferred_debug_line.binbin0 -> 93 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_deferred_geom.binbin0 -> 1063 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_deferred_light.binbin0 -> 1898 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_denoise_apply_lighting.binbin0 -> 413 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_denoise_copy.binbin0 -> 208 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_denoise_deferred_combine.binbin0 -> 1705 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_denoise_gbuffer.binbin0 -> 2486 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_denoise_spatial_3x3.binbin0 -> 2146 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_denoise_spatial_5x5.binbin0 -> 2214 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_denoise_temporal.binbin0 -> 3896 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_denoise_txaa.binbin0 -> 6822 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_downsample.binbin0 -> 2003 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_hdr_blur.binbin0 -> 1013 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_hdr_bright.binbin0 -> 2443 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_hdr_lum.binbin0 -> 2367 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_hdr_lumavg.binbin0 -> 3290 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_hdr_mesh.binbin0 -> 1805 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_hdr_skybox.binbin0 -> 708 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_hdr_tonemap.binbin0 -> 2718 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_hextile.binbin0 -> 8061 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_ibl_mesh.binbin0 -> 3577 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_ibl_skybox.binbin0 -> 1865 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_instancing.binbin0 -> 93 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_mesh.binbin0 -> 1425 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_oit.binbin0 -> 107 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_oit_wb.binbin0 -> 379 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_oit_wb_blit.binbin0 -> 419 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_oit_wb_separate.binbin0 -> 447 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_oit_wb_separate_blit.binbin0 -> 419 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_particle.binbin0 -> 378 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_picking_id.binbin0 -> 130 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_picking_shaded.binbin0 -> 878 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_pom.binbin0 -> 2881 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_raymarching.binbin0 -> 12624 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_rsm_combine.binbin0 -> 7994 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_rsm_gbuffer.binbin0 -> 194 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_rsm_lbuffer.binbin0 -> 1321 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_rsm_shadow.binbin0 -> 179 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_screen_space_shadows.binbin0 -> 3355 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_black.binbin0 -> 80 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_esm.binbin0 -> 4243 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_esm_csm.binbin0 -> 10258 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_esm_linear.binbin0 -> 4287 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_esm_linear_csm.binbin0 -> 10478 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_esm_linear_omni.binbin0 -> 7625 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_esm_omni.binbin0 -> 7579 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_hard.binbin0 -> 4115 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_hard_csm.binbin0 -> 9714 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_hard_linear.binbin0 -> 4147 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_hard_linear_csm.binbin0 -> 9850 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_hard_linear_omni.binbin0 -> 7486 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_hard_omni.binbin0 -> 7452 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcf.binbin0 -> 15768 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcf_csm.binbin0 -> 63510 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcf_linear.binbin0 -> 15819 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcf_linear_csm.binbin0 -> 63956 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcf_linear_omni.binbin0 -> 19357 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_pcf_omni.binbin0 -> 19302 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm.binbin0 -> 4665 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_csm.binbin0 -> 12188 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_linear.binbin0 -> 4709 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_linear_csm.binbin0 -> 12408 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_linear_omni.binbin0 -> 8049 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_lighting_vsm_omni.binbin0 -> 8003 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_color_texture.binbin0 -> 695 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_hblur.binbin0 -> 1752 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_hblur_vsm.binbin0 -> 2750 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_packdepth.binbin0 -> 306 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_packdepth_linear.binbin0 -> 258 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_packdepth_vsm.binbin0 -> 501 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_packdepth_vsm_linear.binbin0 -> 412 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_texture.binbin0 -> 217 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_unpackdepth.binbin0 -> 429 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_unpackdepth_vsm.binbin0 -> 402 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_vblur.binbin0 -> 1752 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowmaps_vblur_vsm.binbin0 -> 2750 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_color_lighting.binbin0 -> 2355 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_color_texture.binbin0 -> 695 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_svbackblank.binbin0 -> 169 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_svbackcolor.binbin0 -> 140 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_svbacktex1.binbin0 -> 445 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_svbacktex2.binbin0 -> 445 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_svfrontblank.binbin0 -> 177 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_svfrontcolor.binbin0 -> 140 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_svfronttex1.binbin0 -> 442 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_svfronttex2.binbin0 -> 442 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_svside.binbin0 -> 472 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_svsideblank.binbin0 -> 80 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_svsidecolor.binbin0 -> 140 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_svsidetex.binbin0 -> 576 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_texture.binbin0 -> 217 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_shadowvolume_texture_lighting.binbin0 -> 2586 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_sky.binbin0 -> 735 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_sky_color_banding_fix.binbin0 -> 1149 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_sky_landscape.binbin0 -> 1295 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_sms_mesh.binbin0 -> 8407 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_sms_mesh_pd.binbin0 -> 8660 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_sms_shadow.binbin0 -> 34 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_sms_shadow_pd.binbin0 -> 406 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_sss_deferred_combine.binbin0 -> 2915 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_sss_gbuffer.binbin0 -> 3097 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_sss_linear_depth.binbin0 -> 416 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_sss_unlit.binbin0 -> 1370 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_stencil_color_black.binbin0 -> 80 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_stencil_color_lighting.binbin0 -> 2260 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_stencil_color_texture.binbin0 -> 695 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_stencil_texture.binbin0 -> 217 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_stencil_texture_lighting.binbin0 -> 2584 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_terrain.binbin0 -> 239 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_tree.binbin0 -> 1324 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_update.binbin0 -> 223 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_update_3d.binbin0 -> 527 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_update_cmp.binbin0 -> 236 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_upsample.binbin0 -> 1603 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_vectordisplay_blit.binbin0 -> 422 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_vectordisplay_blur.binbin0 -> 2020 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_vectordisplay_fb.binbin0 -> 406 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_vt_mip.binbin0 -> 824 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_vt_unlit.binbin0 -> 1195 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_wf_mesh.binbin0 -> 1527 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/fs_wf_wireframe.binbin0 -> 765 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_albedo_output.binbin0 -> 459 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_bokeh_forward.binbin0 -> 1131 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_bokeh_screenquad.binbin0 -> 347 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_bump.binbin0 -> 1480 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_bump_instanced.binbin0 -> 1805 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_bunnylod.binbin0 -> 584 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_callback.binbin0 -> 514 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_cubes.binbin0 -> 331 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_deferred_combine.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_deferred_debug.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_deferred_debug_line.binbin0 -> 331 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_deferred_geom.binbin0 -> 1753 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_deferred_light.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_denoise_gbuffer.binbin0 -> 1666 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_denoise_screenquad.binbin0 -> 347 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_fullscreen.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_hdr_blur.binbin0 -> 1493 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_hdr_bright.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_hdr_lum.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_hdr_lumavg.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_hdr_mesh.binbin0 -> 682 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_hdr_skybox.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_hdr_tonemap.binbin0 -> 1411 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_hextile.binbin0 -> 664 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_ibl_mesh.binbin0 -> 681 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_ibl_skybox.binbin0 -> 782 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_instancing.binbin0 -> 616 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_mesh.binbin0 -> 1499 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_oit.binbin0 -> 614 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_oit_blit.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_particle.binbin0 -> 895 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_picking_shaded.binbin0 -> 803 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_pom.binbin0 -> 1502 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_raymarching.binbin0 -> 426 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_rsm_combine.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_rsm_gbuffer.binbin0 -> 514 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_rsm_lbuffer.binbin0 -> 1210 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_rsm_shadow.binbin0 -> 524 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_color.binbin0 -> 248 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting.binbin0 -> 970 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting_csm.binbin0 -> 1598 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting_linear.binbin0 -> 1015 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting_linear_csm.binbin0 -> 1762 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting_linear_omni.binbin0 -> 1688 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_color_lighting_omni.binbin0 -> 1524 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_color_texture.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_depth.binbin0 -> 248 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_hblur.binbin0 -> 1494 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_packdepth.binbin0 -> 307 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_packdepth_linear.binbin0 -> 320 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_texture.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_texture_lighting.binbin0 -> 728 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_unpackdepth.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowmaps_vblur.binbin0 -> 1494 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowvolume_color_lighting.binbin0 -> 633 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowvolume_color_texture.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowvolume_svback.binbin0 -> 452 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowvolume_svfront.binbin0 -> 248 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowvolume_svside.binbin0 -> 636 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowvolume_texture.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_shadowvolume_texture_lighting.binbin0 -> 728 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_sky.binbin0 -> 3418 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_sky_landscape.binbin0 -> 577 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_sms_mesh.binbin0 -> 916 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_sms_shadow.binbin0 -> 248 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_sms_shadow_pd.binbin0 -> 307 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_sss_gbuffer.binbin0 -> 851 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_sss_screenquad.binbin0 -> 347 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_stencil_color.binbin0 -> 248 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_stencil_color_lighting.binbin0 -> 633 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_stencil_color_texture.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_stencil_texture.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_stencil_texture_lighting.binbin0 -> 728 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_terrain.binbin0 -> 401 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_terrain_height_texture.binbin0 -> 546 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_tree.binbin0 -> 795 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_update.binbin0 -> 343 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_vectordisplay_fb.binbin0 -> 426 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_vt_generic.binbin0 -> 459 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_wf_mesh.binbin0 -> 755 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/essl/vs_wf_wireframe.binbin0 -> 567 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_apply.binbin0 -> 3434 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_generate_importance_map.binbin0 -> 2438 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_generate_q0.binbin0 -> 15275 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_generate_q1.binbin0 -> 15275 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_generate_q2.binbin0 -> 15275 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_generate_q3.binbin0 -> 15275 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_generate_q3base.binbin0 -> 15273 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_load_counter_clear.binbin0 -> 1532 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_non_smart_apply.binbin0 -> 2060 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_non_smart_blur.binbin0 -> 2382 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_non_smart_half_apply.binbin0 -> 1915 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_postprocess_importance_map_a.binbin0 -> 2509 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_postprocess_importance_map_b.binbin0 -> 2698 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_prepare_depth_mip.binbin0 -> 4924 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_prepare_depths.binbin0 -> 2656 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_prepare_depths_and_normals.binbin0 -> 7731 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_prepare_depths_and_normals_half.binbin0 -> 6715 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_prepare_depths_half.binbin0 -> 2240 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_smart_blur.binbin0 -> 3241 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_assao_smart_blur_wide.binbin0 -> 3424 bytes-rwxr-xr-x3rdparty/bgfx/examples/runtime/shaders/glsl/cs_drawindirect.binbin0 -> 3197 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_drawindirect_count.binbin0 -> 3352 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_fsr_bilinear_16.binbin0 -> 58590 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_fsr_bilinear_32.binbin0 -> 32439 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_fsr_easu_16.binbin0 -> 64067 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_fsr_easu_32.binbin0 -> 37251 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_fsr_rcas_16.binbin0 -> 61163 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_fsr_rcas_32.binbin0 -> 34671 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_gdr_copy_z.binbin0 -> 1910 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_gdr_downscale_hi_z.binbin0 -> 2350 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_gdr_occlude_props.binbin0 -> 3885 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_gdr_stream_compaction.binbin0 -> 4057 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_indirect.binbin0 -> 1852 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_init_instances.binbin0 -> 4004 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_terrain_init.binbin0 -> 2726 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_terrain_lod.binbin0 -> 8011 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_terrain_update_draw.binbin0 -> 1982 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_terrain_update_indirect.binbin0 -> 2032 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_update.binbin0 -> 1967 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/cs_update_instances.binbin0 -> 3312 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_albedo_output.binbin0 -> 131 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_assao_deferred_combine.binbin0 -> 949 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_assao_gbuffer.binbin0 -> 242 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bloom_combine.binbin0 -> 375 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bokeh_copy.binbin0 -> 157 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bokeh_copy_linear_to_gamma.binbin0 -> 322 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bokeh_dof_combine.binbin0 -> 533 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bokeh_dof_debug.binbin0 -> 853 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bokeh_dof_downsample.binbin0 -> 440 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bokeh_dof_second_pass.binbin0 -> 2538 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bokeh_dof_single_pass.binbin0 -> 2941 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bokeh_forward.binbin0 -> 1882 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bokeh_forward_grid.binbin0 -> 1037 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bokeh_linear_depth.binbin0 -> 397 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bump.binbin0 -> 4441 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_bunnylod.binbin0 -> 469 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_callback.binbin0 -> 469 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_cubes.binbin0 -> 87 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_deferred_clear_uav.binbin0 -> 2027 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_deferred_combine.binbin0 -> 699 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_deferred_combine_ta.binbin0 -> 772 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_deferred_debug.binbin0 -> 168 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_deferred_debug_line.binbin0 -> 87 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_deferred_debug_ta.binbin0 -> 287 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_deferred_geom.binbin0 -> 920 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_deferred_light.binbin0 -> 1778 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_deferred_light_ta.binbin0 -> 1856 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_deferred_light_uav.binbin0 -> 11996 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_denoise_apply_lighting.binbin0 -> 402 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_denoise_copy.binbin0 -> 157 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_denoise_deferred_combine.binbin0 -> 1548 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_denoise_gbuffer.binbin0 -> 2191 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_denoise_spatial_3x3.binbin0 -> 2068 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_denoise_spatial_5x5.binbin0 -> 2136 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_denoise_temporal.binbin0 -> 3723 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_denoise_txaa.binbin0 -> 6595 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_downsample.binbin0 -> 1914 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_fsr_copy_linear_to_gamma.binbin0 -> 324 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_fsr_forward.binbin0 -> 1888 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_fsr_forward_grid.binbin0 -> 1039 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_gdr_instanced_indirect_rendering.binbin0 -> 407 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_hdr_blur.binbin0 -> 930 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_hdr_bright.binbin0 -> 2315 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_hdr_lum.binbin0 -> 2249 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_hdr_lumavg.binbin0 -> 3132 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_hdr_mesh.binbin0 -> 1657 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_hdr_skybox.binbin0 -> 616 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_hdr_tonemap.binbin0 -> 2566 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_hextile.binbin0 -> 7628 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_ibl_mesh.binbin0 -> 3325 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_ibl_skybox.binbin0 -> 1718 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_instancing.binbin0 -> 87 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_mesh.binbin0 -> 1353 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit.binbin0 -> 101 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb.binbin0 -> 361 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb_blit.binbin0 -> 403 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb_separate.binbin0 -> 419 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_oit_wb_separate_blit.binbin0 -> 403 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_particle.binbin0 -> 364 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_picking_id.binbin0 -> 124 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_picking_shaded.binbin0 -> 830 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_pom.binbin0 -> 2740 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_raymarching.binbin0 -> 11958 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_rsm_combine.binbin0 -> 7589 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_rsm_gbuffer.binbin0 -> 182 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_rsm_lbuffer.binbin0 -> 1114 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_rsm_shadow.binbin0 -> 167 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_screen_space_shadows.binbin0 -> 3167 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_black.binbin0 -> 80 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm.binbin0 -> 4006 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_csm.binbin0 -> 9876 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear.binbin0 -> 4050 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear_csm.binbin0 -> 10096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_linear_omni.binbin0 -> 7269 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_esm_omni.binbin0 -> 7223 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard.binbin0 -> 3884 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_csm.binbin0 -> 9356 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear.binbin0 -> 3916 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear_csm.binbin0 -> 9492 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_linear_omni.binbin0 -> 7136 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_hard_omni.binbin0 -> 7102 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf.binbin0 -> 15155 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_csm.binbin0 -> 61671 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear.binbin0 -> 15200 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear_csm.binbin0 -> 62093 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_linear_omni.binbin0 -> 18613 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_pcf_omni.binbin0 -> 18564 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm.binbin0 -> 4403 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_csm.binbin0 -> 11706 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear.binbin0 -> 4447 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear_csm.binbin0 -> 11926 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_linear_omni.binbin0 -> 7668 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_lighting_vsm_omni.binbin0 -> 7622 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_color_texture.binbin0 -> 610 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_hblur.binbin0 -> 1625 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_hblur_vsm.binbin0 -> 2563 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth.binbin0 -> 294 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_linear.binbin0 -> 246 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_vsm.binbin0 -> 469 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_packdepth_vsm_linear.binbin0 -> 386 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_texture.binbin0 -> 166 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth.binbin0 -> 364 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_unpackdepth_vsm.binbin0 -> 337 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_vblur.binbin0 -> 1625 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowmaps_vblur_vsm.binbin0 -> 2563 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_color_lighting.binbin0 -> 2126 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_color_texture.binbin0 -> 610 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_svbackblank.binbin0 -> 161 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_svbackcolor.binbin0 -> 134 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_svbacktex1.binbin0 -> 431 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_svbacktex2.binbin0 -> 431 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_svfrontblank.binbin0 -> 169 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_svfrontcolor.binbin0 -> 134 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_svfronttex1.binbin0 -> 428 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_svfronttex2.binbin0 -> 428 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_svside.binbin0 -> 452 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_svsideblank.binbin0 -> 80 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_svsidecolor.binbin0 -> 134 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_svsidetex.binbin0 -> 550 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_texture.binbin0 -> 166 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_shadowvolume_texture_lighting.binbin0 -> 2348 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sky.binbin0 -> 685 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sky_color_banding_fix.binbin0 -> 1093 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sky_landscape.binbin0 -> 1180 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_mesh.binbin0 -> 7924 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_mesh_pd.binbin0 -> 8294 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_shadow.binbin0 -> 34 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sms_shadow_pd.binbin0 -> 388 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sss_deferred_combine.binbin0 -> 2790 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sss_gbuffer.binbin0 -> 2833 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sss_linear_depth.binbin0 -> 397 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_sss_unlit.binbin0 -> 1288 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_color_black.binbin0 -> 80 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_color_lighting.binbin0 -> 2140 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_color_texture.binbin0 -> 610 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_texture.binbin0 -> 166 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_stencil_texture_lighting.binbin0 -> 2400 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_terrain.binbin0 -> 219 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_terrain_render.binbin0 -> 6144 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_terrain_render_normal.binbin0 -> 6083 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_tree.binbin0 -> 1202 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_update.binbin0 -> 167 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_update_3d.binbin0 -> 446 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_update_cmp.binbin0 -> 185 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_upsample.binbin0 -> 1520 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_vectordisplay_blit.binbin0 -> 359 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_vectordisplay_blur.binbin0 -> 1925 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_vectordisplay_fb.binbin0 -> 337 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_vt_mip.binbin0 -> 768 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_vt_unlit.binbin0 -> 1048 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_wf_mesh.binbin0 -> 1485 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/fs_wf_wireframe.binbin0 -> 713 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_albedo_output.binbin0 -> 423 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_assao.binbin0 -> 315 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_assao_gbuffer.binbin0 -> 570 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_bokeh_forward.binbin0 -> 1035 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_bokeh_screenquad.binbin0 -> 317 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_bump.binbin0 -> 1354 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_bump_instanced.binbin0 -> 1631 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_bunnylod.binbin0 -> 536 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_callback.binbin0 -> 472 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_cubes.binbin0 -> 301 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_deferred_combine.binbin0 -> 315 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_deferred_debug.binbin0 -> 315 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_deferred_debug_line.binbin0 -> 303 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_deferred_geom.binbin0 -> 1609 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_deferred_light.binbin0 -> 315 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_denoise_gbuffer.binbin0 -> 1540 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_denoise_screenquad.binbin0 -> 317 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_fsr_forward.binbin0 -> 1034 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_fsr_screenquad.binbin0 -> 319 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_fullscreen.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_gdr_instanced_indirect_rendering.binbin0 -> 527 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_gdr_render_occlusion.binbin0 -> 402 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_hdr_blur.binbin0 -> 1391 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_hdr_bright.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_hdr_lum.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_hdr_lumavg.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_hdr_mesh.binbin0 -> 622 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_hdr_skybox.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_hdr_tonemap.binbin0 -> 1321 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_hextile.binbin0 -> 610 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_ibl_mesh.binbin0 -> 633 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_ibl_skybox.binbin0 -> 728 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_instancing.binbin0 -> 550 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_mesh.binbin0 -> 1379 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_oit.binbin0 -> 566 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_oit_blit.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_particle.binbin0 -> 835 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_picking_shaded.binbin0 -> 731 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_pom.binbin0 -> 1382 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_raymarching.binbin0 -> 384 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_rsm_combine.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_rsm_gbuffer.binbin0 -> 478 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_rsm_lbuffer.binbin0 -> 1130 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_rsm_shadow.binbin0 -> 482 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color.binbin0 -> 230 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting.binbin0 -> 886 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_csm.binbin0 -> 1466 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear.binbin0 -> 931 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear_csm.binbin0 -> 1630 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_linear_omni.binbin0 -> 1556 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_lighting_omni.binbin0 -> 1392 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_color_texture.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_depth.binbin0 -> 230 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_hblur.binbin0 -> 1398 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_packdepth.binbin0 -> 283 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_packdepth_linear.binbin0 -> 296 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_texture.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_texture_lighting.binbin0 -> 662 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_unpackdepth.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowmaps_vblur.binbin0 -> 1398 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_color_lighting.binbin0 -> 579 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_color_texture.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_svback.binbin0 -> 428 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_svfront.binbin0 -> 230 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_svside.binbin0 -> 594 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_texture.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_shadowvolume_texture_lighting.binbin0 -> 662 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_sky.binbin0 -> 3244 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_sky_landscape.binbin0 -> 529 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_sms_mesh.binbin0 -> 838 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_sms_shadow.binbin0 -> 230 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_sms_shadow_pd.binbin0 -> 283 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_sss_gbuffer.binbin0 -> 779 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_sss_screenquad.binbin0 -> 317 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_color.binbin0 -> 230 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_color_lighting.binbin0 -> 579 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_color_texture.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_texture.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_stencil_texture_lighting.binbin0 -> 662 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_terrain.binbin0 -> 365 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_terrain_height_texture.binbin0 -> 509 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_terrain_render.binbin0 -> 6706 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_tree.binbin0 -> 723 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_update.binbin0 -> 313 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_vectordisplay_fb.binbin0 -> 384 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_vt_generic.binbin0 -> 423 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_wf_mesh.binbin0 -> 695 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/glsl/vs_wf_wireframe.binbin0 -> 525 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_apply.binbin0 -> 3140 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_generate_importance_map.binbin0 -> 1692 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_generate_q0.binbin0 -> 8935 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_generate_q1.binbin0 -> 11499 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_generate_q2.binbin0 -> 13244 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_generate_q3.binbin0 -> 14405 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_generate_q3base.binbin0 -> 9035 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_load_counter_clear.binbin0 -> 289 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_non_smart_apply.binbin0 -> 1276 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_non_smart_blur.binbin0 -> 2100 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_non_smart_half_apply.binbin0 -> 1035 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_postprocess_importance_map_a.binbin0 -> 1632 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_postprocess_importance_map_b.binbin0 -> 2114 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_prepare_depth_mip.binbin0 -> 3326 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_prepare_depths.binbin0 -> 1658 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_prepare_depths_and_normals.binbin0 -> 9215 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_prepare_depths_and_normals_half.binbin0 -> 5765 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_prepare_depths_half.binbin0 -> 1174 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_smart_blur.binbin0 -> 2290 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_assao_smart_blur_wide.binbin0 -> 3243 bytes-rwxr-xr-x3rdparty/bgfx/examples/runtime/shaders/metal/cs_drawindirect.binbin0 -> 2579 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_drawindirect_count.binbin0 -> 2798 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_fsr_bilinear_16.binbin0 -> 2536 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_fsr_bilinear_32.binbin0 -> 2536 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_fsr_easu_16.binbin0 -> 38078 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_fsr_easu_32.binbin0 -> 48593 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_fsr_rcas_16.binbin0 -> 9686 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_fsr_rcas_32.binbin0 -> 8968 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_gdr_copy_z.binbin0 -> 816 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_gdr_downscale_hi_z.binbin0 -> 1235 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_gdr_occlude_props.binbin0 -> 4852 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_gdr_stream_compaction.binbin0 -> 4092 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_indirect.binbin0 -> 562 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_init_instances.binbin0 -> 7775 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_terrain_init.binbin0 -> 1737 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_terrain_lod.binbin0 -> 11143 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_terrain_update_draw.binbin0 -> 682 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_terrain_update_indirect.binbin0 -> 872 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_update.binbin0 -> 1807 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/cs_update_instances.binbin0 -> 2209 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_albedo_output.binbin0 -> 472 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_assao_deferred_combine.binbin0 -> 1570 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_assao_gbuffer.binbin0 -> 711 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bloom_combine.binbin0 -> 877 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bokeh_copy.binbin0 -> 572 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bokeh_copy_linear_to_gamma.binbin0 -> 663 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bokeh_dof_combine.binbin0 -> 1196 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bokeh_dof_debug.binbin0 -> 1428 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bokeh_dof_downsample.binbin0 -> 998 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bokeh_dof_second_pass.binbin0 -> 2502 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bokeh_dof_single_pass.binbin0 -> 2931 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bokeh_forward.binbin0 -> 2281 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bokeh_forward_grid.binbin0 -> 1218 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bokeh_linear_depth.binbin0 -> 735 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bump.binbin0 -> 2843 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_bunnylod.binbin0 -> 634 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_callback.binbin0 -> 634 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_cubes.binbin0 -> 386 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_deferred_clear_uav.binbin0 -> 295 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_deferred_combine.binbin0 -> 1043 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_deferred_combine_ta.binbin0 -> 1110 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_deferred_debug.binbin0 -> 593 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_deferred_debug_line.binbin0 -> 386 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_deferred_debug_ta.binbin0 -> 772 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_deferred_geom.binbin0 -> 1524 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_deferred_light.binbin0 -> 1518 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_deferred_light_ta.binbin0 -> 1585 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_deferred_light_uav.binbin0 -> 1579 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_denoise_apply_lighting.binbin0 -> 888 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_denoise_copy.binbin0 -> 572 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_denoise_deferred_combine.binbin0 -> 1754 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_denoise_gbuffer.binbin0 -> 2510 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_denoise_spatial_3x3.binbin0 -> 3635 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_denoise_spatial_5x5.binbin0 -> 3681 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_denoise_temporal.binbin0 -> 3882 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_denoise_txaa.binbin0 -> 8394 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_downsample.binbin0 -> 1829 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_fsr_copy_linear_to_gamma.binbin0 -> 663 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_fsr_forward.binbin0 -> 2281 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_fsr_forward_grid.binbin0 -> 1218 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_gdr_instanced_indirect_rendering.binbin0 -> 767 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_hdr_blur.binbin0 -> 1529 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_hdr_bright.binbin0 -> 2714 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_hdr_lum.binbin0 -> 3046 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_hdr_lumavg.binbin0 -> 3139 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_hdr_mesh.binbin0 -> 1985 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_hdr_skybox.binbin0 -> 947 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_hdr_tonemap.binbin0 -> 3433 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_hextile.binbin0 -> 6819 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_ibl_mesh.binbin0 -> 3658 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_ibl_skybox.binbin0 -> 2507 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_instancing.binbin0 -> 386 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_mesh.binbin0 -> 1757 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_oit.binbin0 -> 391 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_oit_wb.binbin0 -> 923 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_oit_wb_blit.binbin0 -> 940 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_oit_wb_separate.binbin0 -> 809 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_oit_wb_separate_blit.binbin0 -> 940 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_particle.binbin0 -> 797 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_picking_id.binbin0 -> 399 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_picking_shaded.binbin0 -> 984 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_pom.binbin0 -> 4228 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_raymarching.binbin0 -> 6915 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_rsm_combine.binbin0 -> 6769 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_rsm_gbuffer.binbin0 -> 576 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_rsm_lbuffer.binbin0 -> 1590 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_rsm_shadow.binbin0 -> 559 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_screen_space_shadows.binbin0 -> 3223 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_black.binbin0 -> 291 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm.binbin0 -> 4432 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_csm.binbin0 -> 8952 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_linear.binbin0 -> 4445 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_linear_csm.binbin0 -> 9004 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_linear_omni.binbin0 -> 6696 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_esm_omni.binbin0 -> 6679 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard.binbin0 -> 4357 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_csm.binbin0 -> 8668 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_linear.binbin0 -> 4374 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_linear_csm.binbin0 -> 8720 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_linear_omni.binbin0 -> 6621 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_hard_omni.binbin0 -> 6605 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf.binbin0 -> 12404 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_csm.binbin0 -> 47989 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_linear.binbin0 -> 12315 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_linear_csm.binbin0 -> 47781 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_linear_omni.binbin0 -> 14580 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_pcf_omni.binbin0 -> 14515 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm.binbin0 -> 4759 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_csm.binbin0 -> 10620 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_linear.binbin0 -> 4772 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_linear_csm.binbin0 -> 10672 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_linear_omni.binbin0 -> 7032 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_lighting_vsm_omni.binbin0 -> 7016 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_color_texture.binbin0 -> 1032 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_hblur.binbin0 -> 2355 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_hblur_vsm.binbin0 -> 2719 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_packdepth.binbin0 -> 564 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_packdepth_linear.binbin0 -> 522 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_packdepth_vsm.binbin0 -> 655 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_packdepth_vsm_linear.binbin0 -> 602 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_texture.binbin0 -> 593 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_unpackdepth.binbin0 -> 837 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_unpackdepth_vsm.binbin0 -> 797 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_vblur.binbin0 -> 2355 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowmaps_vblur_vsm.binbin0 -> 2719 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_color_lighting.binbin0 -> 2454 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_color_texture.binbin0 -> 1032 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_svbackblank.binbin0 -> 291 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_svbackcolor.binbin0 -> 428 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_svbacktex1.binbin0 -> 837 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_svbacktex2.binbin0 -> 837 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_svfrontblank.binbin0 -> 306 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_svfrontcolor.binbin0 -> 428 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_svfronttex1.binbin0 -> 836 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_svfronttex2.binbin0 -> 836 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_svside.binbin0 -> 934 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_svsideblank.binbin0 -> 291 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_svsidecolor.binbin0 -> 428 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_svsidetex.binbin0 -> 1167 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_texture.binbin0 -> 593 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_shadowvolume_texture_lighting.binbin0 -> 2756 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_sky.binbin0 -> 951 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_sky_color_banding_fix.binbin0 -> 1538 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_sky_landscape.binbin0 -> 2009 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_sms_mesh.binbin0 -> 6479 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_sms_mesh_pd.binbin0 -> 6496 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_sms_shadow.binbin0 -> 291 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_sms_shadow_pd.binbin0 -> 733 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_sss_deferred_combine.binbin0 -> 3136 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_sss_gbuffer.binbin0 -> 2577 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_sss_linear_depth.binbin0 -> 735 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_sss_unlit.binbin0 -> 1075 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_color_black.binbin0 -> 291 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_color_lighting.binbin0 -> 2114 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_color_texture.binbin0 -> 1032 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_texture.binbin0 -> 593 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_stencil_texture_lighting.binbin0 -> 2454 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_terrain.binbin0 -> 494 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_terrain_render.binbin0 -> 940 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_terrain_render_normal.binbin0 -> 857 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_tree.binbin0 -> 1796 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_update.binbin0 -> 588 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_update_3d.binbin0 -> 770 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_update_cmp.binbin0 -> 620 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_upsample.binbin0 -> 1560 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_vectordisplay_blit.binbin0 -> 799 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_vectordisplay_blur.binbin0 -> 2233 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_vectordisplay_fb.binbin0 -> 790 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_vt_mip.binbin0 -> 1143 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_vt_unlit.binbin0 -> 1673 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_wf_mesh.binbin0 -> 2524 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/fs_wf_wireframe.binbin0 -> 876 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_albedo_output.binbin0 -> 1324 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_assao.binbin0 -> 693 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_assao_gbuffer.binbin0 -> 980 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_bokeh_forward.binbin0 -> 1395 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_bokeh_screenquad.binbin0 -> 701 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_bump.binbin0 -> 1816 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_bump_instanced.binbin0 -> 1990 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_bunnylod.binbin0 -> 886 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_callback.binbin0 -> 873 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_cubes.binbin0 -> 685 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_deferred_combine.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_deferred_debug.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_deferred_debug_line.binbin0 -> 685 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_deferred_geom.binbin0 -> 1837 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_deferred_light.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_denoise_gbuffer.binbin0 -> 1734 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_denoise_screenquad.binbin0 -> 701 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_fsr_forward.binbin0 -> 1368 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_fsr_screenquad.binbin0 -> 701 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_fullscreen.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_gdr_instanced_indirect_rendering.binbin0 -> 1058 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_gdr_render_occlusion.binbin0 -> 928 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_hdr_blur.binbin0 -> 1696 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_hdr_bright.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_hdr_lum.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_hdr_lumavg.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_hdr_mesh.binbin0 -> 1058 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_hdr_skybox.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_hdr_tonemap.binbin0 -> 1721 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_hextile.binbin0 -> 936 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_ibl_mesh.binbin0 -> 1001 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_ibl_skybox.binbin0 -> 1025 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_instancing.binbin0 -> 950 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_mesh.binbin0 -> 1633 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_oit.binbin0 -> 864 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_oit_blit.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_particle.binbin0 -> 1033 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_picking_shaded.binbin0 -> 1299 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_pom.binbin0 -> 1678 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_raymarching.binbin0 -> 842 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_rsm_combine.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_rsm_gbuffer.binbin0 -> 830 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_rsm_lbuffer.binbin0 -> 1800 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_rsm_shadow.binbin0 -> 813 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color.binbin0 -> 540 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting.binbin0 -> 1255 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_csm.binbin0 -> 2075 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_linear.binbin0 -> 1306 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_linear_csm.binbin0 -> 2279 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_linear_omni.binbin0 -> 2217 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_lighting_omni.binbin0 -> 2013 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_color_texture.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_depth.binbin0 -> 540 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_hblur.binbin0 -> 1796 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_packdepth.binbin0 -> 663 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_packdepth_linear.binbin0 -> 673 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_texture.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_texture_lighting.binbin0 -> 1101 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_unpackdepth.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowmaps_vblur.binbin0 -> 1796 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_color_lighting.binbin0 -> 948 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_color_texture.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_svback.binbin0 -> 749 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_svfront.binbin0 -> 540 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_svside.binbin0 -> 1025 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_texture.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_shadowvolume_texture_lighting.binbin0 -> 1101 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_sky.binbin0 -> 2809 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_sky_landscape.binbin0 -> 951 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_sms_mesh.binbin0 -> 1230 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_sms_shadow.binbin0 -> 540 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_sms_shadow_pd.binbin0 -> 663 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_sss_gbuffer.binbin0 -> 1137 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_sss_screenquad.binbin0 -> 701 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_color.binbin0 -> 540 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_color_lighting.binbin0 -> 946 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_color_texture.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_texture.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_stencil_texture_lighting.binbin0 -> 1101 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_terrain.binbin0 -> 808 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_terrain_height_texture.binbin0 -> 1173 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_terrain_render.binbin0 -> 2431 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_tree.binbin0 -> 1232 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_update.binbin0 -> 697 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_vectordisplay_fb.binbin0 -> 842 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_vt_generic.binbin0 -> 765 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_wf_mesh.binbin0 -> 1137 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/metal/vs_wf_wireframe.binbin0 -> 931 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_apply.binbin0 -> 4803 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_generate_importance_map.binbin0 -> 3002 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_generate_q0.binbin0 -> 10617 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_generate_q1.binbin0 -> 14093 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_generate_q2.binbin0 -> 17045 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_generate_q3.binbin0 -> 18692 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_generate_q3base.binbin0 -> 10585 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_load_counter_clear.binbin0 -> 558 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_non_smart_apply.binbin0 -> 2527 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_non_smart_blur.binbin0 -> 3523 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_non_smart_half_apply.binbin0 -> 2175 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_postprocess_importance_map_a.binbin0 -> 2794 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_postprocess_importance_map_b.binbin0 -> 3422 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_prepare_depth_mip.binbin0 -> 5578 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_prepare_depths.binbin0 -> 3201 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_prepare_depths_and_normals.binbin0 -> 15058 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_prepare_depths_and_normals_half.binbin0 -> 9954 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_prepare_depths_half.binbin0 -> 2289 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_smart_blur.binbin0 -> 3851 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_assao_smart_blur_wide.binbin0 -> 5039 bytes-rwxr-xr-x3rdparty/bgfx/examples/runtime/shaders/spirv/cs_drawindirect.binbin0 -> 4227 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_drawindirect_count.binbin0 -> 4593 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_fsr_bilinear_16.binbin0 -> 4216 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_fsr_bilinear_32.binbin0 -> 4216 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_fsr_easu_16.binbin0 -> 66088 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_fsr_easu_32.binbin0 -> 68352 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_fsr_rcas_16.binbin0 -> 17976 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_fsr_rcas_32.binbin0 -> 12984 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_gdr_copy_z.binbin0 -> 1385 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_gdr_downscale_hi_z.binbin0 -> 2183 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_gdr_occlude_props.binbin0 -> 5581 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_gdr_stream_compaction.binbin0 -> 7075 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_indirect.binbin0 -> 1230 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_init_instances.binbin0 -> 10395 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_terrain_init.binbin0 -> 2552 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_terrain_lod.binbin0 -> 12314 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_terrain_update_draw.binbin0 -> 1632 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_terrain_update_indirect.binbin0 -> 1177 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_update.binbin0 -> 1708 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/cs_update_instances.binbin0 -> 3811 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_albedo_output.binbin0 -> 692 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_assao_deferred_combine.binbin0 -> 2708 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_assao_gbuffer.binbin0 -> 1105 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bloom_combine.binbin0 -> 1347 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bokeh_copy.binbin0 -> 744 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bokeh_copy_linear_to_gamma.binbin0 -> 992 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bokeh_dof_combine.binbin0 -> 1629 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bokeh_dof_debug.binbin0 -> 2273 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bokeh_dof_downsample.binbin0 -> 1745 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bokeh_dof_second_pass.binbin0 -> 3722 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bokeh_dof_single_pass.binbin0 -> 4604 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bokeh_forward.binbin0 -> 3572 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bokeh_forward_grid.binbin0 -> 2242 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bokeh_linear_depth.binbin0 -> 1251 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bump.binbin0 -> 5015 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_bunnylod.binbin0 -> 926 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_callback.binbin0 -> 926 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_cubes.binbin0 -> 406 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_deferred_clear_uav.binbin0 -> 624 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_deferred_combine.binbin0 -> 1671 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_deferred_combine_ta.binbin0 -> 1815 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_deferred_debug.binbin0 -> 755 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_deferred_debug_line.binbin0 -> 406 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_deferred_debug_ta.binbin0 -> 1137 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_deferred_geom.binbin0 -> 2513 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_deferred_light.binbin0 -> 2862 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_deferred_light_ta.binbin0 -> 2990 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_deferred_light_uav.binbin0 -> 3148 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_denoise_apply_lighting.binbin0 -> 1367 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_denoise_copy.binbin0 -> 744 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_denoise_deferred_combine.binbin0 -> 2872 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_denoise_gbuffer.binbin0 -> 3902 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_denoise_spatial_3x3.binbin0 -> 4070 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_denoise_spatial_5x5.binbin0 -> 4182 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_denoise_temporal.binbin0 -> 4444 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_denoise_txaa.binbin0 -> 10586 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_downsample.binbin0 -> 3264 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_fsr_copy_linear_to_gamma.binbin0 -> 992 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_fsr_forward.binbin0 -> 3572 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_fsr_forward_grid.binbin0 -> 2242 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_gdr_instanced_indirect_rendering.binbin0 -> 1264 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_hdr_blur.binbin0 -> 2023 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_hdr_bright.binbin0 -> 5033 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_hdr_lum.binbin0 -> 4150 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_hdr_lumavg.binbin0 -> 5614 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_hdr_mesh.binbin0 -> 3118 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_hdr_skybox.binbin0 -> 1762 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_hdr_tonemap.binbin0 -> 4706 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_hextile.binbin0 -> 7895 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_ibl_mesh.binbin0 -> 5864 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_ibl_skybox.binbin0 -> 3456 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_instancing.binbin0 -> 406 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_mesh.binbin0 -> 2695 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_oit.binbin0 -> 584 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_oit_wb.binbin0 -> 1332 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_oit_wb_blit.binbin0 -> 1286 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_oit_wb_separate.binbin0 -> 1104 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_oit_wb_separate_blit.binbin0 -> 1286 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_particle.binbin0 -> 1365 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_picking_id.binbin0 -> 685 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_picking_shaded.binbin0 -> 1482 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_pom.binbin0 -> 4663 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_raymarching.binbin0 -> 10111 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_rsm_combine.binbin0 -> 9314 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_rsm_gbuffer.binbin0 -> 863 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_rsm_lbuffer.binbin0 -> 2644 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_rsm_shadow.binbin0 -> 881 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_screen_space_shadows.binbin0 -> 5197 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_black.binbin0 -> 362 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_esm.binbin0 -> 6588 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_esm_csm.binbin0 -> 11301 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_esm_linear.binbin0 -> 6644 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_esm_linear_csm.binbin0 -> 11525 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_esm_linear_omni.binbin0 -> 9114 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_esm_omni.binbin0 -> 9058 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_hard.binbin0 -> 6404 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_hard_csm.binbin0 -> 10613 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_hard_linear.binbin0 -> 6460 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_hard_linear_csm.binbin0 -> 10837 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_hard_linear_omni.binbin0 -> 8930 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_hard_omni.binbin0 -> 8874 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_pcf.binbin0 -> 16208 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_pcf_csm.binbin0 -> 48485 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_pcf_linear.binbin0 -> 16364 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_pcf_linear_csm.binbin0 -> 49109 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_pcf_linear_omni.binbin0 -> 18870 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_pcf_omni.binbin0 -> 18714 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_vsm.binbin0 -> 6924 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_vsm_csm.binbin0 -> 12765 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_vsm_linear.binbin0 -> 6980 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_vsm_linear_csm.binbin0 -> 12989 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_vsm_linear_omni.binbin0 -> 9450 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_lighting_vsm_omni.binbin0 -> 9394 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_color_texture.binbin0 -> 1613 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_hblur.binbin0 -> 2545 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_hblur_vsm.binbin0 -> 3581 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_packdepth.binbin0 -> 794 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_packdepth_linear.binbin0 -> 682 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_packdepth_vsm.binbin0 -> 1002 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_packdepth_vsm_linear.binbin0 -> 890 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_texture.binbin0 -> 755 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_unpackdepth.binbin0 -> 1357 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_unpackdepth_vsm.binbin0 -> 1345 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_vblur.binbin0 -> 2545 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowmaps_vblur_vsm.binbin0 -> 3581 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_color_lighting.binbin0 -> 4879 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_color_texture.binbin0 -> 1613 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_svbackblank.binbin0 -> 362 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_svbackcolor.binbin0 -> 688 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_svbacktex1.binbin0 -> 1082 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_svbacktex2.binbin0 -> 1082 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_svfrontblank.binbin0 -> 378 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_svfrontcolor.binbin0 -> 688 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_svfronttex1.binbin0 -> 1066 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_svfronttex2.binbin0 -> 1066 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_svside.binbin0 -> 1162 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_svsideblank.binbin0 -> 362 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_svsidecolor.binbin0 -> 688 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_svsidetex.binbin0 -> 1587 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_texture.binbin0 -> 755 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_shadowvolume_texture_lighting.binbin0 -> 5322 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_sky.binbin0 -> 1662 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_sky_color_banding_fix.binbin0 -> 2682 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_sky_landscape.binbin0 -> 3496 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_sms_mesh.binbin0 -> 9025 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_sms_mesh_pd.binbin0 -> 9053 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_sms_shadow.binbin0 -> 362 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_sms_shadow_pd.binbin0 -> 1159 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_sss_deferred_combine.binbin0 -> 4788 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_sss_gbuffer.binbin0 -> 4124 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_sss_linear_depth.binbin0 -> 1267 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_sss_unlit.binbin0 -> 2074 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_stencil_color_black.binbin0 -> 362 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_stencil_color_lighting.binbin0 -> 3985 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_stencil_color_texture.binbin0 -> 1613 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_stencil_texture.binbin0 -> 755 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_stencil_texture_lighting.binbin0 -> 4610 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_terrain.binbin0 -> 666 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_terrain_render.binbin0 -> 1441 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_terrain_render_normal.binbin0 -> 1421 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_tree.binbin0 -> 3127 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_update.binbin0 -> 754 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_update_3d.binbin0 -> 1344 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_update_cmp.binbin0 -> 875 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_upsample.binbin0 -> 2590 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_vectordisplay_blit.binbin0 -> 1306 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_vectordisplay_blur.binbin0 -> 3758 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_vectordisplay_fb.binbin0 -> 1234 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_vt_mip.binbin0 -> 1706 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_vt_unlit.binbin0 -> 2669 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_wf_mesh.binbin0 -> 3761 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/fs_wf_wireframe.binbin0 -> 1605 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_albedo_output.binbin0 -> 1969 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_assao.binbin0 -> 1080 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_assao_gbuffer.binbin0 -> 1896 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_bokeh_forward.binbin0 -> 2576 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_bokeh_screenquad.binbin0 -> 1080 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_bump.binbin0 -> 2990 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_bump_instanced.binbin0 -> 3104 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_bunnylod.binbin0 -> 1590 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_callback.binbin0 -> 1518 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_cubes.binbin0 -> 1060 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_deferred_combine.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_deferred_debug.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_deferred_debug_line.binbin0 -> 1060 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_deferred_geom.binbin0 -> 3302 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_deferred_light.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_denoise_gbuffer.binbin0 -> 3407 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_denoise_screenquad.binbin0 -> 1080 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_fsr_forward.binbin0 -> 2570 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_fsr_screenquad.binbin0 -> 1080 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_fullscreen.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_gdr_instanced_indirect_rendering.binbin0 -> 1529 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_gdr_render_occlusion.binbin0 -> 1301 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_hdr_blur.binbin0 -> 2662 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_hdr_bright.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_hdr_lum.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_hdr_lumavg.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_hdr_mesh.binbin0 -> 1826 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_hdr_skybox.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_hdr_tonemap.binbin0 -> 2438 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_hextile.binbin0 -> 1705 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_ibl_mesh.binbin0 -> 2033 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_ibl_skybox.binbin0 -> 1976 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_instancing.binbin0 -> 1485 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_mesh.binbin0 -> 2671 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_oit.binbin0 -> 1584 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_oit_blit.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_particle.binbin0 -> 1975 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_picking_shaded.binbin0 -> 2103 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_pom.binbin0 -> 3056 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_raymarching.binbin0 -> 1270 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_rsm_combine.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_rsm_gbuffer.binbin0 -> 1634 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_rsm_lbuffer.binbin0 -> 2779 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_rsm_shadow.binbin0 -> 1494 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_color.binbin0 -> 886 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_color_lighting.binbin0 -> 2355 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_color_lighting_csm.binbin0 -> 3640 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_color_lighting_linear.binbin0 -> 2435 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_color_lighting_linear_csm.binbin0 -> 3912 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_color_lighting_linear_omni.binbin0 -> 3723 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_color_lighting_omni.binbin0 -> 3451 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_color_texture.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_depth.binbin0 -> 886 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_hblur.binbin0 -> 2599 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_packdepth.binbin0 -> 974 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_packdepth_linear.binbin0 -> 1054 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_texture.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_texture_lighting.binbin0 -> 1944 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_unpackdepth.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowmaps_vblur.binbin0 -> 2599 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowvolume_color_lighting.binbin0 -> 1738 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowvolume_color_texture.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowvolume_svback.binbin0 -> 1268 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowvolume_svfront.binbin0 -> 886 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowvolume_svside.binbin0 -> 1618 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowvolume_texture.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_shadowvolume_texture_lighting.binbin0 -> 1944 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_sky.binbin0 -> 4603 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_sky_landscape.binbin0 -> 1772 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_sms_mesh.binbin0 -> 2199 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_sms_shadow.binbin0 -> 886 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_sms_shadow_pd.binbin0 -> 974 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_sss_gbuffer.binbin0 -> 2088 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_sss_screenquad.binbin0 -> 1080 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_stencil_color.binbin0 -> 886 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_stencil_color_lighting.binbin0 -> 1736 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_stencil_color_texture.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_stencil_texture.binbin0 -> 1096 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_stencil_texture_lighting.binbin0 -> 1944 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_terrain.binbin0 -> 1200 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_terrain_height_texture.binbin0 -> 1630 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_terrain_render.binbin0 -> 3981 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_tree.binbin0 -> 2100 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_update.binbin0 -> 1064 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_vectordisplay_fb.binbin0 -> 1270 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_vt_generic.binbin0 -> 1413 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_wf_mesh.binbin0 -> 2171 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/shaders/spirv/vs_wf_wireframe.binbin0 -> 1737 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/temp/.gitignore1
-rw-r--r--3rdparty/bgfx/examples/runtime/text/sherlock_holmes_a_scandal_in_bohemia_arthur_conan_doyle.txt1136
-rw-r--r--3rdparty/bgfx/examples/runtime/textures/8k_mars.jpgbin0 -> 9926628 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/aerial_rocks_04_diff_2k.ktxbin0 -> 16777327 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/bark1.ddsbin0 -> 174904 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/bolonga_irr.ddsbin0 -> 786580 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/bolonga_lod.ddsbin0 -> 4194436 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/dmap.pngbin0 -> 18992911 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/fieldstone-n.ddsbin0 -> 349680 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/fieldstone-rgba.ddsbin0 -> 349680 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/figure-rgba.ddsbin0 -> 174904 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/flare.ddsbin0 -> 349680 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/kyoto_irr.ddsbin0 -> 786580 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/kyoto_lod.ddsbin0 -> 4194436 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/leafs1.ddsbin0 -> 1398256 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/lightmap.ktxbin0 -> 1048644 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/msdf.pngbin0 -> 2688 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/parallax-d.ktxbin0 -> 87508 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/parallax-h.ktxbin0 -> 65604 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/parallax-n.ktxbin0 -> 87508 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/particle.ktxbin0 -> 262212 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/pf_alpha_test.ddsbin0 -> 262272 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/pf_uv_filtering_test.ddsbin0 -> 65664 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_10x10.ddsbin0 -> 4000 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_10x5.ddsbin0 -> 7648 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_10x6.ddsbin0 -> 6496 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_10x8.ddsbin0 -> 4736 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_12x10.ddsbin0 -> 3408 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_12x12.ddsbin0 -> 2912 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_4x4.ddsbin0 -> 22000 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_5x4.ddsbin0 -> 18032 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_5x5.ddsbin0 -> 14800 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_6x5.ddsbin0 -> 12544 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_6x6.ddsbin0 -> 10640 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_8x5.ddsbin0 -> 9104 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_8x6.ddsbin0 -> 7728 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_astc_8x8.ddsbin0 -> 5632 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_atc.ddsbin0 -> 11064 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_atce.ddsbin0 -> 22000 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_atci.ddsbin0 -> 22000 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_bc1.ktxbin0 -> 11032 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_bc2.ktxbin0 -> 21968 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_bc3.ktxbin0 -> 21968 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_bc7.ktxbin0 -> 21968 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_etc1.ktxbin0 -> 11032 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_etc2.ktxbin0 -> 11032 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_ptc12.pvrbin0 -> 4148 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_ptc14.pvrbin0 -> 8244 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_ptc22.pvrbin0 -> 4148 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_ptc24.pvrbin0 -> 8244 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/texture_compression_rgba8.ddsbin0 -> 65664 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/textures/uffizi.ktxbin0 -> 12582980 bytes-rw-r--r--3rdparty/bgfx/examples/runtime/tvos-info.plist30
-rw-r--r--3rdparty/bgfx/include/bgfx/bgfx.h4256
-rw-r--r--3rdparty/bgfx/include/bgfx/c99/bgfx.h3841
-rw-r--r--3rdparty/bgfx/include/bgfx/defines.h621
-rw-r--r--3rdparty/bgfx/include/bgfx/embedded_shader.h165
-rw-r--r--3rdparty/bgfx/include/bgfx/platform.h136
-rw-r--r--3rdparty/bgfx/makefile366
-rw-r--r--3rdparty/bgfx/scripts/bgfx-codegen.lua330
-rw-r--r--3rdparty/bgfx/scripts/bgfx.doxygen1808
-rw-r--r--3rdparty/bgfx/scripts/bgfx.idl3206
-rw-r--r--3rdparty/bgfx/scripts/bgfx.lua352
-rw-r--r--3rdparty/bgfx/scripts/bgfx.natvis131
-rw-r--r--3rdparty/bgfx/scripts/bindings-bf.lua420
-rw-r--r--3rdparty/bgfx/scripts/bindings-cs.lua454
-rw-r--r--3rdparty/bgfx/scripts/bindings-d.lua448
-rw-r--r--3rdparty/bgfx/scripts/bindings-zig.lua491
-rw-r--r--3rdparty/bgfx/scripts/build.ninja100
-rw-r--r--3rdparty/bgfx/scripts/codegen.lua996
-rw-r--r--3rdparty/bgfx/scripts/doxygen.lua19
-rw-r--r--3rdparty/bgfx/scripts/example-common.lua97
-rw-r--r--3rdparty/bgfx/scripts/genie.lua586
-rw-r--r--3rdparty/bgfx/scripts/geometryc.lua46
-rw-r--r--3rdparty/bgfx/scripts/geometryv.lua163
-rw-r--r--3rdparty/bgfx/scripts/idl.lua247
-rw-r--r--3rdparty/bgfx/scripts/shader-embeded.mk81
-rw-r--r--3rdparty/bgfx/scripts/shader.mk181
-rw-r--r--3rdparty/bgfx/scripts/shaderc.lua680
-rw-r--r--3rdparty/bgfx/scripts/temp.bgfx.h139
-rw-r--r--3rdparty/bgfx/scripts/temp.bgfx.idl.inl101
-rw-r--r--3rdparty/bgfx/scripts/temp.defines.h103
-rw-r--r--3rdparty/bgfx/scripts/texturec.lua44
-rw-r--r--3rdparty/bgfx/scripts/texturev.lua163
-rw-r--r--3rdparty/bgfx/scripts/tools.mk29
-rw-r--r--3rdparty/bgfx/src/amalgamated.cpp28
-rw-r--r--3rdparty/bgfx/src/amalgamated.mm9
-rw-r--r--3rdparty/bgfx/src/bgfx.cpp5899
-rw-r--r--3rdparty/bgfx/src/bgfx.idl.inl1476
-rw-r--r--3rdparty/bgfx/src/bgfx_compute.sh327
-rw-r--r--3rdparty/bgfx/src/bgfx_p.h5369
-rw-r--r--3rdparty/bgfx/src/bgfx_shader.sh700
-rw-r--r--3rdparty/bgfx/src/charset.h524
-rw-r--r--3rdparty/bgfx/src/config.h398
-rw-r--r--3rdparty/bgfx/src/debug_renderdoc.cpp171
-rw-r--r--3rdparty/bgfx/src/debug_renderdoc.h17
-rw-r--r--3rdparty/bgfx/src/dxgi.cpp824
-rw-r--r--3rdparty/bgfx/src/dxgi.h122
-rw-r--r--3rdparty/bgfx/src/emscripten.h33
-rw-r--r--3rdparty/bgfx/src/fs_clear0.bin.h142
-rw-r--r--3rdparty/bgfx/src/fs_clear0.sc13
-rw-r--r--3rdparty/bgfx/src/fs_clear1.bin.h167
-rw-r--r--3rdparty/bgfx/src/fs_clear1.sc14
-rw-r--r--3rdparty/bgfx/src/fs_clear2.bin.h190
-rw-r--r--3rdparty/bgfx/src/fs_clear2.sc15
-rw-r--r--3rdparty/bgfx/src/fs_clear3.bin.h214
-rw-r--r--3rdparty/bgfx/src/fs_clear3.sc16
-rw-r--r--3rdparty/bgfx/src/fs_clear4.bin.h235
-rw-r--r--3rdparty/bgfx/src/fs_clear4.sc17
-rw-r--r--3rdparty/bgfx/src/fs_clear5.bin.h259
-rw-r--r--3rdparty/bgfx/src/fs_clear5.sc18
-rw-r--r--3rdparty/bgfx/src/fs_clear6.bin.h281
-rw-r--r--3rdparty/bgfx/src/fs_clear6.sc19
-rw-r--r--3rdparty/bgfx/src/fs_clear7.bin.h305
-rw-r--r--3rdparty/bgfx/src/fs_clear7.sc20
-rw-r--r--3rdparty/bgfx/src/fs_debugfont.bin.h250
-rw-r--r--3rdparty/bgfx/src/fs_debugfont.sc20
-rw-r--r--3rdparty/bgfx/src/glcontext_eagl.h62
-rw-r--r--3rdparty/bgfx/src/glcontext_eagl.mm375
-rw-r--r--3rdparty/bgfx/src/glcontext_egl.cpp663
-rw-r--r--3rdparty/bgfx/src/glcontext_egl.h83
-rw-r--r--3rdparty/bgfx/src/glcontext_html5.cpp240
-rw-r--r--3rdparty/bgfx/src/glcontext_html5.h50
-rw-r--r--3rdparty/bgfx/src/glcontext_nsgl.h51
-rw-r--r--3rdparty/bgfx/src/glcontext_nsgl.mm394
-rw-r--r--3rdparty/bgfx/src/glcontext_wgl.cpp425
-rw-r--r--3rdparty/bgfx/src/glcontext_wgl.h103
-rw-r--r--3rdparty/bgfx/src/glimports.h726
-rw-r--r--3rdparty/bgfx/src/makefile83
-rw-r--r--3rdparty/bgfx/src/nvapi.cpp373
-rw-r--r--3rdparty/bgfx/src/nvapi.h84
-rw-r--r--3rdparty/bgfx/src/renderer.h544
-rw-r--r--3rdparty/bgfx/src/renderer_agc.cpp20
-rw-r--r--3rdparty/bgfx/src/renderer_d3d.h228
-rw-r--r--3rdparty/bgfx/src/renderer_d3d11.cpp6694
-rw-r--r--3rdparty/bgfx/src/renderer_d3d11.h441
-rw-r--r--3rdparty/bgfx/src/renderer_d3d12.cpp7474
-rw-r--r--3rdparty/bgfx/src/renderer_d3d12.h581
-rw-r--r--3rdparty/bgfx/src/renderer_d3d9.cpp4606
-rw-r--r--3rdparty/bgfx/src/renderer_d3d9.h513
-rw-r--r--3rdparty/bgfx/src/renderer_gl.cpp8841
-rw-r--r--3rdparty/bgfx/src/renderer_gl.h1748
-rw-r--r--3rdparty/bgfx/src/renderer_gnm.cpp46
-rw-r--r--3rdparty/bgfx/src/renderer_mtl.h1194
-rw-r--r--3rdparty/bgfx/src/renderer_mtl.mm5138
-rw-r--r--3rdparty/bgfx/src/renderer_noop.cpp286
-rw-r--r--3rdparty/bgfx/src/renderer_nvn.cpp46
-rw-r--r--3rdparty/bgfx/src/renderer_vk.cpp9260
-rw-r--r--3rdparty/bgfx/src/renderer_vk.h874
-rw-r--r--3rdparty/bgfx/src/renderer_webgpu.cpp5019
-rw-r--r--3rdparty/bgfx/src/renderer_webgpu.h570
-rw-r--r--3rdparty/bgfx/src/shader.cpp275
-rw-r--r--3rdparty/bgfx/src/shader.h70
-rw-r--r--3rdparty/bgfx/src/shader_dx9bc.cpp755
-rw-r--r--3rdparty/bgfx/src/shader_dx9bc.h268
-rw-r--r--3rdparty/bgfx/src/shader_dxbc.cpp2262
-rw-r--r--3rdparty/bgfx/src/shader_dxbc.h769
-rw-r--r--3rdparty/bgfx/src/shader_spirv.cpp1215
-rw-r--r--3rdparty/bgfx/src/shader_spirv.h662
-rw-r--r--3rdparty/bgfx/src/topology.cpp445
-rw-r--r--3rdparty/bgfx/src/topology.h56
-rw-r--r--3rdparty/bgfx/src/varying.def.sc10
-rw-r--r--3rdparty/bgfx/src/version.h13
-rw-r--r--3rdparty/bgfx/src/vertexlayout.cpp828
-rw-r--r--3rdparty/bgfx/src/vertexlayout.h46
-rw-r--r--3rdparty/bgfx/src/vs_clear.bin.h180
-rw-r--r--3rdparty/bgfx/src/vs_clear.sc15
-rw-r--r--3rdparty/bgfx/src/vs_debugfont.bin.h304
-rw-r--r--3rdparty/bgfx/src/vs_debugfont.sc17
-rw-r--r--3rdparty/bgfx/tools/bin/darwin/.gitignore1
-rw-r--r--3rdparty/bgfx/tools/bin/linux/.gitignore1
-rw-r--r--3rdparty/bgfx/tools/bin/windows/.gitignore1
-rw-r--r--3rdparty/bgfx/tools/geometryc/geometryc.cpp1465
-rw-r--r--3rdparty/bgfx/tools/geometryv/fs_mesh.bin.h525
-rw-r--r--3rdparty/bgfx/tools/geometryv/fs_mesh.sc64
-rw-r--r--3rdparty/bgfx/tools/geometryv/geometryv.cpp1332
-rw-r--r--3rdparty/bgfx/tools/geometryv/makefile6
-rw-r--r--3rdparty/bgfx/tools/geometryv/varying.def.sc4
-rw-r--r--3rdparty/bgfx/tools/geometryv/vs_mesh.bin.h298
-rw-r--r--3rdparty/bgfx/tools/geometryv/vs_mesh.sc17
-rw-r--r--3rdparty/bgfx/tools/shaderc/shaderc.cpp2863
-rw-r--r--3rdparty/bgfx/tools/shaderc/shaderc.h132
-rw-r--r--3rdparty/bgfx/tools/shaderc/shaderc_glsl.cpp402
-rw-r--r--3rdparty/bgfx/tools/shaderc/shaderc_hlsl.cpp851
-rw-r--r--3rdparty/bgfx/tools/shaderc/shaderc_metal.cpp700
-rw-r--r--3rdparty/bgfx/tools/shaderc/shaderc_pssl.cpp22
-rw-r--r--3rdparty/bgfx/tools/shaderc/shaderc_spirv.cpp883
-rw-r--r--3rdparty/bgfx/tools/texturev/common.sh131
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture.bin.h1035
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture.sc19
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture_3d.bin.h1054
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture_3d.sc18
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture_array.bin.h383
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture_array.sc16
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture_cube.bin.h1130
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture_cube.sc23
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture_cube2.bin.h1032
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture_cube2.sc19
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture_msdf.bin.h334
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture_msdf.sc25
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture_sdf.bin.h338
-rw-r--r--3rdparty/bgfx/tools/texturev/fs_texture_sdf.sc23
-rw-r--r--3rdparty/bgfx/tools/texturev/makefile6
-rw-r--r--3rdparty/bgfx/tools/texturev/texturev.cpp2304
-rw-r--r--3rdparty/bgfx/tools/texturev/varying.def.sc6
-rw-r--r--3rdparty/bgfx/tools/texturev/vs_texture.bin.h264
-rw-r--r--3rdparty/bgfx/tools/texturev/vs_texture.sc16
-rw-r--r--3rdparty/bgfx/tools/texturev/vs_texture_cube.bin.h266
-rw-r--r--3rdparty/bgfx/tools/texturev/vs_texture_cube.sc16
-rw-r--r--3rdparty/bimg/.appveyor.yml20
-rw-r--r--3rdparty/bimg/.editorconfig14
-rw-r--r--3rdparty/bimg/.gitattributes11
-rw-r--r--3rdparty/bimg/.gitignore7
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/LICENSE.txt175
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/include/astcenc.h834
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_averages_and_directions.cpp995
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_block_sizes.cpp1210
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_color_quantize.cpp2071
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_color_unquantize.cpp941
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_compress_symbolic.cpp1459
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_compute_variance.cpp472
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_decompress_symbolic.cpp623
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_diagnostic_trace.cpp230
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_diagnostic_trace.h219
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_entry.cpp1442
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_find_best_partitioning.cpp776
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_ideal_endpoints_and_weights.cpp1656
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_image.cpp558
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_integer_sequence.cpp744
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_internal.h2185
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_internal_entry.h273
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_mathlib.cpp48
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_mathlib.h478
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_mathlib_softfloat.cpp411
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_partition_tables.cpp461
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_percentile_tables.cpp1251
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_pick_best_endpoint_format.cpp1357
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_platform_isa_detection.cpp166
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_quantization.cpp904
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_symbolic_physical.cpp530
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_vecmathlib.h570
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_vecmathlib_avx2_8.h1204
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_vecmathlib_common_4.h423
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_vecmathlib_neon_4.h1073
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_vecmathlib_none_4.h1169
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_vecmathlib_sse_4.h1283
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_weight_align.cpp479
-rw-r--r--3rdparty/bimg/3rdparty/astc-encoder/source/astcenc_weight_quant_xfer_tables.cpp159
-rw-r--r--3rdparty/bimg/3rdparty/edtaa3/LICENSE.md34
-rw-r--r--3rdparty/bimg/3rdparty/edtaa3/edtaa3func.cpp580
-rw-r--r--3rdparty/bimg/3rdparty/edtaa3/edtaa3func.h7
-rw-r--r--3rdparty/bimg/3rdparty/etc1/LICENSE161
-rw-r--r--3rdparty/bimg/3rdparty/etc1/etc1.cpp686
-rw-r--r--3rdparty/bimg/3rdparty/etc1/etc1.h114
-rw-r--r--3rdparty/bimg/3rdparty/etc2/LICENSE.txt24
-rw-r--r--3rdparty/bimg/3rdparty/etc2/Math.hpp90
-rw-r--r--3rdparty/bimg/3rdparty/etc2/ProcessCommon.hpp51
-rw-r--r--3rdparty/bimg/3rdparty/etc2/ProcessRGB.cpp719
-rw-r--r--3rdparty/bimg/3rdparty/etc2/ProcessRGB.hpp9
-rw-r--r--3rdparty/bimg/3rdparty/etc2/Tables.cpp109
-rw-r--r--3rdparty/bimg/3rdparty/etc2/Tables.hpp25
-rw-r--r--3rdparty/bimg/3rdparty/etc2/Types.hpp17
-rw-r--r--3rdparty/bimg/3rdparty/etc2/Vector.hpp222
-rw-r--r--3rdparty/bimg/3rdparty/iqa/LICENSE32
-rw-r--r--3rdparty/bimg/3rdparty/iqa/README.txt36
-rw-r--r--3rdparty/bimg/3rdparty/iqa/include/convolve.h111
-rw-r--r--3rdparty/bimg/3rdparty/iqa/include/decimate.h55
-rw-r--r--3rdparty/bimg/3rdparty/iqa/include/iqa.h134
-rw-r--r--3rdparty/bimg/3rdparty/iqa/include/iqa_os.h68
-rw-r--r--3rdparty/bimg/3rdparty/iqa/include/math_utils.h64
-rw-r--r--3rdparty/bimg/3rdparty/iqa/include/ssim.h117
-rw-r--r--3rdparty/bimg/3rdparty/iqa/source/convolve.c195
-rw-r--r--3rdparty/bimg/3rdparty/iqa/source/decimate.c59
-rw-r--r--3rdparty/bimg/3rdparty/iqa/source/math_utils.c82
-rw-r--r--3rdparty/bimg/3rdparty/iqa/source/ms_ssim.c277
-rw-r--r--3rdparty/bimg/3rdparty/iqa/source/mse.c50
-rw-r--r--3rdparty/bimg/3rdparty/iqa/source/psnr.c42
-rw-r--r--3rdparty/bimg/3rdparty/iqa/source/ssim.c322
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/LICENSE20
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/README35
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/alpha.cpp350
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/alpha.h41
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/clusterfit.cpp392
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/clusterfit.h61
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/colourblock.cpp214
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/colourblock.h41
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/colourfit.cpp54
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/colourfit.h56
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/colourset.cpp121
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/colourset.h58
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/config.h49
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/maths.cpp259
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/maths.h233
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/rangefit.cpp201
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/rangefit.h54
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/simd.h32
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/simd_float.h183
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/singlecolourfit.cpp172
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/singlecolourfit.h58
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/singlecolourlookup.inl1064
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/squish.cpp260
-rw-r--r--3rdparty/bimg/3rdparty/libsquish/squish.h269
-rw-r--r--3rdparty/bimg/3rdparty/lodepng/LICENSE21
-rw-r--r--3rdparty/bimg/3rdparty/lodepng/lodepng.cpp6410
-rw-r--r--3rdparty/bimg/3rdparty/lodepng/lodepng.h1945
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/NVIDIA_Texture_Tools_LICENSE.txt24
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc6h/bits.h75
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc6h/shapes_two.h133
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc6h/tile.h82
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc6h/zoh.cpp197
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc6h/zoh.h65
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc6h/zoh_utils.cpp324
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc6h/zoh_utils.h72
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc6h/zohone.cpp799
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc6h/zohtwo.cpp883
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/avpcl.cpp264
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/avpcl.h99
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/avpcl_mode0.cpp1066
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/avpcl_mode1.cpp1047
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/avpcl_mode2.cpp1004
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/avpcl_mode3.cpp1059
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/avpcl_mode4.cpp1214
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/avpcl_mode5.cpp1216
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/avpcl_mode6.cpp1055
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/avpcl_mode7.cpp1094
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/avpcl_utils.cpp389
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/avpcl_utils.h61
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/bits.h76
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/endpts.h81
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/shapes_three.h132
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/shapes_two.h133
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/bc7/tile.h41
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/array.h181
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/array.inl437
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/debug.h216
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/defsgnucdarwin.h57
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/defsgnuclinux.h63
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/defsgnucwin32.h65
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/defsvcwin32.h94
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/foreach.h68
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/hash.h83
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/memory.h30
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/nvcore.h369
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/posh.h1037
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/stdstream.h459
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/stream.h163
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/strlib.h429
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvcore/utils.h281
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvmath/fitting.cpp1200
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvmath/fitting.h49
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvmath/matrix.h112
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvmath/matrix.inl1274
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvmath/nvmath.h61
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvmath/plane.h40
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvmath/plane.inl49
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvmath/vector.h148
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvmath/vector.inl921
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvtt.cpp102
-rw-r--r--3rdparty/bimg/3rdparty/nvtt/nvtt.h13
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/AlphaBitmap.h20
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/BitScale.cpp183
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/BitScale.h28
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/BitUtility.h19
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/Bitmap.h36
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/ColorRgba.h152
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/Interval.h21
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/LICENSE.TXT25
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/MortonTable.cpp43
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/MortonTable.h18
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/Point2.h17
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/PvrTcDecoder.cpp144
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/PvrTcDecoder.h25
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/PvrTcEncoder.cpp464
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/PvrTcEncoder.h43
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/PvrTcPacket.cpp209
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/PvrTcPacket.h65
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/README.md17
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/RgbBitmap.h25
-rw-r--r--3rdparty/bimg/3rdparty/pvrtc/RgbaBitmap.h24
-rw-r--r--3rdparty/bimg/3rdparty/stb/stb_image.h7762
-rw-r--r--3rdparty/bimg/3rdparty/stb/stb_image_resize.h2631
-rw-r--r--3rdparty/bimg/3rdparty/stb/stb_image_write.h1690
-rw-r--r--3rdparty/bimg/3rdparty/tinyexr/README.md568
-rw-r--r--3rdparty/bimg/3rdparty/tinyexr/deps/miniz/ChangeLog.md196
-rw-r--r--3rdparty/bimg/3rdparty/tinyexr/deps/miniz/LICENSE22
-rw-r--r--3rdparty/bimg/3rdparty/tinyexr/deps/miniz/miniz.c7733
-rw-r--r--3rdparty/bimg/3rdparty/tinyexr/deps/miniz/miniz.h1350
-rw-r--r--3rdparty/bimg/3rdparty/tinyexr/deps/miniz/readme.md34
-rw-r--r--3rdparty/bimg/3rdparty/tinyexr/tinyexr.h8533
-rw-r--r--3rdparty/bimg/LICENSE22
-rw-r--r--3rdparty/bimg/README.md46
-rw-r--r--3rdparty/bimg/include/bimg/bimg.h675
-rw-r--r--3rdparty/bimg/include/bimg/decode.h24
-rw-r--r--3rdparty/bimg/include/bimg/encode.h180
-rw-r--r--3rdparty/bimg/makefile306
-rw-r--r--3rdparty/bimg/scripts/bimg.lua39
-rw-r--r--3rdparty/bimg/scripts/bimg_decode.lua27
-rw-r--r--3rdparty/bimg/scripts/bimg_encode.lua65
-rw-r--r--3rdparty/bimg/scripts/genie.lua74
-rw-r--r--3rdparty/bimg/scripts/texturec.lua39
-rw-r--r--3rdparty/bimg/src/bimg_p.h128
-rw-r--r--3rdparty/bimg/src/config.h59
-rw-r--r--3rdparty/bimg/src/image.cpp5958
-rw-r--r--3rdparty/bimg/src/image_cubemap_filter.cpp1228
-rw-r--r--3rdparty/bimg/src/image_decode.cpp864
-rw-r--r--3rdparty/bimg/src/image_encode.cpp702
-rw-r--r--3rdparty/bimg/src/image_gnf.cpp37
-rw-r--r--3rdparty/bimg/tools/texturec/texturec.cpp1385
-rw-r--r--3rdparty/bx/.appveyor.yml19
-rw-r--r--3rdparty/bx/.editorconfig14
-rw-r--r--3rdparty/bx/.gitattributes11
-rw-r--r--3rdparty/bx/.gitignore7
-rw-r--r--3rdparty/bx/3rdparty/.editorconfig6
-rw-r--r--3rdparty/bx/3rdparty/catch/catch_amalgamated.cpp10360
-rw-r--r--3rdparty/bx/3rdparty/catch/catch_amalgamated.hpp12233
-rw-r--r--3rdparty/bx/3rdparty/ini/README.md1
-rw-r--r--3rdparty/bx/3rdparty/ini/ini.h1056
-rw-r--r--3rdparty/bx/3rdparty/ini/ini.md333
-rw-r--r--3rdparty/bx/LICENSE22
-rw-r--r--3rdparty/bx/README.md46
-rw-r--r--3rdparty/bx/include/bx/allocator.h175
-rw-r--r--3rdparty/bx/include/bx/bounds.h526
-rw-r--r--3rdparty/bx/include/bx/bx.h248
-rw-r--r--3rdparty/bx/include/bx/commandline.h78
-rw-r--r--3rdparty/bx/include/bx/config.h23
-rw-r--r--3rdparty/bx/include/bx/constants.h70
-rw-r--r--3rdparty/bx/include/bx/cpu.h68
-rw-r--r--3rdparty/bx/include/bx/debug.h38
-rw-r--r--3rdparty/bx/include/bx/easing.h1193
-rw-r--r--3rdparty/bx/include/bx/endian.h50
-rw-r--r--3rdparty/bx/include/bx/error.h130
-rw-r--r--3rdparty/bx/include/bx/file.h143
-rw-r--r--3rdparty/bx/include/bx/filepath.h120
-rw-r--r--3rdparty/bx/include/bx/float4x4_t.h48
-rw-r--r--3rdparty/bx/include/bx/handlealloc.h322
-rw-r--r--3rdparty/bx/include/bx/hash.h129
-rw-r--r--3rdparty/bx/include/bx/inline/allocator.inl108
-rw-r--r--3rdparty/bx/include/bx/inline/bounds.inl257
-rw-r--r--3rdparty/bx/include/bx/inline/bx.inl150
-rw-r--r--3rdparty/bx/include/bx/inline/cpu.inl358
-rw-r--r--3rdparty/bx/include/bx/inline/easing.inl270
-rw-r--r--3rdparty/bx/include/bx/inline/endian.inl78
-rw-r--r--3rdparty/bx/include/bx/inline/error.inl132
-rw-r--r--3rdparty/bx/include/bx/inline/float4x4_t.inl239
-rw-r--r--3rdparty/bx/include/bx/inline/handlealloc.inl708
-rw-r--r--3rdparty/bx/include/bx/inline/hash.inl125
-rw-r--r--3rdparty/bx/include/bx/inline/math.inl1310
-rw-r--r--3rdparty/bx/include/bx/inline/mpscqueue.inl67
-rw-r--r--3rdparty/bx/include/bx/inline/mutex.inl23
-rw-r--r--3rdparty/bx/include/bx/inline/os.inl18
-rw-r--r--3rdparty/bx/include/bx/inline/pixelformat.inl982
-rw-r--r--3rdparty/bx/include/bx/inline/readerwriter.inl470
-rw-r--r--3rdparty/bx/include/bx/inline/ringbuffer.inl275
-rw-r--r--3rdparty/bx/include/bx/inline/rng.inl149
-rw-r--r--3rdparty/bx/include/bx/inline/simd128_langext.inl676
-rw-r--r--3rdparty/bx/include/bx/inline/simd128_neon.inl706
-rw-r--r--3rdparty/bx/include/bx/inline/simd128_ref.inl833
-rw-r--r--3rdparty/bx/include/bx/inline/simd128_sse.inl650
-rw-r--r--3rdparty/bx/include/bx/inline/simd128_swizzle.inl266
-rw-r--r--3rdparty/bx/include/bx/inline/simd256_avx.inl74
-rw-r--r--3rdparty/bx/include/bx/inline/simd256_ref.inl84
-rw-r--r--3rdparty/bx/include/bx/inline/simd_ni.inl562
-rw-r--r--3rdparty/bx/include/bx/inline/sort.inl394
-rw-r--r--3rdparty/bx/include/bx/inline/spscqueue.inl165
-rw-r--r--3rdparty/bx/include/bx/inline/string.inl312
-rw-r--r--3rdparty/bx/include/bx/inline/typetraits.inl462
-rw-r--r--3rdparty/bx/include/bx/inline/uint32_t.inl891
-rw-r--r--3rdparty/bx/include/bx/macros.h284
-rw-r--r--3rdparty/bx/include/bx/maputil.h58
-rw-r--r--3rdparty/bx/include/bx/math.h749
-rw-r--r--3rdparty/bx/include/bx/mpscqueue.h76
-rw-r--r--3rdparty/bx/include/bx/mutex.h60
-rw-r--r--3rdparty/bx/include/bx/os.h65
-rw-r--r--3rdparty/bx/include/bx/pixelformat.h252
-rw-r--r--3rdparty/bx/include/bx/platform.h464
-rw-r--r--3rdparty/bx/include/bx/process.h75
-rw-r--r--3rdparty/bx/include/bx/readerwriter.h353
-rw-r--r--3rdparty/bx/include/bx/ringbuffer.h181
-rw-r--r--3rdparty/bx/include/bx/rng.h81
-rw-r--r--3rdparty/bx/include/bx/semaphore.h39
-rw-r--r--3rdparty/bx/include/bx/settings.h61
-rw-r--r--3rdparty/bx/include/bx/simd_t.h565
-rw-r--r--3rdparty/bx/include/bx/sort.h335
-rw-r--r--3rdparty/bx/include/bx/spscqueue.h148
-rw-r--r--3rdparty/bx/include/bx/string.h378
-rw-r--r--3rdparty/bx/include/bx/thread.h101
-rw-r--r--3rdparty/bx/include/bx/timer.h21
-rw-r--r--3rdparty/bx/include/bx/typetraits.h285
-rw-r--r--3rdparty/bx/include/bx/uint32_t.h302
-rw-r--r--3rdparty/bx/include/bx/url.h52
-rw-r--r--3rdparty/bx/include/compat/freebsd/alloca.h5
-rw-r--r--3rdparty/bx/include/compat/freebsd/dirent.h1
-rw-r--r--3rdparty/bx/include/compat/freebsd/malloc.h1
-rw-r--r--3rdparty/bx/include/compat/freebsd/signal.h5
-rw-r--r--3rdparty/bx/include/compat/ios/malloc.h1
-rw-r--r--3rdparty/bx/include/compat/linux/sal.h1
-rw-r--r--3rdparty/bx/include/compat/mingw/alloca.h6
-rw-r--r--3rdparty/bx/include/compat/mingw/dirent.h5
-rw-r--r--3rdparty/bx/include/compat/mingw/sal.h1
-rw-r--r--3rdparty/bx/include/compat/mingw/salieri.h1623
-rw-r--r--3rdparty/bx/include/compat/mingw/specstrings_strict.h1
-rw-r--r--3rdparty/bx/include/compat/mingw/specstrings_undef.h2
-rw-r--r--3rdparty/bx/include/compat/msvc/alloca.h1
-rw-r--r--3rdparty/bx/include/compat/msvc/dirent.h1234
-rw-r--r--3rdparty/bx/include/compat/msvc/inttypes.h306
-rw-r--r--3rdparty/bx/include/compat/msvc/pre1600/stdint.h276
-rw-r--r--3rdparty/bx/include/compat/msvc/stdbool.h47
-rw-r--r--3rdparty/bx/include/compat/osx/malloc.h2
-rw-r--r--3rdparty/bx/include/tinystl/LICENSE23
-rw-r--r--3rdparty/bx/include/tinystl/allocator.h50
-rw-r--r--3rdparty/bx/include/tinystl/buffer.h287
-rw-r--r--3rdparty/bx/include/tinystl/hash.h53
-rw-r--r--3rdparty/bx/include/tinystl/hash_base.h234
-rw-r--r--3rdparty/bx/include/tinystl/new.h43
-rw-r--r--3rdparty/bx/include/tinystl/stddef.h40
-rw-r--r--3rdparty/bx/include/tinystl/string.h246
-rw-r--r--3rdparty/bx/include/tinystl/traits.h85
-rw-r--r--3rdparty/bx/include/tinystl/unordered_map.h240
-rw-r--r--3rdparty/bx/include/tinystl/unordered_set.h215
-rw-r--r--3rdparty/bx/include/tinystl/vector.h322
-rw-r--r--3rdparty/bx/makefile246
-rw-r--r--3rdparty/bx/scripts/bin2c.lua35
-rw-r--r--3rdparty/bx/scripts/bx.lua105
-rw-r--r--3rdparty/bx/scripts/bx.natvis10
-rw-r--r--3rdparty/bx/scripts/genie.lua148
-rw-r--r--3rdparty/bx/scripts/lemon.lua22
-rw-r--r--3rdparty/bx/scripts/tinystl.natvis72
-rw-r--r--3rdparty/bx/scripts/toolchain.lua1170
-rw-r--r--3rdparty/bx/src/allocator.cpp74
-rw-r--r--3rdparty/bx/src/amalgamated.cpp27
-rw-r--r--3rdparty/bx/src/bounds.cpp2039
-rw-r--r--3rdparty/bx/src/bx.cpp199
-rw-r--r--3rdparty/bx/src/commandline.cpp334
-rw-r--r--3rdparty/bx/src/crtnone.cpp715
-rw-r--r--3rdparty/bx/src/debug.cpp201
-rw-r--r--3rdparty/bx/src/dtoa.cpp1158
-rw-r--r--3rdparty/bx/src/easing.cpp63
-rw-r--r--3rdparty/bx/src/file.cpp958
-rw-r--r--3rdparty/bx/src/filepath.cpp407
-rw-r--r--3rdparty/bx/src/hash.cpp268
-rw-r--r--3rdparty/bx/src/math.cpp784
-rw-r--r--3rdparty/bx/src/mutex.cpp178
-rw-r--r--3rdparty/bx/src/os.cpp377
-rw-r--r--3rdparty/bx/src/process.cpp168
-rw-r--r--3rdparty/bx/src/semaphore.cpp278
-rw-r--r--3rdparty/bx/src/settings.cpp212
-rw-r--r--3rdparty/bx/src/sort.cpp174
-rw-r--r--3rdparty/bx/src/string.cpp1303
-rw-r--r--3rdparty/bx/src/thread.cpp421
-rw-r--r--3rdparty/bx/src/timer.cpp71
-rw-r--r--3rdparty/bx/src/url.cpp157
-rw-r--r--3rdparty/bx/tests/allocator_test.cpp78
-rw-r--r--3rdparty/bx/tests/atomic_test.cpp46
-rw-r--r--3rdparty/bx/tests/crt_test.cpp58
-rw-r--r--3rdparty/bx/tests/dbg.h16
-rw-r--r--3rdparty/bx/tests/easing_test.cpp59
-rw-r--r--3rdparty/bx/tests/filepath_test.cpp135
-rw-r--r--3rdparty/bx/tests/handle_bench.cpp113
-rw-r--r--3rdparty/bx/tests/handle_test.cpp119
-rw-r--r--3rdparty/bx/tests/hash_test.cpp164
-rw-r--r--3rdparty/bx/tests/macros_test.cpp76
-rw-r--r--3rdparty/bx/tests/main_test.cpp24
-rw-r--r--3rdparty/bx/tests/math_bench.cpp109
-rw-r--r--3rdparty/bx/tests/math_test.cpp374
-rw-r--r--3rdparty/bx/tests/os_test.cpp32
-rw-r--r--3rdparty/bx/tests/queue_test.cpp36
-rw-r--r--3rdparty/bx/tests/readerwriter_test.cpp31
-rw-r--r--3rdparty/bx/tests/ringbuffer_test.cpp20
-rw-r--r--3rdparty/bx/tests/rng_test.cpp90
-rw-r--r--3rdparty/bx/tests/run_test.cpp31
-rw-r--r--3rdparty/bx/tests/settings_test.cpp49
-rw-r--r--3rdparty/bx/tests/simd_bench.cpp133
-rw-r--r--3rdparty/bx/tests/simd_test.cpp450
-rw-r--r--3rdparty/bx/tests/sort_test.cpp167
-rw-r--r--3rdparty/bx/tests/string_test.cpp602
-rw-r--r--3rdparty/bx/tests/test.h21
-rw-r--r--3rdparty/bx/tests/thread_test.cpp75
-rw-r--r--3rdparty/bx/tests/tokenizecmd_test.cpp82
-rw-r--r--3rdparty/bx/tests/typetraits_test.cpp688
-rw-r--r--3rdparty/bx/tests/uint32_test.cpp151
-rw-r--r--3rdparty/bx/tests/unordered_map_nonpod_test.cpp41
-rw-r--r--3rdparty/bx/tests/unordered_set_copyctor_test.cpp42
-rw-r--r--3rdparty/bx/tests/unordered_set_pod_test.cpp38
-rw-r--r--3rdparty/bx/tests/url_test.cpp69
-rw-r--r--3rdparty/bx/tests/vector_complex_test.cpp272
-rw-r--r--3rdparty/bx/tests/vector_header_test.cpp29
-rw-r--r--3rdparty/bx/tests/vector_nocopy_test.cpp229
-rw-r--r--3rdparty/bx/tests/vector_nodefault_test.cpp262
-rw-r--r--3rdparty/bx/tests/vector_primitive_test.cpp245
-rw-r--r--3rdparty/bx/tests/vector_shrinktofit_test.cpp68
-rw-r--r--3rdparty/bx/tests/vsnprintf_test.cpp324
-rwxr-xr-x3rdparty/bx/tools/bin/darwin/bin2cbin0 -> 127496 bytes-rwxr-xr-x3rdparty/bx/tools/bin/darwin/geniebin0 -> 549032 bytes-rwxr-xr-x3rdparty/bx/tools/bin/darwin/lemonbin0 -> 95148 bytes-rw-r--r--3rdparty/bx/tools/bin/darwin/lempar.c981
-rwxr-xr-x3rdparty/bx/tools/bin/darwin/ninjabin0 -> 176588 bytes-rwxr-xr-x3rdparty/bx/tools/bin/linux/bin2cbin0 -> 96464 bytes-rwxr-xr-x3rdparty/bx/tools/bin/linux/geniebin0 -> 547720 bytes-rwxr-xr-x3rdparty/bx/tools/bin/linux/lemonbin0 -> 84728 bytes-rw-r--r--3rdparty/bx/tools/bin/linux/lempar.c981
-rwxr-xr-x3rdparty/bx/tools/bin/linux/ninjabin0 -> 175240 bytes-rwxr-xr-x3rdparty/bx/tools/bin/windows/bin2c.exebin0 -> 163328 bytes-rw-r--r--3rdparty/bx/tools/bin/windows/genie.exebin0 -> 551936 bytes-rw-r--r--3rdparty/bx/tools/bin/windows/lemon.exebin0 -> 104448 bytes-rw-r--r--3rdparty/bx/tools/bin/windows/lempar.c981
-rwxr-xr-x3rdparty/bx/tools/bin/windows/ninja.exebin0 -> 396800 bytes-rw-r--r--3rdparty/bx/tools/bin2c/bin2c.cpp282
-rw-r--r--3rdparty/bx/tools/lemon/lemon.c5466
-rw-r--r--3rdparty/bx/tools/lemon/lempar.c981
-rw-r--r--3rdparty/catch/.gitattributes11
-rw-r--r--3rdparty/catch/.gitignore28
-rw-r--r--3rdparty/catch/.travis.yml163
-rw-r--r--3rdparty/catch/CMakeLists.txt262
-rw-r--r--3rdparty/catch/LICENSE_1_0.txt23
-rw-r--r--3rdparty/catch/README.md22
-rw-r--r--3rdparty/catch/catch-logo-small.pngbin0 -> 51470 bytes-rw-r--r--3rdparty/catch/catch-logo-tiny.pngbin0 -> 5853 bytes-rw-r--r--3rdparty/catch/docs/Readme.md20
-rw-r--r--3rdparty/catch/docs/assertions.md91
-rw-r--r--3rdparty/catch/docs/build-systems.md86
-rw-r--r--3rdparty/catch/docs/command-line.md278
-rw-r--r--3rdparty/catch/docs/configuration.md82
-rw-r--r--3rdparty/catch/docs/contributing.md41
-rw-r--r--3rdparty/catch/docs/logging.md52
-rw-r--r--3rdparty/catch/docs/own-main.md72
-rw-r--r--3rdparty/catch/docs/release-notes.md77
-rw-r--r--3rdparty/catch/docs/slow-compiles.md22
-rw-r--r--3rdparty/catch/docs/test-cases-and-sections.md88
-rw-r--r--3rdparty/catch/docs/test-fixtures.md32
-rw-r--r--3rdparty/catch/docs/tostring.md70
-rw-r--r--3rdparty/catch/docs/tutorial.md249
-rw-r--r--3rdparty/catch/docs/why-catch.md42
-rw-r--r--3rdparty/catch/include/catch.hpp213
-rw-r--r--3rdparty/catch/include/catch_session.hpp219
-rw-r--r--3rdparty/catch/include/catch_with_main.hpp14
-rw-r--r--3rdparty/catch/include/external/clara.h1051
-rw-r--r--3rdparty/catch/include/external/tbc_text_format.h168
-rw-r--r--3rdparty/catch/include/internal/catch_approx.hpp163
-rw-r--r--3rdparty/catch/include/internal/catch_assertionresult.h124
-rw-r--r--3rdparty/catch/include/internal/catch_assertionresult.hpp99
-rw-r--r--3rdparty/catch/include/internal/catch_capture.hpp143
-rw-r--r--3rdparty/catch/include/internal/catch_clara.h32
-rw-r--r--3rdparty/catch/include/internal/catch_commandline.hpp214
-rw-r--r--3rdparty/catch/include/internal/catch_common.h150
-rw-r--r--3rdparty/catch/include/internal/catch_common.hpp121
-rw-r--r--3rdparty/catch/include/internal/catch_compiler_capabilities.h272
-rw-r--r--3rdparty/catch/include/internal/catch_config.hpp162
-rw-r--r--3rdparty/catch/include/internal/catch_console_colour.hpp67
-rw-r--r--3rdparty/catch/include/internal/catch_console_colour_impl.hpp190
-rw-r--r--3rdparty/catch/include/internal/catch_context.h53
-rw-r--r--3rdparty/catch/include/internal/catch_context_impl.hpp110
-rw-r--r--3rdparty/catch/include/internal/catch_debugger.h58
-rw-r--r--3rdparty/catch/include/internal/catch_debugger.hpp127
-rw-r--r--3rdparty/catch/include/internal/catch_default_main.hpp39
-rw-r--r--3rdparty/catch/include/internal/catch_evaluate.hpp218
-rw-r--r--3rdparty/catch/include/internal/catch_exception_translator_registry.hpp73
-rw-r--r--3rdparty/catch/include/internal/catch_expression_lhs.hpp170
-rw-r--r--3rdparty/catch/include/internal/catch_fatal_condition.hpp171
-rw-r--r--3rdparty/catch/include/internal/catch_generators.hpp190
-rw-r--r--3rdparty/catch/include/internal/catch_generators_impl.hpp86
-rw-r--r--3rdparty/catch/include/internal/catch_impl.hpp113
-rw-r--r--3rdparty/catch/include/internal/catch_interfaces_capture.h47
-rw-r--r--3rdparty/catch/include/internal/catch_interfaces_config.h70
-rw-r--r--3rdparty/catch/include/internal/catch_interfaces_exception.h76
-rw-r--r--3rdparty/catch/include/internal/catch_interfaces_generators.h32
-rw-r--r--3rdparty/catch/include/internal/catch_interfaces_registry_hub.h47
-rw-r--r--3rdparty/catch/include/internal/catch_interfaces_reporter.h276
-rw-r--r--3rdparty/catch/include/internal/catch_interfaces_runner.h20
-rw-r--r--3rdparty/catch/include/internal/catch_interfaces_tag_alias_registry.h26
-rw-r--r--3rdparty/catch/include/internal/catch_interfaces_testcase.h40
-rw-r--r--3rdparty/catch/include/internal/catch_legacy_reporter_adapter.h60
-rw-r--r--3rdparty/catch/include/internal/catch_legacy_reporter_adapter.hpp84
-rw-r--r--3rdparty/catch/include/internal/catch_list.hpp179
-rw-r--r--3rdparty/catch/include/internal/catch_matchers.hpp326
-rw-r--r--3rdparty/catch/include/internal/catch_message.h66
-rw-r--r--3rdparty/catch/include/internal/catch_message.hpp47
-rw-r--r--3rdparty/catch/include/internal/catch_notimplemented_exception.h36
-rw-r--r--3rdparty/catch/include/internal/catch_notimplemented_exception.hpp30
-rw-r--r--3rdparty/catch/include/internal/catch_objc.hpp203
-rw-r--r--3rdparty/catch/include/internal/catch_objc_arc.hpp51
-rw-r--r--3rdparty/catch/include/internal/catch_option.hpp75
-rw-r--r--3rdparty/catch/include/internal/catch_platform.h28
-rw-r--r--3rdparty/catch/include/internal/catch_ptr.hpp93
-rw-r--r--3rdparty/catch/include/internal/catch_reenable_warnings.h21
-rw-r--r--3rdparty/catch/include/internal/catch_registry_hub.hpp86
-rw-r--r--3rdparty/catch/include/internal/catch_reporter_registrars.hpp98
-rw-r--r--3rdparty/catch/include/internal/catch_reporter_registry.hpp50
-rw-r--r--3rdparty/catch/include/internal/catch_result_builder.h111
-rw-r--r--3rdparty/catch/include/internal/catch_result_builder.hpp141
-rw-r--r--3rdparty/catch/include/internal/catch_result_type.h61
-rw-r--r--3rdparty/catch/include/internal/catch_run_context.hpp362
-rw-r--r--3rdparty/catch/include/internal/catch_section.h46
-rw-r--r--3rdparty/catch/include/internal/catch_section.hpp52
-rw-r--r--3rdparty/catch/include/internal/catch_section_info.h39
-rw-r--r--3rdparty/catch/include/internal/catch_section_info.hpp113
-rw-r--r--3rdparty/catch/include/internal/catch_stream.h64
-rw-r--r--3rdparty/catch/include/internal/catch_stream.hpp109
-rw-r--r--3rdparty/catch/include/internal/catch_streambuf.h23
-rw-r--r--3rdparty/catch/include/internal/catch_suppress_warnings.h29
-rw-r--r--3rdparty/catch/include/internal/catch_tag_alias.h32
-rw-r--r--3rdparty/catch/include/internal/catch_tag_alias_registry.h31
-rw-r--r--3rdparty/catch/include/internal/catch_tag_alias_registry.hpp83
-rw-r--r--3rdparty/catch/include/internal/catch_test_case_info.h93
-rw-r--r--3rdparty/catch/include/internal/catch_test_case_info.hpp203
-rw-r--r--3rdparty/catch/include/internal/catch_test_case_registry_impl.hpp208
-rw-r--r--3rdparty/catch/include/internal/catch_test_case_tracker.hpp367
-rw-r--r--3rdparty/catch/include/internal/catch_test_registry.hpp145
-rw-r--r--3rdparty/catch/include/internal/catch_test_spec.hpp98
-rw-r--r--3rdparty/catch/include/internal/catch_test_spec_parser.hpp132
-rw-r--r--3rdparty/catch/include/internal/catch_text.h24
-rw-r--r--3rdparty/catch/include/internal/catch_timer.h35
-rw-r--r--3rdparty/catch/include/internal/catch_timer.hpp63
-rw-r--r--3rdparty/catch/include/internal/catch_tostring.h269
-rw-r--r--3rdparty/catch/include/internal/catch_tostring.hpp213
-rw-r--r--3rdparty/catch/include/internal/catch_totals.hpp78
-rw-r--r--3rdparty/catch/include/internal/catch_version.h38
-rw-r--r--3rdparty/catch/include/internal/catch_version.hpp44
-rw-r--r--3rdparty/catch/include/internal/catch_wildcard_pattern.hpp71
-rw-r--r--3rdparty/catch/include/internal/catch_windows_h_proxy.h32
-rw-r--r--3rdparty/catch/include/internal/catch_xmlwriter.hpp245
-rw-r--r--3rdparty/catch/include/reporters/catch_reporter_bases.hpp260
-rw-r--r--3rdparty/catch/include/reporters/catch_reporter_compact.hpp301
-rw-r--r--3rdparty/catch/include/reporters/catch_reporter_console.hpp445
-rw-r--r--3rdparty/catch/include/reporters/catch_reporter_junit.hpp252
-rw-r--r--3rdparty/catch/include/reporters/catch_reporter_multi.hpp152
-rw-r--r--3rdparty/catch/include/reporters/catch_reporter_teamcity.hpp221
-rw-r--r--3rdparty/catch/include/reporters/catch_reporter_xml.hpp199
-rw-r--r--3rdparty/catch/projects/Benchmark/BenchMain.cpp9
-rw-r--r--3rdparty/catch/projects/Benchmark/StringificationBench.cpp46
-rw-r--r--3rdparty/catch/projects/Benchmark/readme.txt4
-rw-r--r--3rdparty/catch/projects/Benchmark/results/2017-01-14T21-53-49-e3659cdddd43ba4df9e4846630be6a6a7bd85a07.result3
-rw-r--r--3rdparty/catch/projects/Benchmark/results/2017-01-14T21-59-08-a1e9b841ff500b2f39ccfd4193ae450cb653da05.result3
-rw-r--r--3rdparty/catch/projects/Benchmark/results/2017-01-15T09-35-14-3b98a0166f7b7196eba2ad518174d1a77165166d.result3
-rw-r--r--3rdparty/catch/projects/Benchmark/results/2017-01-29T22-08-36-60f8ebec49c5bc58d3604bf1a72cd3f7d129bf2e.result3
-rw-r--r--3rdparty/catch/projects/Benchmark/results/2017-01-29T23-13-35-bcaa2f9646c5ce50758f8582307c99501a932e1a.result3
-rw-r--r--3rdparty/catch/projects/SelfTest/ApproxTests.cpp187
-rw-r--r--3rdparty/catch/projects/SelfTest/BDDTests.cpp103
-rw-r--r--3rdparty/catch/projects/SelfTest/Baselines/console.std.approved.txt834
-rw-r--r--3rdparty/catch/projects/SelfTest/Baselines/console.sw.approved.txt9030
-rw-r--r--3rdparty/catch/projects/SelfTest/Baselines/console.swa4.approved.txt40
-rw-r--r--3rdparty/catch/projects/SelfTest/Baselines/junit.sw.approved.txt680
-rw-r--r--3rdparty/catch/projects/SelfTest/Baselines/xml.sw.approved.txt9509
-rw-r--r--3rdparty/catch/projects/SelfTest/ClassTests.cpp57
-rw-r--r--3rdparty/catch/projects/SelfTest/CmdLineTests.cpp264
-rw-r--r--3rdparty/catch/projects/SelfTest/ConditionTests.cpp335
-rw-r--r--3rdparty/catch/projects/SelfTest/EnumToString.cpp76
-rw-r--r--3rdparty/catch/projects/SelfTest/ExceptionTests.cpp207
-rw-r--r--3rdparty/catch/projects/SelfTest/GeneratorTests.cpp42
-rw-r--r--3rdparty/catch/projects/SelfTest/MessageTests.cpp133
-rw-r--r--3rdparty/catch/projects/SelfTest/MiscTests.cpp489
-rw-r--r--3rdparty/catch/projects/SelfTest/PartTrackerTests.cpp333
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_common.cpp3
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_console_colour.cpp3
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_debugger.cpp2
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_interfaces_capture.cpp3
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_interfaces_config.cpp2
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_interfaces_exception.cpp2
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_interfaces_generators.cpp1
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_interfaces_registry_hub.cpp3
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_interfaces_reporter.cpp2
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_interfaces_runner.cpp1
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_interfaces_testcase.cpp2
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_message.cpp3
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_option.cpp3
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_ptr.cpp3
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_stream.cpp3
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_streambuf.cpp3
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_test_case_tracker.cpp2
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_test_spec.cpp3
-rw-r--r--3rdparty/catch/projects/SelfTest/SurrogateCpps/catch_xmlwriter.cpp4
-rw-r--r--3rdparty/catch/projects/SelfTest/TagAliasTests.cpp41
-rw-r--r--3rdparty/catch/projects/SelfTest/TestMain.cpp491
-rw-r--r--3rdparty/catch/projects/SelfTest/ToStringPair.cpp47
-rw-r--r--3rdparty/catch/projects/SelfTest/ToStringTuple.cpp59
-rw-r--r--3rdparty/catch/projects/SelfTest/ToStringVector.cpp77
-rw-r--r--3rdparty/catch/projects/SelfTest/ToStringWhich.cpp71
-rw-r--r--3rdparty/catch/projects/SelfTest/TrickyTests.cpp401
-rw-r--r--3rdparty/catch/projects/SelfTest/VariadicMacrosTests.cpp31
-rw-r--r--3rdparty/catch/projects/Where did the projects go.txt13
-rw-r--r--3rdparty/catch/scripts/approvalTests.py152
-rw-r--r--3rdparty/catch/scripts/approve.py33
-rw-r--r--3rdparty/catch/scripts/benchmarkRunner.py56
-rw-r--r--3rdparty/catch/scripts/developBuild.py11
-rw-r--r--3rdparty/catch/scripts/fixWhitespace.py49
-rw-r--r--3rdparty/catch/scripts/generateSingleHeader.py105
-rw-r--r--3rdparty/catch/scripts/majorRelease.py11
-rw-r--r--3rdparty/catch/scripts/minorRelease.py11
-rw-r--r--3rdparty/catch/scripts/patchRelease.py11
-rw-r--r--3rdparty/catch/scripts/releaseCommon.py90
-rw-r--r--3rdparty/catch/scripts/releaseNotes.py64
-rw-r--r--3rdparty/catch/scripts/scriptCommon.py26
-rw-r--r--3rdparty/catch/single_include/catch.hpp11004
-rw-r--r--3rdparty/compat/mingw/alloca.h6
-rw-r--r--3rdparty/compat/winsdk-override/roapi.h93
-rw-r--r--3rdparty/compat/winsdk-override/wrl/client.h304
-rw-r--r--3rdparty/compat/winsdk-override/wrl/internal.h37
-rw-r--r--3rdparty/dxsdk/Documentation/License Agreements/DirectX End User EULA.txt34
-rw-r--r--3rdparty/dxsdk/Documentation/License Agreements/DirectX SDK EULA.rtf774
-rw-r--r--3rdparty/dxsdk/Documentation/License Agreements/DirectX SDK EULA.txt77
-rw-r--r--3rdparty/dxsdk/Documentation/License Agreements/Roland-license.txt65
-rw-r--r--3rdparty/dxsdk/Documentation/License Agreements/directx redist.txt16
-rw-r--r--3rdparty/dxsdk/Documentation/License Agreements/libjpg-readme.txt398
-rw-r--r--3rdparty/dxsdk/Documentation/License Agreements/libpng-license.txt99
-rw-r--r--3rdparty/dxsdk/Include/d3dx9.h78
-rw-r--r--3rdparty/dxsdk/Include/d3dx9anim.h1114
-rw-r--r--3rdparty/dxsdk/Include/d3dx9core.h744
-rw-r--r--3rdparty/dxsdk/Include/d3dx9effect.h873
-rw-r--r--3rdparty/dxsdk/Include/d3dx9math.h1803
-rw-r--r--3rdparty/dxsdk/Include/d3dx9math.inl2251
-rw-r--r--3rdparty/dxsdk/Include/d3dx9mesh.h3007
-rw-r--r--3rdparty/dxsdk/Include/d3dx9shader.h1010
-rw-r--r--3rdparty/dxsdk/Include/d3dx9shape.h221
-rw-r--r--3rdparty/dxsdk/Include/d3dx9tex.h1735
-rw-r--r--3rdparty/dxsdk/Include/d3dx9xof.h299
-rw-r--r--3rdparty/expat/AUTHORS10
-rw-r--r--3rdparty/expat/CMake.README42
-rw-r--r--3rdparty/expat/CMakeLists.txt1035
-rw-r--r--3rdparty/expat/COPYING21
-rw-r--r--3rdparty/expat/Changes1672
-rw-r--r--3rdparty/expat/ConfigureChecks.cmake76
-rw-r--r--3rdparty/expat/Makefile.am185
-rw-r--r--3rdparty/expat/Makefile.in1151
-rw-r--r--3rdparty/expat/README.md311
-rw-r--r--3rdparty/expat/acinclude.m414
-rw-r--r--3rdparty/expat/aclocal.m41252
-rwxr-xr-x3rdparty/expat/buildconf.sh35
-rw-r--r--3rdparty/expat/cmake/autotools/expat-config-version.cmake.in65
-rw-r--r--3rdparty/expat/cmake/autotools/expat-noconfig__linux.cmake.in19
-rw-r--r--3rdparty/expat/cmake/autotools/expat-noconfig__macos.cmake.in19
-rw-r--r--3rdparty/expat/cmake/autotools/expat-noconfig__windows.cmake.in19
-rw-r--r--3rdparty/expat/cmake/autotools/expat-package-init.cmake25
-rw-r--r--3rdparty/expat/cmake/autotools/expat.cmake107
-rw-r--r--3rdparty/expat/cmake/expat-config.cmake.in75
-rw-r--r--3rdparty/expat/cmake/mingw-toolchain.cmake37
-rwxr-xr-x3rdparty/expat/configure24215
-rw-r--r--3rdparty/expat/configure.ac473
-rwxr-xr-x3rdparty/expat/conftools/ar-lib271
-rw-r--r--3rdparty/expat/conftools/ax-append-compile-flags.m446
-rw-r--r--3rdparty/expat/conftools/ax-append-flag.m450
-rw-r--r--3rdparty/expat/conftools/ax-append-link-flags.m444
-rw-r--r--3rdparty/expat/conftools/ax-check-compile-flag.m477
-rw-r--r--3rdparty/expat/conftools/ax-check-link-flag.m453
-rw-r--r--3rdparty/expat/conftools/ax-cxx-compile-stdcxx-11.m439
-rw-r--r--3rdparty/expat/conftools/ax-cxx-compile-stdcxx.m41018
-rw-r--r--3rdparty/expat/conftools/ax-require-defined.m437
-rwxr-xr-x3rdparty/expat/conftools/compile348
-rwxr-xr-x3rdparty/expat/conftools/config.guess1765
-rwxr-xr-x3rdparty/expat/conftools/config.sub1911
-rwxr-xr-x3rdparty/expat/conftools/depcomp791
-rw-r--r--3rdparty/expat/conftools/expat.m443
-rw-r--r--3rdparty/expat/conftools/expatcfg-compiler-supports-visibility.m439
-rwxr-xr-x3rdparty/expat/conftools/get-version.sh61
-rwxr-xr-x3rdparty/expat/conftools/install-sh541
-rw-r--r--3rdparty/expat/conftools/ltmain.sh11534
-rwxr-xr-x3rdparty/expat/conftools/missing215
-rwxr-xr-x3rdparty/expat/conftools/test-driver153
-rw-r--r--3rdparty/expat/doc/Makefile.am59
-rw-r--r--3rdparty/expat/doc/Makefile.in618
-rw-r--r--3rdparty/expat/doc/ok.min.css2
-rw-r--r--3rdparty/expat/doc/reference.html2710
-rw-r--r--3rdparty/expat/doc/style.css47
-rw-r--r--3rdparty/expat/doc/xmlwf.1338
-rw-r--r--3rdparty/expat/doc/xmlwf.xml578
-rw-r--r--3rdparty/expat/examples/Makefile.am43
-rw-r--r--3rdparty/expat/examples/Makefile.in694
-rw-r--r--3rdparty/expat/examples/element_declarations.c235
-rw-r--r--3rdparty/expat/examples/elements.c121
-rw-r--r--3rdparty/expat/examples/outline.c124
-rw-r--r--3rdparty/expat/expat.pc.cmake13
-rw-r--r--3rdparty/expat/expat.pc.in13
-rw-r--r--3rdparty/expat/expat_config.h143
-rw-r--r--3rdparty/expat/expat_config.h.cmake122
-rw-r--r--3rdparty/expat/expat_config.h.in142
-rwxr-xr-x3rdparty/expat/fix-xmltest-log.sh50
-rw-r--r--3rdparty/expat/fuzz/xml_lpm_fuzzer.cpp464
-rw-r--r--3rdparty/expat/fuzz/xml_lpm_fuzzer.proto58
-rw-r--r--3rdparty/expat/fuzz/xml_parse_fuzzer.c105
-rw-r--r--3rdparty/expat/fuzz/xml_parsebuffer_fuzzer.c117
-rw-r--r--3rdparty/expat/lib/Makefile.am87
-rw-r--r--3rdparty/expat/lib/Makefile.in887
-rw-r--r--3rdparty/expat/lib/ascii.h123
-rw-r--r--3rdparty/expat/lib/asciitab.h66
-rw-r--r--3rdparty/expat/lib/expat.h1077
-rw-r--r--3rdparty/expat/lib/expat_config.h6
-rw-r--r--3rdparty/expat/lib/expat_external.h165
-rw-r--r--3rdparty/expat/lib/iasciitab.h67
-rw-r--r--3rdparty/expat/lib/internal.h179
-rw-r--r--3rdparty/expat/lib/latin1tab.h66
-rw-r--r--3rdparty/expat/lib/libexpat.def.cmake81
-rw-r--r--3rdparty/expat/lib/nametab.h136
-rw-r--r--3rdparty/expat/lib/siphash.h392
-rw-r--r--3rdparty/expat/lib/utf8tab.h66
-rw-r--r--3rdparty/expat/lib/winconfig.h48
-rw-r--r--3rdparty/expat/lib/xmlparse.c8841
-rw-r--r--3rdparty/expat/lib/xmlrole.c1255
-rw-r--r--3rdparty/expat/lib/xmlrole.h142
-rw-r--r--3rdparty/expat/lib/xmltok.c1672
-rw-r--r--3rdparty/expat/lib/xmltok.h321
-rw-r--r--3rdparty/expat/lib/xmltok_impl.c1819
-rw-r--r--3rdparty/expat/lib/xmltok_impl.h74
-rw-r--r--3rdparty/expat/lib/xmltok_ns.c122
-rw-r--r--3rdparty/expat/m4/libtool.m48501
-rw-r--r--3rdparty/expat/m4/ltoptions.m4467
-rw-r--r--3rdparty/expat/m4/ltsugar.m4124
-rw-r--r--3rdparty/expat/m4/ltversion.m424
-rw-r--r--3rdparty/expat/m4/lt~obsolete.m499
-rw-r--r--3rdparty/expat/run.sh.in47
-rwxr-xr-x3rdparty/expat/test-driver-wrapper.sh44
-rw-r--r--3rdparty/expat/tests/Makefile.am99
-rw-r--r--3rdparty/expat/tests/Makefile.in1378
-rw-r--r--3rdparty/expat/tests/README.md11
-rw-r--r--3rdparty/expat/tests/acc_tests.c458
-rw-r--r--3rdparty/expat/tests/acc_tests.h56
-rw-r--r--3rdparty/expat/tests/acc_tests_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/alloc_tests.c2154
-rw-r--r--3rdparty/expat/tests/alloc_tests.h56
-rw-r--r--3rdparty/expat/tests/alloc_tests_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/basic_tests.c6472
-rw-r--r--3rdparty/expat/tests/basic_tests.h56
-rw-r--r--3rdparty/expat/tests/basic_tests_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/benchmark/Makefile.am41
-rw-r--r--3rdparty/expat/tests/benchmark/Makefile.in669
-rw-r--r--3rdparty/expat/tests/benchmark/README.txt16
-rw-r--r--3rdparty/expat/tests/benchmark/benchmark.c174
-rw-r--r--3rdparty/expat/tests/chardata.c106
-rw-r--r--3rdparty/expat/tests/chardata.h61
-rw-r--r--3rdparty/expat/tests/chardata_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/common.c327
-rw-r--r--3rdparty/expat/tests/common.h155
-rw-r--r--3rdparty/expat/tests/common_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/dummy.c261
-rw-r--r--3rdparty/expat/tests/dummy.h150
-rw-r--r--3rdparty/expat/tests/dummy_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/handlers.c1979
-rw-r--r--3rdparty/expat/tests/handlers.h615
-rw-r--r--3rdparty/expat/tests/handlers_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/memcheck.c191
-rw-r--r--3rdparty/expat/tests/memcheck.h57
-rw-r--r--3rdparty/expat/tests/memcheck_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/minicheck.c275
-rw-r--r--3rdparty/expat/tests/minicheck.h155
-rw-r--r--3rdparty/expat/tests/minicheck_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/misc_tests.c709
-rw-r--r--3rdparty/expat/tests/misc_tests.h56
-rw-r--r--3rdparty/expat/tests/misc_tests_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/ns_tests.c754
-rw-r--r--3rdparty/expat/tests/ns_tests.h56
-rw-r--r--3rdparty/expat/tests/ns_tests_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/nsalloc_tests.c1537
-rw-r--r--3rdparty/expat/tests/nsalloc_tests.h56
-rw-r--r--3rdparty/expat/tests/nsalloc_tests_cxx.cpp32
-rw-r--r--3rdparty/expat/tests/runtests.c116
-rw-r--r--3rdparty/expat/tests/runtests_cxx.cpp36
-rw-r--r--3rdparty/expat/tests/structdata.c158
-rw-r--r--3rdparty/expat/tests/structdata.h69
-rw-r--r--3rdparty/expat/tests/structdata_cxx.cpp32
-rwxr-xr-x3rdparty/expat/tests/udiffer.py63
-rw-r--r--3rdparty/expat/tests/xmltest.log.expected10
-rwxr-xr-x3rdparty/expat/tests/xmltest.sh174
-rw-r--r--3rdparty/expat/win32/MANIFEST.txt25
-rw-r--r--3rdparty/expat/win32/README.txt60
-rw-r--r--3rdparty/expat/win32/build_expat_iss.bat84
-rw-r--r--3rdparty/expat/win32/expat.iss108
-rw-r--r--3rdparty/expat/win32/version.rc.cmake17
-rw-r--r--3rdparty/expat/xmlwf/Makefile.am60
-rw-r--r--3rdparty/expat/xmlwf/Makefile.in800
-rw-r--r--3rdparty/expat/xmlwf/codepage.c98
-rw-r--r--3rdparty/expat/xmlwf/codepage.h36
-rw-r--r--3rdparty/expat/xmlwf/ct.c174
-rw-r--r--3rdparty/expat/xmlwf/filemap.h55
-rw-r--r--3rdparty/expat/xmlwf/readfilemap.c147
-rw-r--r--3rdparty/expat/xmlwf/unixfilemap.c107
-rw-r--r--3rdparty/expat/xmlwf/win32filemap.c121
-rw-r--r--3rdparty/expat/xmlwf/xmlfile.c278
-rw-r--r--3rdparty/expat/xmlwf/xmlfile.h48
-rw-r--r--3rdparty/expat/xmlwf/xmlmime.c193
-rw-r--r--3rdparty/expat/xmlwf/xmlmime.h52
-rw-r--r--3rdparty/expat/xmlwf/xmltchar.h79
-rw-r--r--3rdparty/expat/xmlwf/xmlwf.c1313
-rwxr-xr-x3rdparty/expat/xmlwf/xmlwf_helpgen.py98
-rwxr-xr-x3rdparty/expat/xmlwf/xmlwf_helpgen.sh36
-rw-r--r--3rdparty/flac/AUTHORS60
-rw-r--r--3rdparty/flac/CHANGELOG.md992
-rw-r--r--3rdparty/flac/CMakeLists.txt291
-rw-r--r--3rdparty/flac/COPYING.FDL397
-rw-r--r--3rdparty/flac/COPYING.GPL339
-rw-r--r--3rdparty/flac/COPYING.LGPL504
-rw-r--r--3rdparty/flac/COPYING.Xiph29
-rw-r--r--3rdparty/flac/Makefile.am61
-rw-r--r--3rdparty/flac/Makefile.in916
-rw-r--r--3rdparty/flac/README.md278
-rw-r--r--3rdparty/flac/aclocal.m41251
-rwxr-xr-x3rdparty/flac/ar-lib271
-rwxr-xr-x3rdparty/flac/autogen.sh66
-rw-r--r--3rdparty/flac/cmake/CheckA64NEON.c.in6
-rw-r--r--3rdparty/flac/cmake/CheckA64NEON.cmake14
-rw-r--r--3rdparty/flac/cmake/CheckCPUArch.c.in7
-rw-r--r--3rdparty/flac/cmake/CheckCPUArch.cmake27
-rw-r--r--3rdparty/flac/cmake/FindOgg.cmake26
-rw-r--r--3rdparty/flac/cmake/UseSystemExtensions.cmake63
-rwxr-xr-x3rdparty/flac/compile348
-rw-r--r--3rdparty/flac/config.cmake.h.in223
-rwxr-xr-x3rdparty/flac/config.guess1754
-rw-r--r--3rdparty/flac/config.h.in317
-rw-r--r--3rdparty/flac/config.rpath0
-rwxr-xr-x3rdparty/flac/config.sub1890
-rwxr-xr-x3rdparty/flac/configure24682
-rw-r--r--3rdparty/flac/configure.ac602
-rwxr-xr-x3rdparty/flac/depcomp791
-rw-r--r--3rdparty/flac/examples/CMakeLists.txt7
-rw-r--r--3rdparty/flac/examples/Makefile.am27
-rw-r--r--3rdparty/flac/examples/Makefile.in681
-rw-r--r--3rdparty/flac/examples/README12
-rw-r--r--3rdparty/flac/examples/c/Makefile.am19
-rw-r--r--3rdparty/flac/examples/c/Makefile.in676
-rw-r--r--3rdparty/flac/examples/c/decode/Makefile.am19
-rw-r--r--3rdparty/flac/examples/c/decode/Makefile.in676
-rw-r--r--3rdparty/flac/examples/c/decode/file/CMakeLists.txt2
-rw-r--r--3rdparty/flac/examples/c/decode/file/Makefile.am29
-rw-r--r--3rdparty/flac/examples/c/decode/file/Makefile.in662
-rw-r--r--3rdparty/flac/examples/c/decode/file/main.c200
-rw-r--r--3rdparty/flac/examples/c/encode/Makefile.am19
-rw-r--r--3rdparty/flac/examples/c/encode/Makefile.in676
-rw-r--r--3rdparty/flac/examples/c/encode/file/CMakeLists.txt2
-rw-r--r--3rdparty/flac/examples/c/encode/file/Makefile.am31
-rw-r--r--3rdparty/flac/examples/c/encode/file/Makefile.in664
-rw-r--r--3rdparty/flac/examples/c/encode/file/main.c173
-rw-r--r--3rdparty/flac/examples/cpp/Makefile.am19
-rw-r--r--3rdparty/flac/examples/cpp/Makefile.in676
-rw-r--r--3rdparty/flac/examples/cpp/decode/Makefile.am19
-rw-r--r--3rdparty/flac/examples/cpp/decode/Makefile.in676
-rw-r--r--3rdparty/flac/examples/cpp/decode/file/CMakeLists.txt2
-rw-r--r--3rdparty/flac/examples/cpp/decode/file/Makefile.am32
-rw-r--r--3rdparty/flac/examples/cpp/decode/file/Makefile.in667
-rw-r--r--3rdparty/flac/examples/cpp/decode/file/main.cpp195
-rw-r--r--3rdparty/flac/examples/cpp/encode/Makefile.am19
-rw-r--r--3rdparty/flac/examples/cpp/encode/Makefile.in676
-rw-r--r--3rdparty/flac/examples/cpp/encode/file/CMakeLists.txt2
-rw-r--r--3rdparty/flac/examples/cpp/encode/file/Makefile.am32
-rw-r--r--3rdparty/flac/examples/cpp/encode/file/Makefile.in667
-rw-r--r--3rdparty/flac/examples/cpp/encode/file/main.cpp178
-rw-r--r--3rdparty/flac/flac-config.cmake.in17
-rw-r--r--3rdparty/flac/include/FLAC++/Makefile.am39
-rw-r--r--3rdparty/flac/include/FLAC++/Makefile.in638
-rw-r--r--3rdparty/flac/include/FLAC++/all.h49
-rw-r--r--3rdparty/flac/include/FLAC++/decoder.h248
-rw-r--r--3rdparty/flac/include/FLAC++/encoder.h265
-rw-r--r--3rdparty/flac/include/FLAC++/export.h100
-rw-r--r--3rdparty/flac/include/FLAC++/metadata.h1234
-rw-r--r--3rdparty/flac/include/FLAC/Makefile.am43
-rw-r--r--3rdparty/flac/include/FLAC/Makefile.in641
-rw-r--r--3rdparty/flac/include/FLAC/all.h450
-rw-r--r--3rdparty/flac/include/FLAC/assert.h51
-rw-r--r--3rdparty/flac/include/FLAC/callback.h190
-rw-r--r--3rdparty/flac/include/FLAC/export.h115
-rw-r--r--3rdparty/flac/include/FLAC/format.h1032
-rw-r--r--3rdparty/flac/include/FLAC/metadata.h2234
-rw-r--r--3rdparty/flac/include/FLAC/ordinals.h55
-rw-r--r--3rdparty/flac/include/FLAC/stream_decoder.h1584
-rw-r--r--3rdparty/flac/include/FLAC/stream_encoder.h1837
-rw-r--r--3rdparty/flac/include/Makefile.am23
-rw-r--r--3rdparty/flac/include/Makefile.in677
-rw-r--r--3rdparty/flac/include/share/Makefile.am17
-rw-r--r--3rdparty/flac/include/share/Makefile.in672
-rw-r--r--3rdparty/flac/include/share/alloc.h318
-rw-r--r--3rdparty/flac/include/share/compat.h240
-rw-r--r--3rdparty/flac/include/share/endswap.h84
-rw-r--r--3rdparty/flac/include/share/getopt.h184
-rw-r--r--3rdparty/flac/include/share/grabbag.h30
-rw-r--r--3rdparty/flac/include/share/grabbag/Makefile.am8
-rw-r--r--3rdparty/flac/include/share/grabbag/Makefile.in486
-rw-r--r--3rdparty/flac/include/share/grabbag/cuesheet.h43
-rw-r--r--3rdparty/flac/include/share/grabbag/file.h65
-rw-r--r--3rdparty/flac/include/share/grabbag/picture.h54
-rw-r--r--3rdparty/flac/include/share/grabbag/replaygain.h73
-rw-r--r--3rdparty/flac/include/share/grabbag/seektable.h39
-rw-r--r--3rdparty/flac/include/share/macros.h45
-rw-r--r--3rdparty/flac/include/share/private.h54
-rw-r--r--3rdparty/flac/include/share/replaygain_analysis.h59
-rw-r--r--3rdparty/flac/include/share/replaygain_synthesis.h52
-rw-r--r--3rdparty/flac/include/share/safe_str.h71
-rw-r--r--3rdparty/flac/include/share/utf8.h25
-rw-r--r--3rdparty/flac/include/share/win_utf8_io.h71
-rw-r--r--3rdparty/flac/include/test_libs_common/Makefile.am5
-rw-r--r--3rdparty/flac/include/test_libs_common/Makefile.in483
-rw-r--r--3rdparty/flac/include/test_libs_common/file_utils_flac.h36
-rw-r--r--3rdparty/flac/include/test_libs_common/metadata_utils.h71
-rwxr-xr-x3rdparty/flac/install-sh541
-rwxr-xr-x3rdparty/flac/ltmain.sh11251
-rw-r--r--3rdparty/flac/m4/Makefile.am26
-rw-r--r--3rdparty/flac/m4/Makefile.in506
-rw-r--r--3rdparty/flac/m4/add_cflags.m415
-rw-r--r--3rdparty/flac/m4/add_cxxflags.m416
-rw-r--r--3rdparty/flac/m4/ax_add_fortify_source.m453
-rw-r--r--3rdparty/flac/m4/ax_check_compile_flag.m453
-rw-r--r--3rdparty/flac/m4/ax_check_enable_debug.m4124
-rw-r--r--3rdparty/flac/m4/bswap.m466
-rw-r--r--3rdparty/flac/m4/clang.m428
-rw-r--r--3rdparty/flac/m4/codeset.m423
-rw-r--r--3rdparty/flac/m4/endian.m4169
-rw-r--r--3rdparty/flac/m4/gcc_version.m434
-rw-r--r--3rdparty/flac/m4/iconv.m4268
-rw-r--r--3rdparty/flac/m4/lib-ld.m4119
-rw-r--r--3rdparty/flac/m4/lib-link.m4777
-rw-r--r--3rdparty/flac/m4/lib-prefix.m4224
-rw-r--r--3rdparty/flac/m4/libtool.m48394
-rw-r--r--3rdparty/flac/m4/ltoptions.m4437
-rw-r--r--3rdparty/flac/m4/ltsugar.m4124
-rw-r--r--3rdparty/flac/m4/ltversion.m423
-rw-r--r--3rdparty/flac/m4/lt~obsolete.m499
-rw-r--r--3rdparty/flac/m4/ogg.m4114
-rw-r--r--3rdparty/flac/m4/really_gcc.m429
-rw-r--r--3rdparty/flac/m4/stack_protect.m467
-rw-r--r--3rdparty/flac/man/Makefile.am34
-rw-r--r--3rdparty/flac/man/Makefile.in586
-rw-r--r--3rdparty/flac/man/flac.1928
-rw-r--r--3rdparty/flac/man/flac.md760
-rw-r--r--3rdparty/flac/man/metaflac.1326
-rw-r--r--3rdparty/flac/man/metaflac.md299
-rw-r--r--3rdparty/flac/microbench/CMakeLists.txt17
-rw-r--r--3rdparty/flac/microbench/Makefile.am42
-rw-r--r--3rdparty/flac/microbench/Makefile.in676
-rw-r--r--3rdparty/flac/microbench/benchmark_residual.c151
-rw-r--r--3rdparty/flac/microbench/util.c205
-rw-r--r--3rdparty/flac/microbench/util.h43
-rwxr-xr-x3rdparty/flac/missing215
-rw-r--r--3rdparty/flac/oss-fuzz/Makefile.am104
-rw-r--r--3rdparty/flac/oss-fuzz/Makefile.in1033
-rw-r--r--3rdparty/flac/oss-fuzz/Readme.md13
-rw-r--r--3rdparty/flac/oss-fuzz/common.h2
-rw-r--r--3rdparty/flac/oss-fuzz/decoder.cc408
-rw-r--r--3rdparty/flac/oss-fuzz/empty.cc0
-rw-r--r--3rdparty/flac/oss-fuzz/encoder.cc257
-rw-r--r--3rdparty/flac/oss-fuzz/encoder_v2.cc352
-rw-r--r--3rdparty/flac/oss-fuzz/fuzzer_encoder.dict18
-rw-r--r--3rdparty/flac/oss-fuzz/fuzzing/datasource/datasource.hpp190
-rw-r--r--3rdparty/flac/oss-fuzz/fuzzing/datasource/id.hpp75
-rw-r--r--3rdparty/flac/oss-fuzz/fuzzing/exception.hpp67
-rw-r--r--3rdparty/flac/oss-fuzz/fuzzing/memory.hpp96
-rw-r--r--3rdparty/flac/oss-fuzz/fuzzing/types.hpp158
-rw-r--r--3rdparty/flac/oss-fuzz/metadata.cc526
-rw-r--r--3rdparty/flac/oss-fuzz/reencoder.cc304
-rw-r--r--3rdparty/flac/oss-fuzz/seek.cc195
-rw-r--r--3rdparty/flac/oss-fuzz/tool_flac.c117
-rw-r--r--3rdparty/flac/oss-fuzz/tool_metaflac.c136
-rw-r--r--3rdparty/flac/src/CMakeLists.txt36
-rw-r--r--3rdparty/flac/src/Makefile.am40
-rw-r--r--3rdparty/flac/src/Makefile.in694
-rw-r--r--3rdparty/flac/src/flac/CMakeLists.txt25
-rw-r--r--3rdparty/flac/src/flac/Makefile.am69
-rw-r--r--3rdparty/flac/src/flac/Makefile.in782
-rw-r--r--3rdparty/flac/src/flac/analyze.c252
-rw-r--r--3rdparty/flac/src/flac/analyze.h32
-rw-r--r--3rdparty/flac/src/flac/decode.c1674
-rw-r--r--3rdparty/flac/src/flac/decode.h73
-rw-r--r--3rdparty/flac/src/flac/encode.c2852
-rw-r--r--3rdparty/flac/src/flac/encode.h116
-rw-r--r--3rdparty/flac/src/flac/foreign_metadata.c952
-rw-r--r--3rdparty/flac/src/flac/foreign_metadata.h83
-rw-r--r--3rdparty/flac/src/flac/iffscan.c129
-rw-r--r--3rdparty/flac/src/flac/local_string_utils.c109
-rw-r--r--3rdparty/flac/src/flac/local_string_utils.h28
-rw-r--r--3rdparty/flac/src/flac/main.c2442
-rw-r--r--3rdparty/flac/src/flac/utils.c439
-rw-r--r--3rdparty/flac/src/flac/utils.h77
-rw-r--r--3rdparty/flac/src/flac/version.rc38
-rw-r--r--3rdparty/flac/src/flac/vorbiscomment.c254
-rw-r--r--3rdparty/flac/src/flac/vorbiscomment.h27
-rw-r--r--3rdparty/flac/src/libFLAC++/CMakeLists.txt41
-rw-r--r--3rdparty/flac/src/libFLAC++/Makefile.am68
-rw-r--r--3rdparty/flac/src/libFLAC++/Makefile.in831
-rw-r--r--3rdparty/flac/src/libFLAC++/flac++.pc.in11
-rw-r--r--3rdparty/flac/src/libFLAC++/libFLAC++.m4114
-rw-r--r--3rdparty/flac/src/libFLAC++/metadata.cpp1745
-rw-r--r--3rdparty/flac/src/libFLAC++/stream_decoder.cpp394
-rw-r--r--3rdparty/flac/src/libFLAC++/stream_encoder.cpp519
-rw-r--r--3rdparty/flac/src/libFLAC++/version.rc40
-rw-r--r--3rdparty/flac/src/libFLAC/CMakeLists.txt126
-rw-r--r--3rdparty/flac/src/libFLAC/Makefile.am123
-rw-r--r--3rdparty/flac/src/libFLAC/Makefile.in1157
-rw-r--r--3rdparty/flac/src/libFLAC/bitmath.c73
-rw-r--r--3rdparty/flac/src/libFLAC/bitreader.c1052
-rw-r--r--3rdparty/flac/src/libFLAC/bitwriter.c955
-rw-r--r--3rdparty/flac/src/libFLAC/cpu.c255
-rw-r--r--3rdparty/flac/src/libFLAC/crc.c436
-rw-r--r--3rdparty/flac/src/libFLAC/deduplication/bitreader_read_rice_signed_block.c143
-rw-r--r--3rdparty/flac/src/libFLAC/deduplication/lpc_compute_autocorrelation_intrin.c14
-rw-r--r--3rdparty/flac/src/libFLAC/deduplication/lpc_compute_autocorrelation_intrin_neon.c70
-rw-r--r--3rdparty/flac/src/libFLAC/deduplication/lpc_compute_autocorrelation_intrin_sse2.c81
-rw-r--r--3rdparty/flac/src/libFLAC/fixed.c667
-rw-r--r--3rdparty/flac/src/libFLAC/fixed_intrin_avx2.c343
-rw-r--r--3rdparty/flac/src/libFLAC/fixed_intrin_sse2.c194
-rw-r--r--3rdparty/flac/src/libFLAC/fixed_intrin_sse42.c223
-rw-r--r--3rdparty/flac/src/libFLAC/fixed_intrin_ssse3.c179
-rw-r--r--3rdparty/flac/src/libFLAC/flac.pc.in12
-rw-r--r--3rdparty/flac/src/libFLAC/float.c302
-rw-r--r--3rdparty/flac/src/libFLAC/format.c608
-rw-r--r--3rdparty/flac/src/libFLAC/include/Makefile.am32
-rw-r--r--3rdparty/flac/src/libFLAC/include/Makefile.in689
-rw-r--r--3rdparty/flac/src/libFLAC/include/config.h25
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/Makefile.am53
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/Makefile.in599
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/all.h50
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/bitmath.h211
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/bitreader.h101
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/bitwriter.h104
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/cpu.h198
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/crc.h60
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/fixed.h117
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/float.h95
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/format.h47
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/lpc.h238
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/macros.h74
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/md5.h50
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/memory.h58
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/metadata.h46
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/ogg_decoder_aspect.h80
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/ogg_encoder_aspect.h63
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/ogg_helper.h44
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/ogg_mapping.h64
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/stream_encoder.h67
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/stream_encoder_framing.h46
-rw-r--r--3rdparty/flac/src/libFLAC/include/private/window.h74
-rw-r--r--3rdparty/flac/src/libFLAC/include/protected/Makefile.am35
-rw-r--r--3rdparty/flac/src/libFLAC/include/protected/Makefile.in581
-rw-r--r--3rdparty/flac/src/libFLAC/include/protected/all.h39
-rw-r--r--3rdparty/flac/src/libFLAC/include/protected/stream_decoder.h60
-rw-r--r--3rdparty/flac/src/libFLAC/include/protected/stream_encoder.h124
-rw-r--r--3rdparty/flac/src/libFLAC/libFLAC.m4114
-rw-r--r--3rdparty/flac/src/libFLAC/lpc.c1629
-rw-r--r--3rdparty/flac/src/libFLAC/lpc_intrin_avx2.c1122
-rw-r--r--3rdparty/flac/src/libFLAC/lpc_intrin_fma.c73
-rw-r--r--3rdparty/flac/src/libFLAC/lpc_intrin_neon.c1273
-rw-r--r--3rdparty/flac/src/libFLAC/lpc_intrin_sse2.c966
-rw-r--r--3rdparty/flac/src/libFLAC/lpc_intrin_sse41.c950
-rw-r--r--3rdparty/flac/src/libFLAC/md5.c517
-rw-r--r--3rdparty/flac/src/libFLAC/memory.c219
-rw-r--r--3rdparty/flac/src/libFLAC/metadata_iterators.c3554
-rw-r--r--3rdparty/flac/src/libFLAC/metadata_object.c2018
-rw-r--r--3rdparty/flac/src/libFLAC/ogg_decoder_aspect.c251
-rw-r--r--3rdparty/flac/src/libFLAC/ogg_encoder_aspect.c228
-rw-r--r--3rdparty/flac/src/libFLAC/ogg_helper.c210
-rw-r--r--3rdparty/flac/src/libFLAC/ogg_mapping.c48
-rw-r--r--3rdparty/flac/src/libFLAC/stream_decoder.c3731
-rw-r--r--3rdparty/flac/src/libFLAC/stream_encoder.c4738
-rw-r--r--3rdparty/flac/src/libFLAC/stream_encoder_framing.c594
-rw-r--r--3rdparty/flac/src/libFLAC/stream_encoder_intrin_avx2.c146
-rw-r--r--3rdparty/flac/src/libFLAC/stream_encoder_intrin_sse2.c159
-rw-r--r--3rdparty/flac/src/libFLAC/stream_encoder_intrin_ssse3.c148
-rw-r--r--3rdparty/flac/src/libFLAC/version.rc40
-rw-r--r--3rdparty/flac/src/libFLAC/window.c308
-rw-r--r--3rdparty/flac/src/metaflac/CMakeLists.txt18
-rw-r--r--3rdparty/flac/src/metaflac/Makefile.am65
-rw-r--r--3rdparty/flac/src/metaflac/Makefile.in789
-rw-r--r--3rdparty/flac/src/metaflac/main.c75
-rw-r--r--3rdparty/flac/src/metaflac/operations.c823
-rw-r--r--3rdparty/flac/src/metaflac/operations.h27
-rw-r--r--3rdparty/flac/src/metaflac/operations_shorthand.h26
-rw-r--r--3rdparty/flac/src/metaflac/operations_shorthand_cuesheet.c226
-rw-r--r--3rdparty/flac/src/metaflac/operations_shorthand_picture.c184
-rw-r--r--3rdparty/flac/src/metaflac/operations_shorthand_seektable.c220
-rw-r--r--3rdparty/flac/src/metaflac/operations_shorthand_streaminfo.c127
-rw-r--r--3rdparty/flac/src/metaflac/operations_shorthand_vorbiscomment.c430
-rw-r--r--3rdparty/flac/src/metaflac/options.c1146
-rw-r--r--3rdparty/flac/src/metaflac/options.h221
-rw-r--r--3rdparty/flac/src/metaflac/usage.c349
-rw-r--r--3rdparty/flac/src/metaflac/usage.h26
-rw-r--r--3rdparty/flac/src/metaflac/utils.c282
-rw-r--r--3rdparty/flac/src/metaflac/utils.h47
-rw-r--r--3rdparty/flac/src/metaflac/version.rc38
-rw-r--r--3rdparty/flac/src/share/Makefile.am73
-rw-r--r--3rdparty/flac/src/share/Makefile.in905
-rw-r--r--3rdparty/flac/src/share/README5
-rw-r--r--3rdparty/flac/src/share/getopt/CMakeLists.txt13
-rw-r--r--3rdparty/flac/src/share/getopt/getopt.c1053
-rw-r--r--3rdparty/flac/src/share/getopt/getopt1.c189
-rw-r--r--3rdparty/flac/src/share/grabbag/CMakeLists.txt14
-rw-r--r--3rdparty/flac/src/share/grabbag/alloc.c48
-rw-r--r--3rdparty/flac/src/share/grabbag/cuesheet.c681
-rw-r--r--3rdparty/flac/src/share/grabbag/file.c207
-rw-r--r--3rdparty/flac/src/share/grabbag/picture.c515
-rw-r--r--3rdparty/flac/src/share/grabbag/replaygain.c669
-rw-r--r--3rdparty/flac/src/share/grabbag/seektable.c105
-rw-r--r--3rdparty/flac/src/share/grabbag/snprintf.c101
-rw-r--r--3rdparty/flac/src/share/replaygain_analysis/CMakeLists.txt2
-rw-r--r--3rdparty/flac/src/share/replaygain_analysis/replaygain_analysis.c575
-rw-r--r--3rdparty/flac/src/share/replaygain_synthesis/CMakeLists.txt2
-rw-r--r--3rdparty/flac/src/share/replaygain_synthesis/replaygain_synthesis.c429
-rw-r--r--3rdparty/flac/src/share/utf8/CMakeLists.txt8
-rw-r--r--3rdparty/flac/src/share/utf8/charmaps.h57
-rw-r--r--3rdparty/flac/src/share/utf8/charset.c534
-rw-r--r--3rdparty/flac/src/share/utf8/charset.h72
-rw-r--r--3rdparty/flac/src/share/utf8/charset_test.c263
-rw-r--r--3rdparty/flac/src/share/utf8/iconvert.c257
-rw-r--r--3rdparty/flac/src/share/utf8/iconvert.h49
-rw-r--r--3rdparty/flac/src/share/utf8/makemap.c81
-rw-r--r--3rdparty/flac/src/share/utf8/utf8.c202
-rw-r--r--3rdparty/flac/src/share/win_utf8_io/win_utf8_io.c398
-rw-r--r--3rdparty/flac/src/test_grabbag/CMakeLists.txt2
-rw-r--r--3rdparty/flac/src/test_grabbag/Makefile.am22
-rw-r--r--3rdparty/flac/src/test_grabbag/Makefile.in679
-rw-r--r--3rdparty/flac/src/test_grabbag/cuesheet/CMakeLists.txt5
-rw-r--r--3rdparty/flac/src/test_grabbag/cuesheet/Makefile.am37
-rw-r--r--3rdparty/flac/src/test_grabbag/cuesheet/Makefile.in669
-rw-r--r--3rdparty/flac/src/test_grabbag/cuesheet/main.c147
-rw-r--r--3rdparty/flac/src/test_grabbag/picture/CMakeLists.txt5
-rw-r--r--3rdparty/flac/src/test_grabbag/picture/Makefile.am37
-rw-r--r--3rdparty/flac/src/test_grabbag/picture/Makefile.in669
-rw-r--r--3rdparty/flac/src/test_grabbag/picture/main.c222
-rw-r--r--3rdparty/flac/src/test_libFLAC++/CMakeLists.txt10
-rw-r--r--3rdparty/flac/src/test_libFLAC++/Makefile.am50
-rw-r--r--3rdparty/flac/src/test_libFLAC++/Makefile.in720
-rw-r--r--3rdparty/flac/src/test_libFLAC++/decoders.cpp1179
-rw-r--r--3rdparty/flac/src/test_libFLAC++/decoders.h25
-rw-r--r--3rdparty/flac/src/test_libFLAC++/encoders.cpp576
-rw-r--r--3rdparty/flac/src/test_libFLAC++/encoders.h25
-rw-r--r--3rdparty/flac/src/test_libFLAC++/main.cpp42
-rw-r--r--3rdparty/flac/src/test_libFLAC++/metadata.cpp41
-rw-r--r--3rdparty/flac/src/test_libFLAC++/metadata.h25
-rw-r--r--3rdparty/flac/src/test_libFLAC++/metadata_manip.cpp2241
-rw-r--r--3rdparty/flac/src/test_libFLAC++/metadata_object.cpp2099
-rw-r--r--3rdparty/flac/src/test_libFLAC/CMakeLists.txt25
-rw-r--r--3rdparty/flac/src/test_libFLAC/Makefile.am63
-rw-r--r--3rdparty/flac/src/test_libFLAC/Makefile.in736
-rw-r--r--3rdparty/flac/src/test_libFLAC/bitreader.c355
-rw-r--r--3rdparty/flac/src/test_libFLAC/bitreader.h27
-rw-r--r--3rdparty/flac/src/test_libFLAC/bitwriter.c688
-rw-r--r--3rdparty/flac/src/test_libFLAC/bitwriter.h27
-rw-r--r--3rdparty/flac/src/test_libFLAC/crc.c274
-rw-r--r--3rdparty/flac/src/test_libFLAC/crc.h26
-rw-r--r--3rdparty/flac/src/test_libFLAC/decoders.c1054
-rw-r--r--3rdparty/flac/src/test_libFLAC/decoders.h27
-rw-r--r--3rdparty/flac/src/test_libFLAC/encoders.c530
-rw-r--r--3rdparty/flac/src/test_libFLAC/encoders.h27
-rw-r--r--3rdparty/flac/src/test_libFLAC/endswap.c111
-rw-r--r--3rdparty/flac/src/test_libFLAC/endswap.h26
-rw-r--r--3rdparty/flac/src/test_libFLAC/format.c260
-rw-r--r--3rdparty/flac/src/test_libFLAC/format.h27
-rw-r--r--3rdparty/flac/src/test_libFLAC/main.c64
-rw-r--r--3rdparty/flac/src/test_libFLAC/md5.c221
-rw-r--r--3rdparty/flac/src/test_libFLAC/md5.h26
-rw-r--r--3rdparty/flac/src/test_libFLAC/metadata.c41
-rw-r--r--3rdparty/flac/src/test_libFLAC/metadata.h29
-rw-r--r--3rdparty/flac/src/test_libFLAC/metadata_manip.c2146
-rw-r--r--3rdparty/flac/src/test_libFLAC/metadata_object.c2291
-rw-r--r--3rdparty/flac/src/test_libs_common/CMakeLists.txt4
-rw-r--r--3rdparty/flac/src/test_libs_common/Makefile.am29
-rw-r--r--3rdparty/flac/src/test_libs_common/Makefile.in666
-rw-r--r--3rdparty/flac/src/test_libs_common/README2
-rw-r--r--3rdparty/flac/src/test_libs_common/file_utils_flac.c155
-rw-r--r--3rdparty/flac/src/test_libs_common/metadata_utils.c636
-rw-r--r--3rdparty/flac/src/test_seeking/CMakeLists.txt5
-rw-r--r--3rdparty/flac/src/test_seeking/Makefile.am39
-rw-r--r--3rdparty/flac/src/test_seeking/Makefile.in666
-rw-r--r--3rdparty/flac/src/test_seeking/main.c473
-rw-r--r--3rdparty/flac/src/test_streams/CMakeLists.txt2
-rw-r--r--3rdparty/flac/src/test_streams/Makefile.am29
-rw-r--r--3rdparty/flac/src/test_streams/Makefile.in661
-rw-r--r--3rdparty/flac/src/test_streams/main.c1398
-rw-r--r--3rdparty/flac/src/utils/Makefile.am19
-rw-r--r--3rdparty/flac/src/utils/Makefile.in676
-rw-r--r--3rdparty/flac/src/utils/flacdiff/CMakeLists.txt5
-rw-r--r--3rdparty/flac/src/utils/flacdiff/Makefile.am21
-rw-r--r--3rdparty/flac/src/utils/flacdiff/Makefile.in501
-rw-r--r--3rdparty/flac/src/utils/flacdiff/main.cpp230
-rw-r--r--3rdparty/flac/src/utils/flactimer/CMakeLists.txt2
-rw-r--r--3rdparty/flac/src/utils/flactimer/Makefile.am21
-rw-r--r--3rdparty/flac/src/utils/flactimer/Makefile.in501
-rw-r--r--3rdparty/flac/src/utils/flactimer/main.cpp175
-rw-r--r--3rdparty/flac/test/CMakeLists.txt103
-rw-r--r--3rdparty/flac/test/Makefile.am62
-rw-r--r--3rdparty/flac/test/Makefile.in720
-rw-r--r--3rdparty/flac/test/common.sh.in87
-rw-r--r--3rdparty/flac/test/cuesheet.ok94
-rw-r--r--3rdparty/flac/test/cuesheets/Makefile.am69
-rw-r--r--3rdparty/flac/test/cuesheets/Makefile.in549
-rw-r--r--3rdparty/flac/test/cuesheets/bad.000.CATALOG_multiple.cue5
-rw-r--r--3rdparty/flac/test/cuesheets/bad.001.CATALOG_missing_number.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.002.CATALOG_number_too_long.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.003.CATALOG_not_13_digits.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.030.FLAGS_multiple.cue5
-rw-r--r--3rdparty/flac/test/cuesheets/bad.031.FLAGS_wrong_place_1.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.032.FLAGS_wrong_place_2.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.060.INDEX_wrong_place.cue5
-rw-r--r--3rdparty/flac/test/cuesheets/bad.061.INDEX_missing_number.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.062.INDEX_invalid_number_1.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.063.first_INDEX_not_0_or_1.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.064.INDEX_num_non_sequential.cue5
-rw-r--r--3rdparty/flac/test/cuesheets/bad.065.INDEX_num_out_of_range.cue104
-rw-r--r--3rdparty/flac/test/cuesheets/bad.066.INDEX_missing_offset.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.067.INDEX_illegal_offset.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.068.INDEX_cdda_illegal_offset.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.069.nonzero_first_INDEX.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.070.INDEX_offset_not_ascending_1.cue5
-rw-r--r--3rdparty/flac/test/cuesheets/bad.071.INDEX_offset_not_ascending_2.cue6
-rw-r--r--3rdparty/flac/test/cuesheets/bad.110.ISRC_multiple.cue5
-rw-r--r--3rdparty/flac/test/cuesheets/bad.111.ISRC_wrong_place_1.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.112.ISRC_wrong_place_2.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.113.ISRC_missing_number.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.114.ISRC_invalid_number.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.130.TRACK_missing_INDEX_01_1.cue2
-rw-r--r--3rdparty/flac/test/cuesheets/bad.131.TRACK_missing_INDEX_01_2.cue3
-rw-r--r--3rdparty/flac/test/cuesheets/bad.132.TRACK_missing_INDEX_01_3.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/bad.133.TRACK_missing_INDEX_01_4.cue5
-rw-r--r--3rdparty/flac/test/cuesheets/bad.134.TRACK_missing_number.cue2
-rw-r--r--3rdparty/flac/test/cuesheets/bad.135.TRACK_invalid_number_1.cue2
-rw-r--r--3rdparty/flac/test/cuesheets/bad.136.TRACK_invalid_number_2.cue2
-rw-r--r--3rdparty/flac/test/cuesheets/bad.137.TRACK_cdda_out_of_range.cue2
-rw-r--r--3rdparty/flac/test/cuesheets/bad.138.TRACK_num_non_sequential.cue6
-rw-r--r--3rdparty/flac/test/cuesheets/bad.139.TRACK_missing_type.cue2
-rw-r--r--3rdparty/flac/test/cuesheets/bad.140.no_TRACKs.cue1
-rw-r--r--3rdparty/flac/test/cuesheets/bad.200.FLAC_leadin_missing_offset.cue1
-rw-r--r--3rdparty/flac/test/cuesheets/bad.201.FLAC_leadin_illegal_offset.cue1
-rw-r--r--3rdparty/flac/test/cuesheets/bad.202.FLAC_leadin_cdda_illegal_offset.cue1
-rw-r--r--3rdparty/flac/test/cuesheets/bad.230.FLAC_leadout_multiple.cue3
-rw-r--r--3rdparty/flac/test/cuesheets/bad.231.FLAC_leadout_missing_track.cue1
-rw-r--r--3rdparty/flac/test/cuesheets/bad.232.FLAC_leadout_illegal_track.cue1
-rw-r--r--3rdparty/flac/test/cuesheets/bad.233.FLAC_leadout_missing_offset.cue1
-rw-r--r--3rdparty/flac/test/cuesheets/bad.234.FLAC_leadout_illegal_offset.cue1
-rw-r--r--3rdparty/flac/test/cuesheets/bad.235.FLAC_leadout_offset_not_211680000.cue1
-rw-r--r--3rdparty/flac/test/cuesheets/good.000.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/good.001.cue184
-rw-r--r--3rdparty/flac/test/cuesheets/good.002.dos_format.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/good.003.missing_final_newline.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/good.004.dos_format.missing_final_newline.cue4
-rw-r--r--3rdparty/flac/test/cuesheets/good.005.quoted.isrc.cue6
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/Makefile.am49
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/Makefile.in529
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/Prøve.flacbin0 -> 1257 bytes-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case00a-expect.meta84
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case01a-expect.meta79
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case01b-expect.meta75
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case01c-expect.meta79
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case01d-expect.meta79
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case01e-expect.meta79
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case02a-expect.meta73
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case02b-expect.meta74
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case02c-expect.meta79
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case03a-expect.meta84
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case03b-expect.meta84
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case03c-expect.meta41
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case04a-expect.meta26
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case04b-expect.meta36
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case04c-expect.meta32
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case04d-expect.meta60
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/case04e-expect.meta70
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/input-SCPAP.flacbin0 -> 4021 bytes-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/input-SCVA.flacbin0 -> 1015 bytes-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/input-SCVAUP.flacbin0 -> 4224 bytes-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/input-SCVPAP.flacbin0 -> 4228 bytes-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/input-SVAUP.flacbin0 -> 3680 bytes-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/input-VA.flacbin0 -> 287 bytes-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/input0.cue7
-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/שלו×.flacbin0 -> 3926 bytes-rw-r--r--3rdparty/flac/test/flac-to-flac-metadata-test-files/🤔.flacbin0 -> 1708 bytes-rw-r--r--3rdparty/flac/test/foreign-metadata-test-files/24bit-WaveFmtPCM.wavbin0 -> 1368 bytes-rw-r--r--3rdparty/flac/test/foreign-metadata-test-files/AIFF-C-sowt-compression-type-name.aifcbin0 -> 372 bytes-rw-r--r--3rdparty/flac/test/foreign-metadata-test-files/AIFF-C-sowt-tag.aifcbin0 -> 3120 bytes-rw-r--r--3rdparty/flac/test/foreign-metadata-test-files/AIFF-ID3.aiffbin0 -> 4580 bytes-rwxr-xr-x3rdparty/flac/test/foreign-metadata-test-files/BWF-WaveFmtEx.wavbin0 -> 11402 bytes-rw-r--r--3rdparty/flac/test/foreign-metadata-test-files/Makefile.am24
-rw-r--r--3rdparty/flac/test/foreign-metadata-test-files/Makefile.in504
-rwxr-xr-x3rdparty/flac/test/generate_streams.sh29
-rw-r--r--3rdparty/flac/test/metaflac-test-files/Makefile.am90
-rw-r--r--3rdparty/flac/test/metaflac-test-files/Makefile.in570
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case00-expect.meta24
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case01-expect.meta9
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case02-expect.meta28
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case03-expect.meta25
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case04-expect.meta26
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case05-expect.meta27
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case06-expect.meta28
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case07-expect.meta4
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case08-expect.meta27
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case09-expect.meta25
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case10-expect.meta6
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case11-expect.meta9
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case12-expect.meta12
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case13-expect.meta10
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case14-expect.meta13
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case15-expect.meta16
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case16-expect.meta33
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case17-expect.meta25
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case18-expect.meta29
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case19-expect.meta25
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case20-expect.meta29
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case21-expect.meta24
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case22-expect.meta18
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case23-expect.meta18
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case24-expect.meta18
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case25-expect.meta14
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case26-expect.meta22
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case27-expect.meta13
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case28-expect.meta13
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case29-expect.meta9
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case30-expect.meta9
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case31-expect.meta15
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case32-expect.meta15
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case33-expect.meta19
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case34-expect.meta19
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case35-expect.meta19
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case36-expect.meta15
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case37-expect.meta19
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case38-expect.meta19
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case39-expect.meta20
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case40-expect.meta22
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case41-expect.meta27
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case42-expect.meta22
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case43-expect.meta49
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case44-expect.meta28
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case45-expect.meta49
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case46-expect.meta62
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case47-expect.meta75
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case48-expect.meta88
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case49-expect.meta101
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case50-expect.meta114
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case51-expect.meta127
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case52-expect.meta140
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case53-expect.meta153
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case54-expect.meta166
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case55-expect.meta179
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case56-expect.meta192
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case57-expect.meta205
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case58-expect.meta218
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case59-expect.meta231
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case60-expect.meta49
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case61-expect.meta62
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case62-expect.meta75
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case63-expect.meta74
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case64-expect.meta3
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case65-expect.metabin0 -> 1672 bytes-rw-r--r--3rdparty/flac/test/metaflac-test-files/case66-expect.meta62
-rw-r--r--3rdparty/flac/test/metaflac-test-files/case67-expect.meta95
-rw-r--r--3rdparty/flac/test/metaflac.flac.inbin0 -> 667 bytes-rw-r--r--3rdparty/flac/test/metaflac.flac.okbin0 -> 617 bytes-rw-r--r--3rdparty/flac/test/picture.ok42
-rw-r--r--3rdparty/flac/test/pictures/0.gifbin0 -> 95 bytes-rw-r--r--3rdparty/flac/test/pictures/0.jpgbin0 -> 330 bytes-rw-r--r--3rdparty/flac/test/pictures/0.pngbin0 -> 446 bytes-rw-r--r--3rdparty/flac/test/pictures/1.gifbin0 -> 871 bytes-rw-r--r--3rdparty/flac/test/pictures/1.pngbin0 -> 462 bytes-rw-r--r--3rdparty/flac/test/pictures/2.gifbin0 -> 532 bytes-rw-r--r--3rdparty/flac/test/pictures/2.pngbin0 -> 292 bytes-rw-r--r--3rdparty/flac/test/pictures/3.pngbin0 -> 308 bytes-rw-r--r--3rdparty/flac/test/pictures/4.jpgbin0 -> 567 bytes-rw-r--r--3rdparty/flac/test/pictures/4.pngbin0 -> 1800 bytes-rw-r--r--3rdparty/flac/test/pictures/5.pngbin0 -> 1816 bytes-rw-r--r--3rdparty/flac/test/pictures/6.pngbin0 -> 543 bytes-rw-r--r--3rdparty/flac/test/pictures/7.pngbin0 -> 559 bytes-rw-r--r--3rdparty/flac/test/pictures/8.pngbin0 -> 244 bytes-rw-r--r--3rdparty/flac/test/pictures/Makefile.am33
-rw-r--r--3rdparty/flac/test/pictures/Makefile.in513
-rwxr-xr-x3rdparty/flac/test/test_compression.sh46
-rwxr-xr-x3rdparty/flac/test/test_flac.sh1338
-rwxr-xr-x3rdparty/flac/test/test_grabbag.sh128
-rwxr-xr-x3rdparty/flac/test/test_libFLAC++.sh35
-rwxr-xr-x3rdparty/flac/test/test_libFLAC.sh35
-rwxr-xr-x3rdparty/flac/test/test_metaflac.sh478
-rwxr-xr-x3rdparty/flac/test/test_replaygain.sh146
-rwxr-xr-x3rdparty/flac/test/test_seeking.sh141
-rwxr-xr-x3rdparty/flac/test/test_streams.sh331
-rwxr-xr-x3rdparty/flac/test/write_iff.pl211
-rw-r--r--3rdparty/genie/.editorconfig13
-rw-r--r--3rdparty/genie/.gitignore4
-rw-r--r--3rdparty/genie/LICENSE112
-rw-r--r--3rdparty/genie/README.md258
-rw-r--r--3rdparty/genie/build/gmake.darwin/Makefile37
-rw-r--r--3rdparty/genie/build/gmake.darwin/genie.make686
-rw-r--r--3rdparty/genie/build/gmake.freebsd/Makefile34
-rw-r--r--3rdparty/genie/build/gmake.freebsd/genie.make509
-rw-r--r--3rdparty/genie/build/gmake.linux/Makefile35
-rw-r--r--3rdparty/genie/build/gmake.linux/genie.make510
-rw-r--r--3rdparty/genie/build/gmake.windows/Makefile35
-rw-r--r--3rdparty/genie/build/gmake.windows/genie.make510
-rw-r--r--3rdparty/genie/docs/scripting-reference.md2703
-rw-r--r--3rdparty/genie/makefile67
-rw-r--r--3rdparty/genie/scripts/embed.lua98
-rw-r--r--3rdparty/genie/scripts/genie.lua147
-rw-r--r--3rdparty/genie/scripts/release.lua47
-rw-r--r--3rdparty/genie/src/_manifest.lua96
-rw-r--r--3rdparty/genie/src/_premake_main.lua155
-rw-r--r--3rdparty/genie/src/actions/cmake/_cmake.lua43
-rw-r--r--3rdparty/genie/src/actions/cmake/cmake_project.lua675
-rw-r--r--3rdparty/genie/src/actions/cmake/cmake_workspace.lua66
-rw-r--r--3rdparty/genie/src/actions/example/_example.lua99
-rw-r--r--3rdparty/genie/src/actions/example/example_project.lua91
-rw-r--r--3rdparty/genie/src/actions/example/example_solution.lua46
-rw-r--r--3rdparty/genie/src/actions/jcdb/_jcdb.lua21
-rw-r--r--3rdparty/genie/src/actions/jcdb/jcdb_solution.lua153
-rw-r--r--3rdparty/genie/src/actions/make/_make.lua192
-rw-r--r--3rdparty/genie/src/actions/make/make_cpp.lua675
-rw-r--r--3rdparty/genie/src/actions/make/make_csharp.lua302
-rw-r--r--3rdparty/genie/src/actions/make/make_solution.lua80
-rw-r--r--3rdparty/genie/src/actions/make/make_swift.lua196
-rw-r--r--3rdparty/genie/src/actions/make/make_vala.lua362
-rw-r--r--3rdparty/genie/src/actions/ninja/_ninja.lua56
-rw-r--r--3rdparty/genie/src/actions/ninja/ninja_base.lua164
-rw-r--r--3rdparty/genie/src/actions/ninja/ninja_cpp.lua388
-rw-r--r--3rdparty/genie/src/actions/ninja/ninja_solution.lua173
-rw-r--r--3rdparty/genie/src/actions/ninja/ninja_swift.lua121
-rw-r--r--3rdparty/genie/src/actions/ninja/ninja_swift_incremental.lua181
-rw-r--r--3rdparty/genie/src/actions/vstudio/_vstudio.lua295
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2010.lua57
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2012.lua60
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2013.lua64
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2015.lua64
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2017.lua64
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2019.lua64
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2022.lua64
-rw-r--r--3rdparty/genie/src/actions/vstudio/vs2026.lua63
-rw-r--r--3rdparty/genie/src/actions/vstudio/vstudio_slnx.lua112
-rw-r--r--3rdparty/genie/src/actions/vstudio/vstudio_solution.lua268
-rw-r--r--3rdparty/genie/src/actions/vstudio/vstudio_vcxproj.lua1856
-rw-r--r--3rdparty/genie/src/actions/vstudio/vstudio_vcxproj_filters.lua145
-rw-r--r--3rdparty/genie/src/actions/xcode/_xcode.lua31
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode10.lua116
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode11.lua91
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode14.lua121
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode15.lua124
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode8.lua354
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode9.lua109
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode_common.lua1324
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode_project.lua186
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode_scheme.lua240
-rw-r--r--3rdparty/genie/src/actions/xcode/xcode_workspace.lua146
-rw-r--r--3rdparty/genie/src/base/action.lua170
-rw-r--r--3rdparty/genie/src/base/api.lua1563
-rw-r--r--3rdparty/genie/src/base/bake.lua870
-rw-r--r--3rdparty/genie/src/base/cmdline.lua106
-rw-r--r--3rdparty/genie/src/base/config.lua107
-rw-r--r--3rdparty/genie/src/base/globals.lua224
-rw-r--r--3rdparty/genie/src/base/help.lua48
-rw-r--r--3rdparty/genie/src/base/inspect.lua291
-rw-r--r--3rdparty/genie/src/base/io.lua136
-rw-r--r--3rdparty/genie/src/base/iter.lua16
-rw-r--r--3rdparty/genie/src/base/option.lua113
-rw-r--r--3rdparty/genie/src/base/os.lua298
-rw-r--r--3rdparty/genie/src/base/path.lua400
-rw-r--r--3rdparty/genie/src/base/premake.lua120
-rw-r--r--3rdparty/genie/src/base/profiler.lua613
-rw-r--r--3rdparty/genie/src/base/project.lua775
-rw-r--r--3rdparty/genie/src/base/set.lua77
-rw-r--r--3rdparty/genie/src/base/solution.lua148
-rw-r--r--3rdparty/genie/src/base/string.lua62
-rw-r--r--3rdparty/genie/src/base/table.lua260
-rw-r--r--3rdparty/genie/src/base/tree.lua231
-rw-r--r--3rdparty/genie/src/base/validate.lua91
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/Makefile114
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/README6
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/doc/contents.html619
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/doc/logo.gifbin0 -> 4232 bytes-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/doc/lua.1111
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/doc/lua.css105
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/doc/luac.1118
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/doc/manual.css27
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/doc/manual.html10789
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/doc/osi-certified-72x60.pngbin0 -> 3774 bytes-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/doc/readme.html371
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/Makefile197
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lapi.c1270
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lapi.h24
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lauxlib.c972
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lauxlib.h256
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lbaselib.c520
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lbitlib.c230
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lcode.c954
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lcode.h87
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lcorolib.c168
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lctype.c55
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lctype.h95
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/ldblib.c437
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/ldebug.c643
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/ldebug.h40
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/ldo.c717
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/ldo.h46
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/ldump.c214
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lfunc.c151
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lfunc.h54
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lgc.c1159
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lgc.h138
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/linit.c68
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/liolib.c757
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/llex.c602
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/llex.h86
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/llimits.h242
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lmathlib.c404
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lmem.c99
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lmem.h69
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/loadlib.c786
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lobject.c470
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lobject.h540
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lopcodes.c124
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lopcodes.h295
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/loslib.c356
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lparser.c1647
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lparser.h120
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lprefix.h45
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lstate.c346
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lstate.h223
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lstring.c182
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lstring.h46
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lstrlib.c1430
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/ltable.c650
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/ltable.h53
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/ltablib.c357
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/ltm.c143
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/ltm.h75
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lua.c611
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lua.h485
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lua.hpp9
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/luac.c449
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/luaconf.h735
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lualib.h58
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lundump.c277
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lundump.h33
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lutf8lib.c255
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lvm.c1182
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lvm.h58
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lzio.c78
-rw-r--r--3rdparty/genie/src/host/lua-5.3.0/src/lzio.h67
-rw-r--r--3rdparty/genie/src/host/os_chdir.c32
-rw-r--r--3rdparty/genie/src/host/os_copyfile.c34
-rw-r--r--3rdparty/genie/src/host/os_getcwd.c34
-rw-r--r--3rdparty/genie/src/host/os_is64bit.c30
-rw-r--r--3rdparty/genie/src/host/os_isdir.c34
-rw-r--r--3rdparty/genie/src/host/os_isfile.c30
-rw-r--r--3rdparty/genie/src/host/os_match.c183
-rw-r--r--3rdparty/genie/src/host/os_mkdir.c33
-rw-r--r--3rdparty/genie/src/host/os_pathsearch.c84
-rw-r--r--3rdparty/genie/src/host/os_rmdir.c33
-rw-r--r--3rdparty/genie/src/host/os_stat.c46
-rw-r--r--3rdparty/genie/src/host/os_ticks.c41
-rw-r--r--3rdparty/genie/src/host/os_uuid.c79
-rw-r--r--3rdparty/genie/src/host/path_getabsolute.c15
-rw-r--r--3rdparty/genie/src/host/path_getrelative.c16
-rw-r--r--3rdparty/genie/src/host/path_helpers.c253
-rw-r--r--3rdparty/genie/src/host/path_isabsolute.c18
-rw-r--r--3rdparty/genie/src/host/premake.c388
-rw-r--r--3rdparty/genie/src/host/premake.h91
-rw-r--r--3rdparty/genie/src/host/premake_main.c29
-rw-r--r--3rdparty/genie/src/host/scripts.c567
-rw-r--r--3rdparty/genie/src/host/string_endswith.c28
-rw-r--r--3rdparty/genie/src/host/string_hash.c35
-rw-r--r--3rdparty/genie/src/host/version.h2
-rw-r--r--3rdparty/genie/src/tools/dotnet.lua85
-rw-r--r--3rdparty/genie/src/tools/gcc.lua399
-rw-r--r--3rdparty/genie/src/tools/ghs.lua201
-rw-r--r--3rdparty/genie/src/tools/msc.lua9
-rw-r--r--3rdparty/genie/src/tools/ow.lua146
-rw-r--r--3rdparty/genie/src/tools/snc.lua179
-rw-r--r--3rdparty/genie/src/tools/swift.lua141
-rw-r--r--3rdparty/genie/src/tools/valac.lua121
-rw-r--r--3rdparty/genie/tests/actions/make/test_make_escaping.lua30
-rw-r--r--3rdparty/genie/tests/actions/make/test_make_linking.lua126
-rw-r--r--3rdparty/genie/tests/actions/make/test_make_pch.lua120
-rw-r--r--3rdparty/genie/tests/actions/make/test_makesettings.lua51
-rw-r--r--3rdparty/genie/tests/actions/make/test_wiidev.lua62
-rw-r--r--3rdparty/genie/tests/actions/test_clean.lua197
-rw-r--r--3rdparty/genie/tests/actions/vstudio/cs2002/test_files.lua141
-rw-r--r--3rdparty/genie/tests/actions/vstudio/cs2005/projectelement.lua74
-rw-r--r--3rdparty/genie/tests/actions/vstudio/cs2005/projectsettings.lua139
-rw-r--r--3rdparty/genie/tests/actions/vstudio/cs2005/propertygroup.lua59
-rw-r--r--3rdparty/genie/tests/actions/vstudio/cs2005/test_files.lua83
-rw-r--r--3rdparty/genie/tests/actions/vstudio/sln2005/dependencies.lua58
-rw-r--r--3rdparty/genie/tests/actions/vstudio/sln2005/header.lua79
-rw-r--r--3rdparty/genie/tests/actions/vstudio/sln2005/layout.lua51
-rw-r--r--3rdparty/genie/tests/actions/vstudio/sln2005/platforms.lua135
-rw-r--r--3rdparty/genie/tests/actions/vstudio/sln2005/projectplatforms.lua99
-rw-r--r--3rdparty/genie/tests/actions/vstudio/sln2005/projects.lua67
-rw-r--r--3rdparty/genie/tests/actions/vstudio/test_vs200x_vcproj.lua687
-rw-r--r--3rdparty/genie/tests/actions/vstudio/test_vs200x_vcproj_linker.lua116
-rw-r--r--3rdparty/genie/tests/actions/vstudio/test_vs2010_flags.lua363
-rw-r--r--3rdparty/genie/tests/actions/vstudio/test_vs2010_project_kinds.lua166
-rw-r--r--3rdparty/genie/tests/actions/vstudio/test_vs2010_vcxproj.lua289
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc200x/debugdir.lua88
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc200x/header.lua43
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc200x/test_files.lua222
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc200x/test_filters.lua58
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc2010/test_config_props.lua78
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc2010/test_debugdir.lua96
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc2010/test_files.lua103
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc2010/test_filters.lua193
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc2010/test_header.lua45
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc2010/test_link_settings.lua229
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc2010/test_links.lua93
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc2010/test_output_props.lua179
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc2010/test_pch.lua63
-rw-r--r--3rdparty/genie/tests/actions/vstudio/vc2010/test_project_refs.lua78
-rw-r--r--3rdparty/genie/tests/baking/test_merging.lua99
-rw-r--r--3rdparty/genie/tests/base/test_action.lua73
-rw-r--r--3rdparty/genie/tests/base/test_api.lua404
-rw-r--r--3rdparty/genie/tests/base/test_baking.lua174
-rw-r--r--3rdparty/genie/tests/base/test_config.lua98
-rw-r--r--3rdparty/genie/tests/base/test_config_bug.lua192
-rw-r--r--3rdparty/genie/tests/base/test_location.lua100
-rw-r--r--3rdparty/genie/tests/base/test_os.lua124
-rw-r--r--3rdparty/genie/tests/base/test_path.lua266
-rw-r--r--3rdparty/genie/tests/base/test_premake_command.lua14
-rw-r--r--3rdparty/genie/tests/base/test_table.lua65
-rw-r--r--3rdparty/genie/tests/base/test_tree.lua143
-rw-r--r--3rdparty/genie/tests/folder/ok.lua1
-rw-r--r--3rdparty/genie/tests/folder/ok.lua.21
-rw-r--r--3rdparty/genie/tests/pepperfish_profiler.lua616
-rw-r--r--3rdparty/genie/tests/premake4.lua150
-rw-r--r--3rdparty/genie/tests/project/test_eachfile.lua46
-rw-r--r--3rdparty/genie/tests/project/test_vpaths.lua160
-rw-r--r--3rdparty/genie/tests/stress2
-rw-r--r--3rdparty/genie/tests/test2
-rw-r--r--3rdparty/genie/tests/test.bat3
-rw-r--r--3rdparty/genie/tests/test_dofile.lua36
-rw-r--r--3rdparty/genie/tests/test_gmake_cpp.lua194
-rw-r--r--3rdparty/genie/tests/test_gmake_cs.lua79
-rw-r--r--3rdparty/genie/tests/test_keywords.lua87
-rw-r--r--3rdparty/genie/tests/test_platforms.lua58
-rw-r--r--3rdparty/genie/tests/test_premake.lua47
-rw-r--r--3rdparty/genie/tests/test_project.lua64
-rw-r--r--3rdparty/genie/tests/test_stress.lua44
-rw-r--r--3rdparty/genie/tests/test_string.lua73
-rw-r--r--3rdparty/genie/tests/test_targets.lua294
-rw-r--r--3rdparty/genie/tests/testfx.lua287
-rw-r--r--3rdparty/genie/tests/tools/test_gcc.lua78
-rw-r--r--3rdparty/glm/.appveyor.yml34
-rw-r--r--3rdparty/glm/.gitignore54
-rw-r--r--3rdparty/glm/.travis.yml84
-rw-r--r--3rdparty/glm/CMakeLists.txt232
-rw-r--r--3rdparty/glm/cmake/CMakePackageConfigHelpers.cmake227
-rw-r--r--3rdparty/glm/cmake/GNUInstallDirs.cmake188
-rw-r--r--3rdparty/glm/cmake/glm.pc.in7
-rw-r--r--3rdparty/glm/cmake/glmBuildConfig.cmake.in6
-rw-r--r--3rdparty/glm/cmake/glmConfig.cmake.in9
-rw-r--r--3rdparty/glm/copying.txt54
-rw-r--r--3rdparty/glm/doc/api/a00001.html66
-rw-r--r--3rdparty/glm/doc/api/a00001_source.html457
-rw-r--r--3rdparty/glm/doc/api/a00002.html66
-rw-r--r--3rdparty/glm/doc/api/a00002_source.html83
-rw-r--r--3rdparty/glm/doc/api/a00003.html66
-rw-r--r--3rdparty/glm/doc/api/a00003_source.html167
-rw-r--r--3rdparty/glm/doc/api/a00004.html66
-rw-r--r--3rdparty/glm/doc/api/a00004_source.html857
-rw-r--r--3rdparty/glm/doc/api/a00005.html66
-rw-r--r--3rdparty/glm/doc/api/a00005_source.html754
-rw-r--r--3rdparty/glm/doc/api/a00006.html66
-rw-r--r--3rdparty/glm/doc/api/a00006_source.html194
-rw-r--r--3rdparty/glm/doc/api/a00007.html141
-rw-r--r--3rdparty/glm/doc/api/a00007_source.html207
-rw-r--r--3rdparty/glm/doc/api/a00008.html102
-rw-r--r--3rdparty/glm/doc/api/a00008_source.html111
-rw-r--r--3rdparty/glm/doc/api/a00009.html137
-rw-r--r--3rdparty/glm/doc/api/a00009_source.html149
-rw-r--r--3rdparty/glm/doc/api/a00010.html80
-rw-r--r--3rdparty/glm/doc/api/a00010_source.html90
-rw-r--r--3rdparty/glm/doc/api/a00011.html88
-rw-r--r--3rdparty/glm/doc/api/a00011_source.html97
-rw-r--r--3rdparty/glm/doc/api/a00012.html91
-rw-r--r--3rdparty/glm/doc/api/a00012_source.html107
-rw-r--r--3rdparty/glm/doc/api/a00013.html85
-rw-r--r--3rdparty/glm/doc/api/a00013_source.html98
-rw-r--r--3rdparty/glm/doc/api/a00014.html66
-rw-r--r--3rdparty/glm/doc/api/a00014_source.html65
-rw-r--r--3rdparty/glm/doc/api/a00015.html81
-rw-r--r--3rdparty/glm/doc/api/a00015_source.html88
-rw-r--r--3rdparty/glm/doc/api/a00016.html327
-rw-r--r--3rdparty/glm/doc/api/a00016_source.html239
-rw-r--r--3rdparty/glm/doc/api/a00017.html93
-rw-r--r--3rdparty/glm/doc/api/a00017_source.html102
-rw-r--r--3rdparty/glm/doc/api/a00018.html162
-rw-r--r--3rdparty/glm/doc/api/a00018_source.html193
-rw-r--r--3rdparty/glm/doc/api/a00019.html129
-rw-r--r--3rdparty/glm/doc/api/a00019_source.html271
-rw-r--r--3rdparty/glm/doc/api/a00020.html89
-rw-r--r--3rdparty/glm/doc/api/a00020_source.html105
-rw-r--r--3rdparty/glm/doc/api/a00021.html126
-rw-r--r--3rdparty/glm/doc/api/a00021_source.html175
-rw-r--r--3rdparty/glm/doc/api/a00022.html66
-rw-r--r--3rdparty/glm/doc/api/a00022_source.html65
-rw-r--r--3rdparty/glm/doc/api/a00023.html66
-rw-r--r--3rdparty/glm/doc/api/a00023_source.html219
-rw-r--r--3rdparty/glm/doc/api/a00024.html76
-rw-r--r--3rdparty/glm/doc/api/a00024_source.html84
-rw-r--r--3rdparty/glm/doc/api/a00025.html111
-rw-r--r--3rdparty/glm/doc/api/a00025_source.html157
-rw-r--r--3rdparty/glm/doc/api/a00026.html111
-rw-r--r--3rdparty/glm/doc/api/a00026_source.html118
-rw-r--r--3rdparty/glm/doc/api/a00027.html100
-rw-r--r--3rdparty/glm/doc/api/a00027_source.html111
-rw-r--r--3rdparty/glm/doc/api/a00028.html97
-rw-r--r--3rdparty/glm/doc/api/a00028_source.html109
-rw-r--r--3rdparty/glm/doc/api/a00029.html168
-rw-r--r--3rdparty/glm/doc/api/a00029_source.html238
-rw-r--r--3rdparty/glm/doc/api/a00030.html94
-rw-r--r--3rdparty/glm/doc/api/a00030_source.html110
-rw-r--r--3rdparty/glm/doc/api/a00031.html97
-rw-r--r--3rdparty/glm/doc/api/a00031_source.html121
-rw-r--r--3rdparty/glm/doc/api/a00032.html112
-rw-r--r--3rdparty/glm/doc/api/a00032_source.html149
-rw-r--r--3rdparty/glm/doc/api/a00033.html85
-rw-r--r--3rdparty/glm/doc/api/a00033_source.html165
-rw-r--r--3rdparty/glm/doc/api/a00034.html99
-rw-r--r--3rdparty/glm/doc/api/a00034_source.html115
-rw-r--r--3rdparty/glm/doc/api/a00035.html118
-rw-r--r--3rdparty/glm/doc/api/a00035_source.html135
-rw-r--r--3rdparty/glm/doc/api/a00036.html100
-rw-r--r--3rdparty/glm/doc/api/a00036_source.html111
-rw-r--r--3rdparty/glm/doc/api/a00037.html83
-rw-r--r--3rdparty/glm/doc/api/a00037_source.html93
-rw-r--r--3rdparty/glm/doc/api/a00038.html979
-rw-r--r--3rdparty/glm/doc/api/a00038_source.html1716
-rw-r--r--3rdparty/glm/doc/api/a00039.html66
-rw-r--r--3rdparty/glm/doc/api/a00039_source.html65
-rw-r--r--3rdparty/glm/doc/api/a00040.html66
-rw-r--r--3rdparty/glm/doc/api/a00040_source.html119
-rw-r--r--3rdparty/glm/doc/api/a00041.html81
-rw-r--r--3rdparty/glm/doc/api/a00041_source.html93
-rw-r--r--3rdparty/glm/doc/api/a00042.html79
-rw-r--r--3rdparty/glm/doc/api/a00042_source.html91
-rw-r--r--3rdparty/glm/doc/api/a00043.html67
-rw-r--r--3rdparty/glm/doc/api/a00043_source.html185
-rw-r--r--3rdparty/glm/doc/api/a00044.html93
-rw-r--r--3rdparty/glm/doc/api/a00044_source.html104
-rw-r--r--3rdparty/glm/doc/api/a00045.html98
-rw-r--r--3rdparty/glm/doc/api/a00045_source.html107
-rw-r--r--3rdparty/glm/doc/api/a00046.html66
-rw-r--r--3rdparty/glm/doc/api/a00046_source.html65
-rw-r--r--3rdparty/glm/doc/api/a00047.html93
-rw-r--r--3rdparty/glm/doc/api/a00047_source.html124
-rw-r--r--3rdparty/glm/doc/api/a00048.html72
-rw-r--r--3rdparty/glm/doc/api/a00048_source.html237
-rw-r--r--3rdparty/glm/doc/api/a00049.html79
-rw-r--r--3rdparty/glm/doc/api/a00049_source.html89
-rw-r--r--3rdparty/glm/doc/api/a00050_source.html2457
-rw-r--r--3rdparty/glm/doc/api/a00051.html66
-rw-r--r--3rdparty/glm/doc/api/a00051_source.html88
-rw-r--r--3rdparty/glm/doc/api/a00052.html66
-rw-r--r--3rdparty/glm/doc/api/a00052_source.html80
-rw-r--r--3rdparty/glm/doc/api/a00053.html66
-rw-r--r--3rdparty/glm/doc/api/a00053_source.html79
-rw-r--r--3rdparty/glm/doc/api/a00054.html66
-rw-r--r--3rdparty/glm/doc/api/a00054_source.html79
-rw-r--r--3rdparty/glm/doc/api/a00055.html66
-rw-r--r--3rdparty/glm/doc/api/a00055_source.html88
-rw-r--r--3rdparty/glm/doc/api/a00056.html66
-rw-r--r--3rdparty/glm/doc/api/a00056_source.html79
-rw-r--r--3rdparty/glm/doc/api/a00057.html66
-rw-r--r--3rdparty/glm/doc/api/a00057_source.html79
-rw-r--r--3rdparty/glm/doc/api/a00058_source.html79
-rw-r--r--3rdparty/glm/doc/api/a00059.html66
-rw-r--r--3rdparty/glm/doc/api/a00059_source.html88
-rw-r--r--3rdparty/glm/doc/api/a00060.html66
-rw-r--r--3rdparty/glm/doc/api/a00060_source.html65
-rw-r--r--3rdparty/glm/doc/api/a00061.html85
-rw-r--r--3rdparty/glm/doc/api/a00061_source.html101
-rw-r--r--3rdparty/glm/doc/api/a00062.html81
-rw-r--r--3rdparty/glm/doc/api/a00062_source.html87
-rw-r--r--3rdparty/glm/doc/api/a00063.html76
-rw-r--r--3rdparty/glm/doc/api/a00063_source.html91
-rw-r--r--3rdparty/glm/doc/api/a00064.html265
-rw-r--r--3rdparty/glm/doc/api/a00064_source.html438
-rw-r--r--3rdparty/glm/doc/api/a00065.html86
-rw-r--r--3rdparty/glm/doc/api/a00065_source.html104
-rw-r--r--3rdparty/glm/doc/api/a00066.html79
-rw-r--r--3rdparty/glm/doc/api/a00066_source.html89
-rw-r--r--3rdparty/glm/doc/api/a00067.html111
-rw-r--r--3rdparty/glm/doc/api/a00067_source.html143
-rw-r--r--3rdparty/glm/doc/api/a00068.html100
-rw-r--r--3rdparty/glm/doc/api/a00068_source.html122
-rw-r--r--3rdparty/glm/doc/api/a00069.html99
-rw-r--r--3rdparty/glm/doc/api/a00069_source.html108
-rw-r--r--3rdparty/glm/doc/api/a00070.html158
-rw-r--r--3rdparty/glm/doc/api/a00070_source.html289
-rw-r--r--3rdparty/glm/doc/api/a00071.html89
-rw-r--r--3rdparty/glm/doc/api/a00071_source.html110
-rw-r--r--3rdparty/glm/doc/api/a00072.html77
-rw-r--r--3rdparty/glm/doc/api/a00072_source.html84
-rw-r--r--3rdparty/glm/doc/api/a00073.html82
-rw-r--r--3rdparty/glm/doc/api/a00073_source.html100
-rw-r--r--3rdparty/glm/doc/api/a00074.html99
-rw-r--r--3rdparty/glm/doc/api/a00074_source.html121
-rw-r--r--3rdparty/glm/doc/api/a00075.html78
-rw-r--r--3rdparty/glm/doc/api/a00075_source.html84
-rw-r--r--3rdparty/glm/doc/api/a00076.html81
-rw-r--r--3rdparty/glm/doc/api/a00076_source.html85
-rw-r--r--3rdparty/glm/doc/api/a00077.html107
-rw-r--r--3rdparty/glm/doc/api/a00077_source.html115
-rw-r--r--3rdparty/glm/doc/api/a00078.html82
-rw-r--r--3rdparty/glm/doc/api/a00078_source.html91
-rw-r--r--3rdparty/glm/doc/api/a00079.html81
-rw-r--r--3rdparty/glm/doc/api/a00079_source.html86
-rw-r--r--3rdparty/glm/doc/api/a00080.html175
-rw-r--r--3rdparty/glm/doc/api/a00080_source.html233
-rw-r--r--3rdparty/glm/doc/api/a00081.html66
-rw-r--r--3rdparty/glm/doc/api/a00081_source.html65
-rw-r--r--3rdparty/glm/doc/api/a00082_source.html61
-rw-r--r--3rdparty/glm/doc/api/a00083.html78
-rw-r--r--3rdparty/glm/doc/api/a00083_source.html84
-rw-r--r--3rdparty/glm/doc/api/a00084.html79
-rw-r--r--3rdparty/glm/doc/api/a00084_source.html87
-rw-r--r--3rdparty/glm/doc/api/a00085.html66
-rw-r--r--3rdparty/glm/doc/api/a00085_source.html123
-rw-r--r--3rdparty/glm/doc/api/a00086.html76
-rw-r--r--3rdparty/glm/doc/api/a00086_source.html81
-rw-r--r--3rdparty/glm/doc/api/a00087.html161
-rw-r--r--3rdparty/glm/doc/api/a00087_source.html329
-rw-r--r--3rdparty/glm/doc/api/a00088.html129
-rw-r--r--3rdparty/glm/doc/api/a00088_source.html189
-rw-r--r--3rdparty/glm/doc/api/a00089.html98
-rw-r--r--3rdparty/glm/doc/api/a00089_source.html115
-rw-r--r--3rdparty/glm/doc/api/a00090.html67
-rw-r--r--3rdparty/glm/doc/api/a00090_source.html133
-rw-r--r--3rdparty/glm/doc/api/a00091.html81
-rw-r--r--3rdparty/glm/doc/api/a00091_source.html90
-rw-r--r--3rdparty/glm/doc/api/a00092.html109
-rw-r--r--3rdparty/glm/doc/api/a00092_source.html126
-rw-r--r--3rdparty/glm/doc/api/a00093.html83
-rw-r--r--3rdparty/glm/doc/api/a00093_source.html94
-rw-r--r--3rdparty/glm/doc/api/a00094.html108
-rw-r--r--3rdparty/glm/doc/api/a00094_source.html143
-rw-r--r--3rdparty/glm/doc/api/a00095.html126
-rw-r--r--3rdparty/glm/doc/api/a00095_source.html149
-rw-r--r--3rdparty/glm/doc/api/a00096.html69
-rw-r--r--3rdparty/glm/doc/api/a00096_source.html131
-rw-r--r--3rdparty/glm/doc/api/a00097.html67
-rw-r--r--3rdparty/glm/doc/api/a00097_source.html79
-rw-r--r--3rdparty/glm/doc/api/a00098.html66
-rw-r--r--3rdparty/glm/doc/api/a00098_source.html827
-rw-r--r--3rdparty/glm/doc/api/a00099.html67
-rw-r--r--3rdparty/glm/doc/api/a00099_source.html219
-rw-r--r--3rdparty/glm/doc/api/a00100.html67
-rw-r--r--3rdparty/glm/doc/api/a00100_source.html282
-rw-r--r--3rdparty/glm/doc/api/a00101.html67
-rw-r--r--3rdparty/glm/doc/api/a00101_source.html402
-rw-r--r--3rdparty/glm/doc/api/a00102.html82
-rw-r--r--3rdparty/glm/doc/api/a00102_source.html105
-rw-r--r--3rdparty/glm/doc/api/a00103.html91
-rw-r--r--3rdparty/glm/doc/api/a00103_source.html102
-rw-r--r--3rdparty/glm/doc/api/a00104.html82
-rw-r--r--3rdparty/glm/doc/api/a00104_source.html89
-rw-r--r--3rdparty/glm/doc/api/a00105.html88
-rw-r--r--3rdparty/glm/doc/api/a00105_source.html95
-rw-r--r--3rdparty/glm/doc/api/a00106.html102
-rw-r--r--3rdparty/glm/doc/api/a00106_source.html144
-rw-r--r--3rdparty/glm/doc/api/a00107.html66
-rw-r--r--3rdparty/glm/doc/api/a00107_source.html65
-rw-r--r--3rdparty/glm/doc/api/a00108.html241
-rw-r--r--3rdparty/glm/doc/api/a00108_source.html383
-rw-r--r--3rdparty/glm/doc/api/a00109.html493
-rw-r--r--3rdparty/glm/doc/api/a00109_source.html769
-rw-r--r--3rdparty/glm/doc/api/a00110.html82
-rw-r--r--3rdparty/glm/doc/api/a00110_source.html113
-rw-r--r--3rdparty/glm/doc/api/a00111.html66
-rw-r--r--3rdparty/glm/doc/api/a00111_source.html248
-rw-r--r--3rdparty/glm/doc/api/a00112.html66
-rw-r--r--3rdparty/glm/doc/api/a00112_source.html79
-rw-r--r--3rdparty/glm/doc/api/a00113.html102
-rw-r--r--3rdparty/glm/doc/api/a00113_source.html352
-rw-r--r--3rdparty/glm/doc/api/a00114.html271
-rw-r--r--3rdparty/glm/doc/api/a00114_source.html469
-rw-r--r--3rdparty/glm/doc/api/a00115.html66
-rw-r--r--3rdparty/glm/doc/api/a00115_source.html245
-rw-r--r--3rdparty/glm/doc/api/a00116.html66
-rw-r--r--3rdparty/glm/doc/api/a00116_source.html228
-rw-r--r--3rdparty/glm/doc/api/a00117.html66
-rw-r--r--3rdparty/glm/doc/api/a00117_source.html230
-rw-r--r--3rdparty/glm/doc/api/a00118.html66
-rw-r--r--3rdparty/glm/doc/api/a00118_source.html236
-rw-r--r--3rdparty/glm/doc/api/a00119.html66
-rw-r--r--3rdparty/glm/doc/api/a00119_source.html252
-rw-r--r--3rdparty/glm/doc/api/a00120.html66
-rw-r--r--3rdparty/glm/doc/api/a00120_source.html235
-rw-r--r--3rdparty/glm/doc/api/a00121.html66
-rw-r--r--3rdparty/glm/doc/api/a00121_source.html240
-rw-r--r--3rdparty/glm/doc/api/a00122.html66
-rw-r--r--3rdparty/glm/doc/api/a00122_source.html240
-rw-r--r--3rdparty/glm/doc/api/a00123.html66
-rw-r--r--3rdparty/glm/doc/api/a00123_source.html257
-rw-r--r--3rdparty/glm/doc/api/a00124.html71
-rw-r--r--3rdparty/glm/doc/api/a00124_source.html692
-rw-r--r--3rdparty/glm/doc/api/a00125.html128
-rw-r--r--3rdparty/glm/doc/api/a00125_source.html158
-rw-r--r--3rdparty/glm/doc/api/a00126.html67
-rw-r--r--3rdparty/glm/doc/api/a00126_source.html299
-rw-r--r--3rdparty/glm/doc/api/a00127.html192
-rw-r--r--3rdparty/glm/doc/api/a00127_source.html435
-rw-r--r--3rdparty/glm/doc/api/a00128.html66
-rw-r--r--3rdparty/glm/doc/api/a00128_source.html357
-rw-r--r--3rdparty/glm/doc/api/a00129.html66
-rw-r--r--3rdparty/glm/doc/api/a00129_source.html443
-rw-r--r--3rdparty/glm/doc/api/a00130.html66
-rw-r--r--3rdparty/glm/doc/api/a00130_source.html461
-rw-r--r--3rdparty/glm/doc/api/a00131.html66
-rw-r--r--3rdparty/glm/doc/api/a00131_source.html500
-rw-r--r--3rdparty/glm/doc/api/a00132.html91
-rw-r--r--3rdparty/glm/doc/api/a00132_source.html101
-rw-r--r--3rdparty/glm/doc/api/a00133.html107
-rw-r--r--3rdparty/glm/doc/api/a00133_source.html159
-rw-r--r--3rdparty/glm/doc/api/a00134.html66
-rw-r--r--3rdparty/glm/doc/api/a00134_source.html65
-rw-r--r--3rdparty/glm/doc/api/a00135.html66
-rw-r--r--3rdparty/glm/doc/api/a00135_source.html65
-rw-r--r--3rdparty/glm/doc/api/a00136.html66
-rw-r--r--3rdparty/glm/doc/api/a00136_source.html65
-rw-r--r--3rdparty/glm/doc/api/a00137.html86
-rw-r--r--3rdparty/glm/doc/api/a00137_source.html98
-rw-r--r--3rdparty/glm/doc/api/a00138.html91
-rw-r--r--3rdparty/glm/doc/api/a00138_source.html104
-rw-r--r--3rdparty/glm/doc/api/a00139.html66
-rw-r--r--3rdparty/glm/doc/api/a00139_source.html65
-rw-r--r--3rdparty/glm/doc/api/a00140.html85
-rw-r--r--3rdparty/glm/doc/api/a00140_source.html94
-rw-r--r--3rdparty/glm/doc/api/a00146.html1123
-rw-r--r--3rdparty/glm/doc/api/a00147.html325
-rw-r--r--3rdparty/glm/doc/api/a00148.html367
-rw-r--r--3rdparty/glm/doc/api/a00149.html577
-rw-r--r--3rdparty/glm/doc/api/a00150.html210
-rw-r--r--3rdparty/glm/doc/api/a00151.html364
-rw-r--r--3rdparty/glm/doc/api/a00152.html532
-rw-r--r--3rdparty/glm/doc/api/a00153.html393
-rw-r--r--3rdparty/glm/doc/api/a00154.html103
-rw-r--r--3rdparty/glm/doc/api/a00155.html177
-rw-r--r--3rdparty/glm/doc/api/a00156.html84
-rw-r--r--3rdparty/glm/doc/api/a00157.html808
-rw-r--r--3rdparty/glm/doc/api/a00158.html2827
-rw-r--r--3rdparty/glm/doc/api/a00159.html53
-rw-r--r--3rdparty/glm/doc/api/a00160.html985
-rw-r--r--3rdparty/glm/doc/api/a00161.html141
-rw-r--r--3rdparty/glm/doc/api/a00162.html670
-rw-r--r--3rdparty/glm/doc/api/a00163.html217
-rw-r--r--3rdparty/glm/doc/api/a00164.html137
-rw-r--r--3rdparty/glm/doc/api/a00165.html290
-rw-r--r--3rdparty/glm/doc/api/a00166.html201
-rw-r--r--3rdparty/glm/doc/api/a00167.html1885
-rw-r--r--3rdparty/glm/doc/api/a00168.html129
-rw-r--r--3rdparty/glm/doc/api/a00169.html1690
-rw-r--r--3rdparty/glm/doc/api/a00170.html136
-rw-r--r--3rdparty/glm/doc/api/a00171.html1406
-rw-r--r--3rdparty/glm/doc/api/a00172.html939
-rw-r--r--3rdparty/glm/doc/api/a00173.html303
-rw-r--r--3rdparty/glm/doc/api/a00174.html406
-rw-r--r--3rdparty/glm/doc/api/a00175.html603
-rw-r--r--3rdparty/glm/doc/api/a00176.html688
-rw-r--r--3rdparty/glm/doc/api/a00177.html3678
-rw-r--r--3rdparty/glm/doc/api/a00178.html445
-rw-r--r--3rdparty/glm/doc/api/a00179.html233
-rw-r--r--3rdparty/glm/doc/api/a00180.html53
-rw-r--r--3rdparty/glm/doc/api/a00181.html1293
-rw-r--r--3rdparty/glm/doc/api/a00182.html273
-rw-r--r--3rdparty/glm/doc/api/a00183.html103
-rw-r--r--3rdparty/glm/doc/api/a00184.html213
-rw-r--r--3rdparty/glm/doc/api/a00185.html153
-rw-r--r--3rdparty/glm/doc/api/a00186.html117
-rw-r--r--3rdparty/glm/doc/api/a00187.html312
-rw-r--r--3rdparty/glm/doc/api/a00188.html193
-rw-r--r--3rdparty/glm/doc/api/a00189.html464
-rw-r--r--3rdparty/glm/doc/api/a00190.html565
-rw-r--r--3rdparty/glm/doc/api/a00191.html99
-rw-r--r--3rdparty/glm/doc/api/a00192.html553
-rw-r--r--3rdparty/glm/doc/api/a00193.html355
-rw-r--r--3rdparty/glm/doc/api/a00194.html282
-rw-r--r--3rdparty/glm/doc/api/a00195.html246
-rw-r--r--3rdparty/glm/doc/api/a00196.html143
-rw-r--r--3rdparty/glm/doc/api/a00197.html137
-rw-r--r--3rdparty/glm/doc/api/a00198.html53
-rw-r--r--3rdparty/glm/doc/api/a00199.html314
-rw-r--r--3rdparty/glm/doc/api/a00200.html397
-rw-r--r--3rdparty/glm/doc/api/a00201.html55
-rw-r--r--3rdparty/glm/doc/api/a00202.html126
-rw-r--r--3rdparty/glm/doc/api/a00203.html105
-rw-r--r--3rdparty/glm/doc/api/a00204.html117
-rw-r--r--3rdparty/glm/doc/api/a00205.html191
-rw-r--r--3rdparty/glm/doc/api/a00206.html421
-rw-r--r--3rdparty/glm/doc/api/a00207.html259
-rw-r--r--3rdparty/glm/doc/api/a00208.html317
-rw-r--r--3rdparty/glm/doc/api/a00209.html251
-rw-r--r--3rdparty/glm/doc/api/a00210.html64
-rw-r--r--3rdparty/glm/doc/api/a00211.html293
-rw-r--r--3rdparty/glm/doc/api/a00212.html99
-rw-r--r--3rdparty/glm/doc/api/a00213.html127
-rw-r--r--3rdparty/glm/doc/api/a00214.html90
-rw-r--r--3rdparty/glm/doc/api/a00215.html127
-rw-r--r--3rdparty/glm/doc/api/a00216.html115
-rw-r--r--3rdparty/glm/doc/api/a00217.html93
-rw-r--r--3rdparty/glm/doc/api/a00218.html105
-rw-r--r--3rdparty/glm/doc/api/a00219.html93
-rw-r--r--3rdparty/glm/doc/api/a00220.html613
-rw-r--r--3rdparty/glm/doc/api/a00221.html55
-rw-r--r--3rdparty/glm/doc/api/a00222.html137
-rw-r--r--3rdparty/glm/doc/api/a00223.html165
-rw-r--r--3rdparty/glm/doc/api/a00224.html439
-rw-r--r--3rdparty/glm/doc/api/a00225.html53
-rw-r--r--3rdparty/glm/doc/api/a00226.html53
-rw-r--r--3rdparty/glm/doc/api/a00227.html53
-rw-r--r--3rdparty/glm/doc/api/a00228.html53
-rw-r--r--3rdparty/glm/doc/api/a00229.html211
-rw-r--r--3rdparty/glm/doc/api/a00230.html213
-rw-r--r--3rdparty/glm/doc/api/a00231.html83
-rw-r--r--3rdparty/glm/doc/api/a00232.html143
-rw-r--r--3rdparty/glm/doc/api/a00233.html372
-rw-r--r--3rdparty/glm/doc/api/a00234.html7811
-rw-r--r--3rdparty/glm/doc/api/a00235.html54
-rw-r--r--3rdparty/glm/doc/api/a00236.html163
-rw-r--r--3rdparty/glm/doc/api/a00237.html271
-rw-r--r--3rdparty/glm/doc/api/a00238.html149
-rw-r--r--3rdparty/glm/doc/api/arrowdown.pngbin0 -> 246 bytes-rw-r--r--3rdparty/glm/doc/api/arrowright.pngbin0 -> 229 bytes-rw-r--r--3rdparty/glm/doc/api/bc_s.pngbin0 -> 676 bytes-rw-r--r--3rdparty/glm/doc/api/bdwn.pngbin0 -> 147 bytes-rw-r--r--3rdparty/glm/doc/api/closed.pngbin0 -> 132 bytes-rw-r--r--3rdparty/glm/doc/api/dir_1f76e953200861345293ade84ac7fb6c.html61
-rw-r--r--3rdparty/glm/doc/api/dir_275089585c7fc1b5fd5d7d42c69cb1da.html61
-rw-r--r--3rdparty/glm/doc/api/dir_577c788b67d63fb3b3b5752bd495d0f2.html63
-rw-r--r--3rdparty/glm/doc/api/dir_5ce58d942b2d0776e17a9a58abc01e04.html114
-rw-r--r--3rdparty/glm/doc/api/dir_7b98f88bffbed4b390b5f8f520d9c08e.html61
-rw-r--r--3rdparty/glm/doc/api/dir_8d176b5b7dd0ae42ea6876078f2bde49.html177
-rw-r--r--3rdparty/glm/doc/api/dir_9440d7c11b99dcd7e5d369c7cf9802fe.html101
-rw-r--r--3rdparty/glm/doc/api/dir_e29b03b892e0e25920d021a614d4db9b.html63
-rw-r--r--3rdparty/glm/doc/api/dir_e529a619cfdec1fa4c331fb042fd332f.html129
-rw-r--r--3rdparty/glm/doc/api/doc.pngbin0 -> 746 bytes-rw-r--r--3rdparty/glm/doc/api/doxygen.css865
-rw-r--r--3rdparty/glm/doc/api/doxygen.pngbin0 -> 3779 bytes-rw-r--r--3rdparty/glm/doc/api/dynsections.js104
-rw-r--r--3rdparty/glm/doc/api/files.html200
-rw-r--r--3rdparty/glm/doc/api/folderclosed.pngbin0 -> 616 bytes-rw-r--r--3rdparty/glm/doc/api/folderopen.pngbin0 -> 597 bytes-rw-r--r--3rdparty/glm/doc/api/index.html68
-rw-r--r--3rdparty/glm/doc/api/jquery.js68
-rw-r--r--3rdparty/glm/doc/api/logo.pngbin0 -> 8453 bytes-rw-r--r--3rdparty/glm/doc/api/modules.html149
-rw-r--r--3rdparty/glm/doc/api/nav_f.pngbin0 -> 153 bytes-rw-r--r--3rdparty/glm/doc/api/nav_g.pngbin0 -> 95 bytes-rw-r--r--3rdparty/glm/doc/api/nav_h.pngbin0 -> 98 bytes-rw-r--r--3rdparty/glm/doc/api/open.pngbin0 -> 123 bytes-rw-r--r--3rdparty/glm/doc/api/splitbar.pngbin0 -> 314 bytes-rw-r--r--3rdparty/glm/doc/api/sync_off.pngbin0 -> 853 bytes-rw-r--r--3rdparty/glm/doc/api/sync_on.pngbin0 -> 845 bytes-rw-r--r--3rdparty/glm/doc/api/tab_a.pngbin0 -> 142 bytes-rw-r--r--3rdparty/glm/doc/api/tab_b.pngbin0 -> 169 bytes-rw-r--r--3rdparty/glm/doc/api/tab_h.pngbin0 -> 177 bytes-rw-r--r--3rdparty/glm/doc/api/tab_s.pngbin0 -> 184 bytes-rw-r--r--3rdparty/glm/doc/api/tabs.css79
-rw-r--r--3rdparty/glm/doc/glm.docxbin0 -> 1411022 bytes-rw-r--r--3rdparty/glm/doc/glm.pdfbin0 -> 1392940 bytes-rw-r--r--3rdparty/glm/doc/logo.pngbin0 -> 8453 bytes-rw-r--r--3rdparty/glm/doc/man.doxy2396
-rw-r--r--3rdparty/glm/doc/pages.doxy32
-rw-r--r--3rdparty/glm/doc/theme/doxygen.css865
-rw-r--r--3rdparty/glm/doc/theme/tabs.css79
-rw-r--r--3rdparty/glm/glm/CMakeLists.txt67
-rw-r--r--3rdparty/glm/glm/common.hpp6
-rw-r--r--3rdparty/glm/glm/detail/_features.hpp399
-rw-r--r--3rdparty/glm/glm/detail/_fixes.hpp30
-rw-r--r--3rdparty/glm/glm/detail/_noise.hpp107
-rw-r--r--3rdparty/glm/glm/detail/_swizzle.hpp797
-rw-r--r--3rdparty/glm/glm/detail/_swizzle_func.hpp696
-rw-r--r--3rdparty/glm/glm/detail/_vectorize.hpp131
-rw-r--r--3rdparty/glm/glm/detail/dummy.cpp207
-rw-r--r--3rdparty/glm/glm/detail/func_common.hpp427
-rw-r--r--3rdparty/glm/glm/detail/func_common.inl849
-rw-r--r--3rdparty/glm/glm/detail/func_common_simd.inl231
-rw-r--r--3rdparty/glm/glm/detail/func_exponential.hpp103
-rw-r--r--3rdparty/glm/glm/detail/func_exponential.inl146
-rw-r--r--3rdparty/glm/glm/detail/func_exponential_simd.inl35
-rw-r--r--3rdparty/glm/glm/detail/func_geometric.hpp113
-rw-r--r--3rdparty/glm/glm/detail/func_geometric.inl247
-rw-r--r--3rdparty/glm/glm/detail/func_geometric_simd.inl99
-rw-r--r--3rdparty/glm/glm/detail/func_integer.hpp203
-rw-r--r--3rdparty/glm/glm/detail/func_integer.inl368
-rw-r--r--3rdparty/glm/glm/detail/func_integer_simd.inl68
-rw-r--r--3rdparty/glm/glm/detail/func_matrix.hpp149
-rw-r--r--3rdparty/glm/glm/detail/func_matrix.inl401
-rw-r--r--3rdparty/glm/glm/detail/func_matrix_simd.inl88
-rw-r--r--3rdparty/glm/glm/detail/func_packing.hpp168
-rw-r--r--3rdparty/glm/glm/detail/func_packing.inl190
-rw-r--r--3rdparty/glm/glm/detail/func_packing_simd.inl9
-rw-r--r--3rdparty/glm/glm/detail/func_trigonometric.hpp176
-rw-r--r--3rdparty/glm/glm/detail/func_trigonometric.inl200
-rw-r--r--3rdparty/glm/glm/detail/func_trigonometric_simd.inl0
-rw-r--r--3rdparty/glm/glm/detail/func_vector_relational.hpp111
-rw-r--r--3rdparty/glm/glm/detail/func_vector_relational.inl105
-rw-r--r--3rdparty/glm/glm/detail/func_vector_relational_simd.inl9
-rw-r--r--3rdparty/glm/glm/detail/glm.cpp257
-rw-r--r--3rdparty/glm/glm/detail/precision.hpp63
-rw-r--r--3rdparty/glm/glm/detail/setup.hpp828
-rw-r--r--3rdparty/glm/glm/detail/type_float.hpp67
-rw-r--r--3rdparty/glm/glm/detail/type_gentype.hpp195
-rw-r--r--3rdparty/glm/glm/detail/type_gentype.inl341
-rw-r--r--3rdparty/glm/glm/detail/type_half.hpp19
-rw-r--r--3rdparty/glm/glm/detail/type_half.inl244
-rw-r--r--3rdparty/glm/glm/detail/type_int.hpp306
-rw-r--r--3rdparty/glm/glm/detail/type_mat.hpp767
-rw-r--r--3rdparty/glm/glm/detail/type_mat.inl3
-rw-r--r--3rdparty/glm/glm/detail/type_mat2x2.hpp183
-rw-r--r--3rdparty/glm/glm/detail/type_mat2x2.inl484
-rw-r--r--3rdparty/glm/glm/detail/type_mat2x3.hpp165
-rw-r--r--3rdparty/glm/glm/detail/type_mat2x3.inl458
-rw-r--r--3rdparty/glm/glm/detail/type_mat2x4.hpp167
-rw-r--r--3rdparty/glm/glm/detail/type_mat2x4.inl467
-rw-r--r--3rdparty/glm/glm/detail/type_mat3x2.hpp173
-rw-r--r--3rdparty/glm/glm/detail/type_mat3x2.inl492
-rw-r--r--3rdparty/glm/glm/detail/type_mat3x3.hpp190
-rw-r--r--3rdparty/glm/glm/detail/type_mat3x3.inl561
-rw-r--r--3rdparty/glm/glm/detail/type_mat3x4.hpp172
-rw-r--r--3rdparty/glm/glm/detail/type_mat3x4.inl532
-rw-r--r--3rdparty/glm/glm/detail/type_mat4x2.hpp177
-rw-r--r--3rdparty/glm/glm/detail/type_mat4x2.inl545
-rw-r--r--3rdparty/glm/glm/detail/type_mat4x3.hpp177
-rw-r--r--3rdparty/glm/glm/detail/type_mat4x3.inl562
-rw-r--r--3rdparty/glm/glm/detail/type_mat4x4.hpp195
-rw-r--r--3rdparty/glm/glm/detail/type_mat4x4.inl671
-rw-r--r--3rdparty/glm/glm/detail/type_mat4x4_simd.inl7
-rw-r--r--3rdparty/glm/glm/detail/type_vec.hpp576
-rw-r--r--3rdparty/glm/glm/detail/type_vec.inl2
-rw-r--r--3rdparty/glm/glm/detail/type_vec1.hpp302
-rw-r--r--3rdparty/glm/glm/detail/type_vec1.inl558
-rw-r--r--3rdparty/glm/glm/detail/type_vec2.hpp388
-rw-r--r--3rdparty/glm/glm/detail/type_vec2.inl894
-rw-r--r--3rdparty/glm/glm/detail/type_vec3.hpp409
-rw-r--r--3rdparty/glm/glm/detail/type_vec3.inl1022
-rw-r--r--3rdparty/glm/glm/detail/type_vec4.hpp454
-rw-r--r--3rdparty/glm/glm/detail/type_vec4.inl969
-rw-r--r--3rdparty/glm/glm/detail/type_vec4_simd.inl481
-rw-r--r--3rdparty/glm/glm/exponential.hpp6
-rw-r--r--3rdparty/glm/glm/ext.hpp116
-rw-r--r--3rdparty/glm/glm/fwd.hpp2570
-rw-r--r--3rdparty/glm/glm/geometric.hpp6
-rw-r--r--3rdparty/glm/glm/glm.hpp88
-rw-r--r--3rdparty/glm/glm/gtc/bitfield.hpp207
-rw-r--r--3rdparty/glm/glm/gtc/bitfield.inl515
-rw-r--r--3rdparty/glm/glm/gtc/color_encoding.inl65
-rw-r--r--3rdparty/glm/glm/gtc/color_space.hpp56
-rw-r--r--3rdparty/glm/glm/gtc/color_space.inl75
-rw-r--r--3rdparty/glm/glm/gtc/constants.hpp176
-rw-r--r--3rdparty/glm/glm/gtc/constants.inl181
-rw-r--r--3rdparty/glm/glm/gtc/epsilon.hpp73
-rw-r--r--3rdparty/glm/glm/gtc/epsilon.inl125
-rw-r--r--3rdparty/glm/glm/gtc/functions.hpp53
-rw-r--r--3rdparty/glm/glm/gtc/functions.inl31
-rw-r--r--3rdparty/glm/glm/gtc/integer.hpp102
-rw-r--r--3rdparty/glm/glm/gtc/integer.inl71
-rw-r--r--3rdparty/glm/glm/gtc/matrix_access.hpp59
-rw-r--r--3rdparty/glm/glm/gtc/matrix_access.inl63
-rw-r--r--3rdparty/glm/glm/gtc/matrix_integer.hpp486
-rw-r--r--3rdparty/glm/glm/gtc/matrix_inverse.hpp49
-rw-r--r--3rdparty/glm/glm/gtc/matrix_inverse.inl120
-rw-r--r--3rdparty/glm/glm/gtc/matrix_transform.hpp465
-rw-r--r--3rdparty/glm/glm/gtc/matrix_transform.inl575
-rw-r--r--3rdparty/glm/glm/gtc/noise.hpp60
-rw-r--r--3rdparty/glm/glm/gtc/noise.inl808
-rw-r--r--3rdparty/glm/glm/gtc/packing.hpp579
-rw-r--r--3rdparty/glm/glm/gtc/packing.inl781
-rw-r--r--3rdparty/glm/glm/gtc/quaternion.hpp397
-rw-r--r--3rdparty/glm/glm/gtc/quaternion.inl795
-rw-r--r--3rdparty/glm/glm/gtc/quaternion_simd.inl198
-rw-r--r--3rdparty/glm/glm/gtc/random.hpp98
-rw-r--r--3rdparty/glm/glm/gtc/random.inl350
-rw-r--r--3rdparty/glm/glm/gtc/reciprocal.hpp135
-rw-r--r--3rdparty/glm/glm/gtc/reciprocal.inl192
-rw-r--r--3rdparty/glm/glm/gtc/round.hpp174
-rw-r--r--3rdparty/glm/glm/gtc/round.inl344
-rw-r--r--3rdparty/glm/glm/gtc/type_aligned.hpp362
-rw-r--r--3rdparty/glm/glm/gtc/type_precision.hpp861
-rw-r--r--3rdparty/glm/glm/gtc/type_precision.inl7
-rw-r--r--3rdparty/glm/glm/gtc/type_ptr.hpp149
-rw-r--r--3rdparty/glm/glm/gtc/type_ptr.inl450
-rw-r--r--3rdparty/glm/glm/gtc/ulp.hpp63
-rw-r--r--3rdparty/glm/glm/gtc/ulp.inl321
-rw-r--r--3rdparty/glm/glm/gtc/vec1.hpp164
-rw-r--r--3rdparty/glm/glm/gtc/vec1.inl2
-rw-r--r--3rdparty/glm/glm/gtx/associated_min_max.hpp202
-rw-r--r--3rdparty/glm/glm/gtx/associated_min_max.inl355
-rw-r--r--3rdparty/glm/glm/gtx/bit.hpp95
-rw-r--r--3rdparty/glm/glm/gtx/bit.inl93
-rw-r--r--3rdparty/glm/glm/gtx/closest_point.hpp45
-rw-r--r--3rdparty/glm/glm/gtx/closest_point.inl46
-rw-r--r--3rdparty/glm/glm/gtx/color_space.hpp68
-rw-r--r--3rdparty/glm/glm/gtx/color_space.inl141
-rw-r--r--3rdparty/glm/glm/gtx/color_space_YCoCg.hpp56
-rw-r--r--3rdparty/glm/glm/gtx/color_space_YCoCg.inl108
-rw-r--r--3rdparty/glm/glm/gtx/common.hpp53
-rw-r--r--3rdparty/glm/glm/gtx/common.inl112
-rw-r--r--3rdparty/glm/glm/gtx/compatibility.hpp130
-rw-r--r--3rdparty/glm/glm/gtx/compatibility.inl65
-rw-r--r--3rdparty/glm/glm/gtx/component_wise.hpp65
-rw-r--r--3rdparty/glm/glm/gtx/component_wise.inl128
-rw-r--r--3rdparty/glm/glm/gtx/dual_quaternion.hpp266
-rw-r--r--3rdparty/glm/glm/gtx/dual_quaternion.inl351
-rw-r--r--3rdparty/glm/glm/gtx/euler_angles.hpp143
-rw-r--r--3rdparty/glm/glm/gtx/euler_angles.inl312
-rw-r--r--3rdparty/glm/glm/gtx/extend.hpp38
-rw-r--r--3rdparty/glm/glm/gtx/extend.inl49
-rw-r--r--3rdparty/glm/glm/gtx/extended_min_max.hpp133
-rw-r--r--3rdparty/glm/glm/gtx/extended_min_max.inl140
-rw-r--r--3rdparty/glm/glm/gtx/fast_exponential.hpp91
-rw-r--r--3rdparty/glm/glm/gtx/fast_exponential.inl137
-rw-r--r--3rdparty/glm/glm/gtx/fast_square_root.hpp88
-rw-r--r--3rdparty/glm/glm/gtx/fast_square_root.inl81
-rw-r--r--3rdparty/glm/glm/gtx/fast_trigonometry.hpp75
-rw-r--r--3rdparty/glm/glm/gtx/fast_trigonometry.inl143
-rw-r--r--3rdparty/glm/glm/gtx/float_notmalize.inl14
-rw-r--r--3rdparty/glm/glm/gtx/gradient_paint.hpp48
-rw-r--r--3rdparty/glm/glm/gtx/gradient_paint.inl37
-rw-r--r--3rdparty/glm/glm/gtx/handed_coordinate_space.hpp46
-rw-r--r--3rdparty/glm/glm/gtx/handed_coordinate_space.inl27
-rw-r--r--3rdparty/glm/glm/gtx/hash.hpp134
-rw-r--r--3rdparty/glm/glm/gtx/hash.inl185
-rw-r--r--3rdparty/glm/glm/gtx/integer.hpp72
-rw-r--r--3rdparty/glm/glm/gtx/integer.inl182
-rw-r--r--3rdparty/glm/glm/gtx/intersect.hpp87
-rw-r--r--3rdparty/glm/glm/gtx/intersect.inl170
-rw-r--r--3rdparty/glm/glm/gtx/io.hpp197
-rw-r--r--3rdparty/glm/glm/gtx/io.inl441
-rw-r--r--3rdparty/glm/glm/gtx/log_base.hpp44
-rw-r--r--3rdparty/glm/glm/gtx/log_base.inl18
-rw-r--r--3rdparty/glm/glm/gtx/matrix_cross_product.hpp43
-rw-r--r--3rdparty/glm/glm/gtx/matrix_cross_product.inl38
-rw-r--r--3rdparty/glm/glm/gtx/matrix_decompose.hpp42
-rw-r--r--3rdparty/glm/glm/gtx/matrix_decompose.inl194
-rw-r--r--3rdparty/glm/glm/gtx/matrix_interpolation.hpp61
-rw-r--r--3rdparty/glm/glm/gtx/matrix_interpolation.inl134
-rw-r--r--3rdparty/glm/glm/gtx/matrix_major_storage.hpp115
-rw-r--r--3rdparty/glm/glm/gtx/matrix_major_storage.inl167
-rw-r--r--3rdparty/glm/glm/gtx/matrix_operation.hpp84
-rw-r--r--3rdparty/glm/glm/gtx/matrix_operation.inl118
-rw-r--r--3rdparty/glm/glm/gtx/matrix_query.hpp73
-rw-r--r--3rdparty/glm/glm/gtx/matrix_query.inl114
-rw-r--r--3rdparty/glm/glm/gtx/matrix_transform_2d.hpp78
-rw-r--r--3rdparty/glm/glm/gtx/matrix_transform_2d.inl69
-rw-r--r--3rdparty/glm/glm/gtx/mixed_product.hpp37
-rw-r--r--3rdparty/glm/glm/gtx/mixed_product.inl16
-rw-r--r--3rdparty/glm/glm/gtx/norm.hpp86
-rw-r--r--3rdparty/glm/glm/gtx/norm.inl106
-rw-r--r--3rdparty/glm/glm/gtx/normal.hpp39
-rw-r--r--3rdparty/glm/glm/gtx/normal.inl16
-rw-r--r--3rdparty/glm/glm/gtx/normalize_dot.hpp45
-rw-r--r--3rdparty/glm/glm/gtx/normalize_dot.inl17
-rw-r--r--3rdparty/glm/glm/gtx/number_precision.hpp57
-rw-r--r--3rdparty/glm/glm/gtx/number_precision.inl7
-rw-r--r--3rdparty/glm/glm/gtx/optimum_pow.hpp50
-rw-r--r--3rdparty/glm/glm/gtx/optimum_pow.inl23
-rw-r--r--3rdparty/glm/glm/gtx/orthonormalize.hpp45
-rw-r--r--3rdparty/glm/glm/gtx/orthonormalize.inl30
-rw-r--r--3rdparty/glm/glm/gtx/perpendicular.hpp39
-rw-r--r--3rdparty/glm/glm/gtx/perpendicular.inl15
-rw-r--r--3rdparty/glm/glm/gtx/polar_coordinates.hpp44
-rw-r--r--3rdparty/glm/glm/gtx/polar_coordinates.inl37
-rw-r--r--3rdparty/glm/glm/gtx/projection.hpp36
-rw-r--r--3rdparty/glm/glm/gtx/projection.inl11
-rw-r--r--3rdparty/glm/glm/gtx/quaternion.hpp185
-rw-r--r--3rdparty/glm/glm/gtx/quaternion.inl212
-rw-r--r--3rdparty/glm/glm/gtx/range.hpp85
-rw-r--r--3rdparty/glm/glm/gtx/raw_data.hpp47
-rw-r--r--3rdparty/glm/glm/gtx/raw_data.inl2
-rw-r--r--3rdparty/glm/glm/gtx/rotate_normalized_axis.hpp64
-rw-r--r--3rdparty/glm/glm/gtx/rotate_normalized_axis.inl59
-rw-r--r--3rdparty/glm/glm/gtx/rotate_vector.hpp117
-rw-r--r--3rdparty/glm/glm/gtx/rotate_vector.inl188
-rw-r--r--3rdparty/glm/glm/gtx/scalar_multiplication.hpp69
-rw-r--r--3rdparty/glm/glm/gtx/scalar_relational.hpp32
-rw-r--r--3rdparty/glm/glm/gtx/scalar_relational.inl89
-rw-r--r--3rdparty/glm/glm/gtx/simd_mat4.hpp182
-rw-r--r--3rdparty/glm/glm/gtx/simd_mat4.inl577
-rw-r--r--3rdparty/glm/glm/gtx/simd_quat.hpp307
-rw-r--r--3rdparty/glm/glm/gtx/simd_quat.inl620
-rw-r--r--3rdparty/glm/glm/gtx/simd_vec4.hpp546
-rw-r--r--3rdparty/glm/glm/gtx/simd_vec4.inl721
-rw-r--r--3rdparty/glm/glm/gtx/spline.hpp61
-rw-r--r--3rdparty/glm/glm/gtx/spline.inl63
-rw-r--r--3rdparty/glm/glm/gtx/std_based_type.hpp63
-rw-r--r--3rdparty/glm/glm/gtx/std_based_type.inl7
-rw-r--r--3rdparty/glm/glm/gtx/string_cast.hpp47
-rw-r--r--3rdparty/glm/glm/gtx/string_cast.inl458
-rw-r--r--3rdparty/glm/glm/gtx/transform.hpp56
-rw-r--r--3rdparty/glm/glm/gtx/transform.inl24
-rw-r--r--3rdparty/glm/glm/gtx/transform2.hpp107
-rw-r--r--3rdparty/glm/glm/gtx/transform2.inl126
-rw-r--r--3rdparty/glm/glm/gtx/type_aligned.hpp966
-rw-r--r--3rdparty/glm/glm/gtx/type_aligned.inl7
-rw-r--r--3rdparty/glm/glm/gtx/type_trait.hpp252
-rw-r--r--3rdparty/glm/glm/gtx/type_trait.inl0
-rw-r--r--3rdparty/glm/glm/gtx/vector_angle.hpp60
-rw-r--r--3rdparty/glm/glm/gtx/vector_angle.inl58
-rw-r--r--3rdparty/glm/glm/gtx/vector_query.hpp62
-rw-r--r--3rdparty/glm/glm/gtx/vector_query.inl193
-rw-r--r--3rdparty/glm/glm/gtx/wrap.hpp51
-rw-r--r--3rdparty/glm/glm/gtx/wrap.inl58
-rw-r--r--3rdparty/glm/glm/integer.hpp6
-rw-r--r--3rdparty/glm/glm/mat2x2.hpp52
-rw-r--r--3rdparty/glm/glm/mat2x3.hpp32
-rw-r--r--3rdparty/glm/glm/mat2x4.hpp31
-rw-r--r--3rdparty/glm/glm/mat3x2.hpp31
-rw-r--r--3rdparty/glm/glm/mat3x3.hpp52
-rw-r--r--3rdparty/glm/glm/mat3x4.hpp31
-rw-r--r--3rdparty/glm/glm/mat4x2.hpp31
-rw-r--r--3rdparty/glm/glm/mat4x3.hpp31
-rw-r--r--3rdparty/glm/glm/mat4x4.hpp52
-rw-r--r--3rdparty/glm/glm/matrix.hpp6
-rw-r--r--3rdparty/glm/glm/packing.hpp6
-rw-r--r--3rdparty/glm/glm/simd/common.h240
-rw-r--r--3rdparty/glm/glm/simd/exponential.h20
-rw-r--r--3rdparty/glm/glm/simd/geometric.h124
-rw-r--r--3rdparty/glm/glm/simd/integer.h115
-rw-r--r--3rdparty/glm/glm/simd/matrix.h1028
-rw-r--r--3rdparty/glm/glm/simd/packing.h8
-rw-r--r--3rdparty/glm/glm/simd/platform.h452
-rw-r--r--3rdparty/glm/glm/simd/trigonometric.h9
-rw-r--r--3rdparty/glm/glm/simd/vector_relational.h8
-rw-r--r--3rdparty/glm/glm/trigonometric.hpp6
-rw-r--r--3rdparty/glm/glm/vec2.hpp6
-rw-r--r--3rdparty/glm/glm/vec3.hpp6
-rw-r--r--3rdparty/glm/glm/vec4.hpp6
-rw-r--r--3rdparty/glm/glm/vector_relational.hpp6
-rw-r--r--3rdparty/glm/readme.md986
-rw-r--r--3rdparty/glm/test/CMakeLists.txt17
-rw-r--r--3rdparty/glm/test/bug/CMakeLists.txt1
-rw-r--r--3rdparty/glm/test/bug/bug_ms_vec_static.cpp14
-rw-r--r--3rdparty/glm/test/core/CMakeLists.txt40
-rw-r--r--3rdparty/glm/test/core/core_force_pure.cpp423
-rw-r--r--3rdparty/glm/test/core/core_force_unrestricted_gentype.cpp11
-rw-r--r--3rdparty/glm/test/core/core_func_common.cpp1272
-rw-r--r--3rdparty/glm/test/core/core_func_exponential.cpp129
-rw-r--r--3rdparty/glm/test/core/core_func_geometric.cpp193
-rw-r--r--3rdparty/glm/test/core/core_func_integer.cpp1554
-rw-r--r--3rdparty/glm/test/core/core_func_integer_bit_count.cpp291
-rw-r--r--3rdparty/glm/test/core/core_func_integer_find_lsb.cpp400
-rw-r--r--3rdparty/glm/test/core/core_func_integer_find_msb.cpp438
-rw-r--r--3rdparty/glm/test/core/core_func_matrix.cpp277
-rw-r--r--3rdparty/glm/test/core/core_func_noise.cpp22
-rw-r--r--3rdparty/glm/test/core/core_func_packing.cpp156
-rw-r--r--3rdparty/glm/test/core/core_func_swizzle.cpp83
-rw-r--r--3rdparty/glm/test/core/core_func_trigonometric.cpp10
-rw-r--r--3rdparty/glm/test/core/core_func_vector_relational.cpp42
-rw-r--r--3rdparty/glm/test/core/core_setup_force_cxx98.cpp10
-rw-r--r--3rdparty/glm/test/core/core_setup_message.cpp275
-rw-r--r--3rdparty/glm/test/core/core_setup_precision.cpp58
-rw-r--r--3rdparty/glm/test/core/core_type_aligned.cpp128
-rw-r--r--3rdparty/glm/test/core/core_type_cast.cpp144
-rw-r--r--3rdparty/glm/test/core/core_type_ctor.cpp358
-rw-r--r--3rdparty/glm/test/core/core_type_float.cpp31
-rw-r--r--3rdparty/glm/test/core/core_type_int.cpp43
-rw-r--r--3rdparty/glm/test/core/core_type_length.cpp79
-rw-r--r--3rdparty/glm/test/core/core_type_mat2x2.cpp160
-rw-r--r--3rdparty/glm/test/core/core_type_mat2x3.cpp133
-rw-r--r--3rdparty/glm/test/core/core_type_mat2x4.cpp136
-rw-r--r--3rdparty/glm/test/core/core_type_mat3x2.cpp139
-rw-r--r--3rdparty/glm/test/core/core_type_mat3x3.cpp199
-rw-r--r--3rdparty/glm/test/core/core_type_mat3x4.cpp138
-rw-r--r--3rdparty/glm/test/core/core_type_mat4x2.cpp142
-rw-r--r--3rdparty/glm/test/core/core_type_mat4x3.cpp143
-rw-r--r--3rdparty/glm/test/core/core_type_mat4x4.cpp328
-rw-r--r--3rdparty/glm/test/core/core_type_vec1.cpp152
-rw-r--r--3rdparty/glm/test/core/core_type_vec2.cpp318
-rw-r--r--3rdparty/glm/test/core/core_type_vec3.cpp498
-rw-r--r--3rdparty/glm/test/core/core_type_vec4.cpp565
-rw-r--r--3rdparty/glm/test/external/gli/CMakeLists.txt27
-rw-r--r--3rdparty/glm/test/external/gli/core/dummy.cpp4
-rw-r--r--3rdparty/glm/test/external/gli/core/generate_mipmaps.hpp25
-rw-r--r--3rdparty/glm/test/external/gli/core/generate_mipmaps.inl69
-rw-r--r--3rdparty/glm/test/external/gli/core/image2d.hpp169
-rw-r--r--3rdparty/glm/test/external/gli/core/image2d.inl229
-rw-r--r--3rdparty/glm/test/external/gli/core/operation.hpp82
-rw-r--r--3rdparty/glm/test/external/gli/core/operation.inl233
-rw-r--r--3rdparty/glm/test/external/gli/core/operator.hpp28
-rw-r--r--3rdparty/glm/test/external/gli/core/operator.inl210
-rw-r--r--3rdparty/glm/test/external/gli/core/shared_array.hpp48
-rw-r--r--3rdparty/glm/test/external/gli/core/shared_array.inl151
-rw-r--r--3rdparty/glm/test/external/gli/core/shared_ptr.hpp41
-rw-r--r--3rdparty/glm/test/external/gli/core/shared_ptr.inl125
-rw-r--r--3rdparty/glm/test/external/gli/core/size.hpp31
-rw-r--r--3rdparty/glm/test/external/gli/core/size.inl47
-rw-r--r--3rdparty/glm/test/external/gli/core/texture2d.hpp122
-rw-r--r--3rdparty/glm/test/external/gli/core/texture2d.inl304
-rw-r--r--3rdparty/glm/test/external/gli/core/texture2d_array.hpp59
-rw-r--r--3rdparty/glm/test/external/gli/core/texture2d_array.inl78
-rw-r--r--3rdparty/glm/test/external/gli/core/texture_cube.hpp65
-rw-r--r--3rdparty/glm/test/external/gli/core/texture_cube.inl70
-rw-r--r--3rdparty/glm/test/external/gli/core/texture_cube_array.hpp59
-rw-r--r--3rdparty/glm/test/external/gli/core/texture_cube_array.inl72
-rw-r--r--3rdparty/glm/test/external/gli/gli.hpp31
-rw-r--r--3rdparty/glm/test/external/gli/gtx/compression.hpp27
-rw-r--r--3rdparty/glm/test/external/gli/gtx/compression.inl8
-rw-r--r--3rdparty/glm/test/external/gli/gtx/fetch.hpp46
-rw-r--r--3rdparty/glm/test/external/gli/gtx/fetch.inl91
-rw-r--r--3rdparty/glm/test/external/gli/gtx/gl_texture2d.hpp33
-rw-r--r--3rdparty/glm/test/external/gli/gtx/gl_texture2d.inl210
-rw-r--r--3rdparty/glm/test/external/gli/gtx/gradient.hpp38
-rw-r--r--3rdparty/glm/test/external/gli/gtx/gradient.inl74
-rw-r--r--3rdparty/glm/test/external/gli/gtx/loader.hpp37
-rw-r--r--3rdparty/glm/test/external/gli/gtx/loader.inl46
-rw-r--r--3rdparty/glm/test/external/gli/gtx/loader_dds10.hpp35
-rw-r--r--3rdparty/glm/test/external/gli/gtx/loader_dds10.inl595
-rw-r--r--3rdparty/glm/test/external/gli/gtx/loader_dds9.hpp39
-rw-r--r--3rdparty/glm/test/external/gli/gtx/loader_dds9.inl790
-rw-r--r--3rdparty/glm/test/external/gli/gtx/loader_tga.hpp36
-rw-r--r--3rdparty/glm/test/external/gli/gtx/loader_tga.inl159
-rw-r--r--3rdparty/glm/test/external/gli/gtx/wavelet.hpp27
-rw-r--r--3rdparty/glm/test/external/gli/gtx/wavelet.inl8
-rw-r--r--3rdparty/glm/test/glm.cppcheck6
-rw-r--r--3rdparty/glm/test/gtc/CMakeLists.txt21
-rw-r--r--3rdparty/glm/test/gtc/gtc_bitfield.cpp642
-rw-r--r--3rdparty/glm/test/gtc/gtc_color_space.cpp50
-rw-r--r--3rdparty/glm/test/gtc/gtc_constants.cpp28
-rw-r--r--3rdparty/glm/test/gtc/gtc_epsilon.cpp77
-rw-r--r--3rdparty/glm/test/gtc/gtc_functions.cpp35
-rw-r--r--3rdparty/glm/test/gtc/gtc_integer.cpp232
-rw-r--r--3rdparty/glm/test/gtc/gtc_matrix_access.cpp381
-rw-r--r--3rdparty/glm/test/gtc/gtc_matrix_integer.cpp8
-rw-r--r--3rdparty/glm/test/gtc/gtc_matrix_inverse.cpp51
-rw-r--r--3rdparty/glm/test/gtc/gtc_matrix_transform.cpp54
-rw-r--r--3rdparty/glm/test/gtc/gtc_noise.cpp184
-rw-r--r--3rdparty/glm/test/gtc/gtc_packing.cpp685
-rw-r--r--3rdparty/glm/test/gtc/gtc_quaternion.cpp327
-rw-r--r--3rdparty/glm/test/gtc/gtc_random.cpp379
-rw-r--r--3rdparty/glm/test/gtc/gtc_reciprocal.cpp8
-rw-r--r--3rdparty/glm/test/gtc/gtc_round.cpp458
-rw-r--r--3rdparty/glm/test/gtc/gtc_type_aligned.cpp118
-rw-r--r--3rdparty/glm/test/gtc/gtc_type_precision.cpp890
-rw-r--r--3rdparty/glm/test/gtc/gtc_type_ptr.cpp252
-rw-r--r--3rdparty/glm/test/gtc/gtc_ulp.cpp96
-rw-r--r--3rdparty/glm/test/gtc/gtc_user_defined_types.cpp30
-rw-r--r--3rdparty/glm/test/gtc/gtc_vec1.cpp8
-rw-r--r--3rdparty/glm/test/gtx/CMakeLists.txt51
-rw-r--r--3rdparty/glm/test/gtx/gtx_associated_min_max.cpp9
-rw-r--r--3rdparty/glm/test/gtx/gtx_closest_point.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_color_space.cpp19
-rw-r--r--3rdparty/glm/test/gtx/gtx_color_space_YCoCg.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_common.cpp127
-rw-r--r--3rdparty/glm/test/gtx/gtx_compatibility.cpp18
-rw-r--r--3rdparty/glm/test/gtx/gtx_component_wise.cpp115
-rw-r--r--3rdparty/glm/test/gtx/gtx_dual_quaternion.cpp203
-rw-r--r--3rdparty/glm/test/gtx/gtx_euler_angle.cpp328
-rw-r--r--3rdparty/glm/test/gtx/gtx_extend.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_extended_min_max.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_extented_min_max.cpp39
-rw-r--r--3rdparty/glm/test/gtx/gtx_fast_exponential.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_fast_square_root.cpp45
-rw-r--r--3rdparty/glm/test/gtx/gtx_fast_trigonometry.cpp445
-rw-r--r--3rdparty/glm/test/gtx/gtx_gradient_paint.cpp33
-rw-r--r--3rdparty/glm/test/gtx/gtx_handed_coordinate_space.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_int_10_10_10_2.cpp18
-rw-r--r--3rdparty/glm/test/gtx/gtx_integer.cpp64
-rw-r--r--3rdparty/glm/test/gtx/gtx_intersect.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_io.cpp175
-rw-r--r--3rdparty/glm/test/gtx/gtx_log_base.cpp53
-rw-r--r--3rdparty/glm/test/gtx/gtx_matrix_cross_product.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_matrix_decompose.cpp18
-rw-r--r--3rdparty/glm/test/gtx/gtx_matrix_interpolation.cpp10
-rw-r--r--3rdparty/glm/test/gtx/gtx_matrix_major_storage.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_matrix_operation.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_matrix_query.cpp65
-rw-r--r--3rdparty/glm/test/gtx/gtx_matrix_transform_2d.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_mixed_product.cpp18
-rw-r--r--3rdparty/glm/test/gtx/gtx_norm.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_normal.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_normalize_dot.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_number_precision.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_optimum_pow.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_orthonormalize.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_perpendicular.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_polar_coordinates.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_projection.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_quaternion.cpp102
-rw-r--r--3rdparty/glm/test/gtx/gtx_random.cpp99
-rw-r--r--3rdparty/glm/test/gtx/gtx_range.cpp52
-rw-r--r--3rdparty/glm/test/gtx/gtx_rotate_normalized_axis.cpp8
-rw-r--r--3rdparty/glm/test/gtx/gtx_rotate_vector.cpp75
-rw-r--r--3rdparty/glm/test/gtx/gtx_scalar_multiplication.cpp34
-rw-r--r--3rdparty/glm/test/gtx/gtx_scalar_relational.cpp170
-rw-r--r--3rdparty/glm/test/gtx/gtx_simd_mat4.cpp324
-rw-r--r--3rdparty/glm/test/gtx/gtx_simd_vec4.cpp71
-rw-r--r--3rdparty/glm/test/gtx/gtx_spline.cpp99
-rw-r--r--3rdparty/glm/test/gtx/gtx_string_cast.cpp128
-rw-r--r--3rdparty/glm/test/gtx/gtx_type_aligned.cpp113
-rw-r--r--3rdparty/glm/test/gtx/gtx_type_trait.cpp12
-rw-r--r--3rdparty/glm/test/gtx/gtx_vector_angle.cpp58
-rw-r--r--3rdparty/glm/test/gtx/gtx_vector_query.cpp81
-rw-r--r--3rdparty/glm/test/gtx/gtx_wrap.cpp189
-rw-r--r--3rdparty/glm/util/autoexp.txt28
-rw-r--r--3rdparty/glm/util/autoexp.vc2010.dat3896
-rw-r--r--3rdparty/glm/util/glm.natvis69
-rw-r--r--3rdparty/glm/util/usertype.dat407
-rw-r--r--3rdparty/libjpeg/Makefile.am143
-rw-r--r--3rdparty/libjpeg/Makefile.in1249
-rw-r--r--3rdparty/libjpeg/README374
-rw-r--r--3rdparty/libjpeg/aclocal.m410275
-rw-r--r--3rdparty/libjpeg/ar-lib271
-rw-r--r--3rdparty/libjpeg/cdaltui.txt138
-rw-r--r--3rdparty/libjpeg/cderror.h136
-rw-r--r--3rdparty/libjpeg/cdjpeg.c181
-rw-r--r--3rdparty/libjpeg/cdjpeg.h189
-rw-r--r--3rdparty/libjpeg/change.log516
-rw-r--r--3rdparty/libjpeg/cjpeg.1384
-rw-r--r--3rdparty/libjpeg/cjpeg.c664
-rw-r--r--3rdparty/libjpeg/cjpegalt.c791
-rw-r--r--3rdparty/libjpeg/ckconfig.c402
-rw-r--r--3rdparty/libjpeg/coderules.txt118
-rw-r--r--3rdparty/libjpeg/compile348
-rw-r--r--3rdparty/libjpeg/config.guess1748
-rw-r--r--3rdparty/libjpeg/config.sub1884
-rw-r--r--3rdparty/libjpeg/configure16365
-rw-r--r--3rdparty/libjpeg/configure.ac365
-rw-r--r--3rdparty/libjpeg/depcomp791
-rw-r--r--3rdparty/libjpeg/djpeg.1264
-rw-r--r--3rdparty/libjpeg/djpeg.c631
-rw-r--r--3rdparty/libjpeg/djpegalt.c766
-rw-r--r--3rdparty/libjpeg/example.c433
-rw-r--r--3rdparty/libjpeg/filelist.txt218
-rw-r--r--3rdparty/libjpeg/install-sh541
-rw-r--r--3rdparty/libjpeg/install.txt1198
-rw-r--r--3rdparty/libjpeg/jaricom.c153
-rw-r--r--3rdparty/libjpeg/jcapimin.c288
-rw-r--r--3rdparty/libjpeg/jcapistd.c162
-rw-r--r--3rdparty/libjpeg/jcarith.c945
-rw-r--r--3rdparty/libjpeg/jccoefct.c456
-rw-r--r--3rdparty/libjpeg/jccolor.c601
-rw-r--r--3rdparty/libjpeg/jcdctmgr.c466
-rw-r--r--3rdparty/libjpeg/jchuff.c1640
-rw-r--r--3rdparty/libjpeg/jcinit.c249
-rw-r--r--3rdparty/libjpeg/jcmainct.c297
-rw-r--r--3rdparty/libjpeg/jcmarker.c717
-rw-r--r--3rdparty/libjpeg/jcmaster.c675
-rw-r--r--3rdparty/libjpeg/jcomapi.c244
-rw-r--r--3rdparty/libjpeg/jconfig.bcc48
-rw-r--r--3rdparty/libjpeg/jconfig.cfg59
-rw-r--r--3rdparty/libjpeg/jconfig.dj38
-rw-r--r--3rdparty/libjpeg/jconfig.h53
-rw-r--r--3rdparty/libjpeg/jconfig.mac43
-rw-r--r--3rdparty/libjpeg/jconfig.manx43
-rw-r--r--3rdparty/libjpeg/jconfig.mc652
-rw-r--r--3rdparty/libjpeg/jconfig.sas43
-rw-r--r--3rdparty/libjpeg/jconfig.st42
-rw-r--r--3rdparty/libjpeg/jconfig.txt171
-rw-r--r--3rdparty/libjpeg/jconfig.vc52
-rw-r--r--3rdparty/libjpeg/jconfig.vms37
-rw-r--r--3rdparty/libjpeg/jconfig.wat38
-rw-r--r--3rdparty/libjpeg/jcparam.c591
-rw-r--r--3rdparty/libjpeg/jcprepct.c358
-rw-r--r--3rdparty/libjpeg/jcsample.c545
-rw-r--r--3rdparty/libjpeg/jctrans.c399
-rw-r--r--3rdparty/libjpeg/jdapimin.c412
-rw-r--r--3rdparty/libjpeg/jdapistd.c276
-rw-r--r--3rdparty/libjpeg/jdarith.c796
-rw-r--r--3rdparty/libjpeg/jdatadst.c267
-rw-r--r--3rdparty/libjpeg/jdatasrc.c274
-rw-r--r--3rdparty/libjpeg/jdcoefct.c744
-rw-r--r--3rdparty/libjpeg/jdcolor.c778
-rw-r--r--3rdparty/libjpeg/jdct.h409
-rw-r--r--3rdparty/libjpeg/jddctmgr.c384
-rw-r--r--3rdparty/libjpeg/jdhuff.c1559
-rw-r--r--3rdparty/libjpeg/jdinput.c657
-rw-r--r--3rdparty/libjpeg/jdmainct.c511
-rw-r--r--3rdparty/libjpeg/jdmarker.c1505
-rw-r--r--3rdparty/libjpeg/jdmaster.c532
-rw-r--r--3rdparty/libjpeg/jdmerge.c438
-rw-r--r--3rdparty/libjpeg/jdosabcc.objbin0 -> 775 bytes-rw-r--r--3rdparty/libjpeg/jdosamsc.objbin0 -> 657 bytes-rw-r--r--3rdparty/libjpeg/jdosaobj.txt16
-rw-r--r--3rdparty/libjpeg/jdpostct.c290
-rw-r--r--3rdparty/libjpeg/jdsample.c341
-rw-r--r--3rdparty/libjpeg/jdtrans.c140
-rw-r--r--3rdparty/libjpeg/jerror.c253
-rw-r--r--3rdparty/libjpeg/jerror.h304
-rw-r--r--3rdparty/libjpeg/jfdctflt.c176
-rw-r--r--3rdparty/libjpeg/jfdctfst.c232
-rw-r--r--3rdparty/libjpeg/jfdctint.c4415
-rw-r--r--3rdparty/libjpeg/jidctflt.c238
-rw-r--r--3rdparty/libjpeg/jidctfst.c351
-rw-r--r--3rdparty/libjpeg/jidctint.c5240
-rw-r--r--3rdparty/libjpeg/jinclude.h97
-rw-r--r--3rdparty/libjpeg/jmemansi.c167
-rw-r--r--3rdparty/libjpeg/jmemdos.c638
-rw-r--r--3rdparty/libjpeg/jmemdosa.asm379
-rw-r--r--3rdparty/libjpeg/jmemmac.c289
-rw-r--r--3rdparty/libjpeg/jmemmgr.c1115
-rw-r--r--3rdparty/libjpeg/jmemname.c276
-rw-r--r--3rdparty/libjpeg/jmemnobs.c113
-rw-r--r--3rdparty/libjpeg/jmemsys.h198
-rw-r--r--3rdparty/libjpeg/jmorecfg.h446
-rw-r--r--3rdparty/libjpeg/jpegint.h445
-rw-r--r--3rdparty/libjpeg/jpeglib.h1183
-rw-r--r--3rdparty/libjpeg/jpegtran.1328
-rw-r--r--3rdparty/libjpeg/jpegtran.c654
-rw-r--r--3rdparty/libjpeg/jquant1.c851
-rw-r--r--3rdparty/libjpeg/jquant2.c1311
-rw-r--r--3rdparty/libjpeg/jutils.c224
-rw-r--r--3rdparty/libjpeg/jversion.h14
-rw-r--r--3rdparty/libjpeg/libjpeg.map4
-rw-r--r--3rdparty/libjpeg/libjpeg.pc.in10
-rw-r--r--3rdparty/libjpeg/libjpeg.txt3110
-rw-r--r--3rdparty/libjpeg/ltmain.sh11147
-rw-r--r--3rdparty/libjpeg/makcjpeg.st36
-rw-r--r--3rdparty/libjpeg/makdjpeg.st36
-rw-r--r--3rdparty/libjpeg/makeadsw.vc677
-rw-r--r--3rdparty/libjpeg/makeasln.v1671
-rw-r--r--3rdparty/libjpeg/makecdep.vc682
-rw-r--r--3rdparty/libjpeg/makecdsp.vc6130
-rw-r--r--3rdparty/libjpeg/makecfil.v1669
-rw-r--r--3rdparty/libjpeg/makecmak.vc6159
-rw-r--r--3rdparty/libjpeg/makecvcx.v16195
-rw-r--r--3rdparty/libjpeg/makecvcx.v17195
-rw-r--r--3rdparty/libjpeg/makeddep.vc682
-rw-r--r--3rdparty/libjpeg/makeddsp.vc6130
-rw-r--r--3rdparty/libjpeg/makedfil.v1669
-rw-r--r--3rdparty/libjpeg/makedmak.vc6159
-rw-r--r--3rdparty/libjpeg/makedvcx.v16195
-rw-r--r--3rdparty/libjpeg/makedvcx.v17195
-rw-r--r--3rdparty/libjpeg/makefile.ansi226
-rw-r--r--3rdparty/libjpeg/makefile.b32248
-rw-r--r--3rdparty/libjpeg/makefile.bcc298
-rw-r--r--3rdparty/libjpeg/makefile.dj232
-rw-r--r--3rdparty/libjpeg/makefile.manx226
-rw-r--r--3rdparty/libjpeg/makefile.mc6261
-rw-r--r--3rdparty/libjpeg/makefile.mms230
-rw-r--r--3rdparty/libjpeg/makefile.sas264
-rw-r--r--3rdparty/libjpeg/makefile.unix240
-rw-r--r--3rdparty/libjpeg/makefile.vc388
-rw-r--r--3rdparty/libjpeg/makefile.vms144
-rw-r--r--3rdparty/libjpeg/makefile.vs388
-rw-r--r--3rdparty/libjpeg/makefile.wat246
-rw-r--r--3rdparty/libjpeg/makejdep.vc6423
-rw-r--r--3rdparty/libjpeg/makejdsp.vc6285
-rw-r--r--3rdparty/libjpeg/makejdsw.vc629
-rw-r--r--3rdparty/libjpeg/makejfil.v16186
-rw-r--r--3rdparty/libjpeg/makejmak.vc6425
-rw-r--r--3rdparty/libjpeg/makejsln.v1631
-rw-r--r--3rdparty/libjpeg/makejvcx.v16222
-rw-r--r--3rdparty/libjpeg/makejvcx.v17222
-rw-r--r--3rdparty/libjpeg/makeproj.mac213
-rw-r--r--3rdparty/libjpeg/makerdep.vc66
-rw-r--r--3rdparty/libjpeg/makerdsp.vc678
-rw-r--r--3rdparty/libjpeg/makerfil.v1630
-rw-r--r--3rdparty/libjpeg/makermak.vc6110
-rw-r--r--3rdparty/libjpeg/makervcx.v16178
-rw-r--r--3rdparty/libjpeg/makervcx.v17178
-rw-r--r--3rdparty/libjpeg/maketdep.vc643
-rw-r--r--3rdparty/libjpeg/maketdsp.vc6122
-rw-r--r--3rdparty/libjpeg/maketfil.v1663
-rw-r--r--3rdparty/libjpeg/maketmak.vc6131
-rw-r--r--3rdparty/libjpeg/maketvcx.v16193
-rw-r--r--3rdparty/libjpeg/maketvcx.v17193
-rw-r--r--3rdparty/libjpeg/makewdep.vc66
-rw-r--r--3rdparty/libjpeg/makewdsp.vc678
-rw-r--r--3rdparty/libjpeg/makewfil.v1630
-rw-r--r--3rdparty/libjpeg/makewmak.vc6110
-rw-r--r--3rdparty/libjpeg/makewvcx.v16178
-rw-r--r--3rdparty/libjpeg/makewvcx.v17178
-rw-r--r--3rdparty/libjpeg/makljpeg.st68
-rw-r--r--3rdparty/libjpeg/maktjpeg.st30
-rw-r--r--3rdparty/libjpeg/makvms.opt4
-rw-r--r--3rdparty/libjpeg/missing215
-rw-r--r--3rdparty/libjpeg/rdbmp.c469
-rw-r--r--3rdparty/libjpeg/rdcolmap.c253
-rw-r--r--3rdparty/libjpeg/rdgif.c679
-rw-r--r--3rdparty/libjpeg/rdjpgcom.163
-rw-r--r--3rdparty/libjpeg/rdjpgcom.c515
-rw-r--r--3rdparty/libjpeg/rdppm.c501
-rw-r--r--3rdparty/libjpeg/rdrle.c380
-rw-r--r--3rdparty/libjpeg/rdswitch.c363
-rw-r--r--3rdparty/libjpeg/rdtarga.c500
-rw-r--r--3rdparty/libjpeg/readme.dos15
-rw-r--r--3rdparty/libjpeg/structure.txt942
-rw-r--r--3rdparty/libjpeg/testimg.bmpbin0 -> 35050 bytes-rw-r--r--3rdparty/libjpeg/testimg.gifbin0 -> 21718 bytes-rw-r--r--3rdparty/libjpeg/testimg.jpgbin0 -> 5770 bytes-rw-r--r--3rdparty/libjpeg/testimg.ppm4
-rw-r--r--3rdparty/libjpeg/testimgp.jpgbin0 -> 5655 bytes-rw-r--r--3rdparty/libjpeg/testorig.jpgbin0 -> 5770 bytes-rw-r--r--3rdparty/libjpeg/testprog.jpgbin0 -> 5655 bytes-rw-r--r--3rdparty/libjpeg/transupp.c2434
-rw-r--r--3rdparty/libjpeg/transupp.h230
-rw-r--r--3rdparty/libjpeg/usage.txt709
-rw-r--r--3rdparty/libjpeg/wizard.txt211
-rw-r--r--3rdparty/libjpeg/wrbmp.c437
-rw-r--r--3rdparty/libjpeg/wrgif.c566
-rw-r--r--3rdparty/libjpeg/wrjpgcom.1103
-rw-r--r--3rdparty/libjpeg/wrjpgcom.c599
-rw-r--r--3rdparty/libjpeg/wrppm.c264
-rw-r--r--3rdparty/libjpeg/wrrle.c306
-rw-r--r--3rdparty/libjpeg/wrtarga.c254
-rw-r--r--3rdparty/linenoise/Makefile23
-rw-r--r--3rdparty/linenoise/README.markdown116
-rw-r--r--3rdparty/linenoise/example.c87
-rw-r--r--3rdparty/linenoise/linenoise-win32.c379
-rw-r--r--3rdparty/linenoise/linenoise.c2072
-rw-r--r--3rdparty/linenoise/linenoise.h149
-rw-r--r--3rdparty/linenoise/stringbuf.c173
-rw-r--r--3rdparty/linenoise/stringbuf.h137
-rw-r--r--3rdparty/linenoise/teststringbuf.c137
-rw-r--r--3rdparty/linenoise/utf8.c275
-rw-r--r--3rdparty/linenoise/utf8.h107
-rw-r--r--3rdparty/lsqlite3/HISTORY258
-rw-r--r--3rdparty/lsqlite3/Makefile19
-rw-r--r--3rdparty/lsqlite3/README16
-rw-r--r--3rdparty/lsqlite3/doc/lsqlite3.wiki1201
-rw-r--r--3rdparty/lsqlite3/examples/aggregate.lua35
-rw-r--r--3rdparty/lsqlite3/examples/function.lua21
-rw-r--r--3rdparty/lsqlite3/examples/hooks_advanced.lua349
-rw-r--r--3rdparty/lsqlite3/examples/order.lua122
-rw-r--r--3rdparty/lsqlite3/examples/simple.lua16
-rw-r--r--3rdparty/lsqlite3/examples/smart.lua22
-rw-r--r--3rdparty/lsqlite3/examples/statement.lua39
-rw-r--r--3rdparty/lsqlite3/examples/tracing.lua20
-rw-r--r--3rdparty/lsqlite3/examples/update_hook.lua31
-rw-r--r--3rdparty/lsqlite3/extras/Makefile99
-rw-r--r--3rdparty/lsqlite3/extras/extension-functions.c1947
-rw-r--r--3rdparty/lsqlite3/extras/installpath.lua14
-rw-r--r--3rdparty/lsqlite3/lsqlite3-0.9.5-1.rockspec39
-rw-r--r--3rdparty/lsqlite3/lsqlite3.c2408
-rw-r--r--3rdparty/lsqlite3/lsqlite3complete-0.9.5-1.rockspec40
-rw-r--r--3rdparty/lsqlite3/test/test-dyld.lua68
-rw-r--r--3rdparty/lsqlite3/test/test.lua153
-rw-r--r--3rdparty/lsqlite3/test/tests-sqlite3.lua1248
-rw-r--r--3rdparty/lua-linenoise/linenoise.c212
-rw-r--r--3rdparty/lua-linenoise/linenoise_none.c6
-rw-r--r--3rdparty/lua-zlib/.gitattributes1
-rw-r--r--3rdparty/lua-zlib/CMakeLists.txt62
-rw-r--r--3rdparty/lua-zlib/Makefile62
-rw-r--r--3rdparty/lua-zlib/README151
-rw-r--r--3rdparty/lua-zlib/amnon_david.gzbin0 -> 65 bytes-rw-r--r--3rdparty/lua-zlib/cmake/Modules/FindLuaJIT.cmake63
-rw-r--r--3rdparty/lua-zlib/lua_zlib.c401
-rw-r--r--3rdparty/lua-zlib/rockspec35
-rw-r--r--3rdparty/lua-zlib/tap.lua24
-rw-r--r--3rdparty/lua-zlib/test.lua198
-rw-r--r--3rdparty/lua-zlib/tom_macwright.gz4
-rw-r--r--3rdparty/lua-zlib/tom_macwright.outbin0 -> 245 bytes-rw-r--r--3rdparty/lua-zlib/zlib.def2
-rw-r--r--3rdparty/lua/Makefile106
-rw-r--r--3rdparty/lua/README6
-rw-r--r--3rdparty/lua/doc/OSIApproved_100X125.pngbin0 -> 12127 bytes-rw-r--r--3rdparty/lua/doc/contents.html678
-rw-r--r--3rdparty/lua/doc/index.css21
-rw-r--r--3rdparty/lua/doc/logo.gifbin0 -> 9893 bytes-rw-r--r--3rdparty/lua/doc/lua.1155
-rw-r--r--3rdparty/lua/doc/lua.css162
-rw-r--r--3rdparty/lua/doc/luac.1118
-rw-r--r--3rdparty/lua/doc/manual.css21
-rw-r--r--3rdparty/lua/doc/manual.html12060
-rw-r--r--3rdparty/lua/doc/readme.html339
-rw-r--r--3rdparty/lua/src/Makefile225
-rw-r--r--3rdparty/lua/src/lapi.c1463
-rw-r--r--3rdparty/lua/src/lapi.h52
-rw-r--r--3rdparty/lua/src/lauxlib.c1126
-rw-r--r--3rdparty/lua/src/lauxlib.h301
-rw-r--r--3rdparty/lua/src/lbaselib.c549
-rw-r--r--3rdparty/lua/src/lcode.c1874
-rw-r--r--3rdparty/lua/src/lcode.h101
-rw-r--r--3rdparty/lua/src/lcorolib.c210
-rw-r--r--3rdparty/lua/src/lctype.c64
-rw-r--r--3rdparty/lua/src/lctype.h101
-rw-r--r--3rdparty/lua/src/ldblib.c483
-rw-r--r--3rdparty/lua/src/ldebug.c962
-rw-r--r--3rdparty/lua/src/ldebug.h64
-rw-r--r--3rdparty/lua/src/ldo.c1028
-rw-r--r--3rdparty/lua/src/ldo.h87
-rw-r--r--3rdparty/lua/src/ldump.c230
-rw-r--r--3rdparty/lua/src/lfunc.c294
-rw-r--r--3rdparty/lua/src/lfunc.h64
-rw-r--r--3rdparty/lua/src/lgc.c1743
-rw-r--r--3rdparty/lua/src/lgc.h202
-rw-r--r--3rdparty/lua/src/linit.c65
-rw-r--r--3rdparty/lua/src/liolib.c841
-rw-r--r--3rdparty/lua/src/ljumptab.h112
-rw-r--r--3rdparty/lua/src/llex.c581
-rw-r--r--3rdparty/lua/src/llex.h91
-rw-r--r--3rdparty/lua/src/llimits.h380
-rw-r--r--3rdparty/lua/src/lmathlib.c781
-rw-r--r--3rdparty/lua/src/lmem.c215
-rw-r--r--3rdparty/lua/src/lmem.h93
-rw-r--r--3rdparty/lua/src/loadlib.c758
-rw-r--r--3rdparty/lua/src/lobject.c602
-rw-r--r--3rdparty/lua/src/lobject.h813
-rw-r--r--3rdparty/lua/src/lopcodes.c104
-rw-r--r--3rdparty/lua/src/lopcodes.h405
-rw-r--r--3rdparty/lua/src/lopnames.h103
-rw-r--r--3rdparty/lua/src/loslib.c430
-rw-r--r--3rdparty/lua/src/lparser.c1967
-rw-r--r--3rdparty/lua/src/lparser.h171
-rw-r--r--3rdparty/lua/src/lprefix.h45
-rw-r--r--3rdparty/lua/src/lstate.c445
-rw-r--r--3rdparty/lua/src/lstate.h408
-rw-r--r--3rdparty/lua/src/lstring.c274
-rw-r--r--3rdparty/lua/src/lstring.h57
-rw-r--r--3rdparty/lua/src/lstrlib.c1874
-rw-r--r--3rdparty/lua/src/ltable.c995
-rw-r--r--3rdparty/lua/src/ltable.h63
-rw-r--r--3rdparty/lua/src/ltablib.c430
-rw-r--r--3rdparty/lua/src/ltm.c271
-rw-r--r--3rdparty/lua/src/ltm.h103
-rw-r--r--3rdparty/lua/src/lua.c688
-rw-r--r--3rdparty/lua/src/lua.h523
-rw-r--r--3rdparty/lua/src/lua.hpp9
-rw-r--r--3rdparty/lua/src/luac.c723
-rw-r--r--3rdparty/lua/src/luaconf.h802
-rw-r--r--3rdparty/lua/src/lualib.h52
-rw-r--r--3rdparty/lua/src/lundump.c335
-rw-r--r--3rdparty/lua/src/lundump.h35
-rw-r--r--3rdparty/lua/src/lutf8lib.c291
-rw-r--r--3rdparty/lua/src/lvm.c1899
-rw-r--r--3rdparty/lua/src/lvm.h141
-rw-r--r--3rdparty/lua/src/lzio.c68
-rw-r--r--3rdparty/lua/src/lzio.h66
-rw-r--r--3rdparty/luafilesystem/.gitignore2
-rw-r--r--3rdparty/luafilesystem/.travis.yml34
-rw-r--r--3rdparty/luafilesystem/LICENSE21
-rw-r--r--3rdparty/luafilesystem/Makefile25
-rw-r--r--3rdparty/luafilesystem/Makefile.win25
-rw-r--r--3rdparty/luafilesystem/README.md28
-rw-r--r--3rdparty/luafilesystem/appveyor.yml41
-rw-r--r--3rdparty/luafilesystem/config28
-rw-r--r--3rdparty/luafilesystem/config.win19
-rw-r--r--3rdparty/luafilesystem/doc/us/doc.css209
-rw-r--r--3rdparty/luafilesystem/doc/us/examples.html101
-rw-r--r--3rdparty/luafilesystem/doc/us/index.html229
-rw-r--r--3rdparty/luafilesystem/doc/us/license.html120
-rw-r--r--3rdparty/luafilesystem/doc/us/luafilesystem.pngbin0 -> 8535 bytes-rw-r--r--3rdparty/luafilesystem/doc/us/manual.html286
-rw-r--r--3rdparty/luafilesystem/luafilesystem-scm-1.rockspec28
-rw-r--r--3rdparty/luafilesystem/src/.gitignore2
-rw-r--r--3rdparty/luafilesystem/src/lfs.c1182
-rw-r--r--3rdparty/luafilesystem/src/lfs.def4
-rw-r--r--3rdparty/luafilesystem/src/lfs.h35
-rw-r--r--3rdparty/luafilesystem/tests/test.lua226
-rw-r--r--3rdparty/luafilesystem/vc6/lfs.def5
-rw-r--r--3rdparty/luafilesystem/vc6/luafilesystem.dsw33
-rw-r--r--3rdparty/luafilesystem/vc6/luafilesystem_dll.dsp127
-rw-r--r--3rdparty/lzma/Asm/arm/7zCrcOpt.asm100
-rw-r--r--3rdparty/lzma/Asm/arm64/7zAsm.S181
-rw-r--r--3rdparty/lzma/Asm/arm64/LzmaDecOpt.S1487
-rw-r--r--3rdparty/lzma/Asm/x86/7zAsm.asm289
-rw-r--r--3rdparty/lzma/Asm/x86/7zCrcOpt.asm180
-rw-r--r--3rdparty/lzma/Asm/x86/AesOpt.asm742
-rw-r--r--3rdparty/lzma/Asm/x86/LzFindOpt.asm513
-rw-r--r--3rdparty/lzma/Asm/x86/LzmaDecOpt.asm1303
-rw-r--r--3rdparty/lzma/Asm/x86/Sha256Opt.asm275
-rw-r--r--3rdparty/lzma/Asm/x86/XzCrc64Opt.asm239
-rw-r--r--3rdparty/lzma/C/7z.h204
-rw-r--r--3rdparty/lzma/C/7zAlloc.c89
-rw-r--r--3rdparty/lzma/C/7zAlloc.h19
-rw-r--r--3rdparty/lzma/C/7zArcIn.c1786
-rw-r--r--3rdparty/lzma/C/7zBuf.c36
-rw-r--r--3rdparty/lzma/C/7zBuf.h35
-rw-r--r--3rdparty/lzma/C/7zBuf2.c52
-rw-r--r--3rdparty/lzma/C/7zCrc.c340
-rw-r--r--3rdparty/lzma/C/7zCrc.h27
-rw-r--r--3rdparty/lzma/C/7zCrcOpt.c117
-rw-r--r--3rdparty/lzma/C/7zDec.c648
-rw-r--r--3rdparty/lzma/C/7zFile.c443
-rw-r--r--3rdparty/lzma/C/7zFile.h92
-rw-r--r--3rdparty/lzma/C/7zStream.c199
-rw-r--r--3rdparty/lzma/C/7zTypes.h597
-rw-r--r--3rdparty/lzma/C/7zVersion.h27
-rw-r--r--3rdparty/lzma/C/7zVersion.rc55
-rw-r--r--3rdparty/lzma/C/7zWindows.h101
-rw-r--r--3rdparty/lzma/C/7zip_gcc_c.mak360
-rw-r--r--3rdparty/lzma/C/Aes.c393
-rw-r--r--3rdparty/lzma/C/Aes.h60
-rw-r--r--3rdparty/lzma/C/AesOpt.c840
-rw-r--r--3rdparty/lzma/C/Alloc.c535
-rw-r--r--3rdparty/lzma/C/Alloc.h71
-rw-r--r--3rdparty/lzma/C/Bcj2.c290
-rw-r--r--3rdparty/lzma/C/Bcj2.h332
-rw-r--r--3rdparty/lzma/C/Bcj2Enc.c506
-rw-r--r--3rdparty/lzma/C/Bra.c420
-rw-r--r--3rdparty/lzma/C/Bra.h99
-rw-r--r--3rdparty/lzma/C/Bra86.c187
-rw-r--r--3rdparty/lzma/C/BraIA64.c14
-rw-r--r--3rdparty/lzma/C/Compiler.h159
-rw-r--r--3rdparty/lzma/C/CpuArch.c823
-rw-r--r--3rdparty/lzma/C/CpuArch.h523
-rw-r--r--3rdparty/lzma/C/Delta.c169
-rw-r--r--3rdparty/lzma/C/Delta.h19
-rw-r--r--3rdparty/lzma/C/DllSecur.c111
-rw-r--r--3rdparty/lzma/C/DllSecur.h20
-rw-r--r--3rdparty/lzma/C/LzFind.c1717
-rw-r--r--3rdparty/lzma/C/LzFind.h159
-rw-r--r--3rdparty/lzma/C/LzFindMt.c1406
-rw-r--r--3rdparty/lzma/C/LzFindMt.h109
-rw-r--r--3rdparty/lzma/C/LzFindOpt.c578
-rw-r--r--3rdparty/lzma/C/LzHash.h34
-rw-r--r--3rdparty/lzma/C/Lzma2Dec.c491
-rw-r--r--3rdparty/lzma/C/Lzma2Dec.h121
-rw-r--r--3rdparty/lzma/C/Lzma2DecMt.c1095
-rw-r--r--3rdparty/lzma/C/Lzma2DecMt.h81
-rw-r--r--3rdparty/lzma/C/Lzma2Enc.c805
-rw-r--r--3rdparty/lzma/C/Lzma2Enc.h57
-rw-r--r--3rdparty/lzma/C/Lzma86.h111
-rw-r--r--3rdparty/lzma/C/Lzma86Dec.c53
-rw-r--r--3rdparty/lzma/C/Lzma86Enc.c103
-rw-r--r--3rdparty/lzma/C/LzmaDec.c1363
-rw-r--r--3rdparty/lzma/C/LzmaDec.h237
-rw-r--r--3rdparty/lzma/C/LzmaEnc.c3144
-rw-r--r--3rdparty/lzma/C/LzmaEnc.h83
-rw-r--r--3rdparty/lzma/C/LzmaLib.c42
-rw-r--r--3rdparty/lzma/C/LzmaLib.h138
-rw-r--r--3rdparty/lzma/C/MtCoder.c571
-rw-r--r--3rdparty/lzma/C/MtCoder.h141
-rw-r--r--3rdparty/lzma/C/MtDec.c1114
-rw-r--r--3rdparty/lzma/C/MtDec.h202
-rw-r--r--3rdparty/lzma/C/Ppmd.h169
-rw-r--r--3rdparty/lzma/C/Ppmd7.c1122
-rw-r--r--3rdparty/lzma/C/Ppmd7.h181
-rw-r--r--3rdparty/lzma/C/Ppmd7Dec.c312
-rw-r--r--3rdparty/lzma/C/Ppmd7Enc.c338
-rw-r--r--3rdparty/lzma/C/Precomp.h10
-rw-r--r--3rdparty/lzma/C/RotateDefs.h50
-rw-r--r--3rdparty/lzma/C/Sha256.c516
-rw-r--r--3rdparty/lzma/C/Sha256.h76
-rw-r--r--3rdparty/lzma/C/Sha256Opt.c386
-rw-r--r--3rdparty/lzma/C/Sort.c141
-rw-r--r--3rdparty/lzma/C/Sort.h18
-rw-r--r--3rdparty/lzma/C/SwapBytes.c800
-rw-r--r--3rdparty/lzma/C/SwapBytes.h17
-rw-r--r--3rdparty/lzma/C/Threads.c562
-rw-r--r--3rdparty/lzma/C/Threads.h240
-rw-r--r--3rdparty/lzma/C/Util/7z/7z.dsp245
-rw-r--r--3rdparty/lzma/C/Util/7z/7z.dsw29
-rw-r--r--3rdparty/lzma/C/Util/7z/7zMain.c888
-rw-r--r--3rdparty/lzma/C/Util/7z/Precomp.c4
-rw-r--r--3rdparty/lzma/C/Util/7z/Precomp.h14
-rw-r--r--3rdparty/lzma/C/Util/7z/makefile40
-rw-r--r--3rdparty/lzma/C/Util/7z/makefile.gcc32
-rw-r--r--3rdparty/lzma/C/Util/Lzma/LzmaUtil.c313
-rw-r--r--3rdparty/lzma/C/Util/Lzma/LzmaUtil.dsp188
-rw-r--r--3rdparty/lzma/C/Util/Lzma/LzmaUtil.dsw29
-rw-r--r--3rdparty/lzma/C/Util/Lzma/Precomp.h14
-rw-r--r--3rdparty/lzma/C/Util/Lzma/makefile30
-rw-r--r--3rdparty/lzma/C/Util/Lzma/makefile.gcc21
-rw-r--r--3rdparty/lzma/C/Util/LzmaLib/LzmaLib.def4
-rw-r--r--3rdparty/lzma/C/Util/LzmaLib/LzmaLib.dsp202
-rw-r--r--3rdparty/lzma/C/Util/LzmaLib/LzmaLib.dsw29
-rw-r--r--3rdparty/lzma/C/Util/LzmaLib/LzmaLibExports.c15
-rw-r--r--3rdparty/lzma/C/Util/LzmaLib/Precomp.c4
-rw-r--r--3rdparty/lzma/C/Util/LzmaLib/Precomp.h14
-rw-r--r--3rdparty/lzma/C/Util/LzmaLib/makefile54
-rw-r--r--3rdparty/lzma/C/Util/LzmaLib/resource.rc3
-rw-r--r--3rdparty/lzma/C/Util/SfxSetup/Precomp.c4
-rw-r--r--3rdparty/lzma/C/Util/SfxSetup/Precomp.h14
-rw-r--r--3rdparty/lzma/C/Util/SfxSetup/SfxSetup.c656
-rw-r--r--3rdparty/lzma/C/Util/SfxSetup/SfxSetup.dsp231
-rw-r--r--3rdparty/lzma/C/Util/SfxSetup/SfxSetup.dsw29
-rw-r--r--3rdparty/lzma/C/Util/SfxSetup/makefile40
-rw-r--r--3rdparty/lzma/C/Util/SfxSetup/makefile_con40
-rw-r--r--3rdparty/lzma/C/Util/SfxSetup/resource.rc5
-rw-r--r--3rdparty/lzma/C/Util/SfxSetup/setup.icobin0 -> 1078 bytes-rw-r--r--3rdparty/lzma/C/Xz.c90
-rw-r--r--3rdparty/lzma/C/Xz.h535
-rw-r--r--3rdparty/lzma/C/XzCrc64.c80
-rw-r--r--3rdparty/lzma/C/XzCrc64.h26
-rw-r--r--3rdparty/lzma/C/XzCrc64Opt.c61
-rw-r--r--3rdparty/lzma/C/XzDec.c2875
-rw-r--r--3rdparty/lzma/C/XzEnc.c1362
-rw-r--r--3rdparty/lzma/C/XzEnc.h61
-rw-r--r--3rdparty/lzma/C/XzIn.c340
-rw-r--r--3rdparty/lzma/C/var_clang.mak11
-rw-r--r--3rdparty/lzma/C/var_clang_arm64.mak11
-rw-r--r--3rdparty/lzma/C/var_clang_x64.mak11
-rw-r--r--3rdparty/lzma/C/var_clang_x86.mak11
-rw-r--r--3rdparty/lzma/C/var_gcc.mak12
-rw-r--r--3rdparty/lzma/C/var_gcc_arm64.mak12
-rw-r--r--3rdparty/lzma/C/var_gcc_x64.mak10
-rw-r--r--3rdparty/lzma/C/var_gcc_x86.mak10
-rw-r--r--3rdparty/lzma/C/var_mac_arm64.mak11
-rw-r--r--3rdparty/lzma/C/var_mac_x64.mak11
-rw-r--r--3rdparty/lzma/C/warn_clang.mak1
-rw-r--r--3rdparty/lzma/C/warn_clang_mac.mak1
-rw-r--r--3rdparty/lzma/C/warn_gcc.mak51
-rw-r--r--3rdparty/lzma/CPP/7zip/7zip.mak240
-rw-r--r--3rdparty/lzma/CPP/7zip/7zip_gcc.mak1294
-rw-r--r--3rdparty/lzma/CPP/7zip/Aes.mak10
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zCompressionMode.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zCompressionMode.h91
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zDecode.cpp599
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zDecode.h73
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zEncode.cpp725
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zEncode.h95
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zExtract.cpp445
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp264
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zFolderInStream.h101
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zHandler.cpp793
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zHandler.h176
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zHandlerOut.cpp1086
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zHeader.cpp19
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zHeader.h153
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zIn.cpp1757
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zIn.h451
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zItem.h207
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zOut.cpp955
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zOut.h330
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zProperties.cpp182
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zProperties.h26
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zRegister.cpp27
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zSpecStream.cpp31
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zSpecStream.h49
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zUpdate.cpp2991
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/7zUpdate.h146
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/StdAfx.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/7z/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Archive.def14
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Archive2.def21
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/ArchiveExports.cpp158
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/CoderMixer2.cpp1144
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/CoderMixer2.h447
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/DummyOutStream.cpp17
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/DummyOutStream.h23
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/HandlerOut.cpp311
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/HandlerOut.h154
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.cpp57
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/InStreamWithCRC.h67
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/ItemNameUtils.cpp135
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/ItemNameUtils.h30
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/MultiStream.cpp193
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/MultiStream.h88
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.cpp18
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/OutStreamWithCRC.h35
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/ParseProperties.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/ParseProperties.h6
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Common/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/DllExports2.cpp175
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/IArchive.h704
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/Icons/7z.icobin0 -> 4710 bytes-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/LzmaHandler.cpp611
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/SplitHandler.cpp351
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/XzHandler.cpp1443
-rw-r--r--3rdparty/lzma/CPP/7zip/Archive/XzHandler.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/Asm.mak9
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Alone7z/Alone.dsp2043
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Alone7z/Alone.dsw29
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Alone7z/StdAfx.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Alone7z/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Alone7z/makefile163
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Alone7z/makefile.gcc276
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Alone7z/resource.rc7
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Format7zExtractR/StdAfx.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Format7zExtractR/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Format7zExtractR/makefile98
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Format7zExtractR/resource.rc5
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Format7zR/StdAfx.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Format7zR/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Format7zR/makefile120
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/Format7zR/resource.rc5
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/LzmaCon/LzmaAlone.cpp808
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/LzmaCon/LzmaCon.dsp540
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/LzmaCon/LzmaCon.dsw29
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/LzmaCon/StdAfx.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/LzmaCon/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/LzmaCon/makefile67
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/LzmaCon/makefile.gcc126
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/LzmaCon/resource.rc3
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/LzmaSpec/LzmaSpec.cpp715
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXCon/7z.icobin0 -> 1078 bytes-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXCon/SFXCon.dsp1009
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXCon/SFXCon.dsw29
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXCon/SfxCon.cpp521
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXCon/StdAfx.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXCon/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXCon/makefile134
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXCon/makefile.gcc213
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXCon/resource.rc9
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/ExtractCallbackSfx.cpp246
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/ExtractCallbackSfx.h83
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/ExtractEngine.cpp135
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/ExtractEngine.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsp864
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/SFXSetup.dsw29
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/SfxSetup.cpp368
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/StdAfx.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/StdAfx.h6
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/makefile118
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/resource.h6
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/resource.rc16
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXSetup/setup.icobin0 -> 1078 bytes-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXWin/7z.icobin0 -> 1078 bytes-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXWin/SFXWin.dsp1066
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXWin/SFXWin.dsw29
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXWin/SfxWin.cpp254
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXWin/StdAfx.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXWin/StdAfx.h6
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXWin/makefile156
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXWin/resource.h1
-rw-r--r--3rdparty/lzma/CPP/7zip/Bundles/SFXWin/resource.rc55
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/CWrappers.cpp354
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/CWrappers.h182
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/CreateCoder.cpp548
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/CreateCoder.h200
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/FilePathAutoRename.cpp46
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/FilePathAutoRename.h10
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/FileStreams.cpp800
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/FileStreams.h186
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/FilterCoder.cpp577
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/FilterCoder.h201
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/InBuffer.cpp164
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/InBuffer.h109
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/InOutTempBuffer.cpp237
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/InOutTempBuffer.h45
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/LimitedStreams.cpp393
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/LimitedStreams.h221
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/LockedStream.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/LockedStream.h6
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/MethodId.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/MethodId.h10
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/MethodProps.cpp737
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/MethodProps.h345
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/MultiOutStream.cpp849
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/MultiOutStream.h160
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/OffsetStream.cpp37
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/OffsetStream.h22
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/OutBuffer.cpp111
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/OutBuffer.h66
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/ProgressUtils.cpp51
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/ProgressUtils.h33
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/PropId.cpp117
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/RegisterArc.h80
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/RegisterCodec.h106
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/StreamBinder.cpp151
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/StreamBinder.h78
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/StreamObjects.cpp290
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/StreamObjects.h146
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/StreamUtils.cpp101
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/StreamUtils.h31
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/UniqBlocks.cpp57
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/UniqBlocks.h41
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/VirtThread.cpp47
-rw-r--r--3rdparty/lzma/CPP/7zip/Common/VirtThread.h24
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/Bcj2Coder.cpp853
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/Bcj2Coder.h127
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/Bcj2Register.cpp24
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/BcjCoder.cpp24
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/BcjCoder.h37
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/BcjRegister.cpp17
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/BranchMisc.cpp110
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/BranchMisc.h57
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/BranchRegister.cpp55
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/ByteSwap.cpp91
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/CodecExports.cpp378
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/CopyCoder.cpp153
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/CopyCoder.h34
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/CopyRegister.cpp15
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/DeltaFilter.cpp126
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/Lzma2Decoder.cpp267
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/Lzma2Decoder.h87
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/Lzma2Encoder.cpp126
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/Lzma2Encoder.h30
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/Lzma2Register.cpp22
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/LzmaDecoder.cpp349
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/LzmaDecoder.h113
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/LzmaEncoder.cpp356
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/LzmaEncoder.h45
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/LzmaRegister.cpp22
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/PpmdDecoder.cpp218
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/PpmdDecoder.h87
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/PpmdEncoder.cpp193
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/PpmdEncoder.h49
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/PpmdRegister.cpp22
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/XzDecoder.cpp150
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/XzDecoder.h86
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/XzEncoder.cpp243
-rw-r--r--3rdparty/lzma/CPP/7zip/Compress/XzEncoder.h35
-rw-r--r--3rdparty/lzma/CPP/7zip/Crc.mak8
-rw-r--r--3rdparty/lzma/CPP/7zip/Crc64.mak8
-rw-r--r--3rdparty/lzma/CPP/7zip/Crypto/7zAes.cpp317
-rw-r--r--3rdparty/lzma/CPP/7zip/Crypto/7zAes.h130
-rw-r--r--3rdparty/lzma/CPP/7zip/Crypto/7zAesRegister.cpp17
-rw-r--r--3rdparty/lzma/CPP/7zip/Crypto/MyAes.cpp246
-rw-r--r--3rdparty/lzma/CPP/7zip/Crypto/MyAes.h122
-rw-r--r--3rdparty/lzma/CPP/7zip/Crypto/MyAesReg.cpp29
-rw-r--r--3rdparty/lzma/CPP/7zip/Crypto/RandGen.cpp241
-rw-r--r--3rdparty/lzma/CPP/7zip/Crypto/RandGen.h41
-rw-r--r--3rdparty/lzma/CPP/7zip/Crypto/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/GuiCommon.rc84
-rw-r--r--3rdparty/lzma/CPP/7zip/Guid.txt237
-rw-r--r--3rdparty/lzma/CPP/7zip/ICoder.h477
-rw-r--r--3rdparty/lzma/CPP/7zip/IDecl.h76
-rw-r--r--3rdparty/lzma/CPP/7zip/IPassword.h54
-rw-r--r--3rdparty/lzma/CPP/7zip/IProgress.h20
-rw-r--r--3rdparty/lzma/CPP/7zip/IStream.h207
-rw-r--r--3rdparty/lzma/CPP/7zip/LzFindOpt.mak7
-rw-r--r--3rdparty/lzma/CPP/7zip/LzmaDec.mak7
-rw-r--r--3rdparty/lzma/CPP/7zip/LzmaDec_gcc.mak14
-rw-r--r--3rdparty/lzma/CPP/7zip/MyVersion.h2
-rw-r--r--3rdparty/lzma/CPP/7zip/MyVersionInfo.rc2
-rw-r--r--3rdparty/lzma/CPP/7zip/PropID.h178
-rw-r--r--3rdparty/lzma/CPP/7zip/Sha256.mak13
-rw-r--r--3rdparty/lzma/CPP/7zip/SubBuild.mak3
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Client7z/Client7z.cpp1122
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Client7z/Client7z.dsp327
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Client7z/Client7z.dsw29
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Client7z/StdAfx.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Client7z/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Client7z/makefile28
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Client7z/makefile.gcc69
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Client7z/resource.rc3
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ArchiveCommandLine.cpp1700
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ArchiveCommandLine.h160
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ArchiveExtractCallback.cpp2592
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ArchiveExtractCallback.h584
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ArchiveName.cpp176
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ArchiveName.h16
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ArchiveOpenCallback.cpp393
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ArchiveOpenCallback.h181
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/Bench.cpp4872
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/Bench.h121
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/DefaultName.cpp37
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/DefaultName.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/DirItem.h404
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/EnumDirItems.cpp1656
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/EnumDirItems.h38
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ExitCode.h27
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/Extract.cpp570
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/Extract.h106
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ExtractMode.h44
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ExtractingFilePath.cpp296
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ExtractingFilePath.h31
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/HashCalc.cpp2110
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/HashCalc.h328
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/IFileExtractCallback.h112
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/LoadCodecs.cpp1333
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/LoadCodecs.h482
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/OpenArchive.cpp3695
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/OpenArchive.h469
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/PropIDUtils.cpp741
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/PropIDUtils.h18
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/Property.h14
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/SetProperties.cpp88
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/SetProperties.h10
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/SortUtils.cpp25
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/SortUtils.h10
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/TempFiles.cpp19
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/TempFiles.h16
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/Update.cpp1857
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/Update.h218
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/UpdateAction.cpp64
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/UpdateAction.h66
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/UpdateCallback.cpp1026
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/UpdateCallback.h197
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/UpdatePair.cpp302
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/UpdatePair.h27
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/UpdateProduce.cpp72
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/UpdateProduce.h60
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/WorkDir.cpp86
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/WorkDir.h26
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Common/ZipRegistry.h209
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/BenchCon.cpp41
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/BenchCon.h14
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/Console.mak45
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/Console.manifest16
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/ConsoleClose.cpp100
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/ConsoleClose.h39
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/ExtractCallbackConsole.cpp849
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/ExtractCallbackConsole.h181
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/HashCon.cpp426
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/HashCon.h58
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/List.cpp1390
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/List.h40
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/Main.cpp1576
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/MainAr.cpp227
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/OpenCallbackConsole.cpp115
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/OpenCallbackConsole.h68
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/PercentPrinter.cpp184
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/PercentPrinter.h62
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/StdAfx.cpp3
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/UpdateCallbackConsole.cpp885
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/UpdateCallbackConsole.h133
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/UserInputUtils.cpp117
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/UserInputUtils.h27
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/makefile68
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/makefile.gcc186
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Console/resource.rc7
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Explorer/MyMessages.cpp40
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/Explorer/MyMessages.h16
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/BrowseDialog.cpp1088
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/BrowseDialog.h32
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/BrowseDialogRes.h9
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ComboDialog.cpp64
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ComboDialog.h28
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ComboDialogRes.h4
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/DialogSize.h16
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ExtractCallback.cpp1056
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ExtractCallback.h310
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/FormatUtils.cpp28
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/FormatUtils.h14
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/LangUtils.h48
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/MyWindowsNew.h119
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/OverwriteDialog.cpp138
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/OverwriteDialog.h79
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/OverwriteDialog.rc91
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/OverwriteDialogRes.h17
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/PasswordDialog.cpp58
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/PasswordDialog.h28
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/PasswordDialog.rc14
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/PasswordDialogRes.h5
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ProgressDialog.cpp201
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ProgressDialog.h171
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ProgressDialog.rc12
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ProgressDialog2.cpp1467
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ProgressDialog2.h358
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ProgressDialog2.rc40
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ProgressDialog2Res.h49
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ProgressDialog2a.rc85
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/ProgressDialogRes.h3
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/PropertyName.cpp23
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/PropertyName.h10
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/PropertyNameRes.h104
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/StdAfx.h83
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/SysIconUtils.cpp278
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/SysIconUtils.h55
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/resource.h192
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/FileManager/resourceGui.h15
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/GUI/7zG.exe.manifest23
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/GUI/Extract.rc59
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/GUI/ExtractDialog.cpp421
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/GUI/ExtractDialog.h113
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/GUI/ExtractDialog.rc98
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/GUI/ExtractDialogRes.h24
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/GUI/ExtractGUI.cpp297
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/GUI/ExtractGUI.h39
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/GUI/ExtractRes.h51
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/GUI/HashGUI.h27
-rw-r--r--3rdparty/lzma/CPP/7zip/UI/GUI/resource2.h2
-rw-r--r--3rdparty/lzma/CPP/7zip/cmpl_clang.mak3
-rw-r--r--3rdparty/lzma/CPP/7zip/cmpl_clang_arm64.mak3
-rw-r--r--3rdparty/lzma/CPP/7zip/cmpl_clang_x64.mak3
-rw-r--r--3rdparty/lzma/CPP/7zip/cmpl_clang_x86.mak3
-rw-r--r--3rdparty/lzma/CPP/7zip/cmpl_gcc.mak3
-rw-r--r--3rdparty/lzma/CPP/7zip/cmpl_gcc_arm64.mak3
-rw-r--r--3rdparty/lzma/CPP/7zip/cmpl_gcc_x64.mak3
-rw-r--r--3rdparty/lzma/CPP/7zip/cmpl_gcc_x86.mak3
-rw-r--r--3rdparty/lzma/CPP/7zip/cmpl_mac_arm64.mak3
-rw-r--r--3rdparty/lzma/CPP/7zip/cmpl_mac_x64.mak3
-rw-r--r--3rdparty/lzma/CPP/7zip/var_clang.mak11
-rw-r--r--3rdparty/lzma/CPP/7zip/var_clang_arm64.mak11
-rw-r--r--3rdparty/lzma/CPP/7zip/var_clang_x64.mak12
-rw-r--r--3rdparty/lzma/CPP/7zip/var_clang_x86.mak12
-rw-r--r--3rdparty/lzma/CPP/7zip/var_gcc.mak12
-rw-r--r--3rdparty/lzma/CPP/7zip/var_gcc_arm64.mak12
-rw-r--r--3rdparty/lzma/CPP/7zip/var_gcc_x64.mak10
-rw-r--r--3rdparty/lzma/CPP/7zip/var_gcc_x86.mak11
-rw-r--r--3rdparty/lzma/CPP/7zip/var_mac_arm64.mak11
-rw-r--r--3rdparty/lzma/CPP/7zip/var_mac_x64.mak11
-rw-r--r--3rdparty/lzma/CPP/7zip/warn_clang.mak3
-rw-r--r--3rdparty/lzma/CPP/7zip/warn_clang_mac.mak9
-rw-r--r--3rdparty/lzma/CPP/7zip/warn_gcc.mak45
-rw-r--r--3rdparty/lzma/CPP/Build.mak229
-rw-r--r--3rdparty/lzma/CPP/Common/AutoPtr.h35
-rw-r--r--3rdparty/lzma/CPP/Common/CRC.cpp7
-rw-r--r--3rdparty/lzma/CPP/Common/C_FileIO.cpp3
-rw-r--r--3rdparty/lzma/CPP/Common/C_FileIO.h6
-rw-r--r--3rdparty/lzma/CPP/Common/ComTry.h21
-rw-r--r--3rdparty/lzma/CPP/Common/CommandLineParser.cpp197
-rw-r--r--3rdparty/lzma/CPP/Common/CommandLineParser.h63
-rw-r--r--3rdparty/lzma/CPP/Common/Common.h313
-rw-r--r--3rdparty/lzma/CPP/Common/CrcReg.cpp92
-rw-r--r--3rdparty/lzma/CPP/Common/Defs.h16
-rw-r--r--3rdparty/lzma/CPP/Common/DynLimBuf.cpp93
-rw-r--r--3rdparty/lzma/CPP/Common/DynLimBuf.h41
-rw-r--r--3rdparty/lzma/CPP/Common/DynamicBuffer.h68
-rw-r--r--3rdparty/lzma/CPP/Common/IntToString.cpp192
-rw-r--r--3rdparty/lzma/CPP/Common/IntToString.h30
-rw-r--r--3rdparty/lzma/CPP/Common/Lang.h30
-rw-r--r--3rdparty/lzma/CPP/Common/ListFileUtils.cpp150
-rw-r--r--3rdparty/lzma/CPP/Common/ListFileUtils.h18
-rw-r--r--3rdparty/lzma/CPP/Common/LzFindPrepare.cpp7
-rw-r--r--3rdparty/lzma/CPP/Common/MyBuffer.h286
-rw-r--r--3rdparty/lzma/CPP/Common/MyBuffer2.h164
-rw-r--r--3rdparty/lzma/CPP/Common/MyCom.h509
-rw-r--r--3rdparty/lzma/CPP/Common/MyException.h14
-rw-r--r--3rdparty/lzma/CPP/Common/MyGuidDef.h63
-rw-r--r--3rdparty/lzma/CPP/Common/MyInitGuid.h57
-rw-r--r--3rdparty/lzma/CPP/Common/MyLinux.h75
-rw-r--r--3rdparty/lzma/CPP/Common/MyString.cpp1859
-rw-r--r--3rdparty/lzma/CPP/Common/MyString.h1064
-rw-r--r--3rdparty/lzma/CPP/Common/MyTypes.h37
-rw-r--r--3rdparty/lzma/CPP/Common/MyUnknown.h8
-rw-r--r--3rdparty/lzma/CPP/Common/MyVector.cpp3
-rw-r--r--3rdparty/lzma/CPP/Common/MyVector.h710
-rw-r--r--3rdparty/lzma/CPP/Common/MyWindows.cpp292
-rw-r--r--3rdparty/lzma/CPP/Common/MyWindows.h324
-rw-r--r--3rdparty/lzma/CPP/Common/NewHandler.cpp298
-rw-r--r--3rdparty/lzma/CPP/Common/NewHandler.h98
-rw-r--r--3rdparty/lzma/CPP/Common/Sha256Prepare.cpp7
-rw-r--r--3rdparty/lzma/CPP/Common/Sha256Reg.cpp67
-rw-r--r--3rdparty/lzma/CPP/Common/StdAfx.h8
-rw-r--r--3rdparty/lzma/CPP/Common/StdInStream.cpp98
-rw-r--r--3rdparty/lzma/CPP/Common/StdInStream.h46
-rw-r--r--3rdparty/lzma/CPP/Common/StdOutStream.cpp160
-rw-r--r--3rdparty/lzma/CPP/Common/StdOutStream.h78
-rw-r--r--3rdparty/lzma/CPP/Common/StringConvert.cpp756
-rw-r--r--3rdparty/lzma/CPP/Common/StringConvert.h110
-rw-r--r--3rdparty/lzma/CPP/Common/StringToInt.cpp171
-rw-r--r--3rdparty/lzma/CPP/Common/StringToInt.h22
-rw-r--r--3rdparty/lzma/CPP/Common/TextConfig.cpp124
-rw-r--r--3rdparty/lzma/CPP/Common/TextConfig.h19
-rw-r--r--3rdparty/lzma/CPP/Common/UTFConvert.cpp863
-rw-r--r--3rdparty/lzma/CPP/Common/UTFConvert.h384
-rw-r--r--3rdparty/lzma/CPP/Common/Wildcard.cpp788
-rw-r--r--3rdparty/lzma/CPP/Common/Wildcard.h231
-rw-r--r--3rdparty/lzma/CPP/Common/XzCrc64Init.cpp7
-rw-r--r--3rdparty/lzma/CPP/Common/XzCrc64Reg.cpp39
-rw-r--r--3rdparty/lzma/CPP/Windows/COM.h86
-rw-r--r--3rdparty/lzma/CPP/Windows/Clipboard.cpp130
-rw-r--r--3rdparty/lzma/CPP/Windows/Clipboard.h28
-rw-r--r--3rdparty/lzma/CPP/Windows/CommonDialog.cpp269
-rw-r--r--3rdparty/lzma/CPP/Windows/CommonDialog.h43
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/ComboBox.cpp66
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/ComboBox.h77
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/CommandBar.h52
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/Dialog.cpp445
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/Dialog.h194
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/Edit.h19
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/ImageList.cpp10
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/ImageList.h87
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/ListView.cpp162
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/ListView.h156
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/ProgressBar.h35
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/PropertyPage.cpp165
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/PropertyPage.h50
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/ReBar.h34
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/Static.h28
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/StatusBar.h42
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/StdAfx.h11
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/ToolBar.h43
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/Trackbar.h27
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/Window2.cpp202
-rw-r--r--3rdparty/lzma/CPP/Windows/Control/Window2.h53
-rw-r--r--3rdparty/lzma/CPP/Windows/DLL.cpp179
-rw-r--r--3rdparty/lzma/CPP/Windows/DLL.h103
-rw-r--r--3rdparty/lzma/CPP/Windows/Defs.h17
-rw-r--r--3rdparty/lzma/CPP/Windows/ErrorMsg.cpp133
-rw-r--r--3rdparty/lzma/CPP/Windows/ErrorMsg.h16
-rw-r--r--3rdparty/lzma/CPP/Windows/FileDir.cpp1229
-rw-r--r--3rdparty/lzma/CPP/Windows/FileDir.h135
-rw-r--r--3rdparty/lzma/CPP/Windows/FileFind.cpp1329
-rw-r--r--3rdparty/lzma/CPP/Windows/FileFind.h348
-rw-r--r--3rdparty/lzma/CPP/Windows/FileIO.cpp905
-rw-r--r--3rdparty/lzma/CPP/Windows/FileIO.h390
-rw-r--r--3rdparty/lzma/CPP/Windows/FileLink.cpp622
-rw-r--r--3rdparty/lzma/CPP/Windows/FileMapping.cpp12
-rw-r--r--3rdparty/lzma/CPP/Windows/FileMapping.h66
-rw-r--r--3rdparty/lzma/CPP/Windows/FileName.cpp894
-rw-r--r--3rdparty/lzma/CPP/Windows/FileName.h133
-rw-r--r--3rdparty/lzma/CPP/Windows/FileSystem.cpp139
-rw-r--r--3rdparty/lzma/CPP/Windows/FileSystem.h31
-rw-r--r--3rdparty/lzma/CPP/Windows/Handle.h39
-rw-r--r--3rdparty/lzma/CPP/Windows/MemoryGlobal.cpp36
-rw-r--r--3rdparty/lzma/CPP/Windows/MemoryGlobal.h55
-rw-r--r--3rdparty/lzma/CPP/Windows/MemoryLock.cpp124
-rw-r--r--3rdparty/lzma/CPP/Windows/MemoryLock.h40
-rw-r--r--3rdparty/lzma/CPP/Windows/NtCheck.h58
-rw-r--r--3rdparty/lzma/CPP/Windows/PropVariant.cpp391
-rw-r--r--3rdparty/lzma/CPP/Windows/PropVariant.h173
-rw-r--r--3rdparty/lzma/CPP/Windows/PropVariantConv.cpp190
-rw-r--r--3rdparty/lzma/CPP/Windows/PropVariantConv.h40
-rw-r--r--3rdparty/lzma/CPP/Windows/Registry.cpp406
-rw-r--r--3rdparty/lzma/CPP/Windows/Registry.h84
-rw-r--r--3rdparty/lzma/CPP/Windows/ResourceString.cpp103
-rw-r--r--3rdparty/lzma/CPP/Windows/ResourceString.h17
-rw-r--r--3rdparty/lzma/CPP/Windows/SecurityUtils.cpp186
-rw-r--r--3rdparty/lzma/CPP/Windows/SecurityUtils.h148
-rw-r--r--3rdparty/lzma/CPP/Windows/Shell.cpp821
-rw-r--r--3rdparty/lzma/CPP/Windows/Shell.h130
-rw-r--r--3rdparty/lzma/CPP/Windows/StdAfx.h12
-rw-r--r--3rdparty/lzma/CPP/Windows/Synchronization.cpp87
-rw-r--r--3rdparty/lzma/CPP/Windows/Synchronization.h381
-rw-r--r--3rdparty/lzma/CPP/Windows/System.cpp278
-rw-r--r--3rdparty/lzma/CPP/Windows/System.h132
-rw-r--r--3rdparty/lzma/CPP/Windows/SystemInfo.cpp1022
-rw-r--r--3rdparty/lzma/CPP/Windows/SystemInfo.h19
-rw-r--r--3rdparty/lzma/CPP/Windows/Thread.h44
-rw-r--r--3rdparty/lzma/CPP/Windows/TimeUtils.cpp404
-rw-r--r--3rdparty/lzma/CPP/Windows/TimeUtils.h146
-rw-r--r--3rdparty/lzma/CPP/Windows/Window.cpp179
-rw-r--r--3rdparty/lzma/CPP/Windows/Window.h363
-rw-r--r--3rdparty/lzma/CS/7zip/Common/CRC.cs55
-rw-r--r--3rdparty/lzma/CS/7zip/Common/CommandLineParser.cs274
-rw-r--r--3rdparty/lzma/CS/7zip/Common/InBuffer.cs72
-rw-r--r--3rdparty/lzma/CS/7zip/Common/OutBuffer.cs47
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LZ/IMatchFinder.cs24
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LZ/LzBinTree.cs367
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LZ/LzInWindow.cs132
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LZ/LzOutWindow.cs110
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LZMA/LzmaBase.cs76
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LZMA/LzmaDecoder.cs398
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LZMA/LzmaEncoder.cs1480
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LzmaAlone/LzmaAlone.cs364
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LzmaAlone/LzmaAlone.sln20
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LzmaAlone/LzmaBench.cs340
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LzmaAlone/Properties/AssemblyInfo.cs29
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LzmaAlone/Properties/Resources.cs70
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/LzmaAlone/Properties/Settings.cs42
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/RangeCoder/RangeCoder.cs234
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/RangeCoder/RangeCoderBit.cs117
-rw-r--r--3rdparty/lzma/CS/7zip/Compress/RangeCoder/RangeCoderBitTree.cs157
-rw-r--r--3rdparty/lzma/CS/7zip/ICoder.cs157
-rw-r--r--3rdparty/lzma/DOC/7zC.txt187
-rw-r--r--3rdparty/lzma/DOC/7zFormat.txt469
-rw-r--r--3rdparty/lzma/DOC/Methods.txt176
-rw-r--r--3rdparty/lzma/DOC/installer.txt166
-rw-r--r--3rdparty/lzma/DOC/lzma-history.txt560
-rw-r--r--3rdparty/lzma/DOC/lzma-sdk.txt404
-rw-r--r--3rdparty/lzma/DOC/lzma-specification.txt1176
-rw-r--r--3rdparty/lzma/DOC/lzma.txt345
-rw-r--r--3rdparty/lzma/Java/SevenZip/CRC.java52
-rw-r--r--3rdparty/lzma/Java/SevenZip/Compression/LZ/BinTree.java382
-rw-r--r--3rdparty/lzma/Java/SevenZip/Compression/LZ/InWindow.java131
-rw-r--r--3rdparty/lzma/Java/SevenZip/Compression/LZ/OutWindow.java85
-rw-r--r--3rdparty/lzma/Java/SevenZip/Compression/LZMA/Base.java88
-rw-r--r--3rdparty/lzma/Java/SevenZip/Compression/LZMA/Decoder.java329
-rw-r--r--3rdparty/lzma/Java/SevenZip/Compression/LZMA/Encoder.java1416
-rw-r--r--3rdparty/lzma/Java/SevenZip/Compression/RangeCoder/BitTreeDecoder.java55
-rw-r--r--3rdparty/lzma/Java/SevenZip/Compression/RangeCoder/BitTreeEncoder.java99
-rw-r--r--3rdparty/lzma/Java/SevenZip/Compression/RangeCoder/Decoder.java88
-rw-r--r--3rdparty/lzma/Java/SevenZip/Compression/RangeCoder/Encoder.java151
-rw-r--r--3rdparty/lzma/Java/SevenZip/ICodeProgress.java6
-rw-r--r--3rdparty/lzma/Java/SevenZip/LzmaAlone.java253
-rw-r--r--3rdparty/lzma/Java/SevenZip/LzmaBench.java392
-rw-r--r--3rdparty/minimp3/minimp3.h1865
-rw-r--r--3rdparty/nanosvg/CMakeLists.txt75
-rw-r--r--3rdparty/nanosvg/Config.cmake.in5
-rw-r--r--3rdparty/nanosvg/LICENSE.txt18
-rw-r--r--3rdparty/nanosvg/README.md112
-rw-r--r--3rdparty/nanosvg/example/23.svg730
-rw-r--r--3rdparty/nanosvg/example/drawing.svg97
-rw-r--r--3rdparty/nanosvg/example/example1.c258
-rw-r--r--3rdparty/nanosvg/example/example2.c69
-rw-r--r--3rdparty/nanosvg/example/nano.svg27
-rw-r--r--3rdparty/nanosvg/example/screenshot-1.pngbin0 -> 60837 bytes-rw-r--r--3rdparty/nanosvg/example/screenshot-2.pngbin0 -> 158111 bytes-rw-r--r--3rdparty/nanosvg/example/stb_image_write.h511
-rw-r--r--3rdparty/nanosvg/premake4.lua56
-rw-r--r--3rdparty/nanosvg/src/nanosvg.h3139
-rw-r--r--3rdparty/nanosvg/src/nanosvgrast.h1458
-rw-r--r--3rdparty/portaudio/CMakeLists.txt484
-rw-r--r--3rdparty/portaudio/Doxyfile239
-rw-r--r--3rdparty/portaudio/Doxyfile.developer242
-rw-r--r--3rdparty/portaudio/LICENSE.txt81
-rw-r--r--3rdparty/portaudio/Makefile.in260
-rw-r--r--3rdparty/portaudio/README.configure.txt32
-rw-r--r--3rdparty/portaudio/README.md64
-rw-r--r--3rdparty/portaudio/README.txt98
-rw-r--r--3rdparty/portaudio/SConstruct197
-rw-r--r--3rdparty/portaudio/aclocal.m48831
-rw-r--r--3rdparty/portaudio/bindings/cpp/AUTHORS0
-rw-r--r--3rdparty/portaudio/bindings/cpp/CMakeLists.txt122
-rw-r--r--3rdparty/portaudio/bindings/cpp/COPYING31
-rw-r--r--3rdparty/portaudio/bindings/cpp/ChangeLog178
-rw-r--r--3rdparty/portaudio/bindings/cpp/INSTALL370
-rw-r--r--3rdparty/portaudio/bindings/cpp/Makefile.am7
-rw-r--r--3rdparty/portaudio/bindings/cpp/Makefile.in848
-rw-r--r--3rdparty/portaudio/bindings/cpp/NEWS0
-rw-r--r--3rdparty/portaudio/bindings/cpp/README0
-rw-r--r--3rdparty/portaudio/bindings/cpp/SConscript65
-rw-r--r--3rdparty/portaudio/bindings/cpp/aclocal.m49787
-rw-r--r--3rdparty/portaudio/bindings/cpp/bin/Makefile.am9
-rw-r--r--3rdparty/portaudio/bindings/cpp/bin/Makefile.in618
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/gnu/Makefile.in106
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/gnu/OUT_OF_DATE0
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/gnu/aclocal.m457
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/gnu/config.guess1308
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/gnu/config.sub1505
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/gnu/configure4297
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/gnu/configure.ac214
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/gnu/install-sh251
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc6/devs_example.dsp248
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc6/devs_example.dsw44
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc6/sine_example.dsp252
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc6/sine_example.dsw44
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc6/static_library.dsp395
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc6/static_library.dsw29
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc7/OUT_OF_DATE0
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc7_1/devs_example.sln30
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc7_1/devs_example.vcproj195
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc7_1/sine_example.sln30
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc7_1/sine_example.vcproj327
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc7_1/static_library.sln21
-rw-r--r--3rdparty/portaudio/bindings/cpp/build/vc7_1/static_library.vcproj218
-rw-r--r--3rdparty/portaudio/bindings/cpp/cmake/PortAudioCppConfig.cmake.in5
-rw-r--r--3rdparty/portaudio/bindings/cpp/cmake/modules/FindASIO.cmake81
-rw-r--r--3rdparty/portaudio/bindings/cpp/cmake/modules/FindPortAudio.cmake39
-rw-r--r--3rdparty/portaudio/bindings/cpp/cmake/portaudiocpp.pc.in12
-rwxr-xr-x3rdparty/portaudio/bindings/cpp/configure17918
-rw-r--r--3rdparty/portaudio/bindings/cpp/configure.ac54
-rw-r--r--3rdparty/portaudio/bindings/cpp/doc/Makefile.am5
-rw-r--r--3rdparty/portaudio/bindings/cpp/doc/Makefile.in432
-rw-r--r--3rdparty/portaudio/bindings/cpp/doc/README34
-rw-r--r--3rdparty/portaudio/bindings/cpp/doc/config.doxy211
-rw-r--r--3rdparty/portaudio/bindings/cpp/doc/config.doxy.linux210
-rw-r--r--3rdparty/portaudio/bindings/cpp/example/devs.cxx177
-rw-r--r--3rdparty/portaudio/bindings/cpp/example/sine.cxx135
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/Makefile.am22
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/Makefile.in571
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/AsioDeviceAdapter.hxx44
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/AutoSystem.hxx62
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/BlockingStream.hxx44
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/CFunCallbackStream.hxx48
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/CallbackInterface.hxx45
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/CallbackStream.hxx40
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/CppFunCallbackStream.hxx86
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/Device.hxx90
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/DirectionSpecificStreamParameters.hxx77
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/Exception.hxx107
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/HostApi.hxx75
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/InterfaceCallbackStream.hxx49
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/MemFunCallbackStream.hxx107
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/PortAudioCpp.hxx109
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/SampleDataFormat.hxx35
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/Stream.hxx81
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/StreamParameters.hxx77
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/System.hxx106
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/SystemDeviceIterator.hxx65
-rw-r--r--3rdparty/portaudio/bindings/cpp/include/portaudiocpp/SystemHostApiIterator.hxx61
-rw-r--r--3rdparty/portaudio/bindings/cpp/lib/Makefile.am26
-rw-r--r--3rdparty/portaudio/bindings/cpp/lib/Makefile.in789
-rw-r--r--3rdparty/portaudio/bindings/cpp/portaudiocpp.pc.in12
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/AsioDeviceAdapter.cxx81
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/BlockingStream.cxx97
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/CFunCallbackStream.cxx41
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/CMakeLists.txt26
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/CallbackInterface.cxx23
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/CallbackStream.cxx20
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/CppFunCallbackStream.cxx81
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/Device.cxx166
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/DirectionSpecificStreamParameters.cxx163
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/Exception.cxx121
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/HostApi.cxx121
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/InterfaceCallbackStream.cxx45
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/MemFunCallbackStream.cxx3
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/Stream.cxx195
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/StreamParameters.cxx160
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/System.cxx307
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/SystemDeviceIterator.cxx58
-rw-r--r--3rdparty/portaudio/bindings/cpp/source/portaudiocpp/SystemHostApiIterator.cxx58
-rw-r--r--3rdparty/portaudio/bindings/java/c/build/vs2010/PortAudioJNI/PortAudioJNI.sln26
-rw-r--r--3rdparty/portaudio/bindings/java/c/build/vs2010/PortAudioJNI/PortAudioJNI.vcproj198
-rw-r--r--3rdparty/portaudio/bindings/java/c/build/vs2010/PortAudioJNI/PortAudioJNI.vcxproj174
-rw-r--r--3rdparty/portaudio/bindings/java/c/src/com_portaudio_BlockingStream.c352
-rw-r--r--3rdparty/portaudio/bindings/java/c/src/com_portaudio_BlockingStream.h130
-rw-r--r--3rdparty/portaudio/bindings/java/c/src/com_portaudio_PortAudio.c279
-rw-r--r--3rdparty/portaudio/bindings/java/c/src/com_portaudio_PortAudio.h183
-rw-r--r--3rdparty/portaudio/bindings/java/c/src/jpa_tools.c208
-rw-r--r--3rdparty/portaudio/bindings/java/c/src/jpa_tools.h62
-rw-r--r--3rdparty/portaudio/bindings/java/jportaudio.dox65
-rw-r--r--3rdparty/portaudio/bindings/java/jportaudio/.classpath8
-rw-r--r--3rdparty/portaudio/bindings/java/jportaudio/.project17
-rw-r--r--3rdparty/portaudio/bindings/java/jportaudio/jtests/com/portaudio/PlaySine.java89
-rw-r--r--3rdparty/portaudio/bindings/java/jportaudio/jtests/com/portaudio/TestBasic.java523
-rw-r--r--3rdparty/portaudio/bindings/java/jportaudio/src/com/portaudio/BlockingStream.java208
-rw-r--r--3rdparty/portaudio/bindings/java/jportaudio/src/com/portaudio/DeviceInfo.java65
-rw-r--r--3rdparty/portaudio/bindings/java/jportaudio/src/com/portaudio/HostApiInfo.java61
-rw-r--r--3rdparty/portaudio/bindings/java/jportaudio/src/com/portaudio/PortAudio.java261
-rw-r--r--3rdparty/portaudio/bindings/java/jportaudio/src/com/portaudio/StreamInfo.java60
-rw-r--r--3rdparty/portaudio/bindings/java/jportaudio/src/com/portaudio/StreamParameters.java57
-rw-r--r--3rdparty/portaudio/bindings/java/scripts/make_header.bat4
-rw-r--r--3rdparty/portaudio/build/msvc/portaudio.def50
-rw-r--r--3rdparty/portaudio/build/msvc/portaudio.dsp269
-rw-r--r--3rdparty/portaudio/build/msvc/portaudio.dsw29
-rw-r--r--3rdparty/portaudio/build/msvc/portaudio.sln32
-rw-r--r--3rdparty/portaudio/build/msvc/portaudio.vcproj1932
-rw-r--r--3rdparty/portaudio/build/msvc/readme.txt112
-rw-r--r--3rdparty/portaudio/build/scons/SConscript_common30
-rw-r--r--3rdparty/portaudio/build/scons/SConscript_opts91
-rwxr-xr-x3rdparty/portaudio/clear_gitrevision.sh12
-rw-r--r--3rdparty/portaudio/cmake/PortAudioConfig.cmake.in18
-rw-r--r--3rdparty/portaudio/cmake/cmake_uninstall.cmake.in21
-rw-r--r--3rdparty/portaudio/cmake/modules/FindASIO.cmake79
-rw-r--r--3rdparty/portaudio/cmake/modules/FindJACK.cmake67
-rw-r--r--3rdparty/portaudio/cmake/modules/FindOSS.cmake57
-rw-r--r--3rdparty/portaudio/cmake/modules/FindPulseAudio.cmake147
-rw-r--r--3rdparty/portaudio/cmake/modules/FindRegex.cmake68
-rw-r--r--3rdparty/portaudio/cmake/portaudio-2.0.pc.in13
-rw-r--r--3rdparty/portaudio/cmake/portaudio.def.in67
-rw-r--r--3rdparty/portaudio/cmake/toolchains/i686-w64-mingw32.cmake17
-rw-r--r--3rdparty/portaudio/cmake_support/FindASIOSDK.cmake41
-rw-r--r--3rdparty/portaudio/cmake_support/FindDXSDK.cmake59
-rw-r--r--3rdparty/portaudio/cmake_support/FindJack.cmake41
-rw-r--r--3rdparty/portaudio/cmake_support/options_cmake.h.in31
-rw-r--r--3rdparty/portaudio/cmake_support/portaudio-2.0.pc.in12
-rw-r--r--3rdparty/portaudio/cmake_support/template_portaudio.def53
-rwxr-xr-x3rdparty/portaudio/config.guess1558
-rwxr-xr-x3rdparty/portaudio/config.sub1791
-rwxr-xr-x3rdparty/portaudio/configure18873
-rw-r--r--3rdparty/portaudio/configure.in521
-rwxr-xr-x3rdparty/portaudio/depcomp791
-rw-r--r--3rdparty/portaudio/doc/src/api_overview.dox162
-rw-r--r--3rdparty/portaudio/doc/src/images/portaudio-external-architecture-diagram.pngbin0 -> 20386 bytes-rw-r--r--3rdparty/portaudio/doc/src/license.dox38
-rw-r--r--3rdparty/portaudio/doc/src/mainpage.dox63
-rw-r--r--3rdparty/portaudio/doc/src/srcguide.dox55
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/blocking_read_write.dox68
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/compile_cmake.dox57
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/compile_linux.dox83
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/compile_mac_coreaudio.dox122
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/compile_windows.dox121
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/compile_windows_asio_msvc.dox102
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/compile_windows_mingw-w64.dox44
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/compile_windows_mingw.dox57
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/exploring.dox15
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/initializing_portaudio.dox29
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/open_default_stream.dox48
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/querying_devices.dox111
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/start_stop_abort.dox35
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/terminating_portaudio.dox20
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/tutorial_start.dox62
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/utility_functions.dox69
-rw-r--r--3rdparty/portaudio/doc/src/tutorial/writing_a_callback.dox70
-rw-r--r--3rdparty/portaudio/doc/utils/checkfiledocs.py87
-rw-r--r--3rdparty/portaudio/examples/CMakeLists.txt46
-rw-r--r--3rdparty/portaudio/examples/pa_devs.c252
-rw-r--r--3rdparty/portaudio/examples/pa_fuzz.c187
-rw-r--r--3rdparty/portaudio/examples/paex_mono_asio_channel_select.c167
-rw-r--r--3rdparty/portaudio/examples/paex_ocean_shore.c533
-rw-r--r--3rdparty/portaudio/examples/paex_pink.c280
-rw-r--r--3rdparty/portaudio/examples/paex_read_write_wire.c204
-rw-r--r--3rdparty/portaudio/examples/paex_record.c353
-rw-r--r--3rdparty/portaudio/examples/paex_record_file.c457
-rw-r--r--3rdparty/portaudio/examples/paex_saw.c133
-rw-r--r--3rdparty/portaudio/examples/paex_sine.c175
-rw-r--r--3rdparty/portaudio/examples/paex_sine_c++.cpp275
-rw-r--r--3rdparty/portaudio/examples/paex_wmme_ac3.c220
-rw-r--r--3rdparty/portaudio/examples/paex_wmme_surround.c210
-rw-r--r--3rdparty/portaudio/examples/paex_write_sine.c166
-rw-r--r--3rdparty/portaudio/examples/paex_write_sine_nonint.c167
-rwxr-xr-x3rdparty/portaudio/fixdir.bat19
-rwxr-xr-x3rdparty/portaudio/fixfile.bat7
-rw-r--r--3rdparty/portaudio/include/pa_asio.h150
-rw-r--r--3rdparty/portaudio/include/pa_jack.h77
-rw-r--r--3rdparty/portaudio/include/pa_linux_alsa.h107
-rw-r--r--3rdparty/portaudio/include/pa_linux_pulseaudio.h79
-rw-r--r--3rdparty/portaudio/include/pa_mac_core.h191
-rw-r--r--3rdparty/portaudio/include/pa_win_ds.h95
-rw-r--r--3rdparty/portaudio/include/pa_win_wasapi.h814
-rw-r--r--3rdparty/portaudio/include/pa_win_waveformat.h199
-rw-r--r--3rdparty/portaudio/include/pa_win_wdmks.h137
-rw-r--r--3rdparty/portaudio/include/pa_win_wmme.h185
-rw-r--r--3rdparty/portaudio/include/portaudio.h1245
-rw-r--r--3rdparty/portaudio/index.html105
-rwxr-xr-x3rdparty/portaudio/install-sh527
-rw-r--r--3rdparty/portaudio/ltmain.sh9661
-rwxr-xr-x3rdparty/portaudio/missing215
-rw-r--r--3rdparty/portaudio/msvc/portaudio.def64
-rw-r--r--3rdparty/portaudio/msvc/portaudio.dsp273
-rw-r--r--3rdparty/portaudio/msvc/portaudio.dsw29
-rw-r--r--3rdparty/portaudio/msvc/portaudio.sln32
-rw-r--r--3rdparty/portaudio/msvc/portaudio.vcproj1936
-rw-r--r--3rdparty/portaudio/msvc/readme.txt112
-rw-r--r--3rdparty/portaudio/pa_compare_def_files.py98
-rw-r--r--3rdparty/portaudio/pa_whitelint.py297
-rw-r--r--3rdparty/portaudio/pablio/README.txt49
-rw-r--r--3rdparty/portaudio/pablio/pablio.c314
-rw-r--r--3rdparty/portaudio/pablio/pablio.def35
-rw-r--r--3rdparty/portaudio/pablio/pablio.h116
-rw-r--r--3rdparty/portaudio/pablio/test_rw.c105
-rw-r--r--3rdparty/portaudio/pablio/test_rw_echo.c129
-rw-r--r--3rdparty/portaudio/pablio/test_w_saw.c114
-rw-r--r--3rdparty/portaudio/pablio/test_w_saw8.c112
-rw-r--r--3rdparty/portaudio/portaudio-2.0.pc.in12
-rw-r--r--3rdparty/portaudio/qa/CMakeLists.txt5
-rw-r--r--3rdparty/portaudio/qa/loopback/CMakeLists.txt19
-rw-r--r--3rdparty/portaudio/qa/loopback/README.txt92
-rw-r--r--3rdparty/portaudio/qa/loopback/src/audio_analyzer.c706
-rw-r--r--3rdparty/portaudio/qa/loopback/src/audio_analyzer.h187
-rwxr-xr-x3rdparty/portaudio/qa/loopback/src/biquad_filter.c123
-rwxr-xr-x3rdparty/portaudio/qa/loopback/src/biquad_filter.h38
-rw-r--r--3rdparty/portaudio/qa/loopback/src/paqa.c1592
-rw-r--r--3rdparty/portaudio/qa/loopback/src/paqa_tools.c171
-rw-r--r--3rdparty/portaudio/qa/loopback/src/paqa_tools.h52
-rwxr-xr-x3rdparty/portaudio/qa/loopback/src/qa_tools.h83
-rw-r--r--3rdparty/portaudio/qa/loopback/src/test_audio_analyzer.c718
-rw-r--r--3rdparty/portaudio/qa/loopback/src/test_audio_analyzer.h46
-rwxr-xr-x3rdparty/portaudio/qa/loopback/src/write_wav.c242
-rwxr-xr-x3rdparty/portaudio/qa/loopback/src/write_wav.h103
-rw-r--r--3rdparty/portaudio/qa/paqa_devs.c843
-rw-r--r--3rdparty/portaudio/qa/paqa_errs.c379
-rw-r--r--3rdparty/portaudio/qa/paqa_latency.c482
-rw-r--r--3rdparty/portaudio/qa/paqa_macros.h71
-rw-r--r--3rdparty/portaudio/src/SConscript220
-rw-r--r--3rdparty/portaudio/src/common/pa_allocation.c243
-rw-r--r--3rdparty/portaudio/src/common/pa_allocation.h105
-rw-r--r--3rdparty/portaudio/src/common/pa_converters.c1940
-rw-r--r--3rdparty/portaudio/src/common/pa_converters.h263
-rw-r--r--3rdparty/portaudio/src/common/pa_cpuload.c105
-rw-r--r--3rdparty/portaudio/src/common/pa_cpuload.h72
-rw-r--r--3rdparty/portaudio/src/common/pa_debugprint.c123
-rw-r--r--3rdparty/portaudio/src/common/pa_debugprint.h149
-rw-r--r--3rdparty/portaudio/src/common/pa_dither.c218
-rw-r--r--3rdparty/portaudio/src/common/pa_dither.h106
-rw-r--r--3rdparty/portaudio/src/common/pa_endianness.h145
-rw-r--r--3rdparty/portaudio/src/common/pa_front.c1824
-rw-r--r--3rdparty/portaudio/src/common/pa_gitrevision.h1
-rw-r--r--3rdparty/portaudio/src/common/pa_hostapi.h369
-rw-r--r--3rdparty/portaudio/src/common/pa_memorybarrier.h138
-rw-r--r--3rdparty/portaudio/src/common/pa_process.c1837
-rw-r--r--3rdparty/portaudio/src/common/pa_process.h754
-rw-r--r--3rdparty/portaudio/src/common/pa_ringbuffer.c237
-rw-r--r--3rdparty/portaudio/src/common/pa_ringbuffer.h236
-rw-r--r--3rdparty/portaudio/src/common/pa_stream.c150
-rw-r--r--3rdparty/portaudio/src/common/pa_stream.h205
-rw-r--r--3rdparty/portaudio/src/common/pa_trace.c238
-rw-r--r--3rdparty/portaudio/src/common/pa_trace.h117
-rw-r--r--3rdparty/portaudio/src/common/pa_types.h107
-rw-r--r--3rdparty/portaudio/src/common/pa_util.h175
-rw-r--r--3rdparty/portaudio/src/hostapi/alsa/pa_linux_alsa.c4707
-rw-r--r--3rdparty/portaudio/src/hostapi/asihpi/pa_linux_asihpi.c2890
-rw-r--r--3rdparty/portaudio/src/hostapi/asio/ASIO-README.txt170
-rw-r--r--3rdparty/portaudio/src/hostapi/asio/Callback_adaptation_.pdfbin0 -> 50527 bytes-rw-r--r--3rdparty/portaudio/src/hostapi/asio/Pa_ASIO.pdfbin0 -> 50778 bytes-rw-r--r--3rdparty/portaudio/src/hostapi/asio/iasiothiscallresolver.cpp572
-rw-r--r--3rdparty/portaudio/src/hostapi/asio/iasiothiscallresolver.h197
-rw-r--r--3rdparty/portaudio/src/hostapi/asio/pa_asio.cpp4241
-rw-r--r--3rdparty/portaudio/src/hostapi/audioio/pa_unix_audioio.c1121
-rw-r--r--3rdparty/portaudio/src/hostapi/coreaudio/notes.txt196
-rw-r--r--3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core.c2847
-rw-r--r--3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core_blocking.c640
-rw-r--r--3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core_blocking.h134
-rw-r--r--3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core_internal.h193
-rw-r--r--3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core_utilities.c816
-rw-r--r--3rdparty/portaudio/src/hostapi/coreaudio/pa_mac_core_utilities.h268
-rw-r--r--3rdparty/portaudio/src/hostapi/dsound/pa_win_ds.c3256
-rw-r--r--3rdparty/portaudio/src/hostapi/dsound/pa_win_ds_dynlink.c224
-rw-r--r--3rdparty/portaudio/src/hostapi/dsound/pa_win_ds_dynlink.h106
-rw-r--r--3rdparty/portaudio/src/hostapi/jack/pa_jack.c1822
-rw-r--r--3rdparty/portaudio/src/hostapi/oss/low_latency_tip.txtbin0 -> 3111 bytes-rw-r--r--3rdparty/portaudio/src/hostapi/oss/pa_unix_oss.c2052
-rw-r--r--3rdparty/portaudio/src/hostapi/oss/recplay.c114
-rw-r--r--3rdparty/portaudio/src/hostapi/pulseaudio/pa_linux_pulseaudio.c1452
-rw-r--r--3rdparty/portaudio/src/hostapi/pulseaudio/pa_linux_pulseaudio_block.c197
-rw-r--r--3rdparty/portaudio/src/hostapi/pulseaudio/pa_linux_pulseaudio_block_internal.h91
-rw-r--r--3rdparty/portaudio/src/hostapi/pulseaudio/pa_linux_pulseaudio_cb.c971
-rw-r--r--3rdparty/portaudio/src/hostapi/pulseaudio/pa_linux_pulseaudio_cb_internal.h97
-rw-r--r--3rdparty/portaudio/src/hostapi/pulseaudio/pa_linux_pulseaudio_internal.h273
-rw-r--r--3rdparty/portaudio/src/hostapi/skeleton/README.txt1
-rw-r--r--3rdparty/portaudio/src/hostapi/skeleton/pa_hostapi_skeleton.c814
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/AudioSessionTypes.h58
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/PropIdl.h19
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/ShTypes.h359
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/audioclient.h1177
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/devicetopology.h3275
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/endpointvolume.h620
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/functiondiscoverykeys.h255
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/functiondiscoverykeys_devpkey.h13
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/ks.h3666
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/ksguid.h28
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/ksmedia.h4610
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/ksproxy.h638
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/ksuuids.h159
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/mmdeviceapi.h929
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/propkey.h13
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/propkeydef.h26
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/propsys.h3605
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/rpcsal.h113
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/sal.h252
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/sdkddkver.h220
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/structuredquery.h2478
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/mingw-include/winapifamily.h24
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/pa_win_wasapi.c6502
-rw-r--r--3rdparty/portaudio/src/hostapi/wasapi/readme.txt22
-rw-r--r--3rdparty/portaudio/src/hostapi/wdmks/pa_win_wdmks.c6812
-rw-r--r--3rdparty/portaudio/src/hostapi/wdmks/readme.txt85
-rw-r--r--3rdparty/portaudio/src/hostapi/wmme/pa_win_wmme.c4018
-rw-r--r--3rdparty/portaudio/src/os/unix/pa_unix_hostapis.c113
-rw-r--r--3rdparty/portaudio/src/os/unix/pa_unix_util.c723
-rw-r--r--3rdparty/portaudio/src/os/unix/pa_unix_util.h222
-rw-r--r--3rdparty/portaudio/src/os/win/pa_win_coinitialize.c135
-rw-r--r--3rdparty/portaudio/src/os/win/pa_win_coinitialize.h94
-rw-r--r--3rdparty/portaudio/src/os/win/pa_win_hostapis.c105
-rw-r--r--3rdparty/portaudio/src/os/win/pa_win_util.c177
-rw-r--r--3rdparty/portaudio/src/os/win/pa_win_util.h64
-rw-r--r--3rdparty/portaudio/src/os/win/pa_win_version.c242
-rw-r--r--3rdparty/portaudio/src/os/win/pa_win_version.h83
-rw-r--r--3rdparty/portaudio/src/os/win/pa_win_waveformat.c163
-rw-r--r--3rdparty/portaudio/src/os/win/pa_win_wdmks_utils.c309
-rw-r--r--3rdparty/portaudio/src/os/win/pa_win_wdmks_utils.h65
-rw-r--r--3rdparty/portaudio/src/os/win/pa_x86_plain_converters.c1218
-rw-r--r--3rdparty/portaudio/src/os/win/pa_x86_plain_converters.h60
-rw-r--r--3rdparty/portaudio/test/CMakeLists.txt61
-rw-r--r--3rdparty/portaudio/test/README.txt52
-rw-r--r--3rdparty/portaudio/test/pa_minlat.c205
-rw-r--r--3rdparty/portaudio/test/patest1.c190
-rw-r--r--3rdparty/portaudio/test/patest_buffer.c206
-rw-r--r--3rdparty/portaudio/test/patest_callbackstop.c288
-rw-r--r--3rdparty/portaudio/test/patest_clip.c190
-rw-r--r--3rdparty/portaudio/test/patest_converters.c398
-rw-r--r--3rdparty/portaudio/test/patest_dither.c190
-rw-r--r--3rdparty/portaudio/test/patest_dsound_find_best_latency_params.c514
-rw-r--r--3rdparty/portaudio/test/patest_dsound_low_level_latency_params.c186
-rw-r--r--3rdparty/portaudio/test/patest_dsound_surround.c204
-rw-r--r--3rdparty/portaudio/test/patest_hang.c164
-rw-r--r--3rdparty/portaudio/test/patest_in_overflow.c236
-rw-r--r--3rdparty/portaudio/test/patest_jack_wasapi.c343
-rw-r--r--3rdparty/portaudio/test/patest_latency.c193
-rw-r--r--3rdparty/portaudio/test/patest_leftright.c185
-rw-r--r--3rdparty/portaudio/test/patest_longsine.c151
-rw-r--r--3rdparty/portaudio/test/patest_many.c210
-rw-r--r--3rdparty/portaudio/test/patest_maxsines.c216
-rw-r--r--3rdparty/portaudio/test/patest_mono.c155
-rw-r--r--3rdparty/portaudio/test/patest_multi_sine.c205
-rw-r--r--3rdparty/portaudio/test/patest_out_underflow.c251
-rw-r--r--3rdparty/portaudio/test/patest_prime.c234
-rw-r--r--3rdparty/portaudio/test/patest_read_record.c243
-rw-r--r--3rdparty/portaudio/test/patest_ringmix.c86
-rw-r--r--3rdparty/portaudio/test/patest_sine8.c216
-rw-r--r--3rdparty/portaudio/test/patest_sine_channelmaps.c190
-rw-r--r--3rdparty/portaudio/test/patest_sine_formats.c203
-rw-r--r--3rdparty/portaudio/test/patest_sine_srate.c182
-rw-r--r--3rdparty/portaudio/test/patest_sine_time.c224
-rw-r--r--3rdparty/portaudio/test/patest_start_stop.c174
-rw-r--r--3rdparty/portaudio/test/patest_stop.c324
-rw-r--r--3rdparty/portaudio/test/patest_stop_playout.c478
-rw-r--r--3rdparty/portaudio/test/patest_suggested_vs_streaminfo_latency.c269
-rw-r--r--3rdparty/portaudio/test/patest_suggested_vs_streaminfo_latency.py150
-rw-r--r--3rdparty/portaudio/test/patest_sync.c271
-rw-r--r--3rdparty/portaudio/test/patest_timing.c173
-rw-r--r--3rdparty/portaudio/test/patest_toomanysines.c200
-rw-r--r--3rdparty/portaudio/test/patest_two_rates.c178
-rw-r--r--3rdparty/portaudio/test/patest_underflow.c162
-rw-r--r--3rdparty/portaudio/test/patest_unplug.c243
-rw-r--r--3rdparty/portaudio/test/patest_wasapi_ac3.c206
-rw-r--r--3rdparty/portaudio/test/patest_wasapi_eac3.c208
-rw-r--r--3rdparty/portaudio/test/patest_wire.c331
-rw-r--r--3rdparty/portaudio/test/patest_wmme_find_best_latency_params.c518
-rw-r--r--3rdparty/portaudio/test/patest_wmme_low_level_latency_params.c191
-rw-r--r--3rdparty/portaudio/test/patest_write_stop.c165
-rw-r--r--3rdparty/portaudio/test/patest_write_stop_hang_illegal.c168
-rw-r--r--3rdparty/portaudio/testcvs/changeme.txt21
-rw-r--r--3rdparty/portaudio/testcvs/file1.txt9
-rw-r--r--3rdparty/portaudio/testcvs/file2.txt9
-rwxr-xr-x3rdparty/portaudio/update_gitrevision.sh17
-rw-r--r--3rdparty/portaudio/vcpkg.json38
-rw-r--r--3rdparty/portmidi/.github/workflows/build.yml47
-rw-r--r--3rdparty/portmidi/.github/workflows/docs.yml28
-rw-r--r--3rdparty/portmidi/.gitignore62
-rw-r--r--3rdparty/portmidi/CHANGELOG.txt213
-rw-r--r--3rdparty/portmidi/CMakeLists.txt183
-rw-r--r--3rdparty/portmidi/Doxyfile2682
-rw-r--r--3rdparty/portmidi/README.md104
-rw-r--r--3rdparty/portmidi/README.txt88
-rw-r--r--3rdparty/portmidi/license.txt40
-rw-r--r--3rdparty/portmidi/packaging/PortMidiConfig.cmake.in10
-rw-r--r--3rdparty/portmidi/packaging/portmidi.pc.in11
-rw-r--r--3rdparty/portmidi/pm_common/CMakeLists.txt150
-rw-r--r--3rdparty/portmidi/pm_common/pminternal.h187
-rw-r--r--3rdparty/portmidi/pm_common/pmutil.c284
-rw-r--r--3rdparty/portmidi/pm_common/pmutil.h179
-rw-r--r--3rdparty/portmidi/pm_common/portmidi.c1401
-rw-r--r--3rdparty/portmidi/pm_common/portmidi.h960
-rw-r--r--3rdparty/portmidi/pm_haiku/pmhaiku.cpp514
-rw-r--r--3rdparty/portmidi/pm_java/CMakeLists.txt86
-rw-r--r--3rdparty/portmidi/pm_java/README.txt79
-rw-r--r--3rdparty/portmidi/pm_java/jportmidi/JPortMidi.java541
-rw-r--r--3rdparty/portmidi/pm_java/jportmidi/JPortMidiApi.java117
-rw-r--r--3rdparty/portmidi/pm_java/jportmidi/JPortMidiException.java12
-rw-r--r--3rdparty/portmidi/pm_java/make.bat47
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/PmDefaults.java15
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/PmDefaultsFrame.java428
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/README.txt20
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/manifest.txt1
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/pmdefaults8
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/pmdefaults-icon.bmpbin0 -> 17464 bytes-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/pmdefaults-icon.gifbin0 -> 6976 bytes-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/pmdefaults-icon.pngbin0 -> 6986 bytes-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/pmdefaults-icon.xcfbin0 -> 19957 bytes-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/pmdefaults-license.txt35
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/pmdefaults.bat1
-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/pmdefaults.icnsbin0 -> 36751 bytes-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/pmdefaults.icobin0 -> 99678 bytes-rw-r--r--3rdparty/portmidi/pm_java/pmdefaults/portmusic_logo.pngbin0 -> 753 bytes-rw-r--r--3rdparty/portmidi/pm_java/pmjni/jportmidi_JportMidiApi.h293
-rw-r--r--3rdparty/portmidi/pm_java/pmjni/pmjni.c354
-rw-r--r--3rdparty/portmidi/pm_java/pmjni/pmjni.rc63
-rw-r--r--3rdparty/portmidi/pm_linux/README_LINUX.txt99
-rw-r--r--3rdparty/portmidi/pm_linux/finddefault.c97
-rw-r--r--3rdparty/portmidi/pm_linux/finddefault.h5
-rw-r--r--3rdparty/portmidi/pm_linux/pmlinux.c81
-rw-r--r--3rdparty/portmidi/pm_linux/pmlinux.h5
-rw-r--r--3rdparty/portmidi/pm_linux/pmlinuxalsa.c835
-rw-r--r--3rdparty/portmidi/pm_linux/pmlinuxalsa.h6
-rw-r--r--3rdparty/portmidi/pm_linux/pmlinuxnull.c31
-rw-r--r--3rdparty/portmidi/pm_linux/pmlinuxnull.h6
-rw-r--r--3rdparty/portmidi/pm_mac/Makefile.osx131
-rw-r--r--3rdparty/portmidi/pm_mac/README_MAC.txt76
-rw-r--r--3rdparty/portmidi/pm_mac/finddefault.c57
-rw-r--r--3rdparty/portmidi/pm_mac/pmmac.c60
-rw-r--r--3rdparty/portmidi/pm_mac/pmmac.h4
-rw-r--r--3rdparty/portmidi/pm_mac/pmmacosxcm.c1308
-rw-r--r--3rdparty/portmidi/pm_mac/pmmacosxcm.h6
-rw-r--r--3rdparty/portmidi/pm_mac/readbinaryplist.c1128
-rw-r--r--3rdparty/portmidi/pm_mac/readbinaryplist.h88
-rw-r--r--3rdparty/portmidi/pm_test/CMakeLists.txt46
-rw-r--r--3rdparty/portmidi/pm_test/README.txt376
-rw-r--r--3rdparty/portmidi/pm_test/fast.c290
-rw-r--r--3rdparty/portmidi/pm_test/fastrcv.c255
-rw-r--r--3rdparty/portmidi/pm_test/latency.c287
-rw-r--r--3rdparty/portmidi/pm_test/midiclock.c282
-rw-r--r--3rdparty/portmidi/pm_test/midithread.c343
-rw-r--r--3rdparty/portmidi/pm_test/midithru.c455
-rw-r--r--3rdparty/portmidi/pm_test/mm.c569
-rw-r--r--3rdparty/portmidi/pm_test/multivirtual.c224
-rw-r--r--3rdparty/portmidi/pm_test/pmlist.c63
-rw-r--r--3rdparty/portmidi/pm_test/qtest.c174
-rw-r--r--3rdparty/portmidi/pm_test/recvvirtual.c125
-rw-r--r--3rdparty/portmidi/pm_test/sendvirtual.c148
-rw-r--r--3rdparty/portmidi/pm_test/sysex.c556
-rw-r--r--3rdparty/portmidi/pm_test/testio.c535
-rw-r--r--3rdparty/portmidi/pm_test/txdata.syx257
-rw-r--r--3rdparty/portmidi/pm_test/virttest.c339
-rw-r--r--3rdparty/portmidi/pm_win/README_WIN.txt174
-rw-r--r--3rdparty/portmidi/pm_win/debugging_dlls.txt145
-rw-r--r--3rdparty/portmidi/pm_win/pmwin.c142
-rw-r--r--3rdparty/portmidi/pm_win/pmwinmm.c1182
-rw-r--r--3rdparty/portmidi/pm_win/pmwinmm.h5
-rw-r--r--3rdparty/portmidi/pm_win/static.cmake24
-rw-r--r--3rdparty/portmidi/portmusic_logo.pngbin0 -> 753 bytes-rw-r--r--3rdparty/portmidi/porttime/porttime.c3
-rw-r--r--3rdparty/portmidi/porttime/porttime.h98
-rw-r--r--3rdparty/portmidi/porttime/pthaiku.cpp88
-rw-r--r--3rdparty/portmidi/porttime/ptlinux.c136
-rw-r--r--3rdparty/portmidi/porttime/ptmacosx_cf.c140
-rw-r--r--3rdparty/portmidi/porttime/ptmacosx_mach.c204
-rw-r--r--3rdparty/portmidi/porttime/ptwinmm.c70
-rw-r--r--3rdparty/pugixml/CMakeLists.txt112
-rw-r--r--3rdparty/pugixml/docs/images/dom_tree.pngbin0 -> 24570 bytes-rw-r--r--3rdparty/pugixml/docs/images/vs2005_link1.pngbin0 -> 25698 bytes-rw-r--r--3rdparty/pugixml/docs/images/vs2005_link2.pngbin0 -> 18063 bytes-rw-r--r--3rdparty/pugixml/docs/images/vs2005_pch1.pngbin0 -> 27693 bytes-rw-r--r--3rdparty/pugixml/docs/images/vs2005_pch2.pngbin0 -> 14895 bytes-rw-r--r--3rdparty/pugixml/docs/images/vs2005_pch3.pngbin0 -> 15931 bytes-rw-r--r--3rdparty/pugixml/docs/images/vs2005_pch4.pngbin0 -> 15117 bytes-rw-r--r--3rdparty/pugixml/docs/images/vs2010_link1.pngbin0 -> 19609 bytes-rw-r--r--3rdparty/pugixml/docs/images/vs2010_link2.pngbin0 -> 17206 bytes-rw-r--r--3rdparty/pugixml/docs/manual.html5869
-rw-r--r--3rdparty/pugixml/docs/quickstart.html1102
-rw-r--r--3rdparty/pugixml/docs/samples/character.xml8
-rw-r--r--3rdparty/pugixml/docs/samples/custom_memory_management.cpp27
-rw-r--r--3rdparty/pugixml/docs/samples/include.cpp64
-rw-r--r--3rdparty/pugixml/docs/samples/load_error_handling.cpp33
-rw-r--r--3rdparty/pugixml/docs/samples/load_file.cpp16
-rw-r--r--3rdparty/pugixml/docs/samples/load_memory.cpp66
-rw-r--r--3rdparty/pugixml/docs/samples/load_options.cpp30
-rw-r--r--3rdparty/pugixml/docs/samples/load_stream.cpp97
-rw-r--r--3rdparty/pugixml/docs/samples/modify_add.cpp29
-rw-r--r--3rdparty/pugixml/docs/samples/modify_base.cpp43
-rw-r--r--3rdparty/pugixml/docs/samples/modify_remove.cpp27
-rw-r--r--3rdparty/pugixml/docs/samples/save_custom_writer.cpp116
-rw-r--r--3rdparty/pugixml/docs/samples/save_declaration.cpp27
-rw-r--r--3rdparty/pugixml/docs/samples/save_file.cpp17
-rw-r--r--3rdparty/pugixml/docs/samples/save_options.cpp48
-rw-r--r--3rdparty/pugixml/docs/samples/save_stream.cpp18
-rw-r--r--3rdparty/pugixml/docs/samples/save_subtree.cpp26
-rw-r--r--3rdparty/pugixml/docs/samples/text.cpp35
-rw-r--r--3rdparty/pugixml/docs/samples/transitions.xml7
-rw-r--r--3rdparty/pugixml/docs/samples/traverse_base.cpp51
-rw-r--r--3rdparty/pugixml/docs/samples/traverse_iter.cpp27
-rw-r--r--3rdparty/pugixml/docs/samples/traverse_predicate.cpp48
-rw-r--r--3rdparty/pugixml/docs/samples/traverse_rangefor.cpp32
-rw-r--r--3rdparty/pugixml/docs/samples/traverse_walker.cpp35
-rw-r--r--3rdparty/pugixml/docs/samples/tree.xml12
-rw-r--r--3rdparty/pugixml/docs/samples/weekly-shift_jis.xml78
-rw-r--r--3rdparty/pugixml/docs/samples/weekly-utf-16.xmlbin0 -> 3186 bytes-rw-r--r--3rdparty/pugixml/docs/samples/weekly-utf-8.xml78
-rw-r--r--3rdparty/pugixml/docs/samples/xgconsole.xml12
-rw-r--r--3rdparty/pugixml/docs/samples/xpath_error.cpp43
-rw-r--r--3rdparty/pugixml/docs/samples/xpath_query.cpp36
-rw-r--r--3rdparty/pugixml/docs/samples/xpath_select.cpp28
-rw-r--r--3rdparty/pugixml/docs/samples/xpath_variables.cpp38
-rw-r--r--3rdparty/pugixml/readme.txt50
-rw-r--r--3rdparty/pugixml/scripts/cocoapods_push.sh4
-rw-r--r--3rdparty/pugixml/scripts/natvis/pugixml.natvis77
-rw-r--r--3rdparty/pugixml/scripts/natvis/pugixml_compact.natvis506
-rw-r--r--3rdparty/pugixml/scripts/nuget/build/native/pugixml-propertiesui.xml15
-rw-r--r--3rdparty/pugixml/scripts/nuget/build/native/pugixml.targets27
-rw-r--r--3rdparty/pugixml/scripts/nuget/pugixml.nuspec21
-rw-r--r--3rdparty/pugixml/scripts/nuget_build.ps165
-rw-r--r--3rdparty/pugixml/scripts/premake4.lua92
-rw-r--r--3rdparty/pugixml/scripts/pugixml.pc.in11
-rw-r--r--3rdparty/pugixml/scripts/pugixml.podspec14
-rw-r--r--3rdparty/pugixml/scripts/pugixml.xcodeproj/project.pbxproj212
-rw-r--r--3rdparty/pugixml/scripts/pugixml_airplay.mkf13
-rw-r--r--3rdparty/pugixml/scripts/pugixml_codeblocks.cbp44
-rw-r--r--3rdparty/pugixml/scripts/pugixml_codelite.project56
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2005.vcproj343
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2005_static.vcproj343
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2008.vcproj339
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2008_static.vcproj339
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2010.vcxproj191
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2010_static.vcxproj191
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2013.vcxproj199
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2013_static.vcxproj199
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2015.vcxproj172
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2015_static.vcxproj176
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2017.vcxproj172
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2017_static.vcxproj176
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2019.vcxproj172
-rw-r--r--3rdparty/pugixml/scripts/pugixml_vs2019_static.vcxproj176
-rw-r--r--3rdparty/pugixml/src/pugiconfig.hpp74
-rw-r--r--3rdparty/pugixml/src/pugixml.cpp12865
-rw-r--r--3rdparty/pugixml/src/pugixml.hpp1477
-rw-r--r--3rdparty/rapidjson/.gitattributes22
-rw-r--r--3rdparty/rapidjson/.gitignore29
-rw-r--r--3rdparty/rapidjson/.gitmodules3
-rw-r--r--3rdparty/rapidjson/.travis.yml166
-rw-r--r--3rdparty/rapidjson/CHANGELOG.md158
-rw-r--r--3rdparty/rapidjson/CMakeLists.txt251
-rw-r--r--3rdparty/rapidjson/CMakeModules/FindGTestSrc.cmake30
-rw-r--r--3rdparty/rapidjson/RapidJSON.pc.in7
-rw-r--r--3rdparty/rapidjson/RapidJSONConfig.cmake.in25
-rw-r--r--3rdparty/rapidjson/RapidJSONConfigVersion.cmake.in10
-rw-r--r--3rdparty/rapidjson/appveyor.yml102
-rw-r--r--3rdparty/rapidjson/contrib/natvis/LICENSE45
-rw-r--r--3rdparty/rapidjson/contrib/natvis/README.md7
-rw-r--r--3rdparty/rapidjson/contrib/natvis/rapidjson.natvis38
-rw-r--r--3rdparty/rapidjson/doc/CMakeLists.txt27
-rw-r--r--3rdparty/rapidjson/doc/Doxyfile.in2369
-rw-r--r--3rdparty/rapidjson/doc/Doxyfile.zh-cn.in2369
-rw-r--r--3rdparty/rapidjson/doc/diagram/architecture.dot50
-rw-r--r--3rdparty/rapidjson/doc/diagram/architecture.pngbin0 -> 16569 bytes-rw-r--r--3rdparty/rapidjson/doc/diagram/insituparsing.dot65
-rw-r--r--3rdparty/rapidjson/doc/diagram/insituparsing.pngbin0 -> 37281 bytes-rw-r--r--3rdparty/rapidjson/doc/diagram/iterative-parser-states-diagram.dot62
-rw-r--r--3rdparty/rapidjson/doc/diagram/iterative-parser-states-diagram.pngbin0 -> 92378 bytes-rw-r--r--3rdparty/rapidjson/doc/diagram/makefile8
-rw-r--r--3rdparty/rapidjson/doc/diagram/move1.dot47
-rw-r--r--3rdparty/rapidjson/doc/diagram/move1.pngbin0 -> 16081 bytes-rw-r--r--3rdparty/rapidjson/doc/diagram/move2.dot62
-rw-r--r--3rdparty/rapidjson/doc/diagram/move2.pngbin0 -> 41517 bytes-rw-r--r--3rdparty/rapidjson/doc/diagram/move3.dot60
-rw-r--r--3rdparty/rapidjson/doc/diagram/move3.pngbin0 -> 36371 bytes-rw-r--r--3rdparty/rapidjson/doc/diagram/normalparsing.dot56
-rw-r--r--3rdparty/rapidjson/doc/diagram/normalparsing.pngbin0 -> 32887 bytes-rw-r--r--3rdparty/rapidjson/doc/diagram/simpledom.dot54
-rw-r--r--3rdparty/rapidjson/doc/diagram/simpledom.pngbin0 -> 43670 bytes-rw-r--r--3rdparty/rapidjson/doc/diagram/tutorial.dot58
-rw-r--r--3rdparty/rapidjson/doc/diagram/tutorial.pngbin0 -> 44634 bytes-rw-r--r--3rdparty/rapidjson/doc/diagram/utilityclass.dot73
-rw-r--r--3rdparty/rapidjson/doc/diagram/utilityclass.pngbin0 -> 99993 bytes-rw-r--r--3rdparty/rapidjson/doc/dom.md281
-rw-r--r--3rdparty/rapidjson/doc/dom.zh-cn.md285
-rw-r--r--3rdparty/rapidjson/doc/encoding.md146
-rw-r--r--3rdparty/rapidjson/doc/encoding.zh-cn.md152
-rw-r--r--3rdparty/rapidjson/doc/faq.md289
-rw-r--r--3rdparty/rapidjson/doc/faq.zh-cn.md290
-rw-r--r--3rdparty/rapidjson/doc/features.md106
-rw-r--r--3rdparty/rapidjson/doc/features.zh-cn.md103
-rw-r--r--3rdparty/rapidjson/doc/internals.md368
-rw-r--r--3rdparty/rapidjson/doc/internals.zh-cn.md363
-rw-r--r--3rdparty/rapidjson/doc/logo/rapidjson.pngbin0 -> 5259 bytes-rw-r--r--3rdparty/rapidjson/doc/logo/rapidjson.svg119
-rw-r--r--3rdparty/rapidjson/doc/misc/DoxygenLayout.xml194
-rw-r--r--3rdparty/rapidjson/doc/misc/doxygenextra.css274
-rw-r--r--3rdparty/rapidjson/doc/misc/footer.html11
-rw-r--r--3rdparty/rapidjson/doc/misc/header.html24
-rw-r--r--3rdparty/rapidjson/doc/npm.md31
-rw-r--r--3rdparty/rapidjson/doc/performance.md26
-rw-r--r--3rdparty/rapidjson/doc/performance.zh-cn.md26
-rw-r--r--3rdparty/rapidjson/doc/pointer.md234
-rw-r--r--3rdparty/rapidjson/doc/pointer.zh-cn.md234
-rw-r--r--3rdparty/rapidjson/doc/sax.md509
-rw-r--r--3rdparty/rapidjson/doc/sax.zh-cn.md487
-rw-r--r--3rdparty/rapidjson/doc/schema.md513
-rw-r--r--3rdparty/rapidjson/doc/schema.zh-cn.md237
-rw-r--r--3rdparty/rapidjson/doc/stream.md429
-rw-r--r--3rdparty/rapidjson/doc/stream.zh-cn.md429
-rw-r--r--3rdparty/rapidjson/doc/tutorial.md536
-rw-r--r--3rdparty/rapidjson/doc/tutorial.zh-cn.md535
-rw-r--r--3rdparty/rapidjson/docker/debian/Dockerfile8
-rw-r--r--3rdparty/rapidjson/example/CMakeLists.txt46
-rw-r--r--3rdparty/rapidjson/example/archiver/archiver.cpp292
-rw-r--r--3rdparty/rapidjson/example/archiver/archiver.h145
-rw-r--r--3rdparty/rapidjson/example/archiver/archivertest.cpp287
-rw-r--r--3rdparty/rapidjson/example/capitalize/capitalize.cpp67
-rw-r--r--3rdparty/rapidjson/example/condense/condense.cpp32
-rw-r--r--3rdparty/rapidjson/example/filterkey/filterkey.cpp135
-rw-r--r--3rdparty/rapidjson/example/filterkeydom/filterkeydom.cpp170
-rw-r--r--3rdparty/rapidjson/example/jsonx/jsonx.cpp207
-rw-r--r--3rdparty/rapidjson/example/lookaheadparser/lookaheadparser.cpp350
-rw-r--r--3rdparty/rapidjson/example/messagereader/messagereader.cpp105
-rw-r--r--3rdparty/rapidjson/example/parsebyparts/parsebyparts.cpp176
-rw-r--r--3rdparty/rapidjson/example/pretty/pretty.cpp30
-rw-r--r--3rdparty/rapidjson/example/prettyauto/prettyauto.cpp56
-rw-r--r--3rdparty/rapidjson/example/schemavalidator/schemavalidator.cpp199
-rw-r--r--3rdparty/rapidjson/example/serialize/serialize.cpp173
-rw-r--r--3rdparty/rapidjson/example/simpledom/simpledom.cpp29
-rw-r--r--3rdparty/rapidjson/example/simplepullreader/simplepullreader.cpp53
-rw-r--r--3rdparty/rapidjson/example/simplereader/simplereader.cpp42
-rw-r--r--3rdparty/rapidjson/example/simplewriter/simplewriter.cpp36
-rw-r--r--3rdparty/rapidjson/example/sortkeys/sortkeys.cpp62
-rw-r--r--3rdparty/rapidjson/example/traverseaspointer.cpp39
-rw-r--r--3rdparty/rapidjson/example/tutorial/tutorial.cpp151
-rw-r--r--3rdparty/rapidjson/include/rapidjson/allocators.h693
-rw-r--r--3rdparty/rapidjson/include/rapidjson/cursorstreamwrapper.h78
-rw-r--r--3rdparty/rapidjson/include/rapidjson/document.h3043
-rw-r--r--3rdparty/rapidjson/include/rapidjson/encodedstream.h299
-rw-r--r--3rdparty/rapidjson/include/rapidjson/encodings.h716
-rw-r--r--3rdparty/rapidjson/include/rapidjson/error/en.h176
-rw-r--r--3rdparty/rapidjson/include/rapidjson/error/error.h285
-rw-r--r--3rdparty/rapidjson/include/rapidjson/filereadstream.h99
-rw-r--r--3rdparty/rapidjson/include/rapidjson/filewritestream.h104
-rw-r--r--3rdparty/rapidjson/include/rapidjson/fwd.h151
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/biginteger.h297
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/clzll.h71
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/diyfp.h261
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/dtoa.h249
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/ieee754.h78
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/itoa.h308
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/meta.h186
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/pow10.h55
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/regex.h739
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/stack.h232
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/strfunc.h83
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/strtod.h293
-rw-r--r--3rdparty/rapidjson/include/rapidjson/internal/swap.h46
-rw-r--r--3rdparty/rapidjson/include/rapidjson/istreamwrapper.h128
-rw-r--r--3rdparty/rapidjson/include/rapidjson/memorybuffer.h70
-rw-r--r--3rdparty/rapidjson/include/rapidjson/memorystream.h71
-rw-r--r--3rdparty/rapidjson/include/rapidjson/msinttypes/inttypes.h316
-rw-r--r--3rdparty/rapidjson/include/rapidjson/msinttypes/stdint.h300
-rw-r--r--3rdparty/rapidjson/include/rapidjson/ostreamwrapper.h81
-rw-r--r--3rdparty/rapidjson/include/rapidjson/pointer.h1470
-rw-r--r--3rdparty/rapidjson/include/rapidjson/prettywriter.h277
-rw-r--r--3rdparty/rapidjson/include/rapidjson/rapidjson.h741
-rw-r--r--3rdparty/rapidjson/include/rapidjson/reader.h2246
-rw-r--r--3rdparty/rapidjson/include/rapidjson/schema.h3262
-rw-r--r--3rdparty/rapidjson/include/rapidjson/stream.h223
-rw-r--r--3rdparty/rapidjson/include/rapidjson/stringbuffer.h121
-rw-r--r--3rdparty/rapidjson/include/rapidjson/uri.h481
-rw-r--r--3rdparty/rapidjson/include/rapidjson/writer.h710
-rw-r--r--3rdparty/rapidjson/include_dirs.js2
-rw-r--r--3rdparty/rapidjson/library.json15
-rw-r--r--3rdparty/rapidjson/license.txt57
-rw-r--r--3rdparty/rapidjson/package.json24
-rw-r--r--3rdparty/rapidjson/rapidjson.autopkg77
-rw-r--r--3rdparty/rapidjson/readme.md210
-rw-r--r--3rdparty/rapidjson/readme.zh-cn.md152
-rw-r--r--3rdparty/rapidjson/test/CMakeLists.txt20
-rw-r--r--3rdparty/rapidjson/test/perftest/CMakeLists.txt28
-rw-r--r--3rdparty/rapidjson/test/perftest/misctest.cpp974
-rw-r--r--3rdparty/rapidjson/test/perftest/perftest.cpp24
-rw-r--r--3rdparty/rapidjson/test/perftest/perftest.h186
-rw-r--r--3rdparty/rapidjson/test/perftest/platformtest.cpp166
-rw-r--r--3rdparty/rapidjson/test/perftest/rapidjsontest.cpp564
-rw-r--r--3rdparty/rapidjson/test/perftest/schematest.cpp223
-rw-r--r--3rdparty/rapidjson/test/unittest/CMakeLists.txt95
-rw-r--r--3rdparty/rapidjson/test/unittest/allocatorstest.cpp292
-rw-r--r--3rdparty/rapidjson/test/unittest/bigintegertest.cpp138
-rw-r--r--3rdparty/rapidjson/test/unittest/clzlltest.cpp34
-rw-r--r--3rdparty/rapidjson/test/unittest/cursorstreamwrappertest.cpp115
-rw-r--r--3rdparty/rapidjson/test/unittest/documenttest.cpp674
-rw-r--r--3rdparty/rapidjson/test/unittest/dtoatest.cpp99
-rw-r--r--3rdparty/rapidjson/test/unittest/encodedstreamtest.cpp313
-rw-r--r--3rdparty/rapidjson/test/unittest/encodingstest.cpp451
-rw-r--r--3rdparty/rapidjson/test/unittest/filestreamtest.cpp155
-rw-r--r--3rdparty/rapidjson/test/unittest/fwdtest.cpp230
-rw-r--r--3rdparty/rapidjson/test/unittest/istreamwrappertest.cpp181
-rw-r--r--3rdparty/rapidjson/test/unittest/itoatest.cpp160
-rw-r--r--3rdparty/rapidjson/test/unittest/jsoncheckertest.cpp143
-rw-r--r--3rdparty/rapidjson/test/unittest/namespacetest.cpp70
-rw-r--r--3rdparty/rapidjson/test/unittest/ostreamwrappertest.cpp92
-rw-r--r--3rdparty/rapidjson/test/unittest/platformtest.cpp40
-rw-r--r--3rdparty/rapidjson/test/unittest/pointertest.cpp1730
-rw-r--r--3rdparty/rapidjson/test/unittest/prettywritertest.cpp373
-rw-r--r--3rdparty/rapidjson/test/unittest/readertest.cpp2370
-rw-r--r--3rdparty/rapidjson/test/unittest/regextest.cpp639
-rw-r--r--3rdparty/rapidjson/test/unittest/schematest.cpp3575
-rw-r--r--3rdparty/rapidjson/test/unittest/simdtest.cpp219
-rw-r--r--3rdparty/rapidjson/test/unittest/strfunctest.cpp30
-rw-r--r--3rdparty/rapidjson/test/unittest/stringbuffertest.cpp192
-rw-r--r--3rdparty/rapidjson/test/unittest/strtodtest.cpp132
-rw-r--r--3rdparty/rapidjson/test/unittest/unittest.cpp51
-rw-r--r--3rdparty/rapidjson/test/unittest/unittest.h143
-rw-r--r--3rdparty/rapidjson/test/unittest/uritest.cpp725
-rw-r--r--3rdparty/rapidjson/test/unittest/valuetest.cpp1861
-rw-r--r--3rdparty/rapidjson/test/unittest/writertest.cpp598
-rw-r--r--3rdparty/rapidjson/test/valgrind.supp26
-rwxr-xr-x3rdparty/rapidjson/travis-doxygen.sh128
-rw-r--r--3rdparty/softfloat3/COPYING.txt37
-rw-r--r--3rdparty/softfloat3/README.html49
-rw-r--r--3rdparty/softfloat3/README.txt21
-rw-r--r--3rdparty/softfloat3/bochs_ext/extF80_scale.c156
-rw-r--r--3rdparty/softfloat3/bochs_ext/f2xm1.c491
-rw-r--r--3rdparty/softfloat3/bochs_ext/fpatan.c331
-rw-r--r--3rdparty/softfloat3/bochs_ext/fprem.c255
-rw-r--r--3rdparty/softfloat3/bochs_ext/fpu_constant.h80
-rw-r--r--3rdparty/softfloat3/bochs_ext/fsincos.c457
-rw-r--r--3rdparty/softfloat3/bochs_ext/fyl2x.c409
-rw-r--r--3rdparty/softfloat3/bochs_ext/isNaN.c69
-rw-r--r--3rdparty/softfloat3/bochs_ext/poly.c91
-rw-r--r--3rdparty/softfloat3/bochs_ext/softfloat-extra.h68
-rw-r--r--3rdparty/softfloat3/bochs_ext/softfloat-helpers.h159
-rw-r--r--3rdparty/softfloat3/bochs_ext/softfloat-specialize.h223
-rw-r--r--3rdparty/softfloat3/bochs_ext/softfloat3_ext.h26
-rw-r--r--3rdparty/softfloat3/build/Linux-386-GCC/Makefile325
-rw-r--r--3rdparty/softfloat3/build/Linux-386-GCC/platform.h53
-rw-r--r--3rdparty/softfloat3/build/Linux-386-SSE2-GCC/Makefile325
-rw-r--r--3rdparty/softfloat3/build/Linux-386-SSE2-GCC/platform.h53
-rw-r--r--3rdparty/softfloat3/build/Linux-ARM-VFPv2-GCC/Makefile323
-rw-r--r--3rdparty/softfloat3/build/Linux-ARM-VFPv2-GCC/platform.h53
-rw-r--r--3rdparty/softfloat3/build/Linux-x86_64-GCC/Makefile390
-rw-r--r--3rdparty/softfloat3/build/Linux-x86_64-GCC/platform.h54
-rw-r--r--3rdparty/softfloat3/build/MAME/platform.h78
-rw-r--r--3rdparty/softfloat3/build/Win32-MinGW/Makefile325
-rw-r--r--3rdparty/softfloat3/build/Win32-MinGW/platform.h53
-rw-r--r--3rdparty/softfloat3/build/Win32-SSE2-MinGW/Makefile325
-rw-r--r--3rdparty/softfloat3/build/Win32-SSE2-MinGW/platform.h53
-rw-r--r--3rdparty/softfloat3/build/Win64-MinGW-w64/Makefile390
-rw-r--r--3rdparty/softfloat3/build/Win64-MinGW-w64/platform.h54
-rw-r--r--3rdparty/softfloat3/build/template-FAST_INT64/Makefile391
-rw-r--r--3rdparty/softfloat3/build/template-FAST_INT64/platform.h50
-rw-r--r--3rdparty/softfloat3/build/template-not-FAST_INT64/Makefile325
-rw-r--r--3rdparty/softfloat3/build/template-not-FAST_INT64/platform.h50
-rw-r--r--3rdparty/softfloat3/doc/SoftFloat-history.html258
-rw-r--r--3rdparty/softfloat3/doc/SoftFloat-source.html686
-rw-r--r--3rdparty/softfloat3/doc/SoftFloat.html1527
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/extF80M_isSignalingNaN.c57
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/f128M_isSignalingNaN.c60
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_commonNaNToExtF80M.c56
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_commonNaNToExtF80UI.c56
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_commonNaNToF128M.c56
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_commonNaNToF128UI.c55
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_commonNaNToF16UI.c51
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_commonNaNToF32UI.c51
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_commonNaNToF64UI.c53
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_extF80MToCommonNaN.c62
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_extF80UIToCommonNaN.c62
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_f128MToCommonNaN.c62
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_f128UIToCommonNaN.c65
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_f16UIToCommonNaN.c59
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_f32UIToCommonNaN.c59
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_f64UIToCommonNaN.c59
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_propagateNaNExtF80M.c107
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_propagateNaNExtF80UI.c106
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_propagateNaNF128M.c76
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_propagateNaNF128UI.c81
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_propagateNaNF16UI.c63
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_propagateNaNF32UI.c63
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/s_propagateNaNF64UI.c63
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/softfloat_raiseFlags.c52
-rw-r--r--3rdparty/softfloat3/source/8086-SSE/specialize.h376
-rw-r--r--3rdparty/softfloat3/source/8086/extF80M_isSignalingNaN.c57
-rw-r--r--3rdparty/softfloat3/source/8086/f128M_isSignalingNaN.c60
-rw-r--r--3rdparty/softfloat3/source/8086/s_commonNaNToExtF80M.c56
-rw-r--r--3rdparty/softfloat3/source/8086/s_commonNaNToExtF80UI.c56
-rw-r--r--3rdparty/softfloat3/source/8086/s_commonNaNToF128M.c56
-rw-r--r--3rdparty/softfloat3/source/8086/s_commonNaNToF128UI.c55
-rw-r--r--3rdparty/softfloat3/source/8086/s_commonNaNToF16UI.c51
-rw-r--r--3rdparty/softfloat3/source/8086/s_commonNaNToF32UI.c51
-rw-r--r--3rdparty/softfloat3/source/8086/s_commonNaNToF64UI.c53
-rw-r--r--3rdparty/softfloat3/source/8086/s_extF80MToCommonNaN.c62
-rw-r--r--3rdparty/softfloat3/source/8086/s_extF80UIToCommonNaN.c62
-rw-r--r--3rdparty/softfloat3/source/8086/s_f128MToCommonNaN.c62
-rw-r--r--3rdparty/softfloat3/source/8086/s_f128UIToCommonNaN.c65
-rw-r--r--3rdparty/softfloat3/source/8086/s_f16UIToCommonNaN.c59
-rw-r--r--3rdparty/softfloat3/source/8086/s_f32UIToCommonNaN.c59
-rw-r--r--3rdparty/softfloat3/source/8086/s_f64UIToCommonNaN.c59
-rw-r--r--3rdparty/softfloat3/source/8086/s_propagateNaNExtF80M.c107
-rw-r--r--3rdparty/softfloat3/source/8086/s_propagateNaNExtF80UI.c106
-rw-r--r--3rdparty/softfloat3/source/8086/s_propagateNaNF128M.c108
-rw-r--r--3rdparty/softfloat3/source/8086/s_propagateNaNF128UI.c105
-rw-r--r--3rdparty/softfloat3/source/8086/s_propagateNaNF16UI.c84
-rw-r--r--3rdparty/softfloat3/source/8086/s_propagateNaNF32UI.c84
-rw-r--r--3rdparty/softfloat3/source/8086/s_propagateNaNF64UI.c84
-rw-r--r--3rdparty/softfloat3/source/8086/softfloat_raiseFlags.c52
-rw-r--r--3rdparty/softfloat3/source/8086/specialize.h376
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/extF80M_isSignalingNaN.c57
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/f128M_isSignalingNaN.c60
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_commonNaNToExtF80M.c57
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_commonNaNToExtF80UI.c57
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_commonNaNToF128M.c60
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_commonNaNToF128UI.c56
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_commonNaNToF16UI.c5
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_commonNaNToF32UI.c5
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_commonNaNToF64UI.c5
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_extF80MToCommonNaN.c5
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_extF80UIToCommonNaN.c5
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_f128MToCommonNaN.c5
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_f128UIToCommonNaN.c5
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_f16UIToCommonNaN.c5
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_f32UIToCommonNaN.c5
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_f64UIToCommonNaN.c5
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_propagateNaNExtF80M.c74
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_propagateNaNExtF80UI.c73
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_propagateNaNF128M.c68
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_propagateNaNF128UI.c73
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_propagateNaNF16UI.c58
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_propagateNaNF32UI.c58
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/s_propagateNaNF64UI.c58
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/softfloat_raiseFlags.c52
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2-defaultNaN/specialize.h407
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/extF80M_isSignalingNaN.c57
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/f128M_isSignalingNaN.c60
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_commonNaNToExtF80M.c56
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_commonNaNToExtF80UI.c56
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_commonNaNToF128M.c56
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_commonNaNToF128UI.c55
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_commonNaNToF16UI.c51
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_commonNaNToF32UI.c51
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_commonNaNToF64UI.c53
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_extF80MToCommonNaN.c62
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_extF80UIToCommonNaN.c62
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_f128MToCommonNaN.c62
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_f128UIToCommonNaN.c65
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_f16UIToCommonNaN.c59
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_f32UIToCommonNaN.c59
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_f64UIToCommonNaN.c59
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_propagateNaNExtF80M.c86
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_propagateNaNExtF80UI.c83
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_propagateNaNF128M.c77
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_propagateNaNF128UI.c83
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_propagateNaNF16UI.c63
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_propagateNaNF32UI.c63
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/s_propagateNaNF64UI.c63
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/softfloat_raiseFlags.c52
-rw-r--r--3rdparty/softfloat3/source/ARM-VFPv2/specialize.h376
-rw-r--r--3rdparty/softfloat3/source/extF80M_add.c100
-rw-r--r--3rdparty/softfloat3/source/extF80M_div.c194
-rw-r--r--3rdparty/softfloat3/source/extF80M_eq.c98
-rw-r--r--3rdparty/softfloat3/source/extF80M_eq_signaling.c92
-rw-r--r--3rdparty/softfloat3/source/extF80M_le.c106
-rw-r--r--3rdparty/softfloat3/source/extF80M_le_quiet.c112
-rw-r--r--3rdparty/softfloat3/source/extF80M_lt.c106
-rw-r--r--3rdparty/softfloat3/source/extF80M_lt_quiet.c112
-rw-r--r--3rdparty/softfloat3/source/extF80M_mul.c139
-rw-r--r--3rdparty/softfloat3/source/extF80M_rem.c204
-rw-r--r--3rdparty/softfloat3/source/extF80M_roundToInt.c176
-rw-r--r--3rdparty/softfloat3/source/extF80M_sqrt.c180
-rw-r--r--3rdparty/softfloat3/source/extF80M_sub.c100
-rw-r--r--3rdparty/softfloat3/source/extF80M_to_f128M.c125
-rw-r--r--3rdparty/softfloat3/source/extF80M_to_f16.c112
-rw-r--r--3rdparty/softfloat3/source/extF80M_to_f32.c112
-rw-r--r--3rdparty/softfloat3/source/extF80M_to_f64.c112
-rw-r--r--3rdparty/softfloat3/source/extF80M_to_i32.c100
-rw-r--r--3rdparty/softfloat3/source/extF80M_to_i32_r_minMag.c120
-rw-r--r--3rdparty/softfloat3/source/extF80M_to_i64.c97
-rw-r--r--3rdparty/softfloat3/source/extF80M_to_i64_r_minMag.c115
-rw-r--r--3rdparty/softfloat3/source/extF80M_to_ui32.c101
-rw-r--r--3rdparty/softfloat3/source/extF80M_to_ui32_r_minMag.c111
-rw-r--r--3rdparty/softfloat3/source/extF80M_to_ui64.c97
-rw-r--r--3rdparty/softfloat3/source/extF80M_to_ui64_r_minMag.c108
-rw-r--r--3rdparty/softfloat3/source/extF80_add.c80
-rw-r--r--3rdparty/softfloat3/source/extF80_div.c203
-rw-r--r--3rdparty/softfloat3/source/extF80_eq.c73
-rw-r--r--3rdparty/softfloat3/source/extF80_eq_signaling.c67
-rw-r--r--3rdparty/softfloat3/source/extF80_isSignalingNaN.c51
-rw-r--r--3rdparty/softfloat3/source/extF80_le.c73
-rw-r--r--3rdparty/softfloat3/source/extF80_le_quiet.c78
-rw-r--r--3rdparty/softfloat3/source/extF80_lt.c73
-rw-r--r--3rdparty/softfloat3/source/extF80_lt_quiet.c78
-rw-r--r--3rdparty/softfloat3/source/extF80_mul.c158
-rw-r--r--3rdparty/softfloat3/source/extF80_rem.c225
-rw-r--r--3rdparty/softfloat3/source/extF80_roundToInt.c154
-rw-r--r--3rdparty/softfloat3/source/extF80_sqrt.c176
-rw-r--r--3rdparty/softfloat3/source/extF80_sub.c80
-rw-r--r--3rdparty/softfloat3/source/extF80_to_f128.c75
-rw-r--r--3rdparty/softfloat3/source/extF80_to_f16.c96
-rw-r--r--3rdparty/softfloat3/source/extF80_to_f32.c96
-rw-r--r--3rdparty/softfloat3/source/extF80_to_f64.c96
-rw-r--r--3rdparty/softfloat3/source/extF80_to_i32.c83
-rw-r--r--3rdparty/softfloat3/source/extF80_to_i32_r_minMag.c97
-rw-r--r--3rdparty/softfloat3/source/extF80_to_i64.c89
-rw-r--r--3rdparty/softfloat3/source/extF80_to_i64_r_minMag.c94
-rw-r--r--3rdparty/softfloat3/source/extF80_to_ui32.c83
-rw-r--r--3rdparty/softfloat3/source/extF80_to_ui32_r_minMag.c88
-rw-r--r--3rdparty/softfloat3/source/extF80_to_ui64.c84
-rw-r--r--3rdparty/softfloat3/source/extF80_to_ui64_r_minMag.c88
-rw-r--r--3rdparty/softfloat3/source/f128M_add.c97
-rw-r--r--3rdparty/softfloat3/source/f128M_div.c187
-rw-r--r--3rdparty/softfloat3/source/f128M_eq.c100
-rw-r--r--3rdparty/softfloat3/source/f128M_eq_signaling.c92
-rw-r--r--3rdparty/softfloat3/source/f128M_le.c93
-rw-r--r--3rdparty/softfloat3/source/f128M_le_quiet.c96
-rw-r--r--3rdparty/softfloat3/source/f128M_lt.c93
-rw-r--r--3rdparty/softfloat3/source/f128M_lt_quiet.c96
-rw-r--r--3rdparty/softfloat3/source/f128M_mul.c158
-rw-r--r--3rdparty/softfloat3/source/f128M_mulAdd.c92
-rw-r--r--3rdparty/softfloat3/source/f128M_rem.c182
-rw-r--r--3rdparty/softfloat3/source/f128M_roundToInt.c223
-rw-r--r--3rdparty/softfloat3/source/f128M_sqrt.c228
-rw-r--r--3rdparty/softfloat3/source/f128M_sub.c97
-rw-r--r--3rdparty/softfloat3/source/f128M_to_extF80M.c101
-rw-r--r--3rdparty/softfloat3/source/f128M_to_f16.c113
-rw-r--r--3rdparty/softfloat3/source/f128M_to_f32.c109
-rw-r--r--3rdparty/softfloat3/source/f128M_to_f64.c112
-rw-r--r--3rdparty/softfloat3/source/f128M_to_i32.c98
-rw-r--r--3rdparty/softfloat3/source/f128M_to_i32_r_minMag.c106
-rw-r--r--3rdparty/softfloat3/source/f128M_to_i64.c102
-rw-r--r--3rdparty/softfloat3/source/f128M_to_i64_r_minMag.c124
-rw-r--r--3rdparty/softfloat3/source/f128M_to_ui32.c98
-rw-r--r--3rdparty/softfloat3/source/f128M_to_ui32_r_minMag.c102
-rw-r--r--3rdparty/softfloat3/source/f128M_to_ui64.c102
-rw-r--r--3rdparty/softfloat3/source/f128M_to_ui64_r_minMag.c114
-rw-r--r--3rdparty/softfloat3/source/f128_add.c78
-rw-r--r--3rdparty/softfloat3/source/f128_div.c199
-rw-r--r--3rdparty/softfloat3/source/f128_eq.c73
-rw-r--r--3rdparty/softfloat3/source/f128_eq_signaling.c67
-rw-r--r--3rdparty/softfloat3/source/f128_isSignalingNaN.c51
-rw-r--r--3rdparty/softfloat3/source/f128_le.c72
-rw-r--r--3rdparty/softfloat3/source/f128_le_quiet.c78
-rw-r--r--3rdparty/softfloat3/source/f128_lt.c72
-rw-r--r--3rdparty/softfloat3/source/f128_lt_quiet.c78
-rw-r--r--3rdparty/softfloat3/source/f128_mul.c163
-rw-r--r--3rdparty/softfloat3/source/f128_mulAdd.c63
-rw-r--r--3rdparty/softfloat3/source/f128_rem.c190
-rw-r--r--3rdparty/softfloat3/source/f128_roundToInt.c172
-rw-r--r--3rdparty/softfloat3/source/f128_sqrt.c201
-rw-r--r--3rdparty/softfloat3/source/f128_sub.c78
-rw-r--r--3rdparty/softfloat3/source/f128_to_extF80.c109
-rw-r--r--3rdparty/softfloat3/source/f128_to_f16.c95
-rw-r--r--3rdparty/softfloat3/source/f128_to_f32.c95
-rw-r--r--3rdparty/softfloat3/source/f128_to_f64.c100
-rw-r--r--3rdparty/softfloat3/source/f128_to_i32.c85
-rw-r--r--3rdparty/softfloat3/source/f128_to_i32_r_minMag.c100
-rw-r--r--3rdparty/softfloat3/source/f128_to_i64.c95
-rw-r--r--3rdparty/softfloat3/source/f128_to_i64_r_minMag.c113
-rw-r--r--3rdparty/softfloat3/source/f128_to_ui32.c86
-rw-r--r--3rdparty/softfloat3/source/f128_to_ui32_r_minMag.c89
-rw-r--r--3rdparty/softfloat3/source/f128_to_ui64.c96
-rw-r--r--3rdparty/softfloat3/source/f128_to_ui64_r_minMag.c105
-rw-r--r--3rdparty/softfloat3/source/f16_add.c70
-rw-r--r--3rdparty/softfloat3/source/f16_div.c186
-rw-r--r--3rdparty/softfloat3/source/f16_eq.c66
-rw-r--r--3rdparty/softfloat3/source/f16_eq_signaling.c61
-rw-r--r--3rdparty/softfloat3/source/f16_isSignalingNaN.c51
-rw-r--r--3rdparty/softfloat3/source/f16_le.c66
-rw-r--r--3rdparty/softfloat3/source/f16_le_quiet.c71
-rw-r--r--3rdparty/softfloat3/source/f16_lt.c66
-rw-r--r--3rdparty/softfloat3/source/f16_lt_quiet.c71
-rw-r--r--3rdparty/softfloat3/source/f16_mul.c140
-rw-r--r--3rdparty/softfloat3/source/f16_mulAdd.c60
-rw-r--r--3rdparty/softfloat3/source/f16_rem.c171
-rw-r--r--3rdparty/softfloat3/source/f16_roundToInt.c120
-rw-r--r--3rdparty/softfloat3/source/f16_sqrt.c136
-rw-r--r--3rdparty/softfloat3/source/f16_sub.c70
-rw-r--r--3rdparty/softfloat3/source/f16_to_extF80.c101
-rw-r--r--3rdparty/softfloat3/source/f16_to_extF80M.c111
-rw-r--r--3rdparty/softfloat3/source/f16_to_f128.c96
-rw-r--r--3rdparty/softfloat3/source/f16_to_f128M.c111
-rw-r--r--3rdparty/softfloat3/source/f16_to_f32.c93
-rw-r--r--3rdparty/softfloat3/source/f16_to_f64.c93
-rw-r--r--3rdparty/softfloat3/source/f16_to_i32.c87
-rw-r--r--3rdparty/softfloat3/source/f16_to_i32_r_minMag.c88
-rw-r--r--3rdparty/softfloat3/source/f16_to_i64.c87
-rw-r--r--3rdparty/softfloat3/source/f16_to_i64_r_minMag.c88
-rw-r--r--3rdparty/softfloat3/source/f16_to_ui32.c84
-rw-r--r--3rdparty/softfloat3/source/f16_to_ui32_r_minMag.c87
-rw-r--r--3rdparty/softfloat3/source/f16_to_ui64.c96
-rw-r--r--3rdparty/softfloat3/source/f16_to_ui64_r_minMag.c87
-rw-r--r--3rdparty/softfloat3/source/f32_add.c70
-rw-r--r--3rdparty/softfloat3/source/f32_div.c180
-rw-r--r--3rdparty/softfloat3/source/f32_eq.c66
-rw-r--r--3rdparty/softfloat3/source/f32_eq_signaling.c61
-rw-r--r--3rdparty/softfloat3/source/f32_isSignalingNaN.c51
-rw-r--r--3rdparty/softfloat3/source/f32_le.c66
-rw-r--r--3rdparty/softfloat3/source/f32_le_quiet.c71
-rw-r--r--3rdparty/softfloat3/source/f32_lt.c66
-rw-r--r--3rdparty/softfloat3/source/f32_lt_quiet.c71
-rw-r--r--3rdparty/softfloat3/source/f32_mul.c137
-rw-r--r--3rdparty/softfloat3/source/f32_mulAdd.c60
-rw-r--r--3rdparty/softfloat3/source/f32_rem.c168
-rw-r--r--3rdparty/softfloat3/source/f32_roundToInt.c120
-rw-r--r--3rdparty/softfloat3/source/f32_sqrt.c121
-rw-r--r--3rdparty/softfloat3/source/f32_sub.c70
-rw-r--r--3rdparty/softfloat3/source/f32_to_extF80.c101
-rw-r--r--3rdparty/softfloat3/source/f32_to_extF80M.c111
-rw-r--r--3rdparty/softfloat3/source/f32_to_f128.c96
-rw-r--r--3rdparty/softfloat3/source/f32_to_f128M.c115
-rw-r--r--3rdparty/softfloat3/source/f32_to_f16.c88
-rw-r--r--3rdparty/softfloat3/source/f32_to_f64.c93
-rw-r--r--3rdparty/softfloat3/source/f32_to_i32.c84
-rw-r--r--3rdparty/softfloat3/source/f32_to_i32_r_minMag.c89
-rw-r--r--3rdparty/softfloat3/source/f32_to_i64.c96
-rw-r--r--3rdparty/softfloat3/source/f32_to_i64_r_minMag.c94
-rw-r--r--3rdparty/softfloat3/source/f32_to_ui32.c84
-rw-r--r--3rdparty/softfloat3/source/f32_to_ui32_r_minMag.c88
-rw-r--r--3rdparty/softfloat3/source/f32_to_ui64.c96
-rw-r--r--3rdparty/softfloat3/source/f32_to_ui64_r_minMag.c90
-rw-r--r--3rdparty/softfloat3/source/f64_add.c74
-rw-r--r--3rdparty/softfloat3/source/f64_div.c172
-rw-r--r--3rdparty/softfloat3/source/f64_eq.c66
-rw-r--r--3rdparty/softfloat3/source/f64_eq_signaling.c61
-rw-r--r--3rdparty/softfloat3/source/f64_isSignalingNaN.c51
-rw-r--r--3rdparty/softfloat3/source/f64_le.c67
-rw-r--r--3rdparty/softfloat3/source/f64_le_quiet.c72
-rw-r--r--3rdparty/softfloat3/source/f64_lt.c67
-rw-r--r--3rdparty/softfloat3/source/f64_lt_quiet.c72
-rw-r--r--3rdparty/softfloat3/source/f64_mul.c150
-rw-r--r--3rdparty/softfloat3/source/f64_mulAdd.c60
-rw-r--r--3rdparty/softfloat3/source/f64_rem.c189
-rw-r--r--3rdparty/softfloat3/source/f64_roundToInt.c120
-rw-r--r--3rdparty/softfloat3/source/f64_sqrt.c133
-rw-r--r--3rdparty/softfloat3/source/f64_sub.c74
-rw-r--r--3rdparty/softfloat3/source/f64_to_extF80.c101
-rw-r--r--3rdparty/softfloat3/source/f64_to_extF80M.c111
-rw-r--r--3rdparty/softfloat3/source/f64_to_f128.c98
-rw-r--r--3rdparty/softfloat3/source/f64_to_f128M.c117
-rw-r--r--3rdparty/softfloat3/source/f64_to_f16.c88
-rw-r--r--3rdparty/softfloat3/source/f64_to_f32.c88
-rw-r--r--3rdparty/softfloat3/source/f64_to_i32.c82
-rw-r--r--3rdparty/softfloat3/source/f64_to_i32_r_minMag.c96
-rw-r--r--3rdparty/softfloat3/source/f64_to_i64.c103
-rw-r--r--3rdparty/softfloat3/source/f64_to_i64_r_minMag.c100
-rw-r--r--3rdparty/softfloat3/source/f64_to_ui32.c82
-rw-r--r--3rdparty/softfloat3/source/f64_to_ui32_r_minMag.c88
-rw-r--r--3rdparty/softfloat3/source/f64_to_ui64.c103
-rw-r--r--3rdparty/softfloat3/source/f64_to_ui64_r_minMag.c93
-rw-r--r--3rdparty/softfloat3/source/i32_to_extF80.c65
-rw-r--r--3rdparty/softfloat3/source/i32_to_extF80M.c78
-rw-r--r--3rdparty/softfloat3/source/i32_to_f128.c64
-rw-r--r--3rdparty/softfloat3/source/i32_to_f128M.c81
-rw-r--r--3rdparty/softfloat3/source/i32_to_f16.c71
-rw-r--r--3rdparty/softfloat3/source/i32_to_f32.c58
-rw-r--r--3rdparty/softfloat3/source/i32_to_f64.c65
-rw-r--r--3rdparty/softfloat3/source/i64_to_extF80.c65
-rw-r--r--3rdparty/softfloat3/source/i64_to_extF80M.c78
-rw-r--r--3rdparty/softfloat3/source/i64_to_f128.c72
-rw-r--r--3rdparty/softfloat3/source/i64_to_f128M.c92
-rw-r--r--3rdparty/softfloat3/source/i64_to_f16.c70
-rw-r--r--3rdparty/softfloat3/source/i64_to_f32.c70
-rw-r--r--3rdparty/softfloat3/source/i64_to_f64.c58
-rw-r--r--3rdparty/softfloat3/source/include/internals.h278
-rw-r--r--3rdparty/softfloat3/source/include/opts-GCC.h114
-rw-r--r--3rdparty/softfloat3/source/include/primitiveTypes.h85
-rw-r--r--3rdparty/softfloat3/source/include/primitives.h1160
-rw-r--r--3rdparty/softfloat3/source/include/softfloat.h388
-rw-r--r--3rdparty/softfloat3/source/include/softfloat_types.h88
-rw-r--r--3rdparty/softfloat3/source/s_add128.c55
-rw-r--r--3rdparty/softfloat3/source/s_add256M.c65
-rw-r--r--3rdparty/softfloat3/source/s_addCarryM.c70
-rw-r--r--3rdparty/softfloat3/source/s_addComplCarryM.c70
-rw-r--r--3rdparty/softfloat3/source/s_addExtF80M.c186
-rw-r--r--3rdparty/softfloat3/source/s_addF128M.c211
-rw-r--r--3rdparty/softfloat3/source/s_addM.c70
-rw-r--r--3rdparty/softfloat3/source/s_addMagsExtF80.c156
-rw-r--r--3rdparty/softfloat3/source/s_addMagsF128.c154
-rw-r--r--3rdparty/softfloat3/source/s_addMagsF16.c183
-rw-r--r--3rdparty/softfloat3/source/s_addMagsF32.c126
-rw-r--r--3rdparty/softfloat3/source/s_addMagsF64.c128
-rw-r--r--3rdparty/softfloat3/source/s_approxRecip32_1.c66
-rw-r--r--3rdparty/softfloat3/source/s_approxRecipSqrt32_1.c73
-rw-r--r--3rdparty/softfloat3/source/s_approxRecipSqrt_1Ks.c49
-rw-r--r--3rdparty/softfloat3/source/s_approxRecip_1Ks.c49
-rw-r--r--3rdparty/softfloat3/source/s_compare128M.c62
-rw-r--r--3rdparty/softfloat3/source/s_compare96M.c62
-rw-r--r--3rdparty/softfloat3/source/s_compareNonnormExtF80M.c111
-rw-r--r--3rdparty/softfloat3/source/s_countLeadingZeros16.c60
-rw-r--r--3rdparty/softfloat3/source/s_countLeadingZeros32.c64
-rw-r--r--3rdparty/softfloat3/source/s_countLeadingZeros64.c73
-rw-r--r--3rdparty/softfloat3/source/s_countLeadingZeros8.c59
-rw-r--r--3rdparty/softfloat3/source/s_eq128.c51
-rw-r--r--3rdparty/softfloat3/source/s_invalidExtF80M.c49
-rw-r--r--3rdparty/softfloat3/source/s_invalidF128M.c53
-rw-r--r--3rdparty/softfloat3/source/s_isNaNF128M.c57
-rw-r--r--3rdparty/softfloat3/source/s_le128.c51
-rw-r--r--3rdparty/softfloat3/source/s_lt128.c51
-rw-r--r--3rdparty/softfloat3/source/s_mul128By32.c58
-rw-r--r--3rdparty/softfloat3/source/s_mul128MTo256M.c100
-rw-r--r--3rdparty/softfloat3/source/s_mul128To256M.c71
-rw-r--r--3rdparty/softfloat3/source/s_mul64ByShifted32To128.c56
-rw-r--r--3rdparty/softfloat3/source/s_mul64To128.c66
-rw-r--r--3rdparty/softfloat3/source/s_mul64To128M.c68
-rw-r--r--3rdparty/softfloat3/source/s_mulAddF128.c350
-rw-r--r--3rdparty/softfloat3/source/s_mulAddF128M.c382
-rw-r--r--3rdparty/softfloat3/source/s_mulAddF16.c226
-rw-r--r--3rdparty/softfloat3/source/s_mulAddF32.c224
-rw-r--r--3rdparty/softfloat3/source/s_mulAddF64.c496
-rw-r--r--3rdparty/softfloat3/source/s_negXM.c63
-rw-r--r--3rdparty/softfloat3/source/s_normExtF80SigM.c52
-rw-r--r--3rdparty/softfloat3/source/s_normRoundPackMToExtF80M.c78
-rw-r--r--3rdparty/softfloat3/source/s_normRoundPackMToF128M.c73
-rw-r--r--3rdparty/softfloat3/source/s_normRoundPackToExtF80.c71
-rw-r--r--3rdparty/softfloat3/source/s_normRoundPackToF128.c81
-rw-r--r--3rdparty/softfloat3/source/s_normRoundPackToF16.c58
-rw-r--r--3rdparty/softfloat3/source/s_normRoundPackToF32.c58
-rw-r--r--3rdparty/softfloat3/source/s_normRoundPackToF64.c58
-rw-r--r--3rdparty/softfloat3/source/s_normSubnormalExtF80Sig.c52
-rw-r--r--3rdparty/softfloat3/source/s_normSubnormalF128Sig.c65
-rw-r--r--3rdparty/softfloat3/source/s_normSubnormalF128SigM.c61
-rw-r--r--3rdparty/softfloat3/source/s_normSubnormalF16Sig.c52
-rw-r--r--3rdparty/softfloat3/source/s_normSubnormalF32Sig.c52
-rw-r--r--3rdparty/softfloat3/source/s_normSubnormalF64Sig.c52
-rw-r--r--3rdparty/softfloat3/source/s_remStepMBy32.c86
-rw-r--r--3rdparty/softfloat3/source/s_roundMToI64.c102
-rw-r--r--3rdparty/softfloat3/source/s_roundMToUI64.c98
-rw-r--r--3rdparty/softfloat3/source/s_roundPackMToExtF80M.c256
-rw-r--r--3rdparty/softfloat3/source/s_roundPackMToF128M.c178
-rw-r--r--3rdparty/softfloat3/source/s_roundPackToExtF80.c256
-rw-r--r--3rdparty/softfloat3/source/s_roundPackToF128.c171
-rw-r--r--3rdparty/softfloat3/source/s_roundPackToF16.c113
-rw-r--r--3rdparty/softfloat3/source/s_roundPackToF32.c113
-rw-r--r--3rdparty/softfloat3/source/s_roundPackToF64.c117
-rw-r--r--3rdparty/softfloat3/source/s_roundToI32.c98
-rw-r--r--3rdparty/softfloat3/source/s_roundToI64.c101
-rw-r--r--3rdparty/softfloat3/source/s_roundToUI32.c93
-rw-r--r--3rdparty/softfloat3/source/s_roundToUI64.c97
-rw-r--r--3rdparty/softfloat3/source/s_shiftLeftM.c91
-rw-r--r--3rdparty/softfloat3/source/s_shiftNormSigF128M.c78
-rw-r--r--3rdparty/softfloat3/source/s_shiftRightJam128.c69
-rw-r--r--3rdparty/softfloat3/source/s_shiftRightJam128Extra.c77
-rw-r--r--3rdparty/softfloat3/source/s_shiftRightJam256M.c126
-rw-r--r--3rdparty/softfloat3/source/s_shiftRightJam32.c51
-rw-r--r--3rdparty/softfloat3/source/s_shiftRightJam64.c51
-rw-r--r--3rdparty/softfloat3/source/s_shiftRightJam64Extra.c62
-rw-r--r--3rdparty/softfloat3/source/s_shiftRightJamM.c101
-rw-r--r--3rdparty/softfloat3/source/s_shiftRightM.c91
-rw-r--r--3rdparty/softfloat3/source/s_shortShiftLeft128.c55
-rw-r--r--3rdparty/softfloat3/source/s_shortShiftLeft64To96M.c56
-rw-r--r--3rdparty/softfloat3/source/s_shortShiftLeftM.c70
-rw-r--r--3rdparty/softfloat3/source/s_shortShiftRight128.c55
-rw-r--r--3rdparty/softfloat3/source/s_shortShiftRightExtendM.c73
-rw-r--r--3rdparty/softfloat3/source/s_shortShiftRightJam128.c60
-rw-r--r--3rdparty/softfloat3/source/s_shortShiftRightJam128Extra.c59
-rw-r--r--3rdparty/softfloat3/source/s_shortShiftRightJam64.c50
-rw-r--r--3rdparty/softfloat3/source/s_shortShiftRightJam64Extra.c56
-rw-r--r--3rdparty/softfloat3/source/s_shortShiftRightJamM.c72
-rw-r--r--3rdparty/softfloat3/source/s_shortShiftRightM.c70
-rw-r--r--3rdparty/softfloat3/source/s_sub128.c55
-rw-r--r--3rdparty/softfloat3/source/s_sub1XM.c60
-rw-r--r--3rdparty/softfloat3/source/s_sub256M.c65
-rw-r--r--3rdparty/softfloat3/source/s_subM.c70
-rw-r--r--3rdparty/softfloat3/source/s_subMagsExtF80.c158
-rw-r--r--3rdparty/softfloat3/source/s_subMagsF128.c139
-rw-r--r--3rdparty/softfloat3/source/s_subMagsF16.c187
-rw-r--r--3rdparty/softfloat3/source/s_subMagsF32.c143
-rw-r--r--3rdparty/softfloat3/source/s_subMagsF64.c141
-rw-r--r--3rdparty/softfloat3/source/s_tryPropagateNaNExtF80M.c64
-rw-r--r--3rdparty/softfloat3/source/s_tryPropagateNaNF128M.c55
-rw-r--r--3rdparty/softfloat3/source/softfloat_state.c52
-rw-r--r--3rdparty/softfloat3/source/ui32_to_extF80.c59
-rw-r--r--3rdparty/softfloat3/source/ui32_to_extF80M.c74
-rw-r--r--3rdparty/softfloat3/source/ui32_to_f128.c60
-rw-r--r--3rdparty/softfloat3/source/ui32_to_f128M.c76
-rw-r--r--3rdparty/softfloat3/source/ui32_to_f16.c65
-rw-r--r--3rdparty/softfloat3/source/ui32_to_f32.c57
-rw-r--r--3rdparty/softfloat3/source/ui32_to_f64.c59
-rw-r--r--3rdparty/softfloat3/source/ui64_to_extF80.c59
-rw-r--r--3rdparty/softfloat3/source/ui64_to_extF80M.c74
-rw-r--r--3rdparty/softfloat3/source/ui64_to_f128.c68
-rw-r--r--3rdparty/softfloat3/source/ui64_to_f128M.c86
-rw-r--r--3rdparty/softfloat3/source/ui64_to_f16.c64
-rw-r--r--3rdparty/softfloat3/source/ui64_to_f32.c64
-rw-r--r--3rdparty/softfloat3/source/ui64_to_f64.c59
-rw-r--r--3rdparty/sol2/sol/config.hpp53
-rw-r--r--3rdparty/sol2/sol/forward.hpp1321
-rw-r--r--3rdparty/sol2/sol/sol.hpp28916
-rw-r--r--3rdparty/sqlite3/shell.c20838
-rw-r--r--3rdparty/sqlite3/sqlite3.c230517
-rw-r--r--3rdparty/sqlite3/sqlite3.h12174
-rw-r--r--3rdparty/sqlite3/sqlite3ext.h659
-rw-r--r--3rdparty/tap-windows6/COPYING24
-rw-r--r--3rdparty/tap-windows6/COPYRIGHT.GPL339
-rw-r--r--3rdparty/tap-windows6/COPYRIGHT.MIT20
-rw-r--r--3rdparty/tap-windows6/tap-windows.h82
-rw-r--r--3rdparty/utf8proc/.github/workflows/ci-fuzz.yml23
-rw-r--r--3rdparty/utf8proc/.github/workflows/cmake.yml64
-rw-r--r--3rdparty/utf8proc/.github/workflows/make.yml41
-rw-r--r--3rdparty/utf8proc/.gitignore38
-rw-r--r--3rdparty/utf8proc/CMakeLists.txt113
-rw-r--r--3rdparty/utf8proc/Doxyfile2566
-rw-r--r--3rdparty/utf8proc/LICENSE.md93
-rw-r--r--3rdparty/utf8proc/MANIFEST9
-rw-r--r--3rdparty/utf8proc/Makefile198
-rw-r--r--3rdparty/utf8proc/NEWS.md445
-rw-r--r--3rdparty/utf8proc/README.md88
-rw-r--r--3rdparty/utf8proc/appveyor.yml46
-rw-r--r--3rdparty/utf8proc/bench/Makefile40
-rw-r--r--3rdparty/utf8proc/bench/bench.c56
-rw-r--r--3rdparty/utf8proc/bench/icu.c61
-rw-r--r--3rdparty/utf8proc/bench/unistring.c60
-rw-r--r--3rdparty/utf8proc/bench/util.c39
-rw-r--r--3rdparty/utf8proc/bench/util.h22
-rw-r--r--3rdparty/utf8proc/data/Makefile63
-rw-r--r--3rdparty/utf8proc/data/charwidths.jl169
-rwxr-xr-x3rdparty/utf8proc/data/data_generator.rb475
-rw-r--r--3rdparty/utf8proc/libutf8proc.pc.cmakein10
-rw-r--r--3rdparty/utf8proc/libutf8proc.pc.in10
-rw-r--r--3rdparty/utf8proc/lump.md27
-rw-r--r--3rdparty/utf8proc/test/case.c76
-rw-r--r--3rdparty/utf8proc/test/charwidth.c77
-rw-r--r--3rdparty/utf8proc/test/custom.c28
-rw-r--r--3rdparty/utf8proc/test/fuzz_main.c54
-rw-r--r--3rdparty/utf8proc/test/fuzzer.c84
-rw-r--r--3rdparty/utf8proc/test/graphemetest.c135
-rw-r--r--3rdparty/utf8proc/test/iscase.c62
-rw-r--r--3rdparty/utf8proc/test/iterate.c168
-rw-r--r--3rdparty/utf8proc/test/misc.c51
-rw-r--r--3rdparty/utf8proc/test/normtest.c63
-rwxr-xr-x3rdparty/utf8proc/test/ossfuzz.sh13
-rw-r--r--3rdparty/utf8proc/test/printproperty.c64
-rw-r--r--3rdparty/utf8proc/test/tests.c59
-rw-r--r--3rdparty/utf8proc/test/tests.h27
-rw-r--r--3rdparty/utf8proc/test/valid.c41
-rw-r--r--3rdparty/utf8proc/utf8proc.c815
-rw-r--r--3rdparty/utf8proc/utf8proc.h743
-rw-r--r--3rdparty/utf8proc/utf8proc_data.c16960
-rw-r--r--3rdparty/utf8proc/utils.cmake20
-rw-r--r--3rdparty/wdlfft/fft.c1199
-rw-r--r--3rdparty/wdlfft/fft.h77
-rw-r--r--3rdparty/ymfm/.editorconfig9
-rw-r--r--3rdparty/ymfm/.gitignore40
-rw-r--r--3rdparty/ymfm/GeneralInfo.md282
-rw-r--r--3rdparty/ymfm/LICENSE29
-rw-r--r--3rdparty/ymfm/README.md125
-rw-r--r--3rdparty/ymfm/examples/buildall/buildall.cpp114
-rw-r--r--3rdparty/ymfm/examples/vgmrender/.gitignore1
-rw-r--r--3rdparty/ymfm/examples/vgmrender/em_inflate.cpp1185
-rw-r--r--3rdparty/ymfm/examples/vgmrender/em_inflate.h49
-rw-r--r--3rdparty/ymfm/examples/vgmrender/vgmrender.cpp1439
-rw-r--r--3rdparty/ymfm/src/ymfm.h585
-rw-r--r--3rdparty/ymfm/src/ymfm_adpcm.cpp919
-rw-r--r--3rdparty/ymfm/src/ymfm_adpcm.h454
-rw-r--r--3rdparty/ymfm/src/ymfm_fm.h463
-rw-r--r--3rdparty/ymfm/src/ymfm_fm.ipp1592
-rw-r--r--3rdparty/ymfm/src/ymfm_misc.cpp175
-rw-r--r--3rdparty/ymfm/src/ymfm_misc.h93
-rw-r--r--3rdparty/ymfm/src/ymfm_opl.cpp2222
-rw-r--r--3rdparty/ymfm/src/ymfm_opl.h902
-rw-r--r--3rdparty/ymfm/src/ymfm_opm.cpp539
-rw-r--r--3rdparty/ymfm/src/ymfm_opm.h322
-rw-r--r--3rdparty/ymfm/src/ymfm_opn.cpp2490
-rw-r--r--3rdparty/ymfm/src/ymfm_opn.h802
-rw-r--r--3rdparty/ymfm/src/ymfm_opq.cpp480
-rw-r--r--3rdparty/ymfm/src/ymfm_opq.h293
-rw-r--r--3rdparty/ymfm/src/ymfm_opx.h290
-rw-r--r--3rdparty/ymfm/src/ymfm_opz.cpp808
-rw-r--r--3rdparty/ymfm/src/ymfm_opz.h332
-rw-r--r--3rdparty/ymfm/src/ymfm_pcm.cpp714
-rw-r--r--3rdparty/ymfm/src/ymfm_pcm.h347
-rw-r--r--3rdparty/ymfm/src/ymfm_ssg.cpp279
-rw-r--r--3rdparty/ymfm/src/ymfm_ssg.h207
-rw-r--r--3rdparty/zlib/CMakeLists.txt218
-rw-r--r--3rdparty/zlib/ChangeLog1618
-rw-r--r--3rdparty/zlib/FAQ367
-rw-r--r--3rdparty/zlib/INDEX68
-rw-r--r--3rdparty/zlib/LICENSE22
-rw-r--r--3rdparty/zlib/Makefile5
-rw-r--r--3rdparty/zlib/Makefile.in410
-rw-r--r--3rdparty/zlib/README117
-rw-r--r--3rdparty/zlib/adler32.c164
-rw-r--r--3rdparty/zlib/amiga/Makefile.pup69
-rw-r--r--3rdparty/zlib/amiga/Makefile.sas68
-rw-r--r--3rdparty/zlib/compress.c75
-rw-r--r--3rdparty/zlib/configure929
-rw-r--r--3rdparty/zlib/contrib/README.contrib57
-rw-r--r--3rdparty/zlib/contrib/ada/buffer_demo.adb106
-rw-r--r--3rdparty/zlib/contrib/ada/mtest.adb156
-rw-r--r--3rdparty/zlib/contrib/ada/read.adb156
-rw-r--r--3rdparty/zlib/contrib/ada/readme.txt65
-rw-r--r--3rdparty/zlib/contrib/ada/test.adb463
-rw-r--r--3rdparty/zlib/contrib/ada/zlib-streams.adb225
-rw-r--r--3rdparty/zlib/contrib/ada/zlib-streams.ads114
-rw-r--r--3rdparty/zlib/contrib/ada/zlib-thin.adb141
-rw-r--r--3rdparty/zlib/contrib/ada/zlib-thin.ads450
-rw-r--r--3rdparty/zlib/contrib/ada/zlib.adb701
-rw-r--r--3rdparty/zlib/contrib/ada/zlib.ads328
-rw-r--r--3rdparty/zlib/contrib/ada/zlib.gpr20
-rw-r--r--3rdparty/zlib/contrib/blast/Makefile8
-rw-r--r--3rdparty/zlib/contrib/blast/README4
-rw-r--r--3rdparty/zlib/contrib/blast/blast.c466
-rw-r--r--3rdparty/zlib/contrib/blast/blast.h83
-rw-r--r--3rdparty/zlib/contrib/blast/test.pkbin0 -> 8 bytes-rw-r--r--3rdparty/zlib/contrib/blast/test.txt1
-rw-r--r--3rdparty/zlib/contrib/delphi/ZLib.pas557
-rw-r--r--3rdparty/zlib/contrib/delphi/ZLibConst.pas11
-rw-r--r--3rdparty/zlib/contrib/delphi/readme.txt76
-rw-r--r--3rdparty/zlib/contrib/delphi/zlibd32.mak99
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib.build33
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib.chmbin0 -> 72726 bytes-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib.sln21
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/AssemblyInfo.cs58
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/ChecksumImpl.cs202
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/CircularBuffer.cs83
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/CodecBase.cs198
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/Deflater.cs106
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/DotZLib.cs288
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/DotZLib.csproj141
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/GZipStream.cs301
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/Inflater.cs105
-rw-r--r--3rdparty/zlib/contrib/dotzlib/DotZLib/UnitTests.cs274
-rw-r--r--3rdparty/zlib/contrib/dotzlib/LICENSE_1_0.txt23
-rw-r--r--3rdparty/zlib/contrib/dotzlib/readme.txt58
-rw-r--r--3rdparty/zlib/contrib/gcc_gvmat64/gvmat64.S574
-rw-r--r--3rdparty/zlib/contrib/infback9/README1
-rw-r--r--3rdparty/zlib/contrib/infback9/infback9.c603
-rw-r--r--3rdparty/zlib/contrib/infback9/infback9.h37
-rw-r--r--3rdparty/zlib/contrib/infback9/inffix9.h107
-rw-r--r--3rdparty/zlib/contrib/infback9/inflate9.h47
-rw-r--r--3rdparty/zlib/contrib/infback9/inftree9.c319
-rw-r--r--3rdparty/zlib/contrib/infback9/inftree9.h61
-rw-r--r--3rdparty/zlib/contrib/iostream/test.cpp24
-rw-r--r--3rdparty/zlib/contrib/iostream/zfstream.cpp329
-rw-r--r--3rdparty/zlib/contrib/iostream/zfstream.h128
-rw-r--r--3rdparty/zlib/contrib/iostream2/zstream.h307
-rw-r--r--3rdparty/zlib/contrib/iostream2/zstream_test.cpp25
-rw-r--r--3rdparty/zlib/contrib/iostream3/README35
-rw-r--r--3rdparty/zlib/contrib/iostream3/TODO17
-rw-r--r--3rdparty/zlib/contrib/iostream3/test.cc50
-rw-r--r--3rdparty/zlib/contrib/iostream3/zfstream.cc479
-rw-r--r--3rdparty/zlib/contrib/iostream3/zfstream.h466
-rw-r--r--3rdparty/zlib/contrib/minizip/Makefile29
-rw-r--r--3rdparty/zlib/contrib/minizip/Makefile.am45
-rw-r--r--3rdparty/zlib/contrib/minizip/MiniZip64_Changes.txt6
-rw-r--r--3rdparty/zlib/contrib/minizip/MiniZip64_info.txt74
-rw-r--r--3rdparty/zlib/contrib/minizip/configure.ac32
-rw-r--r--3rdparty/zlib/contrib/minizip/crypt.h128
-rw-r--r--3rdparty/zlib/contrib/minizip/ioapi.c231
-rw-r--r--3rdparty/zlib/contrib/minizip/ioapi.h210
-rw-r--r--3rdparty/zlib/contrib/minizip/iowin32.c440
-rw-r--r--3rdparty/zlib/contrib/minizip/iowin32.h28
-rw-r--r--3rdparty/zlib/contrib/minizip/make_vms.com25
-rw-r--r--3rdparty/zlib/contrib/minizip/miniunz.c647
-rw-r--r--3rdparty/zlib/contrib/minizip/miniunzip.163
-rw-r--r--3rdparty/zlib/contrib/minizip/minizip.146
-rw-r--r--3rdparty/zlib/contrib/minizip/minizip.c509
-rw-r--r--3rdparty/zlib/contrib/minizip/minizip.pc.in12
-rw-r--r--3rdparty/zlib/contrib/minizip/mztools.c285
-rw-r--r--3rdparty/zlib/contrib/minizip/mztools.h37
-rw-r--r--3rdparty/zlib/contrib/minizip/unzip.c1985
-rw-r--r--3rdparty/zlib/contrib/minizip/unzip.h437
-rw-r--r--3rdparty/zlib/contrib/minizip/zip.c1956
-rw-r--r--3rdparty/zlib/contrib/minizip/zip.h364
-rw-r--r--3rdparty/zlib/contrib/nuget/nuget.csproj43
-rw-r--r--3rdparty/zlib/contrib/nuget/nuget.sln22
-rw-r--r--3rdparty/zlib/contrib/pascal/example.pas599
-rw-r--r--3rdparty/zlib/contrib/pascal/readme.txt76
-rw-r--r--3rdparty/zlib/contrib/pascal/zlibd32.mak99
-rw-r--r--3rdparty/zlib/contrib/pascal/zlibpas.pas276
-rw-r--r--3rdparty/zlib/contrib/puff/Makefile42
-rw-r--r--3rdparty/zlib/contrib/puff/README63
-rw-r--r--3rdparty/zlib/contrib/puff/puff.c840
-rw-r--r--3rdparty/zlib/contrib/puff/puff.h35
-rw-r--r--3rdparty/zlib/contrib/puff/pufftest.c165
-rw-r--r--3rdparty/zlib/contrib/puff/zeros.rawbin0 -> 2517 bytes-rw-r--r--3rdparty/zlib/contrib/testzlib/testzlib.c275
-rw-r--r--3rdparty/zlib/contrib/testzlib/testzlib.txt10
-rw-r--r--3rdparty/zlib/contrib/untgz/Makefile14
-rw-r--r--3rdparty/zlib/contrib/untgz/Makefile.msc17
-rw-r--r--3rdparty/zlib/contrib/untgz/untgz.c667
-rw-r--r--3rdparty/zlib/contrib/vstudio/readme.txt81
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/miniunz.vcxproj310
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/miniunz.vcxproj.filters22
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/minizip.vcxproj307
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/minizip.vcxproj.filters22
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/testzlib.vcxproj412
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/testzlib.vcxproj.filters55
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj310
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/testzlibdll.vcxproj.filters22
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/zlib.rc32
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/zlibstat.vcxproj449
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/zlibstat.vcxproj.filters74
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/zlibvc.def158
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/zlibvc.sln135
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/zlibvc.vcxproj633
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc10/zlibvc.vcxproj.filters115
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc11/miniunz.vcxproj314
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc11/minizip.vcxproj311
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc11/testzlib.vcxproj418
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc11/testzlibdll.vcxproj314
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc11/zlib.rc32
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc11/zlibstat.vcxproj456
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc11/zlibvc.def158
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc11/zlibvc.sln117
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc11/zlibvc.vcxproj664
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc12/miniunz.vcxproj316
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc12/minizip.vcxproj313
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc12/testzlib.vcxproj422
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc12/testzlibdll.vcxproj316
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc12/zlib.rc32
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc12/zlibstat.vcxproj459
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc12/zlibvc.def158
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc12/zlibvc.sln119
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc12/zlibvc.vcxproj668
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/miniunz.vcxproj316
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/minizip.vcxproj313
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/testzlib.vcxproj422
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/testzlibdll.vcxproj316
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/zlib.rc32
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/zlibstat.vcxproj459
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/zlibvc.def158
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/zlibvc.sln119
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc14/zlibvc.vcxproj668
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/miniunz.vcxproj409
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/minizip.vcxproj405
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/testzlib.vcxproj473
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/testzlibdll.vcxproj409
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/zlib.rc32
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/zlibstat.vcxproj602
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/zlibvc.def158
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/zlibvc.sln179
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc17/zlibvc.vcxproj875
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc9/miniunz.vcproj565
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc9/minizip.vcproj562
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc9/testzlib.vcproj796
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc9/testzlibdll.vcproj565
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc9/zlib.rc32
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc9/zlibstat.vcproj781
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc9/zlibvc.def158
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc9/zlibvc.sln144
-rw-r--r--3rdparty/zlib/contrib/vstudio/vc9/zlibvc.vcproj1100
-rw-r--r--3rdparty/zlib/crc32.c1049
-rw-r--r--3rdparty/zlib/crc32.h9446
-rw-r--r--3rdparty/zlib/deflate.c2139
-rw-r--r--3rdparty/zlib/deflate.h377
-rw-r--r--3rdparty/zlib/doc/algorithm.txt209
-rw-r--r--3rdparty/zlib/doc/crc-doc.1.0.pdfbin0 -> 776142 bytes-rw-r--r--3rdparty/zlib/doc/rfc1950.txt619
-rw-r--r--3rdparty/zlib/doc/rfc1951.txt955
-rw-r--r--3rdparty/zlib/doc/rfc1952.txt675
-rw-r--r--3rdparty/zlib/doc/txtvsbin.txt107
-rw-r--r--3rdparty/zlib/examples/README.examples54
-rw-r--r--3rdparty/zlib/examples/enough.c597
-rw-r--r--3rdparty/zlib/examples/fitblk.c233
-rw-r--r--3rdparty/zlib/examples/gun.c702
-rw-r--r--3rdparty/zlib/examples/gzappend.c504
-rw-r--r--3rdparty/zlib/examples/gzjoin.c449
-rw-r--r--3rdparty/zlib/examples/gzlog.c1061
-rw-r--r--3rdparty/zlib/examples/gzlog.h91
-rw-r--r--3rdparty/zlib/examples/gznorm.c470
-rw-r--r--3rdparty/zlib/examples/zlib_how.html549
-rw-r--r--3rdparty/zlib/examples/zpipe.c205
-rw-r--r--3rdparty/zlib/examples/zran.c533
-rw-r--r--3rdparty/zlib/examples/zran.h51
-rw-r--r--3rdparty/zlib/gzclose.c23
-rw-r--r--3rdparty/zlib/gzguts.h214
-rw-r--r--3rdparty/zlib/gzlib.c582
-rw-r--r--3rdparty/zlib/gzread.c602
-rw-r--r--3rdparty/zlib/gzwrite.c631
-rw-r--r--3rdparty/zlib/infback.c (renamed from src/lib/zlib/infback.c)155
-rw-r--r--3rdparty/zlib/inffast.c320
-rw-r--r--3rdparty/zlib/inffast.h11
-rw-r--r--3rdparty/zlib/inffixed.h (renamed from src/lib/zlib/inffixed.h)6
-rw-r--r--3rdparty/zlib/inflate.c1526
-rw-r--r--3rdparty/zlib/inflate.h (renamed from src/lib/zlib/inflate.h)41
-rw-r--r--3rdparty/zlib/inftrees.c (renamed from src/lib/zlib/inftrees.c)118
-rw-r--r--3rdparty/zlib/inftrees.h62
-rw-r--r--3rdparty/zlib/make_vms.com867
-rw-r--r--3rdparty/zlib/msdos/Makefile.bor115
-rw-r--r--3rdparty/zlib/msdos/Makefile.dj2104
-rw-r--r--3rdparty/zlib/msdos/Makefile.emx69
-rw-r--r--3rdparty/zlib/msdos/Makefile.msc112
-rw-r--r--3rdparty/zlib/msdos/Makefile.tc100
-rw-r--r--3rdparty/zlib/nintendods/Makefile126
-rw-r--r--3rdparty/zlib/nintendods/README5
-rw-r--r--3rdparty/zlib/old/Makefile.emx69
-rw-r--r--3rdparty/zlib/old/Makefile.riscos151
-rw-r--r--3rdparty/zlib/old/README3
-rw-r--r--3rdparty/zlib/old/descrip.mms48
-rw-r--r--3rdparty/zlib/old/os2/Makefile.os2136
-rw-r--r--3rdparty/zlib/old/os2/zlib.def51
-rw-r--r--3rdparty/zlib/old/visual-basic.txt160
-rw-r--r--3rdparty/zlib/os400/README40048
-rw-r--r--3rdparty/zlib/os400/bndsrc127
-rw-r--r--3rdparty/zlib/os400/make.sh366
-rw-r--r--3rdparty/zlib/os400/zlib.inc527
-rw-r--r--3rdparty/zlib/qnx/package.qpg141
-rw-r--r--3rdparty/zlib/test/example.c546
-rw-r--r--3rdparty/zlib/test/infcover.c672
-rw-r--r--3rdparty/zlib/test/minigzip.c579
-rw-r--r--3rdparty/zlib/treebuild.xml116
-rw-r--r--3rdparty/zlib/trees.c1117
-rw-r--r--3rdparty/zlib/trees.h (renamed from src/lib/zlib/trees.h)4
-rw-r--r--3rdparty/zlib/uncompr.c85
-rw-r--r--3rdparty/zlib/watcom/watcom_f.mak43
-rw-r--r--3rdparty/zlib/watcom/watcom_l.mak43
-rw-r--r--3rdparty/zlib/win32/DLL_FAQ.txt381
-rw-r--r--3rdparty/zlib/win32/Makefile.bor109
-rw-r--r--3rdparty/zlib/win32/Makefile.gcc177
-rw-r--r--3rdparty/zlib/win32/Makefile.msc159
-rw-r--r--3rdparty/zlib/win32/README-WIN32.txt103
-rw-r--r--3rdparty/zlib/win32/VisualC.txt3
-rw-r--r--3rdparty/zlib/win32/zlib.def97
-rw-r--r--3rdparty/zlib/win32/zlib1.rc40
-rw-r--r--3rdparty/zlib/zconf.h543
-rw-r--r--3rdparty/zlib/zconf.h.cmakein545
-rw-r--r--3rdparty/zlib/zconf.h.in543
-rw-r--r--3rdparty/zlib/zlib.3149
-rw-r--r--3rdparty/zlib/zlib.3.pdfbin0 -> 25523 bytes-rw-r--r--3rdparty/zlib/zlib.h1938
-rw-r--r--3rdparty/zlib/zlib.map100
-rw-r--r--3rdparty/zlib/zlib.pc.cmakein13
-rw-r--r--3rdparty/zlib/zlib.pc.in13
-rw-r--r--3rdparty/zlib/zutil.c299
-rw-r--r--3rdparty/zlib/zutil.h254
-rw-r--r--3rdparty/zstd/.buckconfig9
-rw-r--r--3rdparty/zstd/.buckversion1
-rw-r--r--3rdparty/zstd/.circleci/config.yml123
-rw-r--r--3rdparty/zstd/.circleci/images/primary/Dockerfile9
-rw-r--r--3rdparty/zstd/.cirrus.yml10
-rw-r--r--3rdparty/zstd/.github/ISSUE_TEMPLATE/bug_report.md35
-rw-r--r--3rdparty/zstd/.github/ISSUE_TEMPLATE/feature_request.md20
-rw-r--r--3rdparty/zstd/.github/dependabot.yml6
-rw-r--r--3rdparty/zstd/.github/workflows/dev-long-tests.yml297
-rw-r--r--3rdparty/zstd/.github/workflows/dev-short-tests.yml624
-rw-r--r--3rdparty/zstd/.github/workflows/publish-release-artifacts.yml73
-rw-r--r--3rdparty/zstd/.github/workflows/scorecards.yml64
-rw-r--r--3rdparty/zstd/.github/workflows/windows-artifacts.yml51
-rw-r--r--3rdparty/zstd/.gitignore55
-rw-r--r--3rdparty/zstd/.travis.yml128
-rw-r--r--3rdparty/zstd/CHANGELOG800
-rw-r--r--3rdparty/zstd/CODE_OF_CONDUCT.md5
-rw-r--r--3rdparty/zstd/CONTRIBUTING.md489
-rw-r--r--3rdparty/zstd/COPYING339
-rw-r--r--3rdparty/zstd/LICENSE30
-rw-r--r--3rdparty/zstd/Makefile443
-rw-r--r--3rdparty/zstd/Package.swift36
-rw-r--r--3rdparty/zstd/README.md223
-rw-r--r--3rdparty/zstd/TESTING.md43
-rw-r--r--3rdparty/zstd/appveyor.yml205
-rw-r--r--3rdparty/zstd/build/.gitignore33
-rw-r--r--3rdparty/zstd/build/LICENSE0
-rw-r--r--3rdparty/zstd/build/README.md56
-rw-r--r--3rdparty/zstd/build/VS2008/fullbench/fullbench.vcproj549
-rw-r--r--3rdparty/zstd/build/VS2008/fuzzer/fuzzer.vcproj585
-rw-r--r--3rdparty/zstd/build/VS2008/zstd.sln56
-rw-r--r--3rdparty/zstd/build/VS2008/zstd/zstd.vcproj673
-rw-r--r--3rdparty/zstd/build/VS2008/zstdlib/zstdlib.vcproj635
-rw-r--r--3rdparty/zstd/build/VS2010/CompileAsCpp.props8
-rw-r--r--3rdparty/zstd/build/VS2010/datagen/datagen.vcxproj168
-rw-r--r--3rdparty/zstd/build/VS2010/fullbench-dll/fullbench-dll.vcxproj189
-rw-r--r--3rdparty/zstd/build/VS2010/fullbench/fullbench.vcxproj218
-rw-r--r--3rdparty/zstd/build/VS2010/fuzzer/fuzzer.vcxproj223
-rw-r--r--3rdparty/zstd/build/VS2010/libzstd-dll/libzstd-dll.rc51
-rw-r--r--3rdparty/zstd/build/VS2010/libzstd-dll/libzstd-dll.vcxproj249
-rw-r--r--3rdparty/zstd/build/VS2010/libzstd/libzstd.vcxproj242
-rw-r--r--3rdparty/zstd/build/VS2010/zstd.sln89
-rw-r--r--3rdparty/zstd/build/VS2010/zstd/zstd.rc51
-rw-r--r--3rdparty/zstd/build/VS2010/zstd/zstd.vcxproj264
-rw-r--r--3rdparty/zstd/build/VS_scripts/README.md64
-rw-r--r--3rdparty/zstd/build/VS_scripts/build.VS2010.cmd7
-rw-r--r--3rdparty/zstd/build/VS_scripts/build.VS2012.cmd6
-rw-r--r--3rdparty/zstd/build/VS_scripts/build.VS2013.cmd7
-rw-r--r--3rdparty/zstd/build/VS_scripts/build.VS2015.cmd7
-rw-r--r--3rdparty/zstd/build/VS_scripts/build.VS2017.cmd7
-rw-r--r--3rdparty/zstd/build/VS_scripts/build.VS2017Community.cmd7
-rw-r--r--3rdparty/zstd/build/VS_scripts/build.VS2017Enterprise.cmd7
-rw-r--r--3rdparty/zstd/build/VS_scripts/build.VS2017Professional.cmd7
-rw-r--r--3rdparty/zstd/build/VS_scripts/build.generic.cmd72
-rw-r--r--3rdparty/zstd/build/cmake/.gitignore10
-rw-r--r--3rdparty/zstd/build/cmake/CMakeLists.txt212
-rw-r--r--3rdparty/zstd/build/cmake/CMakeModules/AddZstdCompilationFlags.cmake121
-rw-r--r--3rdparty/zstd/build/cmake/CMakeModules/FindLibLZ4.cmake49
-rw-r--r--3rdparty/zstd/build/cmake/CMakeModules/GetZstdLibraryVersion.cmake10
-rw-r--r--3rdparty/zstd/build/cmake/CMakeModules/JoinPaths.cmake23
-rw-r--r--3rdparty/zstd/build/cmake/README.md104
-rw-r--r--3rdparty/zstd/build/cmake/contrib/CMakeLists.txt13
-rw-r--r--3rdparty/zstd/build/cmake/contrib/gen_html/CMakeLists.txt30
-rw-r--r--3rdparty/zstd/build/cmake/contrib/pzstd/CMakeLists.txt38
-rw-r--r--3rdparty/zstd/build/cmake/lib/.gitignore2
-rw-r--r--3rdparty/zstd/build/cmake/lib/CMakeLists.txt181
-rw-r--r--3rdparty/zstd/build/cmake/lib/cmake_uninstall.cmake.in22
-rw-r--r--3rdparty/zstd/build/cmake/programs/.gitignore5
-rw-r--r--3rdparty/zstd/build/cmake/programs/CMakeLists.txt137
-rw-r--r--3rdparty/zstd/build/cmake/tests/.gitignore6
-rw-r--r--3rdparty/zstd/build/cmake/tests/CMakeLists.txt118
-rw-r--r--3rdparty/zstd/build/cmake/zstdConfig.cmake1
-rw-r--r--3rdparty/zstd/build/meson/GetZstdLibraryVersion.py39
-rw-r--r--3rdparty/zstd/build/meson/InstallSymlink.py55
-rw-r--r--3rdparty/zstd/build/meson/README.md38
-rw-r--r--3rdparty/zstd/build/meson/contrib/gen_html/meson.build30
-rw-r--r--3rdparty/zstd/build/meson/contrib/meson.build12
-rw-r--r--3rdparty/zstd/build/meson/contrib/pzstd/meson.build25
-rw-r--r--3rdparty/zstd/build/meson/lib/meson.build167
-rw-r--r--3rdparty/zstd/build/meson/meson.build145
-rw-r--r--3rdparty/zstd/build/meson/meson_options.txt36
-rw-r--r--3rdparty/zstd/build/meson/programs/meson.build123
-rw-r--r--3rdparty/zstd/build/meson/tests/meson.build215
-rw-r--r--3rdparty/zstd/build/meson/tests/valgrindTest.py90
-rw-r--r--3rdparty/zstd/build/single_file_libs/.gitignore9
-rw-r--r--3rdparty/zstd/build/single_file_libs/README.md33
-rwxr-xr-x3rdparty/zstd/build/single_file_libs/build_decoder_test.sh91
-rwxr-xr-x3rdparty/zstd/build/single_file_libs/build_library_test.sh97
-rwxr-xr-x3rdparty/zstd/build/single_file_libs/combine.py234
-rwxr-xr-x3rdparty/zstd/build/single_file_libs/combine.sh249
-rwxr-xr-x3rdparty/zstd/build/single_file_libs/create_single_file_decoder.sh19
-rwxr-xr-x3rdparty/zstd/build/single_file_libs/create_single_file_library.sh19
-rw-r--r--3rdparty/zstd/build/single_file_libs/examples/README.md11
-rw-r--r--3rdparty/zstd/build/single_file_libs/examples/emscripten.c340
-rw-r--r--3rdparty/zstd/build/single_file_libs/examples/roundtrip.c83
-rw-r--r--3rdparty/zstd/build/single_file_libs/examples/shell.html31
-rw-r--r--3rdparty/zstd/build/single_file_libs/examples/simple.c75
-rw-r--r--3rdparty/zstd/build/single_file_libs/examples/testcard-dxt1.inl2731
-rw-r--r--3rdparty/zstd/build/single_file_libs/examples/testcard-zstd.inl261
-rwxr-xr-x3rdparty/zstd/build/single_file_libs/examples/testcard.pngbin0 -> 12675 bytes-rw-r--r--3rdparty/zstd/build/single_file_libs/zstd-in.c90
-rw-r--r--3rdparty/zstd/build/single_file_libs/zstddeclib-in.c62
-rw-r--r--3rdparty/zstd/contrib/VS2005/README.md3
-rw-r--r--3rdparty/zstd/contrib/VS2005/fullbench/fullbench.vcproj440
-rw-r--r--3rdparty/zstd/contrib/VS2005/fuzzer/fuzzer.vcproj488
-rw-r--r--3rdparty/zstd/contrib/VS2005/zstd.sln55
-rw-r--r--3rdparty/zstd/contrib/VS2005/zstd/zstd.vcproj552
-rw-r--r--3rdparty/zstd/contrib/VS2005/zstdlib/zstdlib.vcproj546
-rwxr-xr-x3rdparty/zstd/contrib/cleanTabs2
-rw-r--r--3rdparty/zstd/contrib/diagnose_corruption/.gitignore1
-rw-r--r--3rdparty/zstd/contrib/diagnose_corruption/Makefile35
-rw-r--r--3rdparty/zstd/contrib/diagnose_corruption/check_flipped_bits.c400
-rw-r--r--3rdparty/zstd/contrib/docker/Dockerfile20
-rw-r--r--3rdparty/zstd/contrib/docker/README.md20
-rw-r--r--3rdparty/zstd/contrib/externalSequenceProducer/.gitignore2
-rw-r--r--3rdparty/zstd/contrib/externalSequenceProducer/Makefile40
-rw-r--r--3rdparty/zstd/contrib/externalSequenceProducer/README.md14
-rw-r--r--3rdparty/zstd/contrib/externalSequenceProducer/main.c107
-rw-r--r--3rdparty/zstd/contrib/externalSequenceProducer/sequence_producer.c80
-rw-r--r--3rdparty/zstd/contrib/externalSequenceProducer/sequence_producer.h26
-rwxr-xr-x3rdparty/zstd/contrib/freestanding_lib/freestanding.py774
-rw-r--r--3rdparty/zstd/contrib/gen_html/.gitignore3
-rw-r--r--3rdparty/zstd/contrib/gen_html/Makefile51
-rw-r--r--3rdparty/zstd/contrib/gen_html/README.md31
-rwxr-xr-x3rdparty/zstd/contrib/gen_html/gen-zstd-manual.sh9
-rw-r--r--3rdparty/zstd/contrib/gen_html/gen_html.cpp224
-rw-r--r--3rdparty/zstd/contrib/largeNbDicts/.gitignore2
-rw-r--r--3rdparty/zstd/contrib/largeNbDicts/Makefile58
-rw-r--r--3rdparty/zstd/contrib/largeNbDicts/README.md33
-rw-r--r--3rdparty/zstd/contrib/largeNbDicts/largeNbDicts.c1085
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/.gitignore4
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/Makefile108
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/README.md14
-rwxr-xr-x3rdparty/zstd/contrib/linux-kernel/btrfs-benchmark.sh104
-rwxr-xr-x3rdparty/zstd/contrib/linux-kernel/btrfs-extract-benchmark.sh99
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/decompress_sources.h34
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/linux.mk43
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/linux_zstd.h447
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/mem.h261
-rwxr-xr-x3rdparty/zstd/contrib/linux-kernel/squashfs-benchmark.sh39
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/Makefile49
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/include/asm/unaligned.h187
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/include/linux/compiler.h23
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/include/linux/errno.h15
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/include/linux/kernel.h19
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/include/linux/limits.h15
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/include/linux/math64.h15
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/include/linux/module.h20
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/include/linux/printk.h15
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/include/linux/stddef.h15
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/include/linux/swab.h16
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/include/linux/types.h16
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/include/linux/xxhash.h745
-rwxr-xr-x3rdparty/zstd/contrib/linux-kernel/test/macro-test.sh44
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/static_test.c52
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/test/test.c229
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/zstd_common_module.c29
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/zstd_compress_module.c164
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/zstd_decompress_module.c105
-rw-r--r--3rdparty/zstd/contrib/linux-kernel/zstd_deps.h125
-rw-r--r--3rdparty/zstd/contrib/match_finders/README.md42
-rw-r--r--3rdparty/zstd/contrib/match_finders/zstd_edist.c558
-rw-r--r--3rdparty/zstd/contrib/match_finders/zstd_edist.h70
-rw-r--r--3rdparty/zstd/contrib/premake/premake4.lua6
-rw-r--r--3rdparty/zstd/contrib/premake/zstd.lua80
-rw-r--r--3rdparty/zstd/contrib/pzstd/.gitignore2
-rw-r--r--3rdparty/zstd/contrib/pzstd/BUCK72
-rw-r--r--3rdparty/zstd/contrib/pzstd/ErrorHolder.h54
-rw-r--r--3rdparty/zstd/contrib/pzstd/Logging.h72
-rw-r--r--3rdparty/zstd/contrib/pzstd/Makefile268
-rw-r--r--3rdparty/zstd/contrib/pzstd/Options.cpp424
-rw-r--r--3rdparty/zstd/contrib/pzstd/Options.h71
-rw-r--r--3rdparty/zstd/contrib/pzstd/Pzstd.cpp618
-rw-r--r--3rdparty/zstd/contrib/pzstd/Pzstd.h153
-rw-r--r--3rdparty/zstd/contrib/pzstd/README.md56
-rw-r--r--3rdparty/zstd/contrib/pzstd/SkippableFrame.cpp30
-rw-r--r--3rdparty/zstd/contrib/pzstd/SkippableFrame.h64
-rw-r--r--3rdparty/zstd/contrib/pzstd/images/Cspeed.pngbin0 -> 69804 bytes-rw-r--r--3rdparty/zstd/contrib/pzstd/images/Dspeed.pngbin0 -> 26335 bytes-rw-r--r--3rdparty/zstd/contrib/pzstd/main.cpp27
-rw-r--r--3rdparty/zstd/contrib/pzstd/test/BUCK37
-rw-r--r--3rdparty/zstd/contrib/pzstd/test/OptionsTest.cpp536
-rw-r--r--3rdparty/zstd/contrib/pzstd/test/PzstdTest.cpp149
-rw-r--r--3rdparty/zstd/contrib/pzstd/test/RoundTrip.h86
-rw-r--r--3rdparty/zstd/contrib/pzstd/test/RoundTripTest.cpp86
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/BUCK75
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/Buffer.h99
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/FileSystem.h96
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/Likely.h28
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/Portability.h16
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/Range.h133
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/ResourcePool.h96
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/ScopeGuard.h50
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/ThreadPool.h58
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/WorkQueue.h181
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/test/BUCK35
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/test/BufferTest.cpp89
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/test/RangeTest.cpp82
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/test/ResourcePoolTest.cpp72
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/test/ScopeGuardTest.cpp28
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/test/ThreadPoolTest.cpp71
-rw-r--r--3rdparty/zstd/contrib/pzstd/utils/test/WorkQueueTest.cpp282
-rw-r--r--3rdparty/zstd/contrib/recovery/Makefile35
-rw-r--r--3rdparty/zstd/contrib/recovery/recover_directory.c152
-rw-r--r--3rdparty/zstd/contrib/seekable_format/README.md42
-rw-r--r--3rdparty/zstd/contrib/seekable_format/examples/.gitignore5
-rw-r--r--3rdparty/zstd/contrib/seekable_format/examples/Makefile53
-rw-r--r--3rdparty/zstd/contrib/seekable_format/examples/parallel_compression.c214
-rw-r--r--3rdparty/zstd/contrib/seekable_format/examples/parallel_processing.c194
-rw-r--r--3rdparty/zstd/contrib/seekable_format/examples/seekable_compression.c136
-rw-r--r--3rdparty/zstd/contrib/seekable_format/examples/seekable_decompression.c141
-rw-r--r--3rdparty/zstd/contrib/seekable_format/examples/seekable_decompression_mem.c147
-rw-r--r--3rdparty/zstd/contrib/seekable_format/tests/.gitignore1
-rw-r--r--3rdparty/zstd/contrib/seekable_format/tests/Makefile38
-rw-r--r--3rdparty/zstd/contrib/seekable_format/tests/seekable_tests.c363
-rw-r--r--3rdparty/zstd/contrib/seekable_format/zstd_seekable.h226
-rw-r--r--3rdparty/zstd/contrib/seekable_format/zstd_seekable_compression_format.md116
-rw-r--r--3rdparty/zstd/contrib/seekable_format/zstdseek_compress.c365
-rw-r--r--3rdparty/zstd/contrib/seekable_format/zstdseek_decompress.c595
-rw-r--r--3rdparty/zstd/contrib/seqBench/Makefile58
-rw-r--r--3rdparty/zstd/contrib/seqBench/seqBench.c53
-rw-r--r--3rdparty/zstd/contrib/snap/snapcraft.yaml28
-rw-r--r--3rdparty/zstd/examples/.gitignore15
-rw-r--r--3rdparty/zstd/examples/Makefile93
-rw-r--r--3rdparty/zstd/examples/README.md46
-rw-r--r--3rdparty/zstd/examples/common.h246
-rw-r--r--3rdparty/zstd/examples/dictionary_compression.c107
-rw-r--r--3rdparty/zstd/examples/dictionary_decompression.c99
-rw-r--r--3rdparty/zstd/examples/multiple_simple_compression.c116
-rw-r--r--3rdparty/zstd/examples/multiple_streaming_compression.c133
-rw-r--r--3rdparty/zstd/examples/simple_compression.c68
-rw-r--r--3rdparty/zstd/examples/simple_decompression.c65
-rw-r--r--3rdparty/zstd/examples/streaming_compression.c140
-rw-r--r--3rdparty/zstd/examples/streaming_compression_thread_pool.c180
-rw-r--r--3rdparty/zstd/examples/streaming_decompression.c100
-rw-r--r--3rdparty/zstd/examples/streaming_memory_usage.c137
-rw-r--r--3rdparty/zstd/lib/.gitignore3
-rw-r--r--3rdparty/zstd/lib/BUCK232
-rw-r--r--3rdparty/zstd/lib/Makefile357
-rw-r--r--3rdparty/zstd/lib/README.md224
-rw-r--r--3rdparty/zstd/lib/common/allocations.h55
-rw-r--r--3rdparty/zstd/lib/common/bits.h200
-rw-r--r--3rdparty/zstd/lib/common/bitstream.h437
-rw-r--r--3rdparty/zstd/lib/common/compiler.h358
-rw-r--r--3rdparty/zstd/lib/common/cpu.h213
-rw-r--r--3rdparty/zstd/lib/common/debug.c24
-rw-r--r--3rdparty/zstd/lib/common/debug.h107
-rw-r--r--3rdparty/zstd/lib/common/entropy_common.c340
-rw-r--r--3rdparty/zstd/lib/common/error_private.c63
-rw-r--r--3rdparty/zstd/lib/common/error_private.h159
-rw-r--r--3rdparty/zstd/lib/common/fse.h639
-rw-r--r--3rdparty/zstd/lib/common/fse_decompress.c311
-rw-r--r--3rdparty/zstd/lib/common/huf.h273
-rw-r--r--3rdparty/zstd/lib/common/mem.h435
-rw-r--r--3rdparty/zstd/lib/common/pool.c371
-rw-r--r--3rdparty/zstd/lib/common/pool.h90
-rw-r--r--3rdparty/zstd/lib/common/portability_macros.h156
-rw-r--r--3rdparty/zstd/lib/common/threading.c176
-rw-r--r--3rdparty/zstd/lib/common/threading.h150
-rw-r--r--3rdparty/zstd/lib/common/xxhash.c24
-rw-r--r--3rdparty/zstd/lib/common/xxhash.h5686
-rw-r--r--3rdparty/zstd/lib/common/zstd_common.c48
-rw-r--r--3rdparty/zstd/lib/common/zstd_deps.h111
-rw-r--r--3rdparty/zstd/lib/common/zstd_internal.h392
-rw-r--r--3rdparty/zstd/lib/common/zstd_trace.h163
-rw-r--r--3rdparty/zstd/lib/compress/clevels.h134
-rw-r--r--3rdparty/zstd/lib/compress/fse_compress.c624
-rw-r--r--3rdparty/zstd/lib/compress/hist.c181
-rw-r--r--3rdparty/zstd/lib/compress/hist.h75
-rw-r--r--3rdparty/zstd/lib/compress/huf_compress.c1435
-rw-r--r--3rdparty/zstd/lib/compress/zstd_compress.c7032
-rw-r--r--3rdparty/zstd/lib/compress/zstd_compress_internal.h1532
-rw-r--r--3rdparty/zstd/lib/compress/zstd_compress_literals.c235
-rw-r--r--3rdparty/zstd/lib/compress/zstd_compress_literals.h39
-rw-r--r--3rdparty/zstd/lib/compress/zstd_compress_sequences.c442
-rw-r--r--3rdparty/zstd/lib/compress/zstd_compress_sequences.h54
-rw-r--r--3rdparty/zstd/lib/compress/zstd_compress_superblock.c577
-rw-r--r--3rdparty/zstd/lib/compress/zstd_compress_superblock.h32
-rw-r--r--3rdparty/zstd/lib/compress/zstd_cwksp.h742
-rw-r--r--3rdparty/zstd/lib/compress/zstd_double_fast.c758
-rw-r--r--3rdparty/zstd/lib/compress/zstd_double_fast.h39
-rw-r--r--3rdparty/zstd/lib/compress/zstd_fast.c960
-rw-r--r--3rdparty/zstd/lib/compress/zstd_fast.h38
-rw-r--r--3rdparty/zstd/lib/compress/zstd_lazy.c2157
-rw-r--r--3rdparty/zstd/lib/compress/zstd_lazy.h127
-rw-r--r--3rdparty/zstd/lib/compress/zstd_ldm.c724
-rw-r--r--3rdparty/zstd/lib/compress/zstd_ldm.h117
-rw-r--r--3rdparty/zstd/lib/compress/zstd_ldm_geartab.h106
-rw-r--r--3rdparty/zstd/lib/compress/zstd_opt.c1472
-rw-r--r--3rdparty/zstd/lib/compress/zstd_opt.h56
-rw-r--r--3rdparty/zstd/lib/compress/zstdmt_compress.c1867
-rw-r--r--3rdparty/zstd/lib/compress/zstdmt_compress.h113
-rw-r--r--3rdparty/zstd/lib/decompress/huf_decompress.c1882
-rw-r--r--3rdparty/zstd/lib/decompress/huf_decompress_amd64.S576
-rw-r--r--3rdparty/zstd/lib/decompress/zstd_ddict.c244
-rw-r--r--3rdparty/zstd/lib/decompress/zstd_ddict.h44
-rw-r--r--3rdparty/zstd/lib/decompress/zstd_decompress.c2355
-rw-r--r--3rdparty/zstd/lib/decompress/zstd_decompress_block.c2192
-rw-r--r--3rdparty/zstd/lib/decompress/zstd_decompress_block.h73
-rw-r--r--3rdparty/zstd/lib/decompress/zstd_decompress_internal.h238
-rw-r--r--3rdparty/zstd/lib/deprecated/zbuff.h214
-rw-r--r--3rdparty/zstd/lib/deprecated/zbuff_common.c26
-rw-r--r--3rdparty/zstd/lib/deprecated/zbuff_compress.c167
-rw-r--r--3rdparty/zstd/lib/deprecated/zbuff_decompress.c77
-rw-r--r--3rdparty/zstd/lib/dictBuilder/cover.c1257
-rw-r--r--3rdparty/zstd/lib/dictBuilder/cover.h158
-rw-r--r--3rdparty/zstd/lib/dictBuilder/divsufsort.c1913
-rw-r--r--3rdparty/zstd/lib/dictBuilder/divsufsort.h67
-rw-r--r--3rdparty/zstd/lib/dictBuilder/fastcover.c766
-rw-r--r--3rdparty/zstd/lib/dictBuilder/zdict.c1127
-rw-r--r--3rdparty/zstd/lib/dll/example/Makefile48
-rw-r--r--3rdparty/zstd/lib/dll/example/README.md63
-rw-r--r--3rdparty/zstd/lib/dll/example/build_package.bat20
-rw-r--r--3rdparty/zstd/lib/dll/example/fullbench-dll.sln25
-rw-r--r--3rdparty/zstd/lib/dll/example/fullbench-dll.vcxproj181
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_legacy.h422
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v01.c2125
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v01.h94
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v02.c3477
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v02.h93
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v03.c3117
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v03.h93
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v04.c3605
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v04.h142
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v05.c4004
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v05.h162
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v06.c4113
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v06.h172
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v07.c4498
-rw-r--r--3rdparty/zstd/lib/legacy/zstd_v07.h187
-rw-r--r--3rdparty/zstd/lib/libzstd.mk214
-rw-r--r--3rdparty/zstd/lib/libzstd.pc.in16
-rw-r--r--3rdparty/zstd/lib/module.modulemap35
-rw-r--r--3rdparty/zstd/lib/zdict.h474
-rw-r--r--3rdparty/zstd/lib/zstd.h3020
-rw-r--r--3rdparty/zstd/lib/zstd_errors.h114
-rw-r--r--3rdparty/zstd/programs/.gitignore39
-rw-r--r--3rdparty/zstd/programs/BUCK44
-rw-r--r--3rdparty/zstd/programs/Makefile446
-rw-r--r--3rdparty/zstd/programs/README.md302
-rw-r--r--3rdparty/zstd/programs/benchfn.c256
-rw-r--r--3rdparty/zstd/programs/benchfn.h183
-rw-r--r--3rdparty/zstd/programs/benchzstd.c914
-rw-r--r--3rdparty/zstd/programs/benchzstd.h196
-rw-r--r--3rdparty/zstd/programs/datagen.c186
-rw-r--r--3rdparty/zstd/programs/datagen.h30
-rw-r--r--3rdparty/zstd/programs/dibio.c440
-rw-r--r--3rdparty/zstd/programs/dibio.h39
-rw-r--r--3rdparty/zstd/programs/fileio.c3364
-rw-r--r--3rdparty/zstd/programs/fileio.h181
-rw-r--r--3rdparty/zstd/programs/fileio_asyncio.c663
-rw-r--r--3rdparty/zstd/programs/fileio_asyncio.h203
-rw-r--r--3rdparty/zstd/programs/fileio_common.h125
-rw-r--r--3rdparty/zstd/programs/fileio_types.h86
-rw-r--r--3rdparty/zstd/programs/platform.h219
-rw-r--r--3rdparty/zstd/programs/timefn.c168
-rw-r--r--3rdparty/zstd/programs/timefn.h70
-rw-r--r--3rdparty/zstd/programs/util.c1640
-rw-r--r--3rdparty/zstd/programs/util.h359
-rw-r--r--3rdparty/zstd/programs/windres/verrsrc.h17
-rw-r--r--3rdparty/zstd/programs/windres/zstd.rc51
-rw-r--r--3rdparty/zstd/programs/windres/zstd32.resbin0 -> 1044 bytes-rw-r--r--3rdparty/zstd/programs/windres/zstd64.resbin0 -> 1044 bytes-rw-r--r--3rdparty/zstd/programs/zstd.1381
-rw-r--r--3rdparty/zstd/programs/zstd.1.md672
-rw-r--r--3rdparty/zstd/programs/zstdcli.c1617
-rw-r--r--3rdparty/zstd/programs/zstdcli_trace.c172
-rw-r--r--3rdparty/zstd/programs/zstdcli_trace.h24
-rwxr-xr-x3rdparty/zstd/programs/zstdgrep134
-rw-r--r--3rdparty/zstd/programs/zstdgrep.117
-rw-r--r--3rdparty/zstd/programs/zstdgrep.1.md30
-rwxr-xr-x3rdparty/zstd/programs/zstdless8
-rw-r--r--3rdparty/zstd/programs/zstdless.19
-rw-r--r--3rdparty/zstd/programs/zstdless.1.md16
-rw-r--r--3rdparty/zstd/tests/.gitignore69
-rwxr-xr-x3rdparty/zstd/tests/DEPRECATED-test-zstd-speed.py378
-rw-r--r--3rdparty/zstd/tests/Makefile468
-rw-r--r--3rdparty/zstd/tests/README.md184
-rw-r--r--3rdparty/zstd/tests/automated_benchmarking.py326
-rw-r--r--3rdparty/zstd/tests/bigdict.c128
-rw-r--r--3rdparty/zstd/tests/checkTag.c65
-rwxr-xr-x3rdparty/zstd/tests/check_size.py31
-rw-r--r--3rdparty/zstd/tests/cli-tests/.gitignore6
-rw-r--r--3rdparty/zstd/tests/cli-tests/README.md258
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/basic/help.sh10
-rw-r--r--3rdparty/zstd/tests/cli-tests/basic/help.sh.stdout.glob34
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/basic/memlimit.sh40
-rw-r--r--3rdparty/zstd/tests/cli-tests/basic/memlimit.sh.stderr.exact13
-rw-r--r--3rdparty/zstd/tests/cli-tests/basic/memlimit.sh.stdout.exact13
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/basic/output_dir.sh7
-rw-r--r--3rdparty/zstd/tests/cli-tests/basic/output_dir.sh.stderr.exact2
-rw-r--r--3rdparty/zstd/tests/cli-tests/basic/output_dir.sh.stdout.exact2
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/basic/version.sh6
-rw-r--r--3rdparty/zstd/tests/cli-tests/basic/version.sh.stdout.glob2
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/bin/cmp_size44
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/bin/datagen3
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/bin/die4
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/bin/println2
l---------3rdparty/zstd/tests/cli-tests/bin/unzstd1
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/bin/zstd9
l---------3rdparty/zstd/tests/cli-tests/bin/zstdcat1
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/bin/zstdgrep2
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/bin/zstdless2
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/cltools/setup6
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/cltools/zstdgrep.sh8
-rw-r--r--3rdparty/zstd/tests/cli-tests/cltools/zstdgrep.sh.exit1
-rw-r--r--3rdparty/zstd/tests/cli-tests/cltools/zstdgrep.sh.stderr.exact1
-rw-r--r--3rdparty/zstd/tests/cli-tests/cltools/zstdgrep.sh.stdout.glob4
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/cltools/zstdless.sh10
-rw-r--r--3rdparty/zstd/tests/cli-tests/cltools/zstdless.sh.stderr.exact2
-rw-r--r--3rdparty/zstd/tests/cli-tests/cltools/zstdless.sh.stdout.glob5
-rw-r--r--3rdparty/zstd/tests/cli-tests/common/format.sh19
-rw-r--r--3rdparty/zstd/tests/cli-tests/common/mtime.sh13
-rw-r--r--3rdparty/zstd/tests/cli-tests/common/permissions.sh18
-rw-r--r--3rdparty/zstd/tests/cli-tests/common/platform.sh37
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/adapt.sh14
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/basic.sh36
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/compress-literals.sh10
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/format.sh16
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/golden.sh16
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/gzip-compat.sh17
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/levels.sh62
-rw-r--r--3rdparty/zstd/tests/cli-tests/compression/levels.sh.stderr.exact69
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/long-distance-matcher.sh7
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/multi-threaded.sh15
-rw-r--r--3rdparty/zstd/tests/cli-tests/compression/multi-threaded.sh.stderr.exact11
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/multiple-files.sh21
-rw-r--r--3rdparty/zstd/tests/cli-tests/compression/multiple-files.sh.stdout.exact12
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/row-match-finder.sh7
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/setup7
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/stream-size.sh7
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/verbose-wlog.sh11
-rw-r--r--3rdparty/zstd/tests/cli-tests/compression/verbose-wlog.sh.stderr.glob5
-rw-r--r--3rdparty/zstd/tests/cli-tests/compression/verbose-wlog.sh.stdout.glob5
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/compression/window-resize.sh9
-rw-r--r--3rdparty/zstd/tests/cli-tests/compression/window-resize.sh.stderr.ignore0
-rw-r--r--3rdparty/zstd/tests/cli-tests/compression/window-resize.sh.stdout.glob3
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/decompression/golden.sh7
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/decompression/pass-through.sh57
-rw-r--r--3rdparty/zstd/tests/cli-tests/decompression/pass-through.sh.stderr.exact11
-rw-r--r--3rdparty/zstd/tests/cli-tests/decompression/pass-through.sh.stdout.exact25
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/dict-builder/empty-input.sh9
-rw-r--r--3rdparty/zstd/tests/cli-tests/dict-builder/empty-input.sh.stderr.exact1
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/dict-builder/no-inputs.sh3
-rw-r--r--3rdparty/zstd/tests/cli-tests/dict-builder/no-inputs.sh.exit1
-rw-r--r--3rdparty/zstd/tests/cli-tests/dict-builder/no-inputs.sh.stderr.exact5
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/dictionaries/dictionary-mismatch.sh29
-rw-r--r--3rdparty/zstd/tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact7
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/dictionaries/golden.sh9
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/dictionaries/setup6
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/dictionaries/setup_once24
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/file-stat/compress-file-to-dir-without-write-perm.sh12
-rw-r--r--3rdparty/zstd/tests/cli-tests/file-stat/compress-file-to-dir-without-write-perm.sh.stderr.exact26
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/file-stat/compress-file-to-file.sh9
-rw-r--r--3rdparty/zstd/tests/cli-tests/file-stat/compress-file-to-file.sh.stderr.exact42
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/file-stat/compress-file-to-stdout.sh8
-rw-r--r--3rdparty/zstd/tests/cli-tests/file-stat/compress-file-to-stdout.sh.stderr.exact24
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/file-stat/compress-stdin-to-file.sh8
-rw-r--r--3rdparty/zstd/tests/cli-tests/file-stat/compress-stdin-to-file.sh.stderr.exact24
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/file-stat/compress-stdin-to-stdout.sh8
-rw-r--r--3rdparty/zstd/tests/cli-tests/file-stat/compress-stdin-to-stdout.sh.stderr.exact18
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/file-stat/decompress-file-to-file.sh8
-rw-r--r--3rdparty/zstd/tests/cli-tests/file-stat/decompress-file-to-file.sh.stderr.exact38
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/file-stat/decompress-file-to-stdout.sh7
-rw-r--r--3rdparty/zstd/tests/cli-tests/file-stat/decompress-file-to-stdout.sh.stderr.exact18
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/file-stat/decompress-stdin-to-file.sh7
-rw-r--r--3rdparty/zstd/tests/cli-tests/file-stat/decompress-stdin-to-file.sh.stderr.exact20
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh7
-rw-r--r--3rdparty/zstd/tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh.stderr.exact14
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/progress/no-progress.sh46
-rw-r--r--3rdparty/zstd/tests/cli-tests/progress/no-progress.sh.stderr.glob96
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/progress/progress.sh41
-rw-r--r--3rdparty/zstd/tests/cli-tests/progress/progress.sh.stderr.glob62
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/run.py731
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/zstd-symlinks/setup6
-rwxr-xr-x3rdparty/zstd/tests/cli-tests/zstd-symlinks/zstdcat.sh12
-rw-r--r--3rdparty/zstd/tests/cli-tests/zstd-symlinks/zstdcat.sh.stdout.exact8
-rw-r--r--3rdparty/zstd/tests/datagencli.c130
-rw-r--r--3rdparty/zstd/tests/decodecorpus.c1936
-rw-r--r--3rdparty/zstd/tests/dict-files/zero-weight-dictbin0 -> 153 bytes-rw-r--r--3rdparty/zstd/tests/external_matchfinder.c140
-rw-r--r--3rdparty/zstd/tests/external_matchfinder.h39
-rw-r--r--3rdparty/zstd/tests/fullbench.c968
-rw-r--r--3rdparty/zstd/tests/fuzz/.gitignore29
-rw-r--r--3rdparty/zstd/tests/fuzz/Makefile270
-rw-r--r--3rdparty/zstd/tests/fuzz/README.md119
-rw-r--r--3rdparty/zstd/tests/fuzz/block_decompress.c53
-rw-r--r--3rdparty/zstd/tests/fuzz/block_round_trip.c103
-rw-r--r--3rdparty/zstd/tests/fuzz/decompress_dstSize_tooSmall.c74
-rw-r--r--3rdparty/zstd/tests/fuzz/dictionary_decompress.c77
-rw-r--r--3rdparty/zstd/tests/fuzz/dictionary_loader.c106
-rw-r--r--3rdparty/zstd/tests/fuzz/dictionary_round_trip.c155
-rw-r--r--3rdparty/zstd/tests/fuzz/dictionary_stream_round_trip.c209
-rw-r--r--3rdparty/zstd/tests/fuzz/fse_read_ncount.c100
-rw-r--r--3rdparty/zstd/tests/fuzz/fuzz.h57
-rwxr-xr-x3rdparty/zstd/tests/fuzz/fuzz.py905
-rw-r--r--3rdparty/zstd/tests/fuzz/fuzz_data_producer.c95
-rw-r--r--3rdparty/zstd/tests/fuzz/fuzz_data_producer.h66
-rw-r--r--3rdparty/zstd/tests/fuzz/fuzz_helpers.c48
-rw-r--r--3rdparty/zstd/tests/fuzz/fuzz_helpers.h81
-rw-r--r--3rdparty/zstd/tests/fuzz/fuzz_third_party_seq_prod.h116
-rw-r--r--3rdparty/zstd/tests/fuzz/huf_decompress.c68
-rw-r--r--3rdparty/zstd/tests/fuzz/huf_round_trip.c137
-rw-r--r--3rdparty/zstd/tests/fuzz/raw_dictionary_round_trip.c119
-rw-r--r--3rdparty/zstd/tests/fuzz/regression_driver.c89
-rw-r--r--3rdparty/zstd/tests/fuzz/seekable_roundtrip.c88
-rw-r--r--3rdparty/zstd/tests/fuzz/seq_prod_fuzz_example/Makefile16
-rw-r--r--3rdparty/zstd/tests/fuzz/seq_prod_fuzz_example/README.md12
-rw-r--r--3rdparty/zstd/tests/fuzz/seq_prod_fuzz_example/example_seq_prod.c52
-rw-r--r--3rdparty/zstd/tests/fuzz/sequence_compression_api.c381
-rw-r--r--3rdparty/zstd/tests/fuzz/simple_compress.c60
-rw-r--r--3rdparty/zstd/tests/fuzz/simple_decompress.c49
-rw-r--r--3rdparty/zstd/tests/fuzz/simple_round_trip.c172
-rw-r--r--3rdparty/zstd/tests/fuzz/stream_decompress.c119
-rw-r--r--3rdparty/zstd/tests/fuzz/stream_round_trip.c198
-rw-r--r--3rdparty/zstd/tests/fuzz/zstd_frame_info.c43
-rw-r--r--3rdparty/zstd/tests/fuzz/zstd_helpers.c207
-rw-r--r--3rdparty/zstd/tests/fuzz/zstd_helpers.h56
-rw-r--r--3rdparty/zstd/tests/fuzzer.c4876
-rw-r--r--3rdparty/zstd/tests/golden-compression/PR-3517-block-splitter-corruption-test1
-rw-r--r--3rdparty/zstd/tests/golden-compression/http1
-rw-r--r--3rdparty/zstd/tests/golden-compression/huffman-compressed-largerbin0 -> 143 bytes-rw-r--r--3rdparty/zstd/tests/golden-compression/large-literal-and-match-lengthsbin0 -> 199998 bytes-rw-r--r--3rdparty/zstd/tests/golden-dictionaries/http-dict-missing-symbolsbin0 -> 1000 bytes-rw-r--r--3rdparty/zstd/tests/gzip/Makefile45
-rwxr-xr-x3rdparty/zstd/tests/gzip/gzip-env.sh46
-rw-r--r--3rdparty/zstd/tests/gzip/helin-segv.sh31
-rw-r--r--3rdparty/zstd/tests/gzip/help-version.sh270
-rw-r--r--3rdparty/zstd/tests/gzip/hufts-segv.gzbin0 -> 425 bytes-rw-r--r--3rdparty/zstd/tests/gzip/hufts.sh34
-rw-r--r--3rdparty/zstd/tests/gzip/init.cfg5
-rw-r--r--3rdparty/zstd/tests/gzip/init.sh616
-rw-r--r--3rdparty/zstd/tests/gzip/keep.sh51
-rw-r--r--3rdparty/zstd/tests/gzip/list.sh31
-rw-r--r--3rdparty/zstd/tests/gzip/memcpy-abuse.sh34
-rw-r--r--3rdparty/zstd/tests/gzip/mixed.sh68
-rw-r--r--3rdparty/zstd/tests/gzip/null-suffix-clobber.sh35
-rw-r--r--3rdparty/zstd/tests/gzip/stdin.sh31
-rw-r--r--3rdparty/zstd/tests/gzip/test-driver.sh150
-rw-r--r--3rdparty/zstd/tests/gzip/trailing-nul.sh37
-rw-r--r--3rdparty/zstd/tests/gzip/unpack-invalid.sh36
-rw-r--r--3rdparty/zstd/tests/gzip/z-suffix.sh30
-rw-r--r--3rdparty/zstd/tests/gzip/zdiff.sh48
-rw-r--r--3rdparty/zstd/tests/gzip/zgrep-context.sh47
-rw-r--r--3rdparty/zstd/tests/gzip/zgrep-f.sh43
-rw-r--r--3rdparty/zstd/tests/gzip/zgrep-signal.sh64
-rw-r--r--3rdparty/zstd/tests/gzip/znew-k.sh40
-rw-r--r--3rdparty/zstd/tests/invalidDictionaries.c61
-rw-r--r--3rdparty/zstd/tests/legacy.c260
-rwxr-xr-x3rdparty/zstd/tests/libzstd_builds.sh104
-rw-r--r--3rdparty/zstd/tests/longmatch.c102
-rw-r--r--3rdparty/zstd/tests/paramgrill.c2966
-rwxr-xr-x3rdparty/zstd/tests/playTests.sh1828
-rw-r--r--3rdparty/zstd/tests/poolTests.c271
-rwxr-xr-x3rdparty/zstd/tests/rateLimiter.py41
-rw-r--r--3rdparty/zstd/tests/regression/.gitignore4
-rw-r--r--3rdparty/zstd/tests/regression/Makefile60
-rw-r--r--3rdparty/zstd/tests/regression/README.md28
-rw-r--r--3rdparty/zstd/tests/regression/config.c404
-rw-r--r--3rdparty/zstd/tests/regression/config.h91
-rw-r--r--3rdparty/zstd/tests/regression/data.c631
-rw-r--r--3rdparty/zstd/tests/regression/data.h121
-rw-r--r--3rdparty/zstd/tests/regression/levels.h59
-rw-r--r--3rdparty/zstd/tests/regression/method.c701
-rw-r--r--3rdparty/zstd/tests/regression/method.h65
-rw-r--r--3rdparty/zstd/tests/regression/result.c28
-rw-r--r--3rdparty/zstd/tests/regression/result.h103
-rw-r--r--3rdparty/zstd/tests/regression/results.csv1480
-rw-r--r--3rdparty/zstd/tests/regression/test.c362
-rw-r--r--3rdparty/zstd/tests/roundTripCrash.c241
-rw-r--r--3rdparty/zstd/tests/seqgen.c260
-rw-r--r--3rdparty/zstd/tests/seqgen.h58
-rwxr-xr-x3rdparty/zstd/tests/test-license.py156
-rwxr-xr-x3rdparty/zstd/tests/test-variants.sh115
-rwxr-xr-x3rdparty/zstd/tests/test-zstd-versions.py308
-rw-r--r--3rdparty/zstd/tests/zstreamtest.c3236
-rw-r--r--3rdparty/zstd/zlibWrapper/.gitignore28
-rw-r--r--3rdparty/zstd/zlibWrapper/BUCK22
-rw-r--r--3rdparty/zstd/zlibWrapper/Makefile120
-rw-r--r--3rdparty/zstd/zlibWrapper/README.md163
-rw-r--r--3rdparty/zstd/zlibWrapper/examples/example.c629
-rw-r--r--3rdparty/zstd/zlibWrapper/examples/example_original.c618
-rw-r--r--3rdparty/zstd/zlibWrapper/examples/fitblk.c254
-rw-r--r--3rdparty/zstd/zlibWrapper/examples/fitblk_original.c233
-rw-r--r--3rdparty/zstd/zlibWrapper/examples/minigzip.c640
-rw-r--r--3rdparty/zstd/zlibWrapper/examples/zwrapbench.c1018
-rw-r--r--3rdparty/zstd/zlibWrapper/gzclose.c28
-rw-r--r--3rdparty/zstd/zlibWrapper/gzcompatibility.h68
-rw-r--r--3rdparty/zstd/zlibWrapper/gzguts.h229
-rw-r--r--3rdparty/zstd/zlibWrapper/gzlib.c640
-rw-r--r--3rdparty/zstd/zlibWrapper/gzread.c678
-rw-r--r--3rdparty/zstd/zlibWrapper/gzwrite.c671
-rw-r--r--3rdparty/zstd/zlibWrapper/zstd_zlibwrapper.c1200
-rw-r--r--3rdparty/zstd/zlibWrapper/zstd_zlibwrapper.h91
-rw-r--r--CONTRIBUTING.md4
-rw-r--r--COPYING293
-rw-r--r--README.md101
-rw-r--r--android-project/.gitignore8
-rw-r--r--android-project/LICENSE29
-rw-r--r--android-project/README.md9
-rw-r--r--android-project/app/build.gradle46
-rw-r--r--android-project/app/src/main/AndroidManifest.xml103
-rw-r--r--android-project/app/src/main/assets/.gitignore2
-rw-r--r--android-project/app/src/main/java/org/libsdl/app/HIDDevice.java24
-rw-r--r--android-project/app/src/main/java/org/libsdl/app/HIDDeviceBLESteamController.java652
-rw-r--r--android-project/app/src/main/java/org/libsdl/app/HIDDeviceManager.java681
-rw-r--r--android-project/app/src/main/java/org/libsdl/app/HIDDeviceUSB.java311
-rw-r--r--android-project/app/src/main/java/org/libsdl/app/SDL.java87
-rw-r--r--android-project/app/src/main/java/org/libsdl/app/SDLActivity.java2105
-rw-r--r--android-project/app/src/main/java/org/libsdl/app/SDLAudioManager.java396
-rw-r--r--android-project/app/src/main/java/org/libsdl/app/SDLControllerManager.java793
-rw-r--r--android-project/app/src/main/java/org/libsdl/app/SDLSurface.java407
-rw-r--r--android-project/app/src/main/java/org/mamedev/mame/MAME.java85
-rw-r--r--android-project/app/src/main/libs/arm64-v8a/.gitignore1
-rw-r--r--android-project/app/src/main/libs/armeabi-v7a/.gitignore1
-rw-r--r--android-project/app/src/main/libs/x86/.gitignore1
-rw-r--r--android-project/app/src/main/libs/x86_64/.gitignore1
-rw-r--r--android-project/app/src/main/res/drawable-hdpi/ic_launcher.pngbin0 -> 1810 bytes-rw-r--r--android-project/app/src/main/res/drawable-mdpi/ic_launcher.pngbin0 -> 1418 bytes-rw-r--r--android-project/app/src/main/res/drawable-xhdpi/ic_launcher.pngbin0 -> 2629 bytes-rw-r--r--android-project/app/src/main/res/drawable-xxhdpi/ic_launcher.pngbin0 -> 3923 bytes-rw-r--r--android-project/app/src/main/res/drawable-xxxhdpi/ic_launcher.pngbin0 -> 4579 bytes-rw-r--r--android-project/app/src/main/res/layout/main.xml13
-rw-r--r--android-project/app/src/main/res/values/colors.xml6
-rw-r--r--android-project/app/src/main/res/values/strings.xml4
-rw-r--r--android-project/app/src/main/res/values/styles.xml8
-rw-r--r--android-project/build.gradle17
-rw-r--r--android-project/gradle.properties1
-rw-r--r--android-project/gradle/wrapper/gradle-wrapper.jarbin0 -> 54413 bytes-rw-r--r--android-project/gradle/wrapper/gradle-wrapper.properties6
-rwxr-xr-xandroid-project/gradlew172
-rw-r--r--android-project/gradlew.bat84
-rw-r--r--android-project/settings.gradle3
-rw-r--r--artwork/LICENSE116
-rw-r--r--artwork/README.md5
-rw-r--r--artwork/aperture-grille.pngbin0 -> 19734 bytes-rw-r--r--artwork/aperture.pngbin0 -> 271 bytes-rw-r--r--artwork/aperture1x2rb.pngbin0 -> 172 bytes-rw-r--r--artwork/aperture1x3rb.pngbin0 -> 175 bytes-rw-r--r--artwork/aperture2x4bg.pngbin0 -> 176 bytes-rw-r--r--artwork/aperture2x4rb.pngbin0 -> 171 bytes-rw-r--r--artwork/aperture4x6.pngbin0 -> 224 bytes-rw-r--r--artwork/bgfx/border_blur/default.lay25
-rw-r--r--artwork/bgfx/chains/crt-geom/add_alpha.py33
-rw-r--r--artwork/bgfx/chains/crt-geom/aperture_1_2_bgr.pngbin0 -> 74 bytes-rw-r--r--artwork/bgfx/chains/crt-geom/aperture_1_4_rgb.pngbin0 -> 78 bytes-rw-r--r--artwork/bgfx/chains/crt-geom/aperture_2_4_rgb.pngbin0 -> 78 bytes-rw-r--r--artwork/bgfx/chains/crt-geom/aperture_2_5_bgr.pngbin0 -> 82 bytes-rw-r--r--artwork/bgfx/chains/crt-geom/aperture_3_6_rgb.pngbin0 -> 82 bytes-rw-r--r--artwork/bgfx/chains/crt-geom/delta_1_2x1_bgr.pngbin0 -> 83 bytes-rw-r--r--artwork/bgfx/chains/crt-geom/delta_1_4x1_rgb.pngbin0 -> 87 bytes-rw-r--r--artwork/bgfx/chains/crt-geom/delta_2_4x1_rgb.pngbin0 -> 86 bytes-rw-r--r--artwork/bgfx/chains/crt-geom/delta_2_4x2_rgb.pngbin0 -> 91 bytes-rw-r--r--artwork/bgfx/chains/crt-geom/none.pngbin0 -> 70 bytes-rw-r--r--artwork/bgfx/chains/crt-geom/slot_2_4x4_rgb.pngbin0 -> 99 bytes-rw-r--r--artwork/bgfx/chains/crt-geom/slot_2_5x4_bgr.pngbin0 -> 107 bytes-rw-r--r--artwork/bgfx/chains/crt-geom/slot_3_7x6_rgb.pngbin0 -> 109 bytes-rw-r--r--artwork/bgfx/chains/hq2x.pngbin0 -> 2793 bytes-rw-r--r--artwork/bgfx/chains/hq3x.pngbin0 -> 4665 bytes-rw-r--r--artwork/bgfx/chains/hq4x.pngbin0 -> 11913 bytes-rw-r--r--artwork/chess/README.md5
-rw-r--r--artwork/chess/bb.svg12
-rw-r--r--artwork/chess/bk.svg12
-rw-r--r--artwork/chess/bn.svg22
-rw-r--r--artwork/chess/bp.svg5
-rw-r--r--artwork/chess/bq.svg27
-rw-r--r--artwork/chess/br.svg39
-rw-r--r--artwork/chess/wb.svg12
-rw-r--r--artwork/chess/wk.svg13
-rw-r--r--artwork/chess/wn.svg19
-rw-r--r--artwork/chess/wp.svg5
-rw-r--r--artwork/chess/wq.svg15
-rw-r--r--artwork/chess/wr.svg25
-rw-r--r--artwork/dir.txt1
-rw-r--r--artwork/lut-default.pngbin0 -> 2025 bytes-rw-r--r--artwork/monochrome-chessboard.pngbin0 -> 23358 bytes-rw-r--r--artwork/monochrome-matrix.pngbin0 -> 33047 bytes-rw-r--r--artwork/scanlines.pngbin0 -> 296 bytes-rw-r--r--artwork/shadow-mask.pngbin0 -> 20397 bytes-rw-r--r--artwork/slot-mask-aligned.pngbin0 -> 26638 bytes-rw-r--r--artwork/slot-mask.pngbin0 -> 19768 bytes-rw-r--r--artwork/white.pngbin0 -> 122 bytes-rw-r--r--attic/fd1094dp.cpp589
-rw-r--r--attic/fddebug.cpp2439
-rw-r--r--attic/fddebug.h5
-rw-r--r--attic/jalmah.x68147
-rw-r--r--attic/jrcrypt.cpp530
-rw-r--r--attic/opwolf_cchip.txt1228
-rw-r--r--attic/unkfr.cpp752
-rw-r--r--benchmarks/LICENSE27
-rw-r--r--benchmarks/README.md5
-rw-r--r--benchmarks/eminline_native.cpp13
-rw-r--r--benchmarks/eminline_noasm.cpp21
-rw-r--r--benchmarks/main.cpp3
-rw-r--r--bgfx/LICENSE27
-rw-r--r--bgfx/README.md5
-rw-r--r--bgfx/chains/Fighters.json272
-rw-r--r--bgfx/chains/LICENSE27
-rw-r--r--bgfx/chains/README.md5
-rw-r--r--bgfx/chains/crt-geom-deluxe.json374
-rw-r--r--bgfx/chains/crt-geom.json193
-rw-r--r--bgfx/chains/default.json26
-rw-r--r--bgfx/chains/eagle/super-eagle.json44
-rw-r--r--bgfx/chains/hlsl.json585
-rw-r--r--bgfx/chains/hqx/hq2x.json61
-rw-r--r--bgfx/chains/hqx/hq3x.json61
-rw-r--r--bgfx/chains/hqx/hq4x.json61
-rw-r--r--bgfx/chains/lcd-grid.json147
-rw-r--r--bgfx/chains/lut.json36
-rw-r--r--bgfx/chains/pillarbox_left_horizontal.json103
-rw-r--r--bgfx/chains/pillarbox_left_vertical.json103
-rw-r--r--bgfx/chains/pillarbox_right_horizontal.json103
-rw-r--r--bgfx/chains/pillarbox_right_vertical.json103
-rw-r--r--bgfx/chains/unfiltered.json12
-rw-r--r--bgfx/chains/xbr/super-2xbr-3d-2p.json69
-rw-r--r--bgfx/chains/xbr/super-2xbr-3d-3p-smoother.json78
-rw-r--r--bgfx/chains/xbr/super-4xbr-3d-4p.json86
-rw-r--r--bgfx/chains/xbr/super-4xbr-3d-6p-smoother.json86
-rw-r--r--bgfx/chains/xbr/super-xbr-2p.json76
-rw-r--r--bgfx/chains/xbr/super-xbr-3p-smoother.json84
-rw-r--r--bgfx/chains/xbr/super-xbr-6p.json123
-rw-r--r--bgfx/chains/xbr/super-xbr-deposterize.json98
-rw-r--r--bgfx/chains/xbr/super-xbr-fast-3p.json76
-rw-r--r--bgfx/chains/xbr/super-xbr-fast-6p.json113
-rw-r--r--bgfx/chains/xbr/xbr-hybrid.json48
-rw-r--r--bgfx/chains/xbr/xbr-lv1-noblend.json42
-rw-r--r--bgfx/chains/xbr/xbr-lv2-3d.json42
-rw-r--r--bgfx/chains/xbr/xbr-lv2-accuracy-multipass.json59
-rw-r--r--bgfx/chains/xbr/xbr-lv2-accuracy-smart-blur.json47
-rw-r--r--bgfx/chains/xbr/xbr-lv2-deposterize.json41
-rw-r--r--bgfx/chains/xbr/xbr-lv2-fast.json42
-rw-r--r--bgfx/chains/xbr/xbr-lv2-multipass.json61
-rw-r--r--bgfx/chains/xbr/xbr-lv2-noblend.json42
-rw-r--r--bgfx/chains/xbr/xbr-lv2.json42
-rw-r--r--bgfx/chains/xbr/xbr-lv3-multipass.json60
-rw-r--r--bgfx/chains/xbr/xbr-lv3-noblend.json42
-rw-r--r--bgfx/chains/xbr/xbr-lv3.json42
-rw-r--r--bgfx/chains/xbr/xbr-mlv4-dilation.json98
-rw-r--r--bgfx/chains/xbr/xbr-mlv4-multipass.json83
-rw-r--r--bgfx/effects/LICENSE27
-rw-r--r--bgfx/effects/README.md5
-rw-r--r--bgfx/effects/blurs/smart-blur.json56
-rw-r--r--bgfx/effects/crt-geom/crt-geom-deluxe.json53
-rw-r--r--bgfx/effects/crt-geom/crt-geom.json48
-rw-r--r--bgfx/effects/crt-geom/gaussx.json30
-rw-r--r--bgfx/effects/crt-geom/gaussy.json30
-rw-r--r--bgfx/effects/crt-geom/lowpass.json29
-rw-r--r--bgfx/effects/crt-geom/mipmap8.json30
-rw-r--r--bgfx/effects/crt-geom/phosphor_apply.json31
-rw-r--r--bgfx/effects/crt-geom/phosphor_update.json31
-rw-r--r--bgfx/effects/default/LICENSE27
-rw-r--r--bgfx/effects/default/README.md5
-rw-r--r--bgfx/effects/default/blit.json107
-rw-r--r--bgfx/effects/eagle/supereagle.json36
-rw-r--r--bgfx/effects/gui_add.json31
-rw-r--r--bgfx/effects/gui_blend.json31
-rw-r--r--bgfx/effects/gui_multiply.json29
-rw-r--r--bgfx/effects/gui_opaque.json23
-rw-r--r--bgfx/effects/hlsl/LICENSE27
-rw-r--r--bgfx/effects/hlsl/README.md5
-rw-r--r--bgfx/effects/hlsl/blit.json122
-rw-r--r--bgfx/effects/hlsl/chroma.json34
-rw-r--r--bgfx/effects/hlsl/color.json36
-rw-r--r--bgfx/effects/hlsl/deconverge.json38
-rw-r--r--bgfx/effects/hlsl/defocus.json32
-rw-r--r--bgfx/effects/hlsl/distortion.json44
-rw-r--r--bgfx/effects/hlsl/ntsc_decode.json44
-rw-r--r--bgfx/effects/hlsl/ntsc_encode.json39
-rw-r--r--bgfx/effects/hlsl/phosphor.json34
-rw-r--r--bgfx/effects/hlsl/post.json50
-rw-r--r--bgfx/effects/hlsl/prescale.json33
-rw-r--r--bgfx/effects/hlsl/scanline.json45
-rw-r--r--bgfx/effects/hqx/hq2x.json30
-rw-r--r--bgfx/effects/hqx/hq3x.json30
-rw-r--r--bgfx/effects/hqx/hq4x.json30
-rw-r--r--bgfx/effects/lcd-grid/lcd-grid.json38
-rw-r--r--bgfx/effects/lcd-grid/persistence.json28
-rw-r--r--bgfx/effects/misc/bcg_adjust.json27
-rw-r--r--bgfx/effects/misc/blit.json122
-rw-r--r--bgfx/effects/misc/blit_palette16.json126
-rw-r--r--bgfx/effects/misc/deposterize-pass0.json38
-rw-r--r--bgfx/effects/misc/deposterize-pass1.json38
-rw-r--r--bgfx/effects/misc/lut.json28
-rw-r--r--bgfx/effects/misc/saturation.json31
-rw-r--r--bgfx/effects/misc/texconv_argb32.json27
-rw-r--r--bgfx/effects/misc/texconv_palette16.json30
-rw-r--r--bgfx/effects/misc/texconv_rgb32.json27
-rw-r--r--bgfx/effects/misc/texconv_yuy16.json29
-rw-r--r--bgfx/effects/pillarbox_left_horizontal/gaussian.json33
-rw-r--r--bgfx/effects/pillarbox_left_horizontal/offset_sat.json35
-rw-r--r--bgfx/effects/pillarbox_left_vertical/gaussian.json33
-rw-r--r--bgfx/effects/pillarbox_left_vertical/offset_sat.json35
-rw-r--r--bgfx/effects/pillarbox_right_horizontal/gaussian.json33
-rw-r--r--bgfx/effects/pillarbox_right_horizontal/offset_sat.json35
-rw-r--r--bgfx/effects/pillarbox_right_vertical/gaussian.json33
-rw-r--r--bgfx/effects/pillarbox_right_vertical/offset_sat.json35
-rw-r--r--bgfx/effects/screen_add.json33
-rw-r--r--bgfx/effects/screen_blend.json33
-rw-r--r--bgfx/effects/screen_multiply.json33
-rw-r--r--bgfx/effects/screen_opaque.json25
-rw-r--r--bgfx/effects/unfiltered/LICENSE27
-rw-r--r--bgfx/effects/unfiltered/README.md5
-rw-r--r--bgfx/effects/unfiltered/blit.json122
-rw-r--r--bgfx/effects/warp/dilation-horizontal-fast.json55
-rw-r--r--bgfx/effects/xbr/super-xbr/custom-jinc2-sharper.json39
-rw-r--r--bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass0.json59
-rw-r--r--bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass1.json60
-rw-r--r--bgfx/effects/xbr/super-xbr/super-2xbr-3d-pass2.json60
-rw-r--r--bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass0.json59
-rw-r--r--bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass1.json60
-rw-r--r--bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass2.json59
-rw-r--r--bgfx/effects/xbr/super-xbr/super-4xbr-3d-pass3.json60
-rw-r--r--bgfx/effects/xbr/super-xbr/super-xbr-fast-pass0.json59
-rw-r--r--bgfx/effects/xbr/super-xbr/super-xbr-fast-pass1.json59
-rw-r--r--bgfx/effects/xbr/super-xbr/super-xbr-fast-pass2.json59
-rw-r--r--bgfx/effects/xbr/super-xbr/super-xbr-pass0.json59
-rw-r--r--bgfx/effects/xbr/super-xbr/super-xbr-pass1.json60
-rw-r--r--bgfx/effects/xbr/super-xbr/super-xbr-pass2.json59
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-sharp.json36
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v2-gamma.json36
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v2.json36
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4-gamma.json36
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4.json36
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v4b.json36
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid-v5-gamma.json36
-rw-r--r--bgfx/effects/xbr/xbr-hybrid/2xbr-hybrid.json36
-rw-r--r--bgfx/effects/xbr/xbr-lv1-noblend.json57
-rw-r--r--bgfx/effects/xbr/xbr-lv2-3d.json61
-rw-r--r--bgfx/effects/xbr/xbr-lv2-fast.json59
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-a-pass0.json55
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass0.json57
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-accuracy-pass1.json58
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-b-pass0.json55
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-c-pass0.json55
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-d-pass0.json55
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-noblend-pass1.json57
-rw-r--r--bgfx/effects/xbr/xbr-lv2-multipass/xbr-lv2-pass1.json58
-rw-r--r--bgfx/effects/xbr/xbr-lv2-noblend.json57
-rw-r--r--bgfx/effects/xbr/xbr-lv2.json59
-rw-r--r--bgfx/effects/xbr/xbr-lv3-multipass/xbr-lv3-pass0.json55
-rw-r--r--bgfx/effects/xbr/xbr-lv3-multipass/xbr-lv3-pass1.json58
-rw-r--r--bgfx/effects/xbr/xbr-lv3-noblend.json59
-rw-r--r--bgfx/effects/xbr/xbr-lv3.json63
-rw-r--r--bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass1.json55
-rw-r--r--bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass2.json55
-rw-r--r--bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass3.json56
-rw-r--r--bgfx/effects/xbr/xbr-mlv4-multipass/xbr-mlv4-pass4.json57
-rw-r--r--bgfx/shaders/dx11/chains/blurs/fs_smart-blur.binbin0 -> 2385 bytes-rw-r--r--bgfx/shaders/dx11/chains/blurs/vs_smart-blur.binbin0 -> 927 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/fs_crt-geom-deluxe.binbin0 -> 15451 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/fs_crt-geom.binbin0 -> 12026 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/fs_gaussx.binbin0 -> 4142 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/fs_gaussy.binbin0 -> 4142 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/fs_lowpass.binbin0 -> 4842 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/fs_mipmap8.binbin0 -> 11999 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/fs_phosphor_apply.binbin0 -> 1606 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/fs_phosphor_update.binbin0 -> 1839 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/vs_crt-geom.binbin0 -> 4944 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/vs_gaussx.binbin0 -> 920 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/vs_gaussy.binbin0 -> 920 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/vs_lowpass.binbin0 -> 2408 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/vs_mipmap8.binbin0 -> 517 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/vs_phosphor_apply.binbin0 -> 517 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt-geom/vs_phosphor_update.binbin0 -> 517 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt/fs_crt-caligari.binbin0 -> 2562 bytes-rw-r--r--bgfx/shaders/dx11/chains/crt/vs_crt-caligari.binbin0 -> 725 bytes-rw-r--r--bgfx/shaders/dx11/chains/default/fs_blit.binbin0 -> 434 bytes-rw-r--r--bgfx/shaders/dx11/chains/default/vs_blit.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/eagle/fs_eagle.binbin0 -> 6012 bytes-rw-r--r--bgfx/shaders/dx11/chains/eagle/vs_eagle.binbin0 -> 1731 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_chroma.binbin0 -> 1608 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_color.binbin0 -> 811 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_deconverge.binbin0 -> 674 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_defocus.binbin0 -> 1398 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_distortion.binbin0 -> 4302 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_ntsc_decode.binbin0 -> 3827 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_ntsc_encode.binbin0 -> 1821 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_phosphor.binbin0 -> 709 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_post.binbin0 -> 2774 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_prescale.binbin0 -> 434 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/fs_scanline.binbin0 -> 2004 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/vs_chroma.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/vs_color.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/vs_deconverge.binbin0 -> 1378 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/vs_defocus.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/vs_distortion.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/vs_ntsc_decode.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/vs_ntsc_encode.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/vs_phosphor.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/vs_post.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/vs_prescale.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/hlsl/vs_scanline.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/hqx/fs_hq2x.binbin0 -> 6864 bytes-rw-r--r--bgfx/shaders/dx11/chains/hqx/fs_hq3x.binbin0 -> 6876 bytes-rw-r--r--bgfx/shaders/dx11/chains/hqx/fs_hq4x.binbin0 -> 6876 bytes-rw-r--r--bgfx/shaders/dx11/chains/hqx/vs_hq2x.binbin0 -> 927 bytes-rw-r--r--bgfx/shaders/dx11/chains/hqx/vs_hq3x.binbin0 -> 927 bytes-rw-r--r--bgfx/shaders/dx11/chains/hqx/vs_hq4x.binbin0 -> 927 bytes-rw-r--r--bgfx/shaders/dx11/chains/lcd-grid/fs_lcd-grid.binbin0 -> 7919 bytes-rw-r--r--bgfx/shaders/dx11/chains/lcd-grid/fs_persistence.binbin0 -> 630 bytes-rw-r--r--bgfx/shaders/dx11/chains/lcd-grid/vs_lcd-grid.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/lcd-grid/vs_persistence.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_blit.binbin0 -> 434 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_blit_bcg.binbin0 -> 824 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_blit_palette16.binbin0 -> 1360 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_blit_rgb32.binbin0 -> 454 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_blit_yuy16.binbin0 -> 1270 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_bob-and-ghost-deinterlace.binbin0 -> 1514 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_deposterize-pass0.binbin0 -> 1358 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_deposterize-pass1.binbin0 -> 1358 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_lut.binbin0 -> 954 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/fs_saturation.binbin0 -> 565 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/vs_blit.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/vs_bob-and-ghost-deinterlace.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/vs_deposterize-pass0.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/vs_deposterize-pass1.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/vs_lut.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/vs_resize_blit.binbin0 -> 673 bytes-rw-r--r--bgfx/shaders/dx11/chains/misc/vs_saturation.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_left_horizontal/fs_gaussian.binbin0 -> 2833 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_left_horizontal/fs_offset_sat.binbin0 -> 565 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_left_horizontal/vs_gaussian.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_left_horizontal/vs_offset_sat.binbin0 -> 629 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_left_vertical/fs_gaussian.binbin0 -> 2833 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_left_vertical/fs_offset_sat.binbin0 -> 565 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_left_vertical/vs_gaussian.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_left_vertical/vs_offset_sat.binbin0 -> 629 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_right_horizontal/fs_gaussian.binbin0 -> 2833 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_right_horizontal/fs_offset_sat.binbin0 -> 565 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_right_horizontal/vs_gaussian.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_right_horizontal/vs_offset_sat.binbin0 -> 629 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_right_vertical/fs_gaussian.binbin0 -> 2833 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_right_vertical/fs_offset_sat.binbin0 -> 565 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_right_vertical/vs_gaussian.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/pillarbox_right_vertical/vs_offset_sat.binbin0 -> 629 bytes-rw-r--r--bgfx/shaders/dx11/chains/unfiltered/fs_blit.binbin0 -> 434 bytes-rw-r--r--bgfx/shaders/dx11/chains/unfiltered/vs_blit.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/warp/fs_dilation-horizontal-fast.binbin0 -> 642 bytes-rw-r--r--bgfx/shaders/dx11/chains/warp/vs_dilation-horizontal-fast.binbin0 -> 723 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/fs_xbr-lv1-noblend.binbin0 -> 3818 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/fs_xbr-lv2-3d.binbin0 -> 9650 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/fs_xbr-lv2-fast.binbin0 -> 5064 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/fs_xbr-lv2-noblend.binbin0 -> 5605 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/fs_xbr-lv2.binbin0 -> 6736 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/fs_xbr-lv3-noblend.binbin0 -> 7637 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/fs_xbr-lv3.binbin0 -> 8140 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_custom-jinc2-sharper.binbin0 -> 5709 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.binbin0 -> 7893 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.binbin0 -> 7927 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.binbin0 -> 7219 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.binbin0 -> 7905 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.binbin0 -> 7939 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.binbin0 -> 7231 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.binbin0 -> 7893 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.binbin0 -> 7927 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.binbin0 -> 7219 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.binbin0 -> 4521 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.binbin0 -> 4441 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.binbin0 -> 4289 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-pass0.binbin0 -> 5423 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-pass1.binbin0 -> 6271 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/fs_super-xbr-pass2.binbin0 -> 5007 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_custom-jinc2-sharper.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.binbin0 -> 1111 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.binbin0 -> 1111 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.binbin0 -> 1111 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass0.binbin0 -> 1071 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass1.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass2.binbin0 -> 1111 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/super-xbr/vs_super-xbr-pass3.binbin0 -> 1111 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/vs_xbr-lv1-noblend.binbin0 -> 747 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/vs_xbr-lv2-3d.binbin0 -> 1365 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/vs_xbr-lv2-fast.binbin0 -> 927 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/vs_xbr-lv2-noblend.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/vs_xbr-lv2.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/vs_xbr-lv3-noblend.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/vs_xbr-lv3.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-sharp.binbin0 -> 11223 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2-gamma.binbin0 -> 9459 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2.binbin0 -> 9179 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4-gamma.binbin0 -> 9503 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4.binbin0 -> 9063 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4b.binbin0 -> 8643 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v5-gamma.binbin0 -> 9763 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/fs_2xbr-hybrid.binbin0 -> 11671 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-sharp.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2-gamma.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4-gamma.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4b.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v5-gamma.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-hybrid/vs_2xbr-hybrid.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-a-pass0.binbin0 -> 3789 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass0.binbin0 -> 11945 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass1.binbin0 -> 4992 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-b-pass0.binbin0 -> 4345 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-c-pass0.binbin0 -> 4962 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-d-pass0.binbin0 -> 4733 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-noblend-pass1.binbin0 -> 3197 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-pass1.binbin0 -> 3824 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-a-pass0.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass0.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass1.binbin0 -> 847 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-b-pass0.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-c-pass0.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-d-pass0.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-noblend-pass1.binbin0 -> 847 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-pass1.binbin0 -> 847 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass0.binbin0 -> 9533 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass1.binbin0 -> 5650 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass0.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass1.binbin0 -> 915 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass1.binbin0 -> 14206 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass2.binbin0 -> 6436 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass3.binbin0 -> 4720 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass4.binbin0 -> 7193 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass1.binbin0 -> 691 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass2.binbin0 -> 1355 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass3.binbin0 -> 723 bytes-rw-r--r--bgfx/shaders/dx11/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass4.binbin0 -> 723 bytes-rw-r--r--bgfx/shaders/dx11/fs_gui.binbin0 -> 434 bytes-rw-r--r--bgfx/shaders/dx11/fs_screen.binbin0 -> 434 bytes-rw-r--r--bgfx/shaders/dx11/vs_gui.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx11/vs_screen.binbin0 -> 589 bytes-rw-r--r--bgfx/shaders/dx9/chains/blurs/fs_smart-blur.binbin0 -> 1368 bytes-rw-r--r--bgfx/shaders/dx9/chains/blurs/vs_smart-blur.binbin0 -> 672 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/fs_crt-geom-deluxe.binbin0 -> 10025 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/fs_crt-geom.binbin0 -> 7852 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/fs_gaussx.binbin0 -> 3535 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/fs_gaussy.binbin0 -> 3535 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/fs_lowpass.binbin0 -> 2088 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/fs_mipmap8.binbin0 -> 8702 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/fs_phosphor_apply.binbin0 -> 1363 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/fs_phosphor_update.binbin0 -> 1456 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/vs_crt-geom.binbin0 -> 3413 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/vs_gaussx.binbin0 -> 889 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/vs_gaussy.binbin0 -> 889 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/vs_lowpass.binbin0 -> 2981 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/vs_mipmap8.binbin0 -> 402 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/vs_phosphor_apply.binbin0 -> 402 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt-geom/vs_phosphor_update.binbin0 -> 402 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt/fs_crt-caligari.binbin0 -> 1921 bytes-rw-r--r--bgfx/shaders/dx9/chains/crt/vs_crt-caligari.binbin0 -> 570 bytes-rw-r--r--bgfx/shaders/dx9/chains/default/fs_blit.binbin0 -> 239 bytes-rw-r--r--bgfx/shaders/dx9/chains/default/vs_blit.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/eagle/fs_eagle.binbin0 -> 3141 bytes-rw-r--r--bgfx/shaders/dx9/chains/eagle/vs_eagle.binbin0 -> 1004 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_chroma.binbin0 -> 1053 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_color.binbin0 -> 716 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_deconverge.binbin0 -> 359 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_defocus.binbin0 -> 803 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_distortion.binbin0 -> 3203 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_ntsc_decode.binbin0 -> 4309 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_ntsc_encode.binbin0 -> 1790 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_phosphor.binbin0 -> 493 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_post.binbin0 -> 2452 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_prescale.binbin0 -> 239 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/fs_scanline.binbin0 -> 1861 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/vs_chroma.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/vs_color.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/vs_deconverge.binbin0 -> 1191 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/vs_defocus.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/vs_distortion.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/vs_ntsc_decode.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/vs_ntsc_encode.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/vs_phosphor.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/vs_post.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/vs_prescale.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/hlsl/vs_scanline.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/hqx/fs_hq2x.binbin0 -> 3715 bytes-rw-r--r--bgfx/shaders/dx9/chains/hqx/fs_hq3x.binbin0 -> 3739 bytes-rw-r--r--bgfx/shaders/dx9/chains/hqx/fs_hq4x.binbin0 -> 3715 bytes-rw-r--r--bgfx/shaders/dx9/chains/hqx/vs_hq2x.binbin0 -> 672 bytes-rw-r--r--bgfx/shaders/dx9/chains/hqx/vs_hq3x.binbin0 -> 672 bytes-rw-r--r--bgfx/shaders/dx9/chains/hqx/vs_hq4x.binbin0 -> 672 bytes-rw-r--r--bgfx/shaders/dx9/chains/lcd-grid/fs_lcd-grid.binbin0 -> 5064 bytes-rw-r--r--bgfx/shaders/dx9/chains/lcd-grid/fs_persistence.binbin0 -> 433 bytes-rw-r--r--bgfx/shaders/dx9/chains/lcd-grid/vs_lcd-grid.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/lcd-grid/vs_persistence.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_blit.binbin0 -> 239 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_blit_bcg.binbin0 -> 569 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_blit_palette16.binbin0 -> 1045 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_blit_rgb32.binbin0 -> 283 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_blit_yuy16.binbin0 -> 863 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_bob-and-ghost-deinterlace.binbin0 -> 1170 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_deposterize-pass0.binbin0 -> 903 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_deposterize-pass1.binbin0 -> 903 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_lut.binbin0 -> 665 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/fs_saturation.binbin0 -> 374 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/vs_blit.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/vs_bob-and-ghost-deinterlace.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/vs_deposterize-pass0.binbin0 -> 596 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/vs_deposterize-pass1.binbin0 -> 596 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/vs_lut.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/vs_resize_blit.binbin0 -> 522 bytes-rw-r--r--bgfx/shaders/dx9/chains/misc/vs_saturation.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_left_horizontal/fs_gaussian.binbin0 -> 1522 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_left_horizontal/fs_offset_sat.binbin0 -> 374 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_left_horizontal/vs_gaussian.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_left_horizontal/vs_offset_sat.binbin0 -> 470 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_left_vertical/fs_gaussian.binbin0 -> 1522 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_left_vertical/fs_offset_sat.binbin0 -> 374 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_left_vertical/vs_gaussian.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_left_vertical/vs_offset_sat.binbin0 -> 470 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_right_horizontal/fs_gaussian.binbin0 -> 1522 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_right_horizontal/fs_offset_sat.binbin0 -> 374 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_right_horizontal/vs_gaussian.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_right_horizontal/vs_offset_sat.binbin0 -> 470 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_right_vertical/fs_gaussian.binbin0 -> 1522 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_right_vertical/fs_offset_sat.binbin0 -> 374 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_right_vertical/vs_gaussian.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/pillarbox_right_vertical/vs_offset_sat.binbin0 -> 470 bytes-rw-r--r--bgfx/shaders/dx9/chains/unfiltered/fs_blit.binbin0 -> 239 bytes-rw-r--r--bgfx/shaders/dx9/chains/unfiltered/vs_blit.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/warp/fs_dilation-horizontal-fast.binbin0 -> 355 bytes-rw-r--r--bgfx/shaders/dx9/chains/warp/vs_dilation-horizontal-fast.binbin0 -> 564 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/fs_xbr-lv1-noblend.binbin0 -> 2283 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2-3d.binbin0 -> 4727 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2-fast.binbin0 -> 2549 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2-noblend.binbin0 -> 2618 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/fs_xbr-lv2.binbin0 -> 3265 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/fs_xbr-lv3-noblend.binbin0 -> 3658 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/fs_xbr-lv3.binbin0 -> 4041 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_custom-jinc2-sharper.binbin0 -> 4988 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.binbin0 -> 4229 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.binbin0 -> 4160 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.binbin0 -> 3740 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.binbin0 -> 4249 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.binbin0 -> 4248 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.binbin0 -> 3760 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.binbin0 -> 4229 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.binbin0 -> 4160 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.binbin0 -> 3740 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.binbin0 -> 2473 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.binbin0 -> 2389 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.binbin0 -> 2301 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-pass0.binbin0 -> 2715 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-pass1.binbin0 -> 3260 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/fs_super-xbr-pass2.binbin0 -> 2543 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_custom-jinc2-sharper.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.binbin0 -> 756 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.binbin0 -> 756 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.binbin0 -> 756 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-pass0.binbin0 -> 728 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-pass1.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-pass2.binbin0 -> 756 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/super-xbr/vs_super-xbr-pass3.binbin0 -> 756 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/vs_xbr-lv1-noblend.binbin0 -> 588 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2-3d.binbin0 -> 838 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2-fast.binbin0 -> 672 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2-noblend.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/vs_xbr-lv2.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/vs_xbr-lv3-noblend.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/vs_xbr-lv3.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-sharp.binbin0 -> 4960 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2-gamma.binbin0 -> 4884 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2.binbin0 -> 4636 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4-gamma.binbin0 -> 5036 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4.binbin0 -> 4572 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4b.binbin0 -> 4412 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v5-gamma.binbin0 -> 5320 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/fs_2xbr-hybrid.binbin0 -> 5080 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-sharp.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2-gamma.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4-gamma.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4b.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v5-gamma.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-hybrid/vs_2xbr-hybrid.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-a-pass0.binbin0 -> 1882 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass0.binbin0 -> 6106 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass1.binbin0 -> 3094 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-b-pass0.binbin0 -> 2046 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-c-pass0.binbin0 -> 2087 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-d-pass0.binbin0 -> 2254 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-noblend-pass1.binbin0 -> 1911 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-pass1.binbin0 -> 2138 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-a-pass0.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass0.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass1.binbin0 -> 628 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-b-pass0.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-c-pass0.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-d-pass0.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-noblend-pass1.binbin0 -> 628 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-pass1.binbin0 -> 628 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass0.binbin0 -> 4450 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass1.binbin0 -> 3940 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass0.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass1.binbin0 -> 704 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass1.binbin0 -> 6783 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass2.binbin0 -> 3686 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass3.binbin0 -> 3586 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass4.binbin0 -> 4699 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass1.binbin0 -> 528 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass2.binbin0 -> 876 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass3.binbin0 -> 564 bytes-rw-r--r--bgfx/shaders/dx9/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass4.binbin0 -> 564 bytes-rw-r--r--bgfx/shaders/dx9/fs_gui.binbin0 -> 239 bytes-rw-r--r--bgfx/shaders/dx9/fs_screen.binbin0 -> 239 bytes-rw-r--r--bgfx/shaders/dx9/vs_gui.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/dx9/vs_screen.binbin0 -> 438 bytes-rw-r--r--bgfx/shaders/essl/chains/blurs/fs_smart-blur.binbin0 -> 3307 bytes-rw-r--r--bgfx/shaders/essl/chains/blurs/vs_smart-blur.binbin0 -> 1190 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/fs_crt-geom-deluxe.binbin0 -> 18343 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/fs_crt-geom.binbin0 -> 14299 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/fs_gaussx.binbin0 -> 7428 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/fs_gaussy.binbin0 -> 7428 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/fs_lowpass.binbin0 -> 6481 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/fs_mipmap8.binbin0 -> 20118 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/fs_phosphor_apply.binbin0 -> 2113 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/fs_phosphor_update.binbin0 -> 2076 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/vs_crt-geom.binbin0 -> 5042 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/vs_gaussx.binbin0 -> 832 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/vs_gaussy.binbin0 -> 832 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/vs_lowpass.binbin0 -> 2722 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/vs_mipmap8.binbin0 -> 342 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/vs_phosphor_apply.binbin0 -> 342 bytes-rw-r--r--bgfx/shaders/essl/chains/crt-geom/vs_phosphor_update.binbin0 -> 342 bytes-rw-r--r--bgfx/shaders/essl/chains/crt/fs_crt-caligari.binbin0 -> 3710 bytes-rw-r--r--bgfx/shaders/essl/chains/crt/vs_crt-caligari.binbin0 -> 741 bytes-rw-r--r--bgfx/shaders/essl/chains/default/fs_blit.binbin0 -> 246 bytes-rw-r--r--bgfx/shaders/essl/chains/default/vs_blit.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/eagle/fs_eagle.binbin0 -> 6958 bytes-rw-r--r--bgfx/shaders/essl/chains/eagle/vs_eagle.binbin0 -> 2453 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_chroma.binbin0 -> 1906 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_color.binbin0 -> 981 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_deconverge.binbin0 -> 493 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_defocus.binbin0 -> 1147 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_distortion.binbin0 -> 5995 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_ntsc_decode.binbin0 -> 6544 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_ntsc_encode.binbin0 -> 2865 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_phosphor.binbin0 -> 671 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_post.binbin0 -> 4071 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_prescale.binbin0 -> 246 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/fs_scanline.binbin0 -> 2885 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/vs_chroma.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/vs_color.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/vs_deconverge.binbin0 -> 1506 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/vs_defocus.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/vs_distortion.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/vs_ntsc_decode.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/vs_ntsc_encode.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/vs_phosphor.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/vs_post.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/vs_prescale.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/hlsl/vs_scanline.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/hqx/fs_hq2x.binbin0 -> 15926 bytes-rw-r--r--bgfx/shaders/essl/chains/hqx/fs_hq3x.binbin0 -> 15931 bytes-rw-r--r--bgfx/shaders/essl/chains/hqx/fs_hq4x.binbin0 -> 15931 bytes-rw-r--r--bgfx/shaders/essl/chains/hqx/vs_hq2x.binbin0 -> 1190 bytes-rw-r--r--bgfx/shaders/essl/chains/hqx/vs_hq3x.binbin0 -> 1190 bytes-rw-r--r--bgfx/shaders/essl/chains/hqx/vs_hq4x.binbin0 -> 1190 bytes-rw-r--r--bgfx/shaders/essl/chains/lcd-grid/fs_lcd-grid.binbin0 -> 11319 bytes-rw-r--r--bgfx/shaders/essl/chains/lcd-grid/fs_persistence.binbin0 -> 388 bytes-rw-r--r--bgfx/shaders/essl/chains/lcd-grid/vs_lcd-grid.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/lcd-grid/vs_persistence.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/fs_blit.binbin0 -> 246 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/fs_blit_bcg.binbin0 -> 842 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/fs_blit_palette16.binbin0 -> 1704 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/fs_blit_rgb32.binbin0 -> 274 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/fs_blit_yuy16.binbin0 -> 1751 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/fs_bob-and-ghost-deinterlace.binbin0 -> 1327 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/fs_deposterize-pass0.binbin0 -> 1549 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/fs_deposterize-pass1.binbin0 -> 1549 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/fs_lut.binbin0 -> 1050 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/fs_saturation.binbin0 -> 468 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/vs_blit.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/vs_bob-and-ghost-deinterlace.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/vs_deposterize-pass0.binbin0 -> 755 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/vs_deposterize-pass1.binbin0 -> 755 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/vs_lut.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/vs_resize_blit.binbin0 -> 548 bytes-rw-r--r--bgfx/shaders/essl/chains/misc/vs_saturation.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_left_horizontal/fs_gaussian.binbin0 -> 2921 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_left_horizontal/fs_offset_sat.binbin0 -> 468 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_left_horizontal/vs_gaussian.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_left_horizontal/vs_offset_sat.binbin0 -> 466 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_left_vertical/fs_gaussian.binbin0 -> 2921 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_left_vertical/fs_offset_sat.binbin0 -> 468 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_left_vertical/vs_gaussian.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_left_vertical/vs_offset_sat.binbin0 -> 471 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_right_horizontal/fs_gaussian.binbin0 -> 2921 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_right_horizontal/fs_offset_sat.binbin0 -> 468 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_right_horizontal/vs_gaussian.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_right_horizontal/vs_offset_sat.binbin0 -> 467 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_right_vertical/fs_gaussian.binbin0 -> 2921 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_right_vertical/fs_offset_sat.binbin0 -> 468 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_right_vertical/vs_gaussian.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/pillarbox_right_vertical/vs_offset_sat.binbin0 -> 477 bytes-rw-r--r--bgfx/shaders/essl/chains/unfiltered/fs_blit.binbin0 -> 246 bytes-rw-r--r--bgfx/shaders/essl/chains/unfiltered/vs_blit.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/warp/fs_dilation-horizontal-fast.binbin0 -> 441 bytes-rw-r--r--bgfx/shaders/essl/chains/warp/vs_dilation-horizontal-fast.binbin0 -> 634 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/fs_xbr-lv1-noblend.binbin0 -> 5370 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/fs_xbr-lv2-3d.binbin0 -> 10139 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/fs_xbr-lv2-fast.binbin0 -> 5512 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/fs_xbr-lv2-noblend.binbin0 -> 7191 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/fs_xbr-lv2.binbin0 -> 7274 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/fs_xbr-lv3-noblend.binbin0 -> 9950 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/fs_xbr-lv3.binbin0 -> 10719 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_custom-jinc2-sharper.binbin0 -> 7345 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.binbin0 -> 8644 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.binbin0 -> 8717 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.binbin0 -> 8122 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.binbin0 -> 8644 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.binbin0 -> 8705 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.binbin0 -> 8110 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.binbin0 -> 8644 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.binbin0 -> 8705 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.binbin0 -> 8110 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.binbin0 -> 5160 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.binbin0 -> 4730 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.binbin0 -> 4809 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-xbr-pass0.binbin0 -> 6334 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-xbr-pass1.binbin0 -> 7683 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/fs_super-xbr-pass2.binbin0 -> 6056 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_custom-jinc2-sharper.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.binbin0 -> 1427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.binbin0 -> 1427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.binbin0 -> 1427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-xbr-pass0.binbin0 -> 1448 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-xbr-pass1.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-xbr-pass2.binbin0 -> 1427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/super-xbr/vs_super-xbr-pass3.binbin0 -> 1427 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/vs_xbr-lv1-noblend.binbin0 -> 777 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/vs_xbr-lv2-3d.binbin0 -> 2152 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/vs_xbr-lv2-fast.binbin0 -> 1190 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/vs_xbr-lv2-noblend.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/vs_xbr-lv2.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/vs_xbr-lv3-noblend.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/vs_xbr-lv3.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-sharp.binbin0 -> 12246 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2-gamma.binbin0 -> 10057 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2.binbin0 -> 9871 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4-gamma.binbin0 -> 10993 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4.binbin0 -> 10727 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4b.binbin0 -> 10249 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v5-gamma.binbin0 -> 10675 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid.binbin0 -> 12540 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-sharp.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2-gamma.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4-gamma.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4b.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v5-gamma.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-a-pass0.binbin0 -> 3525 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass0.binbin0 -> 26242 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass1.binbin0 -> 7824 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-b-pass0.binbin0 -> 4036 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-c-pass0.binbin0 -> 4872 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-d-pass0.binbin0 -> 4449 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-noblend-pass1.binbin0 -> 5451 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-pass1.binbin0 -> 4687 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-a-pass0.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass0.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass1.binbin0 -> 923 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-b-pass0.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-c-pass0.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-d-pass0.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-noblend-pass1.binbin0 -> 923 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-pass1.binbin0 -> 923 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass0.binbin0 -> 12654 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass1.binbin0 -> 7101 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass0.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass1.binbin0 -> 987 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass1.binbin0 -> 16680 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass2.binbin0 -> 10750 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass3.binbin0 -> 6352 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass4.binbin0 -> 8055 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass1.binbin0 -> 555 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass2.binbin0 -> 2099 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass3.binbin0 -> 708 bytes-rw-r--r--bgfx/shaders/essl/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass4.binbin0 -> 708 bytes-rw-r--r--bgfx/shaders/essl/fs_gui.binbin0 -> 246 bytes-rw-r--r--bgfx/shaders/essl/fs_screen.binbin0 -> 246 bytes-rw-r--r--bgfx/shaders/essl/vs_gui.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/essl/vs_screen.binbin0 -> 427 bytes-rw-r--r--bgfx/shaders/glsl/chains/blurs/fs_smart-blur.binbin0 -> 3188 bytes-rw-r--r--bgfx/shaders/glsl/chains/blurs/vs_smart-blur.binbin0 -> 1094 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/fs_crt-geom-deluxe.binbin0 -> 17554 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/fs_crt-geom.binbin0 -> 13624 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/fs_gaussx.binbin0 -> 6919 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/fs_gaussy.binbin0 -> 6919 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/fs_lowpass.binbin0 -> 6178 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/fs_mipmap8.binbin0 -> 19111 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/fs_phosphor_apply.binbin0 -> 1935 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/fs_phosphor_update.binbin0 -> 1986 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/vs_crt-geom.binbin0 -> 4730 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/vs_gaussx.binbin0 -> 766 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/vs_gaussy.binbin0 -> 766 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/vs_lowpass.binbin0 -> 2632 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/vs_mipmap8.binbin0 -> 312 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/vs_phosphor_apply.binbin0 -> 312 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt-geom/vs_phosphor_update.binbin0 -> 312 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt/fs_crt-caligari.binbin0 -> 3480 bytes-rw-r--r--bgfx/shaders/glsl/chains/crt/vs_crt-caligari.binbin0 -> 675 bytes-rw-r--r--bgfx/shaders/glsl/chains/default/fs_blit.binbin0 -> 189 bytes-rw-r--r--bgfx/shaders/glsl/chains/default/vs_blit.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/eagle/fs_eagle.binbin0 -> 6680 bytes-rw-r--r--bgfx/shaders/glsl/chains/eagle/vs_eagle.binbin0 -> 2261 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_chroma.binbin0 -> 1636 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_color.binbin0 -> 914 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_deconverge.binbin0 -> 458 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_defocus.binbin0 -> 1108 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_distortion.binbin0 -> 5703 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_ntsc_decode.binbin0 -> 6156 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_ntsc_encode.binbin0 -> 2716 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_phosphor.binbin0 -> 633 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_post.binbin0 -> 3876 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_prescale.binbin0 -> 189 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/fs_scanline.binbin0 -> 2745 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/vs_chroma.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/vs_color.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/vs_deconverge.binbin0 -> 1392 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/vs_defocus.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/vs_distortion.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/vs_ntsc_decode.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/vs_ntsc_encode.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/vs_phosphor.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/vs_post.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/vs_prescale.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/hlsl/vs_scanline.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/hqx/fs_hq2x.binbin0 -> 15070 bytes-rw-r--r--bgfx/shaders/glsl/chains/hqx/fs_hq3x.binbin0 -> 15075 bytes-rw-r--r--bgfx/shaders/glsl/chains/hqx/fs_hq4x.binbin0 -> 15075 bytes-rw-r--r--bgfx/shaders/glsl/chains/hqx/vs_hq2x.binbin0 -> 1094 bytes-rw-r--r--bgfx/shaders/glsl/chains/hqx/vs_hq3x.binbin0 -> 1094 bytes-rw-r--r--bgfx/shaders/glsl/chains/hqx/vs_hq4x.binbin0 -> 1094 bytes-rw-r--r--bgfx/shaders/glsl/chains/lcd-grid/fs_lcd-grid.binbin0 -> 10783 bytes-rw-r--r--bgfx/shaders/glsl/chains/lcd-grid/fs_persistence.binbin0 -> 331 bytes-rw-r--r--bgfx/shaders/glsl/chains/lcd-grid/vs_lcd-grid.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/lcd-grid/vs_persistence.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_blit.binbin0 -> 189 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_blit_bcg.binbin0 -> 799 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_blit_palette16.binbin0 -> 1610 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_blit_rgb32.binbin0 -> 257 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_blit_yuy16.binbin0 -> 1674 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_bob-and-ghost-deinterlace.binbin0 -> 1224 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_deposterize-pass0.binbin0 -> 1501 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_deposterize-pass1.binbin0 -> 1501 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_lut.binbin0 -> 990 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/fs_saturation.binbin0 -> 441 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/vs_blit.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/vs_bob-and-ghost-deinterlace.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/vs_deposterize-pass0.binbin0 -> 689 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/vs_deposterize-pass1.binbin0 -> 689 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/vs_lut.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/vs_resize_blit.binbin0 -> 500 bytes-rw-r--r--bgfx/shaders/glsl/chains/misc/vs_saturation.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_left_horizontal/fs_gaussian.binbin0 -> 2881 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_left_horizontal/fs_offset_sat.binbin0 -> 441 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_left_horizontal/vs_gaussian.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_left_horizontal/vs_offset_sat.binbin0 -> 424 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_left_vertical/fs_gaussian.binbin0 -> 2881 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_left_vertical/fs_offset_sat.binbin0 -> 441 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_left_vertical/vs_gaussian.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_left_vertical/vs_offset_sat.binbin0 -> 429 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_right_horizontal/fs_gaussian.binbin0 -> 2881 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_right_horizontal/fs_offset_sat.binbin0 -> 441 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_right_horizontal/vs_gaussian.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_right_horizontal/vs_offset_sat.binbin0 -> 425 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_right_vertical/fs_gaussian.binbin0 -> 2881 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_right_vertical/fs_offset_sat.binbin0 -> 441 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_right_vertical/vs_gaussian.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/pillarbox_right_vertical/vs_offset_sat.binbin0 -> 435 bytes-rw-r--r--bgfx/shaders/glsl/chains/unfiltered/fs_blit.binbin0 -> 189 bytes-rw-r--r--bgfx/shaders/glsl/chains/unfiltered/vs_blit.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/warp/fs_dilation-horizontal-fast.binbin0 -> 424 bytes-rw-r--r--bgfx/shaders/glsl/chains/warp/vs_dilation-horizontal-fast.binbin0 -> 574 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/fs_xbr-lv1-noblend.binbin0 -> 5205 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/fs_xbr-lv2-3d.binbin0 -> 9805 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/fs_xbr-lv2-fast.binbin0 -> 5302 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/fs_xbr-lv2-noblend.binbin0 -> 6933 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/fs_xbr-lv2.binbin0 -> 7010 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/fs_xbr-lv3-noblend.binbin0 -> 9646 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/fs_xbr-lv3.binbin0 -> 10343 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_custom-jinc2-sharper.binbin0 -> 7027 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.binbin0 -> 8260 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.binbin0 -> 8315 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.binbin0 -> 7768 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.binbin0 -> 8260 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.binbin0 -> 8303 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.binbin0 -> 7756 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.binbin0 -> 8260 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.binbin0 -> 8303 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.binbin0 -> 7756 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.binbin0 -> 4889 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.binbin0 -> 4499 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.binbin0 -> 4595 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-pass0.binbin0 -> 6045 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-pass1.binbin0 -> 7243 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/fs_super-xbr-pass2.binbin0 -> 5767 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_custom-jinc2-sharper.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.binbin0 -> 1313 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.binbin0 -> 1313 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.binbin0 -> 1313 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass0.binbin0 -> 1334 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass1.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass2.binbin0 -> 1313 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/super-xbr/vs_super-xbr-pass3.binbin0 -> 1313 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/vs_xbr-lv1-noblend.binbin0 -> 705 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/vs_xbr-lv2-3d.binbin0 -> 1996 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/vs_xbr-lv2-fast.binbin0 -> 1094 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/vs_xbr-lv2-noblend.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/vs_xbr-lv2.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/vs_xbr-lv3-noblend.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/vs_xbr-lv3.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-sharp.binbin0 -> 11971 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2-gamma.binbin0 -> 9726 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2.binbin0 -> 9545 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4-gamma.binbin0 -> 10612 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4.binbin0 -> 10356 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4b.binbin0 -> 9878 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v5-gamma.binbin0 -> 10318 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/fs_2xbr-hybrid.binbin0 -> 12265 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-sharp.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2-gamma.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4-gamma.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4b.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v5-gamma.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-hybrid/vs_2xbr-hybrid.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-a-pass0.binbin0 -> 3362 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass0.binbin0 -> 24893 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass1.binbin0 -> 7439 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-b-pass0.binbin0 -> 3863 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-c-pass0.binbin0 -> 4699 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-d-pass0.binbin0 -> 4276 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-noblend-pass1.binbin0 -> 5211 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-pass1.binbin0 -> 4479 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-a-pass0.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass0.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass1.binbin0 -> 845 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-b-pass0.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-c-pass0.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-d-pass0.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-noblend-pass1.binbin0 -> 845 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-pass1.binbin0 -> 845 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass0.binbin0 -> 12228 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass1.binbin0 -> 6798 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass0.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass1.binbin0 -> 903 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass1.binbin0 -> 16265 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass2.binbin0 -> 10251 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass3.binbin0 -> 6095 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass4.binbin0 -> 7720 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass1.binbin0 -> 501 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass2.binbin0 -> 1949 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass3.binbin0 -> 642 bytes-rw-r--r--bgfx/shaders/glsl/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass4.binbin0 -> 642 bytes-rw-r--r--bgfx/shaders/glsl/fs_gui.binbin0 -> 189 bytes-rw-r--r--bgfx/shaders/glsl/fs_screen.binbin0 -> 189 bytes-rw-r--r--bgfx/shaders/glsl/vs_gui.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/glsl/vs_screen.binbin0 -> 385 bytes-rw-r--r--bgfx/shaders/metal/chains/blurs/fs_smart-blur.binbin0 -> 2939 bytes-rw-r--r--bgfx/shaders/metal/chains/blurs/vs_smart-blur.binbin0 -> 1421 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/fs_crt-geom-deluxe.binbin0 -> 15947 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/fs_crt-geom.binbin0 -> 12619 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/fs_gaussx.binbin0 -> 4171 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/fs_gaussy.binbin0 -> 4171 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/fs_lowpass.binbin0 -> 4702 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/fs_mipmap8.binbin0 -> 18022 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/fs_phosphor_apply.binbin0 -> 1812 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/fs_phosphor_update.binbin0 -> 2106 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/vs_crt-geom.binbin0 -> 4134 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/vs_gaussx.binbin0 -> 1227 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/vs_gaussy.binbin0 -> 1227 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/vs_lowpass.binbin0 -> 3457 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/vs_mipmap8.binbin0 -> 690 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/vs_phosphor_apply.binbin0 -> 690 bytes-rw-r--r--bgfx/shaders/metal/chains/crt-geom/vs_phosphor_update.binbin0 -> 690 bytes-rw-r--r--bgfx/shaders/metal/chains/crt/fs_crt-caligari.binbin0 -> 2745 bytes-rw-r--r--bgfx/shaders/metal/chains/crt/vs_crt-caligari.binbin0 -> 1061 bytes-rw-r--r--bgfx/shaders/metal/chains/default/fs_blit.binbin0 -> 609 bytes-rw-r--r--bgfx/shaders/metal/chains/default/vs_blit.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/eagle/fs_eagle.binbin0 -> 11318 bytes-rw-r--r--bgfx/shaders/metal/chains/eagle/vs_eagle.binbin0 -> 2372 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_chroma.binbin0 -> 1741 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_color.binbin0 -> 1318 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_deconverge.binbin0 -> 877 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_defocus.binbin0 -> 1906 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_distortion.binbin0 -> 4478 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_ntsc_decode.binbin0 -> 4599 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_ntsc_encode.binbin0 -> 3230 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_phosphor.binbin0 -> 1036 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_post.binbin0 -> 4865 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_prescale.binbin0 -> 655 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/fs_scanline.binbin0 -> 2879 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/vs_chroma.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/vs_color.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/vs_deconverge.binbin0 -> 2046 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/vs_defocus.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/vs_distortion.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/vs_ntsc_decode.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/vs_ntsc_encode.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/vs_phosphor.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/vs_post.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/vs_prescale.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/hlsl/vs_scanline.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/hqx/fs_hq2x.binbin0 -> 8117 bytes-rw-r--r--bgfx/shaders/metal/chains/hqx/fs_hq3x.binbin0 -> 8172 bytes-rw-r--r--bgfx/shaders/metal/chains/hqx/fs_hq4x.binbin0 -> 8097 bytes-rw-r--r--bgfx/shaders/metal/chains/hqx/vs_hq2x.binbin0 -> 1421 bytes-rw-r--r--bgfx/shaders/metal/chains/hqx/vs_hq3x.binbin0 -> 1421 bytes-rw-r--r--bgfx/shaders/metal/chains/hqx/vs_hq4x.binbin0 -> 1421 bytes-rw-r--r--bgfx/shaders/metal/chains/lcd-grid/fs_lcd-grid.binbin0 -> 9976 bytes-rw-r--r--bgfx/shaders/metal/chains/lcd-grid/fs_persistence.binbin0 -> 958 bytes-rw-r--r--bgfx/shaders/metal/chains/lcd-grid/vs_lcd-grid.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/lcd-grid/vs_persistence.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/fs_blit.binbin0 -> 609 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/fs_blit_bcg.binbin0 -> 1163 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/fs_blit_palette16.binbin0 -> 1815 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/fs_blit_rgb32.binbin0 -> 626 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/fs_blit_yuy16.binbin0 -> 2036 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/fs_bob-and-ghost-deinterlace.binbin0 -> 1733 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/fs_deposterize-pass0.binbin0 -> 1186 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/fs_deposterize-pass1.binbin0 -> 1186 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/fs_lut.binbin0 -> 1490 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/fs_saturation.binbin0 -> 916 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/vs_blit.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/vs_bob-and-ghost-deinterlace.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/vs_deposterize-pass0.binbin0 -> 1174 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/vs_deposterize-pass1.binbin0 -> 1174 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/vs_lut.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/vs_resize_blit.binbin0 -> 966 bytes-rw-r--r--bgfx/shaders/metal/chains/misc/vs_saturation.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_left_horizontal/fs_gaussian.binbin0 -> 3354 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_left_horizontal/fs_offset_sat.binbin0 -> 916 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_left_horizontal/vs_gaussian.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_left_horizontal/vs_offset_sat.binbin0 -> 945 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_left_vertical/fs_gaussian.binbin0 -> 3354 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_left_vertical/fs_offset_sat.binbin0 -> 916 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_left_vertical/vs_gaussian.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_left_vertical/vs_offset_sat.binbin0 -> 943 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_right_horizontal/fs_gaussian.binbin0 -> 3354 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_right_horizontal/fs_offset_sat.binbin0 -> 916 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_right_horizontal/vs_gaussian.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_right_horizontal/vs_offset_sat.binbin0 -> 951 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_right_vertical/fs_gaussian.binbin0 -> 3354 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_right_vertical/fs_offset_sat.binbin0 -> 916 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_right_vertical/vs_gaussian.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/pillarbox_right_vertical/vs_offset_sat.binbin0 -> 972 bytes-rw-r--r--bgfx/shaders/metal/chains/unfiltered/fs_blit.binbin0 -> 609 bytes-rw-r--r--bgfx/shaders/metal/chains/unfiltered/vs_blit.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/warp/fs_dilation-horizontal-fast.binbin0 -> 818 bytes-rw-r--r--bgfx/shaders/metal/chains/warp/vs_dilation-horizontal-fast.binbin0 -> 1034 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/fs_xbr-lv1-noblend.binbin0 -> 4785 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/fs_xbr-lv2-3d.binbin0 -> 7968 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/fs_xbr-lv2-fast.binbin0 -> 4471 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/fs_xbr-lv2-noblend.binbin0 -> 5462 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/fs_xbr-lv2.binbin0 -> 5902 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/fs_xbr-lv3-noblend.binbin0 -> 7114 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/fs_xbr-lv3.binbin0 -> 9531 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_custom-jinc2-sharper.binbin0 -> 5805 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.binbin0 -> 7199 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.binbin0 -> 7580 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.binbin0 -> 6841 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.binbin0 -> 7201 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.binbin0 -> 7570 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.binbin0 -> 6830 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.binbin0 -> 7199 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.binbin0 -> 7568 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.binbin0 -> 6829 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.binbin0 -> 5105 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.binbin0 -> 4895 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.binbin0 -> 4550 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-pass0.binbin0 -> 5341 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-pass1.binbin0 -> 6772 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/fs_super-xbr-pass2.binbin0 -> 5183 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_custom-jinc2-sharper.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.binbin0 -> 1630 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.binbin0 -> 1630 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.binbin0 -> 1630 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-pass0.binbin0 -> 1618 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-pass1.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-pass2.binbin0 -> 1630 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/super-xbr/vs_super-xbr-pass3.binbin0 -> 1630 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/vs_xbr-lv1-noblend.binbin0 -> 1070 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/vs_xbr-lv2-3d.binbin0 -> 2124 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/vs_xbr-lv2-fast.binbin0 -> 1421 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/vs_xbr-lv2-noblend.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/vs_xbr-lv2.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/vs_xbr-lv3-noblend.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/vs_xbr-lv3.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-sharp.binbin0 -> 16011 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2-gamma.binbin0 -> 7802 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2.binbin0 -> 7645 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4-gamma.binbin0 -> 9206 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4.binbin0 -> 8853 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4b.binbin0 -> 8617 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v5-gamma.binbin0 -> 9520 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/fs_2xbr-hybrid.binbin0 -> 15967 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-sharp.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2-gamma.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4-gamma.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4b.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v5-gamma.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-hybrid/vs_2xbr-hybrid.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-a-pass0.binbin0 -> 3368 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass0.binbin0 -> 14206 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass1.binbin0 -> 5690 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-b-pass0.binbin0 -> 3610 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-c-pass0.binbin0 -> 3986 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-d-pass0.binbin0 -> 3854 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-noblend-pass1.binbin0 -> 3959 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-pass1.binbin0 -> 4648 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-a-pass0.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass0.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass1.binbin0 -> 1288 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-b-pass0.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-c-pass0.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-d-pass0.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-noblend-pass1.binbin0 -> 1288 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-pass1.binbin0 -> 1288 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass0.binbin0 -> 16171 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass1.binbin0 -> 5575 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass0.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass1.binbin0 -> 1336 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass1.binbin0 -> 11490 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass2.binbin0 -> 6349 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass3.binbin0 -> 6581 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass4.binbin0 -> 6087 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass1.binbin0 -> 1018 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass2.binbin0 -> 2080 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass3.binbin0 -> 1068 bytes-rw-r--r--bgfx/shaders/metal/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass4.binbin0 -> 1068 bytes-rw-r--r--bgfx/shaders/metal/fs_gui.binbin0 -> 609 bytes-rw-r--r--bgfx/shaders/metal/fs_screen.binbin0 -> 609 bytes-rw-r--r--bgfx/shaders/metal/vs_gui.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/metal/vs_screen.binbin0 -> 835 bytes-rw-r--r--bgfx/shaders/spirv/chains/blurs/fs_smart-blur.binbin0 -> 5203 bytes-rw-r--r--bgfx/shaders/spirv/chains/blurs/vs_smart-blur.binbin0 -> 2083 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/fs_crt-geom-deluxe.binbin0 -> 24496 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/fs_crt-geom.binbin0 -> 19163 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/fs_gaussx.binbin0 -> 6598 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/fs_gaussy.binbin0 -> 6614 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/fs_lowpass.binbin0 -> 7667 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/fs_mipmap8.binbin0 -> 24663 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/fs_phosphor_apply.binbin0 -> 2850 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/fs_phosphor_update.binbin0 -> 3395 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/vs_crt-geom.binbin0 -> 8328 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/vs_gaussx.binbin0 -> 2152 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/vs_gaussy.binbin0 -> 2168 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/vs_lowpass.binbin0 -> 4424 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/vs_mipmap8.binbin0 -> 1085 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/vs_phosphor_apply.binbin0 -> 1085 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt-geom/vs_phosphor_update.binbin0 -> 1085 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt/fs_crt-caligari.binbin0 -> 4548 bytes-rw-r--r--bgfx/shaders/spirv/chains/crt/vs_crt-caligari.binbin0 -> 1649 bytes-rw-r--r--bgfx/shaders/spirv/chains/default/fs_blit.binbin0 -> 850 bytes-rw-r--r--bgfx/shaders/spirv/chains/default/vs_blit.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/eagle/fs_eagle.binbin0 -> 8904 bytes-rw-r--r--bgfx/shaders/spirv/chains/eagle/vs_eagle.binbin0 -> 3879 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/fs_chroma.binbin0 -> 3096 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/fs_color.binbin0 -> 2319 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/fs_deconverge.binbin0 -> 1294 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/fs_defocus.binbin0 -> 2322 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/fs_distortion.binbin0 -> 7594 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/fs_ntsc_decode.binbin0 -> 7204 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/fs_ntsc_encode.binbin0 -> 3617 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/fs_phosphor.binbin0 -> 1808 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/fs_post.binbin0 -> 7851 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/fs_prescale.binbin0 -> 896 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/fs_scanline.binbin0 -> 4852 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/vs_chroma.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/vs_color.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/vs_deconverge.binbin0 -> 3246 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/vs_defocus.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/vs_distortion.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/vs_ntsc_decode.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/vs_ntsc_encode.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/vs_phosphor.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/vs_post.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/vs_prescale.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/hlsl/vs_scanline.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/hqx/fs_hq2x.binbin0 -> 11934 bytes-rw-r--r--bgfx/shaders/spirv/chains/hqx/fs_hq3x.binbin0 -> 11966 bytes-rw-r--r--bgfx/shaders/spirv/chains/hqx/fs_hq4x.binbin0 -> 11902 bytes-rw-r--r--bgfx/shaders/spirv/chains/hqx/vs_hq2x.binbin0 -> 2083 bytes-rw-r--r--bgfx/shaders/spirv/chains/hqx/vs_hq3x.binbin0 -> 2083 bytes-rw-r--r--bgfx/shaders/spirv/chains/hqx/vs_hq4x.binbin0 -> 2083 bytes-rw-r--r--bgfx/shaders/spirv/chains/lcd-grid/fs_lcd-grid.binbin0 -> 13747 bytes-rw-r--r--bgfx/shaders/spirv/chains/lcd-grid/fs_persistence.binbin0 -> 1368 bytes-rw-r--r--bgfx/shaders/spirv/chains/lcd-grid/vs_lcd-grid.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/lcd-grid/vs_persistence.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_blit.binbin0 -> 850 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_blit_bcg.binbin0 -> 2012 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_blit_palette16.binbin0 -> 3216 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_blit_rgb32.binbin0 -> 954 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_blit_yuy16.binbin0 -> 2890 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_bob-and-ghost-deinterlace.binbin0 -> 2709 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_deposterize-pass0.binbin0 -> 2398 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_deposterize-pass1.binbin0 -> 2398 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_lut.binbin0 -> 2424 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/fs_saturation.binbin0 -> 1413 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/vs_blit.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/vs_bob-and-ghost-deinterlace.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/vs_deposterize-pass0.binbin0 -> 1727 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/vs_deposterize-pass1.binbin0 -> 1727 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/vs_lut.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/vs_resize_blit.binbin0 -> 1609 bytes-rw-r--r--bgfx/shaders/spirv/chains/misc/vs_saturation.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_left_horizontal/fs_gaussian.binbin0 -> 4785 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_left_horizontal/fs_offset_sat.binbin0 -> 1413 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_left_horizontal/vs_gaussian.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_left_horizontal/vs_offset_sat.binbin0 -> 1377 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_left_vertical/fs_gaussian.binbin0 -> 4785 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_left_vertical/fs_offset_sat.binbin0 -> 1413 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_left_vertical/vs_gaussian.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_left_vertical/vs_offset_sat.binbin0 -> 1377 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_right_horizontal/fs_gaussian.binbin0 -> 4785 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_right_horizontal/fs_offset_sat.binbin0 -> 1413 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_right_horizontal/vs_gaussian.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_right_horizontal/vs_offset_sat.binbin0 -> 1393 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_right_vertical/fs_gaussian.binbin0 -> 4785 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_right_vertical/fs_offset_sat.binbin0 -> 1413 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_right_vertical/vs_gaussian.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/pillarbox_right_vertical/vs_offset_sat.binbin0 -> 1393 bytes-rw-r--r--bgfx/shaders/spirv/chains/unfiltered/fs_blit.binbin0 -> 850 bytes-rw-r--r--bgfx/shaders/spirv/chains/unfiltered/vs_blit.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/warp/fs_dilation-horizontal-fast.binbin0 -> 1374 bytes-rw-r--r--bgfx/shaders/spirv/chains/warp/vs_dilation-horizontal-fast.binbin0 -> 1619 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/fs_xbr-lv1-noblend.binbin0 -> 7110 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/fs_xbr-lv2-3d.binbin0 -> 14694 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/fs_xbr-lv2-fast.binbin0 -> 8332 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/fs_xbr-lv2-noblend.binbin0 -> 9093 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/fs_xbr-lv2.binbin0 -> 10852 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/fs_xbr-lv3-noblend.binbin0 -> 13117 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/fs_xbr-lv3.binbin0 -> 13984 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_custom-jinc2-sharper.binbin0 -> 8619 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.binbin0 -> 10224 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.binbin0 -> 9947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.binbin0 -> 9375 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.binbin0 -> 10260 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.binbin0 -> 10347 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.binbin0 -> 9775 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.binbin0 -> 10224 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.binbin0 -> 10327 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.binbin0 -> 9755 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.binbin0 -> 6448 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.binbin0 -> 6304 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.binbin0 -> 6044 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-xbr-pass0.binbin0 -> 7486 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-xbr-pass1.binbin0 -> 8679 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/fs_super-xbr-pass2.binbin0 -> 7038 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_custom-jinc2-sharper.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.binbin0 -> 2351 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.binbin0 -> 2351 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.binbin0 -> 2351 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-xbr-pass0.binbin0 -> 2351 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-xbr-pass1.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-xbr-pass2.binbin0 -> 2351 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/super-xbr/vs_super-xbr-pass3.binbin0 -> 2351 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/vs_xbr-lv1-noblend.binbin0 -> 1651 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/vs_xbr-lv2-3d.binbin0 -> 3069 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/vs_xbr-lv2-fast.binbin0 -> 2083 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/vs_xbr-lv2-noblend.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/vs_xbr-lv2.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/vs_xbr-lv3-noblend.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/vs_xbr-lv3.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-sharp.binbin0 -> 16340 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2-gamma.binbin0 -> 11752 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2.binbin0 -> 11556 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4-gamma.binbin0 -> 13084 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4.binbin0 -> 12656 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4b.binbin0 -> 12240 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v5-gamma.binbin0 -> 12708 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/fs_2xbr-hybrid.binbin0 -> 16740 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-sharp.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2-gamma.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4-gamma.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4b.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v5-gamma.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-hybrid/vs_2xbr-hybrid.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-a-pass0.binbin0 -> 5086 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass0.binbin0 -> 21923 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass1.binbin0 -> 9131 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-b-pass0.binbin0 -> 5558 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-c-pass0.binbin0 -> 6326 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-d-pass0.binbin0 -> 6126 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-noblend-pass1.binbin0 -> 6635 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-pass1.binbin0 -> 7029 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-a-pass0.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass0.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass1.binbin0 -> 1879 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-b-pass0.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-c-pass0.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-d-pass0.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-noblend-pass1.binbin0 -> 1879 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-pass1.binbin0 -> 1879 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass0.binbin0 -> 14986 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass1.binbin0 -> 8411 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass0.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass1.binbin0 -> 2111 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass1.binbin0 -> 16278 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass2.binbin0 -> 9817 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass3.binbin0 -> 7591 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass4.binbin0 -> 10159 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass1.binbin0 -> 1567 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass2.binbin0 -> 2947 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass3.binbin0 -> 1619 bytes-rw-r--r--bgfx/shaders/spirv/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass4.binbin0 -> 1619 bytes-rw-r--r--bgfx/shaders/spirv/fs_gui.binbin0 -> 850 bytes-rw-r--r--bgfx/shaders/spirv/fs_screen.binbin0 -> 850 bytes-rw-r--r--bgfx/shaders/spirv/vs_gui.binbin0 -> 1257 bytes-rw-r--r--bgfx/shaders/spirv/vs_screen.binbin0 -> 1257 bytes-rw-r--r--ctrlr/hotrod.cfg139
-rw-r--r--ctrlr/hotrodse.cfg193
-rw-r--r--ctrlr/scorpionxg.cfg195
-rw-r--r--ctrlr/slikstik.cfg314
-rw-r--r--ctrlr/xarcade.cfg193
-rw-r--r--dist.mak135
-rw-r--r--docs/LICENSE117
-rw-r--r--docs/Makefile158
-rw-r--r--docs/README.md4
-rw-r--r--docs/config.txt989
-rw-r--r--docs/legal/BSD-2-Clause24
-rw-r--r--docs/legal/BSD-3-Clause28
-rw-r--r--docs/legal/BSL-1.023
-rw-r--r--docs/legal/CC0114
-rw-r--r--docs/legal/GPL-2.0341
-rw-r--r--docs/legal/LGPL-2.1499
-rw-r--r--docs/legal/MIT20
-rw-r--r--docs/legal/Zlib20
-rw-r--r--docs/license.txt32
-rw-r--r--docs/mame.txt81
-rw-r--r--docs/man/LICENSE116
-rw-r--r--docs/man/README.md5
-rw-r--r--docs/man/castool.146
-rw-r--r--docs/man/chdman.1255
-rw-r--r--docs/man/floptool.147
-rw-r--r--docs/man/imgtool.1157
-rw-r--r--docs/man/jedutil.149
-rw-r--r--docs/man/ldplayer.152
-rw-r--r--docs/man/ldresample.146
-rw-r--r--docs/man/ldverify.125
-rw-r--r--docs/man/mame.61301
-rw-r--r--docs/man/romcmp.159
-rw-r--r--docs/newvideo.txt146
-rw-r--r--docs/source/__init__.py0
-rw-r--r--docs/source/_ext/edit_on_github.py42
-rw-r--r--docs/source/_templates/versions.html7
-rw-r--r--docs/source/advanced/bgfx.rst219
-rw-r--r--docs/source/advanced/ctrlr_config.rst309
-rw-r--r--docs/source/advanced/devicemap.rst133
-rw-r--r--docs/source/advanced/glsl.rst84
-rw-r--r--docs/source/advanced/hlsl.rst318
-rw-r--r--docs/source/advanced/index.rst15
-rw-r--r--docs/source/advanced/linux-lightguns.rst76
-rw-r--r--docs/source/advanced/multiconfig.rst126
-rw-r--r--docs/source/advanced/paths.rst29
-rw-r--r--docs/source/advanced/shiftertoggle.rst41
-rw-r--r--docs/source/commandline/commandline-all.rst4253
-rw-r--r--docs/source/commandline/commandline-index.rst439
-rw-r--r--docs/source/commandline/index.rst11
-rw-r--r--docs/source/commandline/sdlconfig.rst135
-rw-r--r--docs/source/commandline/windowsconfig.rst101
-rw-r--r--docs/source/conf.py273
-rw-r--r--docs/source/contributing/cxx.rst573
-rw-r--r--docs/source/contributing/index.rst158
-rw-r--r--docs/source/contributing/softlist.rst183
-rw-r--r--docs/source/debugger/annotation.rst109
-rw-r--r--docs/source/debugger/breakpoint.rst168
-rw-r--r--docs/source/debugger/cheats.rst294
-rw-r--r--docs/source/debugger/exceptionpoint.rst134
-rw-r--r--docs/source/debugger/execution.rst550
-rw-r--r--docs/source/debugger/general.rst587
-rw-r--r--docs/source/debugger/image.rst80
-rw-r--r--docs/source/debugger/index.rst440
-rw-r--r--docs/source/debugger/memory.rst422
-rw-r--r--docs/source/debugger/registerpoints.rst150
-rw-r--r--docs/source/debugger/watchpoint.rst178
-rw-r--r--docs/source/healthwarning.rst29
-rw-r--r--docs/source/images/MAMElogo.svg25
-rw-r--r--docs/source/index.rst41
-rw-r--r--docs/source/initialsetup/compilingmame.rst858
-rw-r--r--docs/source/initialsetup/configuringmame.rst66
-rw-r--r--docs/source/initialsetup/index.rst13
-rw-r--r--docs/source/initialsetup/installingmame.rst21
-rw-r--r--docs/source/initialsetup/mameintro.rst130
-rw-r--r--docs/source/license.rst32
-rw-r--r--docs/source/luascript/index.rst235
-rw-r--r--docs/source/luascript/ref-common.rst124
-rw-r--r--docs/source/luascript/ref-core.rst633
-rw-r--r--docs/source/luascript/ref-debugger.rst451
-rw-r--r--docs/source/luascript/ref-devices.rst880
-rw-r--r--docs/source/luascript/ref-input.rst796
-rw-r--r--docs/source/luascript/ref-mem.rst461
-rw-r--r--docs/source/luascript/ref-render.rst1374
-rw-r--r--docs/source/plugins/autofire.rst115
-rw-r--r--docs/source/plugins/console.rst9
-rw-r--r--docs/source/plugins/data.rst58
-rw-r--r--docs/source/plugins/discord.rst10
-rw-r--r--docs/source/plugins/dummy.rst8
-rw-r--r--docs/source/plugins/gdbstub.rst13
-rw-r--r--docs/source/plugins/hiscore.rst28
-rw-r--r--docs/source/plugins/index.rst75
-rw-r--r--docs/source/plugins/inputmacro.rst296
-rw-r--r--docs/source/plugins/layout.rst9
-rw-r--r--docs/source/plugins/offscreenreload.rst90
-rw-r--r--docs/source/plugins/timecode.rst21
-rw-r--r--docs/source/plugins/timer.rst22
-rw-r--r--docs/source/security.rst8
-rw-r--r--docs/source/techspecs/audio_effects.rst147
-rw-r--r--docs/source/techspecs/cpu_device.rst229
-rw-r--r--docs/source/techspecs/device_disasm_interface.rst204
-rw-r--r--docs/source/techspecs/device_memory_interface.rst168
-rw-r--r--docs/source/techspecs/device_rom_interface.rst113
-rw-r--r--docs/source/techspecs/device_sound_interface.rst319
-rw-r--r--docs/source/techspecs/floppy.rst414
-rw-r--r--docs/source/techspecs/index.rst27
-rw-r--r--docs/source/techspecs/inputsystem.rst460
-rw-r--r--docs/source/techspecs/layout_files.rst1502
-rw-r--r--docs/source/techspecs/layout_script.rst786
-rw-r--r--docs/source/techspecs/m6502.rst379
-rw-r--r--docs/source/techspecs/memory.rst964
-rw-r--r--docs/source/techspecs/naming.rst95
-rw-r--r--docs/source/techspecs/nscsi.rst174
-rw-r--r--docs/source/techspecs/object_finders.rst1039
-rw-r--r--docs/source/techspecs/osd_audio.rst363
-rw-r--r--docs/source/techspecs/poly_manager.rst1084
-rw-r--r--docs/source/techspecs/uml_instructions.rst4457
-rw-r--r--docs/source/tools/castool.rst342
-rw-r--r--docs/source/tools/chdman.rst457
-rw-r--r--docs/source/tools/floptool.rst200
-rw-r--r--docs/source/tools/imgtool.rst1676
-rw-r--r--docs/source/tools/index.rst14
-rw-r--r--docs/source/tools/othertools.rst64
-rw-r--r--docs/source/usingmame/aboutromsets.rst91
-rw-r--r--docs/source/usingmame/assetsearch.rst398
-rw-r--r--docs/source/usingmame/commonissues.rst369
-rw-r--r--docs/source/usingmame/defaultkeys.rst754
-rw-r--r--docs/source/usingmame/frontends.rst40
-rw-r--r--docs/source/usingmame/images/mahjongpanel.svg215
-rw-r--r--docs/source/usingmame/index.rst19
-rw-r--r--docs/source/usingmame/mamemenus.rst478
-rw-r--r--docs/source/usingmame/ui.rst538
-rw-r--r--docs/source/usingmame/usingmame.rst112
-rw-r--r--docs/source/whatis.rst87
-rw-r--r--docs/themes/sphinx_rtd_theme/__init__.py77
-rw-r--r--docs/themes/sphinx_rtd_theme/breadcrumbs.html77
-rw-r--r--docs/themes/sphinx_rtd_theme/footer.html62
-rw-r--r--docs/themes/sphinx_rtd_theme/layout.html251
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/da/LC_MESSAGES/sphinx.mobin0 -> 2514 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/da/LC_MESSAGES/sphinx.po206
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.mobin0 -> 2087 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/de/LC_MESSAGES/sphinx.po136
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.mobin0 -> 457 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/en/LC_MESSAGES/sphinx.po201
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.mobin0 -> 2567 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/es/LC_MESSAGES/sphinx.po169
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.mobin0 -> 2380 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/et/LC_MESSAGES/sphinx.po166
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/fa_IR/LC_MESSAGES/sphinx.mobin0 -> 2693 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/fa_IR/LC_MESSAGES/sphinx.po161
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.mobin0 -> 2522 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/fr/LC_MESSAGES/sphinx.po169
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/hr/LC_MESSAGES/sphinx.mobin0 -> 575 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/hr/LC_MESSAGES/sphinx.po23
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/hu/LC_MESSAGES/sphinx.mobin0 -> 501 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/hu/LC_MESSAGES/sphinx.po23
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/it/LC_MESSAGES/sphinx.mobin0 -> 2703 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/it/LC_MESSAGES/sphinx.po192
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/lt/LC_MESSAGES/sphinx.mobin0 -> 2750 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/lt/LC_MESSAGES/sphinx.po188
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.mobin0 -> 2549 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/nl/LC_MESSAGES/sphinx.po188
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/pl/LC_MESSAGES/sphinx.mobin0 -> 2339 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/pl/LC_MESSAGES/sphinx.po137
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/pt/LC_MESSAGES/sphinx.mobin0 -> 2354 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/pt/LC_MESSAGES/sphinx.po161
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.mobin0 -> 2780 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/pt_BR/LC_MESSAGES/sphinx.po191
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.mobin0 -> 3449 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/ru/LC_MESSAGES/sphinx.po189
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/sphinx.pot182
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.mobin0 -> 2132 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/sv/LC_MESSAGES/sphinx.po151
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.mobin0 -> 2117 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/tr/LC_MESSAGES/sphinx.po143
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.mobin0 -> 2511 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/zh_CN/LC_MESSAGES/sphinx.po188
-rw-r--r--docs/themes/sphinx_rtd_theme/locale/zh_TW/LC_MESSAGES/sphinx.mobin0 -> 506 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/locale/zh_TW/LC_MESSAGES/sphinx.po23
-rw-r--r--docs/themes/sphinx_rtd_theme/search.html54
-rw-r--r--docs/themes/sphinx_rtd_theme/searchbox.html9
-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/badge_only.css1
-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woffbin0 -> 87624 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Bold.woff2bin0 -> 67312 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woffbin0 -> 86288 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/Roboto-Slab-Regular.woff2bin0 -> 66444 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.eotbin0 -> 165742 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.svg2671
-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.ttfbin0 -> 165548 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woffbin0 -> 98024 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/fontawesome-webfont.woff2bin0 -> 77160 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woffbin0 -> 323344 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/lato-bold-italic.woff2bin0 -> 193308 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woffbin0 -> 309728 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/lato-bold.woff2bin0 -> 184912 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woffbin0 -> 328412 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/lato-normal-italic.woff2bin0 -> 195704 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woffbin0 -> 309192 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/fonts/lato-normal.woff2bin0 -> 182708 bytes-rw-r--r--docs/themes/sphinx_rtd_theme/static/css/theme.css4
-rw-r--r--docs/themes/sphinx_rtd_theme/static/js/badge_only.js1
-rw-r--r--docs/themes/sphinx_rtd_theme/static/js/theme.js1
-rw-r--r--docs/themes/sphinx_rtd_theme/theme.conf20
-rw-r--r--docs/themes/sphinx_rtd_theme/versions.html34
-rwxr-xr-xdocs/update.sh21
-rw-r--r--docs/windows.txt362
-rw-r--r--doxygen/LICENSE116
-rw-r--r--doxygen/README.md8
-rw-r--r--doxygen/doxy-boot.js271
-rw-r--r--doxygen/doxygen.config2590
-rw-r--r--doxygen/footer.html34
-rw-r--r--doxygen/header.html42
-rw-r--r--doxygen/style.css468
-rw-r--r--hash/32x.xml3012
-rw-r--r--hash/3do.xml96
-rw-r--r--hash/3do_m2.xml60
-rw-r--r--hash/README.md6
-rw-r--r--hash/a2600.xml18948
-rw-r--r--hash/a2600_cass.xml724
-rw-r--r--hash/a5200.hsi934
-rw-r--r--hash/a5200.xml1611
-rw-r--r--hash/a7800.xml3274
-rw-r--r--hash/a800.xml7382
-rw-r--r--hash/a800_cass.xml49
-rw-r--r--hash/a800_flop.xml988
-rw-r--r--hash/abc1600_flop.xml196
-rw-r--r--hash/abc1600_hdd.xml21
-rw-r--r--hash/abc800_hdd.xml50
-rw-r--r--hash/abc806_flop.xml151
-rw-r--r--hash/abc80_cass.xml35
-rw-r--r--hash/abc80_flop.xml149
-rw-r--r--hash/abc80_rom.xml83
-rw-r--r--hash/abc830_flop.xml237
-rw-r--r--hash/abc832_flop.xml465
-rw-r--r--hash/abc838_flop.xml63
-rw-r--r--hash/acrnsys_flop.xml55
-rw-r--r--hash/acrnsys_rom.xml71
-rw-r--r--hash/adam_cart.xml170
-rw-r--r--hash/adam_cass.xml1000
-rw-r--r--hash/adam_flop.xml17914
-rw-r--r--hash/advantage.xml188
-rw-r--r--hash/advision.xml78
-rw-r--r--hash/aim65_cart.xml232
-rw-r--r--hash/aleste.xml45
-rw-r--r--hash/alice32.xml809
-rw-r--r--hash/alice90.xml127
-rw-r--r--hash/alphasmart_kapps.xml394
-rw-r--r--hash/alphatro_cart.xml30
-rw-r--r--hash/alphatro_flop.xml44
-rw-r--r--hash/altos5.xml45
-rw-r--r--hash/altos586.xml19
-rw-r--r--hash/altos8600.xml30
-rw-r--r--hash/amiga_amix.xml118
-rw-r--r--hash/amiga_apps.xml206
-rw-r--r--hash/amiga_cd.xml347
-rw-r--r--hash/amiga_demos.xml90
-rw-r--r--hash/amiga_flop.xml9454
-rw-r--r--hash/amiga_hardware.xml259
-rw-r--r--hash/amiga_hdd.xml56
-rw-r--r--hash/amiga_workbench.xml1478
-rw-r--r--hash/amigaaga_flop.xml5092
-rw-r--r--hash/amigaecs_flop.xml825
-rw-r--r--hash/amigaocs_flop.xml57472
-rw-r--r--hash/ampro.xml63
-rw-r--r--hash/apc.xml392
-rw-r--r--hash/apexc_cyl.xml48
-rw-r--r--hash/apfimag_cass.xml1216
-rw-r--r--hash/apfm1000.xml290
-rw-r--r--hash/apogee.xml1262
-rw-r--r--hash/apollo_ctape.xml52
-rw-r--r--hash/apple1.xml521
-rw-r--r--hash/apple2_cass.xml3349
-rw-r--r--hash/apple2_flop_clcracked.xml65585
-rw-r--r--hash/apple2_flop_misc.xml7792
-rw-r--r--hash/apple2_flop_orig.xml47310
-rw-r--r--hash/apple2_rom.xml45
-rw-r--r--hash/apple2gs_flop_clcracked.xml3367
-rw-r--r--hash/apple2gs_flop_misc.xml7564
-rw-r--r--hash/apple2gs_flop_orig.xml5408
-rw-r--r--hash/apple3.xml301
-rw-r--r--hash/applix_flop.xml19
-rw-r--r--hash/apricot_flop.xml868
-rw-r--r--hash/apxen_flop.xml47
-rw-r--r--hash/aquarius_cart.xml445
-rw-r--r--hash/aquarius_cass.xml868
-rw-r--r--hash/arb.xml83
-rw-r--r--hash/arcadia.xml1180
-rw-r--r--hash/archimedes.xml7257
-rw-r--r--hash/archimedes_hdd.xml20
-rw-r--r--hash/archimedes_rom.xml71
-rw-r--r--hash/astrocde.xml1468
-rw-r--r--hash/atom_cass.xml539
-rw-r--r--hash/atom_flop.xml210
-rw-r--r--hash/atom_rom.xml480
-rw-r--r--hash/attache.xml20
-rw-r--r--hash/aussiebyte.xml19
-rw-r--r--hash/b2m.xml42
-rw-r--r--hash/basf7100.xml31
-rw-r--r--hash/bbc_cass.xml20305
-rw-r--r--hash/bbc_flop_32016.xml204
-rw-r--r--hash/bbc_flop_6502.xml168
-rw-r--r--hash/bbc_flop_68000.xml49
-rw-r--r--hash/bbc_flop_80186.xml191
-rw-r--r--hash/bbc_flop_arm.xml287
-rw-r--r--hash/bbc_flop_hybrid.xml1107
-rw-r--r--hash/bbc_flop_torch.xml468
-rw-r--r--hash/bbc_flop_z80.xml184
-rw-r--r--hash/bbc_hdd.xml81
-rw-r--r--hash/bbc_rom.xml14378
-rw-r--r--hash/bbc_vsm.xml80
-rw-r--r--hash/bbcb_flop.xml3457
-rw-r--r--hash/bbcb_flop_orig.xml4463
-rw-r--r--hash/bbcb_flop_us.xml26
-rw-r--r--hash/bbcbc.xml138
-rw-r--r--hash/bbcm_cart.xml309
-rw-r--r--hash/bbcm_flop.xml160
-rw-r--r--hash/bbcmc_flop.xml481
-rw-r--r--hash/bdesignm_design_cart.xml120
-rw-r--r--hash/bdesignm_game_cart.xml113
-rw-r--r--hash/bingobear.xml46
-rw-r--r--hash/bk0010.xml1402
-rw-r--r--hash/bkrankp_cart.xml257
-rw-r--r--hash/bmjr_cass.xml22
-rw-r--r--hash/bml3_cass.xml37
-rw-r--r--hash/bml3_flop.xml122
-rw-r--r--hash/brother_pn.xml57
-rw-r--r--hash/bungo_flop.xml61
-rw-r--r--hash/buzztime_cart.xml54
-rw-r--r--hash/bw12.xml29
-rw-r--r--hash/bw14.xml109
-rw-r--r--hash/bw2.xml87
-rw-r--r--hash/bx256hp_flop.xml152
-rw-r--r--hash/c128_cart.xml238
-rw-r--r--hash/c128_flop.xml788
-rw-r--r--hash/c128_rom.xml113
-rw-r--r--hash/c2color_cart.xml96
-rw-r--r--hash/c64_cart.xml7273
-rw-r--r--hash/c64_cass.xml16814
-rw-r--r--hash/c64_flop_misc.xml885
-rw-r--r--hash/c64_flop_orig.xml865
-rw-r--r--hash/c65_flop.xml23
-rw-r--r--hash/camplynx_cass.xml991
-rw-r--r--hash/camplynx_flop.xml396
-rw-r--r--hash/carbeena.xml24
-rw-r--r--hash/casio_rompack.xml2260
-rw-r--r--hash/casloopy.xml174
-rw-r--r--hash/cassvisn_cart.xml215
-rw-r--r--hash/cbm2_cart.xml77
-rw-r--r--hash/cbm2_flop.xml1791
-rw-r--r--hash/cbm8096_flop.xml33
-rw-r--r--hash/cbm8296_flop.xml44
-rw-r--r--hash/cc40_cart.xml130
-rw-r--r--hash/cd32.xml2009
-rw-r--r--hash/cdi.xml11218
-rw-r--r--hash/cdtv.xml2564
-rw-r--r--hash/cecflop.xml251
-rw-r--r--hash/cgenie_cass.xml3531
-rw-r--r--hash/cgenie_flop_rom.xml33
-rw-r--r--hash/challenge_gear_cart.xml68
-rw-r--r--hash/channelf.xml593
-rw-r--r--hash/chessking_cart.xml20
-rw-r--r--hash/chessmstdm.xml31
-rw-r--r--hash/chip8_quik.xml912
-rw-r--r--hash/clickstart_cart.xml220
-rw-r--r--hash/clipper_flop.xml32
-rw-r--r--hash/coco_cart.xml1574
-rw-r--r--hash/coco_flop.xml1974
-rw-r--r--hash/coleco.xml3420
-rw-r--r--hash/coleco_homebrew.xml2604
-rw-r--r--hash/compclr2_flop.xml2812
-rw-r--r--hash/compis.xml438
-rw-r--r--hash/comx35_flop.xml20
-rw-r--r--hash/conchess.xml35
-rw-r--r--hash/copera.xml150
-rw-r--r--hash/cpc_cass.xml45471
-rw-r--r--hash/cpc_flop.xml287597
-rw-r--r--hash/crvision.xml673
-rw-r--r--hash/ctvboy.xml90
-rw-r--r--hash/cubieboard4.xml110
-rw-r--r--hash/cx3000tc.xml66
-rw-r--r--hash/cz1_cart.xml44
-rw-r--r--hash/dai_cass.xml123
-rw-r--r--hash/database.xml269
-rw-r--r--hash/dc.xml24017
-rw-r--r--hash/dgnalpha_flop.xml174
-rw-r--r--hash/dgnbeta_flop.xml53
-rw-r--r--hash/digiblast_cart.xml78
-rw-r--r--hash/digilog320.xml50
-rw-r--r--hash/dim68k.xml205
-rw-r--r--hash/dmv.xml1468
-rw-r--r--hash/dps1.xml24
-rw-r--r--hash/dragon_cart.xml532
-rw-r--r--hash/dragon_cass.xml12231
-rw-r--r--hash/dragon_flex.xml326
-rw-r--r--hash/dragon_flop.xml2193
-rw-r--r--hash/dragon_os9.xml207
-rw-r--r--hash/duelmast_cart.xml28
-rw-r--r--hash/e01_flop.xml33
-rw-r--r--hash/easy_karaoke_cart.xml371
-rw-r--r--hash/ec1841.xml129
-rw-r--r--hash/einstein.xml1667
-rw-r--r--hash/einstein_rom.xml20
-rw-r--r--hash/ekara_cart.xml4198
-rw-r--r--hash/electron_cart.xml643
-rw-r--r--hash/electron_cass.xml7936
-rw-r--r--hash/electron_flop.xml3018
-rw-r--r--hash/electron_rom.xml1047
-rw-r--r--hash/entex_sag.xml103
-rw-r--r--hash/ep64_cart.xml189
-rw-r--r--hash/ep64_cass.xml44
-rw-r--r--hash/ep64_flop.xml1982
-rw-r--r--hash/epson_cpm.xml171
-rw-r--r--hash/eti660_quik.xml71
-rw-r--r--hash/evio.xml330
-rw-r--r--hash/ews286_flop.xml45
-rw-r--r--hash/excalibur64.xml19
-rw-r--r--hash/exl100.xml193
-rw-r--r--hash/famibox.xml768
-rw-r--r--hash/famicom_cass.xml554
-rw-r--r--hash/famicom_flop.xml4223
-rw-r--r--hash/fidel_msc.xml38
-rw-r--r--hash/fidel_sc6.xml20
-rw-r--r--hash/fidel_scc.xml105
-rw-r--r--hash/fm77av.xml1389
-rw-r--r--hash/fm7_cass.xml2232
-rw-r--r--hash/fm7_disk.xml2559
-rw-r--r--hash/fm8_cass.xml377
-rw-r--r--hash/fmtowns_cd.xml32233
-rw-r--r--hash/fmtowns_flop_cracked.xml88
-rw-r--r--hash/fmtowns_flop_misc.xml1493
-rw-r--r--hash/fmtowns_flop_orig.xml2951
-rw-r--r--hash/fp1100_cass.xml150
-rw-r--r--hash/gaelco_ds5002fp_rom.xml108
-rw-r--r--hash/galaxy.xml734
-rw-r--r--hash/gamate.xml816
-rw-r--r--hash/gameboy.xml28239
-rw-r--r--hash/gamecom.xml309
-rw-r--r--hash/gamegear.xml10622
-rw-r--r--hash/gameking.xml579
-rw-r--r--hash/gameking3.xml126
-rw-r--r--hash/gamepock.xml86
-rw-r--r--hash/gba.xml42304
-rw-r--r--hash/gba_ereader.xml6879
-rw-r--r--hash/gbcolor.xml28750
-rw-r--r--hash/gcslottv.xml73
-rw-r--r--hash/generic_cdrom.xml1228
-rw-r--r--hash/generic_flop_525.xml131
-rw-r--r--hash/ggm.xml170
-rw-r--r--hash/gimix.xml58
-rw-r--r--hash/gj4000.xml21
-rw-r--r--hash/gjmovie.xml21
-rw-r--r--hash/gjrstar.xml62
-rw-r--r--hash/gl2000.xml92
-rw-r--r--hash/gl6000sl.xml33
-rw-r--r--hash/glcolor.xml75
-rw-r--r--hash/glcx.xml111
-rw-r--r--hash/gln.xml51
-rw-r--r--hash/gls.xml21
-rw-r--r--hash/gmaster.xml222
-rw-r--r--hash/gp32.xml524
-rw-r--r--hash/gtfore.xml68
-rw-r--r--hash/guab.xml130
-rw-r--r--hash/gx4000.xml386
-rw-r--r--hash/h21.xml61
-rw-r--r--hash/h88_cass.xml168
-rw-r--r--hash/hikara.xml402
-rw-r--r--hash/horizon.xml3330
-rw-r--r--hash/hp85_rom.xml86
-rw-r--r--hash/hp86_rom.xml151
-rw-r--r--hash/hp9825_rom.xml161
-rw-r--r--hash/hp9831_rom.xml35
-rw-r--r--hash/hp9835a_rom.xml66
-rw-r--r--hash/hp9845a_rom.xml116
-rw-r--r--hash/hp9845b_rom.xml387
-rw-r--r--hash/hp98x6_rom.xml46
-rw-r--r--hash/hp9k3xx_cdrom.xml194
-rw-r--r--hash/hp9k3xx_flop.xml748
-rw-r--r--hash/hp9k3xx_hdd.xml24
-rw-r--r--hash/hp_ipc.xml723
-rw-r--r--hash/hp_ipc_rom.xml22
-rw-r--r--hash/ht68k.xml34
-rw-r--r--hash/hx20_rom.xml31
-rw-r--r--hash/hyperscan.xml86
-rw-r--r--hash/hyperscan_card.xml5488
-rw-r--r--hash/i7000_card.xml149
-rw-r--r--hash/ibm5140.xml59
-rw-r--r--hash/ibm5150.xml19329
-rw-r--r--hash/ibm5150_cass.xml20
-rw-r--r--hash/ibm5150_hdd.xml170
-rw-r--r--hash/ibm5170.xml25731
-rw-r--r--hash/ibm5170_cdrom.xml9621
-rw-r--r--hash/ibm5170_hdd.xml389
-rw-r--r--hash/ibm6580.xml152
-rw-r--r--hash/ibmpc110.xml43
-rw-r--r--hash/ibmpcjr_cart.xml257
-rw-r--r--hash/ibmpcjr_flop.xml178
-rw-r--r--hash/ibmpcjx.xml61
-rw-r--r--hash/icanguit.xml128
-rw-r--r--hash/icanpian.xml210
-rw-r--r--hash/intellect02.xml33
-rw-r--r--hash/interact.xml430
-rw-r--r--hash/interpro.xml344
-rw-r--r--hash/intv.hsi687
-rw-r--r--hash/intv.xml2725
-rw-r--r--hash/intvecs.xml171
-rw-r--r--hash/iq128.xml49
-rw-r--r--hash/iq151_cart.xml60
-rw-r--r--hash/iq151_flop.xml30
-rw-r--r--hash/ique.xml479
-rw-r--r--hash/iqunlim_cart.xml73
-rw-r--r--hash/itt3030.xml40
-rw-r--r--hash/jaguar.xml1986
-rw-r--r--hash/jakks_gamekey_dp.xml21
-rw-r--r--hash/jakks_gamekey_dy.xml58
-rw-r--r--hash/jakks_gamekey_mv.xml22
-rw-r--r--hash/jakks_gamekey_nk.xml48
-rw-r--r--hash/jakks_gamekey_nm.xml51
-rw-r--r--hash/jakks_gamekey_sw.xml67
-rw-r--r--hash/jakks_gamekey_wp.xml29
-rw-r--r--hash/jaminator.xml196
-rw-r--r--hash/jazz.xml56
-rw-r--r--hash/jb3000_flop.xml23
-rw-r--r--hash/juicebox.xml510
-rw-r--r--hash/juku.xml128
-rw-r--r--hash/jupace_cass.xml1881
-rw-r--r--hash/jupace_snap.xml71
-rw-r--r--hash/k28.xml99
-rw-r--r--hash/k28o.xml35
-rw-r--r--hash/kaypro.xml241
-rw-r--r--hash/kc_cart.xml69
-rw-r--r--hash/kc_cass.xml2161
-rw-r--r--hash/kc_flop.xml67
-rw-r--r--hash/kim1_cass.xml119
-rw-r--r--hash/kisssite_cd.xml351
-rw-r--r--hash/korvet_flop.xml250
-rw-r--r--hash/kpython2.xml121
-rw-r--r--hash/lanteach.xml20
-rw-r--r--hash/lantrans.xml84
-rw-r--r--hash/laser2001_cart.xml24
-rw-r--r--hash/laser2001_flop.xml20
-rw-r--r--hash/leapfrog_didj_cart.xml85
-rw-r--r--hash/leapfrog_iquest_cart.xml30
-rw-r--r--hash/leapfrog_leappad_cart.xml1558
-rw-r--r--hash/leapfrog_ltleappad_cart.xml147
-rw-r--r--hash/leapfrog_mfleappad_cart.xml170
-rw-r--r--hash/leapfrog_zippity_cart.xml53
-rw-r--r--hash/leapster.xml1789
-rw-r--r--hash/leapster_explorer_cart.xml44
-rw-r--r--hash/lisa.xml1025
-rw-r--r--hash/lisa2.xml152
-rw-r--r--hash/lk3000.xml82
-rw-r--r--hash/lnux4004.xml20
-rw-r--r--hash/lviv.xml3397
-rw-r--r--hash/lynx.xml1569
-rw-r--r--hash/m20.xml648
-rw-r--r--hash/m24.xml22
-rw-r--r--hash/m3.xml20
-rw-r--r--hash/m5_cart.xml710
-rw-r--r--hash/m5_cass.xml429
-rw-r--r--hash/m5_flop.xml30
-rw-r--r--hash/mac_cdrom.xml277
-rw-r--r--hash/mac_flop.xml234
-rw-r--r--hash/mac_flop_clcracked.xml2802
-rw-r--r--hash/mac_flop_orig.xml4118
-rw-r--r--hash/mac_hdd.xml117
-rw-r--r--hash/mac_hdflop.xml7549
-rw-r--r--hash/mbc200.xml32
-rw-r--r--hash/mbc55x.xml207
-rw-r--r--hash/mbee_cart.xml654
-rw-r--r--hash/mbee_cass.xml55
-rw-r--r--hash/mbee_flop.xml5974
-rw-r--r--hash/mbee_quik.xml1964
-rw-r--r--hash/mc10.xml1643
-rw-r--r--hash/mc1000_cass.xml1295
-rw-r--r--hash/mc1502_flop.xml30
-rw-r--r--hash/md2_flop.xml77
-rw-r--r--hash/megacd.xml17192
-rw-r--r--hash/megadriv.xml40261
-rw-r--r--hash/megaduck.xml362
-rw-r--r--hash/megapc.xml52
-rw-r--r--hash/megatech.xml695
-rw-r--r--hash/mephisto_mm1.xml22
-rw-r--r--hash/mephisto_mm2.xml22
-rw-r--r--hash/mephisto_mm4.xml22
-rw-r--r--hash/mephisto_mm5.xml22
-rw-r--r--hash/mephisto_smondial2.xml21
-rw-r--r--hash/microbox2_flop.xml31
-rw-r--r--hash/microvision.xml323
-rw-r--r--hash/midi_flop.xml31
-rw-r--r--hash/mikro80.xml52
-rw-r--r--hash/mikrosha_cart.xml19
-rw-r--r--hash/mikrosha_cass.xml620
-rw-r--r--hash/mindset_flop.xml24
-rw-r--r--hash/misterx.xml42
-rw-r--r--hash/mk14_quik.xml51
-rw-r--r--hash/mm1_flop.xml119
-rw-r--r--hash/mm2_flop.xml45
-rw-r--r--hash/mm2_hdd.xml21
-rw-r--r--hash/mo5_cart.xml640
-rw-r--r--hash/mo5_cass.xml19644
-rw-r--r--hash/mo5_flop.xml998
-rw-r--r--hash/mo5_qd.xml376
-rw-r--r--hash/mo6_cass.xml1973
-rw-r--r--hash/mo6_flop.xml627
-rw-r--r--hash/mobigo_cart.xml581
-rw-r--r--hash/monon_color.xml300
-rw-r--r--hash/mpc3000_flop.xml87
-rw-r--r--hash/mpc60_flop.xml370
-rw-r--r--hash/mpf1_rom.xml93
-rw-r--r--hash/mpu1000.xml22
-rw-r--r--hash/mpz80.xml635
-rw-r--r--hash/msx.hsi4559
-rw-r--r--hash/msx1_bee_card.xml153
-rw-r--r--hash/msx1_cart.xml28125
-rw-r--r--hash/msx1_cass.xml20402
-rw-r--r--hash/msx1_flop.xml6047
-rw-r--r--hash/msx1_flop_525.xml218
-rw-r--r--hash/msx2.hsi8889
-rw-r--r--hash/msx2_cart.xml4837
-rw-r--r--hash/msx2_cass.xml67
-rw-r--r--hash/msx2_flop.xml26571
-rw-r--r--hash/msx2p_cart.xml56
-rw-r--r--hash/msx2p_flop.xml825
-rw-r--r--hash/msx_softcard.xml79
-rw-r--r--hash/msx_yamaha_minicart.xml30
-rw-r--r--hash/msxr_cart.xml106
-rw-r--r--hash/msxr_flop.xml1359
-rw-r--r--hash/mt65_cass.xml107
-rw-r--r--hash/mt65_rom.xml221
-rw-r--r--hash/mt65_snap.xml179
-rw-r--r--hash/mtu130_flop.xml78
-rw-r--r--hash/mtx_cart.xml104
-rw-r--r--hash/mtx_cass.xml685
-rw-r--r--hash/mtx_flop.xml119
-rw-r--r--hash/mtx_hdd.xml53
-rw-r--r--hash/mtx_rom.xml50
-rw-r--r--hash/myvision.xml75
-rw-r--r--hash/mz2000_cass.xml516
-rw-r--r--hash/mz2000_flop.xml194
-rw-r--r--hash/mz2000_snap.xml188
-rw-r--r--hash/mz2500_flop.xml1273
-rw-r--r--hash/mz5500_flop.xml96
-rw-r--r--hash/mz700_cass.xml2872
-rw-r--r--hash/mz800_cass.xml191
-rw-r--r--hash/mz800_rom.xml52
-rw-r--r--hash/mz80b_cass.xml118
-rw-r--r--hash/mz80b_flop.xml55
-rw-r--r--hash/mz80k_cass.xml508
-rw-r--r--hash/n64.xml15687
-rw-r--r--hash/n64_lodgenet.xml438
-rw-r--r--hash/n64dd.xml182
-rw-r--r--hash/nascom_flop.xml116
-rw-r--r--hash/nascom_snap.xml918
-rw-r--r--hash/nascom_socket.xml85
-rw-r--r--hash/neocd.xml1645
-rw-r--r--hash/neogeo.xml12464
-rw-r--r--hash/nes.hsi73949
-rw-r--r--hash/nes.xml87087
-rw-r--r--hash/nes_ade.xml105
-rw-r--r--hash/nes_datach.xml123
-rw-r--r--hash/nes_kstudio.xml39
-rw-r--r--hash/nes_ntbrom.xml36
-rw-r--r--hash/nes_vt_cart.xml33
-rw-r--r--hash/next.xml108
-rw-r--r--hash/next_cdrom.xml84
-rw-r--r--hash/next_hdd.xml188
-rw-r--r--hash/ngp.xml162
-rw-r--r--hash/ngpc.xml1707
-rw-r--r--hash/nimbus.xml373
-rw-r--r--hash/novag_ssensor4.xml22
-rw-r--r--hash/nuon.xml104
-rw-r--r--hash/octopus.xml93
-rw-r--r--hash/ondra.xml134
-rw-r--r--hash/orao.xml694
-rw-r--r--hash/oric1_cass.xml5281
-rw-r--r--hash/orina_stylish_plus_cart.xml21
-rw-r--r--hash/orion_cart.xml31
-rw-r--r--hash/orion_cass.xml912
-rw-r--r--hash/orion_flop.xml1263
-rw-r--r--hash/orionpro_flop.xml362
-rw-r--r--hash/osborne1.xml286
-rw-r--r--hash/osborne2.xml68
-rw-r--r--hash/p2000_cart.xml632
-rw-r--r--hash/p2000_cass.xml2257
-rw-r--r--hash/p500_flop.xml32
-rw-r--r--hash/partner_cass.xml856
-rw-r--r--hash/partner_flop.xml31
-rw-r--r--hash/pasogo.xml106
-rw-r--r--hash/pasopia7_cass.xml54
-rw-r--r--hash/pasopia_cass.xml99
-rw-r--r--hash/pb2000c.xml27
-rw-r--r--hash/pc1000.xml156
-rw-r--r--hash/pc100_flop.xml110
-rw-r--r--hash/pc1512_flop.xml185
-rw-r--r--hash/pc1512_hdd.xml20
-rw-r--r--hash/pc1640_flop.xml76
-rw-r--r--hash/pc1640_hdd.xml21
-rw-r--r--hash/pc200.xml45
-rw-r--r--hash/pc6001_cart.xml204
-rw-r--r--hash/pc6001_cass.xml226
-rw-r--r--hash/pc6001mk2_cass.xml265
-rw-r--r--hash/pc8001_flop.xml3296
-rw-r--r--hash/pc8001mk2_flop.xml150
-rw-r--r--hash/pc8001mk2sr_flop.xml89
-rw-r--r--hash/pc8201.xml59
-rw-r--r--hash/pc8801_cass.xml1468
-rw-r--r--hash/pc8801_cdrom.xml164
-rw-r--r--hash/pc8801_flop.xml58864
-rw-r--r--hash/pc88va.xml1643
-rw-r--r--hash/pc88va_flop_orig.xml125
-rw-r--r--hash/pc98.xml70966
-rw-r--r--hash/pc98_cd.xml7485
-rw-r--r--hash/pc98_flop_orig.xml189
-rw-r--r--hash/pc98_hdd.xml27
-rw-r--r--hash/pcd_flop.xml66
-rw-r--r--hash/pce.xml4518
-rw-r--r--hash/pce_tourvision.xml1616
-rw-r--r--hash/pcecd.xml8551
-rw-r--r--hash/pcfx.xml209
-rw-r--r--hash/pcw.xml1996
-rw-r--r--hash/pcw16.xml65
-rw-r--r--hash/pcx_flop.xml201
-rw-r--r--hash/pda600.xml35
-rw-r--r--hash/pdp1_ptp.xml78
-rw-r--r--hash/pecom_cass.xml119
-rw-r--r--hash/pegasus_cart.xml227
-rw-r--r--hash/pencil2.xml152
-rw-r--r--hash/pencil2_cass.xml183
-rw-r--r--hash/pentagon_cass.xml46
-rw-r--r--hash/pet_cass.xml3008
-rw-r--r--hash/pet_flop.xml928
-rw-r--r--hash/pet_hdd.xml47
-rw-r--r--hash/pet_quik.xml36
-rw-r--r--hash/pet_rom.xml456
-rw-r--r--hash/phc25_cass.xml374
-rw-r--r--hash/photo_cd.xml39
-rw-r--r--hash/pi_storyreader_cart.xml493
-rw-r--r--hash/pi_storyreader_v2_cart.xml19
-rw-r--r--hash/picno.xml318
-rw-r--r--hash/pico.xml6342
-rw-r--r--hash/pippin.xml1201
-rw-r--r--hash/pippin_flop.xml23
-rw-r--r--hash/pixter_cart.xml72
-rw-r--r--hash/playmaker.xml46
-rw-r--r--hash/pls1000_cart.xml78
-rw-r--r--hash/plus4_cart.xml301
-rw-r--r--hash/plus4_cass.xml38
-rw-r--r--hash/plus4_flop.xml64
-rw-r--r--hash/plus4_quik.xml33
-rw-r--r--hash/pmd85_cass.xml1011
-rw-r--r--hash/pockchalv2.xml442
-rw-r--r--hash/pockchalw.xml659
-rw-r--r--hash/pofo.xml69
-rw-r--r--hash/poisk1_flop.xml30
-rw-r--r--hash/pokemini.xml480
-rw-r--r--hash/poly_flop.xml33
-rw-r--r--hash/polysix.xml26
-rw-r--r--hash/popstar_cart.xml43
-rw-r--r--hash/precur2w_cart.xml21
-rw-r--r--hash/princ.xml108
-rw-r--r--hash/pro128_cart.xml61
-rw-r--r--hash/pro128_cass.xml2204
-rw-r--r--hash/pro128_flop.xml39
-rw-r--r--hash/pro128s_flop.xml434
-rw-r--r--hash/prof180.xml39
-rw-r--r--hash/prof80.xml28
-rw-r--r--hash/psi98.xml39
-rw-r--r--hash/psion1.xml118
-rw-r--r--hash/psion2.xml2172
-rw-r--r--hash/psion_flop.xml37
-rw-r--r--hash/psion_quik.xml171
-rw-r--r--hash/psion_ssd.xml638
-rw-r--r--hash/psx.xml67554
-rw-r--r--hash/pt68k2.xml22
-rw-r--r--hash/pv1000.xml384
-rw-r--r--hash/pv2000.xml346
-rw-r--r--hash/px4_cart.xml75
-rw-r--r--hash/px8_cart.xml206
-rw-r--r--hash/pyl601.xml174
-rw-r--r--hash/ql_cart.xml44
-rw-r--r--hash/ql_cass.xml68
-rw-r--r--hash/ql_flop.xml76
-rw-r--r--hash/quizwiz.xml109
-rw-r--r--hash/qx10_flop.xml98
-rw-r--r--hash/r8_card.xml143
-rw-r--r--hash/r9751.xml233
-rw-r--r--hash/radio86_cart.xml19
-rw-r--r--hash/radio86_cass.xml1136
-rw-r--r--hash/rainbow.xml277
-rw-r--r--hash/ramstar.xml180
-rw-r--r--hash/roland_tnsc1.xml114
-rw-r--r--hash/roland_tnsc2.xml60
-rw-r--r--hash/rwtrntcs.xml36
-rw-r--r--hash/rx78_cart.xml440
-rw-r--r--hash/rx78_cass.xml37
-rw-r--r--hash/rz1_cass.xml75
-rw-r--r--hash/s2000_flop.xml18
-rw-r--r--hash/s3000_cdrom.xml95
-rw-r--r--hash/sagafox.xml19
-rw-r--r--hash/sage2.xml122
-rw-r--r--hash/saitek_egr.xml60
-rw-r--r--hash/saitek_kso.xml34
-rw-r--r--hash/saitek_schess.xml32
-rw-r--r--hash/samcoupe_cass.xml40
-rw-r--r--hash/samcoupe_flop.xml602
-rw-r--r--hash/sat_cart.xml201
-rw-r--r--hash/sat_vccart.xml187
-rw-r--r--hash/saturn.xml39432
-rw-r--r--hash/sawatte.xml203
-rw-r--r--hash/sbrain.xml19
-rw-r--r--hash/sc3000_cart.xml418
-rw-r--r--hash/sc3000_cass.xml487
-rw-r--r--hash/scv.xml469
-rw-r--r--hash/sd132_flop.xml80
-rw-r--r--hash/sd1_flop.xml20
-rw-r--r--hash/sdk85.xml34
-rw-r--r--hash/sega_beena_cart.xml3525
-rw-r--r--hash/segaai.xml818
-rw-r--r--hash/sf7000.xml318
-rw-r--r--hash/sg1000.xml2973
-rw-r--r--hash/sgi_mips.xml6368
-rw-r--r--hash/sgi_mips_hdd.xml76
-rw-r--r--hash/sgx.xml77
-rw-r--r--hash/singingstarkaraoke_cart.xml41
-rw-r--r--hash/sitcom.xml172
-rw-r--r--hash/smartcycle_cart.xml152
-rw-r--r--hash/smarttv_cart.xml20
-rw-r--r--hash/smc777.xml2027
-rw-r--r--hash/sms.xml8924
-rw-r--r--hash/snes.xml67968
-rw-r--r--hash/snes_bspack.xml5437
-rw-r--r--hash/snes_strom.xml217
-rw-r--r--hash/snes_vkun.xml36
-rw-r--r--hash/snotec.xml224
-rw-r--r--hash/snread.xml105
-rw-r--r--hash/snspell.xml173
-rw-r--r--hash/socrates.xml114
-rw-r--r--hash/softbox.xml33
-rw-r--r--hash/softwarelist.dtd53
-rw-r--r--hash/sol20_cass.xml923
-rw-r--r--hash/sony_news.xml59
-rw-r--r--hash/sorcerer_cart.xml198
-rw-r--r--hash/sorcerer_cass.xml1501
-rw-r--r--hash/sorcerer_flop.xml54
-rw-r--r--hash/spc1000_cass.xml1278
-rw-r--r--hash/spc1500_cass.xml54
-rw-r--r--hash/special_cass.xml1772
-rw-r--r--hash/special_flop.xml31
-rw-r--r--hash/specnext_sd.xml38
-rw-r--r--hash/specpls3_flop.xml20209
-rw-r--r--hash/spectrum_betadisc_flop.xml1354
-rw-r--r--hash/spectrum_cart.xml253
-rw-r--r--hash/spectrum_cass.xml182121
-rw-r--r--hash/spectrum_flop_opus.xml812
-rw-r--r--hash/spectrum_mgt_flop.xml127
-rw-r--r--hash/spectrum_microdrive.xml814
-rw-r--r--hash/spectrum_wafadrive.xml22
-rw-r--r--hash/sprachmg.xml81
-rw-r--r--hash/squale_cart.xml66
-rw-r--r--hash/ssem_quik.xml145
-rw-r--r--hash/st_cart.xml78
-rw-r--r--hash/st_flop.xml5608
-rw-r--r--hash/st_flop_demos.xml107
-rw-r--r--hash/stepone_flop.xml123
-rw-r--r--hash/studio2.xml667
-rw-r--r--hash/stv.xml1145
-rw-r--r--hash/sun_sparc.xml93
-rw-r--r--hash/super6.xml155
-rw-r--r--hash/super80_cass.xml2554
-rw-r--r--hash/super80_flop.xml53
-rw-r--r--hash/super_tv_pc_cart.xml98
-rw-r--r--hash/superpet_flop.xml370
-rw-r--r--hash/supracan.xml258
-rw-r--r--hash/sv8000.xml99
-rw-r--r--hash/svi318_cart.xml129
-rw-r--r--hash/svi318_cass.xml2652
-rw-r--r--hash/svi318_flop.xml95
-rw-r--r--hash/svision.xml898
-rw-r--r--hash/svmu.xml882
-rw-r--r--hash/t1000.xml215
-rw-r--r--hash/takara_daigunder_dx_cart.xml90
-rw-r--r--hash/tandy200.xml59
-rw-r--r--hash/tandy2k.xml149
-rw-r--r--hash/tandy6k.xml134
-rw-r--r--hash/tc4.xml60
-rw-r--r--hash/tdv2324.xml91
-rw-r--r--hash/tek4052_cart.xml75
-rw-r--r--hash/telestory_cart.xml226
-rw-r--r--hash/teradrive_flop.xml121
-rw-r--r--hash/teradrive_hdd.xml29
-rw-r--r--hash/tg16.xml1088
-rw-r--r--hash/thinkpad8xx.xml147
-rw-r--r--hash/ti74_cart.xml56
-rw-r--r--hash/ti95_cart.xml43
-rw-r--r--hash/ti99_cart.xml5057
-rw-r--r--hash/tiki100.xml972
-rw-r--r--hash/timex_cass.xml1354
-rw-r--r--hash/timex_dock.xml468
-rw-r--r--hash/tmc600_quik.xml47
-rw-r--r--hash/tntell.xml93
-rw-r--r--hash/to770_cart.xml26
-rw-r--r--hash/to770a_cart.xml25
-rw-r--r--hash/to7_cart.xml773
-rw-r--r--hash/to7_cass.xml8345
-rw-r--r--hash/to7_qd.xml287
-rw-r--r--hash/to8_cass.xml215
-rw-r--r--hash/to8_qd.xml98
-rw-r--r--hash/to_flop.xml14947
-rw-r--r--hash/triton_rom.xml20
-rw-r--r--hash/trs80_cass.xml768
-rw-r--r--hash/trs80_flop.xml75
-rw-r--r--hash/trs80_quik.xml1155
-rw-r--r--hash/trs80m2.xml275
-rw-r--r--hash/trsm100.xml148
-rw-r--r--hash/tsconf.xml461
-rw-r--r--hash/ttwist_brainquest_cart.xml20
-rw-r--r--hash/turboextreme_cart.xml19
-rw-r--r--hash/tutor.xml494
-rw-r--r--hash/tvc_cart.xml155
-rw-r--r--hash/tvc_cass.xml3038
-rw-r--r--hash/tvc_flop.xml10578
-rw-r--r--hash/tvdear.xml41
-rw-r--r--hash/tvgogo.xml153
-rw-r--r--hash/tvochken.xml365
-rw-r--r--hash/tx0_ptp.xml133
-rw-r--r--hash/u110_card.xml242
-rw-r--r--hash/unichamp.xml57
-rw-r--r--hash/ut88.xml75
-rw-r--r--hash/uzebox.xml1528
-rw-r--r--hash/v1050_flop.xml130
-rw-r--r--hash/v1050_hdd.xml36
-rw-r--r--hash/vbaby_cart.xml83
-rw-r--r--hash/vboy.xml586
-rw-r--r--hash/vc4000.xml514
-rw-r--r--hash/vector06_cart.xml21
-rw-r--r--hash/vector06_flop.xml213
-rw-r--r--hash/vectrex.xml1010
-rw-r--r--hash/vfxsd_flop.xml32
-rw-r--r--hash/vg5k.xml858
-rw-r--r--hash/vgmplay.xml413405
-rw-r--r--hash/vic10.xml355
-rw-r--r--hash/vic1001_cart.xml3964
-rw-r--r--hash/vic1001_cass.xml34
-rw-r--r--hash/vic1001_flop.xml90
-rw-r--r--hash/victor9k_flop.xml32
-rw-r--r--hash/vidbrain.xml276
-rw-r--r--hash/videoart.xml115
-rw-r--r--hash/videopac.xml2942
-rw-r--r--hash/vii.xml28
-rw-r--r--hash/vip.xml34
-rw-r--r--hash/vis.xml1267
-rw-r--r--hash/visicom.xml81
-rw-r--r--hash/vixen.xml235
-rw-r--r--hash/vsmile_cart.xml5571
-rw-r--r--hash/vsmile_cd.xml746
-rw-r--r--hash/vsmileb_cart.xml397
-rw-r--r--hash/vsmilem_cart.xml1632
-rw-r--r--hash/vtech2_cass.xml70
-rw-r--r--hash/vtech_innotab_cart.xml196
-rw-r--r--hash/vtech_innotv_cart.xml57
-rw-r--r--hash/vtech_storio_cart.xml276
-rw-r--r--hash/vz_cass.xml289
-rw-r--r--hash/vz_snap.xml1759
-rw-r--r--hash/wangpc.xml85
-rw-r--r--hash/waveterm.xml68
-rw-r--r--hash/wicat.xml255
-rw-r--r--hash/wizard_cart.xml159
-rw-r--r--hash/wmbullet.xml56
-rw-r--r--hash/wren_flop.xml63
-rw-r--r--hash/wscolor.xml2477
-rw-r--r--hash/wswan.xml3019
-rw-r--r--hash/x07_card.xml26
-rw-r--r--hash/x07_cass.xml1388
-rw-r--r--hash/x1_cass.xml2066
-rw-r--r--hash/x1_flop.xml6708
-rw-r--r--hash/x37_flop.xml173
-rw-r--r--hash/x37_hdd.xml21
-rw-r--r--hash/x68k_flop.xml33643
-rw-r--r--hash/xegs.xml641
-rw-r--r--hash/xerox820.xml172
-rw-r--r--hash/xerox820ii.xml146
-rw-r--r--hash/yeno_laptop_cart.xml30
-rw-r--r--hash/z80clock.xml230
-rw-r--r--hash/z80ne_cass.xml1156
-rw-r--r--hash/z80ne_flop.xml743
-rw-r--r--hash/z88_cart.xml614
-rw-r--r--hash/zorba.xml871
-rw-r--r--hash/zx80_cass.xml90
-rw-r--r--hash/zx81_cass.xml12693
-rw-r--r--hlsl/bloom.fx438
-rw-r--r--hlsl/chroma.fx122
-rw-r--r--hlsl/color.fx165
-rw-r--r--hlsl/deconverge.fx131
-rw-r--r--hlsl/distortion.fx333
-rw-r--r--hlsl/downsample.fx115
-rw-r--r--hlsl/focus.fx125
-rw-r--r--hlsl/ntsc.fx244
-rw-r--r--hlsl/phosphor.fx128
-rw-r--r--hlsl/post.fx277
-rw-r--r--hlsl/prescale.fx140
-rw-r--r--hlsl/primary.fx247
-rw-r--r--hlsl/scanline.fx169
-rw-r--r--hlsl/vector.fx135
-rw-r--r--ini/examples/bt601-525.ini21
-rw-r--r--ini/examples/bt601-625.ini21
-rw-r--r--ini/examples/bt709.ini16
-rw-r--r--ini/examples/ntscj.ini16
-rw-r--r--ini/examples/p1.ini12
-rw-r--r--ini/examples/p14.ini15
-rw-r--r--ini/examples/p2.ini12
-rw-r--r--ini/examples/p3.ini12
-rw-r--r--ini/examples/p35.ini12
-rw-r--r--ini/examples/p4.ini19
-rw-r--r--ini/examples/p55.ini13
-rw-r--r--ini/examples/p7.ini15
-rw-r--r--ini/presets/gameboy.ini55
-rw-r--r--ini/presets/gba.ini55
-rw-r--r--ini/presets/lcd-matrix.ini55
-rw-r--r--ini/presets/lcd.ini55
-rw-r--r--ini/presets/raster.ini66
-rw-r--r--ini/presets/vector-mono.ini72
-rw-r--r--ini/presets/vector.ini76
-rw-r--r--keymaps/README.md6
-rw-r--r--keymaps/km_be_LINUX.map50
-rw-r--r--keymaps/km_br_LINUX.map43
-rw-r--r--keymaps/km_ch_LINUX.map35
-rw-r--r--keymaps/km_de_LINUX.map32
-rw-r--r--keymaps/km_es_LINUX.map36
-rw-r--r--keymaps/km_fr_LINUX.map49
-rw-r--r--keymaps/km_fr_OSX.map21
-rw-r--r--keymaps/km_gb_LINUX.map26
-rw-r--r--keymaps/km_it_LINUX.map33
-rw-r--r--keymaps/km_pt_LINUX.map36
-rw-r--r--keymaps/km_se_LINUX.map29
-rw-r--r--keymaps/km_se_OSX.map29
-rw-r--r--language/Afrikaans/strings.po6440
-rw-r--r--language/Albanian/strings.po6440
-rw-r--r--language/Arabic/strings.po6440
-rw-r--r--language/Basque/strings.po6441
-rw-r--r--language/Belarusian/strings.po6563
-rw-r--r--language/Bosnian/strings.po6440
-rw-r--r--language/Bulgarian/strings.po6442
-rw-r--r--language/Burmese/strings.po6440
-rw-r--r--language/Catalan/strings.po6777
-rw-r--r--language/Chinese_Simplified/strings.po6541
-rw-r--r--language/Chinese_Traditional/strings.po6541
-rw-r--r--language/Croatian/strings.po6442
-rw-r--r--language/Czech/strings.po6564
-rw-r--r--language/Danish/strings.po6442
-rw-r--r--language/Dutch/strings.po6952
-rw-r--r--language/English/strings.po6441
-rw-r--r--language/Estonian/strings.po6441
-rw-r--r--language/Finnish/strings.po6442
-rw-r--r--language/French/strings.po6863
-rw-r--r--language/French_Belgium/strings.po6843
-rw-r--r--language/French_Canada/strings.po6442
-rw-r--r--language/Georgian/strings.po6440
-rw-r--r--language/German/strings.po6580
-rw-r--r--language/Greek/strings.po6589
-rw-r--r--language/Hebrew/strings.po6441
-rw-r--r--language/Hindi/strings.po6440
-rw-r--r--language/Hungarian/strings.po7012
-rw-r--r--language/Indonesian/strings.po6441
-rw-r--r--language/Italian/strings.po6939
-rw-r--r--language/Japanese/strings.po7712
-rw-r--r--language/Korean/strings.po6934
-rw-r--r--language/LICENSE116
-rw-r--r--language/Latvian/strings.po6442
-rw-r--r--language/Lithuanian/strings.po6442
-rw-r--r--language/Macedonian/strings.po6440
-rw-r--r--language/Norwegian/strings.po6927
-rw-r--r--language/Persian/strings.po6440
-rw-r--r--language/Polish/strings.po6563
-rw-r--r--language/Portuguese/strings.po6879
-rw-r--r--language/Portuguese_Brazil/strings.po6582
-rw-r--r--language/README.md5
-rw-r--r--language/Romanian/strings.po6443
-rw-r--r--language/Russian/strings.po6912
-rw-r--r--language/Serbian/strings.po6853
-rw-r--r--language/Serbian_Cyrillic/strings.po6853
-rw-r--r--language/Slovak/strings.po6567
-rw-r--r--language/Slovenian/strings.po6443
-rw-r--r--language/Spanish/strings.po6911
-rw-r--r--language/Spanish_Mexico/strings.po6442
-rw-r--r--language/Swedish/strings.po7195
-rw-r--r--language/Thai/strings.po6440
-rw-r--r--language/Turkish/strings.po6728
-rw-r--r--language/Ukrainian/strings.po6556
-rw-r--r--language/Vietnamese/strings.po6441
-rw-r--r--makefile1777
-rw-r--r--plugins/README.md3
-rw-r--r--plugins/autofire/autofire_menu.lua387
-rw-r--r--plugins/autofire/autofire_save.lua101
-rw-r--r--plugins/autofire/init.lua115
-rw-r--r--plugins/autofire/plugin.json10
-rw-r--r--plugins/boot.lua29
-rw-r--r--plugins/cheat/cheat_json.lua12
-rw-r--r--plugins/cheat/cheat_simple.lua328
-rw-r--r--plugins/cheat/cheat_xml.lua285
-rw-r--r--plugins/cheat/init.lua985
-rw-r--r--plugins/cheat/plugin.json10
-rw-r--r--plugins/cheat/xml_to_json.lua11
-rw-r--r--plugins/cheatfind/init.lua1079
-rw-r--r--plugins/cheatfind/plugin.json10
-rw-r--r--plugins/commonui/init.lua216
-rw-r--r--plugins/commonui/plugin.json9
-rw-r--r--plugins/console/init.lua308
-rw-r--r--plugins/console/plugin.json10
-rw-r--r--plugins/data/button_char.lua245
-rw-r--r--plugins/data/data_command.lua36
-rw-r--r--plugins/data/data_gameinit.lua27
-rw-r--r--plugins/data/data_hiscore.lua1278
-rw-r--r--plugins/data/data_history.lua218
-rw-r--r--plugins/data/data_mameinfo.lua38
-rw-r--r--plugins/data/data_marp.lua179
-rw-r--r--plugins/data/data_messinfo.lua38
-rw-r--r--plugins/data/data_story.lua35
-rw-r--r--plugins/data/data_sysinfo.lua27
-rw-r--r--plugins/data/database.lua159
-rw-r--r--plugins/data/init.lua91
-rw-r--r--plugins/data/load_dat.lua260
-rw-r--r--plugins/data/plugin.json10
-rw-r--r--plugins/discord/init.lua117
-rw-r--r--plugins/discord/plugin.json10
-rw-r--r--plugins/dummy/init.lua37
-rw-r--r--plugins/dummy/plugin.json10
-rw-r--r--plugins/gdbstub/init.lua291
-rw-r--r--plugins/gdbstub/plugin.json10
-rw-r--r--plugins/hiscore/hiscore.dat18909
-rw-r--r--plugins/hiscore/init.lua376
-rw-r--r--plugins/hiscore/plugin.json10
-rw-r--r--plugins/hiscore/sort_hiscore.lua217
-rw-r--r--plugins/inputmacro/init.lua140
-rw-r--r--plugins/inputmacro/inputmacro_menu.lua747
-rw-r--r--plugins/inputmacro/inputmacro_persist.lua157
-rw-r--r--plugins/inputmacro/plugin.json10
-rw-r--r--plugins/json/LICENSE22
-rw-r--r--plugins/json/README.md2
-rw-r--r--plugins/json/init.lua735
-rw-r--r--plugins/json/plugin.json9
-rw-r--r--plugins/layout/init.lua86
-rw-r--r--plugins/layout/plugin.json10
-rw-r--r--plugins/offscreenreload/init.lua96
-rw-r--r--plugins/offscreenreload/offscreenreload_menu.lua418
-rw-r--r--plugins/offscreenreload/offscreenreload_persist.lua133
-rw-r--r--plugins/offscreenreload/plugin.json10
-rw-r--r--plugins/plugin.schema35
-rw-r--r--plugins/portname/init.lua175
-rw-r--r--plugins/portname/plugin.json10
-rw-r--r--plugins/timecode/init.lua350
-rw-r--r--plugins/timecode/plugin.json10
-rw-r--r--plugins/timer/init.lua79
-rw-r--r--plugins/timer/plugin.json10
-rw-r--r--plugins/timer/timer_persist.lua249
-rw-r--r--plugins/vector/init.lua45
-rw-r--r--plugins/vector/plugin.json10
-rw-r--r--plugins/xml/LICENSE.txt7
-rw-r--r--plugins/xml/init.lua401
-rw-r--r--plugins/xml/plugin.json9
-rw-r--r--projects/.gitignore3
-rw-r--r--projects/README.md4
-rw-r--r--regtests/LICENSE29
-rw-r--r--regtests/README.md5
-rw-r--r--regtests/chdman/chdtest.py237
-rw-r--r--regtests/chdman/input/copy_cd_cue_audio_silence_wav_20_tracks_v4/in.chdbin0 -> 38412 bytes-rw-r--r--regtests/chdman/input/copy_cd_cue_audio_silence_wav_v4/in.chdbin0 -> 32356 bytes-rw-r--r--regtests/chdman/input/copy_cd_cue_empty_v4/in.chdbin0 -> 27956 bytes-rw-r--r--regtests/chdman/input/copy_cd_nrg_empty_v4/in.chdbin0 -> 27956 bytes-rw-r--r--regtests/chdman/input/copy_cd_toc_empty_v4/in.chdbin0 -> 60598 bytes-rw-r--r--regtests/chdman/input/copy_hd_1/in.chdbin0 -> 21337 bytes-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence/in.binbin0 -> 14109648 bytes-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence/in.cue42
-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav/in.cue15
-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav/silence.wavbin0 -> 176448 bytes-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks/in.cue60
-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks/silence.wavbin0 -> 176448 bytes-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks_cdfl/in.cue60
-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks_cdfl/in.params1
-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks_cdfl/silence.wavbin0 -> 176448 bytes-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks_cdlz/in.cue60
-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks_cdlz/in.params1
-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks_cdlz/silence.wavbin0 -> 176448 bytes-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks_cdzl/in.cue60
-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks_cdzl/in.params1
-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks_cdzl/silence.wavbin0 -> 176448 bytes-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks_none/in.cue60
-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks_none/in.params1
-rw-r--r--regtests/chdman/input/createcd_cue_audio_silence_wav_20_tracks_none/silence.wavbin0 -> 176448 bytes-rw-r--r--regtests/chdman/input/createcd_cue_empty/in.binbin0 -> 1430016 bytes-rw-r--r--regtests/chdman/input/createcd_cue_empty/in.cue4
-rw-r--r--regtests/chdman/input/createcd_iso_empty/in.isobin0 -> 1245184 bytes-rw-r--r--regtests/chdman/input/createcd_nrg_audio_silence/in.nrgbin0 -> 14466058 bytes-rw-r--r--regtests/chdman/input/createcd_nrg_empty/in.nrgbin0 -> 1782972 bytes-rw-r--r--regtests/chdman/input/createcd_toc_empty/data.binbin0 -> 1488384 bytes-rw-r--r--regtests/chdman/input/createcd_toc_empty/in.toc8
-rw-r--r--regtests/chdman/input/createhd_1/in.params1
-rw-r--r--regtests/chdman/input/createhd_2/in.params1
-rw-r--r--regtests/chdman/input/createhd_3/in.params1
-rw-r--r--regtests/chdman/input/createhd_4/in.params1
-rw-r--r--regtests/chdman/input/createhd_5/in.params1
-rw-r--r--regtests/chdman/input/createhd_raw_empty/in.rawbin0 -> 1048576 bytes-rw-r--r--regtests/chdman/input/createhd_raw_empty_flac/in.params1
-rw-r--r--regtests/chdman/input/createhd_raw_empty_flac/in.rawbin0 -> 1048576 bytes-rw-r--r--regtests/chdman/input/createhd_raw_empty_huff/in.params1
-rw-r--r--regtests/chdman/input/createhd_raw_empty_huff/in.rawbin0 -> 1048576 bytes-rw-r--r--regtests/chdman/input/createhd_raw_empty_lzma/in.params1
-rw-r--r--regtests/chdman/input/createhd_raw_empty_lzma/in.rawbin0 -> 1048576 bytes-rw-r--r--regtests/chdman/input/createhd_raw_empty_none/in.params1
-rw-r--r--regtests/chdman/input/createhd_raw_empty_none/in.rawbin0 -> 1048576 bytes-rw-r--r--regtests/chdman/input/createhd_raw_empty_zlib/in.params1
-rw-r--r--regtests/chdman/input/createhd_raw_empty_zlib/in.rawbin0 -> 1048576 bytes-rw-r--r--regtests/chdman/input/createld_avi_uyvy_3_frames_no_audio/in.avibin0 -> 1326226 bytes-rw-r--r--regtests/chdman/input/createld_avi_yuv2_3_frames_no_audio/in.avibin0 -> 1326226 bytes-rw-r--r--regtests/chdman/output/copy_cd_cue_audio_silence_wav_20_tracks_v4/out.chdbin0 -> 28848 bytes-rw-r--r--regtests/chdman/output/copy_cd_cue_audio_silence_wav_v4/out.chdbin0 -> 27335 bytes-rw-r--r--regtests/chdman/output/copy_cd_cue_empty_v4/out.chdbin0 -> 7326 bytes-rw-r--r--regtests/chdman/output/copy_cd_nrg_empty_v4/out.chdbin0 -> 7326 bytes-rw-r--r--regtests/chdman/output/copy_cd_toc_empty_v4/out.chdbin0 -> 51541 bytes-rw-r--r--regtests/chdman/output/copy_hd_1/out.chdbin0 -> 226 bytes-rw-r--r--regtests/chdman/output/createcd_cue_audio_silence/out.chdbin0 -> 27597 bytes-rw-r--r--regtests/chdman/output/createcd_cue_audio_silence_wav/out.chdbin0 -> 49918 bytes-rw-r--r--regtests/chdman/output/createcd_cue_audio_silence_wav_20_tracks/out.chdbin0 -> 50262 bytes-rw-r--r--regtests/chdman/output/createcd_cue_audio_silence_wav_20_tracks_cdfl/out.chdbin0 -> 58054 bytes-rw-r--r--regtests/chdman/output/createcd_cue_audio_silence_wav_20_tracks_cdlz/out.chdbin0 -> 50262 bytes-rw-r--r--regtests/chdman/output/createcd_cue_audio_silence_wav_20_tracks_cdzl/out.chdbin0 -> 58168 bytes-rw-r--r--regtests/chdman/output/createcd_cue_audio_silence_wav_20_tracks_none/out.chdbin0 -> 3740544 bytes-rw-r--r--regtests/chdman/output/createcd_cue_empty/out.chdbin0 -> 9558 bytes-rw-r--r--regtests/chdman/output/createcd_iso_empty/out.chdbin0 -> 2022 bytes-rw-r--r--regtests/chdman/output/createcd_nrg_audio_silence/out.chdbin0 -> 40482 bytes-rw-r--r--regtests/chdman/output/createcd_nrg_empty/out.chdbin0 -> 9558 bytes-rw-r--r--regtests/chdman/output/createcd_toc_empty/out.chdbin0 -> 46007 bytes-rw-r--r--regtests/chdman/output/createhd_1/out.chdbin0 -> 21337 bytes-rw-r--r--regtests/chdman/output/createhd_2/out.chdbin0 -> 21337 bytes-rw-r--r--regtests/chdman/output/createhd_3/out.chdbin0 -> 42502 bytes-rw-r--r--regtests/chdman/output/createhd_4/out.chdbin0 -> 10413 bytes-rw-r--r--regtests/chdman/output/createhd_5/out.chdbin0 -> 10414 bytes-rw-r--r--regtests/chdman/output/createhd_raw_empty/out.chdbin0 -> 409 bytes-rw-r--r--regtests/chdman/output/createhd_raw_empty_flac/out.chdbin0 -> 787 bytes-rw-r--r--regtests/chdman/output/createhd_raw_empty_huff/out.chdbin0 -> 1410 bytes-rw-r--r--regtests/chdman/output/createhd_raw_empty_lzma/out.chdbin0 -> 418 bytes-rw-r--r--regtests/chdman/output/createhd_raw_empty_none/out.chdbin0 -> 8192 bytes-rw-r--r--regtests/chdman/output/createhd_raw_empty_zlib/out.chdbin0 -> 418 bytes-rw-r--r--regtests/chdman/output/createld_avi_uyvy_3_frames_no_audio/out.chdbin0 -> 376 bytes-rw-r--r--regtests/chdman/output/createld_avi_yuv2_3_frames_no_audio/out.chdbin0 -> 376 bytes-rw-r--r--regtests/jedutil/baseline/18cv8/18cv8_bi-directional_io.txt37
-rw-r--r--regtests/jedutil/baseline/18cv8/18cv8_combinatorial_feedback.txt35
-rw-r--r--regtests/jedutil/baseline/18cv8/18cv8_register_feedback.txt35
-rw-r--r--regtests/jedutil/baseline/18cv8/pal10h8-to-peel18cv8.txt49
-rw-r--r--regtests/jedutil/baseline/18cv8/pal10l8-to-peel18cv8.txt49
-rw-r--r--regtests/jedutil/baseline/18cv8/pal12h6-to-peel18cv8.txt43
-rw-r--r--regtests/jedutil/baseline/18cv8/pal12l6-to-peel18cv8.txt43
-rw-r--r--regtests/jedutil/baseline/18cv8/pal14h4-to-peel18cv8.txt37
-rw-r--r--regtests/jedutil/baseline/18cv8/pal14l4-to-peel18cv8.txt37
-rw-r--r--regtests/jedutil/baseline/18cv8/pal16h2-to-peel18cv8.txt31
-rw-r--r--regtests/jedutil/baseline/18cv8/pal16l2-to-peel18cv8.txt31
-rw-r--r--regtests/jedutil/baseline/18cv8/pal16l8-to-peel18cv8.txt89
-rw-r--r--regtests/jedutil/baseline/18cv8/pal16r4-to-peel18cv8.txt93
-rw-r--r--regtests/jedutil/baseline/18cv8/pal16r6-to-peel18cv8.txt95
-rw-r--r--regtests/jedutil/baseline/18cv8/pal16r8-to-peel18cv8.txt97
-rw-r--r--regtests/jedutil/baseline/ampal18p8/pal10h8-as-ampal18p8.txt97
-rw-r--r--regtests/jedutil/baseline/ampal18p8/pal10l8-as-ampal18p8.txt97
-rw-r--r--regtests/jedutil/baseline/ampal18p8/pal12h6-as-ampal18p8.txt75
-rw-r--r--regtests/jedutil/baseline/ampal18p8/pal12l6-as-ampal18p8.txt75
-rw-r--r--regtests/jedutil/baseline/ampal18p8/pal14h4-as-ampal18p8.txt53
-rw-r--r--regtests/jedutil/baseline/ampal18p8/pal14l4-as-ampal18p8.txt53
-rw-r--r--regtests/jedutil/baseline/ampal18p8/pal16h2-as-ampal18p8.txt31
-rw-r--r--regtests/jedutil/baseline/ampal18p8/pal16l2-as-ampal18p8.txt31
-rw-r--r--regtests/jedutil/baseline/ampal18p8/pal16l8-as-ampal18p8.txt89
-rw-r--r--regtests/jedutil/baseline/atf22v10/atf22v10_power_down_mode.txt100
-rw-r--r--regtests/jedutil/baseline/ck2605/ck2605-test1.txt109
-rw-r--r--regtests/jedutil/baseline/ck2605/ck2605-test2.txt109
-rw-r--r--regtests/jedutil/baseline/gal16v8/gal16v8_complex_mode.txt49
-rw-r--r--regtests/jedutil/baseline/gal16v8/gal16v8_registered_mode.txt62
-rw-r--r--regtests/jedutil/baseline/gal16v8/gal16v8_simple_mode.txt51
-rw-r--r--regtests/jedutil/baseline/gal16v8/gal16v8_simple_mode_2.txt25
-rw-r--r--regtests/jedutil/baseline/gal16v8/pal10h8-to-gal16v8.txt49
-rw-r--r--regtests/jedutil/baseline/gal16v8/pal10l8-to-gal16v8.txt49
-rw-r--r--regtests/jedutil/baseline/gal16v8/pal12h6-to-gal16v8.txt43
-rw-r--r--regtests/jedutil/baseline/gal16v8/pal12l6-to-gal16v8.txt43
-rw-r--r--regtests/jedutil/baseline/gal16v8/pal14h4-to-gal16v8.txt37
-rw-r--r--regtests/jedutil/baseline/gal16v8/pal14l4-to-gal16v8.txt37
-rw-r--r--regtests/jedutil/baseline/gal16v8/pal16h2-to-gal16v8.txt31
-rw-r--r--regtests/jedutil/baseline/gal16v8/pal16l2-to-gal16v8.txt31
-rw-r--r--regtests/jedutil/baseline/gal16v8/pal16l8-to-gal16v8.txt89
-rw-r--r--regtests/jedutil/baseline/gal16v8/pal16r4-to-gal16v8.txt93
-rw-r--r--regtests/jedutil/baseline/gal16v8/pal16r6-to-gal16v8.txt95
-rw-r--r--regtests/jedutil/baseline/gal16v8/pal16r8-to-gal16v8.txt97
-rw-r--r--regtests/jedutil/baseline/gal18v10/gal18v10-test1.txt123
-rw-r--r--regtests/jedutil/baseline/gal18v10/pal10h8-to-gal18v10.txt49
-rw-r--r--regtests/jedutil/baseline/gal18v10/pal10l8-to-gal18v10.txt49
-rw-r--r--regtests/jedutil/baseline/gal18v10/pal12h6-to-gal18v10.txt43
-rw-r--r--regtests/jedutil/baseline/gal18v10/pal12l6-to-gal18v10.txt43
-rw-r--r--regtests/jedutil/baseline/gal18v10/pal14h4-to-gal18v10.txt37
-rw-r--r--regtests/jedutil/baseline/gal18v10/pal14l4-to-gal18v10.txt37
-rw-r--r--regtests/jedutil/baseline/gal18v10/pal16h2-to-gal18v10.txt31
-rw-r--r--regtests/jedutil/baseline/gal18v10/pal16l2-to-gal18v10.txt31
-rw-r--r--regtests/jedutil/baseline/gal18v10/pal16l8-to-gal18v10.txt89
-rw-r--r--regtests/jedutil/baseline/gal18v10/pal16r4-to-gal18v10.txt93
-rw-r--r--regtests/jedutil/baseline/gal18v10/pal16r6-to-gal18v10.txt95
-rw-r--r--regtests/jedutil/baseline/gal18v10/pal16r8-to-gal18v10.txt97
-rw-r--r--regtests/jedutil/baseline/gal20v8/gal20v8_complex_mode.txt89
-rw-r--r--regtests/jedutil/baseline/gal20v8/gal20v8_registered_mode.txt51
-rw-r--r--regtests/jedutil/baseline/gal20v8/gal20v8_simple_mode.txt53
-rw-r--r--regtests/jedutil/baseline/gal20v8/pal14h8-to-gal20v8.txt53
-rw-r--r--regtests/jedutil/baseline/gal20v8/pal14l8-to-gal20v8.txt53
-rw-r--r--regtests/jedutil/baseline/gal20v8/pal16h6-to-gal20v8.txt47
-rw-r--r--regtests/jedutil/baseline/gal20v8/pal16l6-to-gal20v8.txt47
-rw-r--r--regtests/jedutil/baseline/gal20v8/pal18l4-to-gal20v8.txt41
-rw-r--r--regtests/jedutil/baseline/gal20v8/pal20l2-to-gal20v8.txt31
-rw-r--r--regtests/jedutil/baseline/gal20v8/pal20l8-to-gal20v8.txt89
-rw-r--r--regtests/jedutil/baseline/gal20v8/pal20r4-to-gal20v8.txt93
-rw-r--r--regtests/jedutil/baseline/gal20v8/pal20r6-to-gal20v8.txt95
-rw-r--r--regtests/jedutil/baseline/gal20v8/pal20r8-to-gal20v8.txt97
-rw-r--r--regtests/jedutil/baseline/gal22v10/gal22v10_combinatorial_mode.txt97
-rw-r--r--regtests/jedutil/baseline/gal22v10/gal22v10_registered_mode.txt59
-rw-r--r--regtests/jedutil/baseline/gal22v10/pal22v10-combinatorial-to-gal22v10.txt159
-rw-r--r--regtests/jedutil/baseline/gal22v10/pal22v10-registered-to-gal22v10.txt159
-rw-r--r--regtests/jedutil/baseline/pal10h8/pal10h8.txt49
-rw-r--r--regtests/jedutil/baseline/pal10l8/pal10l8.txt49
-rw-r--r--regtests/jedutil/baseline/pal10p8/pal10p8.txt49
-rw-r--r--regtests/jedutil/baseline/pal12h10/pal12h10.txt59
-rw-r--r--regtests/jedutil/baseline/pal12h6/pal12h6.txt43
-rw-r--r--regtests/jedutil/baseline/pal12l10/pal12l10.txt59
-rw-r--r--regtests/jedutil/baseline/pal12l6/pal12l6.txt43
-rw-r--r--regtests/jedutil/baseline/pal12p6/pal12p6.txt43
-rw-r--r--regtests/jedutil/baseline/pal14h4/pal14h4.txt37
-rw-r--r--regtests/jedutil/baseline/pal14h8/pal14h8.txt53
-rw-r--r--regtests/jedutil/baseline/pal14l4/pal14l4.txt37
-rw-r--r--regtests/jedutil/baseline/pal14l8/pal14l8.txt53
-rw-r--r--regtests/jedutil/baseline/pal14p4/pal14p4.txt37
-rw-r--r--regtests/jedutil/baseline/pal16c1/pal16c1.txt47
-rw-r--r--regtests/jedutil/baseline/pal16h2/pal16h2.txt31
-rw-r--r--regtests/jedutil/baseline/pal16h6/pal16h6.txt47
-rw-r--r--regtests/jedutil/baseline/pal16l2/pal16l2.txt31
-rw-r--r--regtests/jedutil/baseline/pal16l6/pal16l6.txt47
-rw-r--r--regtests/jedutil/baseline/pal16l8/pal16l8.txt89
-rw-r--r--regtests/jedutil/baseline/pal16p2/pal16p2.txt31
-rw-r--r--regtests/jedutil/baseline/pal16p8/pal16p8.txt89
-rw-r--r--regtests/jedutil/baseline/pal16r4/pal16r4.txt93
-rw-r--r--regtests/jedutil/baseline/pal16r6/pal16r6.txt95
-rw-r--r--regtests/jedutil/baseline/pal16r8/pal16r8.txt97
-rw-r--r--regtests/jedutil/baseline/pal16rp4/pal16rp4.txt93
-rw-r--r--regtests/jedutil/baseline/pal16rp6/pal16rp6.txt95
-rw-r--r--regtests/jedutil/baseline/pal16rp8/pal16rp8.txt97
-rw-r--r--regtests/jedutil/baseline/pal18h4/pal18h4.txt41
-rw-r--r--regtests/jedutil/baseline/pal18l4/pal18l4.txt41
-rw-r--r--regtests/jedutil/baseline/pal20c1/pal20c1.txt31
-rw-r--r--regtests/jedutil/baseline/pal20l10/pal20l10.txt69
-rw-r--r--regtests/jedutil/baseline/pal20l2/pal20l2.txt31
-rw-r--r--regtests/jedutil/baseline/pal20l8/pal20l8.txt89
-rw-r--r--regtests/jedutil/baseline/pal20r4/pal20r4.txt93
-rw-r--r--regtests/jedutil/baseline/pal20r6/pal20r6.txt95
-rw-r--r--regtests/jedutil/baseline/pal20r8/pal20r8.txt97
-rw-r--r--regtests/jedutil/baseline/pal20x10/pal20x10.txt79
-rw-r--r--regtests/jedutil/baseline/pal20x4/pal20x4.txt73
-rw-r--r--regtests/jedutil/baseline/pal20x8/pal20x8.txt77
-rw-r--r--regtests/jedutil/baseline/pal22v10/pal22v10-combinatorial.txt159
-rw-r--r--regtests/jedutil/baseline/pal22v10/pal22v10-registered.txt159
-rw-r--r--regtests/jedutil/baseline/pal6l16/pal6l16.txt73
-rw-r--r--regtests/jedutil/baseline/pal8l14/pal8l14.txt65
-rw-r--r--regtests/jedutil/baseline/palce16v8/pal10h8-as-palce16v8.txt97
-rw-r--r--regtests/jedutil/baseline/palce16v8/pal10l8-as-palce16v8.txt97
-rw-r--r--regtests/jedutil/baseline/palce16v8/pal12h6-as-palce16v8.txt75
-rw-r--r--regtests/jedutil/baseline/palce16v8/pal12l6-as-palce16v8.txt75
-rw-r--r--regtests/jedutil/baseline/palce16v8/pal14h4-as-palce16v8.txt53
-rw-r--r--regtests/jedutil/baseline/palce16v8/pal14l4-as-palce16v8.txt53
-rw-r--r--regtests/jedutil/baseline/palce16v8/pal16h2-as-palce16v8.txt31
-rw-r--r--regtests/jedutil/baseline/palce16v8/pal16l2-as-palce16v8.txt31
-rw-r--r--regtests/jedutil/baseline/palce16v8/pal16l8-as-palce16v8.txt89
-rw-r--r--regtests/jedutil/baseline/palce16v8/pal16r4-as-palce16v8.txt93
-rw-r--r--regtests/jedutil/baseline/palce16v8/pal16r6-as-palce16v8.txt95
-rw-r--r--regtests/jedutil/baseline/palce16v8/pal16r8-as-palce16v8.txt97
-rw-r--r--regtests/jedutil/baseline/pls100/pls100.txt81
-rw-r--r--regtests/jedutil/baseline/pls153/pls153.txt178
-rw-r--r--regtests/jedutil/eqns/AMAZE/pls100/AMAZE.DEF11
-rw-r--r--regtests/jedutil/eqns/AMAZE/pls100/PLS100.BEE92
-rw-r--r--regtests/jedutil/eqns/AMAZE/pls100/PLS100.PALbin0 -> 1 bytes-rw-r--r--regtests/jedutil/eqns/AMAZE/pls100/PLS100.STD58
-rw-r--r--regtests/jedutil/eqns/AMAZE/readme.txt1
-rw-r--r--regtests/jedutil/eqns/ICT_Place/PEEL18CV8/18cv8_bi-directional_io.psf64
-rw-r--r--regtests/jedutil/eqns/ICT_Place/PEEL18CV8/18cv8_combinatorial_feedback.psf62
-rw-r--r--regtests/jedutil/eqns/ICT_Place/PEEL18CV8/18cv8_register_feedback.psf62
-rw-r--r--regtests/jedutil/eqns/ICT_Place/readme.txt1
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal10h8/pal10h8.eqn30
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal10l8/pal10l8.eqn30
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal10p8/pal10p8.eqn30
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal12h10/pal12h10.eqn46
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal12h6/pal12h6.eqn28
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal12l10/pal12l10.eqn46
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal12l6/pal12l6.eqn28
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal12p6/pal12p6.eqn28
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal14h4/pal14h4.eqn26
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal14h8/pal14h8.eqn42
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal14l4/pal14l4.eqn26
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal14p4/pal14p4.eqn26
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16c1/pal16c1.eqn23
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16h2/pal16h2.eqn24
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16h6/pal16h6.eqn38
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16l2/pal16l2.eqn24
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16l6/pal16l6.eqn38
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16l8/pal16l8.eqn79
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16p2/pal16p2.eqn24
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16p8/pal16p8.eqn78
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16r4/pal16r4.eqn82
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16r6/pal16r6.eqn84
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16r8/pal16r8.eqn86
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16rp4/pal16rp4.eqn82
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16rp6/pal16rp6.eqn84
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal16rp8/pal16rp8.eqn86
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal18h4/pal18h4.eqn34
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal18l4/pal18l4.eqn34
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal20c1/pal20c1.eqn26
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal20l10/pal20l10.eqn56
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal20l2/pal20l2.eqn26
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal20l8/pal20l8.eqn78
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal20r4/pal20r4.eqn82
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal20r6/pal20r6.eqn84
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal20r8/pal20r8.eqn86
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal20x10/pal20x10.eqn66
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal20x4/pal20x4.eqn60
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/pal20x8/pal20x8.eqn64
-rw-r--r--regtests/jedutil/eqns/Opal_Jr/readme.txt1
-rw-r--r--regtests/jedutil/eqns/PALASM/ampal18p8/pal10h8-as-ampal18p8.pds119
-rw-r--r--regtests/jedutil/eqns/PALASM/ampal18p8/pal10l8-as-ampal18p8.pds119
-rw-r--r--regtests/jedutil/eqns/PALASM/ampal18p8/pal12h6-as-ampal18p8.pds101
-rw-r--r--regtests/jedutil/eqns/PALASM/ampal18p8/pal12l6-as-ampal18p8.pds101
-rw-r--r--regtests/jedutil/eqns/PALASM/ampal18p8/pal14h4-as-ampal18p8.pds83
-rw-r--r--regtests/jedutil/eqns/PALASM/ampal18p8/pal14l4-as-ampal18p8.pds83
-rw-r--r--regtests/jedutil/eqns/PALASM/ampal18p8/pal16h2-as-ampal18p8.pds65
-rw-r--r--regtests/jedutil/eqns/PALASM/ampal18p8/pal16l2-as-ampal18p8.pds65
-rw-r--r--regtests/jedutil/eqns/PALASM/ampal18p8/pal16l8-as-ampal18p8.pds119
-rw-r--r--regtests/jedutil/eqns/PALASM/pal22v10/pal22v10-combinatorial.pds180
-rw-r--r--regtests/jedutil/eqns/PALASM/pal22v10/pal22v10-registered.pds180
-rw-r--r--regtests/jedutil/eqns/PALASM/pal6l16/pal6l16.pds53
-rw-r--r--regtests/jedutil/eqns/PALASM/pal8l14/pal8l14.pds51
-rw-r--r--regtests/jedutil/eqns/PALASM/palce16v8/pal10h8-as-palce16v8.pds119
-rw-r--r--regtests/jedutil/eqns/PALASM/palce16v8/pal10l8-as-palce16v8.pds119
-rw-r--r--regtests/jedutil/eqns/PALASM/palce16v8/pal12h6-as-palce16v8.pds101
-rw-r--r--regtests/jedutil/eqns/PALASM/palce16v8/pal12l6-as-palce16v8.pds101
-rw-r--r--regtests/jedutil/eqns/PALASM/palce16v8/pal14h4-as-palce16v8.pds83
-rw-r--r--regtests/jedutil/eqns/PALASM/palce16v8/pal14l4-as-palce16v8.pds83
-rw-r--r--regtests/jedutil/eqns/PALASM/palce16v8/pal16h2-as-palce16v8.pds65
-rw-r--r--regtests/jedutil/eqns/PALASM/palce16v8/pal16l2-as-palce16v8.pds65
-rw-r--r--regtests/jedutil/eqns/PALASM/palce16v8/pal16l8-as-palce16v8.pds119
-rw-r--r--regtests/jedutil/eqns/PALASM/palce16v8/pal16r4-as-palce16v8.pds119
-rw-r--r--regtests/jedutil/eqns/PALASM/palce16v8/pal16r6-as-palce16v8.pds119
-rw-r--r--regtests/jedutil/eqns/PALASM/palce16v8/pal16r8-as-palce16v8.pds119
-rw-r--r--regtests/jedutil/eqns/PALASM/readme.txt1
-rw-r--r--regtests/jedutil/eqns/WinCUPL/atf22v10/atf22v10_power_down_mode.pld123
-rw-r--r--regtests/jedutil/eqns/WinCUPL/gal16v8/gal16v8_complex_mode.pld69
-rw-r--r--regtests/jedutil/eqns/WinCUPL/gal16v8/gal16v8_registered_mode.pld78
-rw-r--r--regtests/jedutil/eqns/WinCUPL/gal16v8/gal16v8_simple_mode.pld81
-rw-r--r--regtests/jedutil/eqns/WinCUPL/gal16v8/gal16v8_simple_mode_2.pld41
-rw-r--r--regtests/jedutil/eqns/WinCUPL/gal20v8/gal20v8_complex_mode.pld105
-rw-r--r--regtests/jedutil/eqns/WinCUPL/gal20v8/gal20v8_registered_mode.pld72
-rw-r--r--regtests/jedutil/eqns/WinCUPL/gal20v8/gal20v8_simple_mode.pld75
-rw-r--r--regtests/jedutil/eqns/WinCUPL/gal22v10/gal22v10_combinatorial_mode.pld124
-rw-r--r--regtests/jedutil/eqns/WinCUPL/gal22v10/gal22v10_registered_mode.pld83
-rw-r--r--regtests/jedutil/eqns/WinCUPL/readme.txt1
-rw-r--r--regtests/jedutil/eqns/ispLEVER_Classic/gal18v10/test1/gal18v10-test1.abl138
-rw-r--r--regtests/jedutil/eqns/ispLEVER_Classic/gal18v10/test1/gal18v10-test1.syn11
-rw-r--r--regtests/jedutil/eqns/ispLEVER_Classic/readme.txt1
-rw-r--r--regtests/jedutil/jeds/18cv8/18cv8_bi-directional_io.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/18cv8_combinatorial_feedback.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/18cv8_register_feedback.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/pal10h8-to-peel18cv8.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/pal10l8-to-peel18cv8.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/pal12h6-to-peel18cv8.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/pal12l6-to-peel18cv8.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/pal14h4-to-peel18cv8.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/pal14l4-to-peel18cv8.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/pal16h2-to-peel18cv8.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/pal16l2-to-peel18cv8.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/pal16l8-to-peel18cv8.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/pal16r4-to-peel18cv8.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/pal16r6-to-peel18cv8.jed104
-rw-r--r--regtests/jedutil/jeds/18cv8/pal16r8-to-peel18cv8.jed104
-rw-r--r--regtests/jedutil/jeds/ampal18p8/pal10h8-as-ampal18p8.jed90
-rw-r--r--regtests/jedutil/jeds/ampal18p8/pal10l8-as-ampal18p8.jed90
-rw-r--r--regtests/jedutil/jeds/ampal18p8/pal12h6-as-ampal18p8.jed90
-rw-r--r--regtests/jedutil/jeds/ampal18p8/pal12l6-as-ampal18p8.jed90
-rw-r--r--regtests/jedutil/jeds/ampal18p8/pal14h4-as-ampal18p8.jed90
-rw-r--r--regtests/jedutil/jeds/ampal18p8/pal14l4-as-ampal18p8.jed90
-rw-r--r--regtests/jedutil/jeds/ampal18p8/pal16h2-as-ampal18p8.jed90
-rw-r--r--regtests/jedutil/jeds/ampal18p8/pal16l2-as-ampal18p8.jed90
-rw-r--r--regtests/jedutil/jeds/ampal18p8/pal16l8-as-ampal18p8.jed90
-rw-r--r--regtests/jedutil/jeds/atf22v10/atf22v10_power_down_mode.jed120
-rw-r--r--regtests/jedutil/jeds/ck2605/ck2605-test1.jed36
-rw-r--r--regtests/jedutil/jeds/ck2605/ck2605-test2.jed36
-rw-r--r--regtests/jedutil/jeds/gal16v8/gal16v8_complex_mode.jed54
-rw-r--r--regtests/jedutil/jeds/gal16v8/gal16v8_registered_mode.jed62
-rw-r--r--regtests/jedutil/jeds/gal16v8/gal16v8_simple_mode.jed52
-rw-r--r--regtests/jedutil/jeds/gal16v8/gal16v8_simple_mode_2.jed27
-rw-r--r--regtests/jedutil/jeds/gal16v8/pal10h8-to-gal16v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal16v8/pal10l8-to-gal16v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal16v8/pal12h6-to-gal16v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal16v8/pal12l6-to-gal16v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal16v8/pal14h4-to-gal16v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal16v8/pal14l4-to-gal16v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal16v8/pal16h2-to-gal16v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal16v8/pal16l2-to-gal16v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal16v8/pal16l8-to-gal16v8.jed107
-rw-r--r--regtests/jedutil/jeds/gal16v8/pal16r4-to-gal16v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal16v8/pal16r6-to-gal16v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal16v8/pal16r8-to-gal16v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal18v10/gal18v10-test1.jed109
-rw-r--r--regtests/jedutil/jeds/gal18v10/pal10h8-to-gal18v10.jed133
-rw-r--r--regtests/jedutil/jeds/gal18v10/pal10l8-to-gal18v10.jed133
-rw-r--r--regtests/jedutil/jeds/gal18v10/pal12h6-to-gal18v10.jed133
-rw-r--r--regtests/jedutil/jeds/gal18v10/pal12l6-to-gal18v10.jed133
-rw-r--r--regtests/jedutil/jeds/gal18v10/pal14h4-to-gal18v10.jed133
-rw-r--r--regtests/jedutil/jeds/gal18v10/pal14l4-to-gal18v10.jed133
-rw-r--r--regtests/jedutil/jeds/gal18v10/pal16h2-to-gal18v10.jed133
-rw-r--r--regtests/jedutil/jeds/gal18v10/pal16l2-to-gal18v10.jed133
-rw-r--r--regtests/jedutil/jeds/gal18v10/pal16l8-to-gal18v10.jed133
-rw-r--r--regtests/jedutil/jeds/gal18v10/pal16r4-to-gal18v10.jed133
-rw-r--r--regtests/jedutil/jeds/gal18v10/pal16r6-to-gal18v10.jed133
-rw-r--r--regtests/jedutil/jeds/gal18v10/pal16r8-to-gal18v10.jed133
-rw-r--r--regtests/jedutil/jeds/gal20v8/gal20v8_complex_mode.jed102
-rw-r--r--regtests/jedutil/jeds/gal20v8/gal20v8_registered_mode.jed62
-rw-r--r--regtests/jedutil/jeds/gal20v8/gal20v8_simple_mode.jed62
-rw-r--r--regtests/jedutil/jeds/gal20v8/pal14h8-to-gal20v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal20v8/pal14l8-to-gal20v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal20v8/pal16h6-to-gal20v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal20v8/pal16l6-to-gal20v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal20v8/pal18l4-to-gal20v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal20v8/pal20l2-to-gal20v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal20v8/pal20l8-to-gal20v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal20v8/pal20r4-to-gal20v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal20v8/pal20r6-to-gal20v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal20v8/pal20r8-to-gal20v8.jed106
-rw-r--r--regtests/jedutil/jeds/gal22v10/gal22v10_combinatorial_mode.jed119
-rw-r--r--regtests/jedutil/jeds/gal22v10/gal22v10_registered_mode.jed74
-rw-r--r--regtests/jedutil/jeds/gal22v10/pal22v10-combinatorial-to-gal22v10.jed176
-rw-r--r--regtests/jedutil/jeds/gal22v10/pal22v10-registered-to-gal22v10.jed176
-rw-r--r--regtests/jedutil/jeds/pal10h8/pal10h8.jed36
-rw-r--r--regtests/jedutil/jeds/pal10l8/pal10l8.jed36
-rw-r--r--regtests/jedutil/jeds/pal10p8/pal10p8.jed38
-rw-r--r--regtests/jedutil/jeds/pal12h10/pal12h10.jed42
-rw-r--r--regtests/jedutil/jeds/pal12h6/pal12h6.jed34
-rw-r--r--regtests/jedutil/jeds/pal12l10/pal12l10.jed42
-rw-r--r--regtests/jedutil/jeds/pal12l6/pal12l6.jed34
-rw-r--r--regtests/jedutil/jeds/pal12p6/pal12p6.jed36
-rw-r--r--regtests/jedutil/jeds/pal14h4/pal14h4.jed32
-rw-r--r--regtests/jedutil/jeds/pal14h8/pal14h8.jed40
-rw-r--r--regtests/jedutil/jeds/pal14l4/pal14l4.jed32
-rw-r--r--regtests/jedutil/jeds/pal14l8/pal14l8.jed40
-rw-r--r--regtests/jedutil/jeds/pal14p4/pal14p4.jed34
-rw-r--r--regtests/jedutil/jeds/pal16c1/pal16c1.jed29
-rw-r--r--regtests/jedutil/jeds/pal16h2/pal16h2.jed30
-rw-r--r--regtests/jedutil/jeds/pal16h6/pal16h6.jed38
-rw-r--r--regtests/jedutil/jeds/pal16l2/pal16l2.jed30
-rw-r--r--regtests/jedutil/jeds/pal16l6/pal16l6.jed38
-rw-r--r--regtests/jedutil/jeds/pal16l8/pal16l8.jed85
-rw-r--r--regtests/jedutil/jeds/pal16p2/pal16p2.jed32
-rw-r--r--regtests/jedutil/jeds/pal16p8/pal16p8.jed86
-rw-r--r--regtests/jedutil/jeds/pal16r4/pal16r4.jed84
-rw-r--r--regtests/jedutil/jeds/pal16r6/pal16r6.jed84
-rw-r--r--regtests/jedutil/jeds/pal16r8/pal16r8.jed84
-rw-r--r--regtests/jedutil/jeds/pal16rp4/pal16rp4.jed86
-rw-r--r--regtests/jedutil/jeds/pal16rp6/pal16rp6.jed86
-rw-r--r--regtests/jedutil/jeds/pal16rp8/pal16rp8.jed86
-rw-r--r--regtests/jedutil/jeds/pal18h4/pal18h4.jed36
-rw-r--r--regtests/jedutil/jeds/pal18l4/pal18l4.jed36
-rw-r--r--regtests/jedutil/jeds/pal20c1/pal20c1.jed29
-rw-r--r--regtests/jedutil/jeds/pal20l10/pal20l10.jed62
-rw-r--r--regtests/jedutil/jeds/pal20l2/pal20l2.jed30
-rw-r--r--regtests/jedutil/jeds/pal20l8/pal20l8.jed84
-rw-r--r--regtests/jedutil/jeds/pal20r4/pal20r4.jed84
-rw-r--r--regtests/jedutil/jeds/pal20r6/pal20r6.jed84
-rw-r--r--regtests/jedutil/jeds/pal20r8/pal20r8.jed84
-rw-r--r--regtests/jedutil/jeds/pal20x10/pal20x10.jed62
-rw-r--r--regtests/jedutil/jeds/pal20x4/pal20x4.jed62
-rw-r--r--regtests/jedutil/jeds/pal20x8/pal20x8.jed62
-rw-r--r--regtests/jedutil/jeds/pal22v10/pal22v10-combinatorial.jed150
-rw-r--r--regtests/jedutil/jeds/pal22v10/pal22v10-registered.jed150
-rw-r--r--regtests/jedutil/jeds/pal6l16/pal6l16.jed33
-rw-r--r--regtests/jedutil/jeds/pal8l14/pal8l14.jed31
-rw-r--r--regtests/jedutil/jeds/palce16v8/pal10h8-as-palce16v8.jed86
-rw-r--r--regtests/jedutil/jeds/palce16v8/pal10l8-as-palce16v8.jed86
-rw-r--r--regtests/jedutil/jeds/palce16v8/pal12h6-as-palce16v8.jed86
-rw-r--r--regtests/jedutil/jeds/palce16v8/pal12l6-as-palce16v8.jed86
-rw-r--r--regtests/jedutil/jeds/palce16v8/pal14h4-as-palce16v8.jed86
-rw-r--r--regtests/jedutil/jeds/palce16v8/pal14l4-as-palce16v8.jed86
-rw-r--r--regtests/jedutil/jeds/palce16v8/pal16h2-as-palce16v8.jed86
-rw-r--r--regtests/jedutil/jeds/palce16v8/pal16l2-as-palce16v8.jed86
-rw-r--r--regtests/jedutil/jeds/palce16v8/pal16l8-as-palce16v8.jed86
-rw-r--r--regtests/jedutil/jeds/palce16v8/pal16r4-as-palce16v8.jed86
-rw-r--r--regtests/jedutil/jeds/palce16v8/pal16r6-as-palce16v8.jed86
-rw-r--r--regtests/jedutil/jeds/palce16v8/pal16r8-as-palce16v8.jed86
-rw-r--r--regtests/jedutil/jeds/pls100/pls100.jed60
-rw-r--r--regtests/jedutil/jeds/pls153/pls153.jed52
-rw-r--r--regtests/jedutil/jedtest.py149
-rw-r--r--regtests/regtests.mak67
-rw-r--r--roms/dir.txt1
-rw-r--r--samples/LICENSE116
-rw-r--r--samples/README.md5
-rw-r--r--samples/dir.txt1
-rw-r--r--samples/floppy/35_seek_12ms.wavbin0 -> 26540 bytes-rw-r--r--samples/floppy/35_seek_20ms.wavbin0 -> 44144 bytes-rw-r--r--samples/floppy/35_seek_2ms.wavbin0 -> 7450 bytes-rw-r--r--samples/floppy/35_seek_6ms.wavbin0 -> 22230 bytes-rw-r--r--samples/floppy/35_spin_empty.wavbin0 -> 17708 bytes-rw-r--r--samples/floppy/35_spin_end.wavbin0 -> 17684 bytes-rw-r--r--samples/floppy/35_spin_loaded.wavbin0 -> 17708 bytes-rw-r--r--samples/floppy/35_spin_start_empty.wavbin0 -> 17708 bytes-rw-r--r--samples/floppy/35_spin_start_loaded.wavbin0 -> 35308 bytes-rw-r--r--samples/floppy/35_step_1_1.wavbin0 -> 6878 bytes-rw-r--r--samples/floppy/525_seek_12ms.wavbin0 -> 22764 bytes-rw-r--r--samples/floppy/525_seek_20ms.wavbin0 -> 30060 bytes-rw-r--r--samples/floppy/525_seek_2ms.wavbin0 -> 5336 bytes-rw-r--r--samples/floppy/525_seek_6ms.wavbin0 -> 14860 bytes-rw-r--r--samples/floppy/525_spin_empty.wavbin0 -> 8864 bytes-rw-r--r--samples/floppy/525_spin_end.wavbin0 -> 8864 bytes-rw-r--r--samples/floppy/525_spin_loaded.wavbin0 -> 17708 bytes-rw-r--r--samples/floppy/525_spin_start_empty.wavbin0 -> 11180 bytes-rw-r--r--samples/floppy/525_spin_start_loaded.wavbin0 -> 17708 bytes-rw-r--r--samples/floppy/525_step_1_1.wavbin0 -> 6628 bytes-rwxr-xr-xscripts/build/check_include_guards.py51
-rwxr-xr-xscripts/build/complay.py839
-rwxr-xr-xscripts/build/file2lines.py96
-rw-r--r--scripts/build/file2str.py63
-rwxr-xr-xscripts/build/llvm-objdump-filter.py44
-rwxr-xr-xscripts/build/makedep.py1083
-rw-r--r--scripts/build/msgfmt.py246
-rw-r--r--scripts/build/png.py2355
-rw-r--r--scripts/build/png2bdc.py387
-rw-r--r--scripts/build/verinfo.py137
-rw-r--r--scripts/extlib.lua134
-rw-r--r--scripts/font/LICENSE92
-rw-r--r--scripts/font/NotoSans-Bold.bdcbin0 -> 61317 bytes-rw-r--r--scripts/font/NotoSans-Bold.ttfbin0 -> 310556 bytes-rw-r--r--scripts/font/README.md52
-rw-r--r--scripts/genie.lua1464
-rw-r--r--scripts/minimaws/lib/__init__.py4
-rw-r--r--scripts/minimaws/lib/assets/common.js150
-rw-r--r--scripts/minimaws/lib/assets/digest.js235
-rw-r--r--scripts/minimaws/lib/assets/disclosedown.svg4
-rw-r--r--scripts/minimaws/lib/assets/discloseup.svg4
-rw-r--r--scripts/minimaws/lib/assets/machine.js629
-rw-r--r--scripts/minimaws/lib/assets/romident.js642
-rw-r--r--scripts/minimaws/lib/assets/sortasc.svg4
-rw-r--r--scripts/minimaws/lib/assets/sortdesc.svg4
-rw-r--r--scripts/minimaws/lib/assets/sortind.svg5
-rw-r--r--scripts/minimaws/lib/assets/style.css18
-rw-r--r--scripts/minimaws/lib/auxverbs.py291
-rw-r--r--scripts/minimaws/lib/dbaccess.py1132
-rw-r--r--scripts/minimaws/lib/htmltmpl.py477
-rw-r--r--scripts/minimaws/lib/lxparse.py471
-rw-r--r--scripts/minimaws/lib/wsgiserve.py992
-rwxr-xr-xscripts/minimaws/minimaws.py147
-rw-r--r--scripts/minimaws/minimaws.wsgi16
-rw-r--r--scripts/resources/emscripten/emscripten_post.js18
-rw-r--r--scripts/resources/windows/mame/mame.icobin0 -> 108522 bytes-rw-r--r--scripts/resources/windows/mame/mame.man16
-rw-r--r--scripts/resources/windows/mame/mame.rc11
-rwxr-xr-xscripts/src/3rdparty.lua2082
-rw-r--r--scripts/src/benchmarks.lua74
-rw-r--r--scripts/src/bus.lua6457
-rw-r--r--scripts/src/cpu.lua4333
-rw-r--r--scripts/src/devices.lua100
-rw-r--r--scripts/src/emu.lua346
-rw-r--r--scripts/src/formats.lua2436
-rw-r--r--scripts/src/lib.lua150
-rw-r--r--scripts/src/machine.lua5660
-rw-r--r--scripts/src/main.lua405
-rw-r--r--scripts/src/mame/frontend.lua215
-rw-r--r--scripts/src/netlist.lua226
-rw-r--r--scripts/src/osd/mac.lua178
-rw-r--r--scripts/src/osd/mac_cfg.lua40
-rw-r--r--scripts/src/osd/modules.lua749
-rw-r--r--scripts/src/osd/sdl.lua449
-rw-r--r--scripts/src/osd/sdl3.lua476
-rw-r--r--scripts/src/osd/sdl3_cfg.lua166
-rw-r--r--scripts/src/osd/sdl_cfg.lua175
-rw-r--r--scripts/src/osd/windows.lua281
-rw-r--r--scripts/src/osd/windows_cfg.lua58
-rw-r--r--scripts/src/sound.lua1952
-rw-r--r--scripts/src/tests.lua71
-rw-r--r--scripts/src/tools.lua824
-rw-r--r--scripts/src/video.lua1891
-rw-r--r--scripts/target/mame/dummy.lua67
-rw-r--r--scripts/target/mame/mame.lua113
-rw-r--r--scripts/target/mame/tiny.lua183
-rw-r--r--scripts/target/zexall/zexall.lua15
-rw-r--r--scripts/toolchain.lua621
-rw-r--r--scripts/xslt/list-bios.xslt43
-rw-r--r--scripts/xslt/list-runnable-tree.xslt48
-rw-r--r--scripts/xslt/list-runnable.xslt45
-rw-r--r--scripts/xslt/list-system-sources.xslt60
-rw-r--r--src/build/build.mak70
-rw-r--r--src/build/file2str.c101
-rw-r--r--src/build/png2bdc.c453
-rw-r--r--src/build/verinfo.c302
-rw-r--r--src/devices/bus/a1bus/a1bus.cpp197
-rw-r--r--src/devices/bus/a1bus/a1bus.h128
-rw-r--r--src/devices/bus/a1bus/a1cassette.cpp240
-rw-r--r--src/devices/bus/a1bus/a1cassette.h21
-rw-r--r--src/devices/bus/a1bus/a1cffa.cpp189
-rw-r--r--src/devices/bus/a1bus/a1cffa.h21
-rw-r--r--src/devices/bus/a2bus/4play.cpp150
-rw-r--r--src/devices/bus/a2bus/4play.h20
-rw-r--r--src/devices/bus/a2bus/a2alfam2.cpp204
-rw-r--r--src/devices/bus/a2bus/a2alfam2.h22
-rw-r--r--src/devices/bus/a2bus/a2applicard.cpp328
-rw-r--r--src/devices/bus/a2bus/a2applicard.h21
-rw-r--r--src/devices/bus/a2bus/a2arcadebd.cpp186
-rw-r--r--src/devices/bus/a2bus/a2arcadebd.h21
-rw-r--r--src/devices/bus/a2bus/a2bus.cpp347
-rw-r--r--src/devices/bus/a2bus/a2bus.h182
-rw-r--r--src/devices/bus/a2bus/a2cffa.cpp342
-rw-r--r--src/devices/bus/a2bus/a2cffa.h23
-rw-r--r--src/devices/bus/a2bus/a2corvus.cpp174
-rw-r--r--src/devices/bus/a2bus/a2corvus.h56
-rw-r--r--src/devices/bus/a2bus/a2diskiing.cpp248
-rw-r--r--src/devices/bus/a2bus/a2diskiing.h128
-rw-r--r--src/devices/bus/a2bus/a2dx1.cpp128
-rw-r--r--src/devices/bus/a2bus/a2dx1.h21
-rw-r--r--src/devices/bus/a2bus/a2eauxslot.cpp155
-rw-r--r--src/devices/bus/a2bus/a2eauxslot.h138
-rw-r--r--src/devices/bus/a2bus/a2echoii.cpp211
-rw-r--r--src/devices/bus/a2bus/a2echoii.h21
-rw-r--r--src/devices/bus/a2bus/a2eext80col.cpp77
-rw-r--r--src/devices/bus/a2bus/a2eext80col.h49
-rw-r--r--src/devices/bus/a2bus/a2eramworks3.cpp138
-rw-r--r--src/devices/bus/a2bus/a2eramworks3.h70
-rw-r--r--src/devices/bus/a2bus/a2estd80col.cpp71
-rw-r--r--src/devices/bus/a2bus/a2estd80col.h49
-rw-r--r--src/devices/bus/a2bus/a2hsscsi.cpp344
-rw-r--r--src/devices/bus/a2bus/a2hsscsi.h70
-rw-r--r--src/devices/bus/a2bus/a2ieee488.cpp195
-rw-r--r--src/devices/bus/a2bus/a2ieee488.h20
-rw-r--r--src/devices/bus/a2bus/a2iwm.cpp146
-rw-r--r--src/devices/bus/a2bus/a2iwm.h74
-rw-r--r--src/devices/bus/a2bus/a2mcms.cpp356
-rw-r--r--src/devices/bus/a2bus/a2mcms.h123
-rw-r--r--src/devices/bus/a2bus/a2memexp.cpp270
-rw-r--r--src/devices/bus/a2bus/a2memexp.h22
-rw-r--r--src/devices/bus/a2bus/a2midi.cpp201
-rw-r--r--src/devices/bus/a2bus/a2midi.h21
-rw-r--r--src/devices/bus/a2bus/a2mockingboard.cpp642
-rw-r--r--src/devices/bus/a2bus/a2mockingboard.h21
-rw-r--r--src/devices/bus/a2bus/a2parprn.cpp330
-rw-r--r--src/devices/bus/a2bus/a2parprn.h64
-rw-r--r--src/devices/bus/a2bus/a2pic.cpp611
-rw-r--r--src/devices/bus/a2bus/a2pic.h58
-rw-r--r--src/devices/bus/a2bus/a2sam.cpp66
-rw-r--r--src/devices/bus/a2bus/a2sam.h21
-rw-r--r--src/devices/bus/a2bus/a2scsi.cpp311
-rw-r--r--src/devices/bus/a2bus/a2scsi.h66
-rw-r--r--src/devices/bus/a2bus/a2sd.cpp340
-rw-r--r--src/devices/bus/a2bus/a2sd.h20
-rw-r--r--src/devices/bus/a2bus/a2sic.cpp211
-rw-r--r--src/devices/bus/a2bus/a2sic.h12
-rw-r--r--src/devices/bus/a2bus/a2softcard.cpp176
-rw-r--r--src/devices/bus/a2bus/a2softcard.h53
-rw-r--r--src/devices/bus/a2bus/a2ssc.cpp455
-rw-r--r--src/devices/bus/a2bus/a2ssc.h20
-rw-r--r--src/devices/bus/a2bus/a2superdrive.cpp354
-rw-r--r--src/devices/bus/a2bus/a2superdrive.h22
-rw-r--r--src/devices/bus/a2bus/a2swyft.cpp189
-rw-r--r--src/devices/bus/a2bus/a2swyft.h21
-rw-r--r--src/devices/bus/a2bus/a2themill.cpp337
-rw-r--r--src/devices/bus/a2bus/a2themill.h61
-rw-r--r--src/devices/bus/a2bus/a2thunderclock.cpp215
-rw-r--r--src/devices/bus/a2bus/a2thunderclock.h21
-rw-r--r--src/devices/bus/a2bus/a2ultraterm.cpp479
-rw-r--r--src/devices/bus/a2bus/a2ultraterm.h22
-rw-r--r--src/devices/bus/a2bus/a2videoterm.cpp511
-rw-r--r--src/devices/bus/a2bus/a2videoterm.h25
-rw-r--r--src/devices/bus/a2bus/a2vulcan.cpp397
-rw-r--r--src/devices/bus/a2bus/a2vulcan.h23
-rw-r--r--src/devices/bus/a2bus/a2wico_trackball.cpp245
-rw-r--r--src/devices/bus/a2bus/a2wico_trackball.h20
-rw-r--r--src/devices/bus/a2bus/a2zipdrive.cpp383
-rw-r--r--src/devices/bus/a2bus/a2zipdrive.h25
-rw-r--r--src/devices/bus/a2bus/ace2x00.cpp165
-rw-r--r--src/devices/bus/a2bus/ace2x00.h79
-rw-r--r--src/devices/bus/a2bus/agat7langcard.cpp160
-rw-r--r--src/devices/bus/a2bus/agat7langcard.h60
-rw-r--r--src/devices/bus/a2bus/agat7ports.cpp190
-rw-r--r--src/devices/bus/a2bus/agat7ports.h65
-rw-r--r--src/devices/bus/a2bus/agat7ram.cpp142
-rw-r--r--src/devices/bus/a2bus/agat7ram.h58
-rw-r--r--src/devices/bus/a2bus/agat840k_hle.cpp441
-rw-r--r--src/devices/bus/a2bus/agat840k_hle.h100
-rw-r--r--src/devices/bus/a2bus/agat_fdc.cpp498
-rw-r--r--src/devices/bus/a2bus/agat_fdc.h100
-rw-r--r--src/devices/bus/a2bus/booti.cpp216
-rw-r--r--src/devices/bus/a2bus/booti.h21
-rw-r--r--src/devices/bus/a2bus/byte8251.cpp155
-rw-r--r--src/devices/bus/a2bus/byte8251.h13
-rw-r--r--src/devices/bus/a2bus/cards.cpp348
-rw-r--r--src/devices/bus/a2bus/cards.h23
-rw-r--r--src/devices/bus/a2bus/ccs7710.cpp195
-rw-r--r--src/devices/bus/a2bus/ccs7710.h19
-rw-r--r--src/devices/bus/a2bus/cmsscsi.cpp251
-rw-r--r--src/devices/bus/a2bus/cmsscsi.h63
-rw-r--r--src/devices/bus/a2bus/computereyes2.cpp269
-rw-r--r--src/devices/bus/a2bus/computereyes2.h21
-rw-r--r--src/devices/bus/a2bus/corvfdc01.cpp271
-rw-r--r--src/devices/bus/a2bus/corvfdc01.h64
-rw-r--r--src/devices/bus/a2bus/corvfdc02.cpp292
-rw-r--r--src/devices/bus/a2bus/corvfdc02.h72
-rw-r--r--src/devices/bus/a2bus/excel9.cpp310
-rw-r--r--src/devices/bus/a2bus/excel9.h63
-rw-r--r--src/devices/bus/a2bus/ezcgi.cpp379
-rw-r--r--src/devices/bus/a2bus/ezcgi.h25
-rw-r--r--src/devices/bus/a2bus/grafex.cpp143
-rw-r--r--src/devices/bus/a2bus/grafex.h21
-rw-r--r--src/devices/bus/a2bus/grappler.cpp1267
-rw-r--r--src/devices/bus/a2bus/grappler.h63
-rw-r--r--src/devices/bus/a2bus/ibsap2.cpp184
-rw-r--r--src/devices/bus/a2bus/ibsap2.h19
-rw-r--r--src/devices/bus/a2bus/lancegs.cpp222
-rw-r--r--src/devices/bus/a2bus/lancegs.h19
-rw-r--r--src/devices/bus/a2bus/laser128.cpp180
-rw-r--r--src/devices/bus/a2bus/laser128.h70
-rw-r--r--src/devices/bus/a2bus/mouse.cpp420
-rw-r--r--src/devices/bus/a2bus/mouse.h20
-rw-r--r--src/devices/bus/a2bus/nippelclock.cpp120
-rw-r--r--src/devices/bus/a2bus/nippelclock.h52
-rw-r--r--src/devices/bus/a2bus/noisemaker.cpp91
-rw-r--r--src/devices/bus/a2bus/noisemaker.h14
-rw-r--r--src/devices/bus/a2bus/pc_xporter.cpp766
-rw-r--r--src/devices/bus/a2bus/pc_xporter.h21
-rw-r--r--src/devices/bus/a2bus/prodosromdrive.cpp119
-rw-r--r--src/devices/bus/a2bus/prodosromdrive.h21
-rw-r--r--src/devices/bus/a2bus/q68.cpp252
-rw-r--r--src/devices/bus/a2bus/q68.h82
-rw-r--r--src/devices/bus/a2bus/ramcard128k.cpp194
-rw-r--r--src/devices/bus/a2bus/ramcard128k.h59
-rw-r--r--src/devices/bus/a2bus/ramcard16k.cpp186
-rw-r--r--src/devices/bus/a2bus/ramcard16k.h57
-rw-r--r--src/devices/bus/a2bus/romcard.cpp294
-rw-r--r--src/devices/bus/a2bus/romcard.h23
-rw-r--r--src/devices/bus/a2bus/sider.cpp289
-rw-r--r--src/devices/bus/a2bus/sider.h71
-rw-r--r--src/devices/bus/a2bus/snesmax.cpp92
-rw-r--r--src/devices/bus/a2bus/snesmax.h20
-rw-r--r--src/devices/bus/a2bus/softcard3.cpp226
-rw-r--r--src/devices/bus/a2bus/softcard3.h67
-rw-r--r--src/devices/bus/a2bus/ssbapple.cpp117
-rw-r--r--src/devices/bus/a2bus/ssbapple.h21
-rw-r--r--src/devices/bus/a2bus/ssprite.cpp190
-rw-r--r--src/devices/bus/a2bus/ssprite.h22
-rw-r--r--src/devices/bus/a2bus/suprterminal.cpp281
-rw-r--r--src/devices/bus/a2bus/suprterminal.h21
-rw-r--r--src/devices/bus/a2bus/sweetalk.cpp73
-rw-r--r--src/devices/bus/a2bus/sweetalk.h12
-rw-r--r--src/devices/bus/a2bus/timemasterho.cpp326
-rw-r--r--src/devices/bus/a2bus/timemasterho.h21
-rw-r--r--src/devices/bus/a2bus/titan3plus2.cpp339
-rw-r--r--src/devices/bus/a2bus/titan3plus2.h65
-rw-r--r--src/devices/bus/a2bus/transwarp.cpp363
-rw-r--r--src/devices/bus/a2bus/transwarp.h19
-rw-r--r--src/devices/bus/a2bus/uniprint.cpp258
-rw-r--r--src/devices/bus/a2bus/uniprint.h32
-rw-r--r--src/devices/bus/a2bus/uthernet.cpp69
-rw-r--r--src/devices/bus/a2bus/uthernet.h19
-rw-r--r--src/devices/bus/a2bus/vistaa800.cpp326
-rw-r--r--src/devices/bus/a2bus/vistaa800.h20
-rw-r--r--src/devices/bus/a2gameio/brightpen.cpp140
-rw-r--r--src/devices/bus/a2gameio/brightpen.h18
-rw-r--r--src/devices/bus/a2gameio/computereyes.cpp164
-rw-r--r--src/devices/bus/a2gameio/computereyes.h19
-rw-r--r--src/devices/bus/a2gameio/gameio.cpp239
-rw-r--r--src/devices/bus/a2gameio/gameio.h134
-rw-r--r--src/devices/bus/a2gameio/gizmo.cpp106
-rw-r--r--src/devices/bus/a2gameio/gizmo.h20
-rw-r--r--src/devices/bus/a2gameio/joyport.cpp130
-rw-r--r--src/devices/bus/a2gameio/joyport.h19
-rw-r--r--src/devices/bus/a2gameio/joyport_paddles.cpp133
-rw-r--r--src/devices/bus/a2gameio/joyport_paddles.h19
-rw-r--r--src/devices/bus/a2gameio/joystick.cpp162
-rw-r--r--src/devices/bus/a2gameio/joystick.h19
-rw-r--r--src/devices/bus/a2gameio/paddles.cpp136
-rw-r--r--src/devices/bus/a2gameio/paddles.h19
-rw-r--r--src/devices/bus/a2gameio/wico_joystick.cpp128
-rw-r--r--src/devices/bus/a2gameio/wico_joystick.h20
-rw-r--r--src/devices/bus/a2kbd/a2kbd.cpp132
-rw-r--r--src/devices/bus/a2kbd/a2kbd.h134
-rw-r--r--src/devices/bus/a2kbd/am100kbd.cpp306
-rw-r--r--src/devices/bus/a2kbd/am100kbd.h14
-rw-r--r--src/devices/bus/a2kbd/ivelultrkb.cpp239
-rw-r--r--src/devices/bus/a2kbd/ivelultrkb.h14
-rw-r--r--src/devices/bus/a2kbd/kb200.cpp339
-rw-r--r--src/devices/bus/a2kbd/kb200.h14
-rw-r--r--src/devices/bus/a2kbd/nkbd.cpp424
-rw-r--r--src/devices/bus/a2kbd/nkbd.h14
-rw-r--r--src/devices/bus/a2kbd/tk10.cpp233
-rw-r--r--src/devices/bus/a2kbd/tk10.h14
-rw-r--r--src/devices/bus/a2kbd/videnh2.cpp438
-rw-r--r--src/devices/bus/a2kbd/videnh2.h15
-rw-r--r--src/devices/bus/a7800/a78_carts.h41
-rw-r--r--src/devices/bus/a7800/a78_slot.cpp813
-rw-r--r--src/devices/bus/a7800/a78_slot.h141
-rw-r--r--src/devices/bus/a7800/cpuwiz.cpp128
-rw-r--r--src/devices/bus/a7800/cpuwiz.h76
-rw-r--r--src/devices/bus/a7800/hiscore.cpp73
-rw-r--r--src/devices/bus/a7800/hiscore.h41
-rw-r--r--src/devices/bus/a7800/rom.cpp514
-rw-r--r--src/devices/bus/a7800/rom.h287
-rw-r--r--src/devices/bus/a7800/xboard.cpp231
-rw-r--r--src/devices/bus/a7800/xboard.h72
-rw-r--r--src/devices/bus/a800/a5200_supercart.cpp74
-rw-r--r--src/devices/bus/a800/a5200_supercart.h32
-rw-r--r--src/devices/bus/a800/a800_carts.cpp109
-rw-r--r--src/devices/bus/a800/a800_carts.h28
-rw-r--r--src/devices/bus/a800/a800_slot.cpp776
-rw-r--r--src/devices/bus/a800/a800_slot.h237
-rw-r--r--src/devices/bus/a800/a8sio.cpp215
-rw-r--r--src/devices/bus/a800/a8sio.h91
-rw-r--r--src/devices/bus/a800/atari1050.cpp122
-rw-r--r--src/devices/bus/a800/atari1050.h47
-rw-r--r--src/devices/bus/a800/atari810.cpp111
-rw-r--r--src/devices/bus/a800/atari810.h47
-rw-r--r--src/devices/bus/a800/atarifdc.cpp808
-rw-r--r--src/devices/bus/a800/atarifdc.h78
-rw-r--r--src/devices/bus/a800/atrax.cpp54
-rw-r--r--src/devices/bus/a800/atrax.h34
-rw-r--r--src/devices/bus/a800/bbsb.cpp136
-rw-r--r--src/devices/bus/a800/bbsb.h52
-rw-r--r--src/devices/bus/a800/cassette.cpp102
-rw-r--r--src/devices/bus/a800/cassette.h54
-rw-r--r--src/devices/bus/a800/corina.cpp135
-rw-r--r--src/devices/bus/a800/corina.h60
-rw-r--r--src/devices/bus/a800/maxflash.cpp123
-rw-r--r--src/devices/bus/a800/maxflash.h53
-rw-r--r--src/devices/bus/a800/oss.cpp255
-rw-r--r--src/devices/bus/a800/oss.h86
-rw-r--r--src/devices/bus/a800/phoenix.cpp176
-rw-r--r--src/devices/bus/a800/phoenix.h70
-rw-r--r--src/devices/bus/a800/rom.cpp210
-rw-r--r--src/devices/bus/a800/rom.h102
-rw-r--r--src/devices/bus/a800/rtime8.cpp60
-rw-r--r--src/devices/bus/a800/rtime8.h32
-rw-r--r--src/devices/bus/a800/sic.cpp114
-rw-r--r--src/devices/bus/a800/sic.h64
-rw-r--r--src/devices/bus/a800/sparta.cpp189
-rw-r--r--src/devices/bus/a800/sparta.h63
-rw-r--r--src/devices/bus/a800/supercharger.cpp94
-rw-r--r--src/devices/bus/a800/supercharger.h35
-rw-r--r--src/devices/bus/a800/telelink2.cpp64
-rw-r--r--src/devices/bus/a800/telelink2.h34
-rw-r--r--src/devices/bus/a800/ultracart.cpp130
-rw-r--r--src/devices/bus/a800/ultracart.h55
-rw-r--r--src/devices/bus/a800/williams.cpp160
-rw-r--r--src/devices/bus/a800/williams.h69
-rw-r--r--src/devices/bus/abcbus/abc1656.cpp219
-rw-r--r--src/devices/bus/abcbus/abc1656.h74
-rw-r--r--src/devices/bus/abcbus/abc890.cpp312
-rw-r--r--src/devices/bus/abcbus/abc890.h135
-rw-r--r--src/devices/bus/abcbus/abcbus.cpp170
-rw-r--r--src/devices/bus/abcbus/abcbus.h275
-rw-r--r--src/devices/bus/abcbus/cadmouse.cpp180
-rw-r--r--src/devices/bus/abcbus/cadmouse.h47
-rw-r--r--src/devices/bus/abcbus/db4105.cpp505
-rw-r--r--src/devices/bus/abcbus/db4105.h85
-rw-r--r--src/devices/bus/abcbus/db4106.cpp211
-rw-r--r--src/devices/bus/abcbus/db4106.h63
-rw-r--r--src/devices/bus/abcbus/db4107.cpp240
-rw-r--r--src/devices/bus/abcbus/db4107.h65
-rw-r--r--src/devices/bus/abcbus/db4112.cpp215
-rw-r--r--src/devices/bus/abcbus/db4112.h63
-rw-r--r--src/devices/bus/abcbus/fd2.cpp428
-rw-r--r--src/devices/bus/abcbus/fd2.h82
-rw-r--r--src/devices/bus/abcbus/lux10828.cpp703
-rw-r--r--src/devices/bus/abcbus/lux10828.h115
-rw-r--r--src/devices/bus/abcbus/lux21046.cpp1120
-rw-r--r--src/devices/bus/abcbus/lux21046.h207
-rw-r--r--src/devices/bus/abcbus/lux21056.cpp676
-rw-r--r--src/devices/bus/abcbus/lux21056.h109
-rw-r--r--src/devices/bus/abcbus/memcard.cpp142
-rw-r--r--src/devices/bus/abcbus/memcard.h56
-rw-r--r--src/devices/bus/abcbus/ram.cpp79
-rw-r--r--src/devices/bus/abcbus/ram.h47
-rw-r--r--src/devices/bus/abcbus/sio.cpp151
-rw-r--r--src/devices/bus/abcbus/sio.h50
-rw-r--r--src/devices/bus/abcbus/slutprov.cpp80
-rw-r--r--src/devices/bus/abcbus/slutprov.h41
-rw-r--r--src/devices/bus/abcbus/ssa.cpp237
-rw-r--r--src/devices/bus/abcbus/ssa.h72
-rw-r--r--src/devices/bus/abcbus/uni800.cpp111
-rw-r--r--src/devices/bus/abcbus/uni800.h41
-rw-r--r--src/devices/bus/abcbus/unidisk.cpp216
-rw-r--r--src/devices/bus/abcbus/unidisk.h63
-rw-r--r--src/devices/bus/abckb/abc77.cpp557
-rw-r--r--src/devices/bus/abckb/abc77.h100
-rw-r--r--src/devices/bus/abckb/abc800kb.cpp460
-rw-r--r--src/devices/bus/abckb/abc800kb.h74
-rw-r--r--src/devices/bus/abckb/abc99.cpp740
-rw-r--r--src/devices/bus/abckb/abc99.h118
-rw-r--r--src/devices/bus/abckb/abckb.cpp141
-rw-r--r--src/devices/bus/abckb/abckb.h81
-rw-r--r--src/devices/bus/abckb/r8.cpp160
-rw-r--r--src/devices/bus/abckb/r8.h62
-rw-r--r--src/devices/bus/acorn/atom/discpack.cpp153
-rw-r--r--src/devices/bus/acorn/atom/discpack.h14
-rw-r--r--src/devices/bus/acorn/atom/econet.cpp88
-rw-r--r--src/devices/bus/acorn/atom/econet.h15
-rw-r--r--src/devices/bus/acorn/atom/gdos.cpp193
-rw-r--r--src/devices/bus/acorn/atom/gdos.h14
-rw-r--r--src/devices/bus/acorn/atom/gdos2015.cpp257
-rw-r--r--src/devices/bus/acorn/atom/gdos2015.h14
-rw-r--r--src/devices/bus/acorn/atom/mdcr.cpp115
-rw-r--r--src/devices/bus/acorn/atom/mdcr.h14
-rw-r--r--src/devices/bus/acorn/atom/sid.cpp66
-rw-r--r--src/devices/bus/acorn/atom/sid.h13
-rw-r--r--src/devices/bus/acorn/atom/speech.cpp91
-rw-r--r--src/devices/bus/acorn/atom/speech.h14
-rw-r--r--src/devices/bus/acorn/atom/switch.cpp123
-rw-r--r--src/devices/bus/acorn/atom/switch.h14
-rw-r--r--src/devices/bus/acorn/atom/tube.cpp69
-rw-r--r--src/devices/bus/acorn/atom/tube.h14
-rw-r--r--src/devices/bus/acorn/atom/vdu80.cpp144
-rw-r--r--src/devices/bus/acorn/atom/vdu80.h14
-rw-r--r--src/devices/bus/acorn/bus.cpp287
-rw-r--r--src/devices/bus/acorn/bus.h156
-rw-r--r--src/devices/bus/acorn/cms/4080term.cpp188
-rw-r--r--src/devices/bus/acorn/cms/4080term.h15
-rw-r--r--src/devices/bus/acorn/cms/fdc.cpp127
-rw-r--r--src/devices/bus/acorn/cms/fdc.h15
-rw-r--r--src/devices/bus/acorn/cms/hires.cpp127
-rw-r--r--src/devices/bus/acorn/cms/hires.h15
-rw-r--r--src/devices/bus/acorn/cms/ieee.cpp93
-rw-r--r--src/devices/bus/acorn/cms/ieee.h13
-rw-r--r--src/devices/bus/acorn/cu/cubio.cpp208
-rw-r--r--src/devices/bus/acorn/cu/cubio.h13
-rw-r--r--src/devices/bus/acorn/cu/cugraph.cpp193
-rw-r--r--src/devices/bus/acorn/cu/cugraph.h14
-rw-r--r--src/devices/bus/acorn/cu/teletext.cpp197
-rw-r--r--src/devices/bus/acorn/cu/teletext.h13
-rw-r--r--src/devices/bus/acorn/system/32k.cpp116
-rw-r--r--src/devices/bus/acorn/system/32k.h15
-rw-r--r--src/devices/bus/acorn/system/8k.cpp172
-rw-r--r--src/devices/bus/acorn/system/8k.h15
-rw-r--r--src/devices/bus/acorn/system/cass.cpp120
-rw-r--r--src/devices/bus/acorn/system/cass.h15
-rw-r--r--src/devices/bus/acorn/system/econet.cpp99
-rw-r--r--src/devices/bus/acorn/system/econet.h15
-rw-r--r--src/devices/bus/acorn/system/fdc.cpp133
-rw-r--r--src/devices/bus/acorn/system/fdc.h15
-rw-r--r--src/devices/bus/acorn/system/vdu40.cpp142
-rw-r--r--src/devices/bus/acorn/system/vdu40.h15
-rw-r--r--src/devices/bus/acorn/system/vdu80.cpp206
-rw-r--r--src/devices/bus/acorn/system/vdu80.h15
-rw-r--r--src/devices/bus/acorn/system/vib.cpp206
-rw-r--r--src/devices/bus/acorn/system/vib.h15
-rw-r--r--src/devices/bus/adam/adamlink.cpp85
-rw-r--r--src/devices/bus/adam/adamlink.h44
-rw-r--r--src/devices/bus/adam/exp.cpp174
-rw-r--r--src/devices/bus/adam/exp.h97
-rw-r--r--src/devices/bus/adam/ide.cpp202
-rw-r--r--src/devices/bus/adam/ide.h56
-rw-r--r--src/devices/bus/adam/ram.cpp72
-rw-r--r--src/devices/bus/adam/ram.h47
-rw-r--r--src/devices/bus/adamnet/adamnet.cpp271
-rw-r--r--src/devices/bus/adamnet/adamnet.h121
-rw-r--r--src/devices/bus/adamnet/ddp.cpp276
-rw-r--r--src/devices/bus/adamnet/ddp.h63
-rw-r--r--src/devices/bus/adamnet/fdc.cpp553
-rw-r--r--src/devices/bus/adamnet/fdc.h143
-rw-r--r--src/devices/bus/adamnet/kb.cpp377
-rw-r--r--src/devices/bus/adamnet/kb.h65
-rw-r--r--src/devices/bus/adamnet/printer.cpp228
-rw-r--r--src/devices/bus/adamnet/printer.h58
-rw-r--r--src/devices/bus/adamnet/spi.cpp164
-rw-r--r--src/devices/bus/adamnet/spi.h59
-rw-r--r--src/devices/bus/adb/a9m0330.cpp268
-rw-r--r--src/devices/bus/adb/a9m0330.h48
-rw-r--r--src/devices/bus/adb/a9m0331.cpp125
-rw-r--r--src/devices/bus/adb/a9m0331.h42
-rw-r--r--src/devices/bus/adb/adb.cpp68
-rw-r--r--src/devices/bus/adb/adb.h71
-rw-r--r--src/devices/bus/adb/adbhle.cpp45
-rw-r--r--src/devices/bus/adb/adbhle.h33
-rw-r--r--src/devices/bus/amiga/cpuslot/a570.cpp194
-rw-r--r--src/devices/bus/amiga/cpuslot/a570.h66
-rw-r--r--src/devices/bus/amiga/cpuslot/a590.cpp271
-rw-r--r--src/devices/bus/amiga/cpuslot/a590.h63
-rw-r--r--src/devices/bus/amiga/cpuslot/action_replay.cpp293
-rw-r--r--src/devices/bus/amiga/cpuslot/action_replay.h106
-rw-r--r--src/devices/bus/amiga/cpuslot/cards.cpp37
-rw-r--r--src/devices/bus/amiga/cpuslot/cards.h22
-rw-r--r--src/devices/bus/amiga/cpuslot/cpuslot.cpp60
-rw-r--r--src/devices/bus/amiga/cpuslot/cpuslot.h151
-rw-r--r--src/devices/bus/amiga/cpuslot/megamix500.cpp150
-rw-r--r--src/devices/bus/amiga/cpuslot/megamix500.h51
-rw-r--r--src/devices/bus/amiga/keyboard/a1200.cpp214
-rw-r--r--src/devices/bus/amiga/keyboard/a1200.h67
-rw-r--r--src/devices/bus/amiga/keyboard/a2000.cpp712
-rw-r--r--src/devices/bus/amiga/keyboard/a2000.h26
-rw-r--r--src/devices/bus/amiga/keyboard/keyboard.cpp160
-rw-r--r--src/devices/bus/amiga/keyboard/keyboard.h93
-rw-r--r--src/devices/bus/amiga/keyboard/matrix.cpp855
-rw-r--r--src/devices/bus/amiga/keyboard/matrix.h32
-rw-r--r--src/devices/bus/amiga/keyboard/mitsumi.cpp1199
-rw-r--r--src/devices/bus/amiga/keyboard/mitsumi.h63
-rw-r--r--src/devices/bus/amiga/zorro/a2052.cpp129
-rw-r--r--src/devices/bus/amiga/zorro/a2052.h52
-rw-r--r--src/devices/bus/amiga/zorro/a2058.cpp134
-rw-r--r--src/devices/bus/amiga/zorro/a2058.h52
-rw-r--r--src/devices/bus/amiga/zorro/a2065.cpp154
-rw-r--r--src/devices/bus/amiga/zorro/a2065.h60
-rw-r--r--src/devices/bus/amiga/zorro/a2091.cpp249
-rw-r--r--src/devices/bus/amiga/zorro/a2091.h61
-rw-r--r--src/devices/bus/amiga/zorro/a2232.cpp492
-rw-r--r--src/devices/bus/amiga/zorro/a2232.h112
-rw-r--r--src/devices/bus/amiga/zorro/buddha.cpp280
-rw-r--r--src/devices/bus/amiga/zorro/buddha.h86
-rw-r--r--src/devices/bus/amiga/zorro/cards.cpp41
-rw-r--r--src/devices/bus/amiga/zorro/cards.h17
-rw-r--r--src/devices/bus/amiga/zorro/merlin.cpp191
-rw-r--r--src/devices/bus/amiga/zorro/merlin.h56
-rw-r--r--src/devices/bus/amiga/zorro/oktagon2008.cpp268
-rw-r--r--src/devices/bus/amiga/zorro/oktagon2008.h14
-rw-r--r--src/devices/bus/amiga/zorro/picasso2.cpp213
-rw-r--r--src/devices/bus/amiga/zorro/picasso2.h63
-rw-r--r--src/devices/bus/amiga/zorro/rainbow2.cpp222
-rw-r--r--src/devices/bus/amiga/zorro/rainbow2.h68
-rw-r--r--src/devices/bus/amiga/zorro/ripple.cpp234
-rw-r--r--src/devices/bus/amiga/zorro/ripple.h74
-rw-r--r--src/devices/bus/amiga/zorro/toccata.cpp318
-rw-r--r--src/devices/bus/amiga/zorro/toccata.h72
-rw-r--r--src/devices/bus/amiga/zorro/zorro.cpp176
-rw-r--r--src/devices/bus/amiga/zorro/zorro.h199
-rw-r--r--src/devices/bus/apf/rom.cpp76
-rw-r--r--src/devices/bus/apf/rom.h61
-rw-r--r--src/devices/bus/apf/slot.cpp264
-rw-r--r--src/devices/bus/apf/slot.h105
-rw-r--r--src/devices/bus/applepp/applepp.cpp104
-rw-r--r--src/devices/bus/applepp/applepp.h75
-rw-r--r--src/devices/bus/applepp/storagehle.cpp105
-rw-r--r--src/devices/bus/applepp/storagehle.h58
-rw-r--r--src/devices/bus/apricot/expansion/cards.cpp20
-rw-r--r--src/devices/bus/apricot/expansion/cards.h16
-rw-r--r--src/devices/bus/apricot/expansion/expansion.cpp147
-rw-r--r--src/devices/bus/apricot/expansion/expansion.h176
-rw-r--r--src/devices/bus/apricot/expansion/ram.cpp178
-rw-r--r--src/devices/bus/apricot/expansion/ram.h88
-rw-r--r--src/devices/bus/apricot/expansion/winchester.cpp259
-rw-r--r--src/devices/bus/apricot/expansion/winchester.h65
-rw-r--r--src/devices/bus/apricot/keyboard/hle.cpp424
-rw-r--r--src/devices/bus/apricot/keyboard/hle.h86
-rw-r--r--src/devices/bus/apricot/keyboard/keyboard.cpp96
-rw-r--r--src/devices/bus/apricot/keyboard/keyboard.h101
-rw-r--r--src/devices/bus/apricot/video/cards.cpp16
-rw-r--r--src/devices/bus/apricot/video/cards.h16
-rw-r--r--src/devices/bus/apricot/video/mono.cpp278
-rw-r--r--src/devices/bus/apricot/video/mono.h65
-rw-r--r--src/devices/bus/apricot/video/video.cpp111
-rw-r--r--src/devices/bus/apricot/video/video.h86
-rw-r--r--src/devices/bus/aquarius/c1541.cpp92
-rw-r--r--src/devices/bus/aquarius/c1541.h53
-rw-r--r--src/devices/bus/aquarius/mini.cpp221
-rw-r--r--src/devices/bus/aquarius/mini.h59
-rw-r--r--src/devices/bus/aquarius/qdisk.cpp164
-rw-r--r--src/devices/bus/aquarius/qdisk.h59
-rw-r--r--src/devices/bus/aquarius/ram.cpp110
-rw-r--r--src/devices/bus/aquarius/ram.h102
-rw-r--r--src/devices/bus/aquarius/rom.cpp51
-rw-r--r--src/devices/bus/aquarius/rom.h44
-rw-r--r--src/devices/bus/aquarius/slot.cpp219
-rw-r--r--src/devices/bus/aquarius/slot.h113
-rw-r--r--src/devices/bus/aquarius/supercart.cpp101
-rw-r--r--src/devices/bus/aquarius/supercart.h50
-rw-r--r--src/devices/bus/arcadia/rom.cpp60
-rw-r--r--src/devices/bus/arcadia/rom.h48
-rw-r--r--src/devices/bus/arcadia/slot.cpp233
-rw-r--r--src/devices/bus/arcadia/slot.h88
-rw-r--r--src/devices/bus/archimedes/econet/econet.cpp74
-rw-r--r--src/devices/bus/archimedes/econet/econet.h13
-rw-r--r--src/devices/bus/archimedes/econet/midi.cpp121
-rw-r--r--src/devices/bus/archimedes/econet/midi.h14
-rw-r--r--src/devices/bus/archimedes/econet/rtfmjoy.cpp83
-rw-r--r--src/devices/bus/archimedes/econet/rtfmjoy.h13
-rw-r--r--src/devices/bus/archimedes/econet/slot.cpp102
-rw-r--r--src/devices/bus/archimedes/econet/slot.h99
-rw-r--r--src/devices/bus/archimedes/podule/a448.cpp159
-rw-r--r--src/devices/bus/archimedes/podule/a448.h20
-rw-r--r--src/devices/bus/archimedes/podule/acejoy.cpp122
-rw-r--r--src/devices/bus/archimedes/podule/acejoy.h19
-rw-r--r--src/devices/bus/archimedes/podule/armadeus.cpp111
-rw-r--r--src/devices/bus/archimedes/podule/armadeus.h19
-rw-r--r--src/devices/bus/archimedes/podule/eaglem2.cpp156
-rw-r--r--src/devices/bus/archimedes/podule/eaglem2.h19
-rw-r--r--src/devices/bus/archimedes/podule/ether1.cpp184
-rw-r--r--src/devices/bus/archimedes/podule/ether1.h19
-rw-r--r--src/devices/bus/archimedes/podule/ether2.cpp134
-rw-r--r--src/devices/bus/archimedes/podule/ether2.h19
-rw-r--r--src/devices/bus/archimedes/podule/ether3.cpp122
-rw-r--r--src/devices/bus/archimedes/podule/ether3.h19
-rw-r--r--src/devices/bus/archimedes/podule/ethera.cpp123
-rw-r--r--src/devices/bus/archimedes/podule/ethera.h19
-rw-r--r--src/devices/bus/archimedes/podule/etherd.cpp126
-rw-r--r--src/devices/bus/archimedes/podule/etherd.h19
-rw-r--r--src/devices/bus/archimedes/podule/etherr.cpp126
-rw-r--r--src/devices/bus/archimedes/podule/etherr.h19
-rw-r--r--src/devices/bus/archimedes/podule/faxpack.cpp135
-rw-r--r--src/devices/bus/archimedes/podule/faxpack.h20
-rw-r--r--src/devices/bus/archimedes/podule/greyhawk.cpp131
-rw-r--r--src/devices/bus/archimedes/podule/greyhawk.h19
-rw-r--r--src/devices/bus/archimedes/podule/hdisc.cpp118
-rw-r--r--src/devices/bus/archimedes/podule/hdisc.h19
-rw-r--r--src/devices/bus/archimedes/podule/hdisc_cw.cpp125
-rw-r--r--src/devices/bus/archimedes/podule/hdisc_cw.h19
-rw-r--r--src/devices/bus/archimedes/podule/hdisc_morley.cpp117
-rw-r--r--src/devices/bus/archimedes/podule/hdisc_morley.h19
-rw-r--r--src/devices/bus/archimedes/podule/hdisc_we.cpp124
-rw-r--r--src/devices/bus/archimedes/podule/hdisc_we.h19
-rw-r--r--src/devices/bus/archimedes/podule/ide_be.cpp130
-rw-r--r--src/devices/bus/archimedes/podule/ide_be.h19
-rw-r--r--src/devices/bus/archimedes/podule/ide_rdev.cpp122
-rw-r--r--src/devices/bus/archimedes/podule/ide_rdev.h19
-rw-r--r--src/devices/bus/archimedes/podule/io.cpp433
-rw-r--r--src/devices/bus/archimedes/podule/io.h23
-rw-r--r--src/devices/bus/archimedes/podule/io_hccs.cpp103
-rw-r--r--src/devices/bus/archimedes/podule/io_hccs.h19
-rw-r--r--src/devices/bus/archimedes/podule/io_morley.cpp313
-rw-r--r--src/devices/bus/archimedes/podule/io_morley.h21
-rw-r--r--src/devices/bus/archimedes/podule/io_we.cpp150
-rw-r--r--src/devices/bus/archimedes/podule/io_we.h19
-rw-r--r--src/devices/bus/archimedes/podule/lark.cpp255
-rw-r--r--src/devices/bus/archimedes/podule/lark.h19
-rw-r--r--src/devices/bus/archimedes/podule/laserd.cpp173
-rw-r--r--src/devices/bus/archimedes/podule/laserd.h19
-rw-r--r--src/devices/bus/archimedes/podule/midi_emr.cpp208
-rw-r--r--src/devices/bus/archimedes/podule/midi_emr.h20
-rw-r--r--src/devices/bus/archimedes/podule/midimax.cpp175
-rw-r--r--src/devices/bus/archimedes/podule/midimax.h20
-rw-r--r--src/devices/bus/archimedes/podule/nexus.cpp127
-rw-r--r--src/devices/bus/archimedes/podule/nexus.h19
-rw-r--r--src/devices/bus/archimedes/podule/rom.cpp231
-rw-r--r--src/devices/bus/archimedes/podule/rom.h20
-rw-r--r--src/devices/bus/archimedes/podule/rs423.cpp136
-rw-r--r--src/devices/bus/archimedes/podule/rs423.h19
-rw-r--r--src/devices/bus/archimedes/podule/scan256.cpp126
-rw-r--r--src/devices/bus/archimedes/podule/scan256.h19
-rw-r--r--src/devices/bus/archimedes/podule/scanlight.cpp261
-rw-r--r--src/devices/bus/archimedes/podule/scanlight.h22
-rw-r--r--src/devices/bus/archimedes/podule/scsi_a500.cpp128
-rw-r--r--src/devices/bus/archimedes/podule/scsi_a500.h19
-rw-r--r--src/devices/bus/archimedes/podule/scsi_acorn.cpp265
-rw-r--r--src/devices/bus/archimedes/podule/scsi_acorn.h21
-rw-r--r--src/devices/bus/archimedes/podule/scsi_cumana.cpp152
-rw-r--r--src/devices/bus/archimedes/podule/scsi_cumana.h19
-rw-r--r--src/devices/bus/archimedes/podule/scsi_ling.cpp147
-rw-r--r--src/devices/bus/archimedes/podule/scsi_ling.h19
-rw-r--r--src/devices/bus/archimedes/podule/scsi_morley.cpp167
-rw-r--r--src/devices/bus/archimedes/podule/scsi_morley.h19
-rw-r--r--src/devices/bus/archimedes/podule/scsi_oak.cpp262
-rw-r--r--src/devices/bus/archimedes/podule/scsi_oak.h19
-rw-r--r--src/devices/bus/archimedes/podule/scsi_vti.cpp171
-rw-r--r--src/devices/bus/archimedes/podule/scsi_vti.h19
-rw-r--r--src/devices/bus/archimedes/podule/serial.cpp156
-rw-r--r--src/devices/bus/archimedes/podule/serial.h19
-rw-r--r--src/devices/bus/archimedes/podule/slot.cpp388
-rw-r--r--src/devices/bus/archimedes/podule/slot.h155
-rw-r--r--src/devices/bus/archimedes/podule/spectra.cpp126
-rw-r--r--src/devices/bus/archimedes/podule/spectra.h19
-rw-r--r--src/devices/bus/archimedes/podule/tube.cpp87
-rw-r--r--src/devices/bus/archimedes/podule/tube.h19
-rw-r--r--src/devices/bus/astrocde/accessory.cpp85
-rw-r--r--src/devices/bus/astrocde/accessory.h95
-rw-r--r--src/devices/bus/astrocde/cassette.cpp130
-rw-r--r--src/devices/bus/astrocde/cassette.h61
-rw-r--r--src/devices/bus/astrocde/ctrl.cpp94
-rw-r--r--src/devices/bus/astrocde/ctrl.h94
-rw-r--r--src/devices/bus/astrocde/exp.cpp99
-rw-r--r--src/devices/bus/astrocde/exp.h59
-rw-r--r--src/devices/bus/astrocde/joy.cpp56
-rw-r--r--src/devices/bus/astrocde/joy.h45
-rw-r--r--src/devices/bus/astrocde/lightpen.cpp84
-rw-r--r--src/devices/bus/astrocde/lightpen.h50
-rw-r--r--src/devices/bus/astrocde/ram.cpp256
-rw-r--r--src/devices/bus/astrocde/ram.h153
-rw-r--r--src/devices/bus/astrocde/rom.cpp132
-rw-r--r--src/devices/bus/astrocde/rom.h94
-rw-r--r--src/devices/bus/astrocde/slot.cpp209
-rw-r--r--src/devices/bus/astrocde/slot.h93
-rw-r--r--src/devices/bus/ata/atadev.cpp84
-rw-r--r--src/devices/bus/ata/atadev.h85
-rw-r--r--src/devices/bus/ata/ataintf.cpp264
-rw-r--r--src/devices/bus/ata/ataintf.h145
-rw-r--r--src/devices/bus/ata/atapicdr.cpp191
-rw-r--r--src/devices/bus/ata/atapicdr.h82
-rw-r--r--src/devices/bus/ata/atapihle.cpp296
-rw-r--r--src/devices/bus/ata/atapihle.h80
-rw-r--r--src/devices/bus/ata/cp2024.cpp101
-rw-r--r--src/devices/bus/ata/cp2024.h40
-rw-r--r--src/devices/bus/ata/cr589.cpp201
-rw-r--r--src/devices/bus/ata/cr589.h49
-rw-r--r--src/devices/bus/ata/gdrom.cpp901
-rw-r--r--src/devices/bus/ata/gdrom.h59
-rw-r--r--src/devices/bus/ata/hdd.cpp45
-rw-r--r--src/devices/bus/ata/hdd.h92
-rw-r--r--src/devices/bus/ata/px320a.cpp99
-rw-r--r--src/devices/bus/ata/px320a.h42
-rw-r--r--src/devices/bus/ata/xm3301.cpp82
-rw-r--r--src/devices/bus/ata/xm3301.h31
-rw-r--r--src/devices/bus/ata/zip100.cpp100
-rw-r--r--src/devices/bus/ata/zip100.h41
-rw-r--r--src/devices/bus/bbc/1mhzbus/1mhzbus.cpp209
-rw-r--r--src/devices/bus/bbc/1mhzbus/1mhzbus.h151
-rw-r--r--src/devices/bus/bbc/1mhzbus/24bbc.cpp142
-rw-r--r--src/devices/bus/bbc/1mhzbus/24bbc.h51
-rw-r--r--src/devices/bus/bbc/1mhzbus/2ndserial.cpp200
-rw-r--r--src/devices/bus/bbc/1mhzbus/2ndserial.h60
-rw-r--r--src/devices/bus/bbc/1mhzbus/autoprom.cpp188
-rw-r--r--src/devices/bus/bbc/1mhzbus/autoprom.h55
-rw-r--r--src/devices/bus/bbc/1mhzbus/barrybox.cpp85
-rw-r--r--src/devices/bus/bbc/1mhzbus/barrybox.h13
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebex.cpp155
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebex.h13
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebopl.cpp95
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebopl.h52
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebsid.cpp104
-rw-r--r--src/devices/bus/bbc/1mhzbus/beebsid.h52
-rw-r--r--src/devices/bus/bbc/1mhzbus/cc500.cpp178
-rw-r--r--src/devices/bus/bbc/1mhzbus/cc500.h59
-rw-r--r--src/devices/bus/bbc/1mhzbus/cfa3000opt.cpp110
-rw-r--r--src/devices/bus/bbc/1mhzbus/cfa3000opt.h49
-rw-r--r--src/devices/bus/bbc/1mhzbus/cisco.cpp267
-rw-r--r--src/devices/bus/bbc/1mhzbus/cisco.h60
-rw-r--r--src/devices/bus/bbc/1mhzbus/datacentre.cpp335
-rw-r--r--src/devices/bus/bbc/1mhzbus/datacentre.h68
-rw-r--r--src/devices/bus/bbc/1mhzbus/emrmidi.cpp108
-rw-r--r--src/devices/bus/bbc/1mhzbus/emrmidi.h54
-rw-r--r--src/devices/bus/bbc/1mhzbus/ide.cpp224
-rw-r--r--src/devices/bus/bbc/1mhzbus/ide.h86
-rw-r--r--src/devices/bus/bbc/1mhzbus/ieee488.cpp280
-rw-r--r--src/devices/bus/bbc/1mhzbus/ieee488.h111
-rw-r--r--src/devices/bus/bbc/1mhzbus/m2000.cpp166
-rw-r--r--src/devices/bus/bbc/1mhzbus/m2000.h62
-rw-r--r--src/devices/bus/bbc/1mhzbus/m5000.cpp430
-rw-r--r--src/devices/bus/bbc/1mhzbus/m5000.h158
-rw-r--r--src/devices/bus/bbc/1mhzbus/multiform.cpp195
-rw-r--r--src/devices/bus/bbc/1mhzbus/multiform.h69
-rw-r--r--src/devices/bus/bbc/1mhzbus/opus3.cpp232
-rw-r--r--src/devices/bus/bbc/1mhzbus/opus3.h76
-rw-r--r--src/devices/bus/bbc/1mhzbus/pdram.cpp87
-rw-r--r--src/devices/bus/bbc/1mhzbus/pdram.h49
-rw-r--r--src/devices/bus/bbc/1mhzbus/pms64k.cpp99
-rw-r--r--src/devices/bus/bbc/1mhzbus/pms64k.h50
-rw-r--r--src/devices/bus/bbc/1mhzbus/ramdisc.cpp227
-rw-r--r--src/devices/bus/bbc/1mhzbus/ramdisc.h13
-rw-r--r--src/devices/bus/bbc/1mhzbus/sasi.cpp175
-rw-r--r--src/devices/bus/bbc/1mhzbus/sasi.h71
-rw-r--r--src/devices/bus/bbc/1mhzbus/scsi.cpp201
-rw-r--r--src/devices/bus/bbc/1mhzbus/scsi.h81
-rw-r--r--src/devices/bus/bbc/1mhzbus/sprite.cpp99
-rw-r--r--src/devices/bus/bbc/1mhzbus/sprite.h49
-rw-r--r--src/devices/bus/bbc/analogue/analogue.cpp121
-rw-r--r--src/devices/bus/bbc/analogue/analogue.h106
-rw-r--r--src/devices/bus/bbc/analogue/bitstik.cpp138
-rw-r--r--src/devices/bus/bbc/analogue/bitstik.h14
-rw-r--r--src/devices/bus/bbc/analogue/cfa3000a.cpp79
-rw-r--r--src/devices/bus/bbc/analogue/cfa3000a.h13
-rw-r--r--src/devices/bus/bbc/analogue/joystick.cpp131
-rw-r--r--src/devices/bus/bbc/analogue/joystick.h14
-rw-r--r--src/devices/bus/bbc/analogue/lightpen.cpp251
-rw-r--r--src/devices/bus/bbc/analogue/lightpen.h16
-rw-r--r--src/devices/bus/bbc/analogue/micromike.cpp118
-rw-r--r--src/devices/bus/bbc/analogue/micromike.h13
-rw-r--r--src/devices/bus/bbc/analogue/quinkey.cpp168
-rw-r--r--src/devices/bus/bbc/analogue/quinkey.h117
-rw-r--r--src/devices/bus/bbc/cart/click.cpp109
-rw-r--r--src/devices/bus/bbc/cart/click.h13
-rw-r--r--src/devices/bus/bbc/cart/mastersd.cpp302
-rw-r--r--src/devices/bus/bbc/cart/mastersd.h14
-rw-r--r--src/devices/bus/bbc/cart/mega256.cpp107
-rw-r--r--src/devices/bus/bbc/cart/mega256.h13
-rw-r--r--src/devices/bus/bbc/cart/mr8000.cpp99
-rw-r--r--src/devices/bus/bbc/cart/mr8000.h13
-rw-r--r--src/devices/bus/bbc/cart/msc.cpp103
-rw-r--r--src/devices/bus/bbc/cart/msc.h13
-rw-r--r--src/devices/bus/bbc/cart/slot.cpp82
-rw-r--r--src/devices/bus/bbc/cart/slot.h158
-rw-r--r--src/devices/bus/bbc/exp/autocue.cpp118
-rw-r--r--src/devices/bus/bbc/exp/autocue.h13
-rw-r--r--src/devices/bus/bbc/exp/exp.cpp181
-rw-r--r--src/devices/bus/bbc/exp/exp.h146
-rw-r--r--src/devices/bus/bbc/exp/jafacart.cpp75
-rw-r--r--src/devices/bus/bbc/exp/jafacart.h13
-rw-r--r--src/devices/bus/bbc/exp/magazzino.cpp65
-rw-r--r--src/devices/bus/bbc/exp/magazzino.h13
-rw-r--r--src/devices/bus/bbc/exp/mertec.cpp198
-rw-r--r--src/devices/bus/bbc/exp/mertec.h13
-rw-r--r--src/devices/bus/bbc/fdc/acorn.cpp269
-rw-r--r--src/devices/bus/bbc/fdc/acorn.h88
-rw-r--r--src/devices/bus/bbc/fdc/ams.cpp137
-rw-r--r--src/devices/bus/bbc/fdc/ams.h57
-rw-r--r--src/devices/bus/bbc/fdc/cumana.cpp225
-rw-r--r--src/devices/bus/bbc/fdc/cumana.h79
-rw-r--r--src/devices/bus/bbc/fdc/cv1797.cpp158
-rw-r--r--src/devices/bus/bbc/fdc/cv1797.h57
-rw-r--r--src/devices/bus/bbc/fdc/fdc.cpp121
-rw-r--r--src/devices/bus/bbc/fdc/fdc.h86
-rw-r--r--src/devices/bus/bbc/fdc/kenda.cpp169
-rw-r--r--src/devices/bus/bbc/fdc/kenda.h52
-rw-r--r--src/devices/bus/bbc/fdc/opus.cpp325
-rw-r--r--src/devices/bus/bbc/fdc/opus.h108
-rw-r--r--src/devices/bus/bbc/fdc/solidisk.cpp363
-rw-r--r--src/devices/bus/bbc/fdc/solidisk.h110
-rw-r--r--src/devices/bus/bbc/fdc/udm.cpp170
-rw-r--r--src/devices/bus/bbc/fdc/udm.h59
-rw-r--r--src/devices/bus/bbc/fdc/watford.cpp243
-rw-r--r--src/devices/bus/bbc/fdc/watford.h84
-rw-r--r--src/devices/bus/bbc/internal/aries.cpp337
-rw-r--r--src/devices/bus/bbc/internal/aries.h117
-rw-r--r--src/devices/bus/bbc/internal/atpl.cpp250
-rw-r--r--src/devices/bus/bbc/internal/atpl.h85
-rw-r--r--src/devices/bus/bbc/internal/cumana68k.cpp324
-rw-r--r--src/devices/bus/bbc/internal/cumana68k.h86
-rw-r--r--src/devices/bus/bbc/internal/integrab.cpp341
-rw-r--r--src/devices/bus/bbc/internal/integrab.h67
-rw-r--r--src/devices/bus/bbc/internal/internal.cpp218
-rw-r--r--src/devices/bus/bbc/internal/internal.h114
-rw-r--r--src/devices/bus/bbc/internal/memex.cpp109
-rw-r--r--src/devices/bus/bbc/internal/memex.h50
-rw-r--r--src/devices/bus/bbc/internal/morleyaa.cpp307
-rw-r--r--src/devices/bus/bbc/internal/morleyaa.h55
-rw-r--r--src/devices/bus/bbc/internal/overlay.cpp224
-rw-r--r--src/devices/bus/bbc/internal/overlay.h57
-rw-r--r--src/devices/bus/bbc/internal/peartree.cpp295
-rw-r--r--src/devices/bus/bbc/internal/peartree.h116
-rw-r--r--src/devices/bus/bbc/internal/ramamp.cpp155
-rw-r--r--src/devices/bus/bbc/internal/ramamp.h55
-rw-r--r--src/devices/bus/bbc/internal/raven20.cpp112
-rw-r--r--src/devices/bus/bbc/internal/raven20.h52
-rw-r--r--src/devices/bus/bbc/internal/romex.cpp134
-rw-r--r--src/devices/bus/bbc/internal/romex.h53
-rw-r--r--src/devices/bus/bbc/internal/stl2m128.cpp248
-rw-r--r--src/devices/bus/bbc/internal/stl2m128.h59
-rw-r--r--src/devices/bus/bbc/internal/stl4m32.cpp303
-rw-r--r--src/devices/bus/bbc/internal/stl4m32.h67
-rw-r--r--src/devices/bus/bbc/internal/stlswr.cpp192
-rw-r--r--src/devices/bus/bbc/internal/stlswr.h108
-rw-r--r--src/devices/bus/bbc/internal/we32kram.cpp146
-rw-r--r--src/devices/bus/bbc/internal/we32kram.h55
-rw-r--r--src/devices/bus/bbc/internal/werom.cpp260
-rw-r--r--src/devices/bus/bbc/internal/werom.h90
-rw-r--r--src/devices/bus/bbc/internal/weromram.cpp133
-rw-r--r--src/devices/bus/bbc/internal/weromram.h58
-rw-r--r--src/devices/bus/bbc/joyport/joyport.cpp124
-rw-r--r--src/devices/bus/bbc/joyport/joyport.h106
-rw-r--r--src/devices/bus/bbc/joyport/joystick.cpp64
-rw-r--r--src/devices/bus/bbc/joyport/joystick.h13
-rw-r--r--src/devices/bus/bbc/joyport/mouse.cpp195
-rw-r--r--src/devices/bus/bbc/joyport/mouse.h13
-rw-r--r--src/devices/bus/bbc/modem/meup.cpp71
-rw-r--r--src/devices/bus/bbc/modem/meup.h13
-rw-r--r--src/devices/bus/bbc/modem/modem.cpp101
-rw-r--r--src/devices/bus/bbc/modem/modem.h101
-rw-r--r--src/devices/bus/bbc/modem/scsiaiv.cpp185
-rw-r--r--src/devices/bus/bbc/modem/scsiaiv.h14
-rw-r--r--src/devices/bus/bbc/rom/datagem.cpp103
-rw-r--r--src/devices/bus/bbc/rom/datagem.h13
-rw-r--r--src/devices/bus/bbc/rom/detalker.cpp106
-rw-r--r--src/devices/bus/bbc/rom/detalker.h13
-rw-r--r--src/devices/bus/bbc/rom/dfs.cpp54
-rw-r--r--src/devices/bus/bbc/rom/dfs.h13
-rw-r--r--src/devices/bus/bbc/rom/genie.cpp190
-rw-r--r--src/devices/bus/bbc/rom/genie.h13
-rw-r--r--src/devices/bus/bbc/rom/nvram.cpp53
-rw-r--r--src/devices/bus/bbc/rom/nvram.h13
-rw-r--r--src/devices/bus/bbc/rom/pal.cpp430
-rw-r--r--src/devices/bus/bbc/rom/pal.h22
-rw-r--r--src/devices/bus/bbc/rom/ram.cpp53
-rw-r--r--src/devices/bus/bbc/rom/ram.h13
-rw-r--r--src/devices/bus/bbc/rom/rom.cpp38
-rw-r--r--src/devices/bus/bbc/rom/rom.h13
-rw-r--r--src/devices/bus/bbc/rom/rtc.cpp140
-rw-r--r--src/devices/bus/bbc/rom/rtc.h14
-rw-r--r--src/devices/bus/bbc/rom/slot.cpp262
-rw-r--r--src/devices/bus/bbc/rom/slot.h150
-rw-r--r--src/devices/bus/bbc/tube/cms6502.cpp129
-rw-r--r--src/devices/bus/bbc/tube/cms6502.h13
-rw-r--r--src/devices/bus/bbc/tube/tube.cpp231
-rw-r--r--src/devices/bus/bbc/tube/tube.h117
-rw-r--r--src/devices/bus/bbc/tube/tube_32016.cpp335
-rw-r--r--src/devices/bus/bbc/tube/tube_32016.h15
-rw-r--r--src/devices/bus/bbc/tube/tube_6502.cpp423
-rw-r--r--src/devices/bus/bbc/tube/tube_6502.h16
-rw-r--r--src/devices/bus/bbc/tube/tube_80186.cpp221
-rw-r--r--src/devices/bus/bbc/tube/tube_80186.h14
-rw-r--r--src/devices/bus/bbc/tube/tube_80286.cpp191
-rw-r--r--src/devices/bus/bbc/tube/tube_80286.h13
-rw-r--r--src/devices/bus/bbc/tube/tube_a500.cpp220
-rw-r--r--src/devices/bus/bbc/tube/tube_a500.h14
-rw-r--r--src/devices/bus/bbc/tube/tube_arm.cpp177
-rw-r--r--src/devices/bus/bbc/tube/tube_arm.h13
-rw-r--r--src/devices/bus/bbc/tube/tube_arm7.cpp358
-rw-r--r--src/devices/bus/bbc/tube/tube_arm7.h13
-rw-r--r--src/devices/bus/bbc/tube/tube_casper.cpp132
-rw-r--r--src/devices/bus/bbc/tube/tube_casper.h13
-rw-r--r--src/devices/bus/bbc/tube/tube_cms6809.cpp163
-rw-r--r--src/devices/bus/bbc/tube/tube_cms6809.h13
-rw-r--r--src/devices/bus/bbc/tube/tube_matchbox.cpp1013
-rw-r--r--src/devices/bus/bbc/tube/tube_matchbox.h13
-rw-r--r--src/devices/bus/bbc/tube/tube_rc6502.cpp352
-rw-r--r--src/devices/bus/bbc/tube/tube_rc6502.h14
-rw-r--r--src/devices/bus/bbc/tube/tube_x25.cpp214
-rw-r--r--src/devices/bus/bbc/tube/tube_x25.h13
-rw-r--r--src/devices/bus/bbc/tube/tube_z80.cpp258
-rw-r--r--src/devices/bus/bbc/tube/tube_z80.h14
-rw-r--r--src/devices/bus/bbc/tube/tube_zep100.cpp345
-rw-r--r--src/devices/bus/bbc/tube/tube_zep100.h16
-rw-r--r--src/devices/bus/bbc/userport/beebspch.cpp119
-rw-r--r--src/devices/bus/bbc/userport/beebspch.h13
-rw-r--r--src/devices/bus/bbc/userport/cfa3000kbd.cpp126
-rw-r--r--src/devices/bus/bbc/userport/cfa3000kbd.h13
-rw-r--r--src/devices/bus/bbc/userport/lcd.cpp124
-rw-r--r--src/devices/bus/bbc/userport/lcd.h13
-rw-r--r--src/devices/bus/bbc/userport/lvlecho.cpp272
-rw-r--r--src/devices/bus/bbc/userport/lvlecho.h13
-rw-r--r--src/devices/bus/bbc/userport/m4000.cpp179
-rw-r--r--src/devices/bus/bbc/userport/m4000.h13
-rw-r--r--src/devices/bus/bbc/userport/palext.cpp167
-rw-r--r--src/devices/bus/bbc/userport/palext.h14
-rw-r--r--src/devices/bus/bbc/userport/pointer.cpp310
-rw-r--r--src/devices/bus/bbc/userport/pointer.h15
-rw-r--r--src/devices/bus/bbc/userport/sdcard.cpp206
-rw-r--r--src/devices/bus/bbc/userport/sdcard.h14
-rw-r--r--src/devices/bus/bbc/userport/userport.cpp163
-rw-r--r--src/devices/bus/bbc/userport/userport.h110
-rw-r--r--src/devices/bus/bbc/userport/usersplit.cpp150
-rw-r--r--src/devices/bus/bbc/userport/usersplit.h13
-rw-r--r--src/devices/bus/bbc/userport/voicebox.cpp77
-rw-r--r--src/devices/bus/bbc/userport/voicebox.h13
-rw-r--r--src/devices/bus/bbc/vsp/slot.cpp126
-rw-r--r--src/devices/bus/bbc/vsp/slot.h83
-rw-r--r--src/devices/bus/bbc/vsp/speech.cpp132
-rw-r--r--src/devices/bus/bbc/vsp/speech.h13
-rw-r--r--src/devices/bus/bbc/vsp/sweetalker.cpp71
-rw-r--r--src/devices/bus/bbc/vsp/sweetalker.h13
-rw-r--r--src/devices/bus/bk/ay.cpp104
-rw-r--r--src/devices/bus/bk/ay.h19
-rw-r--r--src/devices/bus/bk/carts.cpp26
-rw-r--r--src/devices/bus/bk/carts.h17
-rw-r--r--src/devices/bus/bk/covox.cpp91
-rw-r--r--src/devices/bus/bk/covox.h19
-rw-r--r--src/devices/bus/bk/joystick.cpp99
-rw-r--r--src/devices/bus/bk/joystick.h19
-rw-r--r--src/devices/bus/bk/loopback.cpp79
-rw-r--r--src/devices/bus/bk/loopback.h19
-rw-r--r--src/devices/bus/bk/parallel.cpp111
-rw-r--r--src/devices/bus/bk/parallel.h115
-rw-r--r--src/devices/bus/bk/printer.cpp101
-rw-r--r--src/devices/bus/bk/printer.h19
-rw-r--r--src/devices/bus/bml3/bml3bus.cpp236
-rw-r--r--src/devices/bus/bml3/bml3bus.h149
-rw-r--r--src/devices/bus/bml3/kanji.cpp86
-rw-r--r--src/devices/bus/bml3/kanji.h51
-rw-r--r--src/devices/bus/bml3/mp1802.cpp143
-rw-r--r--src/devices/bus/bml3/mp1802.h62
-rw-r--r--src/devices/bus/bml3/mp1805.cpp163
-rw-r--r--src/devices/bus/bml3/mp1805.h61
-rw-r--r--src/devices/bus/bml3/rtc.cpp109
-rw-r--r--src/devices/bus/bml3/rtc.h54
-rw-r--r--src/devices/bus/bw2/exp.cpp165
-rw-r--r--src/devices/bus/bw2/exp.h133
-rw-r--r--src/devices/bus/bw2/ramcard.cpp105
-rw-r--r--src/devices/bus/bw2/ramcard.h63
-rw-r--r--src/devices/bus/c64/16kb.cpp113
-rw-r--r--src/devices/bus/c64/16kb.h55
-rw-r--r--src/devices/bus/c64/4dxh.cpp78
-rw-r--r--src/devices/bus/c64/4dxh.h48
-rw-r--r--src/devices/bus/c64/4ksa.cpp78
-rw-r--r--src/devices/bus/c64/4ksa.h48
-rw-r--r--src/devices/bus/c64/4tba.cpp78
-rw-r--r--src/devices/bus/c64/4tba.h47
-rw-r--r--src/devices/bus/c64/bn1541.cpp151
-rw-r--r--src/devices/bus/c64/bn1541.h81
-rw-r--r--src/devices/bus/c64/buscard.cpp430
-rw-r--r--src/devices/bus/c64/buscard.h85
-rw-r--r--src/devices/bus/c64/buscard2.cpp230
-rw-r--r--src/devices/bus/c64/buscard2.h72
-rw-r--r--src/devices/bus/c64/c128_comal80.cpp104
-rw-r--r--src/devices/bus/c64/c128_comal80.h50
-rw-r--r--src/devices/bus/c64/c128_partner.cpp248
-rw-r--r--src/devices/bus/c64/c128_partner.h68
-rw-r--r--src/devices/bus/c64/comal80.cpp88
-rw-r--r--src/devices/bus/c64/comal80.h50
-rw-r--r--src/devices/bus/c64/cpm.cpp227
-rw-r--r--src/devices/bus/c64/cpm.h68
-rw-r--r--src/devices/bus/c64/currah_speech.cpp239
-rw-r--r--src/devices/bus/c64/currah_speech.h57
-rw-r--r--src/devices/bus/c64/dela_ep256.cpp128
-rw-r--r--src/devices/bus/c64/dela_ep256.h58
-rw-r--r--src/devices/bus/c64/dela_ep64.cpp135
-rw-r--r--src/devices/bus/c64/dela_ep64.h63
-rw-r--r--src/devices/bus/c64/dela_ep7x8.cpp111
-rw-r--r--src/devices/bus/c64/dela_ep7x8.h57
-rw-r--r--src/devices/bus/c64/dinamic.cpp76
-rw-r--r--src/devices/bus/c64/dinamic.h49
-rw-r--r--src/devices/bus/c64/dqbb.cpp144
-rw-r--r--src/devices/bus/c64/dqbb.h57
-rw-r--r--src/devices/bus/c64/easy_calc_result.cpp108
-rw-r--r--src/devices/bus/c64/easy_calc_result.h50
-rw-r--r--src/devices/bus/c64/easyflash.cpp216
-rw-r--r--src/devices/bus/c64/easyflash.h63
-rw-r--r--src/devices/bus/c64/epyx_fast_load.cpp117
-rw-r--r--src/devices/bus/c64/epyx_fast_load.h52
-rw-r--r--src/devices/bus/c64/exos.cpp68
-rw-r--r--src/devices/bus/c64/exos.h46
-rw-r--r--src/devices/bus/c64/exp.cpp462
-rw-r--r--src/devices/bus/c64/exp.h160
-rw-r--r--src/devices/bus/c64/fcc.cpp178
-rw-r--r--src/devices/bus/c64/fcc.h71
-rw-r--r--src/devices/bus/c64/final.cpp135
-rw-r--r--src/devices/bus/c64/final.h52
-rw-r--r--src/devices/bus/c64/final3.cpp151
-rw-r--r--src/devices/bus/c64/final3.h56
-rw-r--r--src/devices/bus/c64/fun_play.cpp100
-rw-r--r--src/devices/bus/c64/fun_play.h50
-rw-r--r--src/devices/bus/c64/geocable.cpp63
-rw-r--r--src/devices/bus/c64/geocable.h59
-rw-r--r--src/devices/bus/c64/georam.cpp98
-rw-r--r--src/devices/bus/c64/georam.h52
-rw-r--r--src/devices/bus/c64/ide64.cpp347
-rw-r--r--src/devices/bus/c64/ide64.h69
-rw-r--r--src/devices/bus/c64/ieee488.cpp244
-rw-r--r--src/devices/bus/c64/ieee488.h64
-rw-r--r--src/devices/bus/c64/kingsoft.cpp99
-rw-r--r--src/devices/bus/c64/kingsoft.h48
-rw-r--r--src/devices/bus/c64/mach5.cpp119
-rw-r--r--src/devices/bus/c64/mach5.h54
-rw-r--r--src/devices/bus/c64/magic_desk.cpp87
-rw-r--r--src/devices/bus/c64/magic_desk.h50
-rw-r--r--src/devices/bus/c64/magic_formel.cpp255
-rw-r--r--src/devices/bus/c64/magic_formel.h69
-rw-r--r--src/devices/bus/c64/magic_voice.cpp368
-rw-r--r--src/devices/bus/c64/magic_voice.h78
-rw-r--r--src/devices/bus/c64/midi_maplin.cpp136
-rw-r--r--src/devices/bus/c64/midi_maplin.h55
-rw-r--r--src/devices/bus/c64/midi_namesoft.cpp134
-rw-r--r--src/devices/bus/c64/midi_namesoft.h55
-rw-r--r--src/devices/bus/c64/midi_passport.cpp176
-rw-r--r--src/devices/bus/c64/midi_passport.h61
-rw-r--r--src/devices/bus/c64/midi_sci.cpp135
-rw-r--r--src/devices/bus/c64/midi_sci.h55
-rw-r--r--src/devices/bus/c64/midi_siel.cpp136
-rw-r--r--src/devices/bus/c64/midi_siel.h55
-rw-r--r--src/devices/bus/c64/mikro_assembler.cpp58
-rw-r--r--src/devices/bus/c64/mikro_assembler.h45
-rw-r--r--src/devices/bus/c64/multiscreen.cpp217
-rw-r--r--src/devices/bus/c64/multiscreen.h58
-rw-r--r--src/devices/bus/c64/music64.cpp220
-rw-r--r--src/devices/bus/c64/music64.h56
-rw-r--r--src/devices/bus/c64/neoram.cpp120
-rw-r--r--src/devices/bus/c64/neoram.h56
-rw-r--r--src/devices/bus/c64/ocean.cpp116
-rw-r--r--src/devices/bus/c64/ocean.h50
-rw-r--r--src/devices/bus/c64/pagefox.cpp136
-rw-r--r--src/devices/bus/c64/pagefox.h52
-rw-r--r--src/devices/bus/c64/partner.cpp207
-rw-r--r--src/devices/bus/c64/partner.h59
-rw-r--r--src/devices/bus/c64/prophet64.cpp87
-rw-r--r--src/devices/bus/c64/prophet64.h48
-rw-r--r--src/devices/bus/c64/ps64.cpp137
-rw-r--r--src/devices/bus/c64/ps64.h51
-rw-r--r--src/devices/bus/c64/reu.cpp124
-rw-r--r--src/devices/bus/c64/reu.h98
-rw-r--r--src/devices/bus/c64/rex.cpp79
-rw-r--r--src/devices/bus/c64/rex.h46
-rw-r--r--src/devices/bus/c64/rex_ep256.cpp137
-rw-r--r--src/devices/bus/c64/rex_ep256.h58
-rw-r--r--src/devices/bus/c64/ross.cpp93
-rw-r--r--src/devices/bus/c64/ross.h50
-rw-r--r--src/devices/bus/c64/sfx_sound_expander.cpp262
-rw-r--r--src/devices/bus/c64/sfx_sound_expander.h62
-rw-r--r--src/devices/bus/c64/silverrock.cpp133
-rw-r--r--src/devices/bus/c64/silverrock.h50
-rw-r--r--src/devices/bus/c64/simons_basic.cpp85
-rw-r--r--src/devices/bus/c64/simons_basic.h47
-rw-r--r--src/devices/bus/c64/speakeasy.cpp94
-rw-r--r--src/devices/bus/c64/speakeasy.h51
-rw-r--r--src/devices/bus/c64/stardos.cpp195
-rw-r--r--src/devices/bus/c64/stardos.h59
-rw-r--r--src/devices/bus/c64/std.cpp69
-rw-r--r--src/devices/bus/c64/std.h45
-rw-r--r--src/devices/bus/c64/structured_basic.cpp105
-rw-r--r--src/devices/bus/c64/structured_basic.h50
-rw-r--r--src/devices/bus/c64/super_explode.cpp126
-rw-r--r--src/devices/bus/c64/super_explode.h54
-rw-r--r--src/devices/bus/c64/super_games.cpp104
-rw-r--r--src/devices/bus/c64/super_games.h50
-rw-r--r--src/devices/bus/c64/supercpu.cpp299
-rw-r--r--src/devices/bus/c64/supercpu.h63
-rw-r--r--src/devices/bus/c64/sw8k.cpp115
-rw-r--r--src/devices/bus/c64/sw8k.h54
-rw-r--r--src/devices/bus/c64/swiftlink.cpp166
-rw-r--r--src/devices/bus/c64/swiftlink.h76
-rw-r--r--src/devices/bus/c64/system3.cpp92
-rw-r--r--src/devices/bus/c64/system3.h50
-rw-r--r--src/devices/bus/c64/tdos.cpp333
-rw-r--r--src/devices/bus/c64/tdos.h60
-rw-r--r--src/devices/bus/c64/tibdd001.cpp164
-rw-r--r--src/devices/bus/c64/tibdd001.h60
-rw-r--r--src/devices/bus/c64/turbo232.cpp210
-rw-r--r--src/devices/bus/c64/turbo232.h89
-rw-r--r--src/devices/bus/c64/user.cpp34
-rw-r--r--src/devices/bus/c64/user.h33
-rw-r--r--src/devices/bus/c64/vizastar.cpp90
-rw-r--r--src/devices/bus/c64/vizastar.h45
-rw-r--r--src/devices/bus/c64/vw64.cpp129
-rw-r--r--src/devices/bus/c64/vw64.h52
-rw-r--r--src/devices/bus/c64/warp_speed.cpp148
-rw-r--r--src/devices/bus/c64/warp_speed.h50
-rw-r--r--src/devices/bus/c64/westermann.cpp83
-rw-r--r--src/devices/bus/c64/westermann.h46
-rw-r--r--src/devices/bus/c64/xl80.cpp231
-rw-r--r--src/devices/bus/c64/xl80.h62
-rw-r--r--src/devices/bus/c64/z80videopak.cpp213
-rw-r--r--src/devices/bus/c64/z80videopak.h61
-rw-r--r--src/devices/bus/c64/zaxxon.cpp68
-rw-r--r--src/devices/bus/c64/zaxxon.h48
-rw-r--r--src/devices/bus/casloopy/rom.cpp117
-rw-r--r--src/devices/bus/casloopy/rom.h58
-rw-r--r--src/devices/bus/casloopy/slot.cpp149
-rw-r--r--src/devices/bus/casloopy/slot.h87
-rw-r--r--src/devices/bus/cbm2/24k.cpp88
-rw-r--r--src/devices/bus/cbm2/24k.h47
-rw-r--r--src/devices/bus/cbm2/exp.cpp190
-rw-r--r--src/devices/bus/cbm2/exp.h113
-rw-r--r--src/devices/bus/cbm2/hrg.cpp246
-rw-r--r--src/devices/bus/cbm2/hrg.h90
-rw-r--r--src/devices/bus/cbm2/std.cpp66
-rw-r--r--src/devices/bus/cbm2/std.h44
-rw-r--r--src/devices/bus/cbm2/user.cpp74
-rw-r--r--src/devices/bus/cbm2/user.h126
-rw-r--r--src/devices/bus/cbmiec/c1526.cpp250
-rw-r--r--src/devices/bus/cbmiec/c1526.h85
-rw-r--r--src/devices/bus/cbmiec/c1541.cpp1362
-rw-r--r--src/devices/bus/cbmiec/c1541.h413
-rw-r--r--src/devices/bus/cbmiec/c1571.cpp910
-rw-r--r--src/devices/bus/cbmiec/c1571.h193
-rw-r--r--src/devices/bus/cbmiec/c1581.cpp459
-rw-r--r--src/devices/bus/cbmiec/c1581.h112
-rw-r--r--src/devices/bus/cbmiec/c5181.cpp124
-rw-r--r--src/devices/bus/cbmiec/c5181.h44
-rw-r--r--src/devices/bus/cbmiec/c64_nl10.cpp127
-rw-r--r--src/devices/bus/cbmiec/c64_nl10.h51
-rw-r--r--src/devices/bus/cbmiec/cbmiec.cpp531
-rw-r--r--src/devices/bus/cbmiec/cbmiec.h183
-rw-r--r--src/devices/bus/cbmiec/cmdhd.cpp187
-rw-r--r--src/devices/bus/cbmiec/cmdhd.h64
-rw-r--r--src/devices/bus/cbmiec/diag264_lb_iec.cpp53
-rw-r--r--src/devices/bus/cbmiec/diag264_lb_iec.h44
-rw-r--r--src/devices/bus/cbmiec/fd2000.cpp339
-rw-r--r--src/devices/bus/cbmiec/fd2000.h92
-rw-r--r--src/devices/bus/cbmiec/interpod.cpp180
-rw-r--r--src/devices/bus/cbmiec/interpod.h62
-rw-r--r--src/devices/bus/cbmiec/mps1200.cpp317
-rw-r--r--src/devices/bus/cbmiec/mps1200.h70
-rw-r--r--src/devices/bus/cbmiec/serialbox.cpp142
-rw-r--r--src/devices/bus/cbmiec/serialbox.h56
-rw-r--r--src/devices/bus/cbmiec/vic1515.cpp157
-rw-r--r--src/devices/bus/cbmiec/vic1515.h56
-rw-r--r--src/devices/bus/cbmiec/vic1520.cpp245
-rw-r--r--src/devices/bus/cbmiec/vic1520.h63
-rw-r--r--src/devices/bus/centronics/adaptator.cpp91
-rw-r--r--src/devices/bus/centronics/adaptator.h44
-rw-r--r--src/devices/bus/centronics/chessmec.cpp36
-rw-r--r--src/devices/bus/centronics/chessmec.h41
-rw-r--r--src/devices/bus/centronics/comxpl80.cpp283
-rw-r--r--src/devices/bus/centronics/comxpl80.h78
-rw-r--r--src/devices/bus/centronics/covox.cpp117
-rw-r--r--src/devices/bus/centronics/covox.h94
-rw-r--r--src/devices/bus/centronics/ctronics.cpp166
-rw-r--r--src/devices/bus/centronics/ctronics.h162
-rw-r--r--src/devices/bus/centronics/digiblst.cpp56
-rw-r--r--src/devices/bus/centronics/digiblst.h60
-rw-r--r--src/devices/bus/centronics/dsjoy.cpp49
-rw-r--r--src/devices/bus/centronics/dsjoy.h47
-rw-r--r--src/devices/bus/centronics/epson_ex800.cpp480
-rw-r--r--src/devices/bus/centronics/epson_ex800.h77
-rw-r--r--src/devices/bus/centronics/epson_fx80.cpp320
-rw-r--r--src/devices/bus/centronics/epson_fx80.h20
-rw-r--r--src/devices/bus/centronics/epson_lx800.cpp327
-rw-r--r--src/devices/bus/centronics/epson_lx800.h76
-rw-r--r--src/devices/bus/centronics/epson_lx810l.cpp609
-rw-r--r--src/devices/bus/centronics/epson_lx810l.h167
-rw-r--r--src/devices/bus/centronics/epson_rx80.cpp171
-rw-r--r--src/devices/bus/centronics/epson_rx80.h19
-rw-r--r--src/devices/bus/centronics/hasp_savquest.cpp69
-rw-r--r--src/devices/bus/centronics/hasp_savquest.h61
-rw-r--r--src/devices/bus/centronics/mz1p16.cpp226
-rw-r--r--src/devices/bus/centronics/mz1p16.h60
-rw-r--r--src/devices/bus/centronics/nec_p72.cpp86
-rw-r--r--src/devices/bus/centronics/nec_p72.h44
-rw-r--r--src/devices/bus/centronics/neomania_adapter.cpp169
-rw-r--r--src/devices/bus/centronics/neomania_adapter.h54
-rw-r--r--src/devices/bus/centronics/nlq401.cpp310
-rw-r--r--src/devices/bus/centronics/nlq401.h60
-rw-r--r--src/devices/bus/centronics/pc6022.cpp163
-rw-r--r--src/devices/bus/centronics/pc6022.h61
-rw-r--r--src/devices/bus/centronics/printer.cpp142
-rw-r--r--src/devices/bus/centronics/printer.h58
-rw-r--r--src/devices/bus/centronics/samdac.cpp91
-rw-r--r--src/devices/bus/centronics/samdac.h57
-rw-r--r--src/devices/bus/centronics/smartboard.cpp37
-rw-r--r--src/devices/bus/centronics/smartboard.h40
-rw-r--r--src/devices/bus/centronics/spjoy.cpp94
-rw-r--r--src/devices/bus/centronics/spjoy.h50
-rw-r--r--src/devices/bus/cgenie/expansion/carts.cpp17
-rw-r--r--src/devices/bus/cgenie/expansion/carts.h17
-rw-r--r--src/devices/bus/cgenie/expansion/expansion.cpp80
-rw-r--r--src/devices/bus/cgenie/expansion/expansion.h103
-rw-r--r--src/devices/bus/cgenie/expansion/floppy.cpp233
-rw-r--r--src/devices/bus/cgenie/expansion/floppy.h75
-rw-r--r--src/devices/bus/cgenie/parallel/carts.cpp19
-rw-r--r--src/devices/bus/cgenie/parallel/carts.h17
-rw-r--r--src/devices/bus/cgenie/parallel/joystick.cpp154
-rw-r--r--src/devices/bus/cgenie/parallel/joystick.h47
-rw-r--r--src/devices/bus/cgenie/parallel/parallel.cpp109
-rw-r--r--src/devices/bus/cgenie/parallel/parallel.h80
-rw-r--r--src/devices/bus/cgenie/parallel/printer.cpp130
-rw-r--r--src/devices/bus/cgenie/parallel/printer.h57
-rw-r--r--src/devices/bus/chanf/rom.cpp242
-rw-r--r--src/devices/bus/chanf/rom.h144
-rw-r--r--src/devices/bus/chanf/slot.cpp257
-rw-r--r--src/devices/bus/chanf/slot.h111
-rw-r--r--src/devices/bus/coco/coco_dcmodem.cpp133
-rw-r--r--src/devices/bus/coco/coco_dcmodem.h13
-rw-r--r--src/devices/bus/coco/coco_dwsock.cpp212
-rw-r--r--src/devices/bus/coco/coco_dwsock.h72
-rw-r--r--src/devices/bus/coco/coco_fdc.cpp825
-rw-r--r--src/devices/bus/coco/coco_fdc.h71
-rw-r--r--src/devices/bus/coco/coco_gmc.cpp94
-rw-r--r--src/devices/bus/coco/coco_gmc.h13
-rw-r--r--src/devices/bus/coco/coco_ide.cpp249
-rw-r--r--src/devices/bus/coco/coco_ide.h62
-rw-r--r--src/devices/bus/coco/coco_max.cpp170
-rw-r--r--src/devices/bus/coco/coco_max.h14
-rw-r--r--src/devices/bus/coco/coco_midi.cpp116
-rw-r--r--src/devices/bus/coco/coco_midi.h14
-rw-r--r--src/devices/bus/coco/coco_multi.cpp541
-rw-r--r--src/devices/bus/coco/coco_multi.h14
-rw-r--r--src/devices/bus/coco/coco_orch90.cpp138
-rw-r--r--src/devices/bus/coco/coco_orch90.h13
-rw-r--r--src/devices/bus/coco/coco_pak.cpp259
-rw-r--r--src/devices/bus/coco/coco_pak.h76
-rw-r--r--src/devices/bus/coco/coco_psg.cpp270
-rw-r--r--src/devices/bus/coco/coco_psg.h58
-rw-r--r--src/devices/bus/coco/coco_ram.cpp196
-rw-r--r--src/devices/bus/coco/coco_ram.h14
-rw-r--r--src/devices/bus/coco/coco_rs232.cpp132
-rw-r--r--src/devices/bus/coco/coco_rs232.h13
-rw-r--r--src/devices/bus/coco/coco_ssc.cpp535
-rw-r--r--src/devices/bus/coco/coco_ssc.h13
-rw-r--r--src/devices/bus/coco/coco_stecomp.cpp85
-rw-r--r--src/devices/bus/coco/coco_stecomp.h13
-rw-r--r--src/devices/bus/coco/coco_sym12.cpp178
-rw-r--r--src/devices/bus/coco/coco_sym12.h13
-rw-r--r--src/devices/bus/coco/coco_t4426.cpp449
-rw-r--r--src/devices/bus/coco/coco_t4426.h13
-rw-r--r--src/devices/bus/coco/coco_wpk.cpp200
-rw-r--r--src/devices/bus/coco/coco_wpk.h93
-rw-r--r--src/devices/bus/coco/coco_wpk2p.cpp56
-rw-r--r--src/devices/bus/coco/coco_wpk2p.h41
-rw-r--r--src/devices/bus/coco/coco_xsid.cpp60
-rw-r--r--src/devices/bus/coco/coco_xsid.h13
-rw-r--r--src/devices/bus/coco/cococart.cpp926
-rw-r--r--src/devices/bus/coco/cococart.h234
-rw-r--r--src/devices/bus/coco/dragon_amtor.cpp119
-rw-r--r--src/devices/bus/coco/dragon_amtor.h45
-rw-r--r--src/devices/bus/coco/dragon_claw.cpp212
-rw-r--r--src/devices/bus/coco/dragon_claw.h59
-rw-r--r--src/devices/bus/coco/dragon_fdc.cpp471
-rw-r--r--src/devices/bus/coco/dragon_fdc.h15
-rw-r--r--src/devices/bus/coco/dragon_jcbsnd.cpp118
-rw-r--r--src/devices/bus/coco/dragon_jcbsnd.h48
-rw-r--r--src/devices/bus/coco/dragon_jcbspch.cpp155
-rw-r--r--src/devices/bus/coco/dragon_jcbspch.h52
-rw-r--r--src/devices/bus/coco/dragon_msx2.cpp191
-rw-r--r--src/devices/bus/coco/dragon_msx2.h53
-rw-r--r--src/devices/bus/coco/dragon_serial.cpp138
-rw-r--r--src/devices/bus/coco/dragon_serial.h13
-rw-r--r--src/devices/bus/coco/dragon_sprites.cpp118
-rw-r--r--src/devices/bus/coco/dragon_sprites.h48
-rw-r--r--src/devices/bus/coco/meb_intrf.cpp187
-rw-r--r--src/devices/bus/coco/meb_intrf.h87
-rw-r--r--src/devices/bus/coco/meb_rtime.cpp173
-rw-r--r--src/devices/bus/coco/meb_rtime.h13
-rw-r--r--src/devices/bus/coleco/cartridge/activision.cpp132
-rw-r--r--src/devices/bus/coleco/cartridge/activision.h65
-rw-r--r--src/devices/bus/coleco/cartridge/exp.cpp174
-rw-r--r--src/devices/bus/coleco/cartridge/exp.h114
-rw-r--r--src/devices/bus/coleco/cartridge/megacart.cpp97
-rw-r--r--src/devices/bus/coleco/cartridge/megacart.h49
-rw-r--r--src/devices/bus/coleco/cartridge/sgc.cpp206
-rw-r--r--src/devices/bus/coleco/cartridge/sgc.h83
-rw-r--r--src/devices/bus/coleco/cartridge/std.cpp61
-rw-r--r--src/devices/bus/coleco/cartridge/std.h43
-rw-r--r--src/devices/bus/coleco/cartridge/xin1.cpp75
-rw-r--r--src/devices/bus/coleco/cartridge/xin1.h47
-rw-r--r--src/devices/bus/coleco/controller/ctrl.cpp78
-rw-r--r--src/devices/bus/coleco/controller/ctrl.h89
-rw-r--r--src/devices/bus/coleco/controller/hand.cpp127
-rw-r--r--src/devices/bus/coleco/controller/hand.h53
-rw-r--r--src/devices/bus/coleco/controller/sac.cpp139
-rw-r--r--src/devices/bus/coleco/controller/sac.h54
-rw-r--r--src/devices/bus/coleco/expansion/cards.cpp18
-rw-r--r--src/devices/bus/coleco/expansion/cards.h16
-rw-r--r--src/devices/bus/coleco/expansion/expansion.cpp62
-rw-r--r--src/devices/bus/coleco/expansion/expansion.h123
-rw-r--r--src/devices/bus/coleco/expansion/sgm.cpp98
-rw-r--r--src/devices/bus/coleco/expansion/sgm.h48
-rw-r--r--src/devices/bus/compis/graphics.cpp71
-rw-r--r--src/devices/bus/compis/graphics.h94
-rw-r--r--src/devices/bus/compis/hrg.cpp211
-rw-r--r--src/devices/bus/compis/hrg.h84
-rw-r--r--src/devices/bus/compucolor/floppy.cpp257
-rw-r--r--src/devices/bus/compucolor/floppy.h115
-rw-r--r--src/devices/bus/comx35/clm.cpp254
-rw-r--r--src/devices/bus/comx35/clm.h63
-rw-r--r--src/devices/bus/comx35/eprom.cpp122
-rw-r--r--src/devices/bus/comx35/eprom.h55
-rw-r--r--src/devices/bus/comx35/exp.cpp199
-rw-r--r--src/devices/bus/comx35/exp.h121
-rw-r--r--src/devices/bus/comx35/expbox.cpp293
-rw-r--r--src/devices/bus/comx35/expbox.h77
-rw-r--r--src/devices/bus/comx35/fdc.cpp282
-rw-r--r--src/devices/bus/comx35/fdc.h68
-rw-r--r--src/devices/bus/comx35/joycard.cpp115
-rw-r--r--src/devices/bus/comx35/joycard.h52
-rw-r--r--src/devices/bus/comx35/printer.cpp184
-rw-r--r--src/devices/bus/comx35/printer.h58
-rw-r--r--src/devices/bus/comx35/ram.cpp104
-rw-r--r--src/devices/bus/comx35/ram.h52
-rw-r--r--src/devices/bus/comx35/thermal.cpp128
-rw-r--r--src/devices/bus/comx35/thermal.h53
-rw-r--r--src/devices/bus/cpc/amdrum.cpp65
-rw-r--r--src/devices/bus/cpc/amdrum.h50
-rw-r--r--src/devices/bus/cpc/brunword4.cpp112
-rw-r--r--src/devices/bus/cpc/brunword4.h43
-rw-r--r--src/devices/bus/cpc/cpc_pds.cpp70
-rw-r--r--src/devices/bus/cpc/cpc_pds.h59
-rw-r--r--src/devices/bus/cpc/cpc_rom.cpp128
-rw-r--r--src/devices/bus/cpc/cpc_rom.h78
-rw-r--r--src/devices/bus/cpc/cpc_rs232.cpp156
-rw-r--r--src/devices/bus/cpc/cpc_rs232.h67
-rw-r--r--src/devices/bus/cpc/cpc_ssa1.cpp180
-rw-r--r--src/devices/bus/cpc/cpc_ssa1.h107
-rw-r--r--src/devices/bus/cpc/cpcexp.cpp92
-rw-r--r--src/devices/bus/cpc/cpcexp.h146
-rw-r--r--src/devices/bus/cpc/ddi1.cpp159
-rw-r--r--src/devices/bus/cpc/ddi1.h55
-rw-r--r--src/devices/bus/cpc/doubler.cpp69
-rw-r--r--src/devices/bus/cpc/doubler.h45
-rw-r--r--src/devices/bus/cpc/hd20.cpp124
-rw-r--r--src/devices/bus/cpc/hd20.h52
-rw-r--r--src/devices/bus/cpc/magicsound.cpp181
-rw-r--r--src/devices/bus/cpc/magicsound.h93
-rw-r--r--src/devices/bus/cpc/mface2.cpp343
-rw-r--r--src/devices/bus/cpc/mface2.h70
-rw-r--r--src/devices/bus/cpc/musicmachine.cpp124
-rw-r--r--src/devices/bus/cpc/musicmachine.h54
-rw-r--r--src/devices/bus/cpc/playcity.cpp159
-rw-r--r--src/devices/bus/cpc/playcity.h69
-rw-r--r--src/devices/bus/cpc/smartwatch.cpp75
-rw-r--r--src/devices/bus/cpc/smartwatch.h48
-rw-r--r--src/devices/bus/cpc/symbfac2.cpp268
-rw-r--r--src/devices/bus/cpc/symbfac2.h85
-rw-r--r--src/devices/bus/cpc/transtape.cpp138
-rw-r--r--src/devices/bus/cpc/transtape.h55
-rw-r--r--src/devices/bus/crvision/rom.cpp139
-rw-r--r--src/devices/bus/crvision/rom.h116
-rw-r--r--src/devices/bus/crvision/slot.cpp264
-rw-r--r--src/devices/bus/crvision/slot.h98
-rw-r--r--src/devices/bus/dmv/dmvbus.cpp379
-rw-r--r--src/devices/bus/dmv/dmvbus.h140
-rw-r--r--src/devices/bus/dmv/k012.cpp116
-rw-r--r--src/devices/bus/dmv/k012.h64
-rw-r--r--src/devices/bus/dmv/k210.cpp168
-rw-r--r--src/devices/bus/dmv/k210.h71
-rw-r--r--src/devices/bus/dmv/k220.cpp281
-rw-r--r--src/devices/bus/dmv/k220.h62
-rw-r--r--src/devices/bus/dmv/k230.cpp308
-rw-r--r--src/devices/bus/dmv/k230.h153
-rw-r--r--src/devices/bus/dmv/k233.cpp96
-rw-r--r--src/devices/bus/dmv/k233.h44
-rw-r--r--src/devices/bus/dmv/k801.cpp260
-rw-r--r--src/devices/bus/dmv/k801.h112
-rw-r--r--src/devices/bus/dmv/k803.cpp132
-rw-r--r--src/devices/bus/dmv/k803.h53
-rw-r--r--src/devices/bus/dmv/k806.cpp244
-rw-r--r--src/devices/bus/dmv/k806.h73
-rw-r--r--src/devices/bus/dmv/ram.cpp101
-rw-r--r--src/devices/bus/dmv/ram.h67
-rw-r--r--src/devices/bus/ecbbus/ecbbus.cpp199
-rw-r--r--src/devices/bus/ecbbus/ecbbus.h162
-rw-r--r--src/devices/bus/ecbbus/grip.cpp858
-rw-r--r--src/devices/bus/ecbbus/grip.h131
-rw-r--r--src/devices/bus/econet/e01.cpp674
-rw-r--r--src/devices/bus/econet/e01.h141
-rw-r--r--src/devices/bus/econet/econet.cpp284
-rw-r--r--src/devices/bus/econet/econet.h140
-rw-r--r--src/devices/bus/einstein/pipe/pipe.cpp128
-rw-r--r--src/devices/bus/einstein/pipe/pipe.h124
-rw-r--r--src/devices/bus/einstein/pipe/silicon_disc.cpp120
-rw-r--r--src/devices/bus/einstein/pipe/silicon_disc.h54
-rw-r--r--src/devices/bus/einstein/pipe/speculator.cpp204
-rw-r--r--src/devices/bus/einstein/pipe/speculator.h66
-rw-r--r--src/devices/bus/einstein/pipe/tk02.cpp232
-rw-r--r--src/devices/bus/einstein/pipe/tk02.h62
-rw-r--r--src/devices/bus/einstein/userport/mouse.cpp106
-rw-r--r--src/devices/bus/einstein/userport/mouse.h47
-rw-r--r--src/devices/bus/einstein/userport/speech.cpp89
-rw-r--r--src/devices/bus/einstein/userport/speech.h45
-rw-r--r--src/devices/bus/einstein/userport/userport.cpp115
-rw-r--r--src/devices/bus/einstein/userport/userport.h82
-rw-r--r--src/devices/bus/ekara/rom.cpp263
-rw-r--r--src/devices/bus/ekara/rom.h152
-rw-r--r--src/devices/bus/ekara/slot.cpp273
-rw-r--r--src/devices/bus/ekara/slot.h130
-rw-r--r--src/devices/bus/electron/cart/abr.cpp95
-rw-r--r--src/devices/bus/electron/cart/abr.h45
-rw-r--r--src/devices/bus/electron/cart/ap34.cpp166
-rw-r--r--src/devices/bus/electron/cart/ap34.h54
-rw-r--r--src/devices/bus/electron/cart/ap5.cpp174
-rw-r--r--src/devices/bus/electron/cart/ap5.h62
-rw-r--r--src/devices/bus/electron/cart/aqr.cpp88
-rw-r--r--src/devices/bus/electron/cart/aqr.h46
-rw-r--r--src/devices/bus/electron/cart/click.cpp167
-rw-r--r--src/devices/bus/electron/cart/click.h56
-rw-r--r--src/devices/bus/electron/cart/cumana.cpp193
-rw-r--r--src/devices/bus/electron/cart/cumana.h56
-rw-r--r--src/devices/bus/electron/cart/elksdp1.cpp228
-rw-r--r--src/devices/bus/electron/cart/elksdp1.h19
-rw-r--r--src/devices/bus/electron/cart/mgc.cpp105
-rw-r--r--src/devices/bus/electron/cart/mgc.h47
-rw-r--r--src/devices/bus/electron/cart/peg400.cpp178
-rw-r--r--src/devices/bus/electron/cart/peg400.h56
-rw-r--r--src/devices/bus/electron/cart/romp144.cpp160
-rw-r--r--src/devices/bus/electron/cart/romp144.h60
-rw-r--r--src/devices/bus/electron/cart/rs423.cpp97
-rw-r--r--src/devices/bus/electron/cart/rs423.h47
-rw-r--r--src/devices/bus/electron/cart/slot.cpp288
-rw-r--r--src/devices/bus/electron/cart/slot.h211
-rw-r--r--src/devices/bus/electron/cart/sndexp.cpp156
-rw-r--r--src/devices/bus/electron/cart/sndexp.h52
-rw-r--r--src/devices/bus/electron/cart/sndexp3.cpp113
-rw-r--r--src/devices/bus/electron/cart/sndexp3.h50
-rw-r--r--src/devices/bus/electron/cart/sp64.cpp111
-rw-r--r--src/devices/bus/electron/cart/sp64.h46
-rw-r--r--src/devices/bus/electron/cart/std.cpp56
-rw-r--r--src/devices/bus/electron/cart/std.h40
-rw-r--r--src/devices/bus/electron/cart/stlefs.cpp165
-rw-r--r--src/devices/bus/electron/cart/stlefs.h59
-rw-r--r--src/devices/bus/electron/cart/tube.cpp91
-rw-r--r--src/devices/bus/electron/cart/tube.h47
-rw-r--r--src/devices/bus/electron/elksd128.cpp333
-rw-r--r--src/devices/bus/electron/elksd128.h19
-rw-r--r--src/devices/bus/electron/elksd64.cpp201
-rw-r--r--src/devices/bus/electron/elksd64.h19
-rw-r--r--src/devices/bus/electron/exp.cpp136
-rw-r--r--src/devices/bus/electron/exp.h156
-rw-r--r--src/devices/bus/electron/fbjoy.cpp74
-rw-r--r--src/devices/bus/electron/fbjoy.h14
-rw-r--r--src/devices/bus/electron/fbprint.cpp90
-rw-r--r--src/devices/bus/electron/fbprint.h50
-rw-r--r--src/devices/bus/electron/m2105.cpp271
-rw-r--r--src/devices/bus/electron/m2105.h62
-rw-r--r--src/devices/bus/electron/mc68k.cpp246
-rw-r--r--src/devices/bus/electron/mc68k.h62
-rw-r--r--src/devices/bus/electron/mode7.cpp235
-rw-r--r--src/devices/bus/electron/mode7.h66
-rw-r--r--src/devices/bus/electron/plus1.cpp511
-rw-r--r--src/devices/bus/electron/plus1.h114
-rw-r--r--src/devices/bus/electron/plus2.cpp244
-rw-r--r--src/devices/bus/electron/plus2.h64
-rw-r--r--src/devices/bus/electron/plus3.cpp199
-rw-r--r--src/devices/bus/electron/plus3.h58
-rw-r--r--src/devices/bus/electron/pwrjoy.cpp115
-rw-r--r--src/devices/bus/electron/pwrjoy.h14
-rw-r--r--src/devices/bus/electron/rombox.cpp198
-rw-r--r--src/devices/bus/electron/rombox.h65
-rw-r--r--src/devices/bus/electron/romboxp.cpp341
-rw-r--r--src/devices/bus/electron/romboxp.h73
-rw-r--r--src/devices/bus/electron/sidewndr.cpp185
-rw-r--r--src/devices/bus/electron/sidewndr.h14
-rw-r--r--src/devices/bus/electron/voxbox.cpp100
-rw-r--r--src/devices/bus/electron/voxbox.h54
-rw-r--r--src/devices/bus/ep64/exdos.cpp233
-rw-r--r--src/devices/bus/ep64/exdos.h59
-rw-r--r--src/devices/bus/ep64/exp.cpp80
-rw-r--r--src/devices/bus/ep64/exp.h119
-rw-r--r--src/devices/bus/epson_qx/cqgmem.cpp135
-rw-r--r--src/devices/bus/epson_qx/cqgmem.h59
-rw-r--r--src/devices/bus/epson_qx/cr1510.cpp62
-rw-r--r--src/devices/bus/epson_qx/cr1510.h50
-rw-r--r--src/devices/bus/epson_qx/ide.cpp110
-rw-r--r--src/devices/bus/epson_qx/ide.h61
-rw-r--r--src/devices/bus/epson_qx/keyboard/keyboard.cpp205
-rw-r--r--src/devices/bus/epson_qx/keyboard/keyboard.h111
-rw-r--r--src/devices/bus/epson_qx/keyboard/matrix.cpp300
-rw-r--r--src/devices/bus/epson_qx/keyboard/matrix.h22
-rw-r--r--src/devices/bus/epson_qx/multifont.cpp289
-rw-r--r--src/devices/bus/epson_qx/multifont.h87
-rw-r--r--src/devices/bus/epson_qx/option.cpp206
-rw-r--r--src/devices/bus/epson_qx/option.h277
-rw-r--r--src/devices/bus/epson_qx/semidisk.cpp148
-rw-r--r--src/devices/bus/epson_qx/semidisk.h65
-rw-r--r--src/devices/bus/epson_qx/sound_card.cpp125
-rw-r--r--src/devices/bus/epson_qx/sound_card.h61
-rw-r--r--src/devices/bus/epson_sio/epson_sio.cpp107
-rw-r--r--src/devices/bus/epson_sio/epson_sio.h81
-rw-r--r--src/devices/bus/epson_sio/pf10.cpp233
-rw-r--r--src/devices/bus/epson_sio/pf10.h104
-rw-r--r--src/devices/bus/epson_sio/tf20.cpp320
-rw-r--r--src/devices/bus/epson_sio/tf20.h95
-rw-r--r--src/devices/bus/fmt_scsi/fmt121.cpp150
-rw-r--r--src/devices/bus/fmt_scsi/fmt121.h50
-rw-r--r--src/devices/bus/fmt_scsi/fmt_scsi.cpp156
-rw-r--r--src/devices/bus/fmt_scsi/fmt_scsi.h95
-rw-r--r--src/devices/bus/fp1000/fp1000_exp.cpp114
-rw-r--r--src/devices/bus/fp1000/fp1000_exp.h98
-rw-r--r--src/devices/bus/fp1000/fp1020fd.cpp94
-rw-r--r--src/devices/bus/fp1000/fp1020fd.h42
-rw-r--r--src/devices/bus/fp1000/fp1030_rampack.cpp50
-rw-r--r--src/devices/bus/fp1000/fp1030_rampack.h34
-rw-r--r--src/devices/bus/fp1000/fp1060io.cpp95
-rw-r--r--src/devices/bus/fp1000/fp1060io.h38
-rw-r--r--src/devices/bus/fp1000/fp1060io_exp.cpp98
-rw-r--r--src/devices/bus/fp1000/fp1060io_exp.h83
-rw-r--r--src/devices/bus/gamate/gamate_protection.cpp117
-rw-r--r--src/devices/bus/gamate/gamate_protection.h38
-rw-r--r--src/devices/bus/gamate/rom.cpp186
-rw-r--r--src/devices/bus/gamate/rom.h86
-rw-r--r--src/devices/bus/gamate/slot.cpp241
-rw-r--r--src/devices/bus/gamate/slot.h99
-rw-r--r--src/devices/bus/gameboy/camera.cpp620
-rw-r--r--src/devices/bus/gameboy/camera.h18
-rw-r--r--src/devices/bus/gameboy/cartbase.cpp537
-rw-r--r--src/devices/bus/gameboy/cartbase.h275
-rw-r--r--src/devices/bus/gameboy/cartbase.ipp406
-rw-r--r--src/devices/bus/gameboy/cartheader.h132
-rw-r--r--src/devices/bus/gameboy/carts.cpp122
-rw-r--r--src/devices/bus/gameboy/carts.h61
-rw-r--r--src/devices/bus/gameboy/gbck003.cpp264
-rw-r--r--src/devices/bus/gameboy/gbck003.h18
-rw-r--r--src/devices/bus/gameboy/gbslot.cpp1360
-rw-r--r--src/devices/bus/gameboy/gbslot.h84
-rw-r--r--src/devices/bus/gameboy/gbxfile.cpp59
-rw-r--r--src/devices/bus/gameboy/gbxfile.h130
-rw-r--r--src/devices/bus/gameboy/huc1.cpp192
-rw-r--r--src/devices/bus/gameboy/huc1.h18
-rw-r--r--src/devices/bus/gameboy/huc3.cpp698
-rw-r--r--src/devices/bus/gameboy/huc3.h18
-rw-r--r--src/devices/bus/gameboy/liebao.cpp159
-rw-r--r--src/devices/bus/gameboy/liebao.h18
-rw-r--r--src/devices/bus/gameboy/mbc.cpp1566
-rw-r--r--src/devices/bus/gameboy/mbc.h21
-rw-r--r--src/devices/bus/gameboy/mbc2.cpp225
-rw-r--r--src/devices/bus/gameboy/mbc2.h18
-rw-r--r--src/devices/bus/gameboy/mbc3.cpp854
-rw-r--r--src/devices/bus/gameboy/mbc3.h20
-rw-r--r--src/devices/bus/gameboy/mbc6.cpp529
-rw-r--r--src/devices/bus/gameboy/mbc6.h18
-rw-r--r--src/devices/bus/gameboy/mbc7.cpp379
-rw-r--r--src/devices/bus/gameboy/mbc7.h19
-rw-r--r--src/devices/bus/gameboy/mdslot.cpp141
-rw-r--r--src/devices/bus/gameboy/mdslot.h67
-rw-r--r--src/devices/bus/gameboy/mmm01.cpp349
-rw-r--r--src/devices/bus/gameboy/mmm01.h16
-rw-r--r--src/devices/bus/gameboy/ntnew.cpp179
-rw-r--r--src/devices/bus/gameboy/ntnew.h18
-rw-r--r--src/devices/bus/gameboy/rom.cpp1144
-rw-r--r--src/devices/bus/gameboy/rom.h22
-rw-r--r--src/devices/bus/gameboy/slmulti.cpp417
-rw-r--r--src/devices/bus/gameboy/slmulti.h18
-rw-r--r--src/devices/bus/gameboy/slot.cpp88
-rw-r--r--src/devices/bus/gameboy/slot.h92
-rw-r--r--src/devices/bus/gameboy/tama5.cpp269
-rw-r--r--src/devices/bus/gameboy/tama5.h11
-rw-r--r--src/devices/bus/gba/gba_slot.cpp940
-rw-r--r--src/devices/bus/gba/gba_slot.h163
-rw-r--r--src/devices/bus/gba/rom.cpp1097
-rw-r--r--src/devices/bus/gba/rom.h403
-rw-r--r--src/devices/bus/generic/carts.cpp32
-rw-r--r--src/devices/bus/generic/carts.h19
-rw-r--r--src/devices/bus/generic/ram.cpp123
-rw-r--r--src/devices/bus/generic/ram.h111
-rw-r--r--src/devices/bus/generic/rom.cpp121
-rw-r--r--src/devices/bus/generic/rom.h78
-rw-r--r--src/devices/bus/generic/slot.cpp309
-rw-r--r--src/devices/bus/generic/slot.h302
-rw-r--r--src/devices/bus/gio64/gio64.cpp133
-rw-r--r--src/devices/bus/gio64/gio64.h130
-rw-r--r--src/devices/bus/gio64/newport.cpp4510
-rw-r--r--src/devices/bus/gio64/newport.h550
-rw-r--r--src/devices/bus/heathzenith/h19/tlb.cpp2177
-rw-r--r--src/devices/bus/heathzenith/h19/tlb.h477
-rw-r--r--src/devices/bus/heathzenith/h8/cards.cpp50
-rw-r--r--src/devices/bus/heathzenith/h8/cards.h19
-rw-r--r--src/devices/bus/heathzenith/h8/cpu8080.cpp378
-rw-r--r--src/devices/bus/heathzenith/h8/cpu8080.h12
-rw-r--r--src/devices/bus/heathzenith/h8/front_panel.cpp364
-rw-r--r--src/devices/bus/heathzenith/h8/front_panel.h12
-rw-r--r--src/devices/bus/heathzenith/h8/h8bus.cpp375
-rw-r--r--src/devices/bus/heathzenith/h8/h8bus.h399
-rw-r--r--src/devices/bus/heathzenith/h8/h_8_1.cpp85
-rw-r--r--src/devices/bus/heathzenith/h8/h_8_1.h12
-rw-r--r--src/devices/bus/heathzenith/h8/h_8_5.cpp238
-rw-r--r--src/devices/bus/heathzenith/h8/h_8_5.h12
-rw-r--r--src/devices/bus/heathzenith/h8/ha_8_6.cpp533
-rw-r--r--src/devices/bus/heathzenith/h8/ha_8_6.h12
-rw-r--r--src/devices/bus/heathzenith/h8/ha_8_8.cpp157
-rw-r--r--src/devices/bus/heathzenith/h8/ha_8_8.h12
-rw-r--r--src/devices/bus/heathzenith/h8/wh_8_16.cpp117
-rw-r--r--src/devices/bus/heathzenith/h8/wh_8_16.h12
-rw-r--r--src/devices/bus/heathzenith/h8/wh_8_64.cpp248
-rw-r--r--src/devices/bus/heathzenith/h8/wh_8_64.h12
-rw-r--r--src/devices/bus/heathzenith/h89/cdr_fdc_880h.cpp415
-rw-r--r--src/devices/bus/heathzenith/h89/cdr_fdc_880h.h18
-rw-r--r--src/devices/bus/heathzenith/h89/h17_fdc.cpp385
-rw-r--r--src/devices/bus/heathzenith/h89/h17_fdc.h26
-rw-r--r--src/devices/bus/heathzenith/h89/h89bus.cpp566
-rw-r--r--src/devices/bus/heathzenith/h89/h89bus.h495
-rw-r--r--src/devices/bus/heathzenith/h89/h_88_3.cpp359
-rw-r--r--src/devices/bus/heathzenith/h89/h_88_3.h13
-rw-r--r--src/devices/bus/heathzenith/h89/h_88_5.cpp209
-rw-r--r--src/devices/bus/heathzenith/h89/h_88_5.h12
-rw-r--r--src/devices/bus/heathzenith/h89/mms77316_fdc.cpp355
-rw-r--r--src/devices/bus/heathzenith/h89/mms77316_fdc.h75
-rw-r--r--src/devices/bus/heathzenith/h89/sigmasoft_parallel_port.cpp206
-rw-r--r--src/devices/bus/heathzenith/h89/sigmasoft_parallel_port.h72
-rw-r--r--src/devices/bus/heathzenith/h89/sigmasoft_sound.cpp225
-rw-r--r--src/devices/bus/heathzenith/h89/sigmasoft_sound.h18
-rw-r--r--src/devices/bus/heathzenith/h89/we_pullup.cpp51
-rw-r--r--src/devices/bus/heathzenith/h89/we_pullup.h18
-rw-r--r--src/devices/bus/heathzenith/h89/z37_fdc.cpp268
-rw-r--r--src/devices/bus/heathzenith/h89/z37_fdc.h73
-rw-r--r--src/devices/bus/heathzenith/h89/z_89_11.cpp293
-rw-r--r--src/devices/bus/heathzenith/h89/z_89_11.h19
-rw-r--r--src/devices/bus/heathzenith/intr_cntrl/intr_cntrl.cpp278
-rw-r--r--src/devices/bus/heathzenith/intr_cntrl/intr_cntrl.h165
-rw-r--r--src/devices/bus/hexbus/hexbus.cpp436
-rw-r--r--src/devices/bus/hexbus/hexbus.h177
-rw-r--r--src/devices/bus/hexbus/hx5102.cpp765
-rw-r--r--src/devices/bus/hexbus/hx5102.h130
-rw-r--r--src/devices/bus/hexbus/tp0370.cpp359
-rw-r--r--src/devices/bus/hexbus/tp0370.h75
-rw-r--r--src/devices/bus/hp80_io/82900.cpp174
-rw-r--r--src/devices/bus/hp80_io/82900.h67
-rw-r--r--src/devices/bus/hp80_io/82937.cpp358
-rw-r--r--src/devices/bus/hp80_io/82937.h73
-rw-r--r--src/devices/bus/hp80_io/82939.cpp227
-rw-r--r--src/devices/bus/hp80_io/82939.h60
-rw-r--r--src/devices/bus/hp80_io/hp80_io.cpp153
-rw-r--r--src/devices/bus/hp80_io/hp80_io.h98
-rw-r--r--src/devices/bus/hp9845_io/98032.cpp575
-rw-r--r--src/devices/bus/hp9845_io/98032.h194
-rw-r--r--src/devices/bus/hp9845_io/98034.cpp412
-rw-r--r--src/devices/bus/hp9845_io/98034.h90
-rw-r--r--src/devices/bus/hp9845_io/98035.cpp768
-rw-r--r--src/devices/bus/hp9845_io/98035.h128
-rw-r--r--src/devices/bus/hp9845_io/98036.cpp505
-rw-r--r--src/devices/bus/hp9845_io/98036.h96
-rw-r--r--src/devices/bus/hp9845_io/98046.cpp665
-rw-r--r--src/devices/bus/hp9845_io/98046.h108
-rw-r--r--src/devices/bus/hp9845_io/hp9845_io.cpp202
-rw-r--r--src/devices/bus/hp9845_io/hp9845_io.h118
-rw-r--r--src/devices/bus/hp9845_io/hp9871.cpp116
-rw-r--r--src/devices/bus/hp9845_io/hp9871.h54
-rw-r--r--src/devices/bus/hp9845_io/hp9885.cpp1099
-rw-r--r--src/devices/bus/hp9845_io/hp9885.h145
-rw-r--r--src/devices/bus/hp_dio/hp98259.cpp329
-rw-r--r--src/devices/bus/hp_dio/hp98259.h19
-rw-r--r--src/devices/bus/hp_dio/hp98265a.cpp338
-rw-r--r--src/devices/bus/hp_dio/hp98265a.h13
-rw-r--r--src/devices/bus/hp_dio/hp98543.cpp307
-rw-r--r--src/devices/bus/hp_dio/hp98543.h14
-rw-r--r--src/devices/bus/hp_dio/hp98544.cpp229
-rw-r--r--src/devices/bus/hp_dio/hp98544.h12
-rw-r--r--src/devices/bus/hp_dio/hp98550.cpp289
-rw-r--r--src/devices/bus/hp_dio/hp98550.h13
-rw-r--r--src/devices/bus/hp_dio/hp98603a.cpp108
-rw-r--r--src/devices/bus/hp_dio/hp98603a.h13
-rw-r--r--src/devices/bus/hp_dio/hp98603b.cpp103
-rw-r--r--src/devices/bus/hp_dio/hp98603b.h13
-rw-r--r--src/devices/bus/hp_dio/hp98620.cpp486
-rw-r--r--src/devices/bus/hp_dio/hp98620.h13
-rw-r--r--src/devices/bus/hp_dio/hp98624.cpp340
-rw-r--r--src/devices/bus/hp_dio/hp98624.h13
-rw-r--r--src/devices/bus/hp_dio/hp98628_9.cpp1152
-rw-r--r--src/devices/bus/hp_dio/hp98628_9.h21
-rw-r--r--src/devices/bus/hp_dio/hp98643.cpp288
-rw-r--r--src/devices/bus/hp_dio/hp98643.h14
-rw-r--r--src/devices/bus/hp_dio/hp98644.cpp276
-rw-r--r--src/devices/bus/hp_dio/hp98644.h14
-rw-r--r--src/devices/bus/hp_dio/hp_dio.cpp376
-rw-r--r--src/devices/bus/hp_dio/hp_dio.h286
-rw-r--r--src/devices/bus/hp_dio/human_interface.cpp390
-rw-r--r--src/devices/bus/hp_dio/human_interface.h105
-rw-r--r--src/devices/bus/hp_hil/hil_devices.cpp15
-rw-r--r--src/devices/bus/hp_hil/hil_devices.h25
-rw-r--r--src/devices/bus/hp_hil/hlebase.cpp161
-rw-r--r--src/devices/bus/hp_hil/hlebase.h44
-rw-r--r--src/devices/bus/hp_hil/hlekbd.cpp613
-rw-r--r--src/devices/bus/hp_hil/hlekbd.h73
-rw-r--r--src/devices/bus/hp_hil/hlemouse.cpp129
-rw-r--r--src/devices/bus/hp_hil/hlemouse.h50
-rw-r--r--src/devices/bus/hp_hil/hp_hil.cpp271
-rw-r--r--src/devices/bus/hp_hil/hp_hil.h188
-rw-r--r--src/devices/bus/hp_ipc_io/82919.cpp251
-rw-r--r--src/devices/bus/hp_ipc_io/82919.h73
-rw-r--r--src/devices/bus/hp_ipc_io/hp_ipc_io.cpp86
-rw-r--r--src/devices/bus/hp_ipc_io/hp_ipc_io.h73
-rw-r--r--src/devices/bus/idpartner/bus.cpp87
-rw-r--r--src/devices/bus/idpartner/bus.h138
-rw-r--r--src/devices/bus/idpartner/gdp.cpp239
-rw-r--r--src/devices/bus/idpartner/gdp.h12
-rw-r--r--src/devices/bus/idpartner/sasi.cpp180
-rw-r--r--src/devices/bus/idpartner/sasi.h12
-rw-r--r--src/devices/bus/ieee488/c2031.cpp544
-rw-r--r--src/devices/bus/ieee488/c2031.h21
-rw-r--r--src/devices/bus/ieee488/c2040.cpp754
-rw-r--r--src/devices/bus/ieee488/c2040.h23
-rw-r--r--src/devices/bus/ieee488/c2040fdc.cpp630
-rw-r--r--src/devices/bus/ieee488/c2040fdc.h147
-rw-r--r--src/devices/bus/ieee488/c8050.cpp897
-rw-r--r--src/devices/bus/ieee488/c8050.h24
-rw-r--r--src/devices/bus/ieee488/c8050fdc.cpp628
-rw-r--r--src/devices/bus/ieee488/c8050fdc.h148
-rw-r--r--src/devices/bus/ieee488/c8280.cpp601
-rw-r--r--src/devices/bus/ieee488/c8280.h21
-rw-r--r--src/devices/bus/ieee488/d9060.cpp674
-rw-r--r--src/devices/bus/ieee488/d9060.h22
-rw-r--r--src/devices/bus/ieee488/grid2102.cpp519
-rw-r--r--src/devices/bus/ieee488/grid2102.h21
-rw-r--r--src/devices/bus/ieee488/hardbox.cpp456
-rw-r--r--src/devices/bus/ieee488/hardbox.h20
-rw-r--r--src/devices/bus/ieee488/hp9122c.cpp517
-rw-r--r--src/devices/bus/ieee488/hp9122c.h20
-rw-r--r--src/devices/bus/ieee488/hp9133.cpp879
-rw-r--r--src/devices/bus/ieee488/hp9133.h18
-rw-r--r--src/devices/bus/ieee488/hp9895.cpp1027
-rw-r--r--src/devices/bus/ieee488/hp9895.h21
-rw-r--r--src/devices/bus/ieee488/ieee488.cpp459
-rw-r--r--src/devices/bus/ieee488/ieee488.h239
-rw-r--r--src/devices/bus/ieee488/remote488.cpp923
-rw-r--r--src/devices/bus/ieee488/remote488.h18
-rw-r--r--src/devices/bus/ieee488/shark.cpp170
-rw-r--r--src/devices/bus/ieee488/shark.h22
-rw-r--r--src/devices/bus/ieee488/softbox.cpp448
-rw-r--r--src/devices/bus/ieee488/softbox.h21
-rw-r--r--src/devices/bus/imi7000/imi5000h.cpp471
-rw-r--r--src/devices/bus/imi7000/imi5000h.h89
-rw-r--r--src/devices/bus/imi7000/imi7000.cpp113
-rw-r--r--src/devices/bus/imi7000/imi7000.h108
-rw-r--r--src/devices/bus/intellec4/insdatastor.cpp376
-rw-r--r--src/devices/bus/intellec4/insdatastor.h12
-rw-r--r--src/devices/bus/intellec4/intellec4.cpp273
-rw-r--r--src/devices/bus/intellec4/intellec4.h255
-rw-r--r--src/devices/bus/intellec4/prommemory.cpp183
-rw-r--r--src/devices/bus/intellec4/prommemory.h12
-rw-r--r--src/devices/bus/intellec4/tapereader.cpp131
-rw-r--r--src/devices/bus/intellec4/tapereader.h12
-rw-r--r--src/devices/bus/interpro/keyboard/hle.cpp456
-rw-r--r--src/devices/bus/interpro/keyboard/hle.h121
-rw-r--r--src/devices/bus/interpro/keyboard/keyboard.cpp48
-rw-r--r--src/devices/bus/interpro/keyboard/keyboard.h60
-rw-r--r--src/devices/bus/interpro/keyboard/lle.cpp612
-rw-r--r--src/devices/bus/interpro/keyboard/lle.h73
-rw-r--r--src/devices/bus/interpro/mouse/mouse.cpp121
-rw-r--r--src/devices/bus/interpro/mouse/mouse.h87
-rw-r--r--src/devices/bus/interpro/sr/edge.cpp902
-rw-r--r--src/devices/bus/interpro/sr/edge.h253
-rw-r--r--src/devices/bus/interpro/sr/gt.cpp1713
-rw-r--r--src/devices/bus/interpro/sr/gt.h386
-rw-r--r--src/devices/bus/interpro/sr/sr.cpp344
-rw-r--r--src/devices/bus/interpro/sr/sr.h260
-rw-r--r--src/devices/bus/interpro/sr/sr_cards.cpp41
-rw-r--r--src/devices/bus/interpro/sr/sr_cards.h13
-rw-r--r--src/devices/bus/intv/ecs.cpp242
-rw-r--r--src/devices/bus/intv/ecs.h84
-rw-r--r--src/devices/bus/intv/rom.cpp50
-rw-r--r--src/devices/bus/intv/rom.h86
-rw-r--r--src/devices/bus/intv/slot.cpp546
-rw-r--r--src/devices/bus/intv/slot.h183
-rw-r--r--src/devices/bus/intv/voice.cpp128
-rw-r--r--src/devices/bus/intv/voice.h68
-rw-r--r--src/devices/bus/intv_ctrl/ctrl.cpp88
-rw-r--r--src/devices/bus/intv_ctrl/ctrl.h69
-rw-r--r--src/devices/bus/intv_ctrl/ecs_ctrl.cpp424
-rw-r--r--src/devices/bus/intv_ctrl/ecs_ctrl.h163
-rw-r--r--src/devices/bus/intv_ctrl/handctrl.cpp179
-rw-r--r--src/devices/bus/intv_ctrl/handctrl.h54
-rw-r--r--src/devices/bus/iq151/disc2.cpp128
-rw-r--r--src/devices/bus/iq151/disc2.h52
-rw-r--r--src/devices/bus/iq151/grafik.cpp186
-rw-r--r--src/devices/bus/iq151/grafik.h61
-rw-r--r--src/devices/bus/iq151/iq151.cpp180
-rw-r--r--src/devices/bus/iq151/iq151.h144
-rw-r--r--src/devices/bus/iq151/minigraf.cpp169
-rw-r--r--src/devices/bus/iq151/minigraf.h55
-rw-r--r--src/devices/bus/iq151/ms151a.cpp169
-rw-r--r--src/devices/bus/iq151/ms151a.h55
-rw-r--r--src/devices/bus/iq151/rom.cpp229
-rw-r--r--src/devices/bus/iq151/rom.h129
-rw-r--r--src/devices/bus/iq151/staper.cpp145
-rw-r--r--src/devices/bus/iq151/staper.h57
-rw-r--r--src/devices/bus/iq151/video32.cpp153
-rw-r--r--src/devices/bus/iq151/video32.h47
-rw-r--r--src/devices/bus/iq151/video64.cpp161
-rw-r--r--src/devices/bus/iq151/video64.h48
-rw-r--r--src/devices/bus/isa/3c503.cpp299
-rw-r--r--src/devices/bus/isa/3c503.h65
-rw-r--r--src/devices/bus/isa/3c505.cpp726
-rw-r--r--src/devices/bus/isa/3c505.h160
-rw-r--r--src/devices/bus/isa/3xtwin.cpp95
-rw-r--r--src/devices/bus/isa/3xtwin.h40
-rw-r--r--src/devices/bus/isa/5080pa.cpp196
-rw-r--r--src/devices/bus/isa/5080pa.h13
-rw-r--r--src/devices/bus/isa/acb2072.cpp118
-rw-r--r--src/devices/bus/isa/acb2072.h38
-rw-r--r--src/devices/bus/isa/adlib.cpp64
-rw-r--r--src/devices/bus/isa/adlib.h42
-rw-r--r--src/devices/bus/isa/aga.cpp950
-rw-r--r--src/devices/bus/isa/aga.h129
-rw-r--r--src/devices/bus/isa/aha1542b.cpp480
-rw-r--r--src/devices/bus/isa/aha1542b.h81
-rw-r--r--src/devices/bus/isa/aha1542c.cpp396
-rw-r--r--src/devices/bus/isa/aha1542c.h97
-rw-r--r--src/devices/bus/isa/aha174x.cpp179
-rw-r--r--src/devices/bus/isa/aha174x.h64
-rw-r--r--src/devices/bus/isa/amgda.cpp468
-rw-r--r--src/devices/bus/isa/amgda.h13
-rw-r--r--src/devices/bus/isa/asc88.cpp180
-rw-r--r--src/devices/bus/isa/asc88.h54
-rw-r--r--src/devices/bus/isa/bblue2.cpp253
-rw-r--r--src/devices/bus/isa/bblue2.h68
-rw-r--r--src/devices/bus/isa/bt54x.cpp173
-rw-r--r--src/devices/bus/isa/bt54x.h72
-rw-r--r--src/devices/bus/isa/cga.cpp1990
-rw-r--r--src/devices/bus/isa/cga.h320
-rw-r--r--src/devices/bus/isa/chessmdr.cpp126
-rw-r--r--src/devices/bus/isa/chessmdr.h46
-rw-r--r--src/devices/bus/isa/chessmsr.cpp191
-rw-r--r--src/devices/bus/isa/chessmsr.h55
-rw-r--r--src/devices/bus/isa/cl_sh260.cpp92
-rw-r--r--src/devices/bus/isa/cl_sh260.h64
-rw-r--r--src/devices/bus/isa/com.cpp209
-rw-r--r--src/devices/bus/isa/com.h14
-rw-r--r--src/devices/bus/isa/dcb.cpp70
-rw-r--r--src/devices/bus/isa/dcb.h43
-rw-r--r--src/devices/bus/isa/dectalk.cpp229
-rw-r--r--src/devices/bus/isa/dectalk.h65
-rw-r--r--src/devices/bus/isa/ega.cpp1430
-rw-r--r--src/devices/bus/isa/ega.h118
-rw-r--r--src/devices/bus/isa/eis_hgb107x.cpp603
-rw-r--r--src/devices/bus/isa/eis_hgb107x.h112
-rw-r--r--src/devices/bus/isa/eis_sad8852.cpp244
-rw-r--r--src/devices/bus/isa/eis_sad8852.h47
-rw-r--r--src/devices/bus/isa/eis_twib.cpp259
-rw-r--r--src/devices/bus/isa/eis_twib.h52
-rw-r--r--src/devices/bus/isa/ex1280.cpp216
-rw-r--r--src/devices/bus/isa/ex1280.h62
-rw-r--r--src/devices/bus/isa/fdc.cpp431
-rw-r--r--src/devices/bus/isa/fdc.h160
-rw-r--r--src/devices/bus/isa/finalchs.cpp165
-rw-r--r--src/devices/bus/isa/finalchs.h53
-rw-r--r--src/devices/bus/isa/gblaster.cpp117
-rw-r--r--src/devices/bus/isa/gblaster.h50
-rw-r--r--src/devices/bus/isa/gus.cpp1715
-rw-r--r--src/devices/bus/isa/gus.h279
-rw-r--r--src/devices/bus/isa/hdc.cpp1089
-rw-r--r--src/devices/bus/isa/hdc.h191
-rw-r--r--src/devices/bus/isa/hpblp.cpp548
-rw-r--r--src/devices/bus/isa/hpblp.h97
-rw-r--r--src/devices/bus/isa/ibm_mfc.cpp478
-rw-r--r--src/devices/bus/isa/ibm_mfc.h92
-rw-r--r--src/devices/bus/isa/ibm_speech.cpp466
-rw-r--r--src/devices/bus/isa/ibm_speech.h83
-rw-r--r--src/devices/bus/isa/ide.cpp133
-rw-r--r--src/devices/bus/isa/ide.h53
-rw-r--r--src/devices/bus/isa/isa.cpp670
-rw-r--r--src/devices/bus/isa/isa.h382
-rw-r--r--src/devices/bus/isa/isa_cards.cpp248
-rw-r--r--src/devices/bus/isa/isa_cards.h19
-rw-r--r--src/devices/bus/isa/lbaenhancer.cpp151
-rw-r--r--src/devices/bus/isa/lbaenhancer.h44
-rw-r--r--src/devices/bus/isa/lpt.cpp61
-rw-r--r--src/devices/bus/isa/lpt.h51
-rw-r--r--src/devices/bus/isa/lrk330.cpp130
-rw-r--r--src/devices/bus/isa/lrk330.h38
-rw-r--r--src/devices/bus/isa/mc1502_fdc.cpp222
-rw-r--r--src/devices/bus/isa/mc1502_fdc.h67
-rw-r--r--src/devices/bus/isa/mc1502_rom.cpp72
-rw-r--r--src/devices/bus/isa/mc1502_rom.h41
-rw-r--r--src/devices/bus/isa/mcd.cpp381
-rw-r--r--src/devices/bus/isa/mcd.h121
-rw-r--r--src/devices/bus/isa/mda.cpp657
-rw-r--r--src/devices/bus/isa/mda.h14
-rw-r--r--src/devices/bus/isa/mpu401.cpp98
-rw-r--r--src/devices/bus/isa/mpu401.h45
-rw-r--r--src/devices/bus/isa/mufdc.cpp206
-rw-r--r--src/devices/bus/isa/mufdc.h86
-rw-r--r--src/devices/bus/isa/myb3k_com.cpp529
-rw-r--r--src/devices/bus/isa/myb3k_com.h82
-rw-r--r--src/devices/bus/isa/myb3k_fdc.cpp304
-rw-r--r--src/devices/bus/isa/myb3k_fdc.h117
-rw-r--r--src/devices/bus/isa/ncr53c400.cpp235
-rw-r--r--src/devices/bus/isa/ncr53c400.h59
-rw-r--r--src/devices/bus/isa/ne1000.cpp132
-rw-r--r--src/devices/bus/isa/ne1000.h42
-rw-r--r--src/devices/bus/isa/ne2000.cpp142
-rw-r--r--src/devices/bus/isa/ne2000.h40
-rw-r--r--src/devices/bus/isa/np600.cpp123
-rw-r--r--src/devices/bus/isa/np600.h47
-rw-r--r--src/devices/bus/isa/num9rev.cpp318
-rw-r--r--src/devices/bus/isa/num9rev.h68
-rw-r--r--src/devices/bus/isa/omti8621.cpp1494
-rw-r--r--src/devices/bus/isa/omti8621.h184
-rw-r--r--src/devices/bus/isa/opus100pm.cpp351
-rw-r--r--src/devices/bus/isa/opus100pm.h71
-rw-r--r--src/devices/bus/isa/p1_fdc.cpp182
-rw-r--r--src/devices/bus/isa/p1_fdc.h62
-rw-r--r--src/devices/bus/isa/p1_hdc.cpp139
-rw-r--r--src/devices/bus/isa/p1_hdc.h54
-rw-r--r--src/devices/bus/isa/p1_rom.cpp77
-rw-r--r--src/devices/bus/isa/p1_rom.h41
-rw-r--r--src/devices/bus/isa/p1_sound.cpp193
-rw-r--r--src/devices/bus/isa/p1_sound.h70
-rw-r--r--src/devices/bus/isa/pc1640_iga.cpp108
-rw-r--r--src/devices/bus/isa/pc1640_iga.h44
-rw-r--r--src/devices/bus/isa/pcat512me.cpp117
-rw-r--r--src/devices/bus/isa/pcat512me.h13
-rw-r--r--src/devices/bus/isa/pcmidi.cpp262
-rw-r--r--src/devices/bus/isa/pcmidi.h47
-rw-r--r--src/devices/bus/isa/pds.cpp62
-rw-r--r--src/devices/bus/isa/pds.h39
-rw-r--r--src/devices/bus/isa/pgc.cpp412
-rw-r--r--src/devices/bus/isa/pgc.h76
-rw-r--r--src/devices/bus/isa/prose4k1.cpp92
-rw-r--r--src/devices/bus/isa/prose4k1.h13
-rw-r--r--src/devices/bus/isa/sb16.cpp944
-rw-r--r--src/devices/bus/isa/sb16.h130
-rw-r--r--src/devices/bus/isa/sblaster.cpp1865
-rw-r--r--src/devices/bus/isa/sblaster.h256
-rw-r--r--src/devices/bus/isa/sc499.cpp1326
-rw-r--r--src/devices/bus/isa/sc499.h154
-rw-r--r--src/devices/bus/isa/side116.cpp187
-rw-r--r--src/devices/bus/isa/side116.h57
-rw-r--r--src/devices/bus/isa/ssi2001.cpp38
-rw-r--r--src/devices/bus/isa/ssi2001.h41
-rw-r--r--src/devices/bus/isa/stereo_fx.cpp238
-rw-r--r--src/devices/bus/isa/stereo_fx.h84
-rw-r--r--src/devices/bus/isa/svga_cirrus.cpp449
-rw-r--r--src/devices/bus/isa/svga_cirrus.h98
-rw-r--r--src/devices/bus/isa/svga_paradise.cpp775
-rw-r--r--src/devices/bus/isa/svga_paradise.h278
-rw-r--r--src/devices/bus/isa/svga_s3.cpp135
-rw-r--r--src/devices/bus/isa/svga_s3.h47
-rw-r--r--src/devices/bus/isa/svga_trident.cpp184
-rw-r--r--src/devices/bus/isa/svga_trident.h77
-rw-r--r--src/devices/bus/isa/svga_tseng.cpp220
-rw-r--r--src/devices/bus/isa/svga_tseng.h91
-rw-r--r--src/devices/bus/isa/tekram_dc820.cpp345
-rw-r--r--src/devices/bus/isa/tekram_dc820.h112
-rw-r--r--src/devices/bus/isa/tiga_spea.cpp80
-rw-r--r--src/devices/bus/isa/tiga_spea.h44
-rw-r--r--src/devices/bus/isa/ubpnic.cpp522
-rw-r--r--src/devices/bus/isa/ubpnic.h13
-rw-r--r--src/devices/bus/isa/ultra12f.cpp129
-rw-r--r--src/devices/bus/isa/ultra12f.h53
-rw-r--r--src/devices/bus/isa/ultra14f.cpp77
-rw-r--r--src/devices/bus/isa/ultra14f.h40
-rw-r--r--src/devices/bus/isa/ultra24f.cpp105
-rw-r--r--src/devices/bus/isa/ultra24f.h45
-rw-r--r--src/devices/bus/isa/vga.cpp102
-rw-r--r--src/devices/bus/isa/vga.h47
-rw-r--r--src/devices/bus/isa/vga_ati.cpp412
-rw-r--r--src/devices/bus/isa/vga_ati.h112
-rw-r--r--src/devices/bus/isa/wd1002a_wx1.cpp71
-rw-r--r--src/devices/bus/isa/wd1002a_wx1.h45
-rw-r--r--src/devices/bus/isa/wd1007a.cpp61
-rw-r--r--src/devices/bus/isa/wd1007a.h42
-rw-r--r--src/devices/bus/isa/wdxt_gen.cpp370
-rw-r--r--src/devices/bus/isa/wdxt_gen.h85
-rw-r--r--src/devices/bus/isa/wss.cpp72
-rw-r--r--src/devices/bus/isa/wss.h40
-rw-r--r--src/devices/bus/isa/xsu_cards.cpp90
-rw-r--r--src/devices/bus/isa/xsu_cards.h21
-rw-r--r--src/devices/bus/isa/xtide.cpp329
-rw-r--r--src/devices/bus/isa/xtide.h49
-rw-r--r--src/devices/bus/isa/zxbus_adapter.cpp37
-rw-r--r--src/devices/bus/isa/zxbus_adapter.h28
-rw-r--r--src/devices/bus/isbx/compis_fdc.cpp182
-rw-r--r--src/devices/bus/isbx/compis_fdc.h63
-rw-r--r--src/devices/bus/isbx/isbc_218a.cpp202
-rw-r--r--src/devices/bus/isbx/isbc_218a.h66
-rw-r--r--src/devices/bus/isbx/isbx.cpp75
-rw-r--r--src/devices/bus/isbx/isbx.h131
-rw-r--r--src/devices/bus/jakks_gamekey/rom.cpp111
-rw-r--r--src/devices/bus/jakks_gamekey/rom.h77
-rw-r--r--src/devices/bus/jakks_gamekey/slot.cpp233
-rw-r--r--src/devices/bus/jakks_gamekey/slot.h110
-rw-r--r--src/devices/bus/jvs/cyberlead.cpp486
-rw-r--r--src/devices/bus/jvs/cyberlead.h95
-rw-r--r--src/devices/bus/jvs/jvs.cpp449
-rw-r--r--src/devices/bus/jvs/jvs.h154
-rw-r--r--src/devices/bus/jvs/jvshle.cpp868
-rw-r--r--src/devices/bus/jvs/jvshle.h175
-rw-r--r--src/devices/bus/jvs/namcoio.cpp1611
-rw-r--r--src/devices/bus/jvs/namcoio.h73
-rw-r--r--src/devices/bus/kc/d002.cpp232
-rw-r--r--src/devices/bus/kc/d002.h56
-rw-r--r--src/devices/bus/kc/d004.cpp500
-rw-r--r--src/devices/bus/kc/d004.h118
-rw-r--r--src/devices/bus/kc/kc.cpp347
-rw-r--r--src/devices/bus/kc/kc.h122
-rw-r--r--src/devices/bus/kc/ram.cpp449
-rw-r--r--src/devices/bus/kc/ram.h180
-rw-r--r--src/devices/bus/kc/rom.cpp231
-rw-r--r--src/devices/bus/kc/rom.h96
-rw-r--r--src/devices/bus/keytronic/informer_kbd.cpp440
-rw-r--r--src/devices/bus/keytronic/informer_kbd.h21
-rw-r--r--src/devices/bus/keytronic/kay_kbd.cpp466
-rw-r--r--src/devices/bus/keytronic/kay_kbd.h12
-rw-r--r--src/devices/bus/keytronic/keytronic.cpp91
-rw-r--r--src/devices/bus/keytronic/keytronic.h99
-rw-r--r--src/devices/bus/keytronic/keytronic_l2207.cpp454
-rw-r--r--src/devices/bus/keytronic/keytronic_l2207.h20
-rw-r--r--src/devices/bus/kim1/cards.cpp20
-rw-r--r--src/devices/bus/kim1/cards.h16
-rw-r--r--src/devices/bus/kim1/k1008_vismem.cpp128
-rw-r--r--src/devices/bus/kim1/k1008_vismem.h21
-rw-r--r--src/devices/bus/kim1/k1016_16k.cpp48
-rw-r--r--src/devices/bus/kim1/k1016_16k.h21
-rw-r--r--src/devices/bus/kim1/kim1bus.cpp179
-rw-r--r--src/devices/bus/kim1/kim1bus.h205
-rw-r--r--src/devices/bus/lpci/cirrus.cpp164
-rw-r--r--src/devices/bus/lpci/cirrus.h45
-rw-r--r--src/devices/bus/lpci/i82371ab.cpp278
-rw-r--r--src/devices/bus/lpci/i82371ab.h57
-rw-r--r--src/devices/bus/lpci/i82371sb.cpp333
-rw-r--r--src/devices/bus/lpci/i82371sb.h73
-rw-r--r--src/devices/bus/lpci/i82439tx.cpp493
-rw-r--r--src/devices/bus/lpci/i82439tx.h71
-rw-r--r--src/devices/bus/lpci/mpc105.cpp234
-rw-r--r--src/devices/bus/lpci/mpc105.h58
-rw-r--r--src/devices/bus/lpci/northbridge.cpp46
-rw-r--r--src/devices/bus/lpci/northbridge.h35
-rw-r--r--src/devices/bus/lpci/pci.cpp345
-rw-r--r--src/devices/bus/lpci/pci.h114
-rw-r--r--src/devices/bus/lpci/southbridge.cpp583
-rw-r--r--src/devices/bus/lpci/southbridge.h165
-rw-r--r--src/devices/bus/lpci/vt82c505.cpp96
-rw-r--r--src/devices/bus/lpci/vt82c505.h36
-rw-r--r--src/devices/bus/m5/rom.cpp62
-rw-r--r--src/devices/bus/m5/rom.h55
-rw-r--r--src/devices/bus/m5/slot.cpp251
-rw-r--r--src/devices/bus/m5/slot.h141
-rw-r--r--src/devices/bus/mackbd/keyboard.cpp974
-rw-r--r--src/devices/bus/mackbd/keyboard.h24
-rw-r--r--src/devices/bus/mackbd/mackbd.cpp176
-rw-r--r--src/devices/bus/mackbd/mackbd.h87
-rw-r--r--src/devices/bus/mackbd/pluskbd.cpp508
-rw-r--r--src/devices/bus/mackbd/pluskbd.h19
-rw-r--r--src/devices/bus/macpds/hyperdrive.cpp192
-rw-r--r--src/devices/bus/macpds/hyperdrive.h53
-rw-r--r--src/devices/bus/macpds/macpds.cpp173
-rw-r--r--src/devices/bus/macpds/macpds.h128
-rw-r--r--src/devices/bus/macpds/pds_tpdfpd.cpp225
-rw-r--r--src/devices/bus/macpds/pds_tpdfpd.h56
-rw-r--r--src/devices/bus/mc10/mc10_cart.cpp232
-rw-r--r--src/devices/bus/mc10/mc10_cart.h107
-rw-r--r--src/devices/bus/mc10/mcx128.cpp339
-rw-r--r--src/devices/bus/mc10/mcx128.h14
-rw-r--r--src/devices/bus/mc10/multiports_ext.cpp141
-rw-r--r--src/devices/bus/mc10/multiports_ext.h11
-rw-r--r--src/devices/bus/mc10/pak.cpp94
-rw-r--r--src/devices/bus/mc10/pak.h12
-rw-r--r--src/devices/bus/mc10/ram.cpp78
-rw-r--r--src/devices/bus/mc10/ram.h14
-rw-r--r--src/devices/bus/mc68000/cards.cpp19
-rw-r--r--src/devices/bus/mc68000/cards.h16
-rw-r--r--src/devices/bus/mc68000/floppy.cpp169
-rw-r--r--src/devices/bus/mc68000/floppy.h48
-rw-r--r--src/devices/bus/mc68000/ram.cpp41
-rw-r--r--src/devices/bus/mc68000/ram.h39
-rw-r--r--src/devices/bus/mc68000/sysbus.cpp169
-rw-r--r--src/devices/bus/mc68000/sysbus.h177
-rw-r--r--src/devices/bus/megadrive/cart/action_replay.cpp67
-rw-r--r--src/devices/bus/megadrive/cart/action_replay.h37
-rw-r--r--src/devices/bus/megadrive/cart/avartisan.cpp74
-rw-r--r--src/devices/bus/megadrive/cart/avartisan.h33
-rw-r--r--src/devices/bus/megadrive/cart/eeprom.cpp261
-rw-r--r--src/devices/bus/megadrive/cart/eeprom.h113
-rw-r--r--src/devices/bus/megadrive/cart/everdrive.cpp235
-rw-r--r--src/devices/bus/megadrive/cart/everdrive.h58
-rw-r--r--src/devices/bus/megadrive/cart/gamtec.cpp475
-rw-r--r--src/devices/bus/megadrive/cart/gamtec.h171
-rw-r--r--src/devices/bus/megadrive/cart/jcart.cpp177
-rw-r--r--src/devices/bus/megadrive/cart/jcart.h79
-rw-r--r--src/devices/bus/megadrive/cart/mcpirate.cpp225
-rw-r--r--src/devices/bus/megadrive/cart/mcpirate.h75
-rw-r--r--src/devices/bus/megadrive/cart/miky.cpp88
-rw-r--r--src/devices/bus/megadrive/cart/miky.h43
-rw-r--r--src/devices/bus/megadrive/cart/multigame.cpp183
-rw-r--r--src/devices/bus/megadrive/cart/multigame.h69
-rw-r--r--src/devices/bus/megadrive/cart/options.cpp220
-rw-r--r--src/devices/bus/megadrive/cart/options.h90
-rw-r--r--src/devices/bus/megadrive/cart/rockworld.cpp40
-rw-r--r--src/devices/bus/megadrive/cart/rockworld.h31
-rw-r--r--src/devices/bus/megadrive/cart/rom.cpp146
-rw-r--r--src/devices/bus/megadrive/cart/rom.h60
-rw-r--r--src/devices/bus/megadrive/cart/segach.cpp666
-rw-r--r--src/devices/bus/megadrive/cart/segach.h108
-rw-r--r--src/devices/bus/megadrive/cart/segach_img.h171
-rw-r--r--src/devices/bus/megadrive/cart/sfteam.cpp353
-rw-r--r--src/devices/bus/megadrive/cart/sfteam.h102
-rw-r--r--src/devices/bus/megadrive/cart/slot.cpp262
-rw-r--r--src/devices/bus/megadrive/cart/slot.h114
-rw-r--r--src/devices/bus/megadrive/cart/smb.cpp80
-rw-r--r--src/devices/bus/megadrive/cart/smb.h44
-rw-r--r--src/devices/bus/megadrive/cart/smw64.cpp141
-rw-r--r--src/devices/bus/megadrive/cart/smw64.h37
-rw-r--r--src/devices/bus/megadrive/cart/sram.cpp299
-rw-r--r--src/devices/bus/megadrive/cart/sram.h115
-rw-r--r--src/devices/bus/megadrive/cart/ssf.cpp223
-rw-r--r--src/devices/bus/megadrive/cart/ssf.h79
-rw-r--r--src/devices/bus/megadrive/cart/t5740.cpp102
-rw-r--r--src/devices/bus/megadrive/cart/t5740.h34
-rw-r--r--src/devices/bus/megadrive/cart/tekkensp.cpp64
-rw-r--r--src/devices/bus/megadrive/cart/tekkensp.h29
-rw-r--r--src/devices/bus/megadrive/cart/xboy.cpp216
-rw-r--r--src/devices/bus/megadrive/cart/xboy.h73
-rw-r--r--src/devices/bus/megadrive/eeprom.cpp628
-rw-r--r--src/devices/bus/megadrive/eeprom.h227
-rw-r--r--src/devices/bus/megadrive/ggenie.cpp179
-rw-r--r--src/devices/bus/megadrive/ggenie.h44
-rw-r--r--src/devices/bus/megadrive/jcart.cpp212
-rw-r--r--src/devices/bus/megadrive/jcart.h88
-rw-r--r--src/devices/bus/megadrive/md_carts.cpp93
-rw-r--r--src/devices/bus/megadrive/md_carts.h18
-rw-r--r--src/devices/bus/megadrive/md_slot.cpp1097
-rw-r--r--src/devices/bus/megadrive/md_slot.h270
-rw-r--r--src/devices/bus/megadrive/rom.cpp1430
-rw-r--r--src/devices/bus/megadrive/rom.h635
-rw-r--r--src/devices/bus/megadrive/sk.cpp116
-rw-r--r--src/devices/bus/megadrive/sk.h44
-rw-r--r--src/devices/bus/megadrive/stm95.cpp265
-rw-r--r--src/devices/bus/megadrive/stm95.h89
-rw-r--r--src/devices/bus/megadrive/svp.cpp496
-rw-r--r--src/devices/bus/megadrive/svp.h83
-rw-r--r--src/devices/bus/megadrive/titan.cpp67
-rw-r--r--src/devices/bus/megadrive/titan.h30
-rw-r--r--src/devices/bus/megadrive/tplay96.cpp66
-rw-r--r--src/devices/bus/megadrive/tplay96.h36
-rw-r--r--src/devices/bus/midi/midi.cpp62
-rw-r--r--src/devices/bus/midi/midi.h67
-rw-r--r--src/devices/bus/midi/midiinport.cpp27
-rw-r--r--src/devices/bus/midi/midiinport.h38
-rw-r--r--src/devices/bus/midi/midioutport.cpp26
-rw-r--r--src/devices/bus/midi/midioutport.h38
-rw-r--r--src/devices/bus/mm2/crtc186.cpp302
-rw-r--r--src/devices/bus/mm2/crtc186.h98
-rw-r--r--src/devices/bus/mm2/exp.cpp122
-rw-r--r--src/devices/bus/mm2/exp.h173
-rw-r--r--src/devices/bus/mm2/meme186.cpp24
-rw-r--r--src/devices/bus/mm2/meme186.h30
-rw-r--r--src/devices/bus/mm2/mm2kb.cpp197
-rw-r--r--src/devices/bus/mm2/mm2kb.h52
-rw-r--r--src/devices/bus/mm2/mmc186.cpp234
-rw-r--r--src/devices/bus/mm2/mmc186.h84
-rw-r--r--src/devices/bus/mononcol/carts.cpp13
-rw-r--r--src/devices/bus/mononcol/carts.h11
-rw-r--r--src/devices/bus/mononcol/rom.cpp38
-rw-r--r--src/devices/bus/mononcol/rom.h43
-rw-r--r--src/devices/bus/mononcol/slot.cpp100
-rw-r--r--src/devices/bus/mononcol/slot.h91
-rw-r--r--src/devices/bus/mpf1/epb.cpp131
-rw-r--r--src/devices/bus/mpf1/epb.h14
-rw-r--r--src/devices/bus/mpf1/iom.cpp145
-rw-r--r--src/devices/bus/mpf1/iom.h13
-rw-r--r--src/devices/bus/mpf1/prt.cpp138
-rw-r--r--src/devices/bus/mpf1/prt.h14
-rw-r--r--src/devices/bus/mpf1/sgb.cpp73
-rw-r--r--src/devices/bus/mpf1/sgb.h13
-rw-r--r--src/devices/bus/mpf1/slot.cpp126
-rw-r--r--src/devices/bus/mpf1/slot.h119
-rw-r--r--src/devices/bus/mpf1/ssb.cpp153
-rw-r--r--src/devices/bus/mpf1/ssb.h14
-rw-r--r--src/devices/bus/mpf1/tva.cpp85
-rw-r--r--src/devices/bus/mpf1/tva.h13
-rw-r--r--src/devices/bus/mpf1/vid.cpp158
-rw-r--r--src/devices/bus/mpf1/vid.h13
-rw-r--r--src/devices/bus/msx/beecard/beecard.cpp58
-rw-r--r--src/devices/bus/msx/beecard/beecard.h12
-rw-r--r--src/devices/bus/msx/cart/arc.cpp78
-rw-r--r--src/devices/bus/msx/cart/arc.h13
-rw-r--r--src/devices/bus/msx/cart/ascii.cpp366
-rw-r--r--src/devices/bus/msx/cart/ascii.h16
-rw-r--r--src/devices/bus/msx/cart/beepack.cpp93
-rw-r--r--src/devices/bus/msx/cart/beepack.h58
-rw-r--r--src/devices/bus/msx/cart/bm_012.cpp128
-rw-r--r--src/devices/bus/msx/cart/bm_012.h13
-rw-r--r--src/devices/bus/msx/cart/cartridge.cpp247
-rw-r--r--src/devices/bus/msx/cart/cartridge.h28
-rw-r--r--src/devices/bus/msx/cart/crossblaim.cpp63
-rw-r--r--src/devices/bus/msx/cart/crossblaim.h13
-rw-r--r--src/devices/bus/msx/cart/disk.cpp1405
-rw-r--r--src/devices/bus/msx/cart/disk.h10
-rw-r--r--src/devices/bus/msx/cart/dooly.cpp84
-rw-r--r--src/devices/bus/msx/cart/dooly.h13
-rw-r--r--src/devices/bus/msx/cart/easi_speech.cpp98
-rw-r--r--src/devices/bus/msx/cart/easi_speech.h13
-rw-r--r--src/devices/bus/msx/cart/fmpac.cpp178
-rw-r--r--src/devices/bus/msx/cart/fmpac.h13
-rw-r--r--src/devices/bus/msx/cart/franky.cpp86
-rw-r--r--src/devices/bus/msx/cart/franky.h13
-rw-r--r--src/devices/bus/msx/cart/fs_sr021.cpp191
-rw-r--r--src/devices/bus/msx/cart/fs_sr021.h13
-rw-r--r--src/devices/bus/msx/cart/fs_sr022.cpp95
-rw-r--r--src/devices/bus/msx/cart/fs_sr022.h13
-rw-r--r--src/devices/bus/msx/cart/halnote.cpp121
-rw-r--r--src/devices/bus/msx/cart/halnote.h13
-rw-r--r--src/devices/bus/msx/cart/hbi55.cpp182
-rw-r--r--src/devices/bus/msx/cart/hbi55.h13
-rw-r--r--src/devices/bus/msx/cart/hfox.cpp76
-rw-r--r--src/devices/bus/msx/cart/hfox.h13
-rw-r--r--src/devices/bus/msx/cart/holy_quran.cpp136
-rw-r--r--src/devices/bus/msx/cart/holy_quran.h13
-rw-r--r--src/devices/bus/msx/cart/ide.cpp199
-rw-r--r--src/devices/bus/msx/cart/ide.h12
-rw-r--r--src/devices/bus/msx/cart/ink.cpp92
-rw-r--r--src/devices/bus/msx/cart/ink.h13
-rw-r--r--src/devices/bus/msx/cart/kanji.cpp221
-rw-r--r--src/devices/bus/msx/cart/kanji.h14
-rw-r--r--src/devices/bus/msx/cart/konami.cpp941
-rw-r--r--src/devices/bus/msx/cart/konami.h21
-rw-r--r--src/devices/bus/msx/cart/korean.cpp381
-rw-r--r--src/devices/bus/msx/cart/korean.h17
-rw-r--r--src/devices/bus/msx/cart/loveplus.cpp116
-rw-r--r--src/devices/bus/msx/cart/loveplus.h13
-rw-r--r--src/devices/bus/msx/cart/majutsushi.cpp92
-rw-r--r--src/devices/bus/msx/cart/majutsushi.h13
-rw-r--r--src/devices/bus/msx/cart/matra.cpp98
-rw-r--r--src/devices/bus/msx/cart/matra.h13
-rw-r--r--src/devices/bus/msx/cart/moonsound.cpp122
-rw-r--r--src/devices/bus/msx/cart/moonsound.h13
-rw-r--r--src/devices/bus/msx/cart/msx_audio.cpp437
-rw-r--r--src/devices/bus/msx/cart/msx_audio.h15
-rw-r--r--src/devices/bus/msx/cart/msx_audio_kb.cpp318
-rw-r--r--src/devices/bus/msx/cart/msx_audio_kb.h48
-rw-r--r--src/devices/bus/msx/cart/msxdos2.cpp226
-rw-r--r--src/devices/bus/msx/cart/msxdos2.h14
-rw-r--r--src/devices/bus/msx/cart/nomapper.cpp152
-rw-r--r--src/devices/bus/msx/cart/nomapper.h13
-rw-r--r--src/devices/bus/msx/cart/quickdisk.cpp124
-rw-r--r--src/devices/bus/msx/cart/quickdisk.h13
-rw-r--r--src/devices/bus/msx/cart/ram.cpp544
-rw-r--r--src/devices/bus/msx/cart/ram.h11
-rw-r--r--src/devices/bus/msx/cart/rtype.cpp62
-rw-r--r--src/devices/bus/msx/cart/rtype.h13
-rw-r--r--src/devices/bus/msx/cart/scsi.cpp232
-rw-r--r--src/devices/bus/msx/cart/scsi.h13
-rw-r--r--src/devices/bus/msx/cart/slotexpander.cpp147
-rw-r--r--src/devices/bus/msx/cart/slotexpander.h13
-rw-r--r--src/devices/bus/msx/cart/slotoptions.cpp94
-rw-r--r--src/devices/bus/msx/cart/slotoptions.h98
-rw-r--r--src/devices/bus/msx/cart/softcard.cpp92
-rw-r--r--src/devices/bus/msx/cart/softcard.h58
-rw-r--r--src/devices/bus/msx/cart/super_swangi.cpp59
-rw-r--r--src/devices/bus/msx/cart/super_swangi.h13
-rw-r--r--src/devices/bus/msx/cart/superloderunner.cpp63
-rw-r--r--src/devices/bus/msx/cart/superloderunner.h13
-rw-r--r--src/devices/bus/msx/cart/video80.cpp212
-rw-r--r--src/devices/bus/msx/cart/video80.h19
-rw-r--r--src/devices/bus/msx/cart/yamaha_ucn01.cpp65
-rw-r--r--src/devices/bus/msx/cart/yamaha_ucn01.h13
-rw-r--r--src/devices/bus/msx/ctrl/ctrl.cpp61
-rw-r--r--src/devices/bus/msx/ctrl/ctrl.h82
-rw-r--r--src/devices/bus/msx/ctrl/hypershot.cpp85
-rw-r--r--src/devices/bus/msx/ctrl/hypershot.h19
-rw-r--r--src/devices/bus/msx/ctrl/joystick.cpp53
-rw-r--r--src/devices/bus/msx/ctrl/joystick.h19
-rw-r--r--src/devices/bus/msx/ctrl/libbler.cpp79
-rw-r--r--src/devices/bus/msx/ctrl/libbler.h19
-rw-r--r--src/devices/bus/msx/ctrl/magickey.cpp53
-rw-r--r--src/devices/bus/msx/ctrl/magickey.h19
-rw-r--r--src/devices/bus/msx/ctrl/mouse.cpp120
-rw-r--r--src/devices/bus/msx/ctrl/mouse.h19
-rw-r--r--src/devices/bus/msx/ctrl/sgadapt.cpp131
-rw-r--r--src/devices/bus/msx/ctrl/sgadapt.h20
-rw-r--r--src/devices/bus/msx/ctrl/towns6b.cpp90
-rw-r--r--src/devices/bus/msx/ctrl/towns6b.h19
-rw-r--r--src/devices/bus/msx/ctrl/townspad.cpp96
-rw-r--r--src/devices/bus/msx/ctrl/townspad.h20
-rw-r--r--src/devices/bus/msx/ctrl/vaus.cpp115
-rw-r--r--src/devices/bus/msx/ctrl/vaus.h19
-rw-r--r--src/devices/bus/msx/ctrl/xe1ap.cpp101
-rw-r--r--src/devices/bus/msx/ctrl/xe1ap.h19
-rw-r--r--src/devices/bus/msx/minicart/minicart.cpp35
-rw-r--r--src/devices/bus/msx/minicart/minicart.h38
-rw-r--r--src/devices/bus/msx/module/module.cpp41
-rw-r--r--src/devices/bus/msx/module/module.h66
-rw-r--r--src/devices/bus/msx/module/sfg.cpp211
-rw-r--r--src/devices/bus/msx/module/sfg.h14
-rw-r--r--src/devices/bus/msx/module/skw01.cpp176
-rw-r--r--src/devices/bus/msx/module/skw01.h12
-rw-r--r--src/devices/bus/msx/slot/ax230.cpp53
-rw-r--r--src/devices/bus/msx/slot/ax230.h38
-rw-r--r--src/devices/bus/msx/slot/bruc100.cpp50
-rw-r--r--src/devices/bus/msx/slot/bruc100.h35
-rw-r--r--src/devices/bus/msx/slot/bunsetsu.cpp62
-rw-r--r--src/devices/bus/msx/slot/bunsetsu.h36
-rw-r--r--src/devices/bus/msx/slot/cartridge.cpp130
-rw-r--r--src/devices/bus/msx/slot/cartridge.h113
-rw-r--r--src/devices/bus/msx/slot/disk.cpp1435
-rw-r--r--src/devices/bus/msx/slot/disk.h499
-rw-r--r--src/devices/bus/msx/slot/fs4600.cpp136
-rw-r--r--src/devices/bus/msx/slot/fs4600.h48
-rw-r--r--src/devices/bus/msx/slot/fsa1fm.cpp223
-rw-r--r--src/devices/bus/msx/slot/fsa1fm.h83
-rw-r--r--src/devices/bus/msx/slot/msx_rs232.cpp527
-rw-r--r--src/devices/bus/msx/slot/msx_rs232.h168
-rw-r--r--src/devices/bus/msx/slot/msx_write.cpp77
-rw-r--r--src/devices/bus/msx/slot/msx_write.h40
-rw-r--r--src/devices/bus/msx/slot/music.cpp22
-rw-r--r--src/devices/bus/msx/slot/music.h35
-rw-r--r--src/devices/bus/msx/slot/panasonic08.cpp133
-rw-r--r--src/devices/bus/msx/slot/panasonic08.h48
-rw-r--r--src/devices/bus/msx/slot/panasonic08r.cpp166
-rw-r--r--src/devices/bus/msx/slot/panasonic08r.h52
-rw-r--r--src/devices/bus/msx/slot/ram.cpp31
-rw-r--r--src/devices/bus/msx/slot/ram.h30
-rw-r--r--src/devices/bus/msx/slot/ram_mm.cpp59
-rw-r--r--src/devices/bus/msx/slot/ram_mm.h38
-rw-r--r--src/devices/bus/msx/slot/rom.cpp37
-rw-r--r--src/devices/bus/msx/slot/rom.h31
-rw-r--r--src/devices/bus/msx/slot/slot.cpp41
-rw-r--r--src/devices/bus/msx/slot/slot.h61
-rw-r--r--src/devices/bus/msx/slot/sony08.cpp89
-rw-r--r--src/devices/bus/msx/slot/sony08.h43
-rw-r--r--src/devices/bus/msx/softcard/softcard.cpp56
-rw-r--r--src/devices/bus/msx/softcard/softcard.h12
-rw-r--r--src/devices/bus/mtu130/board.cpp37
-rw-r--r--src/devices/bus/mtu130/board.h69
-rw-r--r--src/devices/bus/mtu130/datamover.cpp172
-rw-r--r--src/devices/bus/mtu130/datamover.h72
-rw-r--r--src/devices/bus/mtx/cfx.cpp152
-rw-r--r--src/devices/bus/mtx/cfx.h51
-rw-r--r--src/devices/bus/mtx/exp.cpp161
-rw-r--r--src/devices/bus/mtx/exp.h116
-rw-r--r--src/devices/bus/mtx/magrom.cpp103
-rw-r--r--src/devices/bus/mtx/magrom.h50
-rw-r--r--src/devices/bus/mtx/rompak.cpp51
-rw-r--r--src/devices/bus/mtx/rompak.h40
-rw-r--r--src/devices/bus/mtx/sdx.cpp425
-rw-r--r--src/devices/bus/mtx/sdx.h100
-rw-r--r--src/devices/bus/multibus/cpuap.cpp214
-rw-r--r--src/devices/bus/multibus/cpuap.h58
-rw-r--r--src/devices/bus/multibus/dsd5217.cpp884
-rw-r--r--src/devices/bus/multibus/dsd5217.h13
-rw-r--r--src/devices/bus/multibus/exos201.cpp482
-rw-r--r--src/devices/bus/multibus/exos201.h13
-rw-r--r--src/devices/bus/multibus/isbc202.cpp1164
-rw-r--r--src/devices/bus/multibus/isbc202.h163
-rw-r--r--src/devices/bus/multibus/isbc8024.cpp156
-rw-r--r--src/devices/bus/multibus/isbc8024.h57
-rw-r--r--src/devices/bus/multibus/labtam_3232.cpp123
-rw-r--r--src/devices/bus/multibus/labtam_3232.h51
-rw-r--r--src/devices/bus/multibus/labtam_vducom.cpp455
-rw-r--r--src/devices/bus/multibus/labtam_vducom.h109
-rw-r--r--src/devices/bus/multibus/labtam_z80sbc.cpp603
-rw-r--r--src/devices/bus/multibus/labtam_z80sbc.h97
-rw-r--r--src/devices/bus/multibus/multibus.cpp113
-rw-r--r--src/devices/bus/multibus/multibus.h172
-rw-r--r--src/devices/bus/multibus/robotron_k7070.cpp423
-rw-r--r--src/devices/bus/multibus/robotron_k7070.h77
-rw-r--r--src/devices/bus/multibus/robotron_k7071.cpp222
-rw-r--r--src/devices/bus/multibus/robotron_k7071.h61
-rw-r--r--src/devices/bus/multibus/serad.cpp204
-rw-r--r--src/devices/bus/multibus/serad.h49
-rw-r--r--src/devices/bus/multibus/sun1.cpp533
-rw-r--r--src/devices/bus/multibus/sun1.h14
-rw-r--r--src/devices/bus/mz80/ar_romcard.cpp123
-rw-r--r--src/devices/bus/mz80/ar_romcard.h14
-rw-r--r--src/devices/bus/mz80/mz1e05.cpp135
-rw-r--r--src/devices/bus/mz80/mz1e05.h14
-rw-r--r--src/devices/bus/mz80/mz1e30.cpp104
-rw-r--r--src/devices/bus/mz80/mz1e30.h14
-rw-r--r--src/devices/bus/mz80/mz1e35.cpp63
-rw-r--r--src/devices/bus/mz80/mz1e35.h14
-rw-r--r--src/devices/bus/mz80/mz1r18.cpp102
-rw-r--r--src/devices/bus/mz80/mz1r18.h14
-rw-r--r--src/devices/bus/mz80/mz1r37.cpp61
-rw-r--r--src/devices/bus/mz80/mz1r37.h38
-rw-r--r--src/devices/bus/mz80/mz80_exp.cpp88
-rw-r--r--src/devices/bus/mz80/mz80_exp.h80
-rw-r--r--src/devices/bus/nabupc/adapter.cpp423
-rw-r--r--src/devices/bus/nabupc/adapter.h153
-rw-r--r--src/devices/bus/nabupc/fdc.cpp167
-rw-r--r--src/devices/bus/nabupc/fdc.h19
-rw-r--r--src/devices/bus/nabupc/hdd.cpp113
-rw-r--r--src/devices/bus/nabupc/hdd.h19
-rw-r--r--src/devices/bus/nabupc/option.cpp135
-rw-r--r--src/devices/bus/nabupc/option.h153
-rw-r--r--src/devices/bus/nabupc/rs232.cpp141
-rw-r--r--src/devices/bus/nabupc/rs232.h20
-rw-r--r--src/devices/bus/nasbus/avc.cpp163
-rw-r--r--src/devices/bus/nasbus/avc.h56
-rw-r--r--src/devices/bus/nasbus/cards.cpp20
-rw-r--r--src/devices/bus/nasbus/cards.h17
-rw-r--r--src/devices/bus/nasbus/floppy.cpp205
-rw-r--r--src/devices/bus/nasbus/floppy.h61
-rw-r--r--src/devices/bus/nasbus/nasbus.cpp138
-rw-r--r--src/devices/bus/nasbus/nasbus.h204
-rw-r--r--src/devices/bus/nec_fdd/pc80s31k.cpp752
-rw-r--r--src/devices/bus/nec_fdd/pc80s31k.h125
-rw-r--r--src/devices/bus/neogeo/boot_cthd.cpp131
-rw-r--r--src/devices/bus/neogeo/boot_cthd.h97
-rw-r--r--src/devices/bus/neogeo/boot_kof10th.cpp122
-rw-r--r--src/devices/bus/neogeo/boot_kof10th.h48
-rw-r--r--src/devices/bus/neogeo/boot_kof2k2.cpp105
-rw-r--r--src/devices/bus/neogeo/boot_kof2k2.h87
-rw-r--r--src/devices/bus/neogeo/boot_kof2k3.cpp104
-rw-r--r--src/devices/bus/neogeo/boot_kof2k3.h97
-rw-r--r--src/devices/bus/neogeo/boot_misc.cpp305
-rw-r--r--src/devices/bus/neogeo/boot_misc.h227
-rw-r--r--src/devices/bus/neogeo/boot_svc.cpp104
-rw-r--r--src/devices/bus/neogeo/boot_svc.h94
-rw-r--r--src/devices/bus/neogeo/carts.cpp117
-rw-r--r--src/devices/bus/neogeo/carts.h16
-rw-r--r--src/devices/bus/neogeo/cmc.cpp279
-rw-r--r--src/devices/bus/neogeo/cmc.h233
-rw-r--r--src/devices/bus/neogeo/fatfury2.cpp49
-rw-r--r--src/devices/bus/neogeo/fatfury2.h40
-rw-r--r--src/devices/bus/neogeo/kof2k2.cpp159
-rw-r--r--src/devices/bus/neogeo/kof2k2.h117
-rw-r--r--src/devices/bus/neogeo/kof98.cpp54
-rw-r--r--src/devices/bus/neogeo/kof98.h39
-rw-r--r--src/devices/bus/neogeo/mslugx.cpp49
-rw-r--r--src/devices/bus/neogeo/mslugx.h38
-rw-r--r--src/devices/bus/neogeo/pcm2.cpp134
-rw-r--r--src/devices/bus/neogeo/pcm2.h99
-rw-r--r--src/devices/bus/neogeo/prot_cmc.cpp737
-rw-r--r--src/devices/bus/neogeo/prot_cmc.h80
-rw-r--r--src/devices/bus/neogeo/prot_cthd.cpp320
-rw-r--r--src/devices/bus/neogeo/prot_cthd.h39
-rw-r--r--src/devices/bus/neogeo/prot_fatfury2.cpp73
-rw-r--r--src/devices/bus/neogeo/prot_fatfury2.h32
-rw-r--r--src/devices/bus/neogeo/prot_kof2k2.cpp70
-rw-r--r--src/devices/bus/neogeo/prot_kof2k2.h29
-rw-r--r--src/devices/bus/neogeo/prot_kof2k3bl.cpp133
-rw-r--r--src/devices/bus/neogeo/prot_kof2k3bl.h37
-rw-r--r--src/devices/bus/neogeo/prot_kof98.cpp128
-rw-r--r--src/devices/bus/neogeo/prot_kof98.h30
-rw-r--r--src/devices/bus/neogeo/prot_misc.cpp622
-rw-r--r--src/devices/bus/neogeo/prot_misc.h65
-rw-r--r--src/devices/bus/neogeo/prot_mslugx.cpp87
-rw-r--r--src/devices/bus/neogeo/prot_mslugx.h31
-rw-r--r--src/devices/bus/neogeo/prot_pcm2.cpp90
-rw-r--r--src/devices/bus/neogeo/prot_pcm2.h27
-rw-r--r--src/devices/bus/neogeo/prot_pvc.cpp292
-rw-r--r--src/devices/bus/neogeo/prot_pvc.h38
-rw-r--r--src/devices/bus/neogeo/prot_sma.cpp498
-rw-r--r--src/devices/bus/neogeo/prot_sma.h47
-rw-r--r--src/devices/bus/neogeo/pvc.cpp140
-rw-r--r--src/devices/bus/neogeo/pvc.h109
-rw-r--r--src/devices/bus/neogeo/rom.cpp91
-rw-r--r--src/devices/bus/neogeo/rom.h66
-rw-r--r--src/devices/bus/neogeo/sbp.cpp103
-rw-r--r--src/devices/bus/neogeo/sbp.h36
-rw-r--r--src/devices/bus/neogeo/slot.cpp406
-rw-r--r--src/devices/bus/neogeo/slot.h341
-rw-r--r--src/devices/bus/neogeo/sma.cpp160
-rw-r--r--src/devices/bus/neogeo/sma.h135
-rw-r--r--src/devices/bus/neogeo_ctrl/ctrl.cpp221
-rw-r--r--src/devices/bus/neogeo_ctrl/ctrl.h118
-rw-r--r--src/devices/bus/neogeo_ctrl/dial.cpp126
-rw-r--r--src/devices/bus/neogeo_ctrl/dial.h54
-rw-r--r--src/devices/bus/neogeo_ctrl/irrmaze.cpp128
-rw-r--r--src/devices/bus/neogeo_ctrl/irrmaze.h53
-rw-r--r--src/devices/bus/neogeo_ctrl/joystick.cpp214
-rw-r--r--src/devices/bus/neogeo_ctrl/joystick.h74
-rw-r--r--src/devices/bus/neogeo_ctrl/kizuna4p.cpp153
-rw-r--r--src/devices/bus/neogeo_ctrl/kizuna4p.h51
-rw-r--r--src/devices/bus/neogeo_ctrl/mahjong.cpp161
-rw-r--r--src/devices/bus/neogeo_ctrl/mahjong.h69
-rw-r--r--src/devices/bus/nes/2a03pur.cpp106
-rw-r--r--src/devices/bus/nes/2a03pur.h36
-rw-r--r--src/devices/bus/nes/act53.cpp197
-rw-r--r--src/devices/bus/nes/act53.h37
-rw-r--r--src/devices/bus/nes/aladdin.cpp330
-rw-r--r--src/devices/bus/nes/aladdin.h171
-rw-r--r--src/devices/bus/nes/ave.cpp173
-rw-r--r--src/devices/bus/nes/ave.h62
-rw-r--r--src/devices/bus/nes/bandai.cpp457
-rw-r--r--src/devices/bus/nes/bandai.h155
-rw-r--r--src/devices/bus/nes/batlab.cpp256
-rw-r--r--src/devices/bus/nes/batlab.h60
-rw-r--r--src/devices/bus/nes/benshieng.cpp93
-rw-r--r--src/devices/bus/nes/benshieng.h35
-rw-r--r--src/devices/bus/nes/bootleg.cpp2114
-rw-r--r--src/devices/bus/nes/bootleg.h737
-rw-r--r--src/devices/bus/nes/camerica.cpp221
-rw-r--r--src/devices/bus/nes/camerica.h86
-rw-r--r--src/devices/bus/nes/cne.cpp173
-rw-r--r--src/devices/bus/nes/cne.h55
-rw-r--r--src/devices/bus/nes/cony.cpp286
-rw-r--r--src/devices/bus/nes/cony.h83
-rw-r--r--src/devices/bus/nes/datach.cpp409
-rw-r--r--src/devices/bus/nes/datach.h173
-rw-r--r--src/devices/bus/nes/discrete.cpp164
-rw-r--r--src/devices/bus/nes/discrete.h67
-rw-r--r--src/devices/bus/nes/disksys.cpp487
-rw-r--r--src/devices/bus/nes/disksys.h79
-rw-r--r--src/devices/bus/nes/event.cpp318
-rw-r--r--src/devices/bus/nes/event.h80
-rw-r--r--src/devices/bus/nes/ggenie.cpp254
-rw-r--r--src/devices/bus/nes/ggenie.h61
-rw-r--r--src/devices/bus/nes/henggedianzi.cpp115
-rw-r--r--src/devices/bus/nes/henggedianzi.h40
-rw-r--r--src/devices/bus/nes/hes.cpp72
-rw-r--r--src/devices/bus/nes/hes.h26
-rw-r--r--src/devices/bus/nes/irem.cpp314
-rw-r--r--src/devices/bus/nes/irem.h114
-rw-r--r--src/devices/bus/nes/jaleco.cpp693
-rw-r--r--src/devices/bus/nes/jaleco.h222
-rw-r--r--src/devices/bus/nes/jncota.cpp108
-rw-r--r--src/devices/bus/nes/jncota.h35
-rw-r--r--src/devices/bus/nes/jy.cpp584
-rw-r--r--src/devices/bus/nes/jy.h106
-rw-r--r--src/devices/bus/nes/kaiser.cpp1016
-rw-r--r--src/devices/bus/nes/kaiser.h356
-rw-r--r--src/devices/bus/nes/karastudio.cpp299
-rw-r--r--src/devices/bus/nes/karastudio.h151
-rw-r--r--src/devices/bus/nes/konami.cpp688
-rw-r--r--src/devices/bus/nes/konami.h182
-rw-r--r--src/devices/bus/nes/legacy.cpp290
-rw-r--r--src/devices/bus/nes/legacy.h78
-rw-r--r--src/devices/bus/nes/mmc1.cpp344
-rw-r--r--src/devices/bus/nes/mmc1.h81
-rw-r--r--src/devices/bus/nes/mmc1_clones.cpp432
-rw-r--r--src/devices/bus/nes/mmc1_clones.h185
-rw-r--r--src/devices/bus/nes/mmc2.cpp194
-rw-r--r--src/devices/bus/nes/mmc2.h54
-rw-r--r--src/devices/bus/nes/mmc3.cpp555
-rw-r--r--src/devices/bus/nes/mmc3.h154
-rw-r--r--src/devices/bus/nes/mmc3_clones.cpp3699
-rw-r--r--src/devices/bus/nes/mmc3_clones.h1266
-rw-r--r--src/devices/bus/nes/mmc5.cpp729
-rw-r--r--src/devices/bus/nes/mmc5.h108
-rw-r--r--src/devices/bus/nes/multigame.cpp3540
-rw-r--r--src/devices/bus/nes/multigame.h1398
-rw-r--r--src/devices/bus/nes/namcot.cpp695
-rw-r--r--src/devices/bus/nes/namcot.h178
-rw-r--r--src/devices/bus/nes/nanjing.cpp183
-rw-r--r--src/devices/bus/nes/nanjing.h44
-rw-r--r--src/devices/bus/nes/nes_carts.cpp525
-rw-r--r--src/devices/bus/nes/nes_carts.h19
-rw-r--r--src/devices/bus/nes/nes_ines.hxx1360
-rw-r--r--src/devices/bus/nes/nes_pcb.hxx808
-rw-r--r--src/devices/bus/nes/nes_slot.cpp916
-rw-r--r--src/devices/bus/nes/nes_slot.h454
-rw-r--r--src/devices/bus/nes/nes_unif.hxx583
-rw-r--r--src/devices/bus/nes/ntdec.cpp210
-rw-r--r--src/devices/bus/nes/ntdec.h65
-rw-r--r--src/devices/bus/nes/nxrom.cpp530
-rw-r--r--src/devices/bus/nes/nxrom.h206
-rw-r--r--src/devices/bus/nes/pirate.cpp761
-rw-r--r--src/devices/bus/nes/pirate.h283
-rw-r--r--src/devices/bus/nes/pt554.cpp95
-rw-r--r--src/devices/bus/nes/pt554.h34
-rw-r--r--src/devices/bus/nes/racermate.cpp91
-rw-r--r--src/devices/bus/nes/racermate.h32
-rw-r--r--src/devices/bus/nes/rcm.cpp170
-rw-r--r--src/devices/bus/nes/rcm.h84
-rw-r--r--src/devices/bus/nes/rexsoft.cpp215
-rw-r--r--src/devices/bus/nes/rexsoft.h66
-rw-r--r--src/devices/bus/nes/sachen.cpp699
-rw-r--r--src/devices/bus/nes/sachen.h275
-rw-r--r--src/devices/bus/nes/sealie.cpp241
-rw-r--r--src/devices/bus/nes/sealie.h85
-rw-r--r--src/devices/bus/nes/somari.cpp299
-rw-r--r--src/devices/bus/nes/somari.h70
-rw-r--r--src/devices/bus/nes/subor.cpp322
-rw-r--r--src/devices/bus/nes/subor.h86
-rw-r--r--src/devices/bus/nes/sunsoft.cpp535
-rw-r--r--src/devices/bus/nes/sunsoft.h155
-rw-r--r--src/devices/bus/nes/sunsoft_dcs.cpp289
-rw-r--r--src/devices/bus/nes/sunsoft_dcs.h152
-rw-r--r--src/devices/bus/nes/taito.cpp455
-rw-r--r--src/devices/bus/nes/taito.h118
-rw-r--r--src/devices/bus/nes/tengen.cpp321
-rw-r--r--src/devices/bus/nes/tengen.h70
-rw-r--r--src/devices/bus/nes/txc.cpp285
-rw-r--r--src/devices/bus/nes/txc.h101
-rw-r--r--src/devices/bus/nes/vrc_clones.cpp861
-rw-r--r--src/devices/bus/nes/vrc_clones.h309
-rw-r--r--src/devices/bus/nes/waixing.cpp1100
-rw-r--r--src/devices/bus/nes/waixing.h376
-rw-r--r--src/devices/bus/nes/zemina.cpp82
-rw-r--r--src/devices/bus/nes/zemina.h28
-rw-r--r--src/devices/bus/nes_ctrl/4score.cpp191
-rw-r--r--src/devices/bus/nes_ctrl/4score.h83
-rw-r--r--src/devices/bus/nes_ctrl/arkpaddle.cpp160
-rw-r--r--src/devices/bus/nes_ctrl/arkpaddle.h71
-rw-r--r--src/devices/bus/nes_ctrl/bandaihs.cpp132
-rw-r--r--src/devices/bus/nes_ctrl/bandaihs.h53
-rw-r--r--src/devices/bus/nes_ctrl/bcbattle.cpp178
-rw-r--r--src/devices/bus/nes_ctrl/bcbattle.h53
-rw-r--r--src/devices/bus/nes_ctrl/ctrl.cpp257
-rw-r--r--src/devices/bus/nes_ctrl/ctrl.h101
-rw-r--r--src/devices/bus/nes_ctrl/dorepiano.cpp158
-rw-r--r--src/devices/bus/nes_ctrl/dorepiano.h50
-rw-r--r--src/devices/bus/nes_ctrl/fckeybrd.cpp217
-rw-r--r--src/devices/bus/nes_ctrl/fckeybrd.h51
-rw-r--r--src/devices/bus/nes_ctrl/fcmat.cpp177
-rw-r--r--src/devices/bus/nes_ctrl/fcmat.h77
-rw-r--r--src/devices/bus/nes_ctrl/hori.cpp186
-rw-r--r--src/devices/bus/nes_ctrl/hori.h75
-rw-r--r--src/devices/bus/nes_ctrl/joypad.cpp328
-rw-r--r--src/devices/bus/nes_ctrl/joypad.h157
-rw-r--r--src/devices/bus/nes_ctrl/konamibag.cpp88
-rw-r--r--src/devices/bus/nes_ctrl/konamibag.h50
-rw-r--r--src/devices/bus/nes_ctrl/konamihs.cpp86
-rw-r--r--src/devices/bus/nes_ctrl/konamihs.h47
-rw-r--r--src/devices/bus/nes_ctrl/miracle.cpp273
-rw-r--r--src/devices/bus/nes_ctrl/miracle.h71
-rw-r--r--src/devices/bus/nes_ctrl/mjpanel.cpp136
-rw-r--r--src/devices/bus/nes_ctrl/mjpanel.h50
-rw-r--r--src/devices/bus/nes_ctrl/pachinko.cpp54
-rw-r--r--src/devices/bus/nes_ctrl/pachinko.h43
-rw-r--r--src/devices/bus/nes_ctrl/partytap.cpp93
-rw-r--r--src/devices/bus/nes_ctrl/partytap.h47
-rw-r--r--src/devices/bus/nes_ctrl/powerpad.cpp128
-rw-r--r--src/devices/bus/nes_ctrl/powerpad.h47
-rw-r--r--src/devices/bus/nes_ctrl/rob.cpp139
-rw-r--r--src/devices/bus/nes_ctrl/rob.h54
-rw-r--r--src/devices/bus/nes_ctrl/sharpcass.cpp89
-rw-r--r--src/devices/bus/nes_ctrl/sharpcass.h48
-rw-r--r--src/devices/bus/nes_ctrl/snesadapter.cpp72
-rw-r--r--src/devices/bus/nes_ctrl/snesadapter.h46
-rw-r--r--src/devices/bus/nes_ctrl/suborkey.cpp232
-rw-r--r--src/devices/bus/nes_ctrl/suborkey.h48
-rw-r--r--src/devices/bus/nes_ctrl/turbofile.cpp140
-rw-r--r--src/devices/bus/nes_ctrl/turbofile.h59
-rw-r--r--src/devices/bus/nes_ctrl/zapper.cpp105
-rw-r--r--src/devices/bus/nes_ctrl/zapper.h53
-rw-r--r--src/devices/bus/nes_ctrl/zapper_sensor.cpp72
-rw-r--r--src/devices/bus/nes_ctrl/zapper_sensor.h53
-rw-r--r--src/devices/bus/newbrain/eim.cpp262
-rw-r--r--src/devices/bus/newbrain/eim.h77
-rw-r--r--src/devices/bus/newbrain/exp.cpp145
-rw-r--r--src/devices/bus/newbrain/exp.h111
-rw-r--r--src/devices/bus/newbrain/fdc.cpp330
-rw-r--r--src/devices/bus/newbrain/fdc.h77
-rw-r--r--src/devices/bus/nscsi/applecd.cpp92
-rw-r--r--src/devices/bus/nscsi/applecd.h30
-rw-r--r--src/devices/bus/nscsi/cd.cpp1841
-rw-r--r--src/devices/bus/nscsi/cd.h191
-rw-r--r--src/devices/bus/nscsi/cdd2000.cpp64
-rw-r--r--src/devices/bus/nscsi/cdd2000.h33
-rw-r--r--src/devices/bus/nscsi/cdrn820s.cpp53
-rw-r--r--src/devices/bus/nscsi/cdrn820s.h34
-rw-r--r--src/devices/bus/nscsi/cdu415.cpp67
-rw-r--r--src/devices/bus/nscsi/cdu415.h37
-rw-r--r--src/devices/bus/nscsi/cdu561.cpp87
-rw-r--r--src/devices/bus/nscsi/cdu561.h29
-rw-r--r--src/devices/bus/nscsi/cdu75s.cpp78
-rw-r--r--src/devices/bus/nscsi/cdu75s.h37
-rw-r--r--src/devices/bus/nscsi/cfp1080s.cpp96
-rw-r--r--src/devices/bus/nscsi/cfp1080s.h40
-rw-r--r--src/devices/bus/nscsi/crd254sh.cpp63
-rw-r--r--src/devices/bus/nscsi/crd254sh.h35
-rw-r--r--src/devices/bus/nscsi/cw7501.cpp96
-rw-r--r--src/devices/bus/nscsi/cw7501.h52
-rw-r--r--src/devices/bus/nscsi/devices.cpp51
-rw-r--r--src/devices/bus/nscsi/devices.h12
-rw-r--r--src/devices/bus/nscsi/dtc510.cpp271
-rw-r--r--src/devices/bus/nscsi/dtc510.h113
-rw-r--r--src/devices/bus/nscsi/hd.cpp560
-rw-r--r--src/devices/bus/nscsi/hd.h39
-rw-r--r--src/devices/bus/nscsi/pc8801_30.cpp616
-rw-r--r--src/devices/bus/nscsi/pc8801_30.h70
-rw-r--r--src/devices/bus/nscsi/pc98_hd.cpp110
-rw-r--r--src/devices/bus/nscsi/pc98_hd.h25
-rw-r--r--src/devices/bus/nscsi/s1410.cpp235
-rw-r--r--src/devices/bus/nscsi/s1410.h88
-rw-r--r--src/devices/bus/nscsi/smoc501.cpp91
-rw-r--r--src/devices/bus/nscsi/smoc501.h30
-rw-r--r--src/devices/bus/nscsi/tape.cpp923
-rw-r--r--src/devices/bus/nscsi/tape.h95
-rw-r--r--src/devices/bus/nubus/8lc.cpp421
-rw-r--r--src/devices/bus/nubus/8lc.h12
-rw-r--r--src/devices/bus/nubus/bootbug.cpp100
-rw-r--r--src/devices/bus/nubus/bootbug.h12
-rw-r--r--src/devices/bus/nubus/cards.cpp131
-rw-r--r--src/devices/bus/nubus/cards.h21
-rw-r--r--src/devices/bus/nubus/enetlc.cpp178
-rw-r--r--src/devices/bus/nubus/enetlc.h13
-rw-r--r--src/devices/bus/nubus/enetnbtp.cpp149
-rw-r--r--src/devices/bus/nubus/enetnbtp.h12
-rw-r--r--src/devices/bus/nubus/laserview.cpp325
-rw-r--r--src/devices/bus/nubus/laserview.h13
-rw-r--r--src/devices/bus/nubus/nubus.cpp536
-rw-r--r--src/devices/bus/nubus/nubus.h255
-rw-r--r--src/devices/bus/nubus/nubus_48gc.cpp1168
-rw-r--r--src/devices/bus/nubus/nubus_48gc.h14
-rw-r--r--src/devices/bus/nubus/nubus_asntmc3b.cpp297
-rw-r--r--src/devices/bus/nubus/nubus_asntmc3b.h16
-rw-r--r--src/devices/bus/nubus/nubus_cb264.cpp443
-rw-r--r--src/devices/bus/nubus/nubus_cb264.h12
-rw-r--r--src/devices/bus/nubus/nubus_image.cpp387
-rw-r--r--src/devices/bus/nubus/nubus_image.h11
-rw-r--r--src/devices/bus/nubus/nubus_m2hires.cpp529
-rw-r--r--src/devices/bus/nubus/nubus_m2hires.h14
-rw-r--r--src/devices/bus/nubus/nubus_m2video.cpp364
-rw-r--r--src/devices/bus/nubus/nubus_m2video.h13
-rw-r--r--src/devices/bus/nubus/nubus_radiustpd.cpp194
-rw-r--r--src/devices/bus/nubus/nubus_radiustpd.h13
-rw-r--r--src/devices/bus/nubus/nubus_spec8.cpp622
-rw-r--r--src/devices/bus/nubus/nubus_spec8.h13
-rw-r--r--src/devices/bus/nubus/nubus_specpdq.cpp745
-rw-r--r--src/devices/bus/nubus/nubus_specpdq.h13
-rw-r--r--src/devices/bus/nubus/nubus_vikbw.cpp170
-rw-r--r--src/devices/bus/nubus/nubus_vikbw.h12
-rw-r--r--src/devices/bus/nubus/pds30_30hr.cpp760
-rw-r--r--src/devices/bus/nubus/pds30_30hr.h16
-rw-r--r--src/devices/bus/nubus/pds30_cb264.cpp276
-rw-r--r--src/devices/bus/nubus/pds30_cb264.h12
-rw-r--r--src/devices/bus/nubus/pds30_procolor816.cpp365
-rw-r--r--src/devices/bus/nubus/pds30_procolor816.h15
-rw-r--r--src/devices/bus/nubus/pwrbkduo/cards.cpp29
-rw-r--r--src/devices/bus/nubus/pwrbkduo/cards.h16
-rw-r--r--src/devices/bus/nubus/pwrbkduo/duodock.cpp809
-rw-r--r--src/devices/bus/nubus/pwrbkduo/duodock.h12
-rw-r--r--src/devices/bus/nubus/pwrbkduo/ethernetudock.cpp104
-rw-r--r--src/devices/bus/nubus/pwrbkduo/ethernetudock.h12
-rw-r--r--src/devices/bus/nubus/pwrbkduo/floppydock.cpp127
-rw-r--r--src/devices/bus/nubus/pwrbkduo/floppydock.h12
-rw-r--r--src/devices/bus/nubus/pwrbkduo/pwrbkduo.cpp58
-rw-r--r--src/devices/bus/nubus/pwrbkduo/pwrbkduo.h112
-rw-r--r--src/devices/bus/nubus/quadralink.cpp186
-rw-r--r--src/devices/bus/nubus/quadralink.h12
-rw-r--r--src/devices/bus/nubus/supermac.cpp167
-rw-r--r--src/devices/bus/nubus/supermac.h70
-rw-r--r--src/devices/bus/nubus/thunder4gx.cpp905
-rw-r--r--src/devices/bus/nubus/thunder4gx.h13
-rw-r--r--src/devices/bus/odyssey2/4in1.cpp79
-rw-r--r--src/devices/bus/odyssey2/4in1.h18
-rw-r--r--src/devices/bus/odyssey2/chess.cpp139
-rw-r--r--src/devices/bus/odyssey2/chess.h18
-rw-r--r--src/devices/bus/odyssey2/homecomp.cpp253
-rw-r--r--src/devices/bus/odyssey2/homecomp.h18
-rw-r--r--src/devices/bus/odyssey2/ktaa.cpp88
-rw-r--r--src/devices/bus/odyssey2/ktaa.h18
-rw-r--r--src/devices/bus/odyssey2/rally.cpp142
-rw-r--r--src/devices/bus/odyssey2/rally.h19
-rw-r--r--src/devices/bus/odyssey2/rom.cpp67
-rw-r--r--src/devices/bus/odyssey2/rom.h18
-rw-r--r--src/devices/bus/odyssey2/slot.cpp313
-rw-r--r--src/devices/bus/odyssey2/slot.h159
-rw-r--r--src/devices/bus/odyssey2/test.cpp92
-rw-r--r--src/devices/bus/odyssey2/test.h18
-rw-r--r--src/devices/bus/odyssey2/voice.cpp157
-rw-r--r--src/devices/bus/odyssey2/voice.h18
-rw-r--r--src/devices/bus/oricext/jasmin.cpp150
-rw-r--r--src/devices/bus/oricext/jasmin.h49
-rw-r--r--src/devices/bus/oricext/microdisc.cpp136
-rw-r--r--src/devices/bus/oricext/microdisc.h56
-rw-r--r--src/devices/bus/oricext/oricext.cpp88
-rw-r--r--src/devices/bus/oricext/oricext.h73
-rw-r--r--src/devices/bus/pasopia/pac2.cpp159
-rw-r--r--src/devices/bus/pasopia/pac2.h80
-rw-r--r--src/devices/bus/pasopia/pac2exp.cpp92
-rw-r--r--src/devices/bus/pasopia/pac2exp.h44
-rw-r--r--src/devices/bus/pasopia/rampac2.cpp151
-rw-r--r--src/devices/bus/pasopia/rampac2.h76
-rw-r--r--src/devices/bus/pasopia/rompac2.cpp98
-rw-r--r--src/devices/bus/pasopia/rompac2.h44
-rw-r--r--src/devices/bus/pc1512/mouse.cpp113
-rw-r--r--src/devices/bus/pc1512/mouse.h121
-rw-r--r--src/devices/bus/pc8801/README.md39
-rw-r--r--src/devices/bus/pc8801/gsx8800.cpp54
-rw-r--r--src/devices/bus/pc8801/gsx8800.h30
-rw-r--r--src/devices/bus/pc8801/hmb20.cpp42
-rw-r--r--src/devices/bus/pc8801/hmb20.h28
-rw-r--r--src/devices/bus/pc8801/jmbx1.cpp58
-rw-r--r--src/devices/bus/pc8801/jmbx1.h31
-rw-r--r--src/devices/bus/pc8801/pc8801_23.cpp89
-rw-r--r--src/devices/bus/pc8801/pc8801_23.h42
-rw-r--r--src/devices/bus/pc8801/pc8801_31.cpp332
-rw-r--r--src/devices/bus/pc8801/pc8801_31.h81
-rw-r--r--src/devices/bus/pc8801/pc8801_exp.cpp94
-rw-r--r--src/devices/bus/pc8801/pc8801_exp.h91
-rw-r--r--src/devices/bus/pc8801/pcg8100.cpp109
-rw-r--r--src/devices/bus/pc8801/pcg8100.h44
-rw-r--r--src/devices/bus/pc98_54simm/README.md16
-rw-r--r--src/devices/bus/pc98_54simm/options.cpp27
-rw-r--r--src/devices/bus/pc98_54simm/options.h13
-rw-r--r--src/devices/bus/pc98_54simm/simm.cpp90
-rw-r--r--src/devices/bus/pc98_54simm/simm.h80
-rw-r--r--src/devices/bus/pc98_54simm/slot.cpp91
-rw-r--r--src/devices/bus/pc98_54simm/slot.h64
-rw-r--r--src/devices/bus/pc98_61simm/options.cpp28
-rw-r--r--src/devices/bus/pc98_61simm/options.h13
-rw-r--r--src/devices/bus/pc98_61simm/simm.cpp99
-rw-r--r--src/devices/bus/pc98_61simm/simm.h90
-rw-r--r--src/devices/bus/pc98_61simm/slot.cpp113
-rw-r--r--src/devices/bus/pc98_61simm/slot.h69
-rw-r--r--src/devices/bus/pc98_cbus/amd98.cpp202
-rw-r--r--src/devices/bus/pc98_cbus/amd98.h60
-rw-r--r--src/devices/bus/pc98_cbus/fdd_2dd.cpp164
-rw-r--r--src/devices/bus/pc98_cbus/fdd_2dd.h57
-rw-r--r--src/devices/bus/pc98_cbus/fdd_2hd.cpp73
-rw-r--r--src/devices/bus/pc98_cbus/fdd_2hd.h43
-rw-r--r--src/devices/bus/pc98_cbus/lgy98.cpp134
-rw-r--r--src/devices/bus/pc98_cbus/lgy98.h47
-rw-r--r--src/devices/bus/pc98_cbus/lha201.cpp230
-rw-r--r--src/devices/bus/pc98_cbus/lha201.h49
-rw-r--r--src/devices/bus/pc98_cbus/mif201.cpp82
-rw-r--r--src/devices/bus/pc98_cbus/mif201.h37
-rw-r--r--src/devices/bus/pc98_cbus/mpu_pc98.cpp93
-rw-r--r--src/devices/bus/pc98_cbus/mpu_pc98.h47
-rw-r--r--src/devices/bus/pc98_cbus/options.cpp119
-rw-r--r--src/devices/bus/pc98_cbus/options.h15
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_02.cpp140
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_02.h95
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_118.cpp179
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_118.h59
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_14.cpp168
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_14.h45
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_26.cpp201
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_26.h60
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_27.cpp359
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_27.h73
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_55.cpp358
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_55.h100
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_86.cpp546
-rw-r--r--src/devices/bus/pc98_cbus/pc9801_86.h115
-rw-r--r--src/devices/bus/pc98_cbus/pcfxga.cpp63
-rw-r--r--src/devices/bus/pc98_cbus/pcfxga.h33
-rw-r--r--src/devices/bus/pc98_cbus/sb16_ct2720.cpp131
-rw-r--r--src/devices/bus/pc98_cbus/sb16_ct2720.h53
-rw-r--r--src/devices/bus/pc98_cbus/slot.cpp217
-rw-r--r--src/devices/bus/pc98_cbus/slot.h178
-rw-r--r--src/devices/bus/pc98_cbus/sound.cpp244
-rw-r--r--src/devices/bus/pc98_cbus/sound.h75
-rw-r--r--src/devices/bus/pc98_cbus/sound_orchestra.cpp80
-rw-r--r--src/devices/bus/pc98_cbus/sound_orchestra.h43
-rw-r--r--src/devices/bus/pc98_cbus/speakboard.cpp134
-rw-r--r--src/devices/bus/pc98_cbus/speakboard.h40
-rw-r--r--src/devices/bus/pc98_cbus/wavestar.cpp99
-rw-r--r--src/devices/bus/pc98_cbus/wavestar.h39
-rw-r--r--src/devices/bus/pc_joy/pc_joy.cpp106
-rw-r--r--src/devices/bus/pc_joy/pc_joy.h81
-rw-r--r--src/devices/bus/pc_joy/pc_joy_magnum6.cpp41
-rw-r--r--src/devices/bus/pc_joy/pc_joy_magnum6.h24
-rw-r--r--src/devices/bus/pc_joy/pc_joy_sw.cpp182
-rw-r--r--src/devices/bus/pc_joy/pc_joy_sw.h39
-rw-r--r--src/devices/bus/pc_kbd/cherry_mx1500.cpp333
-rw-r--r--src/devices/bus/pc_kbd/cherry_mx1500.h44
-rw-r--r--src/devices/bus/pc_kbd/ec1841.cpp454
-rw-r--r--src/devices/bus/pc_kbd/ec1841.h65
-rw-r--r--src/devices/bus/pc_kbd/hle_mouse.cpp537
-rw-r--r--src/devices/bus/pc_kbd/hle_mouse.h98
-rw-r--r--src/devices/bus/pc_kbd/iskr1030.cpp491
-rw-r--r--src/devices/bus/pc_kbd/iskr1030.h94
-rw-r--r--src/devices/bus/pc_kbd/keyboards.cpp40
-rw-r--r--src/devices/bus/pc_kbd/keyboards.h40
-rw-r--r--src/devices/bus/pc_kbd/keytro.cpp637
-rw-r--r--src/devices/bus/pc_kbd/keytro.h86
-rw-r--r--src/devices/bus/pc_kbd/msnat.cpp388
-rw-r--r--src/devices/bus/pc_kbd/msnat.h64
-rw-r--r--src/devices/bus/pc_kbd/pc83.cpp363
-rw-r--r--src/devices/bus/pc_kbd/pc83.h64
-rw-r--r--src/devices/bus/pc_kbd/pc_kbdc.cpp193
-rw-r--r--src/devices/bus/pc_kbd/pc_kbdc.h106
-rw-r--r--src/devices/bus/pc_kbd/pcat101.cpp310
-rw-r--r--src/devices/bus/pc_kbd/pcat101.h56
-rw-r--r--src/devices/bus/pc_kbd/pcat84.cpp571
-rw-r--r--src/devices/bus/pc_kbd/pcat84.h98
-rw-r--r--src/devices/bus/pc_kbd/pcxt83.cpp423
-rw-r--r--src/devices/bus/pc_kbd/pcxt83.h69
-rw-r--r--src/devices/bus/pccard/ataflash.cpp398
-rw-r--r--src/devices/bus/pccard/ataflash.h104
-rw-r--r--src/devices/bus/pccard/k573npu.cpp101
-rw-r--r--src/devices/bus/pccard/k573npu.h29
-rw-r--r--src/devices/bus/pccard/konami_dual.cpp93
-rw-r--r--src/devices/bus/pccard/konami_dual.h30
-rw-r--r--src/devices/bus/pccard/linflash.cpp249
-rw-r--r--src/devices/bus/pccard/linflash.h124
-rw-r--r--src/devices/bus/pccard/pccard.cpp122
-rw-r--r--src/devices/bus/pccard/pccard.h84
-rw-r--r--src/devices/bus/pccard/sram.cpp413
-rw-r--r--src/devices/bus/pccard/sram.h165
-rw-r--r--src/devices/bus/pce/pce_acard.cpp232
-rw-r--r--src/devices/bus/pce/pce_acard.h114
-rw-r--r--src/devices/bus/pce/pce_rom.cpp182
-rw-r--r--src/devices/bus/pce/pce_rom.h104
-rw-r--r--src/devices/bus/pce/pce_scdsys.cpp98
-rw-r--r--src/devices/bus/pce/pce_scdsys.h83
-rw-r--r--src/devices/bus/pce/pce_slot.cpp338
-rw-r--r--src/devices/bus/pce/pce_slot.h114
-rw-r--r--src/devices/bus/pce_ctrl/joypad2.cpp318
-rw-r--r--src/devices/bus/pce_ctrl/joypad2.h19
-rw-r--r--src/devices/bus/pce_ctrl/joypad6.cpp388
-rw-r--r--src/devices/bus/pce_ctrl/joypad6.h19
-rw-r--r--src/devices/bus/pce_ctrl/mouse.cpp137
-rw-r--r--src/devices/bus/pce_ctrl/mouse.h18
-rw-r--r--src/devices/bus/pce_ctrl/multitap.cpp123
-rw-r--r--src/devices/bus/pce_ctrl/multitap.h57
-rw-r--r--src/devices/bus/pce_ctrl/pachinko.cpp151
-rw-r--r--src/devices/bus/pce_ctrl/pachinko.h61
-rw-r--r--src/devices/bus/pce_ctrl/pcectrl.cpp200
-rw-r--r--src/devices/bus/pce_ctrl/pcectrl.h78
-rw-r--r--src/devices/bus/pce_ctrl/xhe3.cpp92
-rw-r--r--src/devices/bus/pce_ctrl/xhe3.h18
-rw-r--r--src/devices/bus/pci/aha2940au.cpp252
-rw-r--r--src/devices/bus/pci/aha2940au.h63
-rw-r--r--src/devices/bus/pci/audiowerk2.cpp95
-rw-r--r--src/devices/bus/pci/audiowerk2.h38
-rw-r--r--src/devices/bus/pci/clgd543x_alpine.cpp187
-rw-r--r--src/devices/bus/pci/clgd543x_alpine.h43
-rw-r--r--src/devices/bus/pci/clgd5446.cpp146
-rw-r--r--src/devices/bus/pci/clgd5446.h47
-rw-r--r--src/devices/bus/pci/clgd546x_laguna.cpp148
-rw-r--r--src/devices/bus/pci/clgd546x_laguna.h48
-rw-r--r--src/devices/bus/pci/cmi8738.cpp88
-rw-r--r--src/devices/bus/pci/cmi8738.h35
-rw-r--r--src/devices/bus/pci/cs4281.cpp88
-rw-r--r--src/devices/bus/pci/cs4281.h34
-rw-r--r--src/devices/bus/pci/ds2416.cpp23
-rw-r--r--src/devices/bus/pci/ds2416.h22
-rw-r--r--src/devices/bus/pci/ess_maestro.cpp119
-rw-r--r--src/devices/bus/pci/ess_maestro.h44
-rw-r--r--src/devices/bus/pci/geforce.cpp114
-rw-r--r--src/devices/bus/pci/geforce.h58
-rw-r--r--src/devices/bus/pci/mga2064w.cpp722
-rw-r--r--src/devices/bus/pci/mga2064w.h100
-rw-r--r--src/devices/bus/pci/ncr53c825.cpp97
-rw-r--r--src/devices/bus/pci/ncr53c825.h39
-rw-r--r--src/devices/bus/pci/neon250.cpp190
-rw-r--r--src/devices/bus/pci/neon250.h53
-rw-r--r--src/devices/bus/pci/opti82c861.cpp81
-rw-r--r--src/devices/bus/pci/opti82c861.h33
-rw-r--r--src/devices/bus/pci/oti_spitfire.cpp148
-rw-r--r--src/devices/bus/pci/oti_spitfire.h47
-rw-r--r--src/devices/bus/pci/pci_slot.cpp207
-rw-r--r--src/devices/bus/pci/pci_slot.h89
-rw-r--r--src/devices/bus/pci/pdc20262.cpp298
-rw-r--r--src/devices/bus/pci/pdc20262.h78
-rw-r--r--src/devices/bus/pci/permedia2.cpp169
-rw-r--r--src/devices/bus/pci/permedia2.h52
-rw-r--r--src/devices/bus/pci/promotion.cpp151
-rw-r--r--src/devices/bus/pci/promotion.h49
-rw-r--r--src/devices/bus/pci/riva128.cpp251
-rw-r--r--src/devices/bus/pci/riva128.h65
-rw-r--r--src/devices/bus/pci/rivatnt.cpp231
-rw-r--r--src/devices/bus/pci/rivatnt.h71
-rw-r--r--src/devices/bus/pci/rtl8029as_pci.cpp79
-rw-r--r--src/devices/bus/pci/rtl8029as_pci.h38
-rw-r--r--src/devices/bus/pci/rtl8139_pci.cpp86
-rw-r--r--src/devices/bus/pci/rtl8139_pci.h37
-rw-r--r--src/devices/bus/pci/sis6326.cpp788
-rw-r--r--src/devices/bus/pci/sis6326.h126
-rw-r--r--src/devices/bus/pci/sonicvibes.cpp162
-rw-r--r--src/devices/bus/pci/sonicvibes.h44
-rw-r--r--src/devices/bus/pci/sw1000xg.cpp93
-rw-r--r--src/devices/bus/pci/sw1000xg.h35
-rw-r--r--src/devices/bus/pci/trident_4dwavedx.cpp894
-rw-r--r--src/devices/bus/pci/trident_4dwavedx.h198
-rw-r--r--src/devices/bus/pci/trio_pci.cpp148
-rw-r--r--src/devices/bus/pci/trio_pci.h50
-rw-r--r--src/devices/bus/pci/virge_pci.cpp361
-rw-r--r--src/devices/bus/pci/virge_pci.h115
-rw-r--r--src/devices/bus/pci/vision.cpp286
-rw-r--r--src/devices/bus/pci/vision.h76
-rw-r--r--src/devices/bus/pci/vt6306.cpp99
-rw-r--r--src/devices/bus/pci/vt6306.h38
-rw-r--r--src/devices/bus/pci/wd9710_pci.cpp136
-rw-r--r--src/devices/bus/pci/wd9710_pci.h49
-rw-r--r--src/devices/bus/pci/ymf740c.cpp120
-rw-r--r--src/devices/bus/pci/ymf740c.h42
-rw-r--r--src/devices/bus/pci/ymp21.cpp219
-rw-r--r--src/devices/bus/pci/ymp21.h58
-rw-r--r--src/devices/bus/pci/zr36057.cpp782
-rw-r--r--src/devices/bus/pci/zr36057.h121
-rw-r--r--src/devices/bus/pencil2/coleco.cpp55
-rw-r--r--src/devices/bus/pencil2/coleco.h13
-rw-r--r--src/devices/bus/pencil2/ram.cpp40
-rw-r--r--src/devices/bus/pencil2/ram.h13
-rw-r--r--src/devices/bus/pencil2/slot.cpp126
-rw-r--r--src/devices/bus/pencil2/slot.h85
-rw-r--r--src/devices/bus/pet/2joysnd.cpp158
-rw-r--r--src/devices/bus/pet/2joysnd.h67
-rw-r--r--src/devices/bus/pet/64k.cpp201
-rw-r--r--src/devices/bus/pet/64k.h53
-rw-r--r--src/devices/bus/pet/c2n.cpp155
-rw-r--r--src/devices/bus/pet/c2n.h84
-rw-r--r--src/devices/bus/pet/cass.cpp102
-rw-r--r--src/devices/bus/pet/cass.h104
-rw-r--r--src/devices/bus/pet/cb2snd.cpp61
-rw-r--r--src/devices/bus/pet/cb2snd.h43
-rw-r--r--src/devices/bus/pet/diag.cpp45
-rw-r--r--src/devices/bus/pet/diag.h54
-rw-r--r--src/devices/bus/pet/diag264_lb_tape.cpp85
-rw-r--r--src/devices/bus/pet/diag264_lb_tape.h50
-rw-r--r--src/devices/bus/pet/exp.cpp188
-rw-r--r--src/devices/bus/pet/exp.h118
-rw-r--r--src/devices/bus/pet/hsg.cpp263
-rw-r--r--src/devices/bus/pet/hsg.h89
-rw-r--r--src/devices/bus/pet/petuja.cpp106
-rw-r--r--src/devices/bus/pet/petuja.h62
-rw-r--r--src/devices/bus/pet/superpet.cpp426
-rw-r--r--src/devices/bus/pet/superpet.h83
-rw-r--r--src/devices/bus/pet/user.cpp114
-rw-r--r--src/devices/bus/pet/user.h173
-rw-r--r--src/devices/bus/plg1x0/plg100-vl.cpp96
-rw-r--r--src/devices/bus/plg1x0/plg100-vl.h15
-rw-r--r--src/devices/bus/plg1x0/plg150-ap.cpp93
-rw-r--r--src/devices/bus/plg1x0/plg150-ap.h15
-rw-r--r--src/devices/bus/plg1x0/plg1x0.cpp50
-rw-r--r--src/devices/bus/plg1x0/plg1x0.h78
-rw-r--r--src/devices/bus/plus4/c1551.cpp553
-rw-r--r--src/devices/bus/plus4/c1551.h105
-rw-r--r--src/devices/bus/plus4/diag264_lb_user.cpp43
-rw-r--r--src/devices/bus/plus4/diag264_lb_user.h57
-rw-r--r--src/devices/bus/plus4/exp.cpp177
-rw-r--r--src/devices/bus/plus4/exp.h143
-rw-r--r--src/devices/bus/plus4/sid.cpp155
-rw-r--r--src/devices/bus/plus4/sid.h57
-rw-r--r--src/devices/bus/plus4/std.cpp70
-rw-r--r--src/devices/bus/plus4/std.h43
-rw-r--r--src/devices/bus/plus4/user.cpp24
-rw-r--r--src/devices/bus/plus4/user.h33
-rw-r--r--src/devices/bus/pofo/ccm.cpp129
-rw-r--r--src/devices/bus/pofo/ccm.h141
-rw-r--r--src/devices/bus/pofo/exp.cpp100
-rw-r--r--src/devices/bus/pofo/exp.h141
-rw-r--r--src/devices/bus/pofo/hpc101.cpp134
-rw-r--r--src/devices/bus/pofo/hpc101.h54
-rw-r--r--src/devices/bus/pofo/hpc102.cpp139
-rw-r--r--src/devices/bus/pofo/hpc102.h58
-rw-r--r--src/devices/bus/pofo/hpc104.cpp244
-rw-r--r--src/devices/bus/pofo/hpc104.h83
-rw-r--r--src/devices/bus/pofo/ram.cpp83
-rw-r--r--src/devices/bus/pofo/ram.h54
-rw-r--r--src/devices/bus/pofo/rom.cpp52
-rw-r--r--src/devices/bus/pofo/rom.h45
-rw-r--r--src/devices/bus/psi_kbd/ergoline.cpp111
-rw-r--r--src/devices/bus/psi_kbd/ergoline.h54
-rw-r--r--src/devices/bus/psi_kbd/hle.cpp314
-rw-r--r--src/devices/bus/psi_kbd/hle.h54
-rw-r--r--src/devices/bus/psi_kbd/psi_kbd.cpp111
-rw-r--r--src/devices/bus/psi_kbd/psi_kbd.h102
-rw-r--r--src/devices/bus/psion/honda/parallel.cpp67
-rw-r--r--src/devices/bus/psion/honda/parallel.h13
-rw-r--r--src/devices/bus/psion/honda/pclink.cpp50
-rw-r--r--src/devices/bus/psion/honda/pclink.h13
-rw-r--r--src/devices/bus/psion/honda/slot.cpp126
-rw-r--r--src/devices/bus/psion/honda/slot.h116
-rw-r--r--src/devices/bus/psion/honda/ssd.cpp59
-rw-r--r--src/devices/bus/psion/honda/ssd.h12
-rw-r--r--src/devices/bus/psion/module/serpar.cpp91
-rw-r--r--src/devices/bus/psion/module/serpar.h13
-rw-r--r--src/devices/bus/psion/module/slot.cpp114
-rw-r--r--src/devices/bus/psion/module/slot.h113
-rw-r--r--src/devices/bus/psion/sibo/3fax.cpp84
-rw-r--r--src/devices/bus/psion/sibo/3fax.h54
-rw-r--r--src/devices/bus/psion/sibo/3link.cpp151
-rw-r--r--src/devices/bus/psion/sibo/3link.h81
-rw-r--r--src/devices/bus/psion/sibo/slot.cpp98
-rw-r--r--src/devices/bus/psion/sibo/slot.h87
-rw-r--r--src/devices/bus/psx/analogue.cpp269
-rw-r--r--src/devices/bus/psx/analogue.h60
-rw-r--r--src/devices/bus/psx/ctlrport.cpp237
-rw-r--r--src/devices/bus/psx/ctlrport.h151
-rw-r--r--src/devices/bus/psx/gamebooster.cpp144
-rw-r--r--src/devices/bus/psx/gamebooster.h52
-rw-r--r--src/devices/bus/psx/memcard.cpp373
-rw-r--r--src/devices/bus/psx/memcard.h68
-rw-r--r--src/devices/bus/psx/multitap.cpp276
-rw-r--r--src/devices/bus/psx/multitap.h43
-rw-r--r--src/devices/bus/psx/parallel.cpp107
-rw-r--r--src/devices/bus/psx/parallel.h67
-rw-r--r--src/devices/bus/qbus/bk_altpro.cpp197
-rw-r--r--src/devices/bus/qbus/bk_altpro.h19
-rw-r--r--src/devices/bus/qbus/bk_irps.cpp105
-rw-r--r--src/devices/bus/qbus/bk_irps.h19
-rw-r--r--src/devices/bus/qbus/bk_kmd.cpp132
-rw-r--r--src/devices/bus/qbus/bk_kmd.h20
-rw-r--r--src/devices/bus/qbus/bk_samara.cpp173
-rw-r--r--src/devices/bus/qbus/bk_samara.h19
-rw-r--r--src/devices/bus/qbus/dsd4432.cpp255
-rw-r--r--src/devices/bus/qbus/dsd4432.h46
-rw-r--r--src/devices/bus/qbus/dvk_dwhle.cpp572
-rw-r--r--src/devices/bus/qbus/dvk_dwhle.h19
-rw-r--r--src/devices/bus/qbus/dvk_kgd.cpp219
-rw-r--r--src/devices/bus/qbus/dvk_kgd.h19
-rw-r--r--src/devices/bus/qbus/dvk_kmd.cpp392
-rw-r--r--src/devices/bus/qbus/dvk_kmd.h19
-rw-r--r--src/devices/bus/qbus/dvk_ktlk.cpp186
-rw-r--r--src/devices/bus/qbus/dvk_ktlk.h19
-rw-r--r--src/devices/bus/qbus/dvk_mx.cpp940
-rw-r--r--src/devices/bus/qbus/dvk_mx.h19
-rw-r--r--src/devices/bus/qbus/pc11.cpp241
-rw-r--r--src/devices/bus/qbus/pc11.h85
-rw-r--r--src/devices/bus/qbus/qbus.cpp232
-rw-r--r--src/devices/bus/qbus/qbus.h177
-rw-r--r--src/devices/bus/qbus/qg640.cpp106
-rw-r--r--src/devices/bus/qbus/qg640.h54
-rw-r--r--src/devices/bus/qbus/qtx.cpp153
-rw-r--r--src/devices/bus/qbus/qtx.h52
-rw-r--r--src/devices/bus/qbus/tdl12.cpp137
-rw-r--r--src/devices/bus/qbus/tdl12.h42
-rw-r--r--src/devices/bus/qbus/terak_v.cpp460
-rw-r--r--src/devices/bus/qbus/terak_v.h19
-rw-r--r--src/devices/bus/qbus/uknc_kmd.cpp87
-rw-r--r--src/devices/bus/qbus/uknc_kmd.h43
-rw-r--r--src/devices/bus/qic02/qic02.cpp106
-rw-r--r--src/devices/bus/qic02/qic02.h123
-rw-r--r--src/devices/bus/ql/cst_q_plus4.cpp135
-rw-r--r--src/devices/bus/ql/cst_q_plus4.h67
-rw-r--r--src/devices/bus/ql/cst_qdisc.cpp86
-rw-r--r--src/devices/bus/ql/cst_qdisc.h48
-rw-r--r--src/devices/bus/ql/cumana_fdi.cpp86
-rw-r--r--src/devices/bus/ql/cumana_fdi.h46
-rw-r--r--src/devices/bus/ql/exp.cpp117
-rw-r--r--src/devices/bus/ql/exp.h130
-rw-r--r--src/devices/bus/ql/kempston_di.cpp84
-rw-r--r--src/devices/bus/ql/kempston_di.h47
-rw-r--r--src/devices/bus/ql/miracle_gold_card.cpp86
-rw-r--r--src/devices/bus/ql/miracle_gold_card.h47
-rw-r--r--src/devices/bus/ql/miracle_hd.cpp84
-rw-r--r--src/devices/bus/ql/miracle_hd.h47
-rw-r--r--src/devices/bus/ql/mp_fdi.cpp84
-rw-r--r--src/devices/bus/ql/mp_fdi.h45
-rw-r--r--src/devices/bus/ql/opd_basic_master.cpp82
-rw-r--r--src/devices/bus/ql/opd_basic_master.h46
-rw-r--r--src/devices/bus/ql/pcml_qdisk.cpp84
-rw-r--r--src/devices/bus/ql/pcml_qdisk.h46
-rw-r--r--src/devices/bus/ql/qubide.cpp278
-rw-r--r--src/devices/bus/ql/qubide.h59
-rw-r--r--src/devices/bus/ql/rom.cpp138
-rw-r--r--src/devices/bus/ql/rom.h114
-rw-r--r--src/devices/bus/ql/sandy_superdisk.cpp271
-rw-r--r--src/devices/bus/ql/sandy_superdisk.h68
-rw-r--r--src/devices/bus/ql/sandy_superqboard.cpp439
-rw-r--r--src/devices/bus/ql/sandy_superqboard.h128
-rw-r--r--src/devices/bus/ql/std.cpp58
-rw-r--r--src/devices/bus/ql/std.h42
-rw-r--r--src/devices/bus/ql/trumpcard.cpp281
-rw-r--r--src/devices/bus/ql/trumpcard.h97
-rw-r--r--src/devices/bus/rc2014/cf.cpp67
-rw-r--r--src/devices/bus/rc2014/cf.h18
-rw-r--r--src/devices/bus/rc2014/clock.cpp230
-rw-r--r--src/devices/bus/rc2014/clock.h20
-rw-r--r--src/devices/bus/rc2014/edge.cpp203
-rw-r--r--src/devices/bus/rc2014/edge.h23
-rw-r--r--src/devices/bus/rc2014/fdc.cpp232
-rw-r--r--src/devices/bus/rc2014/fdc.h19
-rw-r--r--src/devices/bus/rc2014/ide.cpp295
-rw-r--r--src/devices/bus/rc2014/ide.h19
-rw-r--r--src/devices/bus/rc2014/micro.cpp303
-rw-r--r--src/devices/bus/rc2014/micro.h19
-rw-r--r--src/devices/bus/rc2014/modules.cpp88
-rw-r--r--src/devices/bus/rc2014/modules.h22
-rw-r--r--src/devices/bus/rc2014/ram.cpp216
-rw-r--r--src/devices/bus/rc2014/ram.h20
-rw-r--r--src/devices/bus/rc2014/rc2014.cpp361
-rw-r--r--src/devices/bus/rc2014/rc2014.h321
-rw-r--r--src/devices/bus/rc2014/rom.cpp262
-rw-r--r--src/devices/bus/rc2014/rom.h19
-rw-r--r--src/devices/bus/rc2014/romram.cpp226
-rw-r--r--src/devices/bus/rc2014/romram.h19
-rw-r--r--src/devices/bus/rc2014/rtc.cpp107
-rw-r--r--src/devices/bus/rc2014/rtc.h18
-rw-r--r--src/devices/bus/rc2014/serial.cpp274
-rw-r--r--src/devices/bus/rc2014/serial.h20
-rw-r--r--src/devices/bus/rc2014/sound_ym_ay.cpp207
-rw-r--r--src/devices/bus/rc2014/sound_ym_ay.h19
-rw-r--r--src/devices/bus/rc2014/z180cpu.cpp135
-rw-r--r--src/devices/bus/rc2014/z180cpu.h18
-rw-r--r--src/devices/bus/rc2014/z80cpu.cpp135
-rw-r--r--src/devices/bus/rc2014/z80cpu.h19
-rw-r--r--src/devices/bus/rs232/exorterm.cpp86
-rw-r--r--src/devices/bus/rs232/exorterm.h40
-rw-r--r--src/devices/bus/rs232/heath_h19.cpp64
-rw-r--r--src/devices/bus/rs232/heath_h19.h13
-rw-r--r--src/devices/bus/rs232/hlemouse.cpp723
-rw-r--r--src/devices/bus/rs232/hlemouse.h237
-rw-r--r--src/devices/bus/rs232/ie15.cpp64
-rw-r--r--src/devices/bus/rs232/ie15.h14
-rw-r--r--src/devices/bus/rs232/keyboard.cpp90
-rw-r--r--src/devices/bus/rs232/keyboard.h43
-rw-r--r--src/devices/bus/rs232/loopback.cpp96
-rw-r--r--src/devices/bus/rs232/loopback.h41
-rw-r--r--src/devices/bus/rs232/mboardd.cpp144
-rw-r--r--src/devices/bus/rs232/mboardd.h12
-rw-r--r--src/devices/bus/rs232/nss_tvinterface.cpp273
-rw-r--r--src/devices/bus/rs232/nss_tvinterface.h18
-rw-r--r--src/devices/bus/rs232/null_modem.cpp206
-rw-r--r--src/devices/bus/rs232/null_modem.h60
-rw-r--r--src/devices/bus/rs232/patchbox.cpp214
-rw-r--r--src/devices/bus/rs232/patchbox.h13
-rw-r--r--src/devices/bus/rs232/printer.cpp100
-rw-r--r--src/devices/bus/rs232/printer.h53
-rw-r--r--src/devices/bus/rs232/pty.cpp162
-rw-r--r--src/devices/bus/rs232/pty.h55
-rw-r--r--src/devices/bus/rs232/rs232.cpp199
-rw-r--r--src/devices/bus/rs232/rs232.h313
-rw-r--r--src/devices/bus/rs232/rs232_sync_io.cpp201
-rw-r--r--src/devices/bus/rs232/rs232_sync_io.h62
-rw-r--r--src/devices/bus/rs232/scorpion.cpp199
-rw-r--r--src/devices/bus/rs232/scorpion.h13
-rw-r--r--src/devices/bus/rs232/sun_kbd.cpp51
-rw-r--r--src/devices/bus/rs232/sun_kbd.h13
-rw-r--r--src/devices/bus/rs232/swtpc8212.cpp87
-rw-r--r--src/devices/bus/rs232/swtpc8212.h40
-rw-r--r--src/devices/bus/rs232/teletex800.cpp161
-rw-r--r--src/devices/bus/rs232/teletex800.h13
-rw-r--r--src/devices/bus/rs232/terminal.cpp118
-rw-r--r--src/devices/bus/rs232/terminal.h13
-rw-r--r--src/devices/bus/rs232/votraxtnt.cpp51
-rw-r--r--src/devices/bus/rs232/votraxtnt.h13
-rw-r--r--src/devices/bus/rs232/xvd701.cpp304
-rw-r--r--src/devices/bus/rs232/xvd701.h71
-rw-r--r--src/devices/bus/s100/am310.cpp378
-rw-r--r--src/devices/bus/s100/am310.h18
-rw-r--r--src/devices/bus/s100/ascsasi.cpp366
-rw-r--r--src/devices/bus/s100/ascsasi.h18
-rw-r--r--src/devices/bus/s100/dg640.cpp218
-rw-r--r--src/devices/bus/s100/dg640.h49
-rw-r--r--src/devices/bus/s100/dj2db.cpp509
-rw-r--r--src/devices/bus/s100/dj2db.h87
-rw-r--r--src/devices/bus/s100/djdma.cpp346
-rw-r--r--src/devices/bus/s100/djdma.h72
-rw-r--r--src/devices/bus/s100/mm65k16s.cpp267
-rw-r--r--src/devices/bus/s100/mm65k16s.h53
-rw-r--r--src/devices/bus/s100/nsmdsa.cpp111
-rw-r--r--src/devices/bus/s100/nsmdsa.h54
-rw-r--r--src/devices/bus/s100/nsmdsad.cpp113
-rw-r--r--src/devices/bus/s100/nsmdsad.h55
-rw-r--r--src/devices/bus/s100/poly16k.cpp137
-rw-r--r--src/devices/bus/s100/poly16k.h18
-rw-r--r--src/devices/bus/s100/polyfdc.cpp125
-rw-r--r--src/devices/bus/s100/polyfdc.h18
-rw-r--r--src/devices/bus/s100/polyvti.cpp343
-rw-r--r--src/devices/bus/s100/polyvti.h18
-rw-r--r--src/devices/bus/s100/s100.cpp175
-rw-r--r--src/devices/bus/s100/s100.h244
-rw-r--r--src/devices/bus/s100/seals8k.cpp225
-rw-r--r--src/devices/bus/s100/seals8k.h19
-rw-r--r--src/devices/bus/s100/vectordualmode.cpp358
-rw-r--r--src/devices/bus/s100/vectordualmode.h54
-rw-r--r--src/devices/bus/s100/wunderbus.cpp525
-rw-r--r--src/devices/bus/s100/wunderbus.h70
-rw-r--r--src/devices/bus/saitek_osa/bruteforce.cpp188
-rw-r--r--src/devices/bus/saitek_osa/bruteforce.h18
-rw-r--r--src/devices/bus/saitek_osa/expansion.cpp169
-rw-r--r--src/devices/bus/saitek_osa/expansion.h123
-rw-r--r--src/devices/bus/saitek_osa/maestro.cpp437
-rw-r--r--src/devices/bus/saitek_osa/maestro.h19
-rw-r--r--src/devices/bus/saitek_osa/maestroa.cpp231
-rw-r--r--src/devices/bus/saitek_osa/maestroa.h18
-rw-r--r--src/devices/bus/saitek_osa/sparc.cpp237
-rw-r--r--src/devices/bus/saitek_osa/sparc.h18
-rw-r--r--src/devices/bus/samcoupe/drive/atom.cpp120
-rw-r--r--src/devices/bus/samcoupe/drive/atom.h48
-rw-r--r--src/devices/bus/samcoupe/drive/drive.cpp94
-rw-r--r--src/devices/bus/samcoupe/drive/drive.h93
-rw-r--r--src/devices/bus/samcoupe/drive/floppy.cpp93
-rw-r--r--src/devices/bus/samcoupe/drive/floppy.h49
-rw-r--r--src/devices/bus/samcoupe/drive/modules.cpp19
-rw-r--r--src/devices/bus/samcoupe/drive/modules.h16
-rw-r--r--src/devices/bus/samcoupe/expansion/blue_sampler.cpp115
-rw-r--r--src/devices/bus/samcoupe/expansion/blue_sampler.h54
-rw-r--r--src/devices/bus/samcoupe/expansion/dallas.cpp85
-rw-r--r--src/devices/bus/samcoupe/expansion/dallas.h49
-rw-r--r--src/devices/bus/samcoupe/expansion/expansion.cpp121
-rw-r--r--src/devices/bus/samcoupe/expansion/expansion.h125
-rw-r--r--src/devices/bus/samcoupe/expansion/modules.cpp32
-rw-r--r--src/devices/bus/samcoupe/expansion/modules.h16
-rw-r--r--src/devices/bus/samcoupe/expansion/onemeg.cpp110
-rw-r--r--src/devices/bus/samcoupe/expansion/onemeg.h52
-rw-r--r--src/devices/bus/samcoupe/expansion/sambus.cpp116
-rw-r--r--src/devices/bus/samcoupe/expansion/sambus.h53
-rw-r--r--src/devices/bus/samcoupe/expansion/sdide.cpp116
-rw-r--r--src/devices/bus/samcoupe/expansion/sdide.h49
-rw-r--r--src/devices/bus/samcoupe/expansion/sid.cpp90
-rw-r--r--src/devices/bus/samcoupe/expansion/sid.h67
-rw-r--r--src/devices/bus/samcoupe/expansion/spi.cpp120
-rw-r--r--src/devices/bus/samcoupe/expansion/spi.h54
-rw-r--r--src/devices/bus/samcoupe/expansion/voicebox.cpp88
-rw-r--r--src/devices/bus/samcoupe/expansion/voicebox.h46
-rw-r--r--src/devices/bus/samcoupe/mouse/modules.cpp17
-rw-r--r--src/devices/bus/samcoupe/mouse/modules.h16
-rw-r--r--src/devices/bus/samcoupe/mouse/mouse.cpp137
-rw-r--r--src/devices/bus/samcoupe/mouse/mouse.h54
-rw-r--r--src/devices/bus/samcoupe/mouse/mouseport.cpp89
-rw-r--r--src/devices/bus/samcoupe/mouse/mouseport.h89
-rw-r--r--src/devices/bus/sat_ctrl/analog.cpp123
-rw-r--r--src/devices/bus/sat_ctrl/analog.h54
-rw-r--r--src/devices/bus/sat_ctrl/ctrl.cpp147
-rw-r--r--src/devices/bus/sat_ctrl/ctrl.h76
-rw-r--r--src/devices/bus/sat_ctrl/joy.cpp111
-rw-r--r--src/devices/bus/sat_ctrl/joy.h52
-rw-r--r--src/devices/bus/sat_ctrl/joy_md.cpp122
-rw-r--r--src/devices/bus/sat_ctrl/joy_md.h80
-rw-r--r--src/devices/bus/sat_ctrl/keybd.cpp332
-rw-r--r--src/devices/bus/sat_ctrl/keybd.h60
-rw-r--r--src/devices/bus/sat_ctrl/mouse.cpp120
-rw-r--r--src/devices/bus/sat_ctrl/mouse.h53
-rw-r--r--src/devices/bus/sat_ctrl/multitap.cpp52
-rw-r--r--src/devices/bus/sat_ctrl/multitap.h46
-rw-r--r--src/devices/bus/sat_ctrl/pointer.cpp120
-rw-r--r--src/devices/bus/sat_ctrl/pointer.h53
-rw-r--r--src/devices/bus/sat_ctrl/racing.cpp109
-rw-r--r--src/devices/bus/sat_ctrl/racing.h52
-rw-r--r--src/devices/bus/sat_ctrl/segatap.cpp51
-rw-r--r--src/devices/bus/sat_ctrl/segatap.h47
-rw-r--r--src/devices/bus/saturn/bram.cpp123
-rw-r--r--src/devices/bus/saturn/bram.h70
-rw-r--r--src/devices/bus/saturn/dram.cpp94
-rw-r--r--src/devices/bus/saturn/dram.h50
-rw-r--r--src/devices/bus/saturn/rom.cpp53
-rw-r--r--src/devices/bus/saturn/rom.h32
-rw-r--r--src/devices/bus/saturn/sat_slot.cpp264
-rw-r--r--src/devices/bus/saturn/sat_slot.h113
-rw-r--r--src/devices/bus/sbus/artecon.cpp72
-rw-r--r--src/devices/bus/sbus/artecon.h45
-rw-r--r--src/devices/bus/sbus/bwtwo.cpp118
-rw-r--r--src/devices/bus/sbus/bwtwo.h52
-rw-r--r--src/devices/bus/sbus/cgsix.cpp1379
-rw-r--r--src/devices/bus/sbus/cgsix.h555
-rw-r--r--src/devices/bus/sbus/cgthree.cpp121
-rw-r--r--src/devices/bus/sbus/cgthree.h57
-rw-r--r--src/devices/bus/sbus/hme.cpp71
-rw-r--r--src/devices/bus/sbus/hme.h45
-rw-r--r--src/devices/bus/sbus/sbus.cpp199
-rw-r--r--src/devices/bus/sbus/sbus.h154
-rw-r--r--src/devices/bus/sbus/sunpc.cpp71
-rw-r--r--src/devices/bus/sbus/sunpc.h45
-rw-r--r--src/devices/bus/scsi/acb4070.cpp64
-rw-r--r--src/devices/bus/scsi/acb4070.h47
-rw-r--r--src/devices/bus/scsi/cdu76s.cpp62
-rw-r--r--src/devices/bus/scsi/cdu76s.h34
-rw-r--r--src/devices/bus/scsi/d9060hd.cpp37
-rw-r--r--src/devices/bus/scsi/d9060hd.h22
-rw-r--r--src/devices/bus/scsi/omti5100.cpp181
-rw-r--r--src/devices/bus/scsi/omti5100.h32
-rw-r--r--src/devices/bus/scsi/s1410.cpp360
-rw-r--r--src/devices/bus/scsi/s1410.h42
-rw-r--r--src/devices/bus/scsi/sa1403d.cpp139
-rw-r--r--src/devices/bus/scsi/sa1403d.h37
-rw-r--r--src/devices/bus/scsi/scsi.cpp699
-rw-r--r--src/devices/bus/scsi/scsi.h260
-rw-r--r--src/devices/bus/scsi/scsicd.cpp49
-rw-r--r--src/devices/bus/scsi/scsicd.h32
-rw-r--r--src/devices/bus/scsi/scsicd512.cpp102
-rw-r--r--src/devices/bus/scsi/scsicd512.h86
-rw-r--r--src/devices/bus/scsi/scsihd.cpp40
-rw-r--r--src/devices/bus/scsi/scsihd.h33
-rw-r--r--src/devices/bus/scsi/scsihle.cpp600
-rw-r--r--src/devices/bus/scsi/scsihle.h92
-rw-r--r--src/devices/bus/scv/rom.cpp243
-rw-r--r--src/devices/bus/scv/rom.h20
-rw-r--r--src/devices/bus/scv/slot.cpp218
-rw-r--r--src/devices/bus/scv/slot.h88
-rw-r--r--src/devices/bus/sdk85/i8755.cpp65
-rw-r--r--src/devices/bus/sdk85/i8755.h40
-rw-r--r--src/devices/bus/sdk85/memexp.cpp94
-rw-r--r--src/devices/bus/sdk85/memexp.h73
-rw-r--r--src/devices/bus/sega8/ccatch.cpp59
-rw-r--r--src/devices/bus/sega8/ccatch.h34
-rw-r--r--src/devices/bus/sega8/mgear.cpp45
-rw-r--r--src/devices/bus/sega8/mgear.h40
-rw-r--r--src/devices/bus/sega8/rom.cpp1333
-rw-r--r--src/devices/bus/sega8/rom.h527
-rw-r--r--src/devices/bus/sega8/sega8_slot.cpp943
-rw-r--r--src/devices/bus/sega8/sega8_slot.h332
-rw-r--r--src/devices/bus/segaai/rom.cpp93
-rw-r--r--src/devices/bus/segaai/rom.h14
-rw-r--r--src/devices/bus/segaai/segaai_exp.cpp48
-rw-r--r--src/devices/bus/segaai/segaai_exp.h60
-rw-r--r--src/devices/bus/segaai/segaai_slot.cpp99
-rw-r--r--src/devices/bus/segaai/segaai_slot.h70
-rw-r--r--src/devices/bus/segaai/soundbox.cpp319
-rw-r--r--src/devices/bus/segaai/soundbox.h14
-rw-r--r--src/devices/bus/sg1000_exp/fm_unit.cpp171
-rw-r--r--src/devices/bus/sg1000_exp/fm_unit.h57
-rw-r--r--src/devices/bus/sg1000_exp/kblink.cpp167
-rw-r--r--src/devices/bus/sg1000_exp/kblink.h84
-rw-r--r--src/devices/bus/sg1000_exp/sg1000exp.cpp129
-rw-r--r--src/devices/bus/sg1000_exp/sg1000exp.h83
-rw-r--r--src/devices/bus/sg1000_exp/sk1100.cpp444
-rw-r--r--src/devices/bus/sg1000_exp/sk1100.h81
-rw-r--r--src/devices/bus/sg1000_exp/sk1100prn.cpp125
-rw-r--r--src/devices/bus/sg1000_exp/sk1100prn.h84
-rw-r--r--src/devices/bus/sg1000_exp/sp400.cpp233
-rw-r--r--src/devices/bus/sg1000_exp/sp400.h13
-rw-r--r--src/devices/bus/sms_ctrl/controllers.cpp82
-rw-r--r--src/devices/bus/sms_ctrl/controllers.h35
-rw-r--r--src/devices/bus/sms_ctrl/diypaddle.cpp227
-rw-r--r--src/devices/bus/sms_ctrl/diypaddle.h18
-rw-r--r--src/devices/bus/sms_ctrl/graphic.cpp176
-rw-r--r--src/devices/bus/sms_ctrl/graphic.h18
-rw-r--r--src/devices/bus/sms_ctrl/hypershot.cpp66
-rw-r--r--src/devices/bus/sms_ctrl/hypershot.h18
-rw-r--r--src/devices/bus/sms_ctrl/joypad.cpp84
-rw-r--r--src/devices/bus/sms_ctrl/joypad.h18
-rw-r--r--src/devices/bus/sms_ctrl/lphaser.cpp301
-rw-r--r--src/devices/bus/sms_ctrl/lphaser.h18
-rw-r--r--src/devices/bus/sms_ctrl/md6bt.cpp170
-rw-r--r--src/devices/bus/sms_ctrl/md6bt.h18
-rw-r--r--src/devices/bus/sms_ctrl/mdpad.cpp82
-rw-r--r--src/devices/bus/sms_ctrl/mdpad.h18
-rw-r--r--src/devices/bus/sms_ctrl/mouse.cpp264
-rw-r--r--src/devices/bus/sms_ctrl/mouse.h19
-rw-r--r--src/devices/bus/sms_ctrl/multitap.cpp161
-rw-r--r--src/devices/bus/sms_ctrl/multitap.h18
-rw-r--r--src/devices/bus/sms_ctrl/paddle.cpp104
-rw-r--r--src/devices/bus/sms_ctrl/paddle.h18
-rw-r--r--src/devices/bus/sms_ctrl/rfu.cpp169
-rw-r--r--src/devices/bus/sms_ctrl/rfu.h18
-rw-r--r--src/devices/bus/sms_ctrl/rs232adapt.cpp56
-rw-r--r--src/devices/bus/sms_ctrl/rs232adapt.h18
-rw-r--r--src/devices/bus/sms_ctrl/smsctrl.cpp72
-rw-r--r--src/devices/bus/sms_ctrl/smsctrl.h149
-rw-r--r--src/devices/bus/sms_ctrl/sports.cpp205
-rw-r--r--src/devices/bus/sms_ctrl/sports.h18
-rw-r--r--src/devices/bus/sms_ctrl/sportsjp.cpp136
-rw-r--r--src/devices/bus/sms_ctrl/sportsjp.h18
-rw-r--r--src/devices/bus/sms_ctrl/teamplayer.cpp556
-rw-r--r--src/devices/bus/sms_ctrl/teamplayer.h18
-rw-r--r--src/devices/bus/sms_ctrl/xe1ap.cpp107
-rw-r--r--src/devices/bus/sms_ctrl/xe1ap.h19
-rw-r--r--src/devices/bus/sms_exp/gender.cpp101
-rw-r--r--src/devices/bus/sms_exp/gender.h55
-rw-r--r--src/devices/bus/sms_exp/smsexp.cpp92
-rw-r--r--src/devices/bus/sms_exp/smsexp.h86
-rw-r--r--src/devices/bus/snes/bsx.cpp547
-rw-r--r--src/devices/bus/snes/bsx.h161
-rw-r--r--src/devices/bus/snes/event.cpp278
-rw-r--r--src/devices/bus/snes/event.h64
-rw-r--r--src/devices/bus/snes/profighter.cpp266
-rw-r--r--src/devices/bus/snes/profighter.h70
-rw-r--r--src/devices/bus/snes/rom.cpp492
-rw-r--r--src/devices/bus/snes/rom.h226
-rw-r--r--src/devices/bus/snes/rom21.cpp256
-rw-r--r--src/devices/bus/snes/rom21.h72
-rw-r--r--src/devices/bus/snes/sa1.cpp1374
-rw-r--r--src/devices/bus/snes/sa1.h188
-rw-r--r--src/devices/bus/snes/sdd1.cpp614
-rw-r--r--src/devices/bus/snes/sdd1.h189
-rw-r--r--src/devices/bus/snes/sfx.cpp162
-rw-r--r--src/devices/bus/snes/sfx.h71
-rw-r--r--src/devices/bus/snes/sgb.cpp331
-rw-r--r--src/devices/bus/snes/sgb.h105
-rw-r--r--src/devices/bus/snes/snes_carts.cpp77
-rw-r--r--src/devices/bus/snes/snes_carts.h18
-rw-r--r--src/devices/bus/snes/snes_slot.cpp1390
-rw-r--r--src/devices/bus/snes/snes_slot.h306
-rw-r--r--src/devices/bus/snes/spc7110.cpp1694
-rw-r--r--src/devices/bus/snes/spc7110.h217
-rw-r--r--src/devices/bus/snes/st018.cpp157
-rw-r--r--src/devices/bus/snes/st018.h56
-rw-r--r--src/devices/bus/snes/sufami.cpp155
-rw-r--r--src/devices/bus/snes/sufami.h58
-rw-r--r--src/devices/bus/snes/upd.cpp546
-rw-r--r--src/devices/bus/snes/upd.h254
-rw-r--r--src/devices/bus/snes_ctrl/bcbattle.cpp205
-rw-r--r--src/devices/bus/snes_ctrl/bcbattle.h58
-rw-r--r--src/devices/bus/snes_ctrl/ctrl.cpp142
-rw-r--r--src/devices/bus/snes_ctrl/ctrl.h91
-rw-r--r--src/devices/bus/snes_ctrl/joypad.cpp127
-rw-r--r--src/devices/bus/snes_ctrl/joypad.h53
-rw-r--r--src/devices/bus/snes_ctrl/miracle.cpp270
-rw-r--r--src/devices/bus/snes_ctrl/miracle.h72
-rw-r--r--src/devices/bus/snes_ctrl/mouse.cpp243
-rw-r--r--src/devices/bus/snes_ctrl/mouse.h61
-rw-r--r--src/devices/bus/snes_ctrl/multitap.cpp151
-rw-r--r--src/devices/bus/snes_ctrl/multitap.h59
-rw-r--r--src/devices/bus/snes_ctrl/pachinko.cpp112
-rw-r--r--src/devices/bus/snes_ctrl/pachinko.h54
-rw-r--r--src/devices/bus/snes_ctrl/sscope.cpp186
-rw-r--r--src/devices/bus/snes_ctrl/sscope.h58
-rw-r--r--src/devices/bus/snes_ctrl/twintap.cpp115
-rw-r--r--src/devices/bus/snes_ctrl/twintap.h53
-rw-r--r--src/devices/bus/spc1000/exp.cpp83
-rw-r--r--src/devices/bus/spc1000/exp.h58
-rw-r--r--src/devices/bus/spc1000/fdd.cpp219
-rw-r--r--src/devices/bus/spc1000/fdd.h66
-rw-r--r--src/devices/bus/spc1000/vdp.cpp101
-rw-r--r--src/devices/bus/spc1000/vdp.h44
-rw-r--r--src/devices/bus/spectrum/ay/cards.cpp71
-rw-r--r--src/devices/bus/spectrum/ay/cards.h16
-rw-r--r--src/devices/bus/spectrum/ay/slot.cpp131
-rw-r--r--src/devices/bus/spectrum/ay/slot.h83
-rw-r--r--src/devices/bus/spectrum/beta.cpp906
-rw-r--r--src/devices/bus/spectrum/beta.h173
-rw-r--r--src/devices/bus/spectrum/beta128.cpp309
-rw-r--r--src/devices/bus/spectrum/beta128.h73
-rw-r--r--src/devices/bus/spectrum/d40.cpp473
-rw-r--r--src/devices/bus/spectrum/d40.h130
-rw-r--r--src/devices/bus/spectrum/dma/cards.cpp113
-rw-r--r--src/devices/bus/spectrum/dma/cards.h17
-rw-r--r--src/devices/bus/spectrum/dma/slot.cpp118
-rw-r--r--src/devices/bus/spectrum/dma/slot.h98
-rw-r--r--src/devices/bus/spectrum/exp.cpp271
-rw-r--r--src/devices/bus/spectrum/exp.h138
-rw-r--r--src/devices/bus/spectrum/floppyone.cpp317
-rw-r--r--src/devices/bus/spectrum/floppyone.h81
-rw-r--r--src/devices/bus/spectrum/fuller.cpp120
-rw-r--r--src/devices/bus/spectrum/fuller.h63
-rw-r--r--src/devices/bus/spectrum/intf1.cpp204
-rw-r--r--src/devices/bus/spectrum/intf1.h67
-rw-r--r--src/devices/bus/spectrum/intf2.cpp142
-rw-r--r--src/devices/bus/spectrum/intf2.h55
-rw-r--r--src/devices/bus/spectrum/kempdisc.cpp282
-rw-r--r--src/devices/bus/spectrum/kempdisc.h83
-rw-r--r--src/devices/bus/spectrum/kempjoy.cpp81
-rw-r--r--src/devices/bus/spectrum/kempjoy.h49
-rw-r--r--src/devices/bus/spectrum/kempmouse.cpp73
-rw-r--r--src/devices/bus/spectrum/kempmouse.h39
-rw-r--r--src/devices/bus/spectrum/logitek.cpp216
-rw-r--r--src/devices/bus/spectrum/logitek.h73
-rw-r--r--src/devices/bus/spectrum/lprint.cpp522
-rw-r--r--src/devices/bus/spectrum/lprint.h185
-rw-r--r--src/devices/bus/spectrum/melodik.cpp93
-rw-r--r--src/devices/bus/spectrum/melodik.h61
-rw-r--r--src/devices/bus/spectrum/mface.cpp962
-rw-r--r--src/devices/bus/spectrum/mface.h246
-rw-r--r--src/devices/bus/spectrum/mgt.cpp725
-rw-r--r--src/devices/bus/spectrum/mgt.h111
-rw-r--r--src/devices/bus/spectrum/mikroplus.cpp111
-rw-r--r--src/devices/bus/spectrum/mikroplus.h53
-rw-r--r--src/devices/bus/spectrum/mpoker.cpp168
-rw-r--r--src/devices/bus/spectrum/mpoker.h49
-rw-r--r--src/devices/bus/spectrum/musicmachine.cpp149
-rw-r--r--src/devices/bus/spectrum/musicmachine.h20
-rw-r--r--src/devices/bus/spectrum/opus.cpp286
-rw-r--r--src/devices/bus/spectrum/opus.h77
-rw-r--r--src/devices/bus/spectrum/plus2test.cpp74
-rw-r--r--src/devices/bus/spectrum/plus2test.h50
-rw-r--r--src/devices/bus/spectrum/protek.cpp91
-rw-r--r--src/devices/bus/spectrum/protek.h50
-rw-r--r--src/devices/bus/spectrum/sdi.cpp159
-rw-r--r--src/devices/bus/spectrum/sdi.h61
-rw-r--r--src/devices/bus/spectrum/sixword.cpp604
-rw-r--r--src/devices/bus/spectrum/sixword.h114
-rw-r--r--src/devices/bus/spectrum/speccydos.cpp251
-rw-r--r--src/devices/bus/spectrum/speccydos.h70
-rw-r--r--src/devices/bus/spectrum/specdrum.cpp69
-rw-r--r--src/devices/bus/spectrum/specdrum.h51
-rw-r--r--src/devices/bus/spectrum/specmate.cpp190
-rw-r--r--src/devices/bus/spectrum/specmate.h59
-rw-r--r--src/devices/bus/spectrum/uslot.cpp134
-rw-r--r--src/devices/bus/spectrum/uslot.h59
-rw-r--r--src/devices/bus/spectrum/usource.cpp102
-rw-r--r--src/devices/bus/spectrum/usource.h56
-rw-r--r--src/devices/bus/spectrum/uspeech.cpp163
-rw-r--r--src/devices/bus/spectrum/uspeech.h61
-rw-r--r--src/devices/bus/spectrum/vtx5000.cpp170
-rw-r--r--src/devices/bus/spectrum/vtx5000.h11
-rw-r--r--src/devices/bus/spectrum/wafa.cpp183
-rw-r--r--src/devices/bus/spectrum/wafa.h68
-rw-r--r--src/devices/bus/spectrum/zxbus/bus.cpp94
-rw-r--r--src/devices/bus/spectrum/zxbus/bus.h130
-rw-r--r--src/devices/bus/spectrum/zxbus/nemoide.cpp84
-rw-r--r--src/devices/bus/spectrum/zxbus/nemoide.h14
-rw-r--r--src/devices/bus/spectrum/zxbus/neogs.cpp510
-rw-r--r--src/devices/bus/spectrum/zxbus/neogs.h14
-rw-r--r--src/devices/bus/spectrum/zxbus/smuc.cpp137
-rw-r--r--src/devices/bus/spectrum/zxbus/smuc.h14
-rw-r--r--src/devices/bus/ss50/dc5.cpp819
-rw-r--r--src/devices/bus/ss50/dc5.h15
-rw-r--r--src/devices/bus/ss50/interface.cpp234
-rw-r--r--src/devices/bus/ss50/interface.h106
-rw-r--r--src/devices/bus/ss50/mpc.cpp191
-rw-r--r--src/devices/bus/ss50/mpc.h15
-rw-r--r--src/devices/bus/ss50/mps.cpp215
-rw-r--r--src/devices/bus/ss50/mps.h15
-rw-r--r--src/devices/bus/ss50/mps2.cpp260
-rw-r--r--src/devices/bus/ss50/mps2.h15
-rw-r--r--src/devices/bus/ss50/mpt.cpp195
-rw-r--r--src/devices/bus/ss50/mpt.h15
-rw-r--r--src/devices/bus/ss50/piaide.cpp185
-rw-r--r--src/devices/bus/ss50/piaide.h15
-rw-r--r--src/devices/bus/st/replay.cpp98
-rw-r--r--src/devices/bus/st/replay.h15
-rw-r--r--src/devices/bus/st/rom.cpp87
-rw-r--r--src/devices/bus/st/rom.h15
-rw-r--r--src/devices/bus/st/stcart.cpp46
-rw-r--r--src/devices/bus/st/stcart.h47
-rw-r--r--src/devices/bus/sunkbd/hlekbd.cpp1278
-rw-r--r--src/devices/bus/sunkbd/hlekbd.h118
-rw-r--r--src/devices/bus/sunkbd/sunkbd.cpp177
-rw-r--r--src/devices/bus/sunkbd/sunkbd.h79
-rw-r--r--src/devices/bus/sunmouse/hlemouse.cpp314
-rw-r--r--src/devices/bus/sunmouse/hlemouse.h82
-rw-r--r--src/devices/bus/sunmouse/sunmouse.cpp154
-rw-r--r--src/devices/bus/sunmouse/sunmouse.h80
-rw-r--r--src/devices/bus/supracan/rom.cpp96
-rw-r--r--src/devices/bus/supracan/rom.h46
-rw-r--r--src/devices/bus/supracan/slot.cpp116
-rw-r--r--src/devices/bus/supracan/slot.h87
-rw-r--r--src/devices/bus/svi3x8/expander/expander.cpp146
-rw-r--r--src/devices/bus/svi3x8/expander/expander.h147
-rw-r--r--src/devices/bus/svi3x8/expander/modules.cpp21
-rw-r--r--src/devices/bus/svi3x8/expander/modules.h16
-rw-r--r--src/devices/bus/svi3x8/expander/sv601.cpp79
-rw-r--r--src/devices/bus/svi3x8/expander/sv601.h57
-rw-r--r--src/devices/bus/svi3x8/expander/sv602.cpp73
-rw-r--r--src/devices/bus/svi3x8/expander/sv602.h57
-rw-r--r--src/devices/bus/svi3x8/expander/sv603.cpp185
-rw-r--r--src/devices/bus/svi3x8/expander/sv603.h54
-rw-r--r--src/devices/bus/svi3x8/slot/cards.cpp39
-rw-r--r--src/devices/bus/svi3x8/slot/cards.h17
-rw-r--r--src/devices/bus/svi3x8/slot/slot.cpp205
-rw-r--r--src/devices/bus/svi3x8/slot/slot.h159
-rw-r--r--src/devices/bus/svi3x8/slot/sv801.cpp146
-rw-r--r--src/devices/bus/svi3x8/slot/sv801.h60
-rw-r--r--src/devices/bus/svi3x8/slot/sv802.cpp85
-rw-r--r--src/devices/bus/svi3x8/slot/sv802.h50
-rw-r--r--src/devices/bus/svi3x8/slot/sv803.cpp71
-rw-r--r--src/devices/bus/svi3x8/slot/sv803.h43
-rw-r--r--src/devices/bus/svi3x8/slot/sv805.cpp105
-rw-r--r--src/devices/bus/svi3x8/slot/sv805.h48
-rw-r--r--src/devices/bus/svi3x8/slot/sv806.cpp153
-rw-r--r--src/devices/bus/svi3x8/slot/sv806.h55
-rw-r--r--src/devices/bus/svi3x8/slot/sv807.cpp171
-rw-r--r--src/devices/bus/svi3x8/slot/sv807.h59
-rw-r--r--src/devices/bus/tanbus/bullsnd.cpp103
-rw-r--r--src/devices/bus/tanbus/bullsnd.h49
-rw-r--r--src/devices/bus/tanbus/etirtc.cpp88
-rw-r--r--src/devices/bus/tanbus/etirtc.h47
-rw-r--r--src/devices/bus/tanbus/etisnd.cpp153
-rw-r--r--src/devices/bus/tanbus/etisnd.h53
-rw-r--r--src/devices/bus/tanbus/keyboard/keyboard.cpp104
-rw-r--r--src/devices/bus/tanbus/keyboard/keyboard.h79
-rw-r--r--src/devices/bus/tanbus/keyboard/mt006.cpp118
-rw-r--r--src/devices/bus/tanbus/keyboard/mt006.h50
-rw-r--r--src/devices/bus/tanbus/keyboard/mt009.cpp389
-rw-r--r--src/devices/bus/tanbus/keyboard/mt009.h63
-rw-r--r--src/devices/bus/tanbus/keyboard/spinveti.cpp97
-rw-r--r--src/devices/bus/tanbus/keyboard/spinveti.h49
-rw-r--r--src/devices/bus/tanbus/mpvdu.cpp186
-rw-r--r--src/devices/bus/tanbus/mpvdu.h62
-rw-r--r--src/devices/bus/tanbus/ra32k.cpp246
-rw-r--r--src/devices/bus/tanbus/ra32k.h84
-rw-r--r--src/devices/bus/tanbus/radisc.cpp213
-rw-r--r--src/devices/bus/tanbus/radisc.h74
-rw-r--r--src/devices/bus/tanbus/ravdu.cpp199
-rw-r--r--src/devices/bus/tanbus/ravdu.h63
-rw-r--r--src/devices/bus/tanbus/tanbus.cpp239
-rw-r--r--src/devices/bus/tanbus/tanbus.h142
-rw-r--r--src/devices/bus/tanbus/tandos.cpp270
-rw-r--r--src/devices/bus/tanbus/tandos.h74
-rw-r--r--src/devices/bus/tanbus/tanex.cpp436
-rw-r--r--src/devices/bus/tanbus/tanex.h86
-rw-r--r--src/devices/bus/tanbus/tanhrg.cpp361
-rw-r--r--src/devices/bus/tanbus/tanhrg.h90
-rw-r--r--src/devices/bus/tanbus/tanram.cpp81
-rw-r--r--src/devices/bus/tanbus/tanram.h45
-rw-r--r--src/devices/bus/tanbus/tanrtc.cpp86
-rw-r--r--src/devices/bus/tanbus/tanrtc.h47
-rw-r--r--src/devices/bus/tanbus/tug64k.cpp188
-rw-r--r--src/devices/bus/tanbus/tug64k.h51
-rw-r--r--src/devices/bus/tanbus/tug8082.cpp259
-rw-r--r--src/devices/bus/tanbus/tug8082.h70
-rw-r--r--src/devices/bus/tanbus/tugcombo.cpp270
-rw-r--r--src/devices/bus/tanbus/tugcombo.h142
-rw-r--r--src/devices/bus/tanbus/tugpgm.cpp113
-rw-r--r--src/devices/bus/tanbus/tugpgm.h52
-rw-r--r--src/devices/bus/technics/kn5000/hdae5000.cpp135
-rw-r--r--src/devices/bus/technics/kn5000/hdae5000.h15
-rw-r--r--src/devices/bus/technics/kn5000/kn5000_extension.cpp45
-rw-r--r--src/devices/bus/technics/kn5000/kn5000_extension.h51
-rw-r--r--src/devices/bus/thomson/cc90_232.cpp135
-rw-r--r--src/devices/bus/thomson/cc90_232.h48
-rw-r--r--src/devices/bus/thomson/cd90_015.cpp151
-rw-r--r--src/devices/bus/thomson/cd90_015.h49
-rw-r--r--src/devices/bus/thomson/cd90_351.cpp120
-rw-r--r--src/devices/bus/thomson/cd90_351.h17
-rw-r--r--src/devices/bus/thomson/cd90_640.cpp94
-rw-r--r--src/devices/bus/thomson/cd90_640.h46
-rw-r--r--src/devices/bus/thomson/cq90_028.cpp76
-rw-r--r--src/devices/bus/thomson/cq90_028.h42
-rw-r--r--src/devices/bus/thomson/extension.cpp54
-rw-r--r--src/devices/bus/thomson/extension.h55
-rw-r--r--src/devices/bus/thomson/md90_120.cpp94
-rw-r--r--src/devices/bus/thomson/md90_120.h38
-rw-r--r--src/devices/bus/thomson/midipak.cpp61
-rw-r--r--src/devices/bus/thomson/midipak.h25
-rw-r--r--src/devices/bus/thomson/nanoreseau.cpp204
-rw-r--r--src/devices/bus/thomson/nanoreseau.h67
-rw-r--r--src/devices/bus/thomson/rf57_932.cpp55
-rw-r--r--src/devices/bus/thomson/rf57_932.h25
-rw-r--r--src/devices/bus/thomson/speech.cpp43
-rw-r--r--src/devices/bus/thomson/speech.h25
-rw-r--r--src/devices/bus/ti8x/bitsocket.cpp105
-rw-r--r--src/devices/bus/ti8x/bitsocket.h13
-rw-r--r--src/devices/bus/ti8x/graphlinkhle.cpp184
-rw-r--r--src/devices/bus/ti8x/graphlinkhle.h24
-rw-r--r--src/devices/bus/ti8x/teeconn.cpp133
-rw-r--r--src/devices/bus/ti8x/teeconn.h13
-rw-r--r--src/devices/bus/ti8x/ti8x.cpp625
-rw-r--r--src/devices/bus/ti8x/ti8x.h200
-rw-r--r--src/devices/bus/ti8x/tispeaker.cpp116
-rw-r--r--src/devices/bus/ti8x/tispeaker.h14
-rw-r--r--src/devices/bus/ti99/colorbus/busmouse.cpp104
-rw-r--r--src/devices/bus/ti99/colorbus/busmouse.h45
-rw-r--r--src/devices/bus/ti99/colorbus/colorbus.cpp74
-rw-r--r--src/devices/bus/ti99/colorbus/colorbus.h78
-rw-r--r--src/devices/bus/ti99/gromport/cartridges.cpp1719
-rw-r--r--src/devices/bus/ti99/gromport/cartridges.h345
-rw-r--r--src/devices/bus/ti99/gromport/gkracker.cpp459
-rw-r--r--src/devices/bus/ti99/gromport/gkracker.h69
-rw-r--r--src/devices/bus/ti99/gromport/gromport.cpp298
-rw-r--r--src/devices/bus/ti99/gromport/gromport.h112
-rw-r--r--src/devices/bus/ti99/gromport/multiconn.cpp275
-rw-r--r--src/devices/bus/ti99/gromport/multiconn.h63
-rw-r--r--src/devices/bus/ti99/gromport/singleconn.cpp82
-rw-r--r--src/devices/bus/ti99/gromport/singleconn.h43
-rw-r--r--src/devices/bus/ti99/internal/992board.cpp666
-rw-r--r--src/devices/bus/ti99/internal/992board.h233
-rw-r--r--src/devices/bus/ti99/internal/998board.cpp2750
-rw-r--r--src/devices/bus/ti99/internal/998board.h713
-rw-r--r--src/devices/bus/ti99/internal/buffram.cpp60
-rw-r--r--src/devices/bus/ti99/internal/buffram.h49
-rw-r--r--src/devices/bus/ti99/internal/datamux.cpp643
-rw-r--r--src/devices/bus/ti99/internal/datamux.h159
-rw-r--r--src/devices/bus/ti99/internal/evpcconn.cpp45
-rw-r--r--src/devices/bus/ti99/internal/evpcconn.h36
-rw-r--r--src/devices/bus/ti99/internal/genboard.cpp1535
-rw-r--r--src/devices/bus/ti99/internal/genboard.h332
-rw-r--r--src/devices/bus/ti99/internal/genkbd.cpp633
-rw-r--r--src/devices/bus/ti99/internal/genkbd.h90
-rw-r--r--src/devices/bus/ti99/internal/ioport.cpp208
-rw-r--r--src/devices/bus/ti99/internal/ioport.h107
-rw-r--r--src/devices/bus/ti99/internal/splitter.cpp190
-rw-r--r--src/devices/bus/ti99/internal/splitter.h65
-rw-r--r--src/devices/bus/ti99/joyport/handset.cpp548
-rw-r--r--src/devices/bus/ti99/joyport/handset.h94
-rw-r--r--src/devices/bus/ti99/joyport/joyport.cpp130
-rw-r--r--src/devices/bus/ti99/joyport/joyport.h92
-rw-r--r--src/devices/bus/ti99/joyport/mecmouse.cpp219
-rw-r--r--src/devices/bus/ti99/joyport/mecmouse.h57
-rw-r--r--src/devices/bus/ti99/peb/bwg.cpp650
-rw-r--r--src/devices/bus/ti99/peb/bwg.h138
-rw-r--r--src/devices/bus/ti99/peb/cc_fdc.cpp811
-rw-r--r--src/devices/bus/ti99/peb/cc_fdc.h249
-rw-r--r--src/devices/bus/ti99/peb/evpc.cpp526
-rw-r--r--src/devices/bus/ti99/peb/evpc.h95
-rw-r--r--src/devices/bus/ti99/peb/forti.cpp132
-rw-r--r--src/devices/bus/ti99/peb/forti.h52
-rw-r--r--src/devices/bus/ti99/peb/hfdc.cpp1089
-rw-r--r--src/devices/bus/ti99/peb/hfdc.h199
-rw-r--r--src/devices/bus/ti99/peb/horizon.cpp629
-rw-r--r--src/devices/bus/ti99/peb/horizon.h92
-rw-r--r--src/devices/bus/ti99/peb/hsgpl.cpp720
-rw-r--r--src/devices/bus/ti99/peb/hsgpl.h88
-rw-r--r--src/devices/bus/ti99/peb/memex.cpp184
-rw-r--r--src/devices/bus/ti99/peb/memex.h49
-rw-r--r--src/devices/bus/ti99/peb/myarcfdc.cpp517
-rw-r--r--src/devices/bus/ti99/peb/myarcfdc.h137
-rw-r--r--src/devices/bus/ti99/peb/myarcmem.cpp214
-rw-r--r--src/devices/bus/ti99/peb/myarcmem.h52
-rw-r--r--src/devices/bus/ti99/peb/pcode.cpp360
-rw-r--r--src/devices/bus/ti99/peb/pcode.h80
-rw-r--r--src/devices/bus/ti99/peb/peribox.cpp801
-rw-r--r--src/devices/bus/ti99/peb/peribox.h289
-rw-r--r--src/devices/bus/ti99/peb/pgram.cpp564
-rw-r--r--src/devices/bus/ti99/peb/pgram.h87
-rw-r--r--src/devices/bus/ti99/peb/samsmem.cpp208
-rw-r--r--src/devices/bus/ti99/peb/samsmem.h64
-rw-r--r--src/devices/bus/ti99/peb/scsicard.cpp699
-rw-r--r--src/devices/bus/ti99/peb/scsicard.h145
-rw-r--r--src/devices/bus/ti99/peb/sidmaster.cpp98
-rw-r--r--src/devices/bus/ti99/peb/sidmaster.h47
-rw-r--r--src/devices/bus/ti99/peb/speechadapter.cpp158
-rw-r--r--src/devices/bus/ti99/peb/speechadapter.h49
-rw-r--r--src/devices/bus/ti99/peb/ti_32kmem.cpp110
-rw-r--r--src/devices/bus/ti99/peb/ti_32kmem.h46
-rw-r--r--src/devices/bus/ti99/peb/ti_fdc.cpp429
-rw-r--r--src/devices/bus/ti99/peb/ti_fdc.h117
-rw-r--r--src/devices/bus/ti99/peb/ti_rs232.cpp1130
-rw-r--r--src/devices/bus/ti99/peb/ti_rs232.h192
-rw-r--r--src/devices/bus/ti99/peb/tipi.cpp742
-rw-r--r--src/devices/bus/ti99/peb/tipi.h131
-rw-r--r--src/devices/bus/ti99/peb/tn_ide.cpp742
-rw-r--r--src/devices/bus/ti99/peb/tn_ide.h87
-rw-r--r--src/devices/bus/ti99/peb/tn_usbsm.cpp371
-rw-r--r--src/devices/bus/ti99/peb/tn_usbsm.h67
-rw-r--r--src/devices/bus/ti99/sidecar/arcturus.cpp93
-rw-r--r--src/devices/bus/ti99/sidecar/arcturus.h49
-rw-r--r--src/devices/bus/ti99/sidecar/speechsyn.cpp273
-rw-r--r--src/devices/bus/ti99/sidecar/speechsyn.h65
-rw-r--r--src/devices/bus/ti99/sidecar/thermal.cpp367
-rw-r--r--src/devices/bus/ti99/sidecar/thermal.h82
-rw-r--r--src/devices/bus/ti99x/990_dk.cpp891
-rw-r--r--src/devices/bus/ti99x/990_dk.h71
-rw-r--r--src/devices/bus/ti99x/990_hd.cpp986
-rw-r--r--src/devices/bus/ti99x/990_hd.h82
-rw-r--r--src/devices/bus/ti99x/990_tap.cpp993
-rw-r--r--src/devices/bus/ti99x/990_tap.h67
-rw-r--r--src/devices/bus/tiki100/8088.cpp177
-rw-r--r--src/devices/bus/tiki100/8088.h59
-rw-r--r--src/devices/bus/tiki100/exp.cpp188
-rw-r--r--src/devices/bus/tiki100/exp.h165
-rw-r--r--src/devices/bus/tiki100/hdc.cpp109
-rw-r--r--src/devices/bus/tiki100/hdc.h50
-rw-r--r--src/devices/bus/tim011/aycard.cpp84
-rw-r--r--src/devices/bus/tim011/aycard.h12
-rw-r--r--src/devices/bus/tim011/exp.cpp54
-rw-r--r--src/devices/bus/tim011/exp.h99
-rw-r--r--src/devices/bus/tmc600/euro.cpp78
-rw-r--r--src/devices/bus/tmc600/euro.h104
-rw-r--r--src/devices/bus/tvc/hbf.cpp181
-rw-r--r--src/devices/bus/tvc/hbf.h56
-rw-r--r--src/devices/bus/tvc/tvc.cpp163
-rw-r--r--src/devices/bus/tvc/tvc.h129
-rw-r--r--src/devices/bus/uts_kbd/400kbd.cpp275
-rw-r--r--src/devices/bus/uts_kbd/400kbd.h44
-rw-r--r--src/devices/bus/uts_kbd/extw.cpp290
-rw-r--r--src/devices/bus/uts_kbd/extw.h47
-rw-r--r--src/devices/bus/uts_kbd/uts_kbd.cpp84
-rw-r--r--src/devices/bus/uts_kbd/uts_kbd.h97
-rw-r--r--src/devices/bus/vboy/rom.cpp195
-rw-r--r--src/devices/bus/vboy/rom.h50
-rw-r--r--src/devices/bus/vboy/slot.cpp181
-rw-r--r--src/devices/bus/vboy/slot.h177
-rw-r--r--src/devices/bus/vc4000/rom.cpp267
-rw-r--r--src/devices/bus/vc4000/rom.h73
-rw-r--r--src/devices/bus/vc4000/slot.cpp288
-rw-r--r--src/devices/bus/vc4000/slot.h125
-rw-r--r--src/devices/bus/vcs/compumat.cpp51
-rw-r--r--src/devices/bus/vcs/compumat.h37
-rw-r--r--src/devices/bus/vcs/dpc.cpp262
-rw-r--r--src/devices/bus/vcs/dpc.h87
-rw-r--r--src/devices/bus/vcs/harmony_melody.cpp148
-rw-r--r--src/devices/bus/vcs/harmony_melody.h42
-rw-r--r--src/devices/bus/vcs/rom.cpp885
-rw-r--r--src/devices/bus/vcs/rom.h387
-rw-r--r--src/devices/bus/vcs/scharger.cpp218
-rw-r--r--src/devices/bus/vcs/scharger.h53
-rw-r--r--src/devices/bus/vcs/vcs_slot.cpp786
-rw-r--r--src/devices/bus/vcs/vcs_slot.h104
-rw-r--r--src/devices/bus/vcs_ctrl/ctrl.cpp95
-rw-r--r--src/devices/bus/vcs_ctrl/ctrl.h115
-rw-r--r--src/devices/bus/vcs_ctrl/cx85.cpp126
-rw-r--r--src/devices/bus/vcs_ctrl/cx85.h54
-rw-r--r--src/devices/bus/vcs_ctrl/joybooster.cpp102
-rw-r--r--src/devices/bus/vcs_ctrl/joybooster.h57
-rw-r--r--src/devices/bus/vcs_ctrl/joystick.cpp75
-rw-r--r--src/devices/bus/vcs_ctrl/joystick.h50
-rw-r--r--src/devices/bus/vcs_ctrl/keypad.cpp102
-rw-r--r--src/devices/bus/vcs_ctrl/keypad.h59
-rw-r--r--src/devices/bus/vcs_ctrl/lightpen.cpp86
-rw-r--r--src/devices/bus/vcs_ctrl/lightpen.h53
-rw-r--r--src/devices/bus/vcs_ctrl/mouse.cpp107
-rw-r--r--src/devices/bus/vcs_ctrl/mouse.h56
-rw-r--r--src/devices/bus/vcs_ctrl/paddles.cpp101
-rw-r--r--src/devices/bus/vcs_ctrl/paddles.h60
-rw-r--r--src/devices/bus/vcs_ctrl/trakball.cpp150
-rw-r--r--src/devices/bus/vcs_ctrl/trakball.h53
-rw-r--r--src/devices/bus/vcs_ctrl/wheel.cpp77
-rw-r--r--src/devices/bus/vcs_ctrl/wheel.h50
-rw-r--r--src/devices/bus/vectrex/rom.cpp89
-rw-r--r--src/devices/bus/vectrex/rom.h71
-rw-r--r--src/devices/bus/vectrex/slot.cpp245
-rw-r--r--src/devices/bus/vectrex/slot.h102
-rw-r--r--src/devices/bus/vic10/exp.cpp215
-rw-r--r--src/devices/bus/vic10/exp.h139
-rw-r--r--src/devices/bus/vic10/multimax.cpp101
-rw-r--r--src/devices/bus/vic10/multimax.h47
-rw-r--r--src/devices/bus/vic10/std.cpp78
-rw-r--r--src/devices/bus/vic10/std.h44
-rw-r--r--src/devices/bus/vic20/4cga.cpp114
-rw-r--r--src/devices/bus/vic20/4cga.h65
-rw-r--r--src/devices/bus/vic20/exp.cpp324
-rw-r--r--src/devices/bus/vic20/exp.h134
-rw-r--r--src/devices/bus/vic20/fe3.cpp627
-rw-r--r--src/devices/bus/vic20/fe3.h91
-rw-r--r--src/devices/bus/vic20/megacart.cpp137
-rw-r--r--src/devices/bus/vic20/megacart.h56
-rw-r--r--src/devices/bus/vic20/speakeasy.cpp96
-rw-r--r--src/devices/bus/vic20/speakeasy.h52
-rw-r--r--src/devices/bus/vic20/std.cpp69
-rw-r--r--src/devices/bus/vic20/std.h43
-rw-r--r--src/devices/bus/vic20/user.cpp24
-rw-r--r--src/devices/bus/vic20/user.h33
-rw-r--r--src/devices/bus/vic20/vic1010.cpp104
-rw-r--r--src/devices/bus/vic20/vic1010.h53
-rw-r--r--src/devices/bus/vic20/vic1011.cpp83
-rw-r--r--src/devices/bus/vic20/vic1011.h54
-rw-r--r--src/devices/bus/vic20/vic1110.cpp116
-rw-r--r--src/devices/bus/vic20/vic1110.h51
-rw-r--r--src/devices/bus/vic20/vic1111.cpp80
-rw-r--r--src/devices/bus/vic20/vic1111.h47
-rw-r--r--src/devices/bus/vic20/vic1112.cpp193
-rw-r--r--src/devices/bus/vic20/vic1112.h68
-rw-r--r--src/devices/bus/vic20/vic1210.cpp77
-rw-r--r--src/devices/bus/vic20/vic1210.h48
-rw-r--r--src/devices/bus/vic20/videopak.cpp323
-rw-r--r--src/devices/bus/vic20/videopak.h69
-rw-r--r--src/devices/bus/vidbrain/comp_language.cpp101
-rw-r--r--src/devices/bus/vidbrain/comp_language.h46
-rw-r--r--src/devices/bus/vidbrain/exp.cpp157
-rw-r--r--src/devices/bus/vidbrain/exp.h141
-rw-r--r--src/devices/bus/vidbrain/info_manager.cpp77
-rw-r--r--src/devices/bus/vidbrain/info_manager.h43
-rw-r--r--src/devices/bus/vidbrain/money_minder.cpp69
-rw-r--r--src/devices/bus/vidbrain/money_minder.h43
-rw-r--r--src/devices/bus/vidbrain/std.cpp50
-rw-r--r--src/devices/bus/vidbrain/std.h42
-rw-r--r--src/devices/bus/vidbrain/timeshare.cpp68
-rw-r--r--src/devices/bus/vidbrain/timeshare.h43
-rw-r--r--src/devices/bus/vip/byteio.cpp88
-rw-r--r--src/devices/bus/vip/byteio.h123
-rw-r--r--src/devices/bus/vip/exp.cpp255
-rw-r--r--src/devices/bus/vip/exp.h143
-rw-r--r--src/devices/bus/vip/vp550.cpp210
-rw-r--r--src/devices/bus/vip/vp550.h61
-rw-r--r--src/devices/bus/vip/vp570.cpp120
-rw-r--r--src/devices/bus/vip/vp570.h53
-rw-r--r--src/devices/bus/vip/vp575.cpp316
-rw-r--r--src/devices/bus/vip/vp575.h86
-rw-r--r--src/devices/bus/vip/vp585.cpp134
-rw-r--r--src/devices/bus/vip/vp585.h54
-rw-r--r--src/devices/bus/vip/vp590.cpp250
-rw-r--r--src/devices/bus/vip/vp590.h66
-rw-r--r--src/devices/bus/vip/vp595.cpp94
-rw-r--r--src/devices/bus/vip/vp595.h49
-rw-r--r--src/devices/bus/vip/vp620.cpp94
-rw-r--r--src/devices/bus/vip/vp620.h52
-rw-r--r--src/devices/bus/vip/vp700.cpp82
-rw-r--r--src/devices/bus/vip/vp700.h50
-rw-r--r--src/devices/bus/vme/cp31.cpp315
-rw-r--r--src/devices/bus/vme/cp31.h72
-rw-r--r--src/devices/bus/vme/enp10.cpp416
-rw-r--r--src/devices/bus/vme/enp10.h71
-rw-r--r--src/devices/bus/vme/hcpu30.cpp590
-rw-r--r--src/devices/bus/vme/hcpu30.h94
-rw-r--r--src/devices/bus/vme/hk68v10.cpp364
-rw-r--r--src/devices/bus/vme/hk68v10.h44
-rw-r--r--src/devices/bus/vme/mvme120.cpp469
-rw-r--r--src/devices/bus/vme/mvme120.h153
-rw-r--r--src/devices/bus/vme/mvme147.cpp672
-rw-r--r--src/devices/bus/vme/mvme147.h59
-rw-r--r--src/devices/bus/vme/mvme180.cpp129
-rw-r--r--src/devices/bus/vme/mvme180.h52
-rw-r--r--src/devices/bus/vme/mvme181.cpp155
-rw-r--r--src/devices/bus/vme/mvme181.h52
-rw-r--r--src/devices/bus/vme/mvme187.cpp135
-rw-r--r--src/devices/bus/vme/mvme187.h51
-rw-r--r--src/devices/bus/vme/mvme327a.cpp122
-rw-r--r--src/devices/bus/vme/mvme327a.h48
-rw-r--r--src/devices/bus/vme/mvme328.cpp283
-rw-r--r--src/devices/bus/vme/mvme328.h56
-rw-r--r--src/devices/bus/vme/mvme350.cpp252
-rw-r--r--src/devices/bus/vme/mvme350.h35
-rw-r--r--src/devices/bus/vme/mzr8105.cpp237
-rw-r--r--src/devices/bus/vme/mzr8105.h32
-rw-r--r--src/devices/bus/vme/mzr8300.cpp194
-rw-r--r--src/devices/bus/vme/mzr8300.h36
-rw-r--r--src/devices/bus/vme/smvme2000.cpp138
-rw-r--r--src/devices/bus/vme/smvme2000.h54
-rw-r--r--src/devices/bus/vme/sys68k_cpu1.cpp671
-rw-r--r--src/devices/bus/vme/sys68k_cpu1.h97
-rw-r--r--src/devices/bus/vme/sys68k_cpu20.cpp643
-rw-r--r--src/devices/bus/vme/sys68k_cpu20.h188
-rw-r--r--src/devices/bus/vme/sys68k_cpu30.cpp952
-rw-r--r--src/devices/bus/vme/sys68k_cpu30.h157
-rw-r--r--src/devices/bus/vme/sys68k_iscsi.cpp489
-rw-r--r--src/devices/bus/vme/sys68k_iscsi.h72
-rw-r--r--src/devices/bus/vme/sys68k_isio.cpp463
-rw-r--r--src/devices/bus/vme/sys68k_isio.h53
-rw-r--r--src/devices/bus/vme/tp880v.cpp163
-rw-r--r--src/devices/bus/vme/tp880v.h57
-rw-r--r--src/devices/bus/vme/tp881v.cpp334
-rw-r--r--src/devices/bus/vme/tp881v.h59
-rw-r--r--src/devices/bus/vme/tsvme104.cpp155
-rw-r--r--src/devices/bus/vme/tsvme104.h50
-rw-r--r--src/devices/bus/vme/vme.cpp385
-rw-r--r--src/devices/bus/vme/vme.h212
-rw-r--r--src/devices/bus/vme/vme_cards.cpp71
-rw-r--r--src/devices/bus/vme/vme_cards.h11
-rw-r--r--src/devices/bus/vsmile/keyboard.cpp566
-rw-r--r--src/devices/bus/vsmile/keyboard.h143
-rw-r--r--src/devices/bus/vsmile/mat.cpp198
-rw-r--r--src/devices/bus/vsmile/mat.h70
-rw-r--r--src/devices/bus/vsmile/pad.cpp276
-rw-r--r--src/devices/bus/vsmile/pad.h83
-rw-r--r--src/devices/bus/vsmile/rom.cpp86
-rw-r--r--src/devices/bus/vsmile/rom.h59
-rw-r--r--src/devices/bus/vsmile/vsmile_ctrl.cpp285
-rw-r--r--src/devices/bus/vsmile/vsmile_ctrl.h150
-rw-r--r--src/devices/bus/vsmile/vsmile_slot.cpp244
-rw-r--r--src/devices/bus/vsmile/vsmile_slot.h117
-rw-r--r--src/devices/bus/vtech/ioexp/carts.cpp20
-rw-r--r--src/devices/bus/vtech/ioexp/carts.h17
-rw-r--r--src/devices/bus/vtech/ioexp/ioexp.cpp142
-rw-r--r--src/devices/bus/vtech/ioexp/ioexp.h103
-rw-r--r--src/devices/bus/vtech/ioexp/joystick.cpp111
-rw-r--r--src/devices/bus/vtech/ioexp/joystick.h50
-rw-r--r--src/devices/bus/vtech/ioexp/lpen.cpp63
-rw-r--r--src/devices/bus/vtech/ioexp/lpen.h43
-rw-r--r--src/devices/bus/vtech/ioexp/printer.cpp97
-rw-r--r--src/devices/bus/vtech/ioexp/printer.h52
-rw-r--r--src/devices/bus/vtech/memexp/carts.cpp31
-rw-r--r--src/devices/bus/vtech/memexp/carts.h16
-rw-r--r--src/devices/bus/vtech/memexp/floppy.cpp324
-rw-r--r--src/devices/bus/vtech/memexp/floppy.h69
-rw-r--r--src/devices/bus/vtech/memexp/memexp.cpp179
-rw-r--r--src/devices/bus/vtech/memexp/memexp.h131
-rw-r--r--src/devices/bus/vtech/memexp/memory.cpp177
-rw-r--r--src/devices/bus/vtech/memexp/memory.h90
-rw-r--r--src/devices/bus/vtech/memexp/rs232.cpp102
-rw-r--r--src/devices/bus/vtech/memexp/rs232.h49
-rw-r--r--src/devices/bus/vtech/memexp/rtty.cpp87
-rw-r--r--src/devices/bus/vtech/memexp/rtty.h44
-rw-r--r--src/devices/bus/vtech/memexp/sdloader.cpp343
-rw-r--r--src/devices/bus/vtech/memexp/sdloader.h19
-rw-r--r--src/devices/bus/vtech/memexp/wordpro.cpp67
-rw-r--r--src/devices/bus/vtech/memexp/wordpro.h39
-rw-r--r--src/devices/bus/wangpc/emb.cpp174
-rw-r--r--src/devices/bus/wangpc/emb.h53
-rw-r--r--src/devices/bus/wangpc/lic.cpp149
-rw-r--r--src/devices/bus/wangpc/lic.h49
-rw-r--r--src/devices/bus/wangpc/lvc.cpp331
-rw-r--r--src/devices/bus/wangpc/lvc.h63
-rw-r--r--src/devices/bus/wangpc/mcc.cpp256
-rw-r--r--src/devices/bus/wangpc/mcc.h56
-rw-r--r--src/devices/bus/wangpc/mvc.cpp324
-rw-r--r--src/devices/bus/wangpc/mvc.h63
-rw-r--r--src/devices/bus/wangpc/rtc.cpp271
-rw-r--r--src/devices/bus/wangpc/rtc.h66
-rw-r--r--src/devices/bus/wangpc/tig.cpp319
-rw-r--r--src/devices/bus/wangpc/tig.h70
-rw-r--r--src/devices/bus/wangpc/wangpc.cpp243
-rw-r--r--src/devices/bus/wangpc/wangpc.h184
-rw-r--r--src/devices/bus/wangpc/wdc.cpp335
-rw-r--r--src/devices/bus/wangpc/wdc.h79
-rw-r--r--src/devices/bus/waveblaster/db50xg.cpp104
-rw-r--r--src/devices/bus/waveblaster/db50xg.h15
-rw-r--r--src/devices/bus/waveblaster/db60xg.cpp102
-rw-r--r--src/devices/bus/waveblaster/db60xg.h15
-rw-r--r--src/devices/bus/waveblaster/omniwave.cpp71
-rw-r--r--src/devices/bus/waveblaster/omniwave.h15
-rw-r--r--src/devices/bus/waveblaster/waveblaster.cpp55
-rw-r--r--src/devices/bus/waveblaster/waveblaster.h56
-rw-r--r--src/devices/bus/waveblaster/wg130.cpp117
-rw-r--r--src/devices/bus/waveblaster/wg130.h15
-rw-r--r--src/devices/bus/wswan/rom.cpp743
-rw-r--r--src/devices/bus/wswan/rom.h141
-rw-r--r--src/devices/bus/wswan/slot.cpp428
-rw-r--r--src/devices/bus/wswan/slot.h184
-rw-r--r--src/devices/bus/wysekbd/wysegakb.cpp1020
-rw-r--r--src/devices/bus/wysekbd/wysegakb.h163
-rw-r--r--src/devices/bus/wysekbd/wysekbd.cpp89
-rw-r--r--src/devices/bus/wysekbd/wysekbd.h91
-rw-r--r--src/devices/bus/x68k/x68k_midi.cpp68
-rw-r--r--src/devices/bus/x68k/x68k_midi.h51
-rw-r--r--src/devices/bus/x68k/x68k_neptunex.cpp148
-rw-r--r--src/devices/bus/x68k/x68k_neptunex.h57
-rw-r--r--src/devices/bus/x68k/x68k_scsiext.cpp135
-rw-r--r--src/devices/bus/x68k/x68k_scsiext.h52
-rw-r--r--src/devices/bus/x68k/x68kexp.cpp81
-rw-r--r--src/devices/bus/x68k/x68kexp.h152
-rw-r--r--src/devices/bus/z29_kbd/he191_3425.cpp239
-rw-r--r--src/devices/bus/z29_kbd/he191_3425.h58
-rw-r--r--src/devices/bus/z29_kbd/keyboard.cpp111
-rw-r--r--src/devices/bus/z29_kbd/keyboard.h100
-rw-r--r--src/devices/bus/z29_kbd/md_kbd.cpp277
-rw-r--r--src/devices/bus/z29_kbd/md_kbd.h61
-rw-r--r--src/devices/bus/z88/flash.cpp103
-rw-r--r--src/devices/bus/z88/flash.h46
-rw-r--r--src/devices/bus/z88/ram.cpp202
-rw-r--r--src/devices/bus/z88/ram.h16
-rw-r--r--src/devices/bus/z88/rom.cpp197
-rw-r--r--src/devices/bus/z88/rom.h15
-rw-r--r--src/devices/bus/z88/z88.cpp220
-rw-r--r--src/devices/bus/z88/z88.h137
-rw-r--r--src/devices/cpu/8x300/8x300.cpp639
-rw-r--r--src/devices/cpu/8x300/8x300.h163
-rw-r--r--src/devices/cpu/8x300/8x300dasm.cpp138
-rw-r--r--src/devices/cpu/8x300/8x300dasm.h31
-rw-r--r--src/devices/cpu/adsp2100/2100dasm.cpp564
-rw-r--r--src/devices/cpu/adsp2100/2100dasm.h43
-rw-r--r--src/devices/cpu/adsp2100/2100ops.hxx2259
-rw-r--r--src/devices/cpu/adsp2100/adsp2100.cpp1919
-rw-r--r--src/devices/cpu/adsp2100/adsp2100.h566
-rw-r--r--src/devices/cpu/alpha/alpha.cpp990
-rw-r--r--src/devices/cpu/alpha/alpha.h281
-rw-r--r--src/devices/cpu/alpha/alphad.cpp1246
-rw-r--r--src/devices/cpu/alpha/alphad.h40
-rw-r--r--src/devices/cpu/alpha/common.h19
-rw-r--r--src/devices/cpu/alto2/a2curt.cpp63
-rw-r--r--src/devices/cpu/alto2/a2curt.h28
-rw-r--r--src/devices/cpu/alto2/a2dht.cpp110
-rw-r--r--src/devices/cpu/alto2/a2dht.h27
-rw-r--r--src/devices/cpu/alto2/a2disk.cpp1817
-rw-r--r--src/devices/cpu/alto2/a2disk.h99
-rw-r--r--src/devices/cpu/alto2/a2disp.cpp576
-rw-r--r--src/devices/cpu/alto2/a2disp.h316
-rw-r--r--src/devices/cpu/alto2/a2dvt.cpp67
-rw-r--r--src/devices/cpu/alto2/a2dvt.h34
-rw-r--r--src/devices/cpu/alto2/a2dwt.cpp94
-rw-r--r--src/devices/cpu/alto2/a2dwt.h25
-rw-r--r--src/devices/cpu/alto2/a2emu.cpp672
-rw-r--r--src/devices/cpu/alto2/a2emu.h69
-rw-r--r--src/devices/cpu/alto2/a2ether.cpp1364
-rw-r--r--src/devices/cpu/alto2/a2ether.h116
-rw-r--r--src/devices/cpu/alto2/a2hw.cpp421
-rw-r--r--src/devices/cpu/alto2/a2hw.h66
-rw-r--r--src/devices/cpu/alto2/a2jkff.h192
-rw-r--r--src/devices/cpu/alto2/a2kbd.cpp50
-rw-r--r--src/devices/cpu/alto2/a2kbd.h109
-rw-r--r--src/devices/cpu/alto2/a2ksec.cpp32
-rw-r--r--src/devices/cpu/alto2/a2ksec.h48
-rw-r--r--src/devices/cpu/alto2/a2kwd.cpp31
-rw-r--r--src/devices/cpu/alto2/a2kwd.h49
-rw-r--r--src/devices/cpu/alto2/a2mem.cpp857
-rw-r--r--src/devices/cpu/alto2/a2mem.h139
-rw-r--r--src/devices/cpu/alto2/a2mouse.cpp252
-rw-r--r--src/devices/cpu/alto2/a2mouse.h71
-rw-r--r--src/devices/cpu/alto2/a2mrt.cpp43
-rw-r--r--src/devices/cpu/alto2/a2mrt.h19
-rw-r--r--src/devices/cpu/alto2/a2part.cpp30
-rw-r--r--src/devices/cpu/alto2/a2part.h18
-rw-r--r--src/devices/cpu/alto2/a2ram.cpp444
-rw-r--r--src/devices/cpu/alto2/a2ram.h45
-rw-r--r--src/devices/cpu/alto2/a2roms.cpp180
-rw-r--r--src/devices/cpu/alto2/a2roms.h44
-rw-r--r--src/devices/cpu/alto2/alto2cpu.cpp2961
-rw-r--r--src/devices/cpu/alto2/alto2cpu.h935
-rw-r--r--src/devices/cpu/alto2/alto2dsm.cpp387
-rw-r--r--src/devices/cpu/alto2/alto2dsm.h31
-rw-r--r--src/devices/cpu/am29000/am29000.cpp709
-rw-r--r--src/devices/cpu/am29000/am29000.h649
-rw-r--r--src/devices/cpu/am29000/am29dasm.cpp237
-rw-r--r--src/devices/cpu/am29000/am29dasm.h36
-rw-r--r--src/devices/cpu/am29000/am29ops.h1703
-rw-r--r--src/devices/cpu/amis2000/amis2000.cpp342
-rw-r--r--src/devices/cpu/amis2000/amis2000.h214
-rw-r--r--src/devices/cpu/amis2000/amis2000d.cpp130
-rw-r--r--src/devices/cpu/amis2000/amis2000d.h31
-rw-r--r--src/devices/cpu/amis2000/amis2000op.cpp526
-rw-r--r--src/devices/cpu/apexc/apexc.cpp861
-rw-r--r--src/devices/cpu/apexc/apexc.h88
-rw-r--r--src/devices/cpu/apexc/apexcdsm.cpp179
-rw-r--r--src/devices/cpu/apexc/apexcdsm.h37
-rw-r--r--src/devices/cpu/arc/arc.cpp140
-rw-r--r--src/devices/cpu/arc/arc.h76
-rw-r--r--src/devices/cpu/arc/arcdasm.cpp213
-rw-r--r--src/devices/cpu/arc/arcdasm.h31
-rw-r--r--src/devices/cpu/arcompact/arcompact.cpp2949
-rw-r--r--src/devices/cpu/arcompact/arcompact.h597
-rw-r--r--src/devices/cpu/arcompact/arcompact_common.h109
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute.cpp173
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_00to01.cpp200
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_02to03.cpp123
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_04.cpp888
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_04_2f_3f_zop.cpp63
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_04_2f_sop.cpp336
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_04_3x.cpp41
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_04_aux.cpp153
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_04_jumps.cpp149
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_04_loop.cpp53
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_05.cpp351
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_05_2f_sop.cpp177
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_06to0b.cpp41
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_0c_16bit.cpp61
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_0d_16bit.cpp66
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_0e_16bit.cpp66
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_0f_00_07_16bit.cpp78
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_0f_00_16bit.cpp73
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_0f_16bit.cpp370
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_12to16_16bit.cpp104
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_17_16bit.cpp114
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_18_16bit.cpp154
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_19_16bit.cpp53
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_1ato1c_16bit.cpp59
-rw-r--r--src/devices/cpu/arcompact/arcompact_execute_ops_1dto1f_16bit.cpp161
-rw-r--r--src/devices/cpu/arcompact/arcompact_helper.ipp371
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm.cpp3139
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm.h96
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_internal.h251
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_ops.cpp308
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_ops_00to01.cpp227
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_ops_02to03.cpp110
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_ops_04.cpp469
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_ops_04_2f_3f_zop.cpp41
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_ops_04_2f_sop.cpp134
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_ops_04_3x.cpp101
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_ops_05.cpp73
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_ops_05_2f_sop.cpp104
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_ops_06to0b.cpp45
-rw-r--r--src/devices/cpu/arcompact/arcompactdasm_ops_16bit.cpp715
-rw-r--r--src/devices/cpu/arm/arm.cpp1532
-rw-r--r--src/devices/cpu/arm/arm.h104
-rw-r--r--src/devices/cpu/arm/armdasm.cpp473
-rw-r--r--src/devices/cpu/arm/armdasm.h25
-rw-r--r--src/devices/cpu/arm7/ap2010cpu.cpp45
-rw-r--r--src/devices/cpu/arm7/ap2010cpu.h37
-rw-r--r--src/devices/cpu/arm7/arm7.cpp2411
-rw-r--r--src/devices/cpu/arm7/arm7.h523
-rw-r--r--src/devices/cpu/arm7/arm7core.h567
-rw-r--r--src/devices/cpu/arm7/arm7core.hxx243
-rw-r--r--src/devices/cpu/arm7/arm7dasm.cpp1403
-rw-r--r--src/devices/cpu/arm7/arm7dasm.h52
-rw-r--r--src/devices/cpu/arm7/arm7help.h162
-rw-r--r--src/devices/cpu/arm7/arm7ops.cpp1943
-rw-r--r--src/devices/cpu/arm7/arm7thmb.cpp1582
-rw-r--r--src/devices/cpu/arm7/cecalls.hxx1066
-rw-r--r--src/devices/cpu/arm7/lpc210x.cpp265
-rw-r--r--src/devices/cpu/arm7/lpc210x.h90
-rw-r--r--src/devices/cpu/arm7/upd800468.cpp249
-rw-r--r--src/devices/cpu/arm7/upd800468.h104
-rw-r--r--src/devices/cpu/asap/asap.cpp1642
-rw-r--r--src/devices/cpu/asap/asap.h271
-rw-r--r--src/devices/cpu/asap/asapdasm.cpp149
-rw-r--r--src/devices/cpu/asap/asapdasm.h33
-rw-r--r--src/devices/cpu/avr8/avr8.cpp3523
-rw-r--r--src/devices/cpu/avr8/avr8.h1224
-rw-r--r--src/devices/cpu/avr8/avr8dasm.cpp659
-rw-r--r--src/devices/cpu/avr8/avr8dasm.h24
-rw-r--r--src/devices/cpu/avr8/avr8ops.hxx1403
-rw-r--r--src/devices/cpu/axc51/axc51.cpp1573
-rw-r--r--src/devices/cpu/axc51/axc51.h541
-rw-r--r--src/devices/cpu/axc51/axc51dasm.cpp2038
-rw-r--r--src/devices/cpu/axc51/axc51dasm.h93
-rw-r--r--src/devices/cpu/axc51/axc51extops.hxx694
-rw-r--r--src/devices/cpu/axc51/axc51ops.hxx1050
-rw-r--r--src/devices/cpu/bcp/bcpdasm.cpp475
-rw-r--r--src/devices/cpu/bcp/bcpdasm.h36
-rw-r--r--src/devices/cpu/bcp/dp8344.cpp2210
-rw-r--r--src/devices/cpu/bcp/dp8344.h244
-rw-r--r--src/devices/cpu/c33/c33common.h29
-rw-r--r--src/devices/cpu/c33/c33dasm.cpp674
-rw-r--r--src/devices/cpu/c33/c33dasm.h37
-rw-r--r--src/devices/cpu/c33/c33helpers.ipp64
-rw-r--r--src/devices/cpu/c33/c33std.cpp117
-rw-r--r--src/devices/cpu/c33/c33std.h58
-rw-r--r--src/devices/cpu/c33/s1c33209.cpp331
-rw-r--r--src/devices/cpu/c33/s1c33209.h57
-rw-r--r--src/devices/cpu/capricorn/capricorn.cpp1539
-rw-r--r--src/devices/cpu/capricorn/capricorn.h144
-rw-r--r--src/devices/cpu/capricorn/capricorn_dasm.cpp207
-rw-r--r--src/devices/cpu/capricorn/capricorn_dasm.h50
-rw-r--r--src/devices/cpu/ccpu/ccpu.cpp707
-rw-r--r--src/devices/cpu/ccpu/ccpu.h113
-rw-r--r--src/devices/cpu/ccpu/ccpudasm.cpp347
-rw-r--r--src/devices/cpu/ccpu/ccpudasm.h28
-rw-r--r--src/devices/cpu/cdc160/cdc160d.cpp379
-rw-r--r--src/devices/cpu/cdc160/cdc160d.h34
-rw-r--r--src/devices/cpu/cdc1700/cdc1700d.cpp535
-rw-r--r--src/devices/cpu/cdc1700/cdc1700d.h37
-rw-r--r--src/devices/cpu/clipper/clipper.cpp2066
-rw-r--r--src/devices/cpu/clipper/clipper.h381
-rw-r--r--src/devices/cpu/clipper/clipperd.cpp344
-rw-r--r--src/devices/cpu/clipper/clipperd.h23
-rw-r--r--src/devices/cpu/clipper/common.h81
-rw-r--r--src/devices/cpu/cop400/cop400.cpp1404
-rw-r--r--src/devices/cpu/cop400/cop400.h531
-rw-r--r--src/devices/cpu/cop400/cop400op.hxx1318
-rw-r--r--src/devices/cpu/cop400/cop410ds.cpp379
-rw-r--r--src/devices/cpu/cop400/cop410ds.h26
-rw-r--r--src/devices/cpu/cop400/cop420ds.cpp429
-rw-r--r--src/devices/cpu/cop400/cop420ds.h26
-rw-r--r--src/devices/cpu/cop400/cop424ds.cpp430
-rw-r--r--src/devices/cpu/cop400/cop424ds.h26
-rw-r--r--src/devices/cpu/cop400/cop444ds.cpp413
-rw-r--r--src/devices/cpu/cop400/cop444ds.h26
-rw-r--r--src/devices/cpu/cops1/cops1base.cpp220
-rw-r--r--src/devices/cpu/cops1/cops1base.h148
-rw-r--r--src/devices/cpu/cops1/cops1d.cpp201
-rw-r--r--src/devices/cpu/cops1/cops1d.h53
-rw-r--r--src/devices/cpu/cops1/mm5799.cpp156
-rw-r--r--src/devices/cpu/cops1/mm5799.h115
-rw-r--r--src/devices/cpu/cops1/mm5799op.cpp378
-rw-r--r--src/devices/cpu/cosmac/cosdasm.cpp259
-rw-r--r--src/devices/cpu/cosmac/cosdasm.h56
-rw-r--r--src/devices/cpu/cosmac/cosmac.cpp1571
-rw-r--r--src/devices/cpu/cosmac/cosmac.h558
-rw-r--r--src/devices/cpu/cp1610/1610dasm.cpp1528
-rw-r--r--src/devices/cpu/cp1610/1610dasm.h19
-rw-r--r--src/devices/cpu/cp1610/cp1610.cpp3425
-rw-r--r--src/devices/cpu/cp1610/cp1610.h205
-rw-r--r--src/devices/cpu/cr16b/cr16b.cpp105
-rw-r--r--src/devices/cpu/cr16b/cr16b.h63
-rw-r--r--src/devices/cpu/cr16b/cr16bdasm.cpp1069
-rw-r--r--src/devices/cpu/cr16b/cr16bdasm.h66
-rw-r--r--src/devices/cpu/cr16c/cr16cdasm.cpp1472
-rw-r--r--src/devices/cpu/cr16c/cr16cdasm.h50
-rw-r--r--src/devices/cpu/cubeqcpu/cubedasm.cpp311
-rw-r--r--src/devices/cpu/cubeqcpu/cubedasm.h54
-rw-r--r--src/devices/cpu/cubeqcpu/cubeqcpu.cpp1553
-rw-r--r--src/devices/cpu/cubeqcpu/cubeqcpu.h344
-rw-r--r--src/devices/cpu/ddp516/ddp516d.cpp1651
-rw-r--r--src/devices/cpu/ddp516/ddp516d.h87
-rw-r--r--src/devices/cpu/diablo/diablo1300.cpp387
-rw-r--r--src/devices/cpu/diablo/diablo1300.h98
-rw-r--r--src/devices/cpu/diablo/diablo1300dasm.cpp84
-rw-r--r--src/devices/cpu/diablo/diablo1300dasm.h22
-rw-r--r--src/devices/cpu/drcbearm64.cpp5731
-rw-r--r--src/devices/cpu/drcbearm64.h26
-rw-r--r--src/devices/cpu/drcbec.cpp2637
-rw-r--r--src/devices/cpu/drcbec.h34
-rw-r--r--src/devices/cpu/drcbeut.cpp707
-rw-r--r--src/devices/cpu/drcbeut.h242
-rw-r--r--src/devices/cpu/drcbex64.cpp6587
-rw-r--r--src/devices/cpu/drcbex64.h33
-rw-r--r--src/devices/cpu/drccache.cpp486
-rw-r--r--src/devices/cpu/drccache.h179
-rw-r--r--src/devices/cpu/drcfe.h220
-rw-r--r--src/devices/cpu/drcfe.ipp389
-rw-r--r--src/devices/cpu/drcuml.cpp543
-rw-r--r--src/devices/cpu/drcuml.h290
-rw-r--r--src/devices/cpu/drcumlsh.h197
-rw-r--r--src/devices/cpu/dsp16/dsp16.cpp2120
-rw-r--r--src/devices/cpu/dsp16/dsp16.h395
-rw-r--r--src/devices/cpu/dsp16/dsp16core.cpp39
-rw-r--r--src/devices/cpu/dsp16/dsp16core.h124
-rw-r--r--src/devices/cpu/dsp16/dsp16core.ipp230
-rw-r--r--src/devices/cpu/dsp16/dsp16dis.cpp575
-rw-r--r--src/devices/cpu/dsp16/dsp16dis.h69
-rw-r--r--src/devices/cpu/dsp16/dsp16fe.cpp891
-rw-r--r--src/devices/cpu/dsp16/dsp16fe.h141
-rw-r--r--src/devices/cpu/dsp16/dsp16rc.cpp80
-rw-r--r--src/devices/cpu/dsp16/dsp16rc.h52
-rw-r--r--src/devices/cpu/dsp32/dsp32.cpp840
-rw-r--r--src/devices/cpu/dsp32/dsp32.h430
-rw-r--r--src/devices/cpu/dsp32/dsp32dis.cpp693
-rw-r--r--src/devices/cpu/dsp32/dsp32dis.h45
-rw-r--r--src/devices/cpu/dsp32/dsp32ops.hxx2844
-rw-r--r--src/devices/cpu/dsp56000/dsp56000.cpp86
-rw-r--r--src/devices/cpu/dsp56000/dsp56000.h58
-rw-r--r--src/devices/cpu/dsp56000/dsp56000d.cpp744
-rw-r--r--src/devices/cpu/dsp56000/dsp56000d.h25
-rw-r--r--src/devices/cpu/dsp56156/dsp56156.cpp495
-rw-r--r--src/devices/cpu/dsp56156/dsp56156.h299
-rw-r--r--src/devices/cpu/dsp56156/dsp56def.h58
-rw-r--r--src/devices/cpu/dsp56156/dsp56dsm.cpp34
-rw-r--r--src/devices/cpu/dsp56156/dsp56dsm.h26
-rw-r--r--src/devices/cpu/dsp56156/dsp56mem.cpp976
-rw-r--r--src/devices/cpu/dsp56156/dsp56mem.h241
-rw-r--r--src/devices/cpu/dsp56156/dsp56ops.hxx5872
-rw-r--r--src/devices/cpu/dsp56156/dsp56pcu.cpp488
-rw-r--r--src/devices/cpu/dsp56156/dsp56pcu.h153
-rw-r--r--src/devices/cpu/dsp56156/inst.cpp785
-rw-r--r--src/devices/cpu/dsp56156/inst.h3489
-rw-r--r--src/devices/cpu/dsp56156/opcode.cpp62
-rw-r--r--src/devices/cpu/dsp56156/opcode.h45
-rw-r--r--src/devices/cpu/dsp56156/pmove.cpp80
-rw-r--r--src/devices/cpu/dsp56156/pmove.h323
-rw-r--r--src/devices/cpu/dsp56156/tables.cpp874
-rw-r--r--src/devices/cpu/dsp56156/tables.h94
-rw-r--r--src/devices/cpu/dsp563xx/dsp56303.cpp65
-rw-r--r--src/devices/cpu/dsp563xx/dsp56303.h32
-rw-r--r--src/devices/cpu/dsp563xx/dsp56311.cpp65
-rw-r--r--src/devices/cpu/dsp563xx/dsp56311.h32
-rw-r--r--src/devices/cpu/dsp563xx/dsp56362.cpp67
-rw-r--r--src/devices/cpu/dsp563xx/dsp56362.h32
-rw-r--r--src/devices/cpu/dsp563xx/dsp56364.cpp66
-rw-r--r--src/devices/cpu/dsp563xx/dsp56364.h32
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xx-interp.cpp59826
-rwxr-xr-xsrc/devices/cpu/dsp563xx/dsp563xx-make.py1264
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xx-tables.cpp34860
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xx.cpp452
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xx.h246
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xx.lst1402
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xxd-tables.cpp35241
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xxd.cpp46
-rw-r--r--src/devices/cpu/dsp563xx/dsp563xxd.h72
-rw-r--r--src/devices/cpu/dsp563xx/hi08.cpp190
-rw-r--r--src/devices/cpu/dsp563xx/hi08.h76
-rw-r--r--src/devices/cpu/dsp563xx/shi.cpp98
-rw-r--r--src/devices/cpu/dsp563xx/shi.h52
-rw-r--r--src/devices/cpu/dspp/dspp.cpp2664
-rw-r--r--src/devices/cpu/dspp/dspp.h417
-rw-r--r--src/devices/cpu/dspp/dsppdasm.cpp600
-rw-r--r--src/devices/cpu/dspp/dsppdasm.h32
-rw-r--r--src/devices/cpu/dspp/dsppdrc.cpp1319
-rw-r--r--src/devices/cpu/dspp/dsppfe.cpp364
-rw-r--r--src/devices/cpu/dspp/dsppfe.h104
-rw-r--r--src/devices/cpu/e0c6200/e0c6200.cpp852
-rw-r--r--src/devices/cpu/e0c6200/e0c6200.h111
-rw-r--r--src/devices/cpu/e0c6200/e0c6200d.cpp696
-rw-r--r--src/devices/cpu/e0c6200/e0c6200d.h39
-rw-r--r--src/devices/cpu/e0c6200/e0c6200op.cpp241
-rw-r--r--src/devices/cpu/e0c6200/e0c6s46.cpp989
-rw-r--r--src/devices/cpu/e0c6200/e0c6s46.h196
-rw-r--r--src/devices/cpu/e132xs/e132xs.cpp2441
-rw-r--r--src/devices/cpu/e132xs/e132xs.h806
-rw-r--r--src/devices/cpu/e132xs/e132xsdrc.cpp1234
-rw-r--r--src/devices/cpu/e132xs/e132xsdrc_ops.hxx4343
-rw-r--r--src/devices/cpu/e132xs/e132xsop.hxx2770
-rw-r--r--src/devices/cpu/e132xs/e1dasm.cpp1132
-rw-r--r--src/devices/cpu/e132xs/e1dasm.h51
-rw-r--r--src/devices/cpu/e132xs/e1defs.h247
-rw-r--r--src/devices/cpu/e132xs/e1fe.cpp1152
-rw-r--r--src/devices/cpu/e132xs/e1fe.h226
-rw-r--r--src/devices/cpu/es5510/es5510.cpp1288
-rw-r--r--src/devices/cpu/es5510/es5510.h199
-rw-r--r--src/devices/cpu/es5510/es5510d.cpp21
-rw-r--r--src/devices/cpu/es5510/es5510d.h25
-rw-r--r--src/devices/cpu/esrip/esrip.cpp1949
-rw-r--r--src/devices/cpu/esrip/esrip.h251
-rw-r--r--src/devices/cpu/esrip/esripdsm.cpp99
-rw-r--r--src/devices/cpu/esrip/esripdsm.h27
-rw-r--r--src/devices/cpu/f2mc16/f2mc16.cpp5611
-rw-r--r--src/devices/cpu/f2mc16/f2mc16.h732
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_adc.cpp304
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_adc.h72
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_clock.cpp355
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_clock.h74
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_intc.cpp269
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_intc.h64
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_port.cpp127
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_port.h57
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_ppg.cpp348
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_ppg.h70
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_reload.cpp381
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_reload.h75
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_uart.cpp456
-rw-r--r--src/devices/cpu/f2mc16/f2mc16_uart.h98
-rw-r--r--src/devices/cpu/f2mc16/f2mc16d.cpp1641
-rw-r--r--src/devices/cpu/f2mc16/f2mc16d.h62
-rw-r--r--src/devices/cpu/f2mc16/mb90570.cpp169
-rw-r--r--src/devices/cpu/f2mc16/mb90570.h55
-rw-r--r--src/devices/cpu/f2mc16/mb90610a.cpp138
-rw-r--r--src/devices/cpu/f2mc16/mb90610a.h59
-rw-r--r--src/devices/cpu/f2mc16/mb90640a.cpp134
-rw-r--r--src/devices/cpu/f2mc16/mb90640a.h52
-rw-r--r--src/devices/cpu/f8/f8.cpp1937
-rw-r--r--src/devices/cpu/f8/f8.h214
-rw-r--r--src/devices/cpu/f8/f8dasm.cpp527
-rw-r--r--src/devices/cpu/f8/f8dasm.h21
-rw-r--r--src/devices/cpu/fr/fr.cpp141
-rw-r--r--src/devices/cpu/fr/fr.h72
-rw-r--r--src/devices/cpu/fr/frdasm.cpp977
-rw-r--r--src/devices/cpu/fr/frdasm.h49
-rw-r--r--src/devices/cpu/g65816/g65816.cpp1225
-rw-r--r--src/devices/cpu/g65816/g65816.h1588
-rw-r--r--src/devices/cpu/g65816/g65816cm.h244
-rw-r--r--src/devices/cpu/g65816/g65816ds.cpp333
-rw-r--r--src/devices/cpu/g65816/g65816ds.h70
-rw-r--r--src/devices/cpu/g65816/g65816o0.cpp7
-rw-r--r--src/devices/cpu/g65816/g65816o1.cpp7
-rw-r--r--src/devices/cpu/g65816/g65816o2.cpp7
-rw-r--r--src/devices/cpu/g65816/g65816o3.cpp7
-rw-r--r--src/devices/cpu/g65816/g65816o4.cpp7
-rw-r--r--src/devices/cpu/g65816/g65816op.ipp1963
-rw-r--r--src/devices/cpu/gigatron/gigatron.cpp378
-rw-r--r--src/devices/cpu/gigatron/gigatron.h95
-rw-r--r--src/devices/cpu/gigatron/gigatrondasm.cpp161
-rw-r--r--src/devices/cpu/gigatron/gigatrondasm.h26
-rw-r--r--src/devices/cpu/h16/h16dasm.cpp1063
-rw-r--r--src/devices/cpu/h16/h16dasm.h55
-rw-r--r--src/devices/cpu/h16/hd641016.cpp235
-rw-r--r--src/devices/cpu/h16/hd641016.h142
-rw-r--r--src/devices/cpu/h6280/6280dasm.cpp203
-rw-r--r--src/devices/cpu/h6280/6280dasm.h90
-rw-r--r--src/devices/cpu/h6280/h6280.cpp2612
-rw-r--r--src/devices/cpu/h6280/h6280.h395
-rw-r--r--src/devices/cpu/h8/c77.cpp216
-rw-r--r--src/devices/cpu/h8/c77.h95
-rw-r--r--src/devices/cpu/h8/gt913.cpp294
-rw-r--r--src/devices/cpu/h8/gt913.h114
-rw-r--r--src/devices/cpu/h8/gt913.lst282
-rw-r--r--src/devices/cpu/h8/gt913d.cpp17
-rw-r--r--src/devices/cpu/h8/gt913d.h28
-rw-r--r--src/devices/cpu/h8/h8.cpp1573
-rw-r--r--src/devices/cpu/h8/h8.h462
-rw-r--r--src/devices/cpu/h8/h8.lst2927
-rw-r--r--src/devices/cpu/h8/h83002.cpp287
-rw-r--r--src/devices/cpu/h8/h83002.h99
-rw-r--r--src/devices/cpu/h8/h83003.cpp314
-rw-r--r--src/devices/cpu/h8/h83003.h109
-rw-r--r--src/devices/cpu/h8/h83006.cpp268
-rw-r--r--src/devices/cpu/h8/h83006.h99
-rw-r--r--src/devices/cpu/h8/h83008.cpp244
-rw-r--r--src/devices/cpu/h8/h83008.h89
-rw-r--r--src/devices/cpu/h8/h83032.cpp265
-rw-r--r--src/devices/cpu/h8/h83032.h111
-rw-r--r--src/devices/cpu/h8/h83042.cpp301
-rw-r--r--src/devices/cpu/h8/h83042.h119
-rw-r--r--src/devices/cpu/h8/h83048.cpp307
-rw-r--r--src/devices/cpu/h8/h83048.h129
-rw-r--r--src/devices/cpu/h8/h83217.cpp282
-rw-r--r--src/devices/cpu/h8/h83217.h120
-rw-r--r--src/devices/cpu/h8/h8325.cpp252
-rw-r--r--src/devices/cpu/h8/h8325.h126
-rw-r--r--src/devices/cpu/h8/h83337.cpp275
-rw-r--r--src/devices/cpu/h8/h83337.h118
-rw-r--r--src/devices/cpu/h8/h8_adc.cpp509
-rw-r--r--src/devices/cpu/h8/h8_adc.h189
-rw-r--r--src/devices/cpu/h8/h8_dma.cpp769
-rw-r--r--src/devices/cpu/h8/h8_dma.h276
-rw-r--r--src/devices/cpu/h8/h8_dtc.cpp280
-rw-r--r--src/devices/cpu/h8/h8_dtc.h78
-rw-r--r--src/devices/cpu/h8/h8_intc.cpp477
-rw-r--r--src/devices/cpu/h8/h8_intc.h163
-rw-r--r--src/devices/cpu/h8/h8_port.cpp140
-rw-r--r--src/devices/cpu/h8/h8_port.h62
-rw-r--r--src/devices/cpu/h8/h8_sci.cpp793
-rw-r--r--src/devices/cpu/h8/h8_sci.h153
-rw-r--r--src/devices/cpu/h8/h8_timer16.cpp825
-rw-r--r--src/devices/cpu/h8/h8_timer16.h284
-rw-r--r--src/devices/cpu/h8/h8_timer8.cpp367
-rw-r--r--src/devices/cpu/h8/h8_timer8.h132
-rw-r--r--src/devices/cpu/h8/h8_watchdog.cpp149
-rw-r--r--src/devices/cpu/h8/h8_watchdog.h74
-rw-r--r--src/devices/cpu/h8/h8d.cpp297
-rw-r--r--src/devices/cpu/h8/h8d.h106
-rw-r--r--src/devices/cpu/h8/h8h.cpp19
-rw-r--r--src/devices/cpu/h8/h8h.h110
-rw-r--r--src/devices/cpu/h8/h8hd.cpp17
-rw-r--r--src/devices/cpu/h8/h8hd.h28
-rw-r--r--src/devices/cpu/h8/h8make.py514
-rw-r--r--src/devices/cpu/h8/h8s2000.cpp18
-rw-r--r--src/devices/cpu/h8/h8s2000.h74
-rw-r--r--src/devices/cpu/h8/h8s2000d.cpp17
-rw-r--r--src/devices/cpu/h8/h8s2000d.h28
-rw-r--r--src/devices/cpu/h8/h8s2245.cpp366
-rw-r--r--src/devices/cpu/h8/h8s2245.h132
-rw-r--r--src/devices/cpu/h8/h8s2319.cpp473
-rw-r--r--src/devices/cpu/h8/h8s2319.h164
-rw-r--r--src/devices/cpu/h8/h8s2329.cpp179
-rw-r--r--src/devices/cpu/h8/h8s2329.h121
-rw-r--r--src/devices/cpu/h8/h8s2357.cpp436
-rw-r--r--src/devices/cpu/h8/h8s2357.h152
-rw-r--r--src/devices/cpu/h8/h8s2600.cpp31
-rw-r--r--src/devices/cpu/h8/h8s2600.h42
-rw-r--r--src/devices/cpu/h8/h8s2600d.cpp17
-rw-r--r--src/devices/cpu/h8/h8s2600d.h28
-rw-r--r--src/devices/cpu/h8/h8s2655.cpp456
-rw-r--r--src/devices/cpu/h8/h8s2655.h120
-rw-r--r--src/devices/cpu/h8/swx00.cpp565
-rw-r--r--src/devices/cpu/h8/swx00.h150
-rw-r--r--src/devices/cpu/h8500/h8500.cpp140
-rw-r--r--src/devices/cpu/h8500/h8500.h74
-rw-r--r--src/devices/cpu/h8500/h8500dasm.cpp578
-rw-r--r--src/devices/cpu/h8500/h8500dasm.h46
-rw-r--r--src/devices/cpu/h8500/h8510.cpp112
-rw-r--r--src/devices/cpu/h8500/h8510.h29
-rw-r--r--src/devices/cpu/h8500/h8520.cpp116
-rw-r--r--src/devices/cpu/h8500/h8520.h37
-rw-r--r--src/devices/cpu/h8500/h8532.cpp128
-rw-r--r--src/devices/cpu/h8500/h8532.h37
-rw-r--r--src/devices/cpu/h8500/h8534.cpp179
-rw-r--r--src/devices/cpu/h8500/h8534.h66
-rw-r--r--src/devices/cpu/hcd62121/hcd62121.cpp2267
-rw-r--r--src/devices/cpu/hcd62121/hcd62121.h147
-rw-r--r--src/devices/cpu/hcd62121/hcd62121d.cpp429
-rw-r--r--src/devices/cpu/hcd62121/hcd62121d.h62
-rw-r--r--src/devices/cpu/hd61700/hd61700.cpp2955
-rw-r--r--src/devices/cpu/hd61700/hd61700.h139
-rw-r--r--src/devices/cpu/hd61700/hd61700d.cpp406
-rw-r--r--src/devices/cpu/hd61700/hd61700d.h70
-rw-r--r--src/devices/cpu/hmcs40/hmcs40.cpp795
-rw-r--r--src/devices/cpu/hmcs40/hmcs40.h488
-rw-r--r--src/devices/cpu/hmcs40/hmcs40d.cpp244
-rw-r--r--src/devices/cpu/hmcs40/hmcs40d.h39
-rw-r--r--src/devices/cpu/hmcs40/hmcs40op.cpp690
-rw-r--r--src/devices/cpu/hmcs400/hmcs400.cpp1024
-rw-r--r--src/devices/cpu/hmcs400/hmcs400.h557
-rw-r--r--src/devices/cpu/hmcs400/hmcs400d.cpp237
-rw-r--r--src/devices/cpu/hmcs400/hmcs400d.h31
-rw-r--r--src/devices/cpu/hmcs400/hmcs400op.cpp692
-rw-r--r--src/devices/cpu/hp2100/hp2100d.cpp656
-rw-r--r--src/devices/cpu/hp2100/hp2100d.h50
-rw-r--r--src/devices/cpu/hpc/hpc.cpp144
-rw-r--r--src/devices/cpu/hpc/hpc.h88
-rw-r--r--src/devices/cpu/hpc/hpcdasm.cpp765
-rw-r--r--src/devices/cpu/hpc/hpcdasm.h58
-rw-r--r--src/devices/cpu/hphybrid/hphybrid.cpp2086
-rw-r--r--src/devices/cpu/hphybrid/hphybrid.h305
-rw-r--r--src/devices/cpu/hphybrid/hphybrid_dasm.cpp469
-rw-r--r--src/devices/cpu/hphybrid/hphybrid_dasm.h79
-rw-r--r--src/devices/cpu/hphybrid/hphybrid_defs.h37
-rw-r--r--src/devices/cpu/ht1130/ht1130.cpp1129
-rw-r--r--src/devices/cpu/ht1130/ht1130.h144
-rw-r--r--src/devices/cpu/ht1130/ht1130d.cpp667
-rw-r--r--src/devices/cpu/ht1130/ht1130d.h22
-rw-r--r--src/devices/cpu/i386/athlon.cpp1003
-rw-r--r--src/devices/cpu/i386/athlon.h76
-rw-r--r--src/devices/cpu/i386/cache.h259
-rw-r--r--src/devices/cpu/i386/cpuidmsrs.hxx170
-rw-r--r--src/devices/cpu/i386/cycles.h343
-rw-r--r--src/devices/cpu/i386/i386.cpp3528
-rw-r--r--src/devices/cpu/i386/i386.h1720
-rw-r--r--src/devices/cpu/i386/i386dasm.cpp2963
-rw-r--r--src/devices/cpu/i386/i386dasm.h214
-rw-r--r--src/devices/cpu/i386/i386op16.hxx3802
-rw-r--r--src/devices/cpu/i386/i386op32.hxx3602
-rw-r--r--src/devices/cpu/i386/i386ops.h858
-rw-r--r--src/devices/cpu/i386/i386ops.hxx2627
-rw-r--r--src/devices/cpu/i386/i386priv.h727
-rw-r--r--src/devices/cpu/i386/i386segs.hxx2573
-rw-r--r--src/devices/cpu/i386/i486ops.hxx546
-rw-r--r--src/devices/cpu/i386/pentops.hxx6863
-rw-r--r--src/devices/cpu/i386/x87ops.hxx5516
-rw-r--r--src/devices/cpu/i386/x87priv.h159
-rw-r--r--src/devices/cpu/i8008/8008dasm.cpp118
-rw-r--r--src/devices/cpu/i8008/8008dasm.h31
-rw-r--r--src/devices/cpu/i8008/i8008.cpp678
-rw-r--r--src/devices/cpu/i8008/i8008.h92
-rw-r--r--src/devices/cpu/i8085/8085dasm.cpp285
-rw-r--r--src/devices/cpu/i8085/8085dasm.h24
-rw-r--r--src/devices/cpu/i8085/i8085.cpp1661
-rw-r--r--src/devices/cpu/i8085/i8085.h201
-rw-r--r--src/devices/cpu/i8089/i8089.cpp368
-rw-r--r--src/devices/cpu/i8089/i8089.h144
-rw-r--r--src/devices/cpu/i8089/i8089_channel.cpp862
-rw-r--r--src/devices/cpu/i8089/i8089_channel.h209
-rw-r--r--src/devices/cpu/i8089/i8089_dasm.cpp392
-rw-r--r--src/devices/cpu/i8089/i8089_dasm.h71
-rw-r--r--src/devices/cpu/i8089/i8089_ops.cpp416
-rw-r--r--src/devices/cpu/i86/i186.cpp2079
-rw-r--r--src/devices/cpu/i86/i186.h202
-rw-r--r--src/devices/cpu/i86/i286.cpp2057
-rw-r--r--src/devices/cpu/i86/i286.h177
-rw-r--r--src/devices/cpu/i86/i86.cpp2558
-rw-r--r--src/devices/cpu/i86/i86.h395
-rw-r--r--src/devices/cpu/i86/i86.txt115
-rw-r--r--src/devices/cpu/i86/i86inline.h936
-rw-r--r--src/devices/cpu/i860/i860.cpp243
-rw-r--r--src/devices/cpu/i860/i860.h308
-rw-r--r--src/devices/cpu/i860/i860dec.hxx4679
-rw-r--r--src/devices/cpu/i860/i860dis.cpp671
-rw-r--r--src/devices/cpu/i860/i860dis.h77
-rw-r--r--src/devices/cpu/i960/i960.cpp2421
-rw-r--r--src/devices/cpu/i960/i960.h203
-rw-r--r--src/devices/cpu/i960/i960dis.cpp576
-rw-r--r--src/devices/cpu/i960/i960dis.h39
-rw-r--r--src/devices/cpu/ibm1800/ibm1800d.cpp258
-rw-r--r--src/devices/cpu/ibm1800/ibm1800d.h35
-rw-r--r--src/devices/cpu/ie15/ie15.cpp458
-rw-r--r--src/devices/cpu/ie15/ie15.h83
-rw-r--r--src/devices/cpu/ie15/ie15dasm.cpp130
-rw-r--r--src/devices/cpu/ie15/ie15dasm.h19
-rw-r--r--src/devices/cpu/interdata16/dasm16.cpp428
-rw-r--r--src/devices/cpu/interdata16/dasm16.h25
-rw-r--r--src/devices/cpu/jaguar/jagdasm.cpp186
-rw-r--r--src/devices/cpu/jaguar/jagdasm.h40
-rw-r--r--src/devices/cpu/jaguar/jaguar.cpp1606
-rw-r--r--src/devices/cpu/jaguar/jaguar.h307
-rw-r--r--src/devices/cpu/ks0164/ks0164.cpp771
-rw-r--r--src/devices/cpu/ks0164/ks0164.h73
-rw-r--r--src/devices/cpu/ks0164/ks0164d.cpp245
-rw-r--r--src/devices/cpu/ks0164/ks0164d.h35
-rw-r--r--src/devices/cpu/lc57/lc57d.cpp131
-rw-r--r--src/devices/cpu/lc57/lc57d.h30
-rw-r--r--src/devices/cpu/lc58/lc58d.cpp160
-rw-r--r--src/devices/cpu/lc58/lc58d.h30
-rw-r--r--src/devices/cpu/lc6500/lc6500_dasm.cpp155
-rw-r--r--src/devices/cpu/lc6500/lc6500_dasm.h28
-rw-r--r--src/devices/cpu/lc6500/lc6554.cpp816
-rw-r--r--src/devices/cpu/lc6500/lc6554.h241
-rw-r--r--src/devices/cpu/lc8670/lc8670.cpp1790
-rw-r--r--src/devices/cpu/lc8670/lc8670.h238
-rw-r--r--src/devices/cpu/lc8670/lc8670dsm.cpp239
-rw-r--r--src/devices/cpu/lc8670/lc8670dsm.h27
-rw-r--r--src/devices/cpu/lh5801/5801dasm.cpp662
-rw-r--r--src/devices/cpu/lh5801/5801dasm.h112
-rw-r--r--src/devices/cpu/lh5801/5801tbl.hxx1551
-rw-r--r--src/devices/cpu/lh5801/lh5801.cpp262
-rw-r--r--src/devices/cpu/lh5801/lh5801.h182
-rw-r--r--src/devices/cpu/lr35902/lr35902.cpp403
-rw-r--r--src/devices/cpu/lr35902/lr35902.h132
-rw-r--r--src/devices/cpu/lr35902/lr35902d.cpp267
-rw-r--r--src/devices/cpu/lr35902/lr35902d.h48
-rw-r--r--src/devices/cpu/lr35902/opc_cb.hxx1539
-rw-r--r--src/devices/cpu/lr35902/opc_main.hxx1451
-rw-r--r--src/devices/cpu/m16c/m16cdasm.cpp1225
-rw-r--r--src/devices/cpu/m16c/m16cdasm.h52
-rw-r--r--src/devices/cpu/m32c/m32cdasm.cpp1245
-rw-r--r--src/devices/cpu/m32c/m32cdasm.h57
-rw-r--r--src/devices/cpu/m37710/m37710.cpp1593
-rw-r--r--src/devices/cpu/m37710/m37710.h2211
-rw-r--r--src/devices/cpu/m37710/m37710cm.h398
-rw-r--r--src/devices/cpu/m37710/m37710il.h207
-rw-r--r--src/devices/cpu/m37710/m37710o0.cpp7
-rw-r--r--src/devices/cpu/m37710/m37710o1.cpp7
-rw-r--r--src/devices/cpu/m37710/m37710o2.cpp7
-rw-r--r--src/devices/cpu/m37710/m37710o3.cpp7
-rw-r--r--src/devices/cpu/m37710/m37710op.h2558
-rw-r--r--src/devices/cpu/m37710/m7700ds.cpp553
-rw-r--r--src/devices/cpu/m37710/m7700ds.h107
-rw-r--r--src/devices/cpu/m6502/ddeco16.lst20
-rw-r--r--src/devices/cpu/m6502/deco16.cpp58
-rw-r--r--src/devices/cpu/m6502/deco16.h62
-rw-r--r--src/devices/cpu/m6502/deco16d.cpp17
-rw-r--r--src/devices/cpu/m6502/deco16d.h28
-rw-r--r--src/devices/cpu/m6502/dm4510.lst20
-rw-r--r--src/devices/cpu/m6502/dm6502.lst20
-rw-r--r--src/devices/cpu/m6502/dm6509.lst20
-rw-r--r--src/devices/cpu/m6502/dm6510.lst20
-rw-r--r--src/devices/cpu/m6502/dm65ce02.lst20
-rw-r--r--src/devices/cpu/m6502/dm740.lst36
-rw-r--r--src/devices/cpu/m6502/dr65c02.lst20
-rw-r--r--src/devices/cpu/m6502/dr65c19.lst20
-rw-r--r--src/devices/cpu/m6502/drp2a03.lst20
-rw-r--r--src/devices/cpu/m6502/dvt3xx_spu.lst20
-rw-r--r--src/devices/cpu/m6502/dw65c02.lst20
-rw-r--r--src/devices/cpu/m6502/dw65c02s.lst20
-rw-r--r--src/devices/cpu/m6502/dxavix.lst20
-rw-r--r--src/devices/cpu/m6502/dxavix2000.lst20
-rw-r--r--src/devices/cpu/m6502/g65sc02.cpp46
-rw-r--r--src/devices/cpu/m6502/g65sc02.h54
-rw-r--r--src/devices/cpu/m6502/gew12.cpp229
-rw-r--r--src/devices/cpu/m6502/gew12.h78
-rw-r--r--src/devices/cpu/m6502/gew7.cpp216
-rw-r--r--src/devices/cpu/m6502/gew7.h74
-rw-r--r--src/devices/cpu/m6502/m3745x.cpp400
-rw-r--r--src/devices/cpu/m6502/m3745x.h100
-rw-r--r--src/devices/cpu/m6502/m37640.cpp31
-rw-r--r--src/devices/cpu/m6502/m37640.h38
-rw-r--r--src/devices/cpu/m6502/m4510.cpp170
-rw-r--r--src/devices/cpu/m6502/m4510.h94
-rw-r--r--src/devices/cpu/m6502/m4510d.cpp17
-rw-r--r--src/devices/cpu/m6502/m4510d.h28
-rw-r--r--src/devices/cpu/m6502/m50734.cpp473
-rw-r--r--src/devices/cpu/m6502/m50734.h160
-rw-r--r--src/devices/cpu/m6502/m5074x.cpp641
-rw-r--r--src/devices/cpu/m6502/m5074x.h163
-rw-r--r--src/devices/cpu/m6502/m6500_1.cpp514
-rw-r--r--src/devices/cpu/m6502/m6500_1.h132
-rw-r--r--src/devices/cpu/m6502/m6502.cpp585
-rw-r--r--src/devices/cpu/m6502/m6502.h308
-rw-r--r--src/devices/cpu/m6502/m6502.txt (renamed from src/emu/cpu/m6502/m6502.txt)20
-rw-r--r--src/devices/cpu/m6502/m6502d.cpp218
-rw-r--r--src/devices/cpu/m6502/m6502d.h86
-rwxr-xr-xsrc/devices/cpu/m6502/m6502make.py294
-rw-r--r--src/devices/cpu/m6502/m6502mcu.h37
-rw-r--r--src/devices/cpu/m6502/m6502mcu.ipp75
-rw-r--r--src/devices/cpu/m6502/m6503.cpp25
-rw-r--r--src/devices/cpu/m6502/m6503.h28
-rw-r--r--src/devices/cpu/m6502/m6504.cpp25
-rw-r--r--src/devices/cpu/m6502/m6504.h28
-rw-r--r--src/devices/cpu/m6502/m6507.cpp25
-rw-r--r--src/devices/cpu/m6502/m6507.h28
-rw-r--r--src/devices/cpu/m6502/m6509.cpp118
-rw-r--r--src/devices/cpu/m6502/m6509.h75
-rw-r--r--src/devices/cpu/m6502/m6509d.cpp17
-rw-r--r--src/devices/cpu/m6502/m6509d.h28
-rw-r--r--src/devices/cpu/m6502/m6510.cpp222
-rw-r--r--src/devices/cpu/m6502/m6510.h107
-rw-r--r--src/devices/cpu/m6502/m6510d.cpp17
-rw-r--r--src/devices/cpu/m6502/m6510d.h28
-rw-r--r--src/devices/cpu/m6502/m6510t.cpp19
-rw-r--r--src/devices/cpu/m6502/m6510t.h28
-rw-r--r--src/devices/cpu/m6502/m65ce02.cpp92
-rw-r--r--src/devices/cpu/m6502/m65ce02.h152
-rw-r--r--src/devices/cpu/m6502/m65ce02d.cpp17
-rw-r--r--src/devices/cpu/m6502/m65ce02d.h28
-rw-r--r--src/devices/cpu/m6502/m740.cpp234
-rw-r--r--src/devices/cpu/m6502/m740.h141
-rw-r--r--src/devices/cpu/m6502/m740d.cpp22
-rw-r--r--src/devices/cpu/m6502/m740d.h37
-rw-r--r--src/devices/cpu/m6502/m7501.cpp19
-rw-r--r--src/devices/cpu/m6502/m7501.h28
-rw-r--r--src/devices/cpu/m6502/m8502.cpp19
-rw-r--r--src/devices/cpu/m6502/m8502.h29
-rw-r--r--src/devices/cpu/m6502/odeco16.lst115
-rw-r--r--src/devices/cpu/m6502/om4510.lst23
-rw-r--r--src/devices/cpu/m6502/om6502.lst2278
-rw-r--r--src/devices/cpu/m6502/om6509.lst24
-rw-r--r--src/devices/cpu/m6502/om6510.lst55
-rw-r--r--src/devices/cpu/m6502/om65ce02.lst1790
-rw-r--r--src/devices/cpu/m6502/om740.lst1887
-rw-r--r--src/devices/cpu/m6502/or65c19.lst488
-rw-r--r--src/devices/cpu/m6502/orp2a03.lst347
-rw-r--r--src/devices/cpu/m6502/ovt3xx_spu.lst77
-rw-r--r--src/devices/cpu/m6502/ow65c02.lst897
-rw-r--r--src/devices/cpu/m6502/ow65c02s.lst968
-rw-r--r--src/devices/cpu/m6502/oxavix.lst1106
-rw-r--r--src/devices/cpu/m6502/oxavix2000.lst535
-rw-r--r--src/devices/cpu/m6502/r65c02.cpp48
-rw-r--r--src/devices/cpu/m6502/r65c02.h52
-rw-r--r--src/devices/cpu/m6502/r65c02d.cpp17
-rw-r--r--src/devices/cpu/m6502/r65c02d.h28
-rw-r--r--src/devices/cpu/m6502/r65c19.cpp290
-rw-r--r--src/devices/cpu/m6502/r65c19.h165
-rw-r--r--src/devices/cpu/m6502/r65c19d.cpp10
-rw-r--r--src/devices/cpu/m6502/r65c19d.h21
-rw-r--r--src/devices/cpu/m6502/rp2a03.cpp99
-rw-r--r--src/devices/cpu/m6502/rp2a03.h91
-rw-r--r--src/devices/cpu/m6502/rp2a03d.cpp17
-rw-r--r--src/devices/cpu/m6502/rp2a03d.h28
-rw-r--r--src/devices/cpu/m6502/st2204.cpp728
-rw-r--r--src/devices/cpu/m6502/st2204.h163
-rw-r--r--src/devices/cpu/m6502/st2205u.cpp1367
-rw-r--r--src/devices/cpu/m6502/st2205u.h320
-rw-r--r--src/devices/cpu/m6502/st2xxx.cpp914
-rw-r--r--src/devices/cpu/m6502/st2xxx.h299
-rw-r--r--src/devices/cpu/m6502/vt3xx_spu.cpp107
-rw-r--r--src/devices/cpu/m6502/vt3xx_spu.h67
-rw-r--r--src/devices/cpu/m6502/vt3xx_spud.cpp15
-rw-r--r--src/devices/cpu/m6502/vt3xx_spud.h26
-rw-r--r--src/devices/cpu/m6502/w65c02.cpp61
-rw-r--r--src/devices/cpu/m6502/w65c02.h80
-rw-r--r--src/devices/cpu/m6502/w65c02d.cpp18
-rw-r--r--src/devices/cpu/m6502/w65c02d.h29
-rw-r--r--src/devices/cpu/m6502/w65c02s.cpp33
-rw-r--r--src/devices/cpu/m6502/w65c02s.h71
-rw-r--r--src/devices/cpu/m6502/xavix.cpp376
-rw-r--r--src/devices/cpu/m6502/xavix.h233
-rw-r--r--src/devices/cpu/m6502/xavix2000.cpp122
-rw-r--r--src/devices/cpu/m6502/xavix2000.h174
-rw-r--r--src/devices/cpu/m6502/xavix2000d.cpp15
-rw-r--r--src/devices/cpu/m6502/xavix2000d.h26
-rw-r--r--src/devices/cpu/m6502/xavixd.cpp15
-rw-r--r--src/devices/cpu/m6502/xavixd.h26
-rw-r--r--src/devices/cpu/m6800/6800dasm.cpp211
-rw-r--r--src/devices/cpu/m6800/6800dasm.h66
-rw-r--r--src/devices/cpu/m6800/6800ops.hxx2352
-rw-r--r--src/devices/cpu/m6800/m6800.cpp654
-rw-r--r--src/devices/cpu/m6800/m6800.h408
-rw-r--r--src/devices/cpu/m6800/m6801.cpp2598
-rw-r--r--src/devices/cpu/m6800/m6801.h547
-rw-r--r--src/devices/cpu/m68000/fscpu32.cpp24
-rw-r--r--src/devices/cpu/m68000/fscpu32.h26
-rw-r--r--src/devices/cpu/m68000/m68000-decode.cpp1537
-rw-r--r--src/devices/cpu/m68000/m68000-head.h6144
-rw-r--r--src/devices/cpu/m68000/m68000-sdf.cpp185362
-rw-r--r--src/devices/cpu/m68000/m68000-sdp.cpp209705
-rw-r--r--src/devices/cpu/m68000/m68000-sif.cpp185362
-rw-r--r--src/devices/cpu/m68000/m68000-sip.cpp209705
-rw-r--r--src/devices/cpu/m68000/m68000.cpp544
-rw-r--r--src/devices/cpu/m68000/m68000.h949
-rw-r--r--src/devices/cpu/m68000/m68000.lst1528
-rwxr-xr-xsrc/devices/cpu/m68000/m68000gen.py2569
-rw-r--r--src/devices/cpu/m68000/m68000mcu-head.h6144
-rw-r--r--src/devices/cpu/m68000/m68000mcu-sdfm.cpp185362
-rw-r--r--src/devices/cpu/m68000/m68000mcu-sdpm.cpp209705
-rw-r--r--src/devices/cpu/m68000/m68000mcu-sifm.cpp185362
-rw-r--r--src/devices/cpu/m68000/m68000mcu-sipm.cpp209705
-rw-r--r--src/devices/cpu/m68000/m68000mcu.cpp109
-rw-r--r--src/devices/cpu/m68000/m68000mcu.h36
-rw-r--r--src/devices/cpu/m68000/m68000musashi.cpp25
-rw-r--r--src/devices/cpu/m68000/m68000musashi.h27
-rw-r--r--src/devices/cpu/m68000/m68008-head.h6144
-rw-r--r--src/devices/cpu/m68000/m68008-sdf8.cpp239437
-rw-r--r--src/devices/cpu/m68000/m68008-sdp8.cpp274773
-rw-r--r--src/devices/cpu/m68000/m68008-sif8.cpp239437
-rw-r--r--src/devices/cpu/m68000/m68008-sip8.cpp274773
-rw-r--r--src/devices/cpu/m68000/m68008.cpp126
-rw-r--r--src/devices/cpu/m68000/m68008.h93
-rw-r--r--src/devices/cpu/m68000/m68010.cpp35
-rw-r--r--src/devices/cpu/m68000/m68010.h32
-rw-r--r--src/devices/cpu/m68000/m68020.cpp112
-rw-r--r--src/devices/cpu/m68000/m68020.h93
-rw-r--r--src/devices/cpu/m68000/m68030.cpp42
-rw-r--r--src/devices/cpu/m68000/m68030.h43
-rw-r--r--src/devices/cpu/m68000/m68040.cpp64
-rw-r--r--src/devices/cpu/m68000/m68040.h59
-rw-r--r--src/devices/cpu/m68000/m68k_in.lst8297
-rw-r--r--src/devices/cpu/m68000/m68kcommon.cpp19
-rw-r--r--src/devices/cpu/m68000/m68kcommon.h77
-rw-r--r--src/devices/cpu/m68000/m68kcpu.cpp2766
-rw-r--r--src/devices/cpu/m68000/m68kcpu.h1699
-rw-r--r--src/devices/cpu/m68000/m68kdasm.cpp3582
-rw-r--r--src/devices/cpu/m68000/m68kdasm.h456
-rw-r--r--src/devices/cpu/m68000/m68kfpu.cpp2570
-rwxr-xr-xsrc/devices/cpu/m68000/m68kmake.py309
-rw-r--r--src/devices/cpu/m68000/m68kmmu.h1323
-rw-r--r--src/devices/cpu/m68000/m68kmusashi.h387
-rw-r--r--src/devices/cpu/m68000/m68kops.cpp35499
-rw-r--r--src/devices/cpu/m68000/m68kops.h2053
-rw-r--r--src/devices/cpu/m68000/mcf5206e.cpp1398
-rw-r--r--src/devices/cpu/m68000/mcf5206e.h528
-rw-r--r--src/devices/cpu/m68000/scc68070.cpp54
-rw-r--r--src/devices/cpu/m68000/scc68070.h30
-rw-r--r--src/devices/cpu/m68000/tmp68301.cpp1335
-rw-r--r--src/devices/cpu/m68000/tmp68301.h320
-rw-r--r--src/devices/cpu/m6805/6805dasm.cpp221
-rw-r--r--src/devices/cpu/m6805/6805dasm.h100
-rw-r--r--src/devices/cpu/m6805/6805ops.hxx823
-rw-r--r--src/devices/cpu/m6805/hd6305.cpp639
-rw-r--r--src/devices/cpu/m6805/hd6305.h229
-rw-r--r--src/devices/cpu/m6805/m6805.cpp727
-rw-r--r--src/devices/cpu/m6805/m6805.h339
-rw-r--r--src/devices/cpu/m6805/m6805defs.h119
-rw-r--r--src/devices/cpu/m6805/m68705.cpp1053
-rw-r--r--src/devices/cpu/m6805/m68705.h479
-rw-r--r--src/devices/cpu/m6805/m68hc05.cpp1344
-rw-r--r--src/devices/cpu/m6805/m68hc05.h341
-rw-r--r--src/devices/cpu/m6805/m68hc05e1.cpp294
-rw-r--r--src/devices/cpu/m6805/m68hc05e1.h99
-rw-r--r--src/devices/cpu/m6805/m68hc05pge.cpp971
-rw-r--r--src/devices/cpu/m6805/m68hc05pge.h154
-rw-r--r--src/devices/cpu/m6809/6x09dasm.cpp1529
-rw-r--r--src/devices/cpu/m6809/6x09dasm.h157
-rw-r--r--src/devices/cpu/m6809/base6x09.lst702
-rw-r--r--src/devices/cpu/m6809/hd6309.cpp766
-rw-r--r--src/devices/cpu/m6809/hd6309.h155
-rw-r--r--src/devices/cpu/m6809/hd6309.lst1088
-rw-r--r--src/devices/cpu/m6809/konami.cpp340
-rw-r--r--src/devices/cpu/m6809/konami.h77
-rw-r--r--src/devices/cpu/m6809/konami.lst632
-rw-r--r--src/devices/cpu/m6809/m6809.cpp660
-rw-r--r--src/devices/cpu/m6809/m6809.h347
-rw-r--r--src/devices/cpu/m6809/m6809.lst758
-rw-r--r--src/devices/cpu/m6809/m6809inl.h278
-rw-r--r--src/devices/cpu/m6809/m6809make.py128
-rw-r--r--src/devices/cpu/m68hc16/cpu16.cpp5451
-rw-r--r--src/devices/cpu/m68hc16/cpu16.h129
-rw-r--r--src/devices/cpu/m68hc16/cpu16dasm.cpp1404
-rw-r--r--src/devices/cpu/m68hc16/cpu16dasm.h59
-rw-r--r--src/devices/cpu/m68hc16/m68hc16z.cpp450
-rw-r--r--src/devices/cpu/m68hc16/m68hc16z.h105
-rw-r--r--src/devices/cpu/m88000/m88000.cpp1831
-rw-r--r--src/devices/cpu/m88000/m88000.h95
-rw-r--r--src/devices/cpu/m88000/m88000d.cpp1274
-rw-r--r--src/devices/cpu/m88000/m88000d.h106
-rw-r--r--src/devices/cpu/mb86233/mb86233.cpp1229
-rw-r--r--src/devices/cpu/mb86233/mb86233.h144
-rw-r--r--src/devices/cpu/mb86233/mb86233d.cpp531
-rw-r--r--src/devices/cpu/mb86233/mb86233d.h26
-rw-r--r--src/devices/cpu/mb86235/mb86235.cpp301
-rw-r--r--src/devices/cpu/mb86235/mb86235.h287
-rw-r--r--src/devices/cpu/mb86235/mb86235d.cpp782
-rw-r--r--src/devices/cpu/mb86235/mb86235d.h42
-rw-r--r--src/devices/cpu/mb86235/mb86235drc.cpp1828
-rw-r--r--src/devices/cpu/mb86235/mb86235fe.cpp888
-rw-r--r--src/devices/cpu/mb86235/mb86235fe.h201
-rw-r--r--src/devices/cpu/mb86235/mb86235ops.cpp1535
-rw-r--r--src/devices/cpu/mb88xx/mb88dasm.cpp137
-rw-r--r--src/devices/cpu/mb88xx/mb88dasm.h26
-rw-r--r--src/devices/cpu/mb88xx/mb88xx.cpp1001
-rw-r--r--src/devices/cpu/mb88xx/mb88xx.h256
-rw-r--r--src/devices/cpu/mc68hc11/hc11dasm.cpp1255
-rw-r--r--src/devices/cpu/mc68hc11/hc11dasm.h55
-rw-r--r--src/devices/cpu/mc68hc11/hc11ops.h319
-rw-r--r--src/devices/cpu/mc68hc11/hc11ops.hxx4235
-rw-r--r--src/devices/cpu/mc68hc11/mc68hc11.cpp1239
-rw-r--r--src/devices/cpu/mc68hc11/mc68hc11.h646
-rw-r--r--src/devices/cpu/mcs40/mcs40.cpp1217
-rw-r--r--src/devices/cpu/mcs40/mcs40.h308
-rw-r--r--src/devices/cpu/mcs40/mcs40dasm.cpp140
-rw-r--r--src/devices/cpu/mcs40/mcs40dasm.h84
-rw-r--r--src/devices/cpu/mcs48/mcs48.cpp1559
-rw-r--r--src/devices/cpu/mcs48/mcs48.h692
-rw-r--r--src/devices/cpu/mcs48/mcs48dsm.cpp512
-rw-r--r--src/devices/cpu/mcs48/mcs48dsm.h31
-rw-r--r--src/devices/cpu/mcs51/ds5002fp.cpp391
-rw-r--r--src/devices/cpu/mcs51/ds5002fp.h118
-rw-r--r--src/devices/cpu/mcs51/i8051.cpp1379
-rw-r--r--src/devices/cpu/mcs51/i8051.h513
-rw-r--r--src/devices/cpu/mcs51/i8052.cpp182
-rw-r--r--src/devices/cpu/mcs51/i8052.h79
-rw-r--r--src/devices/cpu/mcs51/i80c51.cpp135
-rw-r--r--src/devices/cpu/mcs51/i80c51.h102
-rw-r--r--src/devices/cpu/mcs51/i80c52.cpp156
-rw-r--r--src/devices/cpu/mcs51/i80c52.h105
-rw-r--r--src/devices/cpu/mcs51/mcs51dasm.cpp1693
-rw-r--r--src/devices/cpu/mcs51/mcs51dasm.h162
-rw-r--r--src/devices/cpu/mcs51/mcs51ops.cpp1451
-rw-r--r--src/devices/cpu/mcs51/sab80c535.cpp130
-rw-r--r--src/devices/cpu/mcs51/sab80c535.h51
-rw-r--r--src/devices/cpu/mcs96/i8x9x.cpp587
-rw-r--r--src/devices/cpu/mcs96/i8x9x.h209
-rw-r--r--src/devices/cpu/mcs96/i8x9xd.cpp86
-rw-r--r--src/devices/cpu/mcs96/i8x9xd.h30
-rw-r--r--src/devices/cpu/mcs96/i8xc196.cpp37
-rw-r--r--src/devices/cpu/mcs96/i8xc196.h42
-rw-r--r--src/devices/cpu/mcs96/i8xc196d.cpp18
-rw-r--r--src/devices/cpu/mcs96/i8xc196d.h26
-rw-r--r--src/devices/cpu/mcs96/mcs96.cpp391
-rw-r--r--src/devices/cpu/mcs96/mcs96.h224
-rw-r--r--src/devices/cpu/mcs96/mcs96d.cpp391
-rw-r--r--src/devices/cpu/mcs96/mcs96d.h82
-rw-r--r--src/devices/cpu/mcs96/mcs96make.py202
-rw-r--r--src/devices/cpu/mcs96/mcs96ops.lst1929
-rw-r--r--src/devices/cpu/melps4/m58846.cpp204
-rw-r--r--src/devices/cpu/melps4/m58846.h46
-rw-r--r--src/devices/cpu/melps4/melps4.cpp460
-rw-r--r--src/devices/cpu/melps4/melps4.h317
-rw-r--r--src/devices/cpu/melps4/melps4d.cpp144
-rw-r--r--src/devices/cpu/melps4/melps4d.h33
-rw-r--r--src/devices/cpu/melps4/melps4op.cpp700
-rw-r--r--src/devices/cpu/minx/minx.cpp280
-rw-r--r--src/devices/cpu/minx/minx.h117
-rw-r--r--src/devices/cpu/minx/minxd.cpp409
-rw-r--r--src/devices/cpu/minx/minxd.h89
-rw-r--r--src/devices/cpu/minx/minxfunc.h364
-rw-r--r--src/devices/cpu/minx/minxopce.h563
-rw-r--r--src/devices/cpu/minx/minxopcf.h563
-rw-r--r--src/devices/cpu/minx/minxops.h563
-rw-r--r--src/devices/cpu/mips/mips1.cpp2151
-rw-r--r--src/devices/cpu/mips/mips1.h270
-rw-r--r--src/devices/cpu/mips/mips1dsm.cpp393
-rw-r--r--src/devices/cpu/mips/mips1dsm.h36
-rw-r--r--src/devices/cpu/mips/mips3.cpp5905
-rw-r--r--src/devices/cpu/mips/mips3.h1031
-rw-r--r--src/devices/cpu/mips/mips3com.cpp465
-rw-r--r--src/devices/cpu/mips/mips3com.h229
-rw-r--r--src/devices/cpu/mips/mips3drc.cpp3653
-rw-r--r--src/devices/cpu/mips/mips3dsm.cpp1098
-rw-r--r--src/devices/cpu/mips/mips3dsm.h70
-rw-r--r--src/devices/cpu/mips/mips3fe.cpp817
-rw-r--r--src/devices/cpu/mips/mips3fe.h132
-rw-r--r--src/devices/cpu/mips/o2dprintf.hxx398
-rw-r--r--src/devices/cpu/mips/ps2vif1.cpp627
-rw-r--r--src/devices/cpu/mips/ps2vif1.h161
-rw-r--r--src/devices/cpu/mips/ps2vu.cpp1059
-rw-r--r--src/devices/cpu/mips/ps2vu.h247
-rw-r--r--src/devices/cpu/mips/r4000.cpp4128
-rw-r--r--src/devices/cpu/mips/r4000.h557
-rw-r--r--src/devices/cpu/mips/vudasm.cpp471
-rw-r--r--src/devices/cpu/mips/vudasm.h41
-rw-r--r--src/devices/cpu/mipsx/mipsx.cpp62
-rw-r--r--src/devices/cpu/mipsx/mipsx.h39
-rw-r--r--src/devices/cpu/mipsx/mipsxdasm.cpp635
-rw-r--r--src/devices/cpu/mipsx/mipsxdasm.h19
-rw-r--r--src/devices/cpu/mk1/mk1.cpp521
-rw-r--r--src/devices/cpu/mk1/mk1.h81
-rw-r--r--src/devices/cpu/mk1/mk1dasm.cpp151
-rw-r--r--src/devices/cpu/mk1/mk1dasm.h18
-rw-r--r--src/devices/cpu/mn10200/mn10200.cpp2248
-rw-r--r--src/devices/cpu/mn10200/mn10200.h199
-rw-r--r--src/devices/cpu/mn10200/mn102dis.cpp1004
-rw-r--r--src/devices/cpu/mn10200/mn102dis.h28
-rw-r--r--src/devices/cpu/mn10300/mn103dasm.cpp929
-rw-r--r--src/devices/cpu/mn10300/mn103dasm.h42
-rw-r--r--src/devices/cpu/mn1400/mn1400.cpp141
-rw-r--r--src/devices/cpu/mn1400/mn1400.h147
-rw-r--r--src/devices/cpu/mn1400/mn1400base.cpp267
-rw-r--r--src/devices/cpu/mn1400/mn1400base.h132
-rw-r--r--src/devices/cpu/mn1400/mn1400d.cpp135
-rw-r--r--src/devices/cpu/mn1400/mn1400d.h33
-rw-r--r--src/devices/cpu/mn1400/mn1400op.cpp446
-rw-r--r--src/devices/cpu/mn1610/mn1610d.cpp348
-rw-r--r--src/devices/cpu/mn1610/mn1610d.h36
-rw-r--r--src/devices/cpu/mn1880/mn1880.cpp2508
-rw-r--r--src/devices/cpu/mn1880/mn1880.h244
-rw-r--r--src/devices/cpu/mn1880/mn1880d.cpp646
-rw-r--r--src/devices/cpu/mn1880/mn1880d.h66
-rw-r--r--src/devices/cpu/mpk1839/kl1839vm1.cpp1103
-rw-r--r--src/devices/cpu/mpk1839/kl1839vm1.h121
-rw-r--r--src/devices/cpu/mpk1839/kl1839vm1dasm.cpp445
-rw-r--r--src/devices/cpu/mpk1839/kl1839vm1dasm.h25
-rw-r--r--src/devices/cpu/msm65x2/msm65x2d.cpp105
-rw-r--r--src/devices/cpu/msm65x2/msm65x2d.h30
-rw-r--r--src/devices/cpu/nanoprocessor/nanoprocessor.cpp563
-rw-r--r--src/devices/cpu/nanoprocessor/nanoprocessor.h153
-rw-r--r--src/devices/cpu/nanoprocessor/nanoprocessor_dasm.cpp124
-rw-r--r--src/devices/cpu/nanoprocessor/nanoprocessor_dasm.h44
-rw-r--r--src/devices/cpu/nec/nec.cpp672
-rw-r--r--src/devices/cpu/nec/nec.h725
-rw-r--r--src/devices/cpu/nec/nec80inst.hxx260
-rw-r--r--src/devices/cpu/nec/necdasm.cpp1763
-rw-r--r--src/devices/cpu/nec/necdasm.h137
-rw-r--r--src/devices/cpu/nec/necea.h59
-rw-r--r--src/devices/cpu/nec/necinstr.h522
-rw-r--r--src/devices/cpu/nec/necinstr.hxx799
-rw-r--r--src/devices/cpu/nec/necmacro.h308
-rw-r--r--src/devices/cpu/nec/necmodrm.h106
-rw-r--r--src/devices/cpu/nec/necpriv.ipp134
-rw-r--r--src/devices/cpu/nec/v25.cpp950
-rw-r--r--src/devices/cpu/nec/v25.h612
-rw-r--r--src/devices/cpu/nec/v25instr.h261
-rw-r--r--src/devices/cpu/nec/v25instr.hxx84
-rw-r--r--src/devices/cpu/nec/v25priv.ipp192
-rw-r--r--src/devices/cpu/nec/v25sfr.cpp875
-rw-r--r--src/devices/cpu/nec/v5x.cpp886
-rw-r--r--src/devices/cpu/nec/v5x.h322
-rw-r--r--src/devices/cpu/nios2/nios2.cpp558
-rw-r--r--src/devices/cpu/nios2/nios2.h62
-rw-r--r--src/devices/cpu/nios2/nios2dasm.cpp472
-rw-r--r--src/devices/cpu/nios2/nios2dasm.h29
-rw-r--r--src/devices/cpu/nova/novadasm.cpp262
-rw-r--r--src/devices/cpu/nova/novadasm.h25
-rw-r--r--src/devices/cpu/ns32000/common.h127
-rw-r--r--src/devices/cpu/ns32000/ns32000.cpp4255
-rw-r--r--src/devices/cpu/ns32000/ns32000.h268
-rw-r--r--src/devices/cpu/ns32000/ns32000d.cpp643
-rw-r--r--src/devices/cpu/ns32000/ns32000d.h52
-rw-r--r--src/devices/cpu/nuon/nuon.cpp45
-rw-r--r--src/devices/cpu/nuon/nuon.h70
-rw-r--r--src/devices/cpu/nuon/nuondasm.cpp1065
-rw-r--r--src/devices/cpu/nuon/nuondasm.h46
-rw-r--r--src/devices/cpu/olms66k/msm665xx.cpp3278
-rw-r--r--src/devices/cpu/olms66k/msm665xx.h198
-rw-r--r--src/devices/cpu/olms66k/nx8dasm.cpp1019
-rw-r--r--src/devices/cpu/olms66k/nx8dasm.h28
-rw-r--r--src/devices/cpu/pace/pace.cpp977
-rw-r--r--src/devices/cpu/pace/pace.h224
-rw-r--r--src/devices/cpu/pace/pacedasm.cpp321
-rw-r--r--src/devices/cpu/pace/pacedasm.h36
-rw-r--r--src/devices/cpu/palm/palm.cpp330
-rw-r--r--src/devices/cpu/palm/palm.h78
-rw-r--r--src/devices/cpu/palm/palmd.cpp179
-rw-r--r--src/devices/cpu/palm/palmd.h19
-rw-r--r--src/devices/cpu/patinhofeio/patinho_feio.cpp772
-rw-r--r--src/devices/cpu/patinhofeio/patinho_feio_dasm.cpp168
-rw-r--r--src/devices/cpu/patinhofeio/patinho_feio_dasm.h19
-rw-r--r--src/devices/cpu/patinhofeio/patinhofeio_cpu.h135
-rw-r--r--src/devices/cpu/pdp1/pdp1.cpp1794
-rw-r--r--src/devices/cpu/pdp1/pdp1.h190
-rw-r--r--src/devices/cpu/pdp1/pdp1dasm.cpp294
-rw-r--r--src/devices/cpu/pdp1/pdp1dasm.h22
-rw-r--r--src/devices/cpu/pdp8/hd6120.cpp1364
-rw-r--r--src/devices/cpu/pdp8/hd6120.h216
-rw-r--r--src/devices/cpu/pdp8/pdp8.cpp211
-rw-r--r--src/devices/cpu/pdp8/pdp8.h108
-rw-r--r--src/devices/cpu/pdp8/pdp8dasm.cpp912
-rw-r--r--src/devices/cpu/pdp8/pdp8dasm.h44
-rw-r--r--src/devices/cpu/pic16/pic16d.cpp181
-rw-r--r--src/devices/cpu/pic16/pic16d.h40
-rw-r--r--src/devices/cpu/pic1670/pic1670d.cpp103
-rw-r--r--src/devices/cpu/pic1670/pic1670d.h34
-rw-r--r--src/devices/cpu/pic16c5x/16c5xdsm.cpp219
-rw-r--r--src/devices/cpu/pic16c5x/16c5xdsm.h44
-rw-r--r--src/devices/cpu/pic16c5x/pic16c5x.cpp1309
-rw-r--r--src/devices/cpu/pic16c5x/pic16c5x.h308
-rw-r--r--src/devices/cpu/pic16c62x/16c62xdsm.cpp232
-rw-r--r--src/devices/cpu/pic16c62x/16c62xdsm.h62
-rw-r--r--src/devices/cpu/pic16c62x/pic16c62x.cpp1276
-rw-r--r--src/devices/cpu/pic16c62x/pic16c62x.h305
-rw-r--r--src/devices/cpu/pic16x8x/16x8xdsm.cpp258
-rw-r--r--src/devices/cpu/pic16x8x/16x8xdsm.h46
-rw-r--r--src/devices/cpu/pic16x8x/pic16x8x.cpp1413
-rw-r--r--src/devices/cpu/pic16x8x/pic16x8x.h318
-rw-r--r--src/devices/cpu/pic17/pic17.cpp1108
-rw-r--r--src/devices/cpu/pic17/pic17.h181
-rw-r--r--src/devices/cpu/pic17/pic17c4x.cpp531
-rw-r--r--src/devices/cpu/pic17/pic17c4x.h179
-rw-r--r--src/devices/cpu/pic17/pic17d.cpp244
-rw-r--r--src/devices/cpu/pic17/pic17d.h36
-rw-r--r--src/devices/cpu/powerpc/ppc.h841
-rw-r--r--src/devices/cpu/powerpc/ppc_dasm.cpp1130
-rw-r--r--src/devices/cpu/powerpc/ppc_dasm.h165
-rw-r--r--src/devices/cpu/powerpc/ppccom.cpp3047
-rw-r--r--src/devices/cpu/powerpc/ppccom.h491
-rw-r--r--src/devices/cpu/powerpc/ppcdrc.cpp3976
-rw-r--r--src/devices/cpu/powerpc/ppcfe.cpp1684
-rw-r--r--src/devices/cpu/powerpc/ppcfe.h178
-rw-r--r--src/devices/cpu/pps4/pps4.cpp1651
-rw-r--r--src/devices/cpu/pps4/pps4.h191
-rw-r--r--src/devices/cpu/pps4/pps4dasm.cpp420
-rw-r--r--src/devices/cpu/pps4/pps4dasm.h60
-rw-r--r--src/devices/cpu/pps41/mm75.cpp27
-rw-r--r--src/devices/cpu/pps41/mm75.h56
-rw-r--r--src/devices/cpu/pps41/mm75op.cpp40
-rw-r--r--src/devices/cpu/pps41/mm76.cpp182
-rw-r--r--src/devices/cpu/pps41/mm76.h165
-rw-r--r--src/devices/cpu/pps41/mm76op.cpp473
-rw-r--r--src/devices/cpu/pps41/mm78.cpp217
-rw-r--r--src/devices/cpu/pps41/mm78.h128
-rw-r--r--src/devices/cpu/pps41/mm78la.cpp113
-rw-r--r--src/devices/cpu/pps41/mm78la.h98
-rw-r--r--src/devices/cpu/pps41/mm78laop.cpp73
-rw-r--r--src/devices/cpu/pps41/mm78op.cpp202
-rw-r--r--src/devices/cpu/pps41/pps41base.cpp351
-rw-r--r--src/devices/cpu/pps41/pps41base.h154
-rw-r--r--src/devices/cpu/pps41/pps41d.cpp210
-rw-r--r--src/devices/cpu/pps41/pps41d.h66
-rw-r--r--src/devices/cpu/psx/dma.cpp420
-rw-r--r--src/devices/cpu/psx/dma.h68
-rw-r--r--src/devices/cpu/psx/gte.cpp930
-rw-r--r--src/devices/cpu/psx/gte.h113
-rw-r--r--src/devices/cpu/psx/irq.cpp194
-rw-r--r--src/devices/cpu/psx/irq.h56
-rw-r--r--src/devices/cpu/psx/mdec.cpp561
-rw-r--r--src/devices/cpu/psx/mdec.h77
-rw-r--r--src/devices/cpu/psx/psx.cpp3468
-rw-r--r--src/devices/cpu/psx/psx.h373
-rw-r--r--src/devices/cpu/psx/psxdasm.cpp729
-rw-r--r--src/devices/cpu/psx/psxdasm.h56
-rw-r--r--src/devices/cpu/psx/psxdefs.h123
-rw-r--r--src/devices/cpu/psx/rcnt.cpp258
-rw-r--r--src/devices/cpu/psx/rcnt.h72
-rw-r--r--src/devices/cpu/psx/sio.cpp345
-rw-r--r--src/devices/cpu/psx/sio.h98
-rw-r--r--src/devices/cpu/rii/riidasm.cpp566
-rw-r--r--src/devices/cpu/rii/riidasm.h40
-rw-r--r--src/devices/cpu/rii/riscii.cpp2164
-rw-r--r--src/devices/cpu/rii/riscii.h407
-rw-r--r--src/devices/cpu/romp/romp.cpp1209
-rw-r--r--src/devices/cpu/romp/romp.h327
-rw-r--r--src/devices/cpu/romp/rompdasm.cpp261
-rw-r--r--src/devices/cpu/romp/rompdasm.h19
-rw-r--r--src/devices/cpu/romp/rsc.h95
-rw-r--r--src/devices/cpu/rsp/rsp.cpp3067
-rw-r--r--src/devices/cpu/rsp/rsp.h205
-rw-r--r--src/devices/cpu/rsp/rsp_dasm.cpp356
-rw-r--r--src/devices/cpu/rsp/rsp_dasm.h38
-rw-r--r--src/devices/cpu/rsp/rspdefs.h32
-rw-r--r--src/devices/cpu/rsp/rspdiv.h1029
-rw-r--r--src/devices/cpu/rw5000/a5000.cpp86
-rw-r--r--src/devices/cpu/rw5000/a5000.h37
-rw-r--r--src/devices/cpu/rw5000/a5500.cpp78
-rw-r--r--src/devices/cpu/rw5000/a5500.h43
-rw-r--r--src/devices/cpu/rw5000/a5900.cpp42
-rw-r--r--src/devices/cpu/rw5000/a5900.h32
-rw-r--r--src/devices/cpu/rw5000/b5000.cpp165
-rw-r--r--src/devices/cpu/rw5000/b5000.h113
-rw-r--r--src/devices/cpu/rw5000/b5000op.cpp331
-rw-r--r--src/devices/cpu/rw5000/b5500.cpp48
-rw-r--r--src/devices/cpu/rw5000/b5500.h32
-rw-r--r--src/devices/cpu/rw5000/b6000.cpp116
-rw-r--r--src/devices/cpu/rw5000/b6000.h71
-rw-r--r--src/devices/cpu/rw5000/b6100.cpp112
-rw-r--r--src/devices/cpu/rw5000/b6100.h73
-rw-r--r--src/devices/cpu/rw5000/rw5000base.cpp222
-rw-r--r--src/devices/cpu/rw5000/rw5000base.h117
-rw-r--r--src/devices/cpu/rw5000/rw5000d.cpp342
-rw-r--r--src/devices/cpu/rw5000/rw5000d.h112
-rw-r--r--src/devices/cpu/rx01/rx01.cpp601
-rw-r--r--src/devices/cpu/rx01/rx01.h121
-rw-r--r--src/devices/cpu/rx01/rx01dasm.cpp186
-rw-r--r--src/devices/cpu/rx01/rx01dasm.h27
-rw-r--r--src/devices/cpu/s2650/2650dasm.cpp534
-rw-r--r--src/devices/cpu/s2650/2650dasm.h49
-rw-r--r--src/devices/cpu/s2650/s2650.cpp1587
-rw-r--r--src/devices/cpu/s2650/s2650.h107
-rw-r--r--src/devices/cpu/saturn/satops.ipp1110
-rw-r--r--src/devices/cpu/saturn/sattable.ipp1047
-rw-r--r--src/devices/cpu/saturn/saturn.cpp415
-rw-r--r--src/devices/cpu/saturn/saturn.h282
-rw-r--r--src/devices/cpu/saturn/saturnds.cpp1300
-rw-r--r--src/devices/cpu/saturn/saturnds.h215
-rw-r--r--src/devices/cpu/sc61860/readpc.cpp196
-rw-r--r--src/devices/cpu/sc61860/sc61860.cpp248
-rw-r--r--src/devices/cpu/sc61860/sc61860.h211
-rw-r--r--src/devices/cpu/sc61860/scdasm.cpp206
-rw-r--r--src/devices/cpu/sc61860/scdasm.h50
-rw-r--r--src/devices/cpu/sc61860/scops.hxx759
-rw-r--r--src/devices/cpu/sc61860/sctable.hxx146
-rw-r--r--src/devices/cpu/scmp/scmp.cpp553
-rw-r--r--src/devices/cpu/scmp/scmp.h102
-rw-r--r--src/devices/cpu/scmp/scmpdasm.cpp202
-rw-r--r--src/devices/cpu/scmp/scmpdasm.h25
-rw-r--r--src/devices/cpu/score/score.cpp1379
-rw-r--r--src/devices/cpu/score/score.h130
-rw-r--r--src/devices/cpu/score/scoredsm.cpp292
-rw-r--r--src/devices/cpu/score/scoredsm.h42
-rw-r--r--src/devices/cpu/score/scorem.h146
-rw-r--r--src/devices/cpu/scudsp/scudsp.cpp1070
-rw-r--r--src/devices/cpu/scudsp/scudsp.h163
-rw-r--r--src/devices/cpu/scudsp/scudspdasm.cpp319
-rw-r--r--src/devices/cpu/scudsp/scudspdasm.h33
-rw-r--r--src/devices/cpu/se3208/se3208.cpp1814
-rw-r--r--src/devices/cpu/se3208/se3208.h186
-rw-r--r--src/devices/cpu/se3208/se3208dis.cpp1397
-rw-r--r--src/devices/cpu/se3208/se3208dis.h103
-rw-r--r--src/devices/cpu/sh/sh.cpp4111
-rw-r--r--src/devices/cpu/sh/sh.h461
-rw-r--r--src/devices/cpu/sh/sh2.cpp800
-rw-r--r--src/devices/cpu/sh/sh2.h101
-rw-r--r--src/devices/cpu/sh/sh2fe.cpp29
-rw-r--r--src/devices/cpu/sh/sh2fe.h28
-rw-r--r--src/devices/cpu/sh/sh3comn.cpp1800
-rw-r--r--src/devices/cpu/sh/sh3comn.h25
-rw-r--r--src/devices/cpu/sh/sh4.cpp5576
-rw-r--r--src/devices/cpu/sh/sh4.h1980
-rw-r--r--src/devices/cpu/sh/sh4comn.cpp3119
-rw-r--r--src/devices/cpu/sh/sh4comn.h74
-rw-r--r--src/devices/cpu/sh/sh4dmac.cpp753
-rw-r--r--src/devices/cpu/sh/sh4dmac.h28
-rw-r--r--src/devices/cpu/sh/sh4fe.cpp316
-rw-r--r--src/devices/cpu/sh/sh4fe.h36
-rw-r--r--src/devices/cpu/sh/sh4regs.h26
-rw-r--r--src/devices/cpu/sh/sh4tmu.cpp319
-rw-r--r--src/devices/cpu/sh/sh4tmu.h3
-rw-r--r--src/devices/cpu/sh/sh7014.cpp201
-rw-r--r--src/devices/cpu/sh/sh7014.h83
-rw-r--r--src/devices/cpu/sh/sh7014_bsc.cpp148
-rw-r--r--src/devices/cpu/sh/sh7014_bsc.h62
-rw-r--r--src/devices/cpu/sh/sh7014_dmac.cpp400
-rw-r--r--src/devices/cpu/sh/sh7014_dmac.h173
-rw-r--r--src/devices/cpu/sh/sh7014_intc.cpp313
-rw-r--r--src/devices/cpu/sh/sh7014_intc.h147
-rw-r--r--src/devices/cpu/sh/sh7014_mtu.cpp571
-rw-r--r--src/devices/cpu/sh/sh7014_mtu.h211
-rw-r--r--src/devices/cpu/sh/sh7014_port.cpp243
-rw-r--r--src/devices/cpu/sh/sh7014_port.h98
-rw-r--r--src/devices/cpu/sh/sh7014_sci.cpp380
-rw-r--r--src/devices/cpu/sh/sh7014_sci.h135
-rw-r--r--src/devices/cpu/sh/sh7021.cpp2243
-rw-r--r--src/devices/cpu/sh/sh7021.h334
-rw-r--r--src/devices/cpu/sh/sh7032.cpp43
-rw-r--r--src/devices/cpu/sh/sh7032.h33
-rw-r--r--src/devices/cpu/sh/sh7042.cpp505
-rw-r--r--src/devices/cpu/sh/sh7042.h190
-rw-r--r--src/devices/cpu/sh/sh7604.cpp1636
-rw-r--r--src/devices/cpu/sh/sh7604.h279
-rw-r--r--src/devices/cpu/sh/sh7604_bus.cpp181
-rw-r--r--src/devices/cpu/sh/sh7604_bus.h70
-rw-r--r--src/devices/cpu/sh/sh7604_sci.cpp157
-rw-r--r--src/devices/cpu/sh/sh7604_sci.h77
-rw-r--r--src/devices/cpu/sh/sh7604_wdt.cpp84
-rw-r--r--src/devices/cpu/sh/sh7604_wdt.h46
-rw-r--r--src/devices/cpu/sh/sh7709s.cpp558
-rw-r--r--src/devices/cpu/sh/sh7709s.h59
-rw-r--r--src/devices/cpu/sh/sh_adc.cpp342
-rw-r--r--src/devices/cpu/sh/sh_adc.h124
-rw-r--r--src/devices/cpu/sh/sh_bsc.cpp139
-rw-r--r--src/devices/cpu/sh/sh_bsc.h47
-rw-r--r--src/devices/cpu/sh/sh_cmt.cpp202
-rw-r--r--src/devices/cpu/sh/sh_cmt.h75
-rw-r--r--src/devices/cpu/sh/sh_dasm.cpp1199
-rw-r--r--src/devices/cpu/sh/sh_dasm.h45
-rw-r--r--src/devices/cpu/sh/sh_dmac.cpp115
-rw-r--r--src/devices/cpu/sh/sh_dmac.h79
-rw-r--r--src/devices/cpu/sh/sh_fe.cpp928
-rw-r--r--src/devices/cpu/sh/sh_fe.h129
-rw-r--r--src/devices/cpu/sh/sh_intc.cpp151
-rw-r--r--src/devices/cpu/sh/sh_intc.h58
-rw-r--r--src/devices/cpu/sh/sh_mtu.cpp529
-rw-r--r--src/devices/cpu/sh/sh_mtu.h182
-rw-r--r--src/devices/cpu/sh/sh_port.cpp109
-rw-r--r--src/devices/cpu/sh/sh_port.h75
-rw-r--r--src/devices/cpu/sh/sh_sci.cpp765
-rw-r--r--src/devices/cpu/sh/sh_sci.h151
-rw-r--r--src/devices/cpu/sharc/compute.hxx1684
-rw-r--r--src/devices/cpu/sharc/sharc.cpp1359
-rw-r--r--src/devices/cpu/sharc/sharc.h556
-rw-r--r--src/devices/cpu/sharc/sharc_dasm.cpp1256
-rw-r--r--src/devices/cpu/sharc/sharc_dasm.h66
-rw-r--r--src/devices/cpu/sharc/sharcdma.hxx342
-rw-r--r--src/devices/cpu/sharc/sharcdrc.cpp5877
-rw-r--r--src/devices/cpu/sharc/sharcfe.cpp1909
-rw-r--r--src/devices/cpu/sharc/sharcfe.h315
-rw-r--r--src/devices/cpu/sharc/sharcinternal.ipp317
-rw-r--r--src/devices/cpu/sharc/sharcops.hxx2614
-rw-r--r--src/devices/cpu/sharc/sharcops_table.cpp140
-rw-r--r--src/devices/cpu/sigma2/sigma2d.cpp393
-rw-r--r--src/devices/cpu/sigma2/sigma2d.h40
-rw-r--r--src/devices/cpu/sm510/sm500.cpp242
-rw-r--r--src/devices/cpu/sm510/sm500.h127
-rw-r--r--src/devices/cpu/sm510/sm500op.cpp206
-rw-r--r--src/devices/cpu/sm510/sm510.cpp165
-rw-r--r--src/devices/cpu/sm510/sm510.h82
-rw-r--r--src/devices/cpu/sm510/sm510base.cpp329
-rw-r--r--src/devices/cpu/sm510/sm510base.h250
-rw-r--r--src/devices/cpu/sm510/sm510d.cpp449
-rw-r--r--src/devices/cpu/sm510/sm510d.h125
-rw-r--r--src/devices/cpu/sm510/sm510op.cpp455
-rw-r--r--src/devices/cpu/sm510/sm511.cpp260
-rw-r--r--src/devices/cpu/sm510/sm511.h63
-rw-r--r--src/devices/cpu/sm510/sm530.cpp247
-rw-r--r--src/devices/cpu/sm510/sm530.h139
-rw-r--r--src/devices/cpu/sm510/sm530op.cpp137
-rw-r--r--src/devices/cpu/sm510/sm590.cpp182
-rw-r--r--src/devices/cpu/sm510/sm590.h175
-rw-r--r--src/devices/cpu/sm510/sm590op.cpp172
-rw-r--r--src/devices/cpu/sm510/sm5a.cpp152
-rw-r--r--src/devices/cpu/sm510/sm5a.h90
-rw-r--r--src/devices/cpu/sm8500/sm8500.cpp433
-rw-r--r--src/devices/cpu/sm8500/sm8500.h108
-rw-r--r--src/devices/cpu/sm8500/sm8500d.cpp580
-rw-r--r--src/devices/cpu/sm8500/sm8500d.h68
-rw-r--r--src/devices/cpu/sm8500/sm85ops.h1758
-rw-r--r--src/devices/cpu/sonix16/sonix16.cpp708
-rw-r--r--src/devices/cpu/sonix16/sonix16.h106
-rw-r--r--src/devices/cpu/sonix16/sonix16d.cpp177
-rw-r--r--src/devices/cpu/sonix16/sonix16d.h42
-rw-r--r--src/devices/cpu/sparc/sparc.cpp4618
-rw-r--r--src/devices/cpu/sparc/sparc.h495
-rw-r--r--src/devices/cpu/sparc/sparc_intf.h29
-rw-r--r--src/devices/cpu/sparc/sparcdasm.cpp1662
-rw-r--r--src/devices/cpu/sparc/sparcdasm.h258
-rw-r--r--src/devices/cpu/sparc/sparcdefs.h488
-rw-r--r--src/devices/cpu/sparc/ss1fcode.ipp714
-rw-r--r--src/devices/cpu/spc700/spc700.cpp1686
-rw-r--r--src/devices/cpu/spc700/spc700.h141
-rw-r--r--src/devices/cpu/spc700/spc700ds.cpp400
-rw-r--r--src/devices/cpu/spc700/spc700ds.h64
-rw-r--r--src/devices/cpu/ssem/ssem.cpp278
-rw-r--r--src/devices/cpu/ssem/ssem.h82
-rw-r--r--src/devices/cpu/ssem/ssemdasm.cpp70
-rw-r--r--src/devices/cpu/ssem/ssemdasm.h28
-rw-r--r--src/devices/cpu/ssp1601/ssp1601.cpp791
-rw-r--r--src/devices/cpu/ssp1601/ssp1601.h105
-rw-r--r--src/devices/cpu/ssp1601/ssp1601d.cpp290
-rw-r--r--src/devices/cpu/ssp1601/ssp1601d.h37
-rw-r--r--src/devices/cpu/st62xx/st62xx.cpp1265
-rw-r--r--src/devices/cpu/st62xx/st62xx.h311
-rw-r--r--src/devices/cpu/st62xx/st62xx_dasm.cpp388
-rw-r--r--src/devices/cpu/st62xx/st62xx_dasm.h27
-rw-r--r--src/devices/cpu/st9/st905x.cpp238
-rw-r--r--src/devices/cpu/st9/st905x.h95
-rw-r--r--src/devices/cpu/st9/st9dasm.cpp1373
-rw-r--r--src/devices/cpu/st9/st9dasm.h90
-rw-r--r--src/devices/cpu/superfx/sfx_dasm.cpp438
-rw-r--r--src/devices/cpu/superfx/sfx_dasm.h36
-rw-r--r--src/devices/cpu/superfx/superfx.cpp1465
-rw-r--r--src/devices/cpu/superfx/superfx.h232
-rw-r--r--src/devices/cpu/t11/t11.cpp894
-rw-r--r--src/devices/cpu/t11/t11.h1291
-rw-r--r--src/devices/cpu/t11/t11dasm.cpp585
-rw-r--r--src/devices/cpu/t11/t11dasm.h33
-rw-r--r--src/devices/cpu/t11/t11ops.hxx1733
-rw-r--r--src/devices/cpu/t11/t11table.hxx1322
-rw-r--r--src/devices/cpu/tlcs870/tlcs870.cpp1319
-rw-r--r--src/devices/cpu/tlcs870/tlcs870.h558
-rw-r--r--src/devices/cpu/tlcs870/tlcs870_ops.cpp1234
-rw-r--r--src/devices/cpu/tlcs870/tlcs870_ops_dst.cpp154
-rw-r--r--src/devices/cpu/tlcs870/tlcs870_ops_helper.cpp810
-rw-r--r--src/devices/cpu/tlcs870/tlcs870_ops_reg.cpp948
-rw-r--r--src/devices/cpu/tlcs870/tlcs870_ops_src.cpp1028
-rw-r--r--src/devices/cpu/tlcs870/tlcs870d.cpp2292
-rw-r--r--src/devices/cpu/tlcs870/tlcs870d.h88
-rw-r--r--src/devices/cpu/tlcs90/tlcs90.cpp3125
-rw-r--r--src/devices/cpu/tlcs90/tlcs90.h314
-rw-r--r--src/devices/cpu/tlcs90/tlcs90d.cpp1011
-rw-r--r--src/devices/cpu/tlcs90/tlcs90d.h101
-rw-r--r--src/devices/cpu/tlcs900/900htbl.hxx1267
-rw-r--r--src/devices/cpu/tlcs900/900tbl.hxx6135
-rw-r--r--src/devices/cpu/tlcs900/dasm900.cpp2192
-rw-r--r--src/devices/cpu/tlcs900/dasm900.h58
-rw-r--r--src/devices/cpu/tlcs900/tlcs900.cpp325
-rw-r--r--src/devices/cpu/tlcs900/tlcs900.h685
-rw-r--r--src/devices/cpu/tlcs900/tmp94c241.cpp1709
-rw-r--r--src/devices/cpu/tlcs900/tmp94c241.h300
-rw-r--r--src/devices/cpu/tlcs900/tmp94c241_serial.cpp363
-rw-r--r--src/devices/cpu/tlcs900/tmp94c241_serial.h95
-rw-r--r--src/devices/cpu/tlcs900/tmp95c061.cpp1404
-rw-r--r--src/devices/cpu/tlcs900/tmp95c061.h199
-rw-r--r--src/devices/cpu/tlcs900/tmp95c063.cpp1461
-rw-r--r--src/devices/cpu/tlcs900/tmp95c063.h227
-rw-r--r--src/devices/cpu/tlcs900/tmp96c141.cpp242
-rw-r--r--src/devices/cpu/tlcs900/tmp96c141.h101
-rw-r--r--src/devices/cpu/tms1000/smc1102.cpp363
-rw-r--r--src/devices/cpu/tms1000/smc1102.h120
-rw-r--r--src/devices/cpu/tms1000/tms0270.cpp161
-rw-r--r--src/devices/cpu/tms1000/tms0270.h53
-rw-r--r--src/devices/cpu/tms1000/tms0970.cpp138
-rw-r--r--src/devices/cpu/tms1000/tms0970.h60
-rw-r--r--src/devices/cpu/tms1000/tms0980.cpp262
-rw-r--r--src/devices/cpu/tms1000/tms0980.h93
-rw-r--r--src/devices/cpu/tms1000/tms1000.cpp158
-rw-r--r--src/devices/cpu/tms1000/tms1000.h135
-rw-r--r--src/devices/cpu/tms1000/tms1000c.cpp55
-rw-r--r--src/devices/cpu/tms1000/tms1000c.h31
-rw-r--r--src/devices/cpu/tms1000/tms1100.cpp92
-rw-r--r--src/devices/cpu/tms1000/tms1100.h105
-rw-r--r--src/devices/cpu/tms1000/tms1400.cpp90
-rw-r--r--src/devices/cpu/tms1000/tms1400.h100
-rw-r--r--src/devices/cpu/tms1000/tms1k_base.cpp743
-rw-r--r--src/devices/cpu/tms1000/tms1k_base.h290
-rw-r--r--src/devices/cpu/tms1000/tms1k_dasm.cpp428
-rw-r--r--src/devices/cpu/tms1000/tms1k_dasm.h130
-rw-r--r--src/devices/cpu/tms1000/tms2100.cpp353
-rw-r--r--src/devices/cpu/tms1000/tms2100.h157
-rw-r--r--src/devices/cpu/tms1000/tms2400.cpp80
-rw-r--r--src/devices/cpu/tms1000/tms2400.h61
-rw-r--r--src/devices/cpu/tms1000/tp0320.cpp99
-rw-r--r--src/devices/cpu/tms1000/tp0320.h37
-rw-r--r--src/devices/cpu/tms320c1x/tms320c1x.cpp1029
-rw-r--r--src/devices/cpu/tms320c1x/tms320c1x.h213
-rw-r--r--src/devices/cpu/tms320c1x/tms320c1x_dasm.cpp309
-rw-r--r--src/devices/cpu/tms320c1x/tms320c1x_dasm.h41
-rw-r--r--src/devices/cpu/tms320c2x/tms320c2x.cpp2084
-rw-r--r--src/devices/cpu/tms320c2x/tms320c2x.h386
-rw-r--r--src/devices/cpu/tms320c2x/tms320c2x_dasm.cpp479
-rw-r--r--src/devices/cpu/tms320c2x/tms320c2x_dasm.h42
-rw-r--r--src/devices/cpu/tms320c3x/320c3x_ops.ipp6908
-rw-r--r--src/devices/cpu/tms320c3x/tms320c3x.cpp1065
-rw-r--r--src/devices/cpu/tms320c3x/tms320c3x.h855
-rw-r--r--src/devices/cpu/tms320c3x/tms320c3x_dasm.cpp709
-rw-r--r--src/devices/cpu/tms320c3x/tms320c3x_dasm.h51
-rw-r--r--src/devices/cpu/tms320c5x/320c5x_ops.ipp1911
-rw-r--r--src/devices/cpu/tms320c5x/320c5x_optable.cpp256
-rw-r--r--src/devices/cpu/tms320c5x/tms320c5x.cpp761
-rw-r--r--src/devices/cpu/tms320c5x/tms320c5x.h389
-rw-r--r--src/devices/cpu/tms320c5x/tms320c5x_dasm.cpp582
-rw-r--r--src/devices/cpu/tms320c5x/tms320c5x_dasm.h32
-rw-r--r--src/devices/cpu/tms320c82/mp_dasm.cpp496
-rw-r--r--src/devices/cpu/tms320c82/mp_dasm.h35
-rw-r--r--src/devices/cpu/tms320c82/mp_ops.cpp1817
-rw-r--r--src/devices/cpu/tms320c82/pp_dasm.cpp901
-rw-r--r--src/devices/cpu/tms320c82/pp_dasm.h42
-rw-r--r--src/devices/cpu/tms320c82/tms320c82.cpp588
-rw-r--r--src/devices/cpu/tms320c82/tms320c82.h204
-rw-r--r--src/devices/cpu/tms34010/34010dsm.cpp1693
-rw-r--r--src/devices/cpu/tms34010/34010dsm.h52
-rw-r--r--src/devices/cpu/tms34010/34010fld.hxx675
-rw-r--r--src/devices/cpu/tms34010/34010gfx.hxx1978
-rw-r--r--src/devices/cpu/tms34010/34010ops.h132
-rw-r--r--src/devices/cpu/tms34010/34010ops.hxx2520
-rw-r--r--src/devices/cpu/tms34010/34010tbl.hxx1555
-rw-r--r--src/devices/cpu/tms34010/tms34010.cpp1789
-rw-r--r--src/devices/cpu/tms34010/tms34010.h1099
-rw-r--r--src/devices/cpu/tms57002/57002dsm.cpp100
-rw-r--r--src/devices/cpu/tms57002/57002dsm.h30
-rw-r--r--src/devices/cpu/tms57002/tms57002.cpp1031
-rw-r--r--src/devices/cpu/tms57002/tms57002.h1889
-rw-r--r--src/devices/cpu/tms57002/tms57kdec.cpp157
-rw-r--r--src/devices/cpu/tms57002/tmsinstr.lst557
-rwxr-xr-xsrc/devices/cpu/tms57002/tmsmake.py452
-rw-r--r--src/devices/cpu/tms57002/tmsops.cpp18
-rw-r--r--src/devices/cpu/tms7000/7000dasm.cpp432
-rw-r--r--src/devices/cpu/tms7000/7000dasm.h42
-rw-r--r--src/devices/cpu/tms7000/tms7000.cpp953
-rw-r--r--src/devices/cpu/tms7000/tms7000.h391
-rw-r--r--src/devices/cpu/tms7000/tms7000op.cpp726
-rw-r--r--src/devices/cpu/tms9900/9900dasm.cpp704
-rw-r--r--src/devices/cpu/tms9900/9900dasm.h136
-rw-r--r--src/devices/cpu/tms9900/ti990_10.cpp127
-rw-r--r--src/devices/cpu/tms9900/ti990_10.h61
-rw-r--r--src/devices/cpu/tms9900/tms9900.cpp2782
-rw-r--r--src/devices/cpu/tms9900/tms9900.h393
-rw-r--r--src/devices/cpu/tms9900/tms9980a.cpp294
-rw-r--r--src/devices/cpu/tms9900/tms9980a.h65
-rw-r--r--src/devices/cpu/tms9900/tms9995.cpp3522
-rw-r--r--src/devices/cpu/tms9900/tms9995.h419
-rw-r--r--src/devices/cpu/tms9900/tms99com.h86
-rw-r--r--src/devices/cpu/tx0/tx0.cpp1302
-rw-r--r--src/devices/cpu/tx0/tx0.h179
-rw-r--r--src/devices/cpu/tx0/tx0dasm.cpp889
-rw-r--r--src/devices/cpu/tx0/tx0dasm.h42
-rw-r--r--src/devices/cpu/ucom4/ucom4.cpp500
-rw-r--r--src/devices/cpu/ucom4/ucom4.h314
-rw-r--r--src/devices/cpu/ucom4/ucom4d.cpp132
-rw-r--r--src/devices/cpu/ucom4/ucom4d.h34
-rw-r--r--src/devices/cpu/ucom4/ucom4op.cpp720
-rw-r--r--src/devices/cpu/uml.cpp1769
-rw-r--r--src/devices/cpu/uml.h690
-rw-r--r--src/devices/cpu/unsp/unsp.cpp661
-rw-r--r--src/devices/cpu/unsp/unsp.h416
-rw-r--r--src/devices/cpu/unsp/unsp_extended.cpp331
-rw-r--r--src/devices/cpu/unsp/unsp_exxx.cpp356
-rw-r--r--src/devices/cpu/unsp/unsp_fxxx.cpp599
-rw-r--r--src/devices/cpu/unsp/unsp_jumps.cpp180
-rw-r--r--src/devices/cpu/unsp/unsp_other.cpp358
-rw-r--r--src/devices/cpu/unsp/unspdasm.cpp191
-rw-r--r--src/devices/cpu/unsp/unspdasm.h104
-rw-r--r--src/devices/cpu/unsp/unspdasm_extended.cpp938
-rw-r--r--src/devices/cpu/unsp/unspdasm_exxx.cpp117
-rw-r--r--src/devices/cpu/unsp/unspdasm_fxxx.cpp380
-rw-r--r--src/devices/cpu/unsp/unspdasm_jumps.cpp41
-rw-r--r--src/devices/cpu/unsp/unspdasm_other.cpp239
-rw-r--r--src/devices/cpu/unsp/unspdefs.h22
-rw-r--r--src/devices/cpu/unsp/unspdrc.cpp1369
-rw-r--r--src/devices/cpu/unsp/unspfe.cpp403
-rw-r--r--src/devices/cpu/unsp/unspfe.h60
-rw-r--r--src/devices/cpu/upd177x/upd177x.cpp792
-rw-r--r--src/devices/cpu/upd177x/upd177x.h124
-rw-r--r--src/devices/cpu/upd177x/upd177xd.cpp299
-rw-r--r--src/devices/cpu/upd177x/upd177xd.h41
-rw-r--r--src/devices/cpu/upd7725/dasm7725.cpp231
-rw-r--r--src/devices/cpu/upd7725/dasm7725.h27
-rw-r--r--src/devices/cpu/upd7725/upd7725.cpp631
-rw-r--r--src/devices/cpu/upd7725/upd7725.h219
-rw-r--r--src/devices/cpu/upd777/upd777.cpp1262
-rw-r--r--src/devices/cpu/upd777/upd777.h165
-rw-r--r--src/devices/cpu/upd777/upd777dasm.cpp504
-rw-r--r--src/devices/cpu/upd777/upd777dasm.h34
-rw-r--r--src/devices/cpu/upd7810/upd7810.cpp2188
-rw-r--r--src/devices/cpu/upd7810/upd7810.h1471
-rw-r--r--src/devices/cpu/upd7810/upd7810_dasm.cpp5328
-rw-r--r--src/devices/cpu/upd7810/upd7810_dasm.h291
-rw-r--r--src/devices/cpu/upd7810/upd7810_macros.h163
-rw-r--r--src/devices/cpu/upd7810/upd7810_opcodes.cpp9495
-rw-r--r--src/devices/cpu/upd7810/upd7810_table.cpp6259
-rw-r--r--src/devices/cpu/upd78k/upd78k0.cpp234
-rw-r--r--src/devices/cpu/upd78k/upd78k0.h107
-rw-r--r--src/devices/cpu/upd78k/upd78k0d.cpp1348
-rw-r--r--src/devices/cpu/upd78k/upd78k0d.h160
-rw-r--r--src/devices/cpu/upd78k/upd78k1d.cpp844
-rw-r--r--src/devices/cpu/upd78k/upd78k1d.h65
-rw-r--r--src/devices/cpu/upd78k/upd78k2.cpp247
-rw-r--r--src/devices/cpu/upd78k/upd78k2.h116
-rw-r--r--src/devices/cpu/upd78k/upd78k2d.cpp584
-rw-r--r--src/devices/cpu/upd78k/upd78k2d.h85
-rw-r--r--src/devices/cpu/upd78k/upd78k3.cpp367
-rw-r--r--src/devices/cpu/upd78k/upd78k3.h132
-rw-r--r--src/devices/cpu/upd78k/upd78k3d.cpp1659
-rw-r--r--src/devices/cpu/upd78k/upd78k3d.h164
-rw-r--r--src/devices/cpu/upd78k/upd78k4.cpp275
-rw-r--r--src/devices/cpu/upd78k/upd78k4.h110
-rw-r--r--src/devices/cpu/upd78k/upd78k4d.cpp1408
-rw-r--r--src/devices/cpu/upd78k/upd78k4d.h128
-rw-r--r--src/devices/cpu/upd78k/upd78kd.cpp199
-rw-r--r--src/devices/cpu/upd78k/upd78kd.h53
-rw-r--r--src/devices/cpu/v30mz/v30mz.cpp3559
-rw-r--r--src/devices/cpu/v30mz/v30mz.h232
-rw-r--r--src/devices/cpu/v60/am.hxx83
-rw-r--r--src/devices/cpu/v60/am1.hxx1372
-rw-r--r--src/devices/cpu/v60/am2.hxx1240
-rw-r--r--src/devices/cpu/v60/am3.hxx876
-rw-r--r--src/devices/cpu/v60/op12.hxx2332
-rw-r--r--src/devices/cpu/v60/op2.hxx360
-rw-r--r--src/devices/cpu/v60/op3.hxx641
-rw-r--r--src/devices/cpu/v60/op4.hxx354
-rw-r--r--src/devices/cpu/v60/op5.hxx87
-rw-r--r--src/devices/cpu/v60/op6.hxx254
-rw-r--r--src/devices/cpu/v60/op7a.hxx1207
-rw-r--r--src/devices/cpu/v60/optable.hxx261
-rw-r--r--src/devices/cpu/v60/v60.cpp628
-rw-r--r--src/devices/cpu/v60/v60.h793
-rw-r--r--src/devices/cpu/v60/v60d.cpp1474
-rw-r--r--src/devices/cpu/v60/v60d.h359
-rw-r--r--src/devices/cpu/v620/v620dasm.cpp650
-rw-r--r--src/devices/cpu/v620/v620dasm.h54
-rw-r--r--src/devices/cpu/v810/v810.cpp1478
-rw-r--r--src/devices/cpu/v810/v810.h198
-rw-r--r--src/devices/cpu/v810/v810dasm.cpp181
-rw-r--r--src/devices/cpu/v810/v810dasm.h27
-rw-r--r--src/devices/cpu/v850/v850dasm.cpp1028
-rw-r--r--src/devices/cpu/v850/v850dasm.h86
-rw-r--r--src/devices/cpu/vax/vax.cpp100
-rw-r--r--src/devices/cpu/vax/vax.h82
-rw-r--r--src/devices/cpu/vax/vaxdasm.cpp1115
-rw-r--r--src/devices/cpu/vax/vaxdasm.h50
-rw-r--r--src/devices/cpu/vt50/vt50.cpp802
-rw-r--r--src/devices/cpu/vt50/vt50.h170
-rw-r--r--src/devices/cpu/vt50/vt50dasm.cpp129
-rw-r--r--src/devices/cpu/vt50/vt50dasm.h55
-rw-r--r--src/devices/cpu/vt61/vt61.cpp645
-rw-r--r--src/devices/cpu/vt61/vt61.h99
-rw-r--r--src/devices/cpu/vt61/vt61dasm.cpp277
-rw-r--r--src/devices/cpu/vt61/vt61dasm.h34
-rw-r--r--src/devices/cpu/we32000/we32100.cpp111
-rw-r--r--src/devices/cpu/we32000/we32100.h59
-rw-r--r--src/devices/cpu/we32000/we32100d.cpp912
-rw-r--r--src/devices/cpu/we32000/we32100d.h36
-rw-r--r--src/devices/cpu/x86log.cpp211
-rw-r--r--src/devices/cpu/x86log.h142
-rw-r--r--src/devices/cpu/xa/xa.cpp2651
-rw-r--r--src/devices/cpu/xa/xa.h968
-rw-r--r--src/devices/cpu/xa/xa_ops.cpp1926
-rw-r--r--src/devices/cpu/xa/xadasm.cpp1908
-rw-r--r--src/devices/cpu/xa/xadasm.h121
-rw-r--r--src/devices/cpu/xavix2/xavix2.cpp397
-rw-r--r--src/devices/cpu/xavix2/xavix2.h263
-rw-r--r--src/devices/cpu/xavix2/xavix2d.cpp364
-rw-r--r--src/devices/cpu/xavix2/xavix2d.h53
-rw-r--r--src/devices/cpu/xtensa/xtensa.cpp2295
-rw-r--r--src/devices/cpu/xtensa/xtensa.h210
-rw-r--r--src/devices/cpu/xtensa/xtensa_helper.cpp190
-rw-r--r--src/devices/cpu/xtensa/xtensa_helper.h69
-rw-r--r--src/devices/cpu/xtensa/xtensad.cpp931
-rw-r--r--src/devices/cpu/xtensa/xtensad.h22
-rw-r--r--src/devices/cpu/z180/hd647180x.cpp296
-rw-r--r--src/devices/cpu/z180/hd647180x.h79
-rw-r--r--src/devices/cpu/z180/z180.cpp2148
-rw-r--r--src/devices/cpu/z180/z180.h1865
-rw-r--r--src/devices/cpu/z180/z180asci.cpp694
-rw-r--r--src/devices/cpu/z180/z180asci.h202
-rw-r--r--src/devices/cpu/z180/z180cb.hxx293
-rw-r--r--src/devices/cpu/z180/z180csio.cpp254
-rw-r--r--src/devices/cpu/z180/z180csio.h70
-rw-r--r--src/devices/cpu/z180/z180dasm.cpp508
-rw-r--r--src/devices/cpu/z180/z180dasm.h53
-rw-r--r--src/devices/cpu/z180/z180dd.hxx298
-rw-r--r--src/devices/cpu/z180/z180ed.hxx298
-rw-r--r--src/devices/cpu/z180/z180fd.hxx292
-rw-r--r--src/devices/cpu/z180/z180op.hxx375
-rw-r--r--src/devices/cpu/z180/z180ops.h967
-rw-r--r--src/devices/cpu/z180/z180tbl.h232
-rw-r--r--src/devices/cpu/z180/z180xy.hxx293
-rw-r--r--src/devices/cpu/z8/z8.cpp1654
-rw-r--r--src/devices/cpu/z8/z8.h480
-rw-r--r--src/devices/cpu/z8/z8dasm.cpp386
-rw-r--r--src/devices/cpu/z8/z8dasm.h24
-rw-r--r--src/devices/cpu/z8/z8ops.hxx784
-rw-r--r--src/devices/cpu/z80/ez80.cpp39
-rw-r--r--src/devices/cpu/z80/ez80.h35
-rw-r--r--src/devices/cpu/z80/kc82.cpp245
-rw-r--r--src/devices/cpu/z80/kc82.h69
-rw-r--r--src/devices/cpu/z80/kl5c80a12.cpp331
-rw-r--r--src/devices/cpu/z80/kl5c80a12.h103
-rw-r--r--src/devices/cpu/z80/kl5c80a16.cpp196
-rw-r--r--src/devices/cpu/z80/kl5c80a16.h85
-rw-r--r--src/devices/cpu/z80/kp63.cpp463
-rw-r--r--src/devices/cpu/z80/kp63.h97
-rw-r--r--src/devices/cpu/z80/kp64.cpp554
-rw-r--r--src/devices/cpu/z80/kp64.h80
-rw-r--r--src/devices/cpu/z80/kp69.cpp464
-rw-r--r--src/devices/cpu/z80/kp69.h104
-rw-r--r--src/devices/cpu/z80/ky80.cpp56
-rw-r--r--src/devices/cpu/z80/ky80.h42
-rw-r--r--src/devices/cpu/z80/lz8420m.cpp47
-rw-r--r--src/devices/cpu/z80/lz8420m.h45
-rw-r--r--src/devices/cpu/z80/mc8123.cpp416
-rw-r--r--src/devices/cpu/z80/mc8123.h43
-rw-r--r--src/devices/cpu/z80/nsc800.cpp87
-rw-r--r--src/devices/cpu/z80/nsc800.h38
-rw-r--r--src/devices/cpu/z80/r800.cpp116
-rw-r--r--src/devices/cpu/z80/r800.h49
-rw-r--r--src/devices/cpu/z80/r800dasm.cpp607
-rw-r--r--src/devices/cpu/z80/r800dasm.h39
-rw-r--r--src/devices/cpu/z80/t6a84.cpp237
-rw-r--r--src/devices/cpu/z80/t6a84.h96
-rw-r--r--src/devices/cpu/z80/tmpz84c011.cpp111
-rw-r--r--src/devices/cpu/z80/tmpz84c011.h128
-rw-r--r--src/devices/cpu/z80/tmpz84c015.cpp267
-rw-r--r--src/devices/cpu/z80/tmpz84c015.h211
-rw-r--r--src/devices/cpu/z80/z80.cpp940
-rw-r--r--src/devices/cpu/z80/z80.h222
-rw-r--r--src/devices/cpu/z80/z80.inc67
-rw-r--r--src/devices/cpu/z80/z80.lst9087
-rw-r--r--src/devices/cpu/z80/z80dasm.cpp538
-rw-r--r--src/devices/cpu/z80/z80dasm.h64
-rw-r--r--src/devices/cpu/z80/z80make.py354
-rw-r--r--src/devices/cpu/z80/z80n.cpp49
-rw-r--r--src/devices/cpu/z80/z80n.h43
-rw-r--r--src/devices/cpu/z80/z80ndasm.cpp77
-rw-r--r--src/devices/cpu/z80/z80ndasm.h23
-rw-r--r--src/devices/cpu/z80/z84c015.cpp133
-rw-r--r--src/devices/cpu/z80/z84c015.h69
-rw-r--r--src/devices/cpu/z8000/8000dasm.cpp844
-rw-r--r--src/devices/cpu/z8000/8000dasm.h50
-rw-r--r--src/devices/cpu/z8000/makedab.cpp89
-rw-r--r--src/devices/cpu/z8000/z8000.cpp701
-rw-r--r--src/devices/cpu/z8000/z8000.h734
-rw-r--r--src/devices/cpu/z8000/z8000cpu.h177
-rw-r--r--src/devices/cpu/z8000/z8000dab.h (renamed from src/emu/cpu/z8000/z8000dab.h)4
-rw-r--r--src/devices/cpu/z8000/z8000ops.hxx6892
-rw-r--r--src/devices/cpu/z8000/z8000tbl.hxx533
-rw-r--r--src/devices/imagedev/avivideo.cpp106
-rw-r--r--src/devices/imagedev/avivideo.h72
-rw-r--r--src/devices/imagedev/bitbngr.cpp107
-rw-r--r--src/devices/imagedev/bitbngr.h58
-rw-r--r--src/devices/imagedev/cartrom.cpp30
-rw-r--r--src/devices/imagedev/cartrom.h55
-rw-r--r--src/devices/imagedev/cassette.cpp484
-rw-r--r--src/devices/imagedev/cassette.h147
-rw-r--r--src/devices/imagedev/cdromimg.cpp283
-rw-r--r--src/devices/imagedev/cdromimg.h117
-rw-r--r--src/devices/imagedev/diablo.cpp251
-rw-r--r--src/devices/imagedev/diablo.h81
-rw-r--r--src/devices/imagedev/flopdrv.cpp624
-rw-r--r--src/devices/imagedev/flopdrv.h205
-rw-r--r--src/devices/imagedev/floppy.cpp3428
-rw-r--r--src/devices/imagedev/floppy.h631
-rw-r--r--src/devices/imagedev/harddriv.cpp386
-rw-r--r--src/devices/imagedev/harddriv.h114
-rw-r--r--src/devices/imagedev/magtape.cpp35
-rw-r--r--src/devices/imagedev/magtape.h56
-rw-r--r--src/devices/imagedev/memcard.cpp18
-rw-r--r--src/devices/imagedev/memcard.h39
-rw-r--r--src/devices/imagedev/mfmhd.cpp1229
-rw-r--r--src/devices/imagedev/mfmhd.h269
-rw-r--r--src/devices/imagedev/microdrv.cpp187
-rw-r--r--src/devices/imagedev/microdrv.h88
-rw-r--r--src/devices/imagedev/midiin.cpp664
-rw-r--r--src/devices/imagedev/midiin.h195
-rw-r--r--src/devices/imagedev/midiout.cpp89
-rw-r--r--src/devices/imagedev/midiout.h73
-rw-r--r--src/devices/imagedev/papertape.cpp38
-rw-r--r--src/devices/imagedev/papertape.h71
-rw-r--r--src/devices/imagedev/picture.cpp78
-rw-r--r--src/devices/imagedev/picture.h58
-rw-r--r--src/devices/imagedev/printer.cpp95
-rw-r--r--src/devices/imagedev/printer.h64
-rw-r--r--src/devices/imagedev/simh_tape_image.cpp85
-rw-r--r--src/devices/imagedev/simh_tape_image.h52
-rw-r--r--src/devices/imagedev/snapquik.cpp128
-rw-r--r--src/devices/imagedev/snapquik.h115
-rw-r--r--src/devices/imagedev/wafadrive.cpp51
-rw-r--r--src/devices/imagedev/wafadrive.h49
-rw-r--r--src/devices/machine/1801vp128.cpp818
-rw-r--r--src/devices/machine/1801vp128.h213
-rw-r--r--src/devices/machine/1ma6.cpp409
-rw-r--r--src/devices/machine/1ma6.h77
-rw-r--r--src/devices/machine/1mb5.cpp263
-rw-r--r--src/devices/machine/1mb5.h83
-rw-r--r--src/devices/machine/2812fifo.cpp234
-rw-r--r--src/devices/machine/2812fifo.h85
-rw-r--r--src/devices/machine/28fxxx.cpp245
-rw-r--r--src/devices/machine/28fxxx.h91
-rw-r--r--src/devices/machine/40105.cpp229
-rw-r--r--src/devices/machine/40105.h83
-rw-r--r--src/devices/machine/53c7xx.cpp1799
-rw-r--r--src/devices/machine/53c7xx.h179
-rw-r--r--src/devices/machine/53c810.cpp819
-rw-r--r--src/devices/machine/53c810.h110
-rw-r--r--src/devices/machine/64h156.cpp657
-rw-r--r--src/devices/machine/64h156.h185
-rw-r--r--src/devices/machine/6522via.cpp1220
-rw-r--r--src/devices/machine/6522via.h260
-rw-r--r--src/devices/machine/6525tpi.cpp545
-rw-r--r--src/devices/machine/6525tpi.h122
-rw-r--r--src/devices/machine/68153bim.cpp396
-rw-r--r--src/devices/machine/68153bim.h198
-rw-r--r--src/devices/machine/6821pia.cpp1119
-rw-r--r--src/devices/machine/6821pia.h217
-rw-r--r--src/devices/machine/68230pit.cpp990
-rw-r--r--src/devices/machine/68230pit.h335
-rw-r--r--src/devices/machine/68307.cpp326
-rw-r--r--src/devices/machine/68307.h103
-rw-r--r--src/devices/machine/68307bus.cpp108
-rw-r--r--src/devices/machine/68307bus.h22
-rw-r--r--src/devices/machine/68307sim.cpp422
-rw-r--r--src/devices/machine/68307sim.h52
-rw-r--r--src/devices/machine/68307tmu.cpp253
-rw-r--r--src/devices/machine/68307tmu.h41
-rw-r--r--src/devices/machine/68340.cpp302
-rw-r--r--src/devices/machine/68340.h120
-rw-r--r--src/devices/machine/68340dma.cpp34
-rw-r--r--src/devices/machine/68340dma.h16
-rw-r--r--src/devices/machine/68340ser.cpp163
-rw-r--r--src/devices/machine/68340ser.h67
-rw-r--r--src/devices/machine/68340sim.cpp581
-rw-r--r--src/devices/machine/68340sim.h124
-rw-r--r--src/devices/machine/68340tmu.cpp519
-rw-r--r--src/devices/machine/68340tmu.h125
-rw-r--r--src/devices/machine/6840ptm.cpp821
-rw-r--r--src/devices/machine/6840ptm.h139
-rw-r--r--src/devices/machine/6850acia.cpp624
-rw-r--r--src/devices/machine/6850acia.h139
-rw-r--r--src/devices/machine/68561mpcc.cpp1276
-rw-r--r--src/devices/machine/68561mpcc.h462
-rw-r--r--src/devices/machine/6883sam.cpp491
-rw-r--r--src/devices/machine/6883sam.h219
-rw-r--r--src/devices/machine/7200fifo.cpp190
-rw-r--r--src/devices/machine/7200fifo.h137
-rw-r--r--src/devices/machine/7404.cpp79
-rw-r--r--src/devices/machine/7404.h110
-rw-r--r--src/devices/machine/74123.cpp249
-rw-r--r--src/devices/machine/74123.h125
-rw-r--r--src/devices/machine/74145.cpp113
-rw-r--r--src/devices/machine/74145.h49
-rw-r--r--src/devices/machine/74148.cpp197
-rw-r--r--src/devices/machine/74148.h90
-rw-r--r--src/devices/machine/74153.cpp207
-rw-r--r--src/devices/machine/74153.h86
-rw-r--r--src/devices/machine/74157.cpp290
-rw-r--r--src/devices/machine/74157.h131
-rw-r--r--src/devices/machine/74161.cpp215
-rw-r--r--src/devices/machine/74161.h158
-rw-r--r--src/devices/machine/74165.cpp123
-rw-r--r--src/devices/machine/74165.h73
-rw-r--r--src/devices/machine/74166.cpp119
-rw-r--r--src/devices/machine/74166.h72
-rw-r--r--src/devices/machine/74175.cpp235
-rw-r--r--src/devices/machine/74175.h155
-rw-r--r--src/devices/machine/74181.cpp151
-rw-r--r--src/devices/machine/74181.h70
-rw-r--r--src/devices/machine/74259.cpp414
-rw-r--r--src/devices/machine/74259.h150
-rw-r--r--src/devices/machine/74381.cpp147
-rw-r--r--src/devices/machine/74381.h61
-rw-r--r--src/devices/machine/74543.cpp117
-rw-r--r--src/devices/machine/74543.h124
-rw-r--r--src/devices/machine/74610.cpp212
-rw-r--r--src/devices/machine/74610.h110
-rw-r--r--src/devices/machine/7474.cpp214
-rw-r--r--src/devices/machine/7474.h105
-rw-r--r--src/devices/machine/8042kbdc.cpp617
-rw-r--r--src/devices/machine/8042kbdc.h144
-rw-r--r--src/devices/machine/82c100.cpp434
-rw-r--r--src/devices/machine/82c100.h146
-rw-r--r--src/devices/machine/82c606.cpp311
-rw-r--r--src/devices/machine/82c606.h105
-rw-r--r--src/devices/machine/82s129.cpp147
-rw-r--r--src/devices/machine/82s129.h131
-rw-r--r--src/devices/machine/acorn_bmu.cpp267
-rw-r--r--src/devices/machine/acorn_bmu.h87
-rw-r--r--src/devices/machine/acorn_ioc.cpp400
-rw-r--r--src/devices/machine/acorn_ioc.h129
-rw-r--r--src/devices/machine/acorn_lc.cpp152
-rw-r--r--src/devices/machine/acorn_lc.h85
-rw-r--r--src/devices/machine/acorn_memc.cpp512
-rw-r--r--src/devices/machine/acorn_memc.h101
-rw-r--r--src/devices/machine/acorn_vidc.cpp807
-rw-r--r--src/devices/machine/acorn_vidc.h200
-rw-r--r--src/devices/machine/adc0804.cpp276
-rw-r--r--src/devices/machine/adc0804.h125
-rw-r--r--src/devices/machine/adc0808.cpp212
-rw-r--r--src/devices/machine/adc0808.h113
-rw-r--r--src/devices/machine/adc083x.cpp447
-rw-r--r--src/devices/machine/adc083x.h117
-rw-r--r--src/devices/machine/adc0844.cpp190
-rw-r--r--src/devices/machine/adc0844.h95
-rw-r--r--src/devices/machine/adc1038.cpp129
-rw-r--r--src/devices/machine/adc1038.h64
-rw-r--r--src/devices/machine/adc1213x.cpp338
-rw-r--r--src/devices/machine/adc1213x.h83
-rw-r--r--src/devices/machine/aic565.cpp256
-rw-r--r--src/devices/machine/aic565.h65
-rw-r--r--src/devices/machine/aic580.cpp364
-rw-r--r--src/devices/machine/aic580.h86
-rw-r--r--src/devices/machine/aic6250.cpp1120
-rw-r--r--src/devices/machine/aic6250.h291
-rw-r--r--src/devices/machine/aicartc.cpp173
-rw-r--r--src/devices/machine/aicartc.h52
-rw-r--r--src/devices/machine/alpha_8921.cpp212
-rw-r--r--src/devices/machine/alpha_8921.h67
-rw-r--r--src/devices/machine/am25s55x.cpp202
-rw-r--r--src/devices/machine/am25s55x.h110
-rw-r--r--src/devices/machine/am2847.cpp170
-rw-r--r--src/devices/machine/am2847.h123
-rw-r--r--src/devices/machine/am2901b.cpp216
-rw-r--r--src/devices/machine/am2901b.h105
-rw-r--r--src/devices/machine/am2910.cpp297
-rw-r--r--src/devices/machine/am2910.h82
-rw-r--r--src/devices/machine/am79c30.cpp2040
-rw-r--r--src/devices/machine/am79c30.h213
-rw-r--r--src/devices/machine/am79c90.cpp877
-rw-r--r--src/devices/machine/am79c90.h197
-rw-r--r--src/devices/machine/am9513.cpp1483
-rw-r--r--src/devices/machine/am9513.h185
-rw-r--r--src/devices/machine/am9516.cpp1027
-rw-r--r--src/devices/machine/am9516.h135
-rw-r--r--src/devices/machine/am9517a.cpp1337
-rw-r--r--src/devices/machine/am9517a.h249
-rw-r--r--src/devices/machine/am9519.cpp309
-rw-r--r--src/devices/machine/am9519.h86
-rw-r--r--src/devices/machine/applefdintf.cpp100
-rw-r--r--src/devices/machine/applefdintf.h125
-rw-r--r--src/devices/machine/applepic.cpp578
-rw-r--r--src/devices/machine/applepic.h110
-rw-r--r--src/devices/machine/archimedes_keyb.cpp414
-rw-r--r--src/devices/machine/archimedes_keyb.h73
-rw-r--r--src/devices/machine/arm_iomd.cpp765
-rw-r--r--src/devices/machine/arm_iomd.h207
-rw-r--r--src/devices/machine/at.cpp428
-rw-r--r--src/devices/machine/at.h107
-rw-r--r--src/devices/machine/at28.cpp21
-rw-r--r--src/devices/machine/at28.h53
-rw-r--r--src/devices/machine/at28c16.cpp232
-rw-r--r--src/devices/machine/at28c16.h68
-rw-r--r--src/devices/machine/at29x.cpp521
-rw-r--r--src/devices/machine/at29x.h110
-rw-r--r--src/devices/machine/at45dbxx.cpp391
-rw-r--r--src/devices/machine/at45dbxx.h136
-rw-r--r--src/devices/machine/at_keybc.cpp570
-rw-r--r--src/devices/machine/at_keybc.h170
-rw-r--r--src/devices/machine/atahle.cpp869
-rw-r--r--src/devices/machine/atahle.h262
-rw-r--r--src/devices/machine/atastorage.cpp1037
-rw-r--r--src/devices/machine/atastorage.h131
-rw-r--r--src/devices/machine/atmel_arm_aic.cpp161
-rw-r--r--src/devices/machine/atmel_arm_aic.h80
-rw-r--r--src/devices/machine/autoconfig.cpp170
-rw-r--r--src/devices/machine/autoconfig.h73
-rw-r--r--src/devices/machine/ay31015.cpp725
-rw-r--r--src/devices/machine/ay31015.h171
-rw-r--r--src/devices/machine/ay34592.cpp236
-rw-r--r--src/devices/machine/ay34592.h81
-rw-r--r--src/devices/machine/bacta_datalogger.cpp217
-rw-r--r--src/devices/machine/bacta_datalogger.h39
-rw-r--r--src/devices/machine/bankdev.cpp104
-rw-r--r--src/devices/machine/bankdev.h80
-rw-r--r--src/devices/machine/bcreader.cpp329
-rw-r--r--src/devices/machine/bcreader.h52
-rw-r--r--src/devices/machine/bitmap_printer.cpp484
-rw-r--r--src/devices/machine/bitmap_printer.h124
-rw-r--r--src/devices/machine/bl_handhelds_menucontrol.cpp214
-rw-r--r--src/devices/machine/bl_handhelds_menucontrol.h64
-rw-r--r--src/devices/machine/bq4847.cpp513
-rw-r--r--src/devices/machine/bq4847.h98
-rw-r--r--src/devices/machine/bq48x2.cpp558
-rw-r--r--src/devices/machine/bq48x2.h135
-rw-r--r--src/devices/machine/buffer.cpp17
-rw-r--r--src/devices/machine/buffer.h32
-rw-r--r--src/devices/machine/busmouse.cpp217
-rw-r--r--src/devices/machine/busmouse.h57
-rw-r--r--src/devices/machine/cammu.cpp814
-rw-r--r--src/devices/machine/cammu.h661
-rw-r--r--src/devices/machine/cat702.cpp310
-rw-r--r--src/devices/machine/cat702.h63
-rw-r--r--src/devices/machine/cdp1852.cpp235
-rw-r--r--src/devices/machine/cdp1852.h79
-rw-r--r--src/devices/machine/cdp1871.cpp276
-rw-r--r--src/devices/machine/cdp1871.h114
-rw-r--r--src/devices/machine/cdp1879.cpp152
-rw-r--r--src/devices/machine/cdp1879.h70
-rw-r--r--src/devices/machine/ch376.cpp527
-rw-r--r--src/devices/machine/ch376.h81
-rw-r--r--src/devices/machine/chessmachine.cpp169
-rw-r--r--src/devices/machine/chessmachine.h65
-rw-r--r--src/devices/machine/clock.cpp131
-rw-r--r--src/devices/machine/clock.h54
-rw-r--r--src/devices/machine/com52c50.cpp157
-rw-r--r--src/devices/machine/com52c50.h88
-rw-r--r--src/devices/machine/com8116.cpp250
-rw-r--r--src/devices/machine/com8116.h147
-rw-r--r--src/devices/machine/cop452.cpp342
-rw-r--r--src/devices/machine/cop452.h97
-rw-r--r--src/devices/machine/corvushd.cpp1617
-rw-r--r--src/devices/machine/corvushd.h378
-rw-r--r--src/devices/machine/cr511b.cpp764
-rw-r--r--src/devices/machine/cr511b.h159
-rw-r--r--src/devices/machine/cr560b.cpp969
-rw-r--r--src/devices/machine/cr560b.h148
-rw-r--r--src/devices/machine/cs4031.cpp911
-rw-r--r--src/devices/machine/cs4031.h234
-rw-r--r--src/devices/machine/cs8221.cpp155
-rw-r--r--src/devices/machine/cs8221.h74
-rw-r--r--src/devices/machine/cs8900a.cpp1512
-rw-r--r--src/devices/machine/cs8900a.h108
-rw-r--r--src/devices/machine/cxd1095.cpp140
-rw-r--r--src/devices/machine/cxd1095.h88
-rw-r--r--src/devices/machine/cxd1185.cpp924
-rw-r--r--src/devices/machine/cxd1185.h257
-rw-r--r--src/devices/machine/diablo_hd.cpp1439
-rw-r--r--src/devices/machine/diablo_hd.h165
-rw-r--r--src/devices/machine/dimm_spd.cpp110
-rw-r--r--src/devices/machine/dimm_spd.h49
-rw-r--r--src/devices/machine/dl11.cpp464
-rw-r--r--src/devices/machine/dl11.h138
-rw-r--r--src/devices/machine/dmac.cpp487
-rw-r--r--src/devices/machine/dmac.h178
-rw-r--r--src/devices/machine/dp8390.cpp486
-rw-r--r--src/devices/machine/dp8390.h122
-rw-r--r--src/devices/machine/dp83932c.cpp591
-rw-r--r--src/devices/machine/dp83932c.h217
-rw-r--r--src/devices/machine/dp8573a.cpp486
-rw-r--r--src/devices/machine/dp8573a.h73
-rw-r--r--src/devices/machine/ds1204.cpp406
-rw-r--r--src/devices/machine/ds1204.h90
-rw-r--r--src/devices/machine/ds1205.cpp417
-rw-r--r--src/devices/machine/ds1205.h96
-rw-r--r--src/devices/machine/ds1207.cpp682
-rw-r--r--src/devices/machine/ds1207.h122
-rw-r--r--src/devices/machine/ds1215.cpp340
-rw-r--r--src/devices/machine/ds1215.h77
-rw-r--r--src/devices/machine/ds128x.cpp80
-rw-r--r--src/devices/machine/ds128x.h46
-rw-r--r--src/devices/machine/ds1302.cpp426
-rw-r--r--src/devices/machine/ds1302.h99
-rw-r--r--src/devices/machine/ds1307.cpp66
-rw-r--r--src/devices/machine/ds1307.h36
-rw-r--r--src/devices/machine/ds1386.cpp532
-rw-r--r--src/devices/machine/ds1386.h232
-rw-r--r--src/devices/machine/ds17x85.cpp286
-rw-r--r--src/devices/machine/ds17x85.h192
-rw-r--r--src/devices/machine/ds1994.cpp804
-rw-r--r--src/devices/machine/ds1994.h131
-rw-r--r--src/devices/machine/ds2401.cpp279
-rw-r--r--src/devices/machine/ds2401.h71
-rw-r--r--src/devices/machine/ds2404.cpp363
-rw-r--r--src/devices/machine/ds2404.h93
-rw-r--r--src/devices/machine/ds2430a.cpp693
-rw-r--r--src/devices/machine/ds2430a.h145
-rw-r--r--src/devices/machine/ds6417.cpp174
-rw-r--r--src/devices/machine/ds6417.h63
-rw-r--r--src/devices/machine/ds75160a.cpp108
-rw-r--r--src/devices/machine/ds75160a.h67
-rw-r--r--src/devices/machine/ds75161a.cpp335
-rw-r--r--src/devices/machine/ds75161a.h111
-rw-r--r--src/devices/machine/e0516.cpp354
-rw-r--r--src/devices/machine/e0516.h81
-rw-r--r--src/devices/machine/e05a03.cpp181
-rw-r--r--src/devices/machine/e05a03.h79
-rw-r--r--src/devices/machine/e05a30.cpp252
-rw-r--r--src/devices/machine/e05a30.h90
-rw-r--r--src/devices/machine/edlc.cpp623
-rw-r--r--src/devices/machine/edlc.h226
-rw-r--r--src/devices/machine/eeprom.cpp303
-rw-r--r--src/devices/machine/eeprom.h87
-rw-r--r--src/devices/machine/eeprom28.h535
-rw-r--r--src/devices/machine/eeprom28.ipp237
-rw-r--r--src/devices/machine/eeprompar.cpp221
-rw-r--r--src/devices/machine/eeprompar.h86
-rw-r--r--src/devices/machine/eepromser.cpp1128
-rw-r--r--src/devices/machine/eepromser.h254
-rw-r--r--src/devices/machine/elan_ep3a19a_soc.cpp191
-rw-r--r--src/devices/machine/elan_ep3a19a_soc.h74
-rw-r--r--src/devices/machine/elan_ep3a19asys.cpp120
-rw-r--r--src/devices/machine/elan_ep3a19asys.h38
-rw-r--r--src/devices/machine/elan_eu3a05_a.cpp382
-rw-r--r--src/devices/machine/elan_eu3a05_a.h89
-rw-r--r--src/devices/machine/elan_eu3a05_soc.cpp234
-rw-r--r--src/devices/machine/elan_eu3a05_soc.h98
-rw-r--r--src/devices/machine/elan_eu3a05commonsys.cpp424
-rw-r--r--src/devices/machine/elan_eu3a05commonsys.h71
-rw-r--r--src/devices/machine/elan_eu3a05commonvid.cpp80
-rw-r--r--src/devices/machine/elan_eu3a05commonvid.h36
-rw-r--r--src/devices/machine/elan_eu3a05gpio.cpp76
-rw-r--r--src/devices/machine/elan_eu3a05gpio.h41
-rw-r--r--src/devices/machine/elan_eu3a05sys.cpp108
-rw-r--r--src/devices/machine/elan_eu3a05sys.h45
-rw-r--r--src/devices/machine/elan_eu3a05vid.cpp791
-rw-r--r--src/devices/machine/elan_eu3a05vid.h113
-rw-r--r--src/devices/machine/elan_eu3a14_soc.cpp193
-rw-r--r--src/devices/machine/elan_eu3a14_soc.h104
-rw-r--r--src/devices/machine/elan_eu3a14sys.cpp91
-rw-r--r--src/devices/machine/elan_eu3a14sys.h37
-rw-r--r--src/devices/machine/elan_eu3a14vid.cpp891
-rw-r--r--src/devices/machine/elan_eu3a14vid.h101
-rw-r--r--src/devices/machine/em_reel.cpp125
-rw-r--r--src/devices/machine/em_reel.h89
-rw-r--r--src/devices/machine/er1400.cpp402
-rw-r--r--src/devices/machine/er1400.h96
-rw-r--r--src/devices/machine/er2055.cpp186
-rw-r--r--src/devices/machine/er2055.h88
-rw-r--r--src/devices/machine/exorterm.cpp890
-rw-r--r--src/devices/machine/exorterm.h150
-rw-r--r--src/devices/machine/f3853.cpp429
-rw-r--r--src/devices/machine/f3853.h180
-rw-r--r--src/devices/machine/f4702.cpp260
-rw-r--r--src/devices/machine/f4702.h75
-rw-r--r--src/devices/machine/f82c836.cpp514
-rw-r--r--src/devices/machine/f82c836.h243
-rw-r--r--src/devices/machine/fdc37c665gt.cpp451
-rw-r--r--src/devices/machine/fdc37c665gt.h132
-rw-r--r--src/devices/machine/fdc37c665ir.cpp452
-rw-r--r--src/devices/machine/fdc37c665ir.h113
-rw-r--r--src/devices/machine/fdc37c93x.cpp1008
-rw-r--r--src/devices/machine/fdc37c93x.h211
-rw-r--r--src/devices/machine/fdc_pll.cpp136
-rw-r--r--src/devices/machine/fdc_pll.h34
-rw-r--r--src/devices/machine/fga002.cpp816
-rw-r--r--src/devices/machine/fga002.h313
-rw-r--r--src/devices/machine/fm_scsi.cpp440
-rw-r--r--src/devices/machine/fm_scsi.h73
-rw-r--r--src/devices/machine/gen_fifo.cpp198
-rw-r--r--src/devices/machine/gen_fifo.h217
-rw-r--r--src/devices/machine/gen_latch.cpp248
-rw-r--r--src/devices/machine/gen_latch.h113
-rw-r--r--src/devices/machine/generalplus_gpce4_soc.cpp1179
-rw-r--r--src/devices/machine/generalplus_gpce4_soc.h224
-rw-r--r--src/devices/machine/generalplus_gpl1625x_soc.cpp920
-rw-r--r--src/devices/machine/generalplus_gpl1625x_soc.h94
-rw-r--r--src/devices/machine/generalplus_gpl162xx_soc.cpp2016
-rw-r--r--src/devices/machine/generalplus_gpl162xx_soc.h384
-rw-r--r--src/devices/machine/generalplus_gpl162xx_soc_video.cpp1315
-rw-r--r--src/devices/machine/generalplus_gpl162xx_soc_video.h266
-rw-r--r--src/devices/machine/generalplus_gpl951xx_rtc.cpp253
-rw-r--r--src/devices/machine/generalplus_gpl951xx_rtc.h72
-rw-r--r--src/devices/machine/generalplus_gpl951xx_soc.cpp1890
-rw-r--r--src/devices/machine/generalplus_gpl951xx_soc.h347
-rw-r--r--src/devices/machine/generalplus_gpl_chx.cpp355
-rw-r--r--src/devices/machine/generalplus_gpl_chx.h69
-rw-r--r--src/devices/machine/generalplus_gpl_dma.cpp296
-rw-r--r--src/devices/machine/generalplus_gpl_dma.h54
-rw-r--r--src/devices/machine/generalplus_gpl_timebase.cpp131
-rw-r--r--src/devices/machine/generalplus_gpl_timebase.h53
-rw-r--r--src/devices/machine/generic_spi_flash.cpp477
-rw-r--r--src/devices/machine/generic_spi_flash.h119
-rw-r--r--src/devices/machine/genpc.cpp993
-rw-r--r--src/devices/machine/genpc.h226
-rw-r--r--src/devices/machine/gmboard.cpp413
-rw-r--r--src/devices/machine/gmboard.h87
-rw-r--r--src/devices/machine/gpl_renderer.cpp782
-rw-r--r--src/devices/machine/gpl_renderer.h106
-rw-r--r--src/devices/machine/gt64xxx.cpp1121
-rw-r--r--src/devices/machine/gt64xxx.h187
-rw-r--r--src/devices/machine/gt913_io.cpp155
-rw-r--r--src/devices/machine/gt913_io.h73
-rw-r--r--src/devices/machine/gt913_kbd.cpp104
-rw-r--r--src/devices/machine/gt913_kbd.h56
-rw-r--r--src/devices/machine/gt913_snd.cpp384
-rw-r--r--src/devices/machine/gt913_snd.h88
-rw-r--r--src/devices/machine/hd63450.cpp628
-rw-r--r--src/devices/machine/hd63450.h150
-rw-r--r--src/devices/machine/hd64610.cpp352
-rw-r--r--src/devices/machine/hd64610.h80
-rw-r--r--src/devices/machine/hdc92x4.cpp4840
-rw-r--r--src/devices/machine/hdc92x4.h482
-rw-r--r--src/devices/machine/hp_dc100_tape.cpp931
-rw-r--r--src/devices/machine/hp_dc100_tape.h179
-rw-r--r--src/devices/machine/hp_taco.cpp1139
-rw-r--r--src/devices/machine/hp_taco.h130
-rw-r--r--src/devices/machine/i2chle.cpp276
-rw-r--r--src/devices/machine/i2chle.h46
-rw-r--r--src/devices/machine/i2cmem.cpp619
-rw-r--r--src/devices/machine/i2cmem.h141
-rw-r--r--src/devices/machine/i3001.cpp137
-rw-r--r--src/devices/machine/i3001.h106
-rw-r--r--src/devices/machine/i3002.cpp428
-rw-r--r--src/devices/machine/i3002.h130
-rw-r--r--src/devices/machine/i6300esb.cpp762
-rw-r--r--src/devices/machine/i6300esb.h159
-rw-r--r--src/devices/machine/i7110.cpp3441
-rw-r--r--src/devices/machine/i7110.h767
-rw-r--r--src/devices/machine/i7220.cpp696
-rw-r--r--src/devices/machine/i7220.h221
-rw-r--r--src/devices/machine/i80130.cpp160
-rw-r--r--src/devices/machine/i80130.h76
-rw-r--r--src/devices/machine/i8087.cpp4675
-rw-r--r--src/devices/machine/i8087.h226
-rw-r--r--src/devices/machine/i8155.cpp644
-rw-r--r--src/devices/machine/i8155.h140
-rw-r--r--src/devices/machine/i82091aa.cpp458
-rw-r--r--src/devices/machine/i82091aa.h95
-rw-r--r--src/devices/machine/i8212.cpp202
-rw-r--r--src/devices/machine/i8212.h79
-rw-r--r--src/devices/machine/i8214.cpp281
-rw-r--r--src/devices/machine/i8214.h78
-rw-r--r--src/devices/machine/i82355.cpp870
-rw-r--r--src/devices/machine/i82355.h90
-rw-r--r--src/devices/machine/i82357.cpp310
-rw-r--r--src/devices/machine/i82357.h91
-rw-r--r--src/devices/machine/i82371eb_acpi.cpp510
-rw-r--r--src/devices/machine/i82371eb_acpi.h97
-rw-r--r--src/devices/machine/i82371eb_ide.cpp37
-rw-r--r--src/devices/machine/i82371eb_ide.h26
-rw-r--r--src/devices/machine/i82371eb_isa.cpp353
-rw-r--r--src/devices/machine/i82371eb_isa.h68
-rw-r--r--src/devices/machine/i82371eb_usb.cpp132
-rw-r--r--src/devices/machine/i82371eb_usb.h34
-rw-r--r--src/devices/machine/i82371sb.cpp1215
-rw-r--r--src/devices/machine/i82371sb.h303
-rw-r--r--src/devices/machine/i82425ex_psc.cpp447
-rw-r--r--src/devices/machine/i82425ex_psc.h96
-rw-r--r--src/devices/machine/i82426ex_ib.cpp349
-rw-r--r--src/devices/machine/i82426ex_ib.h101
-rw-r--r--src/devices/machine/i8243.cpp149
-rw-r--r--src/devices/machine/i8243.h75
-rw-r--r--src/devices/machine/i82439hx.cpp410
-rw-r--r--src/devices/machine/i82439hx.h91
-rw-r--r--src/devices/machine/i82439tx.cpp289
-rw-r--r--src/devices/machine/i82439tx.h76
-rw-r--r--src/devices/machine/i82443bx_host.cpp197
-rw-r--r--src/devices/machine/i82443bx_host.h104
-rw-r--r--src/devices/machine/i8251.cpp995
-rw-r--r--src/devices/machine/i8251.h188
-rw-r--r--src/devices/machine/i82541.cpp36
-rw-r--r--src/devices/machine/i82541.h31
-rw-r--r--src/devices/machine/i8255.cpp934
-rw-r--r--src/devices/machine/i8255.h147
-rw-r--r--src/devices/machine/i8256.cpp678
-rw-r--r--src/devices/machine/i8256.h127
-rw-r--r--src/devices/machine/i8257.cpp657
-rw-r--r--src/devices/machine/i8257.h124
-rw-r--r--src/devices/machine/i82586.cpp1994
-rw-r--r--src/devices/machine/i82586.h401
-rw-r--r--src/devices/machine/i8271.cpp1725
-rw-r--r--src/devices/machine/i8271.h290
-rw-r--r--src/devices/machine/i8279.cpp554
-rw-r--r--src/devices/machine/i8279.h105
-rw-r--r--src/devices/machine/i82875p.cpp513
-rw-r--r--src/devices/machine/i82875p.h141
-rw-r--r--src/devices/machine/i8291a.cpp1225
-rw-r--r--src/devices/machine/i8291a.h356
-rw-r--r--src/devices/machine/i8355.cpp186
-rw-r--r--src/devices/machine/i8355.h80
-rw-r--r--src/devices/machine/ibm21s850.cpp161
-rw-r--r--src/devices/machine/ibm21s850.h209
-rw-r--r--src/devices/machine/icd2053b.cpp179
-rw-r--r--src/devices/machine/icd2053b.h37
-rw-r--r--src/devices/machine/icd2061a.cpp325
-rw-r--r--src/devices/machine/icd2061a.h105
-rw-r--r--src/devices/machine/icm7170.cpp329
-rw-r--r--src/devices/machine/icm7170.h89
-rw-r--r--src/devices/machine/idectrl.cpp440
-rw-r--r--src/devices/machine/idectrl.h160
-rw-r--r--src/devices/machine/ie15.cpp724
-rw-r--r--src/devices/machine/ie15.h167
-rw-r--r--src/devices/machine/ie15_kbd.cpp246
-rw-r--r--src/devices/machine/ie15_kbd.h63
-rw-r--r--src/devices/machine/im6402.cpp387
-rw-r--r--src/devices/machine/im6402.h140
-rw-r--r--src/devices/machine/input_merger.cpp130
-rw-r--r--src/devices/machine/input_merger.h92
-rw-r--r--src/devices/machine/ins8154.cpp234
-rw-r--r--src/devices/machine/ins8154.h91
-rw-r--r--src/devices/machine/ins8250.cpp821
-rw-r--r--src/devices/machine/ins8250.h160
-rw-r--r--src/devices/machine/intelfsh.cpp1295
-rw-r--r--src/devices/machine/intelfsh.h470
-rw-r--r--src/devices/machine/iopcdvd.cpp173
-rw-r--r--src/devices/machine/iopcdvd.h73
-rw-r--r--src/devices/machine/iopdma.cpp527
-rw-r--r--src/devices/machine/iopdma.h164
-rw-r--r--src/devices/machine/iopintc.cpp104
-rw-r--r--src/devices/machine/iopintc.h61
-rw-r--r--src/devices/machine/iopsio2.cpp314
-rw-r--r--src/devices/machine/iopsio2.h90
-rw-r--r--src/devices/machine/ioptimer.cpp258
-rw-r--r--src/devices/machine/ioptimer.h95
-rw-r--r--src/devices/machine/it8671f.cpp1160
-rw-r--r--src/devices/machine/it8671f.h211
-rw-r--r--src/devices/machine/it8705f.cpp697
-rw-r--r--src/devices/machine/it8705f.h139
-rw-r--r--src/devices/machine/iwm.cpp543
-rw-r--r--src/devices/machine/iwm.h92
-rw-r--r--src/devices/machine/jvsdev.cpp256
-rw-r--r--src/devices/machine/jvsdev.h51
-rw-r--r--src/devices/machine/jvshost.cpp158
-rw-r--r--src/devices/machine/jvshost.h47
-rw-r--r--src/devices/machine/k033906.cpp135
-rw-r--r--src/devices/machine/k033906.h54
-rw-r--r--src/devices/machine/k053252.cpp241
-rw-r--r--src/devices/machine/k053252.h58
-rw-r--r--src/devices/machine/k056230.cpp197
-rw-r--r--src/devices/machine/k056230.h63
-rw-r--r--src/devices/machine/kb3600.cpp182
-rw-r--r--src/devices/machine/kb3600.h109
-rw-r--r--src/devices/machine/keyboard.cpp372
-rw-r--r--src/devices/machine/keyboard.h120
-rw-r--r--src/devices/machine/keyboard.ipp181
-rw-r--r--src/devices/machine/kr1601rr1.cpp154
-rw-r--r--src/devices/machine/kr1601rr1.h77
-rw-r--r--src/devices/machine/kr2376.cpp301
-rw-r--r--src/devices/machine/kr2376.h126
-rw-r--r--src/devices/machine/laserdsc.cpp1229
-rw-r--r--src/devices/machine/laserdsc.h405
-rw-r--r--src/devices/machine/latch8.cpp158
-rw-r--r--src/devices/machine/latch8.h109
-rw-r--r--src/devices/machine/ldp1000.cpp218
-rw-r--r--src/devices/machine/ldp1000.h78
-rw-r--r--src/devices/machine/ldp1450.cpp356
-rw-r--r--src/devices/machine/ldp1450.h87
-rw-r--r--src/devices/machine/ldp1450hle.cpp1259
-rw-r--r--src/devices/machine/ldp1450hle.h208
-rw-r--r--src/devices/machine/ldpr8210.cpp1089
-rw-r--r--src/devices/machine/ldpr8210.h190
-rw-r--r--src/devices/machine/ldstub.cpp33
-rw-r--r--src/devices/machine/ldstub.h72
-rw-r--r--src/devices/machine/ldv1000.cpp644
-rw-r--r--src/devices/machine/ldv1000.h124
-rw-r--r--src/devices/machine/ldv1000hle.cpp1046
-rw-r--r--src/devices/machine/ldv1000hle.h201
-rw-r--r--src/devices/machine/ldv4200hle.cpp979
-rw-r--r--src/devices/machine/ldv4200hle.h212
-rw-r--r--src/devices/machine/ldvp931.cpp676
-rw-r--r--src/devices/machine/ldvp931.h130
-rw-r--r--src/devices/machine/legscsi.cpp148
-rw-r--r--src/devices/machine/legscsi.h37
-rw-r--r--src/devices/machine/lh5810.cpp185
-rw-r--r--src/devices/machine/lh5810.h51
-rw-r--r--src/devices/machine/lh79524_timer.cpp168
-rw-r--r--src/devices/machine/lh79524_timer.h49
-rw-r--r--src/devices/machine/locomo.cpp376
-rw-r--r--src/devices/machine/locomo.h34
-rw-r--r--src/devices/machine/lpc-acpi.cpp370
-rw-r--r--src/devices/machine/lpc-acpi.h87
-rw-r--r--src/devices/machine/lpc-pit.cpp49
-rw-r--r--src/devices/machine/lpc-pit.h31
-rw-r--r--src/devices/machine/lpc-rtc.cpp90
-rw-r--r--src/devices/machine/lpc-rtc.h43
-rw-r--r--src/devices/machine/lpc.h18
-rw-r--r--src/devices/machine/lpci.cpp284
-rw-r--r--src/devices/machine/lpci.h87
-rw-r--r--src/devices/machine/m3002.cpp497
-rw-r--r--src/devices/machine/m3002.h114
-rw-r--r--src/devices/machine/m68sfdc.cpp848
-rw-r--r--src/devices/machine/m68sfdc.h150
-rw-r--r--src/devices/machine/m6m80011ap.cpp231
-rw-r--r--src/devices/machine/m6m80011ap.h57
-rw-r--r--src/devices/machine/m950x0.cpp207
-rw-r--r--src/devices/machine/m950x0.h97
-rw-r--r--src/devices/machine/m95320.cpp202
-rw-r--r--src/devices/machine/m95320.h59
-rw-r--r--src/devices/machine/macseconds.cpp55
-rw-r--r--src/devices/machine/macseconds.h23
-rw-r--r--src/devices/machine/mb14241.cpp63
-rw-r--r--src/devices/machine/mb14241.h36
-rw-r--r--src/devices/machine/mb3773.cpp83
-rw-r--r--src/devices/machine/mb3773.h42
-rw-r--r--src/devices/machine/mb8421.cpp45
-rw-r--r--src/devices/machine/mb8421.h278
-rw-r--r--src/devices/machine/mb87030.cpp953
-rw-r--r--src/devices/machine/mb87030.h236
-rw-r--r--src/devices/machine/mb8795.cpp418
-rw-r--r--src/devices/machine/mb8795.h73
-rw-r--r--src/devices/machine/mb89363b.cpp163
-rw-r--r--src/devices/machine/mb89363b.h82
-rw-r--r--src/devices/machine/mb89371.cpp258
-rw-r--r--src/devices/machine/mb89371.h87
-rw-r--r--src/devices/machine/mb89374.cpp613
-rw-r--r--src/devices/machine/mb89374.h151
-rw-r--r--src/devices/machine/mc14411.cpp305
-rw-r--r--src/devices/machine/mc14411.h109
-rw-r--r--src/devices/machine/mc146818.cpp750
-rw-r--r--src/devices/machine/mc146818.h210
-rw-r--r--src/devices/machine/mc68328.cpp3978
-rw-r--r--src/devices/machine/mc68328.h1242
-rw-r--r--src/devices/machine/mc6843.cpp1020
-rw-r--r--src/devices/machine/mc6843.h200
-rw-r--r--src/devices/machine/mc6844.cpp537
-rw-r--r--src/devices/machine/mc6844.h146
-rw-r--r--src/devices/machine/mc6846.cpp549
-rw-r--r--src/devices/machine/mc6846.h105
-rw-r--r--src/devices/machine/mc6852.cpp493
-rw-r--r--src/devices/machine/mc6852.h175
-rw-r--r--src/devices/machine/mc6854.cpp985
-rw-r--r--src/devices/machine/mc6854.h152
-rw-r--r--src/devices/machine/mc68681.cpp1895
-rw-r--r--src/devices/machine/mc68681.h328
-rw-r--r--src/devices/machine/mc68901.cpp1478
-rw-r--r--src/devices/machine/mc68901.h282
-rw-r--r--src/devices/machine/mc88200.cpp993
-rw-r--r--src/devices/machine/mc88200.h141
-rw-r--r--src/devices/machine/mccs1850.cpp568
-rw-r--r--src/devices/machine/mccs1850.h102
-rw-r--r--src/devices/machine/mdcr.cpp327
-rw-r--r--src/devices/machine/mdcr.h181
-rw-r--r--src/devices/machine/mediagx_cs5530_bridge.cpp562
-rw-r--r--src/devices/machine/mediagx_cs5530_bridge.h149
-rw-r--r--src/devices/machine/mediagx_cs5530_ide.cpp142
-rw-r--r--src/devices/machine/mediagx_cs5530_ide.h66
-rw-r--r--src/devices/machine/mediagx_cs5530_video.cpp55
-rw-r--r--src/devices/machine/mediagx_cs5530_video.h29
-rw-r--r--src/devices/machine/mediagx_host.cpp375
-rw-r--r--src/devices/machine/mediagx_host.h83
-rw-r--r--src/devices/machine/meters.cpp96
-rw-r--r--src/devices/machine/meters.h53
-rw-r--r--src/devices/machine/micomxe1a.cpp372
-rw-r--r--src/devices/machine/micomxe1a.h50
-rw-r--r--src/devices/machine/microtch.cpp444
-rw-r--r--src/devices/machine/microtch.h89
-rw-r--r--src/devices/machine/mm5307.cpp209
-rw-r--r--src/devices/machine/mm5307.h98
-rw-r--r--src/devices/machine/mm5740.cpp186
-rw-r--r--src/devices/machine/mm5740.h127
-rw-r--r--src/devices/machine/mm58167.cpp255
-rw-r--r--src/devices/machine/mm58167.h63
-rw-r--r--src/devices/machine/mm58174.cpp365
-rw-r--r--src/devices/machine/mm58174.h65
-rw-r--r--src/devices/machine/mm58274c.cpp471
-rw-r--r--src/devices/machine/mm58274c.h75
-rw-r--r--src/devices/machine/mm74c922.cpp184
-rw-r--r--src/devices/machine/mm74c922.h115
-rw-r--r--src/devices/machine/mos6526.cpp1182
-rw-r--r--src/devices/machine/mos6526.h258
-rw-r--r--src/devices/machine/mos6529.cpp69
-rw-r--r--src/devices/machine/mos6529.h69
-rw-r--r--src/devices/machine/mos6530.cpp594
-rw-r--r--src/devices/machine/mos6530.h207
-rw-r--r--src/devices/machine/mos6551.cpp854
-rw-r--r--src/devices/machine/mos6551.h194
-rw-r--r--src/devices/machine/mos6702.cpp64
-rw-r--r--src/devices/machine/mos6702.h52
-rw-r--r--src/devices/machine/mos8706.cpp74
-rw-r--r--src/devices/machine/mos8706.h57
-rw-r--r--src/devices/machine/mos8722.cpp361
-rw-r--r--src/devices/machine/mos8722.h126
-rw-r--r--src/devices/machine/mos8726.cpp127
-rw-r--r--src/devices/machine/mos8726.h84
-rw-r--r--src/devices/machine/mpc106.cpp384
-rw-r--r--src/devices/machine/mpc106.h99
-rw-r--r--src/devices/machine/mpu401.cpp243
-rw-r--r--src/devices/machine/mpu401.h61
-rw-r--r--src/devices/machine/msm5001n.cpp199
-rw-r--r--src/devices/machine/msm5001n.h63
-rw-r--r--src/devices/machine/msm5832.cpp299
-rw-r--r--src/devices/machine/msm5832.h88
-rw-r--r--src/devices/machine/msm58321.cpp681
-rw-r--r--src/devices/machine/msm58321.h138
-rw-r--r--src/devices/machine/msm6200.cpp115
-rw-r--r--src/devices/machine/msm6200.h46
-rw-r--r--src/devices/machine/msm6242.cpp625
-rw-r--r--src/devices/machine/msm6242.h147
-rw-r--r--src/devices/machine/msm6253.cpp132
-rw-r--r--src/devices/machine/msm6253.h72
-rw-r--r--src/devices/machine/mv6436x.cpp1230
-rw-r--r--src/devices/machine/mv6436x.h282
-rw-r--r--src/devices/machine/mv_sonora.cpp405
-rw-r--r--src/devices/machine/mv_sonora.h76
-rw-r--r--src/devices/machine/myb3k_kbd.cpp504
-rw-r--r--src/devices/machine/myb3k_kbd.h101
-rw-r--r--src/devices/machine/nandflash.cpp653
-rw-r--r--src/devices/machine/nandflash.h169
-rw-r--r--src/devices/machine/ncr5380.cpp677
-rw-r--r--src/devices/machine/ncr5380.h193
-rw-r--r--src/devices/machine/ncr5385.cpp844
-rw-r--r--src/devices/machine/ncr5385.h126
-rw-r--r--src/devices/machine/ncr53c90.cpp1447
-rw-r--r--src/devices/machine/ncr53c90.h386
-rw-r--r--src/devices/machine/netlist.cpp1490
-rw-r--r--src/devices/machine/netlist.h678
-rw-r--r--src/devices/machine/nmc9306.cpp433
-rw-r--r--src/devices/machine/nmc9306.h75
-rw-r--r--src/devices/machine/nmk112.cpp130
-rw-r--r--src/devices/machine/nmk112.h58
-rw-r--r--src/devices/machine/ns32081.cpp833
-rw-r--r--src/devices/machine/ns32081.h126
-rw-r--r--src/devices/machine/ns32082.cpp497
-rw-r--r--src/devices/machine/ns32082.h69
-rw-r--r--src/devices/machine/ns32202.cpp975
-rw-r--r--src/devices/machine/ns32202.h141
-rw-r--r--src/devices/machine/ns32382.cpp429
-rw-r--r--src/devices/machine/ns32382.h66
-rw-r--r--src/devices/machine/nsc810.cpp331
-rw-r--r--src/devices/machine/nsc810.h113
-rw-r--r--src/devices/machine/nscsi_bus.cpp205
-rw-r--r--src/devices/machine/nscsi_bus.h151
-rw-r--r--src/devices/machine/nscsi_cb.cpp49
-rw-r--r--src/devices/machine/nscsi_cb.h71
-rw-r--r--src/devices/machine/nscsi_hle.cpp810
-rw-r--r--src/devices/machine/nscsi_hle.h724
-rw-r--r--src/devices/machine/nvram.cpp141
-rw-r--r--src/devices/machine/nvram.h75
-rw-r--r--src/devices/machine/output_latch.cpp31
-rw-r--r--src/devices/machine/output_latch.h29
-rw-r--r--src/devices/machine/pc87306.cpp491
-rw-r--r--src/devices/machine/pc87306.h123
-rw-r--r--src/devices/machine/pc97338.cpp387
-rw-r--r--src/devices/machine/pc97338.h124
-rw-r--r--src/devices/machine/pc_fdc.cpp167
-rw-r--r--src/devices/machine/pc_fdc.h65
-rw-r--r--src/devices/machine/pc_lpt.cpp173
-rw-r--r--src/devices/machine/pc_lpt.h91
-rw-r--r--src/devices/machine/pcf8573.cpp356
-rw-r--r--src/devices/machine/pcf8573.h127
-rw-r--r--src/devices/machine/pcf8583.cpp420
-rw-r--r--src/devices/machine/pcf8583.h174
-rw-r--r--src/devices/machine/pcf8584.cpp229
-rw-r--r--src/devices/machine/pcf8584.h100
-rw-r--r--src/devices/machine/pcf8593.cpp290
-rw-r--r--src/devices/machine/pcf8593.h68
-rw-r--r--src/devices/machine/pcfx_intc.cpp163
-rw-r--r--src/devices/machine/pcfx_intc.h41
-rw-r--r--src/devices/machine/pci-apic.cpp21
-rw-r--r--src/devices/machine/pci-apic.h26
-rw-r--r--src/devices/machine/pci-ide.cpp247
-rw-r--r--src/devices/machine/pci-ide.h83
-rw-r--r--src/devices/machine/pci-sata.cpp53
-rw-r--r--src/devices/machine/pci-sata.h34
-rw-r--r--src/devices/machine/pci-smbus.cpp282
-rw-r--r--src/devices/machine/pci-smbus.h70
-rw-r--r--src/devices/machine/pci-usb.cpp229
-rw-r--r--src/devices/machine/pci-usb.h76
-rw-r--r--src/devices/machine/pci.cpp1062
-rw-r--r--src/devices/machine/pci.h318
-rw-r--r--src/devices/machine/pci9050.cpp296
-rw-r--r--src/devices/machine/pci9050.h72
-rw-r--r--src/devices/machine/pckeybrd.cpp1271
-rw-r--r--src/devices/machine/pckeybrd.h125
-rw-r--r--src/devices/machine/pdc.cpp594
-rw-r--r--src/devices/machine/pdc.h117
-rw-r--r--src/devices/machine/pdp11.h37
-rw-r--r--src/devices/machine/phi.cpp1473
-rw-r--r--src/devices/machine/phi.h281
-rw-r--r--src/devices/machine/pic8259.cpp481
-rw-r--r--src/devices/machine/pic8259.h140
-rw-r--r--src/devices/machine/pit8253.cpp1187
-rw-r--r--src/devices/machine/pit8253.h186
-rw-r--r--src/devices/machine/pla.cpp233
-rw-r--r--src/devices/machine/pla.h123
-rw-r--r--src/devices/machine/ps2dma.cpp796
-rw-r--r--src/devices/machine/ps2dma.h152
-rw-r--r--src/devices/machine/ps2intc.cpp84
-rw-r--r--src/devices/machine/ps2intc.h72
-rw-r--r--src/devices/machine/ps2mc.cpp202
-rw-r--r--src/devices/machine/ps2mc.h74
-rw-r--r--src/devices/machine/ps2pad.cpp333
-rw-r--r--src/devices/machine/ps2pad.h77
-rw-r--r--src/devices/machine/ps2sif.cpp203
-rw-r--r--src/devices/machine/ps2sif.h61
-rw-r--r--src/devices/machine/ps2timer.cpp272
-rw-r--r--src/devices/machine/ps2timer.h116
-rw-r--r--src/devices/machine/pseudovia.cpp780
-rw-r--r--src/devices/machine/pseudovia.h120
-rw-r--r--src/devices/machine/psion_asic1.cpp484
-rw-r--r--src/devices/machine/psion_asic1.h100
-rw-r--r--src/devices/machine/psion_asic2.cpp448
-rw-r--r--src/devices/machine/psion_asic2.h100
-rw-r--r--src/devices/machine/psion_asic3.cpp301
-rw-r--r--src/devices/machine/psion_asic3.h79
-rw-r--r--src/devices/machine/psion_asic4.cpp170
-rw-r--r--src/devices/machine/psion_asic4.h59
-rw-r--r--src/devices/machine/psion_asic5.cpp459
-rw-r--r--src/devices/machine/psion_asic5.h119
-rw-r--r--src/devices/machine/psion_asic7.cpp175
-rw-r--r--src/devices/machine/psion_asic7.h72
-rw-r--r--src/devices/machine/psion_asic9.cpp1194
-rw-r--r--src/devices/machine/psion_asic9.h190
-rw-r--r--src/devices/machine/psion_condor.cpp278
-rw-r--r--src/devices/machine/psion_condor.h75
-rw-r--r--src/devices/machine/psion_ssd.cpp284
-rw-r--r--src/devices/machine/psion_ssd.h82
-rw-r--r--src/devices/machine/pxa255.cpp1821
-rw-r--r--src/devices/machine/pxa255.h481
-rw-r--r--src/devices/machine/quadmouse.cpp128
-rw-r--r--src/devices/machine/quadmouse.h61
-rw-r--r--src/devices/machine/r10696.cpp179
-rw-r--r--src/devices/machine/r10696.h49
-rw-r--r--src/devices/machine/r10788.cpp208
-rw-r--r--src/devices/machine/r10788.h66
-rw-r--r--src/devices/machine/r65c52.cpp988
-rw-r--r--src/devices/machine/r65c52.h249
-rw-r--r--src/devices/machine/ra17xx.cpp142
-rw-r--r--src/devices/machine/ra17xx.h50
-rw-r--r--src/devices/machine/ram.cpp249
-rw-r--r--src/devices/machine/ram.h93
-rw-r--r--src/devices/machine/rescap.h58
-rw-r--r--src/devices/machine/rf5c296.cpp115
-rw-r--r--src/devices/machine/rf5c296.h38
-rw-r--r--src/devices/machine/ripple_counter.cpp169
-rw-r--r--src/devices/machine/ripple_counter.h75
-rw-r--r--src/devices/machine/rp5c01.cpp453
-rw-r--r--src/devices/machine/rp5c01.h121
-rw-r--r--src/devices/machine/rp5c15.cpp438
-rw-r--r--src/devices/machine/rp5c15.h86
-rw-r--r--src/devices/machine/rp5h01.cpp192
-rw-r--r--src/devices/machine/rp5h01.h77
-rw-r--r--src/devices/machine/rstbuf.cpp168
-rw-r--r--src/devices/machine/rstbuf.h98
-rw-r--r--src/devices/machine/rtc4543.cpp412
-rw-r--r--src/devices/machine/rtc4543.h100
-rw-r--r--src/devices/machine/rtc65271.cpp716
-rw-r--r--src/devices/machine/rtc65271.h83
-rw-r--r--src/devices/machine/rtc9701.cpp496
-rw-r--r--src/devices/machine/rtc9701.h102
-rw-r--r--src/devices/machine/s2350.cpp418
-rw-r--r--src/devices/machine/s2350.h120
-rw-r--r--src/devices/machine/s2636.cpp476
-rw-r--r--src/devices/machine/s2636.h154
-rw-r--r--src/devices/machine/s3520cf.cpp340
-rw-r--r--src/devices/machine/s3520cf.h97
-rw-r--r--src/devices/machine/s3c2400.cpp249
-rw-r--r--src/devices/machine/s3c2400.h519
-rw-r--r--src/devices/machine/s3c2410.cpp335
-rw-r--r--src/devices/machine/s3c2410.h635
-rw-r--r--src/devices/machine/s3c2440.cpp354
-rw-r--r--src/devices/machine/s3c2440.h682
-rw-r--r--src/devices/machine/s3c24xx.cpp190
-rw-r--r--src/devices/machine/s3c24xx.h310
-rw-r--r--src/devices/machine/s3c24xx.hxx3230
-rw-r--r--src/devices/machine/s3c44b0.cpp2243
-rw-r--r--src/devices/machine/s3c44b0.h636
-rw-r--r--src/devices/machine/s_smp.cpp314
-rw-r--r--src/devices/machine/s_smp.h87
-rw-r--r--src/devices/machine/sa1110.cpp3155
-rw-r--r--src/devices/machine/sa1110.h939
-rw-r--r--src/devices/machine/sa1111.cpp2194
-rw-r--r--src/devices/machine/sa1111.h688
-rw-r--r--src/devices/machine/saa1043.cpp54
-rw-r--r--src/devices/machine/saa1043.h121
-rw-r--r--src/devices/machine/saa5070.cpp350
-rw-r--r--src/devices/machine/saa5070.h151
-rw-r--r--src/devices/machine/saa7191.cpp214
-rw-r--r--src/devices/machine/saa7191.h172
-rw-r--r--src/devices/machine/sc16is741.cpp1264
-rw-r--r--src/devices/machine/sc16is741.h132
-rw-r--r--src/devices/machine/scc2698b.cpp739
-rw-r--r--src/devices/machine/scc2698b.h157
-rw-r--r--src/devices/machine/scc66470.cpp890
-rw-r--r--src/devices/machine/scc66470.h115
-rw-r--r--src/devices/machine/scc68070.cpp1834
-rw-r--r--src/devices/machine/scc68070.h303
-rw-r--r--src/devices/machine/sci4.cpp337
-rw-r--r--src/devices/machine/sci4.h74
-rw-r--r--src/devices/machine/scn_pci.cpp1554
-rw-r--r--src/devices/machine/scn_pci.h283
-rw-r--r--src/devices/machine/scnxx562.cpp2577
-rw-r--r--src/devices/machine/scnxx562.h708
-rw-r--r--src/devices/machine/scoop.cpp176
-rw-r--r--src/devices/machine/scoop.h42
-rw-r--r--src/devices/machine/sda2006.cpp208
-rw-r--r--src/devices/machine/sda2006.h59
-rw-r--r--src/devices/machine/sdlc.cpp309
-rw-r--r--src/devices/machine/sdlc.h105
-rw-r--r--src/devices/machine/sega_md_ioport.cpp524
-rw-r--r--src/devices/machine/sega_md_ioport.h209
-rw-r--r--src/devices/machine/segacrp2_device.cpp452
-rw-r--r--src/devices/machine/segacrp2_device.h126
-rw-r--r--src/devices/machine/segacrpt_device.cpp1068
-rw-r--r--src/devices/machine/segacrpt_device.h293
-rw-r--r--src/devices/machine/sensorboard.cpp891
-rw-r--r--src/devices/machine/sensorboard.h155
-rw-r--r--src/devices/machine/sis5513_ide.cpp363
-rw-r--r--src/devices/machine/sis5513_ide.h90
-rw-r--r--src/devices/machine/sis630_gui.cpp337
-rw-r--r--src/devices/machine/sis630_gui.h98
-rw-r--r--src/devices/machine/sis630_host.cpp454
-rw-r--r--src/devices/machine/sis630_host.h101
-rw-r--r--src/devices/machine/sis7001_usb.cpp93
-rw-r--r--src/devices/machine/sis7001_usb.h50
-rw-r--r--src/devices/machine/sis7018_audio.cpp173
-rw-r--r--src/devices/machine/sis7018_audio.h54
-rw-r--r--src/devices/machine/sis85c496.cpp828
-rw-r--r--src/devices/machine/sis85c496.h196
-rw-r--r--src/devices/machine/sis900_eth.cpp161
-rw-r--r--src/devices/machine/sis900_eth.h53
-rw-r--r--src/devices/machine/sis950_acpi.cpp433
-rw-r--r--src/devices/machine/sis950_acpi.h97
-rw-r--r--src/devices/machine/sis950_lpc.cpp968
-rw-r--r--src/devices/machine/sis950_lpc.h210
-rw-r--r--src/devices/machine/sis950_smbus.cpp108
-rw-r--r--src/devices/machine/sis950_smbus.h32
-rw-r--r--src/devices/machine/smartboard.cpp335
-rw-r--r--src/devices/machine/smartboard.h63
-rw-r--r--src/devices/machine/smartmed.cpp342
-rw-r--r--src/devices/machine/smartmed.h57
-rw-r--r--src/devices/machine/smc91c9x.cpp1048
-rw-r--r--src/devices/machine/smc91c9x.h326
-rw-r--r--src/devices/machine/smioc.cpp695
-rw-r--r--src/devices/machine/smioc.h146
-rw-r--r--src/devices/machine/spg110.cpp204
-rw-r--r--src/devices/machine/spg110.h96
-rw-r--r--src/devices/machine/spg110_video.cpp928
-rw-r--r--src/devices/machine/spg110_video.h192
-rw-r--r--src/devices/machine/spg290_cdservo.cpp415
-rw-r--r--src/devices/machine/spg290_cdservo.h76
-rw-r--r--src/devices/machine/spg290_i2c.cpp144
-rw-r--r--src/devices/machine/spg290_i2c.h46
-rw-r--r--src/devices/machine/spg290_ppu.cpp560
-rw-r--r--src/devices/machine/spg290_ppu.h85
-rw-r--r--src/devices/machine/spg290_timer.cpp156
-rw-r--r--src/devices/machine/spg290_timer.h43
-rw-r--r--src/devices/machine/spg2xx.cpp208
-rw-r--r--src/devices/machine/spg2xx.h199
-rw-r--r--src/devices/machine/spg2xx_audio.cpp1499
-rw-r--r--src/devices/machine/spg2xx_audio.h423
-rw-r--r--src/devices/machine/spg2xx_io.cpp1692
-rw-r--r--src/devices/machine/spg2xx_io.h307
-rw-r--r--src/devices/machine/spg2xx_sysdma.cpp117
-rw-r--r--src/devices/machine/spg2xx_sysdma.h46
-rw-r--r--src/devices/machine/spg2xx_video.cpp481
-rw-r--r--src/devices/machine/spg2xx_video.h80
-rw-r--r--src/devices/machine/spg_renderer.cpp589
-rw-r--r--src/devices/machine/spg_renderer.h93
-rw-r--r--src/devices/machine/spi_psram.cpp427
-rw-r--r--src/devices/machine/spi_psram.h87
-rw-r--r--src/devices/machine/spi_sdcard.cpp734
-rw-r--r--src/devices/machine/spi_sdcard.h87
-rw-r--r--src/devices/machine/spifi3.cpp1876
-rw-r--r--src/devices/machine/spifi3.h304
-rw-r--r--src/devices/machine/steppers.cpp544
-rw-r--r--src/devices/machine/steppers.h159
-rw-r--r--src/devices/machine/strata.cpp670
-rw-r--r--src/devices/machine/strata.h74
-rw-r--r--src/devices/machine/sun1_mmu.cpp333
-rw-r--r--src/devices/machine/sun1_mmu.h73
-rw-r--r--src/devices/machine/sun4c_mmu.cpp704
-rw-r--r--src/devices/machine/sun4c_mmu.h214
-rw-r--r--src/devices/machine/swim1.cpp1238
-rw-r--r--src/devices/machine/swim1.h145
-rw-r--r--src/devices/machine/swim2.cpp565
-rw-r--r--src/devices/machine/swim2.h78
-rw-r--r--src/devices/machine/swim3.cpp730
-rw-r--r--src/devices/machine/swim3.h124
-rw-r--r--src/devices/machine/swtpc8212.cpp565
-rw-r--r--src/devices/machine/swtpc8212.h96
-rw-r--r--src/devices/machine/t10mmc.cpp1683
-rw-r--r--src/devices/machine/t10mmc.h103
-rw-r--r--src/devices/machine/t10sbc.cpp379
-rw-r--r--src/devices/machine/t10sbc.h98
-rw-r--r--src/devices/machine/t10spc.cpp155
-rw-r--r--src/devices/machine/t10spc.h143
-rw-r--r--src/devices/machine/tc009xlvc.cpp451
-rw-r--r--src/devices/machine/tc009xlvc.h135
-rw-r--r--src/devices/machine/tc9223.cpp75
-rw-r--r--src/devices/machine/tc9223.h30
-rw-r--r--src/devices/machine/tdc1008.cpp283
-rw-r--r--src/devices/machine/tdc1008.h111
-rw-r--r--src/devices/machine/te7750.cpp371
-rw-r--r--src/devices/machine/te7750.h97
-rw-r--r--src/devices/machine/te7774.cpp233
-rwxr-xr-xsrc/devices/machine/te7774.h89
-rw-r--r--src/devices/machine/terminal.cpp441
-rw-r--r--src/devices/machine/terminal.h74
-rw-r--r--src/devices/machine/thmfc1.cpp440
-rw-r--r--src/devices/machine/thmfc1.h106
-rw-r--r--src/devices/machine/ticket.cpp192
-rw-r--r--src/devices/machine/ticket.h85
-rw-r--r--src/devices/machine/timehelp.h58
-rw-r--r--src/devices/machine/timekpr.cpp497
-rw-r--r--src/devices/machine/timekpr.h158
-rw-r--r--src/devices/machine/timer.cpp185
-rw-r--r--src/devices/machine/timer.h151
-rw-r--r--src/devices/machine/tmc0430.cpp363
-rw-r--r--src/devices/machine/tmc0430.h111
-rw-r--r--src/devices/machine/tmc0999.cpp97
-rw-r--r--src/devices/machine/tmc0999.h57
-rw-r--r--src/devices/machine/tmc208k.cpp178
-rw-r--r--src/devices/machine/tmc208k.h102
-rw-r--r--src/devices/machine/tms1024.cpp123
-rw-r--r--src/devices/machine/tms1024.h114
-rw-r--r--src/devices/machine/tms5501.cpp512
-rw-r--r--src/devices/machine/tms5501.h176
-rw-r--r--src/devices/machine/tms6100.cpp259
-rw-r--r--src/devices/machine/tms6100.h145
-rw-r--r--src/devices/machine/tms9901.cpp644
-rw-r--r--src/devices/machine/tms9901.h176
-rw-r--r--src/devices/machine/tms9902.cpp956
-rw-r--r--src/devices/machine/tms9902.h192
-rw-r--r--src/devices/machine/tms9914.cpp1630
-rw-r--r--src/devices/machine/tms9914.h278
-rw-r--r--src/devices/machine/tsb12lv01a.cpp275
-rw-r--r--src/devices/machine/tsb12lv01a.h195
-rw-r--r--src/devices/machine/tube.cpp346
-rw-r--r--src/devices/machine/tube.h76
-rw-r--r--src/devices/machine/ucb1200.cpp370
-rw-r--r--src/devices/machine/ucb1200.h147
-rw-r--r--src/devices/machine/um8498f.cpp496
-rw-r--r--src/devices/machine/um8498f.h245
-rw-r--r--src/devices/machine/upc82c710.cpp411
-rw-r--r--src/devices/machine/upc82c710.h109
-rw-r--r--src/devices/machine/upc82c711.cpp466
-rw-r--r--src/devices/machine/upc82c711.h127
-rw-r--r--src/devices/machine/upd1990a.cpp484
-rw-r--r--src/devices/machine/upd1990a.h138
-rw-r--r--src/devices/machine/upd4701.cpp407
-rw-r--r--src/devices/machine/upd4701.h111
-rw-r--r--src/devices/machine/upd4991a.cpp135
-rw-r--r--src/devices/machine/upd4991a.h52
-rw-r--r--src/devices/machine/upd4992.cpp142
-rw-r--r--src/devices/machine/upd4992.h50
-rw-r--r--src/devices/machine/upd7001.cpp193
-rw-r--r--src/devices/machine/upd7001.h101
-rw-r--r--src/devices/machine/upd7002.cpp163
-rw-r--r--src/devices/machine/upd7002.h74
-rw-r--r--src/devices/machine/upd7004.cpp164
-rw-r--r--src/devices/machine/upd7004.h81
-rw-r--r--src/devices/machine/upd71071.cpp490
-rw-r--r--src/devices/machine/upd71071.h79
-rw-r--r--src/devices/machine/upd7261.cpp733
-rw-r--r--src/devices/machine/upd7261.h104
-rw-r--r--src/devices/machine/upd765.cpp3605
-rw-r--r--src/devices/machine/upd765.h643
-rw-r--r--src/devices/machine/v3021.cpp345
-rw-r--r--src/devices/machine/v3021.h89
-rw-r--r--src/devices/machine/vic_pl192.cpp402
-rw-r--r--src/devices/machine/vic_pl192.h126
-rw-r--r--src/devices/machine/vl82c420.cpp595
-rw-r--r--src/devices/machine/vl82c420.h250
-rw-r--r--src/devices/machine/votraxtnt.cpp158
-rw-r--r--src/devices/machine/votraxtnt.h55
-rw-r--r--src/devices/machine/vr0uart.cpp221
-rw-r--r--src/devices/machine/vrc4373.cpp538
-rw-r--r--src/devices/machine/vrc4373.h105
-rw-r--r--src/devices/machine/vrc5074.cpp1023
-rw-r--r--src/devices/machine/vrc5074.h121
-rw-r--r--src/devices/machine/vrender0.cpp745
-rw-r--r--src/devices/machine/vrender0.h205
-rw-r--r--src/devices/machine/vt8231_isa.cpp226
-rw-r--r--src/devices/machine/vt8231_isa.h84
-rw-r--r--src/devices/machine/vt82c496.cpp239
-rw-r--r--src/devices/machine/vt82c496.h72
-rw-r--r--src/devices/machine/vt82c586b_acpi.cpp1041
-rw-r--r--src/devices/machine/vt82c586b_acpi.h195
-rw-r--r--src/devices/machine/vt82c586b_ide.cpp399
-rw-r--r--src/devices/machine/vt82c586b_ide.h87
-rw-r--r--src/devices/machine/vt82c586b_isa.cpp996
-rw-r--r--src/devices/machine/vt82c586b_isa.h227
-rw-r--r--src/devices/machine/vt82c586b_usb.cpp109
-rw-r--r--src/devices/machine/vt82c586b_usb.h34
-rw-r--r--src/devices/machine/vt82c598mvp.cpp620
-rw-r--r--src/devices/machine/vt82c598mvp.h164
-rw-r--r--src/devices/machine/vt83c461.cpp98
-rw-r--r--src/devices/machine/vt83c461.h60
-rw-r--r--src/devices/machine/w83787f.cpp345
-rw-r--r--src/devices/machine/w83787f.h95
-rw-r--r--src/devices/machine/w83877tf.cpp923
-rw-r--r--src/devices/machine/w83877tf.h167
-rw-r--r--src/devices/machine/w83977tf.cpp804
-rw-r--r--src/devices/machine/w83977tf.h148
-rw-r--r--src/devices/machine/watchdog.cpp242
-rw-r--r--src/devices/machine/watchdog.h76
-rw-r--r--src/devices/machine/wd1000.cpp631
-rw-r--r--src/devices/machine/wd1000.h138
-rw-r--r--src/devices/machine/wd1010.cpp663
-rw-r--r--src/devices/machine/wd1010.h161
-rw-r--r--src/devices/machine/wd11c00_17.cpp471
-rw-r--r--src/devices/machine/wd11c00_17.h102
-rw-r--r--src/devices/machine/wd2010.cpp968
-rw-r--r--src/devices/machine/wd2010.h109
-rw-r--r--src/devices/machine/wd33c9x.cpp1785
-rw-r--r--src/devices/machine/wd33c9x.h164
-rw-r--r--src/devices/machine/wd7600.cpp550
-rw-r--r--src/devices/machine/wd7600.h201
-rw-r--r--src/devices/machine/wd_fdc.cpp3138
-rw-r--r--src/devices/machine/wd_fdc.h613
-rw-r--r--src/devices/machine/wozfdc.cpp516
-rw-r--r--src/devices/machine/wozfdc.h114
-rw-r--r--src/devices/machine/wtl3132.cpp534
-rw-r--r--src/devices/machine/wtl3132.h184
-rw-r--r--src/devices/machine/x2201.cpp186
-rw-r--r--src/devices/machine/x2201.h74
-rw-r--r--src/devices/machine/x2212.cpp189
-rw-r--r--src/devices/machine/x2212.h95
-rw-r--r--src/devices/machine/x28.cpp23
-rw-r--r--src/devices/machine/x28.h65
-rw-r--r--src/devices/machine/x76f041.cpp807
-rw-r--r--src/devices/machine/x76f041.h151
-rw-r--r--src/devices/machine/x76f100.cpp545
-rw-r--r--src/devices/machine/x76f100.h90
-rw-r--r--src/devices/machine/xc1700e.cpp89
-rw-r--r--src/devices/machine/xc1700e.h118
-rw-r--r--src/devices/machine/ym2148.cpp213
-rw-r--r--src/devices/machine/ym2148.h83
-rw-r--r--src/devices/machine/ym3802.cpp292
-rw-r--r--src/devices/machine/ym3802.h160
-rw-r--r--src/devices/machine/z8038.cpp691
-rw-r--r--src/devices/machine/z8038.h229
-rw-r--r--src/devices/machine/z80ctc.cpp540
-rw-r--r--src/devices/machine/z80ctc.h135
-rw-r--r--src/devices/machine/z80daisy.cpp271
-rw-r--r--src/devices/machine/z80daisy.h105
-rw-r--r--src/devices/machine/z80daisy_generic.cpp104
-rw-r--r--src/devices/machine/z80daisy_generic.h58
-rw-r--r--src/devices/machine/z80dma.cpp947
-rw-r--r--src/devices/machine/z80dma.h203
-rw-r--r--src/devices/machine/z80pio.cpp819
-rw-r--r--src/devices/machine/z80pio.h232
-rw-r--r--src/devices/machine/z80scc.cpp3050
-rw-r--r--src/devices/machine/z80scc.h522
-rw-r--r--src/devices/machine/z80sio.cpp3027
-rw-r--r--src/devices/machine/z80sio.h645
-rw-r--r--src/devices/machine/z80sti.cpp696
-rw-r--r--src/devices/machine/z80sti.h216
-rw-r--r--src/devices/machine/z8536.cpp1276
-rw-r--r--src/devices/machine/z8536.h483
-rw-r--r--src/devices/machine/zfmicro_usb.cpp100
-rw-r--r--src/devices/machine/zfmicro_usb.h39
-rw-r--r--src/devices/sound/315-5641.cpp123
-rw-r--r--src/devices/sound/315-5641.h46
-rw-r--r--src/devices/sound/ac97_stac9704.cpp335
-rw-r--r--src/devices/sound/ac97_stac9704.h54
-rw-r--r--src/devices/sound/ad1848.cpp219
-rw-r--r--src/devices/sound/ad1848.h69
-rw-r--r--src/devices/sound/adc.cpp106
-rw-r--r--src/devices/sound/adc.h59
-rw-r--r--src/devices/sound/aica.cpp1716
-rw-r--r--src/devices/sound/aica.h199
-rw-r--r--src/devices/sound/aicadsp.cpp348
-rw-r--r--src/devices/sound/aicadsp.h42
-rw-r--r--src/devices/sound/ap2010pcm.cpp224
-rw-r--r--src/devices/sound/ap2010pcm.h65
-rw-r--r--src/devices/sound/asc.cpp1771
-rw-r--r--src/devices/sound/asc.h230
-rw-r--r--src/devices/sound/astrocde.cpp310
-rw-r--r--src/devices/sound/astrocde.h97
-rw-r--r--src/devices/sound/awacs.cpp337
-rw-r--r--src/devices/sound/awacs.h74
-rw-r--r--src/devices/sound/ay8910.cpp1689
-rw-r--r--src/devices/sound/ay8910.h415
-rw-r--r--src/devices/sound/bbd.cpp127
-rw-r--r--src/devices/sound/bbd.h97
-rw-r--r--src/devices/sound/beep.cpp110
-rw-r--r--src/devices/sound/beep.h43
-rw-r--r--src/devices/sound/bsmt2000.cpp336
-rw-r--r--src/devices/sound/bsmt2000.h99
-rw-r--r--src/devices/sound/c140.cpp675
-rw-r--r--src/devices/sound/c140.h137
-rw-r--r--src/devices/sound/c352.cpp409
-rw-r--r--src/devices/sound/c352.h116
-rw-r--r--src/devices/sound/c6280.cpp372
-rw-r--r--src/devices/sound/c6280.h55
-rw-r--r--src/devices/sound/cdda.cpp314
-rw-r--r--src/devices/sound/cdda.h65
-rw-r--r--src/devices/sound/cdp1863.cpp165
-rw-r--r--src/devices/sound/cdp1863.h76
-rw-r--r--src/devices/sound/cdp1864.cpp470
-rw-r--r--src/devices/sound/cdp1864.h168
-rw-r--r--src/devices/sound/cdp1869.cpp990
-rw-r--r--src/devices/sound/cdp1869.h286
-rw-r--r--src/devices/sound/cem3310.cpp188
-rw-r--r--src/devices/sound/cem3310.h77
-rw-r--r--src/devices/sound/cem3320.cpp141
-rw-r--r--src/devices/sound/cem3320.h68
-rw-r--r--src/devices/sound/cem3340.cpp265
-rw-r--r--src/devices/sound/cem3340.h74
-rw-r--r--src/devices/sound/cem3360.cpp19
-rw-r--r--src/devices/sound/cem3360.h37
-rw-r--r--src/devices/sound/cem3394.cpp559
-rw-r--r--src/devices/sound/cem3394.h108
-rw-r--r--src/devices/sound/cf61909.cpp161
-rw-r--r--src/devices/sound/cf61909.h63
-rw-r--r--src/devices/sound/ct1745.cpp335
-rw-r--r--src/devices/sound/ct1745.h69
-rw-r--r--src/devices/sound/dac.cpp137
-rw-r--r--src/devices/sound/dac.h249
-rw-r--r--src/devices/sound/dac3350a.cpp332
-rw-r--r--src/devices/sound/dac3350a.h46
-rw-r--r--src/devices/sound/dac76.cpp128
-rw-r--r--src/devices/sound/dac76.h117
-rw-r--r--src/devices/sound/digitalk.cpp686
-rw-r--r--src/devices/sound/digitalk.h88
-rw-r--r--src/devices/sound/disc_cls.h260
-rw-r--r--src/devices/sound/disc_dev.h129
-rw-r--r--src/devices/sound/disc_dev.hxx1783
-rw-r--r--src/devices/sound/disc_flt.h180
-rw-r--r--src/devices/sound/disc_flt.hxx1499
-rw-r--r--src/devices/sound/disc_inp.hxx290
-rw-r--r--src/devices/sound/disc_mth.h239
-rw-r--r--src/devices/sound/disc_mth.hxx2775
-rw-r--r--src/devices/sound/disc_sys.hxx120
-rw-r--r--src/devices/sound/disc_wav.h193
-rw-r--r--src/devices/sound/disc_wav.hxx1787
-rw-r--r--src/devices/sound/discrete.cpp1115
-rw-r--r--src/devices/sound/discrete.h4641
-rw-r--r--src/devices/sound/dmadac.cpp196
-rw-r--r--src/devices/sound/dmadac.h84
-rw-r--r--src/devices/sound/dspv.cpp184
-rw-r--r--src/devices/sound/dspv.h72
-rw-r--r--src/devices/sound/dspvd.cpp29
-rw-r--r--src/devices/sound/dspvd.h24
-rw-r--r--src/devices/sound/es1373.cpp568
-rw-r--r--src/devices/sound/es1373.h73
-rw-r--r--src/devices/sound/es5503.cpp510
-rw-r--r--src/devices/sound/es5503.h97
-rw-r--r--src/devices/sound/es5506.cpp2134
-rw-r--r--src/devices/sound/es5506.h265
-rw-r--r--src/devices/sound/es8712.cpp235
-rw-r--r--src/devices/sound/es8712.h66
-rw-r--r--src/devices/sound/esqpump.cpp153
-rw-r--r--src/devices/sound/esqpump.h111
-rw-r--r--src/devices/sound/flt_biquad.cpp790
-rw-r--r--src/devices/sound/flt_biquad.h122
-rw-r--r--src/devices/sound/flt_rc.cpp135
-rw-r--r--src/devices/sound/flt_rc.h132
-rw-r--r--src/devices/sound/flt_vol.cpp52
-rw-r--r--src/devices/sound/flt_vol.h37
-rw-r--r--src/devices/sound/fz_pcm.cpp427
-rw-r--r--src/devices/sound/fz_pcm.h113
-rw-r--r--src/devices/sound/gaelco.cpp345
-rw-r--r--src/devices/sound/gaelco.h90
-rw-r--r--src/devices/sound/gb.cpp1348
-rw-r--r--src/devices/sound/gb.h218
-rw-r--r--src/devices/sound/gew.cpp641
-rw-r--r--src/devices/sound/gew.h160
-rw-r--r--src/devices/sound/gew7.cpp206
-rw-r--r--src/devices/sound/gew7.h30
-rw-r--r--src/devices/sound/gt155.cpp407
-rw-r--r--src/devices/sound/gt155.h103
-rw-r--r--src/devices/sound/hc55516.cpp548
-rw-r--r--src/devices/sound/hc55516.h216
-rw-r--r--src/devices/sound/huc6230.cpp213
-rw-r--r--src/devices/sound/huc6230.h64
-rw-r--r--src/devices/sound/i5000.cpp305
-rw-r--r--src/devices/sound/i5000.h77
-rw-r--r--src/devices/sound/ics2115.cpp1105
-rw-r--r--src/devices/sound/ics2115.h165
-rw-r--r--src/devices/sound/imaadpcm.cpp133
-rw-r--r--src/devices/sound/imaadpcm.h45
-rw-r--r--src/devices/sound/iopspu.cpp237
-rw-r--r--src/devices/sound/iopspu.h101
-rw-r--r--src/devices/sound/iremga20.cpp226
-rw-r--r--src/devices/sound/iremga20.h62
-rw-r--r--src/devices/sound/k005289.cpp151
-rw-r--r--src/devices/sound/k005289.h59
-rw-r--r--src/devices/sound/k007232.cpp266
-rw-r--r--src/devices/sound/k007232.h78
-rw-r--r--src/devices/sound/k051649.cpp283
-rw-r--r--src/devices/sound/k051649.h76
-rw-r--r--src/devices/sound/k053260.cpp549
-rw-r--r--src/devices/sound/k053260.h120
-rw-r--r--src/devices/sound/k054321.cpp134
-rw-r--r--src/devices/sound/k054321.h52
-rw-r--r--src/devices/sound/k054539.cpp555
-rw-r--r--src/devices/sound/k054539.h114
-rw-r--r--src/devices/sound/k056800.cpp179
-rw-r--r--src/devices/sound/k056800.h48
-rw-r--r--src/devices/sound/ks0164.cpp543
-rw-r--r--src/devices/sound/ks0164.h117
-rw-r--r--src/devices/sound/l4003.cpp383
-rw-r--r--src/devices/sound/l4003.h65
-rw-r--r--src/devices/sound/l7a1045_l6028_dsp_a.cpp657
-rw-r--r--src/devices/sound/l7a1045_l6028_dsp_a.h113
-rw-r--r--src/devices/sound/lc7535.cpp143
-rw-r--r--src/devices/sound/lc7535.h75
-rw-r--r--src/devices/sound/lc78836m.cpp205
-rw-r--r--src/devices/sound/lc78836m.h66
-rw-r--r--src/devices/sound/lc82310.cpp323
-rw-r--r--src/devices/sound/lc82310.h94
-rw-r--r--src/devices/sound/lmc1992.cpp233
-rw-r--r--src/devices/sound/lmc1992.h100
-rw-r--r--src/devices/sound/lynx.cpp526
-rw-r--r--src/devices/sound/lynx.h95
-rw-r--r--src/devices/sound/mas3507d.cpp502
-rw-r--r--src/devices/sound/mas3507d.h98
-rw-r--r--src/devices/sound/mb87077.cpp191
-rw-r--r--src/devices/sound/mb87077.h60
-rw-r--r--src/devices/sound/mea8000.cpp576
-rw-r--r--src/devices/sound/mea8000.h125
-rw-r--r--src/devices/sound/meg.cpp229
-rw-r--r--src/devices/sound/meg.h71
-rw-r--r--src/devices/sound/mixer.cpp30
-rw-r--r--src/devices/sound/mixer.h27
-rw-r--r--src/devices/sound/mm5837.cpp116
-rw-r--r--src/devices/sound/mm5837.h213
-rw-r--r--src/devices/sound/mmc5.cpp314
-rw-r--r--src/devices/sound/mmc5.h75
-rw-r--r--src/devices/sound/mos6560.cpp939
-rw-r--r--src/devices/sound/mos6560.h205
-rw-r--r--src/devices/sound/mos6581.cpp278
-rw-r--r--src/devices/sound/mos6581.h96
-rw-r--r--src/devices/sound/mos7360.cpp1196
-rw-r--r--src/devices/sound/mos7360.h190
-rw-r--r--src/devices/sound/mp3_audio.cpp90
-rw-r--r--src/devices/sound/mp3_audio.h37
-rw-r--r--src/devices/sound/mpeg_audio.cpp774
-rw-r--r--src/devices/sound/mpeg_audio.h130
-rw-r--r--src/devices/sound/msm5205.cpp370
-rw-r--r--src/devices/sound/msm5205.h111
-rw-r--r--src/devices/sound/msm5232.cpp766
-rw-r--r--src/devices/sound/msm5232.h101
-rw-r--r--src/devices/sound/multipcm.cpp185
-rw-r--r--src/devices/sound/multipcm.h32
-rw-r--r--src/devices/sound/n63701x.cpp151
-rw-r--r--src/devices/sound/n63701x.h50
-rw-r--r--src/devices/sound/namco.cpp768
-rw-r--r--src/devices/sound/namco.h170
-rw-r--r--src/devices/sound/namco_163.cpp180
-rw-r--r--src/devices/sound/namco_163.h42
-rw-r--r--src/devices/sound/nes_apu.cpp787
-rw-r--r--src/devices/sound/nes_apu.h111
-rw-r--r--src/devices/sound/nes_apu_vt.cpp28
-rw-r--r--src/devices/sound/nes_apu_vt.h26
-rw-r--r--src/devices/sound/nes_defs.h250
-rw-r--r--src/devices/sound/nn71003f.cpp86
-rw-r--r--src/devices/sound/nn71003f.h42
-rw-r--r--src/devices/sound/okiadpcm.cpp260
-rw-r--r--src/devices/sound/okiadpcm.h76
-rw-r--r--src/devices/sound/okim6258.cpp308
-rw-r--r--src/devices/sound/okim6258.h72
-rw-r--r--src/devices/sound/okim6295.cpp361
-rw-r--r--src/devices/sound/okim6295.h102
-rw-r--r--src/devices/sound/okim6376.cpp610
-rw-r--r--src/devices/sound/okim6376.h99
-rw-r--r--src/devices/sound/okim6588.cpp232
-rw-r--r--src/devices/sound/okim6588.h88
-rw-r--r--src/devices/sound/okim9810.cpp857
-rw-r--r--src/devices/sound/okim9810.h180
-rw-r--r--src/devices/sound/pcd3311.cpp315
-rw-r--r--src/devices/sound/pcd3311.h86
-rw-r--r--src/devices/sound/pci-ac97.cpp41
-rw-r--r--src/devices/sound/pci-ac97.h32
-rw-r--r--src/devices/sound/pokey.cpp1465
-rw-r--r--src/devices/sound/pokey.h332
-rw-r--r--src/devices/sound/pokey.txt (renamed from src/emu/sound/pokey.txt)138
-rw-r--r--src/devices/sound/qs1000.cpp593
-rw-r--r--src/devices/sound/qs1000.h133
-rw-r--r--src/devices/sound/qsound.cpp395
-rw-r--r--src/devices/sound/qsound.h79
-rw-r--r--src/devices/sound/qsoundhle.cpp633
-rw-r--r--src/devices/sound/qsoundhle.h177
-rw-r--r--src/devices/sound/rf5c400.cpp662
-rw-r--r--src/devices/sound/rf5c400.h104
-rw-r--r--src/devices/sound/rf5c68.cpp293
-rw-r--r--src/devices/sound/rf5c68.h95
-rw-r--r--src/devices/sound/roland_gp.cpp78
-rw-r--r--src/devices/sound/roland_gp.h86
-rw-r--r--src/devices/sound/roland_lp.cpp381
-rw-r--r--src/devices/sound/roland_lp.h69
-rw-r--r--src/devices/sound/roland_sa.cpp404
-rw-r--r--src/devices/sound/roland_sa.h59
-rw-r--r--src/devices/sound/rp2c33_snd.cpp361
-rw-r--r--src/devices/sound/rp2c33_snd.h98
-rw-r--r--src/devices/sound/s14001a.cpp565
-rw-r--r--src/devices/sound/s14001a.h111
-rw-r--r--src/devices/sound/s_dsp.cpp995
-rw-r--r--src/devices/sound/s_dsp.h116
-rw-r--r--src/devices/sound/saa1099.cpp447
-rw-r--r--src/devices/sound/saa1099.h84
-rw-r--r--src/devices/sound/samples.cpp637
-rw-r--r--src/devices/sound/samples.h165
-rw-r--r--src/devices/sound/sb0400.cpp26
-rw-r--r--src/devices/sound/sb0400.h29
-rw-r--r--src/devices/sound/scsp.cpp1613
-rw-r--r--src/devices/sound/scsp.h198
-rw-r--r--src/devices/sound/scspdsp.cpp305
-rw-r--r--src/devices/sound/scspdsp.h41
-rw-r--r--src/devices/sound/segapcm.cpp157
-rw-r--r--src/devices/sound/segapcm.h59
-rw-r--r--src/devices/sound/setapcm.cpp427
-rw-r--r--src/devices/sound/setapcm.h103
-rw-r--r--src/devices/sound/sid.cpp313
-rw-r--r--src/devices/sound/sid.h72
-rw-r--r--src/devices/sound/side6581.h128
-rw-r--r--src/devices/sound/sidenvel.cpp589
-rw-r--r--src/devices/sound/sidenvel.h41
-rw-r--r--src/devices/sound/sidvoice.cpp811
-rw-r--r--src/devices/sound/sidvoice.h119
-rw-r--r--src/devices/sound/sidw6581.h1055
-rw-r--r--src/devices/sound/sidw8580.h (renamed from src/emu/sound/sidw8580.h)19
-rw-r--r--src/devices/sound/sn76477.cpp2056
-rw-r--r--src/devices/sound/sn76477.h265
-rw-r--r--src/devices/sound/sn76496.cpp480
-rw-r--r--src/devices/sound/sn76496.h156
-rw-r--r--src/devices/sound/snkwave.cpp142
-rw-r--r--src/devices/sound/snkwave.h52
-rw-r--r--src/devices/sound/sp0250.cpp306
-rw-r--r--src/devices/sound/sp0250.h80
-rw-r--r--src/devices/sound/sp0256.cpp1331
-rw-r--r--src/devices/sound/sp0256.h131
-rw-r--r--src/devices/sound/spkrdev.cpp397
-rw-r--r--src/devices/sound/spkrdev.h85
-rw-r--r--src/devices/sound/spu.cpp3076
-rw-r--r--src/devices/sound/spu.h240
-rw-r--r--src/devices/sound/spu_tables.cpp694
-rw-r--r--src/devices/sound/spureverb.cpp329
-rw-r--r--src/devices/sound/spureverb.h86
-rw-r--r--src/devices/sound/ssi263hle.cpp230
-rw-r--r--src/devices/sound/ssi263hle.h76
-rw-r--r--src/devices/sound/st0016.cpp248
-rw-r--r--src/devices/sound/st0016.h68
-rw-r--r--src/devices/sound/stt_sa1.cpp187
-rw-r--r--src/devices/sound/stt_sa1.h57
-rw-r--r--src/devices/sound/swp00.cpp2391
-rw-r--r--src/devices/sound/swp00.h360
-rw-r--r--src/devices/sound/swp20.cpp226
-rw-r--r--src/devices/sound/swp20.h75
-rw-r--r--src/devices/sound/swp30.cpp4011
-rw-r--r--src/devices/sound/swp30.h494
-rw-r--r--src/devices/sound/swx00.cpp721
-rw-r--r--src/devices/sound/swx00.h126
-rw-r--r--src/devices/sound/t6721a.cpp102
-rw-r--r--src/devices/sound/t6721a.h99
-rw-r--r--src/devices/sound/t6w28.cpp350
-rw-r--r--src/devices/sound/t6w28.h45
-rw-r--r--src/devices/sound/ta7630.cpp85
-rw-r--r--src/devices/sound/ta7630.h43
-rw-r--r--src/devices/sound/tc8830f.cpp257
-rw-r--r--src/devices/sound/tc8830f.h59
-rw-r--r--src/devices/sound/tiaintf.cpp65
-rw-r--r--src/devices/sound/tiaintf.h36
-rw-r--r--src/devices/sound/tiasound.cpp590
-rw-r--r--src/devices/sound/tiasound.h (renamed from src/emu/sound/tiasound.h)17
-rw-r--r--src/devices/sound/tms3615.cpp103
-rw-r--r--src/devices/sound/tms3615.h49
-rw-r--r--src/devices/sound/tms3631.cpp103
-rw-r--r--src/devices/sound/tms3631.h48
-rw-r--r--src/devices/sound/tms36xx.cpp552
-rw-r--r--src/devices/sound/tms36xx.h115
-rw-r--r--src/devices/sound/tms5110.cpp1456
-rw-r--r--src/devices/sound/tms5110.h313
-rw-r--r--src/devices/sound/tms5110r.hxx713
-rw-r--r--src/devices/sound/tms5220.cpp2221
-rw-r--r--src/devices/sound/tms5220.h283
-rw-r--r--src/devices/sound/tms5220.txt (renamed from src/emu/sound/tms5220.txt)0
-rw-r--r--src/devices/sound/tt5665.cpp427
-rw-r--r--src/devices/sound/tt5665.h116
-rw-r--r--src/devices/sound/uda1344.cpp284
-rw-r--r--src/devices/sound/uda1344.h104
-rw-r--r--src/devices/sound/upd65043gfu01.cpp249
-rw-r--r--src/devices/sound/upd65043gfu01.h56
-rw-r--r--src/devices/sound/upd7752.cpp205
-rw-r--r--src/devices/sound/upd7752.h52
-rw-r--r--src/devices/sound/upd7759.cpp730
-rw-r--r--src/devices/sound/upd7759.h162
-rw-r--r--src/devices/sound/upd931.cpp608
-rw-r--r--src/devices/sound/upd931.h154
-rw-r--r--src/devices/sound/upd933.cpp636
-rw-r--r--src/devices/sound/upd933.h103
-rw-r--r--src/devices/sound/upd934g.cpp161
-rw-r--r--src/devices/sound/upd934g.h60
-rw-r--r--src/devices/sound/va_eg.cpp362
-rw-r--r--src/devices/sound/va_eg.h192
-rw-r--r--src/devices/sound/va_ops.cpp133
-rw-r--r--src/devices/sound/va_ops.h119
-rw-r--r--src/devices/sound/va_vca.cpp328
-rw-r--r--src/devices/sound/va_vca.h241
-rw-r--r--src/devices/sound/va_vcf.cpp308
-rw-r--r--src/devices/sound/va_vcf.h107
-rw-r--r--src/devices/sound/vgm_visualizer.cpp766
-rw-r--r--src/devices/sound/vgm_visualizer.h140
-rw-r--r--src/devices/sound/vlm5030.cpp635
-rw-r--r--src/devices/sound/vlm5030.h98
-rw-r--r--src/devices/sound/votrax.cpp1039
-rw-r--r--src/devices/sound/votrax.h201
-rw-r--r--src/devices/sound/vrc6.cpp320
-rw-r--r--src/devices/sound/vrc6.h50
-rw-r--r--src/devices/sound/vrender0.cpp597
-rw-r--r--src/devices/sound/vrender0.h155
-rw-r--r--src/devices/sound/x1_010.cpp291
-rw-r--r--src/devices/sound/x1_010.h53
-rw-r--r--src/devices/sound/xt446.cpp97
-rw-r--r--src/devices/sound/xt446.h43
-rw-r--r--src/devices/sound/ym2151.txt (renamed from src/emu/sound/ym2151.txt)0
-rw-r--r--src/devices/sound/ym2154.cpp307
-rw-r--r--src/devices/sound/ym2154.h100
-rw-r--r--src/devices/sound/ymf271.cpp1808
-rw-r--r--src/devices/sound/ymf271.h160
-rw-r--r--src/devices/sound/ymfm_mame.h314
-rw-r--r--src/devices/sound/ymopl.cpp373
-rw-r--r--src/devices/sound/ymopl.h208
-rw-r--r--src/devices/sound/ymopm.cpp81
-rw-r--r--src/devices/sound/ymopm.h56
-rw-r--r--src/devices/sound/ymopn.cpp300
-rw-r--r--src/devices/sound/ymopn.h196
-rw-r--r--src/devices/sound/ymopq.cpp38
-rw-r--r--src/devices/sound/ymopq.h36
-rw-r--r--src/devices/sound/ymopz.cpp22
-rw-r--r--src/devices/sound/ymopz.h29
-rw-r--r--src/devices/sound/ymz280b.cpp924
-rw-r--r--src/devices/sound/ymz280b.h117
-rw-r--r--src/devices/sound/ymz770.cpp838
-rw-r--r--src/devices/sound/ymz770.h149
-rw-r--r--src/devices/sound/zsg2.cpp657
-rw-r--r--src/devices/sound/zsg2.h96
-rw-r--r--src/devices/video/315_5124.cpp2138
-rw-r--r--src/devices/video/315_5124.h281
-rw-r--r--src/devices/video/315_5313.cpp2410
-rw-r--r--src/devices/video/315_5313.h258
-rw-r--r--src/devices/video/82c425.cpp469
-rw-r--r--src/devices/video/82c425.h109
-rw-r--r--src/devices/video/am8052.cpp160
-rw-r--r--src/devices/video/am8052.h42
-rw-r--r--src/devices/video/ariel.cpp177
-rw-r--r--src/devices/video/ariel.h46
-rw-r--r--src/devices/video/ati_mach32.cpp449
-rw-r--r--src/devices/video/ati_mach32.h246
-rw-r--r--src/devices/video/ati_mach8.cpp337
-rw-r--r--src/devices/video/ati_mach8.h85
-rw-r--r--src/devices/video/atirage.cpp609
-rw-r--r--src/devices/video/atirage.h117
-rw-r--r--src/devices/video/avgdvg.cpp1504
-rw-r--r--src/devices/video/avgdvg.h293
-rw-r--r--src/devices/video/bt431.cpp281
-rw-r--r--src/devices/video/bt431.h97
-rw-r--r--src/devices/video/bt450.cpp99
-rw-r--r--src/devices/video/bt450.h37
-rw-r--r--src/devices/video/bt459.cpp755
-rw-r--r--src/devices/video/bt459.h256
-rw-r--r--src/devices/video/bt45x.cpp462
-rw-r--r--src/devices/video/bt45x.h197
-rw-r--r--src/devices/video/bt47x.cpp391
-rw-r--r--src/devices/video/bt47x.h161
-rw-r--r--src/devices/video/bt48x.cpp513
-rw-r--r--src/devices/video/bt48x.h115
-rw-r--r--src/devices/video/bufsprite.cpp75
-rw-r--r--src/devices/video/bufsprite.h122
-rw-r--r--src/devices/video/catseye.cpp1265
-rw-r--r--src/devices/video/catseye.h371
-rw-r--r--src/devices/video/cdp1861.cpp294
-rw-r--r--src/devices/video/cdp1861.h109
-rw-r--r--src/devices/video/cdp1862.cpp195
-rw-r--r--src/devices/video/cdp1862.h91
-rw-r--r--src/devices/video/cesblit.cpp297
-rw-r--r--src/devices/video/cesblit.h76
-rw-r--r--src/devices/video/cgapal.cpp434
-rw-r--r--src/devices/video/cgapal.h11
-rw-r--r--src/devices/video/crt9007.cpp962
-rw-r--r--src/devices/video/crt9007.h175
-rw-r--r--src/devices/video/crt9021.cpp189
-rw-r--r--src/devices/video/crt9021.h130
-rw-r--r--src/devices/video/crt9028.cpp359
-rw-r--r--src/devices/video/crt9028.h141
-rw-r--r--src/devices/video/crt9212.cpp186
-rw-r--r--src/devices/video/crt9212.h95
-rw-r--r--src/devices/video/crtc_ega.cpp722
-rw-r--r--src/devices/video/crtc_ega.h197
-rw-r--r--src/devices/video/dl1416.cpp345
-rw-r--r--src/devices/video/dl1416.h107
-rw-r--r--src/devices/video/dm9368.cpp94
-rw-r--r--src/devices/video/dm9368.h68
-rw-r--r--src/devices/video/dp8350.cpp534
-rw-r--r--src/devices/video/dp8350.h186
-rw-r--r--src/devices/video/dp8510.cpp211
-rw-r--r--src/devices/video/dp8510.h87
-rw-r--r--src/devices/video/ds8874.cpp86
-rw-r--r--src/devices/video/ds8874.h61
-rw-r--r--src/devices/video/ef9340_1.cpp498
-rw-r--r--src/devices/video/ef9340_1.h119
-rw-r--r--src/devices/video/ef9345.cpp1202
-rw-r--r--src/devices/video/ef9345.h163
-rw-r--r--src/devices/video/ef9364.cpp337
-rw-r--r--src/devices/video/ef9364.h107
-rw-r--r--src/devices/video/ef9365.cpp1291
-rw-r--r--src/devices/video/ef9365.h133
-rw-r--r--src/devices/video/ef9369.cpp108
-rw-r--r--src/devices/video/ef9369.h74
-rw-r--r--src/devices/video/fixfreq.cpp681
-rw-r--r--src/devices/video/fixfreq.h369
-rw-r--r--src/devices/video/gb_lcd.cpp3899
-rw-r--r--src/devices/video/gb_lcd.h319
-rw-r--r--src/devices/video/gba_lcd.cpp1784
-rw-r--r--src/devices/video/gba_lcd.h213
-rw-r--r--src/devices/video/gf4500.cpp157
-rw-r--r--src/devices/video/gf4500.h49
-rw-r--r--src/devices/video/gf7600gs.cpp86
-rw-r--r--src/devices/video/gf7600gs.h45
-rw-r--r--src/devices/video/hd44102.cpp285
-rw-r--r--src/devices/video/hd44102.h67
-rw-r--r--src/devices/video/hd44352.cpp438
-rw-r--r--src/devices/video/hd44352.h76
-rw-r--r--src/devices/video/hd44780.cpp809
-rw-r--r--src/devices/video/hd44780.h173
-rw-r--r--src/devices/video/hd61202.cpp132
-rw-r--r--src/devices/video/hd61202.h62
-rw-r--r--src/devices/video/hd61602.cpp206
-rw-r--r--src/devices/video/hd61602.h82
-rw-r--r--src/devices/video/hd61603.cpp106
-rw-r--r--src/devices/video/hd61603.h65
-rw-r--r--src/devices/video/hd61830.cpp522
-rw-r--r--src/devices/video/hd61830.h114
-rw-r--r--src/devices/video/hd63484.cpp2207
-rw-r--r--src/devices/video/hd63484.h169
-rw-r--r--src/devices/video/hd66421.cpp290
-rw-r--r--src/devices/video/hd66421.h72
-rw-r--r--src/devices/video/hlcd0438.cpp107
-rw-r--r--src/devices/video/hlcd0438.h84
-rw-r--r--src/devices/video/hlcd0488.cpp110
-rw-r--r--src/devices/video/hlcd0488.h79
-rw-r--r--src/devices/video/hlcd0515.cpp279
-rw-r--r--src/devices/video/hlcd0515.h125
-rw-r--r--src/devices/video/hlcd0538.cpp109
-rw-r--r--src/devices/video/hlcd0538.h97
-rw-r--r--src/devices/video/hp1ll3.cpp1352
-rw-r--r--src/devices/video/hp1ll3.h119
-rw-r--r--src/devices/video/huc6202.cpp310
-rw-r--r--src/devices/video/huc6202.h70
-rw-r--r--src/devices/video/huc6260.cpp320
-rw-r--r--src/devices/video/huc6260.h97
-rw-r--r--src/devices/video/huc6261.cpp463
-rw-r--r--src/devices/video/huc6261.h79
-rw-r--r--src/devices/video/huc6270.cpp971
-rw-r--r--src/devices/video/huc6270.h145
-rw-r--r--src/devices/video/huc6271.cpp106
-rw-r--r--src/devices/video/huc6271.h54
-rw-r--r--src/devices/video/huc6272.cpp730
-rw-r--r--src/devices/video/huc6272.h177
-rw-r--r--src/devices/video/i8244.cpp835
-rw-r--r--src/devices/video/i8244.h187
-rw-r--r--src/devices/video/i82730.cpp839
-rw-r--r--src/devices/video/i82730.h212
-rw-r--r--src/devices/video/i8275.cpp781
-rw-r--r--src/devices/video/i8275.h266
-rw-r--r--src/devices/video/ibm8514a.cpp1664
-rw-r--r--src/devices/video/ibm8514a.h157
-rw-r--r--src/devices/video/imagetek_i4100.cpp1475
-rw-r--r--src/devices/video/imagetek_i4100.h269
-rw-r--r--src/devices/video/ims_cvc.cpp371
-rw-r--r--src/devices/video/ims_cvc.h232
-rw-r--r--src/devices/video/jangou_blitter.cpp260
-rw-r--r--src/devices/video/jangou_blitter.h65
-rw-r--r--src/devices/video/k051316.cpp327
-rw-r--r--src/devices/video/k051316.h83
-rw-r--r--src/devices/video/k053936.cpp704
-rw-r--r--src/devices/video/k053936.h63
-rw-r--r--src/devices/video/ky3211_ky10510.cpp397
-rw-r--r--src/devices/video/ky3211_ky10510.h64
-rw-r--r--src/devices/video/lc7580.cpp159
-rw-r--r--src/devices/video/lc7580.h84
-rw-r--r--src/devices/video/lc7985.cpp302
-rw-r--r--src/devices/video/lc7985.h62
-rw-r--r--src/devices/video/m50458.cpp450
-rw-r--r--src/devices/video/m50458.h96
-rw-r--r--src/devices/video/mb86292.cpp1166
-rw-r--r--src/devices/video/mb86292.h162
-rw-r--r--src/devices/video/mb88303.cpp342
-rw-r--r--src/devices/video/mb88303.h121
-rw-r--r--src/devices/video/mb90082.cpp246
-rw-r--r--src/devices/video/mb90082.h71
-rw-r--r--src/devices/video/mb_vcu.cpp549
-rw-r--r--src/devices/video/mb_vcu.h88
-rw-r--r--src/devices/video/mc68328lcd.cpp149
-rw-r--r--src/devices/video/mc68328lcd.h53
-rw-r--r--src/devices/video/mc6845.cpp1364
-rw-r--r--src/devices/video/mc6845.h416
-rw-r--r--src/devices/video/mc6847.cpp1872
-rw-r--r--src/devices/video/mc6847.h653
-rw-r--r--src/devices/video/md4330b.cpp100
-rw-r--r--src/devices/video/md4330b.h91
-rw-r--r--src/devices/video/mm5445.cpp103
-rw-r--r--src/devices/video/mm5445.h101
-rw-r--r--src/devices/video/mn1252.cpp103
-rw-r--r--src/devices/video/mn1252.h42
-rw-r--r--src/devices/video/mos6566.cpp2788
-rw-r--r--src/devices/video/mos6566.h441
-rw-r--r--src/devices/video/mos8563.cpp501
-rw-r--r--src/devices/video/mos8563.h109
-rw-r--r--src/devices/video/mr9735.cpp438
-rw-r--r--src/devices/video/mr9735.h149
-rw-r--r--src/devices/video/msm6222b.cpp244
-rw-r--r--src/devices/video/msm6222b.h61
-rw-r--r--src/devices/video/msm6255.cpp440
-rw-r--r--src/devices/video/msm6255.h93
-rw-r--r--src/devices/video/nereid.cpp188
-rw-r--r--src/devices/video/nereid.h54
-rw-r--r--src/devices/video/nt7534.cpp359
-rw-r--r--src/devices/video/nt7534.h87
-rw-r--r--src/devices/video/pc_vga.cpp2231
-rw-r--r--src/devices/video/pc_vga.h366
-rw-r--r--src/devices/video/pc_vga_alliance.cpp89
-rw-r--r--src/devices/video/pc_vga_alliance.h41
-rw-r--r--src/devices/video/pc_vga_ati.cpp357
-rw-r--r--src/devices/video/pc_vga_ati.h64
-rw-r--r--src/devices/video/pc_vga_chips.cpp426
-rw-r--r--src/devices/video/pc_vga_chips.h63
-rw-r--r--src/devices/video/pc_vga_cirrus.cpp1595
-rw-r--r--src/devices/video/pc_vga_cirrus.h161
-rw-r--r--src/devices/video/pc_vga_matrox.cpp785
-rw-r--r--src/devices/video/pc_vga_matrox.h120
-rw-r--r--src/devices/video/pc_vga_mediagx.cpp57
-rw-r--r--src/devices/video/pc_vga_mediagx.h38
-rw-r--r--src/devices/video/pc_vga_nvidia.cpp322
-rw-r--r--src/devices/video/pc_vga_nvidia.h44
-rw-r--r--src/devices/video/pc_vga_oak.cpp480
-rw-r--r--src/devices/video/pc_vga_oak.h77
-rw-r--r--src/devices/video/pc_vga_paradise.cpp937
-rw-r--r--src/devices/video/pc_vga_paradise.h213
-rw-r--r--src/devices/video/pc_vga_s3.cpp1221
-rw-r--r--src/devices/video/pc_vga_s3.h134
-rw-r--r--src/devices/video/pc_vga_sis.cpp1924
-rw-r--r--src/devices/video/pc_vga_sis.h197
-rw-r--r--src/devices/video/pc_vga_trident.cpp1668
-rw-r--r--src/devices/video/pc_vga_trident.h186
-rw-r--r--src/devices/video/pc_vga_tseng.cpp687
-rw-r--r--src/devices/video/pc_vga_tseng.h123
-rw-r--r--src/devices/video/pc_vga_video7.cpp109
-rw-r--r--src/devices/video/pc_vga_video7.h40
-rw-r--r--src/devices/video/pc_xga.cpp757
-rw-r--r--src/devices/video/pc_xga.h73
-rw-r--r--src/devices/video/pcd8544.cpp231
-rw-r--r--src/devices/video/pcd8544.h67
-rw-r--r--src/devices/video/pcf2100.cpp125
-rw-r--r--src/devices/video/pcf2100.h95
-rw-r--r--src/devices/video/poly.h1482
-rw-r--r--src/devices/video/ppu2c0x.cpp1424
-rw-r--r--src/devices/video/ppu2c0x.h340
-rw-r--r--src/devices/video/ppu2c0x_sh6578.cpp308
-rw-r--r--src/devices/video/ppu2c0x_sh6578.h57
-rw-r--r--src/devices/video/ppu2c0x_vt.cpp1304
-rw-r--r--src/devices/video/ppu2c0x_vt.h230
-rw-r--r--src/devices/video/ps2gif.cpp338
-rw-r--r--src/devices/video/ps2gif.h131
-rw-r--r--src/devices/video/ps2gs.cpp759
-rw-r--r--src/devices/video/ps2gs.h317
-rw-r--r--src/devices/video/psx.cpp3552
-rw-r--r--src/devices/video/psx.h358
-rw-r--r--src/devices/video/pwm.cpp301
-rw-r--r--src/devices/video/pwm.h116
-rw-r--r--src/devices/video/ramdac.cpp207
-rw-r--r--src/devices/video/ramdac.h83
-rw-r--r--src/devices/video/roc10937.cpp393
-rw-r--r--src/devices/video/roc10937.h92
-rw-r--r--src/devices/video/s3virge.cpp1450
-rw-r--r--src/devices/video/s3virge.h246
-rw-r--r--src/devices/video/saa5050.cpp669
-rw-r--r--src/devices/video/saa5050.h257
-rw-r--r--src/devices/video/saa5240.cpp791
-rw-r--r--src/devices/video/saa5240.h217
-rw-r--r--src/devices/video/saa7110.cpp177
-rw-r--r--src/devices/video/saa7110.h46
-rw-r--r--src/devices/video/scn2674.cpp1211
-rw-r--r--src/devices/video/scn2674.h153
-rw-r--r--src/devices/video/sda5708.cpp251
-rw-r--r--src/devices/video/sda5708.h119
-rw-r--r--src/devices/video/sed1200.cpp254
-rw-r--r--src/devices/video/sed1200.h90
-rw-r--r--src/devices/video/sed1330.cpp746
-rw-r--r--src/devices/video/sed1330.h115
-rw-r--r--src/devices/video/sed1356.cpp1839
-rw-r--r--src/devices/video/sed1356.h561
-rw-r--r--src/devices/video/sed1375.cpp549
-rw-r--r--src/devices/video/sed1375.h196
-rw-r--r--src/devices/video/sed1500.cpp116
-rw-r--r--src/devices/video/sed1500.h86
-rw-r--r--src/devices/video/sed1520.cpp488
-rw-r--r--src/devices/video/sed1520.h183
-rw-r--r--src/devices/video/sn74s262.cpp130
-rw-r--r--src/devices/video/sn74s262.h78
-rw-r--r--src/devices/video/snes_ppu.cpp2535
-rw-r--r--src/devices/video/snes_ppu.h338
-rw-r--r--src/devices/video/sprite.cpp157
-rw-r--r--src/devices/video/sprite.h199
-rw-r--r--src/devices/video/st7626.cpp55
-rw-r--r--src/devices/video/st7626.h33
-rw-r--r--src/devices/video/st7735_lcdc.cpp362
-rw-r--r--src/devices/video/st7735_lcdc.h38
-rw-r--r--src/devices/video/t6963c.cpp485
-rw-r--r--src/devices/video/t6963c.h118
-rw-r--r--src/devices/video/t6a04.cpp245
-rw-r--r--src/devices/video/t6a04.h68
-rw-r--r--src/devices/video/tea1002.cpp92
-rw-r--r--src/devices/video/tea1002.h49
-rw-r--r--src/devices/video/tlc34076.cpp265
-rw-r--r--src/devices/video/tlc34076.h71
-rw-r--r--src/devices/video/tmap038.cpp261
-rw-r--r--src/devices/video/tmap038.h114
-rw-r--r--src/devices/video/tms34061.cpp553
-rw-r--r--src/devices/video/tms34061.h121
-rw-r--r--src/devices/video/tms3556.cpp669
-rw-r--r--src/devices/video/tms3556.h116
-rw-r--r--src/devices/video/tms9927.cpp366
-rw-r--r--src/devices/video/tms9927.h115
-rw-r--r--src/devices/video/tms9928a.cpp791
-rw-r--r--src/devices/video/tms9928a.h212
-rw-r--r--src/devices/video/topcat.cpp467
-rw-r--r--src/devices/video/topcat.h152
-rw-r--r--src/devices/video/upd3301.cpp832
-rw-r--r--src/devices/video/upd3301.h182
-rw-r--r--src/devices/video/upd72120.cpp632
-rw-r--r--src/devices/video/upd72120.h124
-rw-r--r--src/devices/video/upd7220.cpp1948
-rw-r--r--src/devices/video/upd7220.h253
-rw-r--r--src/devices/video/upd7227.cpp147
-rw-r--r--src/devices/video/upd7227.h84
-rw-r--r--src/devices/video/v9938.cpp3143
-rw-r--r--src/devices/video/v9938.h276
-rw-r--r--src/devices/video/vector.cpp245
-rw-r--r--src/devices/video/vector.h105
-rw-r--r--src/devices/video/voodoo.cpp3407
-rw-r--r--src/devices/video/voodoo.h769
-rw-r--r--src/devices/video/voodoo_2.cpp1723
-rw-r--r--src/devices/video/voodoo_2.h249
-rw-r--r--src/devices/video/voodoo_banshee.cpp1929
-rw-r--r--src/devices/video/voodoo_banshee.h185
-rw-r--r--src/devices/video/voodoo_pci.cpp353
-rw-r--r--src/devices/video/voodoo_pci.h190
-rw-r--r--src/devices/video/voodoo_regs.h1440
-rw-r--r--src/devices/video/voodoo_render.cpp2897
-rw-r--r--src/devices/video/voodoo_render.h616
-rw-r--r--src/devices/video/vrender0.cpp700
-rw-r--r--src/devices/video/vrender0.h161
-rw-r--r--src/devices/video/wd90c26.cpp121
-rw-r--r--src/devices/video/wd90c26.h30
-rw-r--r--src/devices/video/x1_001.cpp478
-rw-r--r--src/devices/video/x1_001.h90
-rw-r--r--src/devices/video/x1_020_dx_101.cpp987
-rw-r--r--src/devices/video/x1_020_dx_101.h67
-rw-r--r--src/devices/video/ym7101.cpp1264
-rw-r--r--src/devices/video/ym7101.h208
-rw-r--r--src/devices/video/zeus2.cpp2263
-rw-r--r--src/devices/video/zeus2.h435
-rw-r--r--src/devices/video/zr36060.cpp677
-rw-r--r--src/devices/video/zr36060.h108
-rw-r--r--src/devices/video/zr36110.cpp412
-rw-r--r--src/devices/video/zr36110.h98
-rw-r--r--src/emu/addrmap.cpp1402
-rw-r--r--src/emu/addrmap.h604
-rw-r--r--src/emu/attotime.c161
-rw-r--r--src/emu/attotime.cpp181
-rw-r--r--src/emu/attotime.h613
-rw-r--r--src/emu/audio/generic.c163
-rw-r--r--src/emu/audio/generic.h61
-rw-r--r--src/emu/audio_effects/aeffect.cpp49
-rw-r--r--src/emu/audio_effects/aeffect.h47
-rw-r--r--src/emu/audio_effects/compressor.cpp456
-rw-r--r--src/emu/audio_effects/compressor.h119
-rw-r--r--src/emu/audio_effects/eq.cpp353
-rw-r--r--src/emu/audio_effects/eq.h88
-rw-r--r--src/emu/audio_effects/filter.cpp271
-rw-r--r--src/emu/audio_effects/filter.h82
-rw-r--r--src/emu/audio_effects/reverb.cpp1868
-rw-r--r--src/emu/audio_effects/reverb.h442
-rw-r--r--src/emu/audit.c550
-rw-r--r--src/emu/audit.h102
-rw-r--r--src/emu/bookkeeping.cpp236
-rw-r--r--src/emu/bookkeeping.h79
-rw-r--r--src/emu/cheat.c1834
-rw-r--r--src/emu/cheat.h54
-rw-r--r--src/emu/clifront.c1036
-rw-r--r--src/emu/clifront.h58
-rw-r--r--src/emu/config.c363
-rw-r--r--src/emu/config.cpp371
-rw-r--r--src/emu/config.h93
-rw-r--r--src/emu/cpu/adsp2100/2100dasm.c550
-rw-r--r--src/emu/cpu/adsp2100/2100ops.c2252
-rw-r--r--src/emu/cpu/adsp2100/adsp2100.c2242
-rw-r--r--src/emu/cpu/adsp2100/adsp2100.h177
-rw-r--r--src/emu/cpu/alph8201/8201dasm.c402
-rw-r--r--src/emu/cpu/alph8201/alph8201.c997
-rw-r--r--src/emu/cpu/alph8201/alph8201.h48
-rw-r--r--src/emu/cpu/apexc/apexc.c947
-rw-r--r--src/emu/cpu/apexc/apexc.h26
-rw-r--r--src/emu/cpu/apexc/apexcdsm.c174
-rw-r--r--src/emu/cpu/arm/arm.c1576
-rw-r--r--src/emu/cpu/arm/arm.h33
-rw-r--r--src/emu/cpu/arm/armdasm.c393
-rw-r--r--src/emu/cpu/arm7/arm7.c808
-rw-r--r--src/emu/cpu/arm7/arm7.h50
-rw-r--r--src/emu/cpu/arm7/arm7core.c1716
-rw-r--r--src/emu/cpu/arm7/arm7core.h504
-rw-r--r--src/emu/cpu/arm7/arm7dasm.c1307
-rw-r--r--src/emu/cpu/arm7/arm7exec.c1608
-rw-r--r--src/emu/cpu/asap/asap.c1840
-rw-r--r--src/emu/cpu/asap/asap.h45
-rw-r--r--src/emu/cpu/asap/asapdasm.c141
-rw-r--r--src/emu/cpu/avr8/avr8.c970
-rw-r--r--src/emu/cpu/avr8/avr8.h60
-rw-r--r--src/emu/cpu/avr8/avr8dasm.c568
-rw-r--r--src/emu/cpu/ccpu/ccpu.c828
-rw-r--r--src/emu/cpu/ccpu/ccpu.h66
-rw-r--r--src/emu/cpu/ccpu/ccpudasm.c327
-rw-r--r--src/emu/cpu/cdp1802/1802dasm.c174
-rw-r--r--src/emu/cpu/cdp1802/cdp1802.c1139
-rw-r--r--src/emu/cpu/cdp1802/cdp1802.h103
-rw-r--r--src/emu/cpu/cop400/cop400.c1671
-rw-r--r--src/emu/cpu/cop400/cop400.h159
-rw-r--r--src/emu/cpu/cop400/cop400op.c1318
-rw-r--r--src/emu/cpu/cop400/cop410ds.c350
-rw-r--r--src/emu/cpu/cop400/cop420ds.c399
-rw-r--r--src/emu/cpu/cop400/cop440ds.c416
-rw-r--r--src/emu/cpu/cp1610/1610dasm.c1488
-rw-r--r--src/emu/cpu/cp1610/cp1610.c3531
-rw-r--r--src/emu/cpu/cp1610/cp1610.h44
-rw-r--r--src/emu/cpu/cpu.mak1560
-rw-r--r--src/emu/cpu/cubeqcpu/cubeqcpu.c2196
-rw-r--r--src/emu/cpu/cubeqcpu/cubeqcpu.h167
-rw-r--r--src/emu/cpu/drcbec.c2062
-rw-r--r--src/emu/cpu/drcbeut.c680
-rw-r--r--src/emu/cpu/drcbeut.h155
-rw-r--r--src/emu/cpu/drcbex64.c7124
-rw-r--r--src/emu/cpu/drcbex86.c6866
-rw-r--r--src/emu/cpu/drccache.c418
-rw-r--r--src/emu/cpu/drccache.h109
-rw-r--r--src/emu/cpu/drcfe.c512
-rw-r--r--src/emu/cpu/drcfe.h161
-rw-r--r--src/emu/cpu/drcuml.c2460
-rw-r--r--src/emu/cpu/drcuml.h510
-rw-r--r--src/emu/cpu/drcumlsh.h229
-rw-r--r--src/emu/cpu/dsp32/dsp32.c905
-rw-r--r--src/emu/cpu/dsp32/dsp32.h88
-rw-r--r--src/emu/cpu/dsp32/dsp32dis.c691
-rw-r--r--src/emu/cpu/dsp32/dsp32ops.c2839
-rw-r--r--src/emu/cpu/dsp56k/dsp56def.h404
-rw-r--r--src/emu/cpu/dsp56k/dsp56dsm.c3227
-rw-r--r--src/emu/cpu/dsp56k/dsp56k.c571
-rw-r--r--src/emu/cpu/dsp56k/dsp56k.h251
-rw-r--r--src/emu/cpu/dsp56k/dsp56mem.c941
-rw-r--r--src/emu/cpu/dsp56k/dsp56ops.c4750
-rw-r--r--src/emu/cpu/dsp56k/dsp56pcu.c482
-rw-r--r--src/emu/cpu/e132xs/32xsdasm.c2135
-rw-r--r--src/emu/cpu/e132xs/e132xs.c5441
-rw-r--r--src/emu/cpu/e132xs/e132xs.h183
-rw-r--r--src/emu/cpu/e132xs/e132xsop.c1926
-rw-r--r--src/emu/cpu/esrip/esrip.c2081
-rw-r--r--src/emu/cpu/esrip/esrip.h105
-rw-r--r--src/emu/cpu/f8/f8.c2227
-rw-r--r--src/emu/cpu/f8/f8.h57
-rw-r--r--src/emu/cpu/f8/f8dasm.c510
-rw-r--r--src/emu/cpu/g65816/g65816.c523
-rw-r--r--src/emu/cpu/g65816/g65816.h72
-rw-r--r--src/emu/cpu/g65816/g65816cm.h318
-rw-r--r--src/emu/cpu/g65816/g65816ds.c347
-rw-r--r--src/emu/cpu/g65816/g65816ds.h25
-rw-r--r--src/emu/cpu/g65816/g65816o0.c4
-rw-r--r--src/emu/cpu/g65816/g65816o1.c4
-rw-r--r--src/emu/cpu/g65816/g65816o2.c4
-rw-r--r--src/emu/cpu/g65816/g65816o3.c4
-rw-r--r--src/emu/cpu/g65816/g65816o4.c4
-rw-r--r--src/emu/cpu/g65816/g65816op.h2449
-rw-r--r--src/emu/cpu/h6280/6280dasm.c250
-rw-r--r--src/emu/cpu/h6280/h6280.c536
-rw-r--r--src/emu/cpu/h6280/h6280.h92
-rw-r--r--src/emu/cpu/h6280/h6280ops.h1371
-rw-r--r--src/emu/cpu/h6280/tblh6280.c344
-rw-r--r--src/emu/cpu/h83002/h8.h100
-rw-r--r--src/emu/cpu/h83002/h8_16.c671
-rw-r--r--src/emu/cpu/h83002/h8_8.c799
-rw-r--r--src/emu/cpu/h83002/h8disasm.c1277
-rw-r--r--src/emu/cpu/h83002/h8ops.h3616
-rw-r--r--src/emu/cpu/h83002/h8periph.c795
-rw-r--r--src/emu/cpu/h83002/h8priv.h76
-rw-r--r--src/emu/cpu/hd6309/6309dasm.c940
-rw-r--r--src/emu/cpu/hd6309/6309ops.c5542
-rw-r--r--src/emu/cpu/hd6309/6309tbl.c814
-rw-r--r--src/emu/cpu/hd6309/hd6309.c1357
-rw-r--r--src/emu/cpu/hd6309/hd6309.h27
-rw-r--r--src/emu/cpu/i386/cycles.h674
-rw-r--r--src/emu/cpu/i386/i386.c1433
-rw-r--r--src/emu/cpu/i386/i386.h25
-rw-r--r--src/emu/cpu/i386/i386dasm.c2139
-rw-r--r--src/emu/cpu/i386/i386op16.c3156
-rw-r--r--src/emu/cpu/i386/i386op32.c2974
-rw-r--r--src/emu/cpu/i386/i386ops.c2307
-rw-r--r--src/emu/cpu/i386/i386ops.h369
-rw-r--r--src/emu/cpu/i386/i386priv.h910
-rw-r--r--src/emu/cpu/i386/i486ops.c368
-rw-r--r--src/emu/cpu/i386/pentops.c53
-rw-r--r--src/emu/cpu/i386/x87ops.c352
-rw-r--r--src/emu/cpu/i8085/8085dasm.c581
-rw-r--r--src/emu/cpu/i8085/i8085.c1783
-rw-r--r--src/emu/cpu/i8085/i8085.h65
-rw-r--r--src/emu/cpu/i8085/i8085cpu.h187
-rw-r--r--src/emu/cpu/i8085/i8085daa.h2050
-rw-r--r--src/emu/cpu/i86/ea.h55
-rw-r--r--src/emu/cpu/i86/host.h13
-rw-r--r--src/emu/cpu/i86/i286.c507
-rw-r--r--src/emu/cpu/i86/i286.h49
-rw-r--r--src/emu/cpu/i86/i86.c660
-rw-r--r--src/emu/cpu/i86/i86.h55
-rw-r--r--src/emu/cpu/i86/i86.txt111
-rw-r--r--src/emu/cpu/i86/i86mem.c52
-rw-r--r--src/emu/cpu/i86/i86mem.h10
-rw-r--r--src/emu/cpu/i86/i86priv.h128
-rw-r--r--src/emu/cpu/i86/i86time.c310
-rw-r--r--src/emu/cpu/i86/instr186.c165
-rw-r--r--src/emu/cpu/i86/instr186.h27
-rw-r--r--src/emu/cpu/i86/instr286.c308
-rw-r--r--src/emu/cpu/i86/instr286.h13
-rw-r--r--src/emu/cpu/i86/instr86.c3175
-rw-r--r--src/emu/cpu/i86/instr86.h244
-rw-r--r--src/emu/cpu/i86/modrm.h119
-rw-r--r--src/emu/cpu/i86/table186.h525
-rw-r--r--src/emu/cpu/i86/table286.h530
-rw-r--r--src/emu/cpu/i86/table86.h525
-rw-r--r--src/emu/cpu/i860/i860.c381
-rw-r--r--src/emu/cpu/i860/i860.h228
-rw-r--r--src/emu/cpu/i860/i860dasm.c377
-rw-r--r--src/emu/cpu/i860/i860dec.c4718
-rw-r--r--src/emu/cpu/i860/i860dis.c694
-rw-r--r--src/emu/cpu/i960/i960.c2244
-rw-r--r--src/emu/cpu/i960/i960.h70
-rw-r--r--src/emu/cpu/i960/i960dis.c291
-rw-r--r--src/emu/cpu/i960/i960dis.h16
-rw-r--r--src/emu/cpu/jaguar/jagdasm.c182
-rw-r--r--src/emu/cpu/jaguar/jaguar.c1685
-rw-r--r--src/emu/cpu/jaguar/jaguar.h114
-rw-r--r--src/emu/cpu/konami/knmidasm.c1874
-rw-r--r--src/emu/cpu/konami/konami.c632
-rw-r--r--src/emu/cpu/konami/konami.h32
-rw-r--r--src/emu/cpu/konami/konamops.c4346
-rw-r--r--src/emu/cpu/konami/konamtbl.c491
-rw-r--r--src/emu/cpu/lh5801/5801dasm.c736
-rw-r--r--src/emu/cpu/lh5801/5801tbl.c683
-rw-r--r--src/emu/cpu/lh5801/lh5801.c274
-rw-r--r--src/emu/cpu/lh5801/lh5801.h84
-rw-r--r--src/emu/cpu/lr35902/lr35902.c502
-rw-r--r--src/emu/cpu/lr35902/lr35902.h38
-rw-r--r--src/emu/cpu/lr35902/lr35902d.c288
-rw-r--r--src/emu/cpu/lr35902/opc_cb.h1440
-rw-r--r--src/emu/cpu/lr35902/opc_main.h1552
-rw-r--r--src/emu/cpu/m37710/m37710.c1136
-rw-r--r--src/emu/cpu/m37710/m37710.h98
-rw-r--r--src/emu/cpu/m37710/m37710cm.h340
-rw-r--r--src/emu/cpu/m37710/m37710o0.c3
-rw-r--r--src/emu/cpu/m37710/m37710o1.c3
-rw-r--r--src/emu/cpu/m37710/m37710o2.c3
-rw-r--r--src/emu/cpu/m37710/m37710o3.c3
-rw-r--r--src/emu/cpu/m37710/m37710op.h2959
-rw-r--r--src/emu/cpu/m37710/m7700ds.c610
-rw-r--r--src/emu/cpu/m37710/m7700ds.h21
-rw-r--r--src/emu/cpu/m6502/6502dasm.c766
-rw-r--r--src/emu/cpu/m6502/ill02.h337
-rw-r--r--src/emu/cpu/m6502/m4510.c560
-rw-r--r--src/emu/cpu/m6502/m4510.h48
-rw-r--r--src/emu/cpu/m6502/m6502.c985
-rw-r--r--src/emu/cpu/m6502/m6502.h244
-rw-r--r--src/emu/cpu/m6502/m6509.c420
-rw-r--r--src/emu/cpu/m6502/m6509.h45
-rw-r--r--src/emu/cpu/m6502/m65ce02.c366
-rw-r--r--src/emu/cpu/m6502/m65ce02.h43
-rw-r--r--src/emu/cpu/m6502/minc4510.h70
-rw-r--r--src/emu/cpu/m6502/mincce02.h69
-rw-r--r--src/emu/cpu/m6502/ops02.h803
-rw-r--r--src/emu/cpu/m6502/ops09.h206
-rw-r--r--src/emu/cpu/m6502/ops4510.h61
-rw-r--r--src/emu/cpu/m6502/opsc02.h358
-rw-r--r--src/emu/cpu/m6502/opsce02.h987
-rw-r--r--src/emu/cpu/m6502/opsn2a03.h38
-rw-r--r--src/emu/cpu/m6502/t6502.c360
-rw-r--r--src/emu/cpu/m6502/t6509.c352
-rw-r--r--src/emu/cpu/m6502/t6510.c27
-rw-r--r--src/emu/cpu/m6502/t65c02.c410
-rw-r--r--src/emu/cpu/m6502/t65ce02.c399
-rw-r--r--src/emu/cpu/m6502/t65sc02.c80
-rw-r--r--src/emu/cpu/m6502/tdeco16.c430
-rw-r--r--src/emu/cpu/m6502/tn2a03.c114
-rw-r--r--src/emu/cpu/m6800/6800dasm.c274
-rw-r--r--src/emu/cpu/m6800/6800ops.c2286
-rw-r--r--src/emu/cpu/m6800/6800tbl.c386
-rw-r--r--src/emu/cpu/m6800/m6800.c2902
-rw-r--r--src/emu/cpu/m6800/m6800.h236
-rw-r--r--src/emu/cpu/m68000/m68000.h99
-rw-r--r--src/emu/cpu/m68000/m68k_in.c10157
-rw-r--r--src/emu/cpu/m68000/m68kcpu.c1359
-rw-r--r--src/emu/cpu/m68000/m68kcpu.h1736
-rw-r--r--src/emu/cpu/m68000/m68kdasm.c3721
-rw-r--r--src/emu/cpu/m68000/m68kfpu.c828
-rw-r--r--src/emu/cpu/m68000/m68kmake.c1430
-rw-r--r--src/emu/cpu/m6805/6805dasm.c211
-rw-r--r--src/emu/cpu/m6805/6805ops.c1819
-rw-r--r--src/emu/cpu/m6805/m6805.c1080
-rw-r--r--src/emu/cpu/m6805/m6805.h64
-rw-r--r--src/emu/cpu/m6809/6809dasm.c618
-rw-r--r--src/emu/cpu/m6809/6809ops.c2984
-rw-r--r--src/emu/cpu/m6809/6809tbl.c416
-rw-r--r--src/emu/cpu/m6809/m6809.c1207
-rw-r--r--src/emu/cpu/m6809/m6809.h35
-rw-r--r--src/emu/cpu/mb86233/mb86233.c1729
-rw-r--r--src/emu/cpu/mb86233/mb86233.h60
-rw-r--r--src/emu/cpu/mb86233/mb86233d.c774
-rw-r--r--src/emu/cpu/mb88xx/mb88dasm.c221
-rw-r--r--src/emu/cpu/mb88xx/mb88xx.c1106
-rw-r--r--src/emu/cpu/mb88xx/mb88xx.h84
-rw-r--r--src/emu/cpu/mc68hc11/hc11dasm.c1298
-rw-r--r--src/emu/cpu/mc68hc11/hc11ops.c3479
-rw-r--r--src/emu/cpu/mc68hc11/hc11ops.h324
-rw-r--r--src/emu/cpu/mc68hc11/mc68hc11.c614
-rw-r--r--src/emu/cpu/mc68hc11/mc68hc11.h43
-rw-r--r--src/emu/cpu/mcs48/mcs48.c1540
-rw-r--r--src/emu/cpu/mcs48/mcs48.h151
-rw-r--r--src/emu/cpu/mcs48/mcs48dsm.c310
-rw-r--r--src/emu/cpu/mcs51/mcs51.c2756
-rw-r--r--src/emu/cpu/mcs51/mcs51.h172
-rw-r--r--src/emu/cpu/mcs51/mcs51dasm.c1222
-rw-r--r--src/emu/cpu/mcs51/mcs51ops.c980
-rw-r--r--src/emu/cpu/minx/minx.c400
-rw-r--r--src/emu/cpu/minx/minx.h23
-rw-r--r--src/emu/cpu/minx/minxd.c466
-rw-r--r--src/emu/cpu/minx/minxfunc.h362
-rw-r--r--src/emu/cpu/minx/minxopce.h331
-rw-r--r--src/emu/cpu/minx/minxopcf.h331
-rw-r--r--src/emu/cpu/minx/minxops.h331
-rw-r--r--src/emu/cpu/mips/dismips.c328
-rw-r--r--src/emu/cpu/mips/dismips.mak2
-rw-r--r--src/emu/cpu/mips/mips3.c2466
-rw-r--r--src/emu/cpu/mips/mips3.h289
-rw-r--r--src/emu/cpu/mips/mips3com.c944
-rw-r--r--src/emu/cpu/mips/mips3com.h266
-rw-r--r--src/emu/cpu/mips/mips3drc.c4071
-rw-r--r--src/emu/cpu/mips/mips3dsm.c511
-rw-r--r--src/emu/cpu/mips/mips3fe.c753
-rw-r--r--src/emu/cpu/mips/mips3fe.h44
-rw-r--r--src/emu/cpu/mips/psx.c6434
-rw-r--r--src/emu/cpu/mips/psx.h224
-rw-r--r--src/emu/cpu/mips/psxdasm.c741
-rw-r--r--src/emu/cpu/mips/r3000.c1389
-rw-r--r--src/emu/cpu/mips/r3000.h75
-rw-r--r--src/emu/cpu/mips/r3kdasm.c371
-rw-r--r--src/emu/cpu/nec/nec.c1534
-rw-r--r--src/emu/cpu/nec/nec.h36
-rw-r--r--src/emu/cpu/nec/necdasm.c1545
-rw-r--r--src/emu/cpu/nec/necea.h60
-rw-r--r--src/emu/cpu/nec/nechost.h12
-rw-r--r--src/emu/cpu/nec/necinstr.h508
-rw-r--r--src/emu/cpu/nec/necmodrm.h104
-rw-r--r--src/emu/cpu/nec/necpriv.h374
-rw-r--r--src/emu/cpu/pdp1/pdp1.c1893
-rw-r--r--src/emu/cpu/pdp1/pdp1.h85
-rw-r--r--src/emu/cpu/pdp1/pdp1dasm.c293
-rw-r--r--src/emu/cpu/pdp1/tx0.c1310
-rw-r--r--src/emu/cpu/pdp1/tx0.h56
-rw-r--r--src/emu/cpu/pdp1/tx0dasm.c122
-rw-r--r--src/emu/cpu/pic16c5x/16c5xdsm.c258
-rw-r--r--src/emu/cpu/pic16c5x/dis16c5x.c134
-rw-r--r--src/emu/cpu/pic16c5x/pic16c5x.c1384
-rw-r--r--src/emu/cpu/pic16c5x/pic16c5x.h74
-rw-r--r--src/emu/cpu/powerpc/drc_ops.c3800
-rw-r--r--src/emu/cpu/powerpc/drc_ops.h143
-rw-r--r--src/emu/cpu/powerpc/ppc.c2095
-rw-r--r--src/emu/cpu/powerpc/ppc.h199
-rw-r--r--src/emu/cpu/powerpc/ppc403.c956
-rw-r--r--src/emu/cpu/powerpc/ppc602.c283
-rw-r--r--src/emu/cpu/powerpc/ppc603.c286
-rw-r--r--src/emu/cpu/powerpc/ppc_dasm.c1168
-rw-r--r--src/emu/cpu/powerpc/ppc_mem.c436
-rw-r--r--src/emu/cpu/powerpc/ppc_ops.c2818
-rw-r--r--src/emu/cpu/powerpc/ppc_ops.h150
-rw-r--r--src/emu/cpu/powerpc/ppccom.c2151
-rw-r--r--src/emu/cpu/powerpc/ppccom.h604
-rw-r--r--src/emu/cpu/powerpc/ppcdrc.c4631
-rw-r--r--src/emu/cpu/powerpc/ppcfe.c1453
-rw-r--r--src/emu/cpu/powerpc/ppcfe.h51
-rw-r--r--src/emu/cpu/rsp/rsp.c3055
-rw-r--r--src/emu/cpu/rsp/rsp.h79
-rw-r--r--src/emu/cpu/rsp/rsp_dasm.c345
-rw-r--r--src/emu/cpu/s2650/2650dasm.c868
-rw-r--r--src/emu/cpu/s2650/s2650.c1617
-rw-r--r--src/emu/cpu/s2650/s2650.h32
-rw-r--r--src/emu/cpu/s2650/s2650cpu.h33
-rw-r--r--src/emu/cpu/saturn/satops.c1137
-rw-r--r--src/emu/cpu/saturn/sattable.c1037
-rw-r--r--src/emu/cpu/saturn/saturn.c413
-rw-r--r--src/emu/cpu/saturn/saturn.h94
-rw-r--r--src/emu/cpu/saturn/saturnds.c1486
-rw-r--r--src/emu/cpu/sc61860/readpc.c195
-rw-r--r--src/emu/cpu/sc61860/sc.h32
-rw-r--r--src/emu/cpu/sc61860/sc61860.c251
-rw-r--r--src/emu/cpu/sc61860/sc61860.h62
-rw-r--r--src/emu/cpu/sc61860/scdasm.c221
-rw-r--r--src/emu/cpu/sc61860/scops.c726
-rw-r--r--src/emu/cpu/sc61860/sctable.c144
-rw-r--r--src/emu/cpu/se3208/se3208.c1938
-rw-r--r--src/emu/cpu/se3208/se3208.h14
-rw-r--r--src/emu/cpu/se3208/se3208dis.c1412
-rw-r--r--src/emu/cpu/sh2/sh2.c2470
-rw-r--r--src/emu/cpu/sh2/sh2.h96
-rw-r--r--src/emu/cpu/sh2/sh2comn.c758
-rw-r--r--src/emu/cpu/sh2/sh2comn.h184
-rw-r--r--src/emu/cpu/sh2/sh2dasm.c602
-rw-r--r--src/emu/cpu/sh2/sh2drc.c3419
-rw-r--r--src/emu/cpu/sh2/sh2fe.c772
-rw-r--r--src/emu/cpu/sh4/sh4.c3927
-rw-r--r--src/emu/cpu/sh4/sh4.h108
-rw-r--r--src/emu/cpu/sh4/sh4comn.c1326
-rw-r--r--src/emu/cpu/sh4/sh4comn.h177
-rw-r--r--src/emu/cpu/sh4/sh4dasm.c811
-rw-r--r--src/emu/cpu/sh4/sh4regs.h159
-rw-r--r--src/emu/cpu/sharc/compute.c1338
-rw-r--r--src/emu/cpu/sharc/sharc.c1340
-rw-r--r--src/emu/cpu/sharc/sharc.h35
-rw-r--r--src/emu/cpu/sharc/sharcdma.c204
-rw-r--r--src/emu/cpu/sharc/sharcdsm.c1183
-rw-r--r--src/emu/cpu/sharc/sharcdsm.h77
-rw-r--r--src/emu/cpu/sharc/sharcmem.c202
-rw-r--r--src/emu/cpu/sharc/sharcops.c2754
-rw-r--r--src/emu/cpu/sharc/sharcops.h138
-rw-r--r--src/emu/cpu/sm8500/sm8500.c554
-rw-r--r--src/emu/cpu/sm8500/sm8500.h47
-rw-r--r--src/emu/cpu/sm8500/sm8500d.c582
-rw-r--r--src/emu/cpu/sm8500/sm85ops.h1686
-rw-r--r--src/emu/cpu/spc700/spc700.c1718
-rw-r--r--src/emu/cpu/spc700/spc700.h40
-rw-r--r--src/emu/cpu/spc700/spc700ds.c433
-rw-r--r--src/emu/cpu/spc700/spc700ds.h27
-rw-r--r--src/emu/cpu/ssem/ssem.c320
-rw-r--r--src/emu/cpu/ssem/ssem.h24
-rw-r--r--src/emu/cpu/ssem/ssemdasm.c75
-rw-r--r--src/emu/cpu/ssp1601/ssp1601.c923
-rw-r--r--src/emu/cpu/ssp1601/ssp1601.h24
-rw-r--r--src/emu/cpu/ssp1601/ssp1601d.c290
-rw-r--r--src/emu/cpu/t11/t11.c497
-rw-r--r--src/emu/cpu/t11/t11.h41
-rw-r--r--src/emu/cpu/t11/t11dasm.c517
-rw-r--r--src/emu/cpu/t11/t11ops.c1414
-rw-r--r--src/emu/cpu/t11/t11table.c2410
-rw-r--r--src/emu/cpu/tlcs90/tlcs90.c2895
-rw-r--r--src/emu/cpu/tlcs90/tlcs90.h32
-rw-r--r--src/emu/cpu/tlcs900/900tbl.c6023
-rw-r--r--src/emu/cpu/tlcs900/dasm900.c2246
-rw-r--r--src/emu/cpu/tlcs900/tlcs900.c1248
-rw-r--r--src/emu/cpu/tlcs900/tlcs900.h49
-rw-r--r--src/emu/cpu/tms0980/tms0980.c878
-rw-r--r--src/emu/cpu/tms0980/tms0980.h27
-rw-r--r--src/emu/cpu/tms0980/tms0980d.c189
-rw-r--r--src/emu/cpu/tms32010/32010dsm.c339
-rw-r--r--src/emu/cpu/tms32010/dis32010.c136
-rw-r--r--src/emu/cpu/tms32010/tms32010.c1039
-rw-r--r--src/emu/cpu/tms32010/tms32010.h60
-rw-r--r--src/emu/cpu/tms32025/32025dsm.c507
-rw-r--r--src/emu/cpu/tms32025/dis32025.c135
-rw-r--r--src/emu/cpu/tms32025/tms32025.c2476
-rw-r--r--src/emu/cpu/tms32025/tms32025.h79
-rw-r--r--src/emu/cpu/tms32031/32031ops.c6740
-rw-r--r--src/emu/cpu/tms32031/dis32031.c733
-rw-r--r--src/emu/cpu/tms32031/tms32031.c874
-rw-r--r--src/emu/cpu/tms32031/tms32031.h88
-rw-r--r--src/emu/cpu/tms32051/32051ops.c1961
-rw-r--r--src/emu/cpu/tms32051/32051ops.h251
-rw-r--r--src/emu/cpu/tms32051/dis32051.c643
-rw-r--r--src/emu/cpu/tms32051/tms32051.c733
-rw-r--r--src/emu/cpu/tms32051/tms32051.h11
-rw-r--r--src/emu/cpu/tms34010/34010dsm.c1760
-rw-r--r--src/emu/cpu/tms34010/34010fld.c680
-rw-r--r--src/emu/cpu/tms34010/34010gfx.c2033
-rw-r--r--src/emu/cpu/tms34010/34010ops.c2458
-rw-r--r--src/emu/cpu/tms34010/34010ops.h158
-rw-r--r--src/emu/cpu/tms34010/34010tbl.c1167
-rw-r--r--src/emu/cpu/tms34010/dis34010.c113
-rw-r--r--src/emu/cpu/tms34010/makefile6
-rw-r--r--src/emu/cpu/tms34010/tms34010.c1833
-rw-r--r--src/emu/cpu/tms34010/tms34010.h248
-rw-r--r--src/emu/cpu/tms57002/tms57002.c1473
-rw-r--r--src/emu/cpu/tms57002/tms57002.h28
-rw-r--r--src/emu/cpu/tms57002/tmsinstr.lst535
-rw-r--r--src/emu/cpu/tms57002/tmsmake.c958
-rw-r--r--src/emu/cpu/tms7000/7000dasm.c445
-rw-r--r--src/emu/cpu/tms7000/tms7000.c734
-rw-r--r--src/emu/cpu/tms7000/tms7000.h59
-rw-r--r--src/emu/cpu/tms7000/tms70op.c3899
-rw-r--r--src/emu/cpu/tms7000/tms70tb.c124
-rw-r--r--src/emu/cpu/tms9900/9900dasm.c798
-rw-r--r--src/emu/cpu/tms9900/99xxcore.h4823
-rw-r--r--src/emu/cpu/tms9900/99xxstat.h483
-rw-r--r--src/emu/cpu/tms9900/ti990_10.c9
-rw-r--r--src/emu/cpu/tms9900/tms9900.c9
-rw-r--r--src/emu/cpu/tms9900/tms9900.h221
-rw-r--r--src/emu/cpu/tms9900/tms9980a.c9
-rw-r--r--src/emu/cpu/tms9900/tms9995.c9
-rw-r--r--src/emu/cpu/upd7810/7810dasm.c5465
-rw-r--r--src/emu/cpu/upd7810/7810ops.c9459
-rw-r--r--src/emu/cpu/upd7810/7810tbl.c7286
-rw-r--r--src/emu/cpu/upd7810/upd7810.c2270
-rw-r--r--src/emu/cpu/upd7810/upd7810.h91
-rw-r--r--src/emu/cpu/v30mz/nec.h19
-rw-r--r--src/emu/cpu/v30mz/necea.h56
-rw-r--r--src/emu/cpu/v30mz/nechost.h12
-rw-r--r--src/emu/cpu/v30mz/necinstr.h507
-rw-r--r--src/emu/cpu/v30mz/necmodrm.h104
-rw-r--r--src/emu/cpu/v30mz/v30mz.c1160
-rw-r--r--src/emu/cpu/v30mz/v30mz.h344
-rw-r--r--src/emu/cpu/v60/am.c84
-rw-r--r--src/emu/cpu/v60/am1.c1388
-rw-r--r--src/emu/cpu/v60/am2.c1256
-rw-r--r--src/emu/cpu/v60/am3.c887
-rw-r--r--src/emu/cpu/v60/op12.c2391
-rw-r--r--src/emu/cpu/v60/op2.c353
-rw-r--r--src/emu/cpu/v60/op3.c639
-rw-r--r--src/emu/cpu/v60/op4.c354
-rw-r--r--src/emu/cpu/v60/op5.c93
-rw-r--r--src/emu/cpu/v60/op6.c254
-rw-r--r--src/emu/cpu/v60/op7a.c1211
-rw-r--r--src/emu/cpu/v60/optable.c259
-rw-r--r--src/emu/cpu/v60/v60.c770
-rw-r--r--src/emu/cpu/v60/v60.h90
-rw-r--r--src/emu/cpu/v60/v60d.c1475
-rw-r--r--src/emu/cpu/v60/v60mem.c228
-rw-r--r--src/emu/cpu/v810/v810.c1289
-rw-r--r--src/emu/cpu/v810/v810.h85
-rw-r--r--src/emu/cpu/v810/v810dasm.c176
-rw-r--r--src/emu/cpu/vtlb.c286
-rw-r--r--src/emu/cpu/vtlb.h89
-rw-r--r--src/emu/cpu/x86emit.h3148
-rw-r--r--src/emu/cpu/x86log.c317
-rw-r--r--src/emu/cpu/x86log.h53
-rw-r--r--src/emu/cpu/z180/z180.c2604
-rw-r--r--src/emu/cpu/z180/z180.h147
-rw-r--r--src/emu/cpu/z180/z180cb.c293
-rw-r--r--src/emu/cpu/z180/z180daa.h2051
-rw-r--r--src/emu/cpu/z180/z180dasm.c553
-rw-r--r--src/emu/cpu/z180/z180dd.c296
-rw-r--r--src/emu/cpu/z180/z180ed.c297
-rw-r--r--src/emu/cpu/z180/z180fd.c291
-rw-r--r--src/emu/cpu/z180/z180op.c379
-rw-r--r--src/emu/cpu/z180/z180ops.h948
-rw-r--r--src/emu/cpu/z180/z180tbl.h360
-rw-r--r--src/emu/cpu/z180/z180xy.c292
-rw-r--r--src/emu/cpu/z80/z80.c3719
-rw-r--r--src/emu/cpu/z80/z80.h29
-rw-r--r--src/emu/cpu/z80/z80daisy.c109
-rw-r--r--src/emu/cpu/z80/z80daisy.h69
-rw-r--r--src/emu/cpu/z80/z80dasm.c543
-rw-r--r--src/emu/cpu/z8000/8000dasm.c318
-rw-r--r--src/emu/cpu/z8000/makedab.c87
-rw-r--r--src/emu/cpu/z8000/z8000.c640
-rw-r--r--src/emu/cpu/z8000/z8000.h33
-rw-r--r--src/emu/cpu/z8000/z8000cpu.h214
-rw-r--r--src/emu/cpu/z8000/z8000ops.c6488
-rw-r--r--src/emu/cpu/z8000/z8000tbl.c594
-rw-r--r--src/emu/cpuexec.c1972
-rw-r--r--src/emu/cpuexec.h354
-rw-r--r--src/emu/cpuintrf.h457
-rw-r--r--src/emu/crsshair.c534
-rw-r--r--src/emu/crsshair.cpp555
-rw-r--r--src/emu/crsshair.h136
-rw-r--r--src/emu/debug/debugbuf.cpp1546
-rw-r--r--src/emu/debug/debugbuf.h93
-rw-r--r--src/emu/debug/debugcmd.c2231
-rw-r--r--src/emu/debug/debugcmd.cpp4860
-rw-r--r--src/emu/debug/debugcmd.h198
-rw-r--r--src/emu/debug/debugcmt.c579
-rw-r--r--src/emu/debug/debugcmt.h40
-rw-r--r--src/emu/debug/debugcon.c551
-rw-r--r--src/emu/debug/debugcon.cpp1209
-rw-r--r--src/emu/debug/debugcon.h234
-rw-r--r--src/emu/debug/debugcpu.c3083
-rw-r--r--src/emu/debug/debugcpu.cpp2240
-rw-r--r--src/emu/debug/debugcpu.h701
-rw-r--r--src/emu/debug/debughlp.c1081
-rw-r--r--src/emu/debug/debughlp.cpp2140
-rw-r--r--src/emu/debug/debughlp.h19
-rw-r--r--src/emu/debug/debugvw.c3433
-rw-r--r--src/emu/debug/debugvw.cpp553
-rw-r--r--src/emu/debug/debugvw.h623
-rw-r--r--src/emu/debug/dvbpoints.cpp316
-rw-r--r--src/emu/debug/dvbpoints.h49
-rw-r--r--src/emu/debug/dvdisasm.cpp592
-rw-r--r--src/emu/debug/dvdisasm.h140
-rw-r--r--src/emu/debug/dvepoints.cpp316
-rw-r--r--src/emu/debug/dvepoints.h49
-rw-r--r--src/emu/debug/dvmemory.cpp1180
-rw-r--r--src/emu/debug/dvmemory.h172
-rw-r--r--src/emu/debug/dvrpoints.cpp300
-rw-r--r--src/emu/debug/dvrpoints.h52
-rw-r--r--src/emu/debug/dvstate.cpp339
-rw-r--r--src/emu/debug/dvstate.h123
-rw-r--r--src/emu/debug/dvtext.cpp175
-rw-r--r--src/emu/debug/dvtext.h70
-rw-r--r--src/emu/debug/dvwpoints.cpp354
-rw-r--r--src/emu/debug/dvwpoints.h48
-rw-r--r--src/emu/debug/express.c2146
-rw-r--r--src/emu/debug/express.cpp2335
-rw-r--r--src/emu/debug/express.h507
-rw-r--r--src/emu/debug/points.cpp528
-rw-r--r--src/emu/debug/points.h186
-rw-r--r--src/emu/debug/textbuf.c326
-rw-r--r--src/emu/debug/textbuf.cpp356
-rw-r--r--src/emu/debug/textbuf.h97
-rw-r--r--src/emu/debugger.c142
-rw-r--r--src/emu/debugger.cpp112
-rw-r--r--src/emu/debugger.h148
-rw-r--r--src/emu/deprecat.h76
-rw-r--r--src/emu/devcb.c283
-rw-r--r--src/emu/devcb.cpp356
-rw-r--r--src/emu/devcb.h2722
-rw-r--r--src/emu/devconv.h1020
-rw-r--r--src/emu/devcpu.cpp110
-rw-r--r--src/emu/devcpu.h69
-rw-r--r--src/emu/devdelegate.cpp34
-rw-r--r--src/emu/devdelegate.h431
-rw-r--r--src/emu/devfind.cpp523
-rw-r--r--src/emu/devfind.h1510
-rw-r--r--src/emu/device.cpp1180
-rw-r--r--src/emu/device.h1635
-rw-r--r--src/emu/device.ipp119
-rw-r--r--src/emu/devintrf.c907
-rw-r--r--src/emu/devintrf.h444
-rw-r--r--src/emu/devtempl.h295
-rw-r--r--src/emu/didisasm.cpp74
-rw-r--r--src/emu/didisasm.h60
-rw-r--r--src/emu/diexec.cpp790
-rw-r--r--src/emu/diexec.h350
-rw-r--r--src/emu/digfx.cpp385
-rw-r--r--src/emu/digfx.h207
-rw-r--r--src/emu/diimage.cpp1341
-rw-r--r--src/emu/diimage.h319
-rw-r--r--src/emu/dimemory.cpp171
-rw-r--r--src/emu/dimemory.h116
-rw-r--r--src/emu/dinetwork.cpp189
-rw-r--r--src/emu/dinetwork.h63
-rw-r--r--src/emu/dinvram.cpp36
-rw-r--r--src/emu/dinvram.h61
-rw-r--r--src/emu/dipalette.cpp532
-rw-r--r--src/emu/dipalette.h150
-rw-r--r--src/emu/dipty.cpp74
-rw-r--r--src/emu/dipty.h46
-rw-r--r--src/emu/dirom.h60
-rw-r--r--src/emu/dirom.ipp150
-rw-r--r--src/emu/dirtc.cpp242
-rw-r--r--src/emu/dirtc.h86
-rw-r--r--src/emu/diserial.cpp501
-rw-r--r--src/emu/diserial.h265
-rw-r--r--src/emu/dislot.cpp186
-rw-r--r--src/emu/dislot.h278
-rw-r--r--src/emu/disound.cpp376
-rw-r--r--src/emu/disound.h154
-rw-r--r--src/emu/distate.cpp572
-rw-r--r--src/emu/distate.h399
-rw-r--r--src/emu/divideo.cpp147
-rw-r--r--src/emu/divideo.h74
-rw-r--r--src/emu/divtlb.cpp351
-rw-r--r--src/emu/divtlb.h88
-rw-r--r--src/emu/drawgfx.c1919
-rw-r--r--src/emu/drawgfx.cpp2547
-rw-r--r--src/emu/drawgfx.h691
-rw-r--r--src/emu/drawgfxm.h1395
-rw-r--r--src/emu/drawgfxt.ipp1906
-rw-r--r--src/emu/drivenum.cpp350
-rw-r--r--src/emu/drivenum.h142
-rw-r--r--src/emu/driver.c246
-rw-r--r--src/emu/driver.cpp367
-rw-r--r--src/emu/driver.h354
-rw-r--r--src/emu/drivers/empty.c68
-rw-r--r--src/emu/drivers/empty.cpp76
-rw-r--r--src/emu/drivers/testcpu.cpp233
-rw-r--r--src/emu/drivers/xtal.h545
-rw-r--r--src/emu/eigccppc.h473
-rw-r--r--src/emu/eigccx86.h647
-rw-r--r--src/emu/eminline.h433
-rw-r--r--src/emu/emu.h104
-rw-r--r--src/emu/emu.mak248
-rw-r--r--src/emu/emucore.cpp39
-rw-r--r--src/emu/emucore.h377
-rw-r--r--src/emu/emufwd.h259
-rw-r--r--src/emu/emumem.cpp1125
-rw-r--r--src/emu/emumem.h2865
-rw-r--r--src/emu/emumem_aspace.cpp1283
-rw-r--r--src/emu/emumem_hea.h42
-rw-r--r--src/emu/emumem_hedp.cpp430
-rw-r--r--src/emu/emumem_hedp.h177
-rw-r--r--src/emu/emumem_hedr.h109
-rw-r--r--src/emu/emumem_hedr.ipp783
-rw-r--r--src/emu/emumem_hedr0.cpp124
-rw-r--r--src/emu/emumem_hedr1.cpp122
-rw-r--r--src/emu/emumem_hedr2.cpp122
-rw-r--r--src/emu/emumem_hedr3.cpp123
-rw-r--r--src/emu/emumem_hedw.h109
-rw-r--r--src/emu/emumem_hedw.ipp786
-rw-r--r--src/emu/emumem_hedw0.cpp126
-rw-r--r--src/emu/emumem_hedw1.cpp122
-rw-r--r--src/emu/emumem_hedw2.cpp122
-rw-r--r--src/emu/emumem_hedw3.cpp123
-rw-r--r--src/emu/emumem_hem.cpp231
-rw-r--r--src/emu/emumem_hem.h97
-rw-r--r--src/emu/emumem_hep.cpp79
-rw-r--r--src/emu/emumem_hep.h48
-rw-r--r--src/emu/emumem_het.cpp132
-rw-r--r--src/emu/emumem_het.h60
-rw-r--r--src/emu/emumem_heu.cpp409
-rw-r--r--src/emu/emumem_heu.h99
-rw-r--r--src/emu/emumem_heun.cpp224
-rw-r--r--src/emu/emumem_heun.h82
-rw-r--r--src/emu/emumem_hws.cpp311
-rw-r--r--src/emu/emumem_hws.h162
-rw-r--r--src/emu/emumem_mud.cpp124
-rw-r--r--src/emu/emumem_mud.h41
-rw-r--r--src/emu/emumem_mview.cpp1116
-rw-r--r--src/emu/emuopts.c226
-rw-r--r--src/emu/emuopts.cpp1334
-rw-r--r--src/emu/emuopts.h688
-rw-r--r--src/emu/emupal.c769
-rw-r--r--src/emu/emupal.cpp824
-rw-r--r--src/emu/emupal.h495
-rw-r--r--src/emu/fileio.c908
-rw-r--r--src/emu/fileio.cpp829
-rw-r--r--src/emu/fileio.h402
-rw-r--r--src/emu/gamedrv.h418
-rw-r--r--src/emu/hash.c713
-rw-r--r--src/emu/hash.h79
-rw-r--r--src/emu/hashfile.cpp103
-rw-r--r--src/emu/hashfile.h20
-rw-r--r--src/emu/http.cpp577
-rw-r--r--src/emu/http.h194
-rw-r--r--src/emu/image.cpp361
-rw-r--r--src/emu/image.h45
-rw-r--r--src/emu/info.c1055
-rw-r--r--src/emu/info.h28
-rw-r--r--src/emu/inptport.c4176
-rw-r--r--src/emu/inptport.h1040
-rw-r--r--src/emu/inpttype.h906
-rw-r--r--src/emu/inpttype.ipp1171
-rw-r--r--src/emu/input.c1810
-rw-r--r--src/emu/input.cpp1246
-rw-r--r--src/emu/input.h699
-rw-r--r--src/emu/inputdev.cpp1037
-rw-r--r--src/emu/inputdev.h403
-rw-r--r--src/emu/inputseq.c651
-rw-r--r--src/emu/inputseq.h205
-rw-r--r--src/emu/ioport.cpp4115
-rw-r--r--src/emu/ioport.h1464
-rw-r--r--src/emu/layout/README.md6
-rw-r--r--src/emu/layout/cyberlead.lay14
-rw-r--r--src/emu/layout/dualhovu.lay27
-rw-r--r--src/emu/layout/dualhsxs.lay27
-rw-r--r--src/emu/layout/dualhuov.lay27
-rw-r--r--src/emu/layout/ex800.lay10
-rw-r--r--src/emu/layout/exorterm155.lay77
-rw-r--r--src/emu/layout/generic.h38
-rw-r--r--src/emu/layout/h8_fp.lay276
-rw-r--r--src/emu/layout/ho20ffff.lay18
-rw-r--r--src/emu/layout/ho2eff2e.lay18
-rw-r--r--src/emu/layout/ho4f893d.lay21
-rw-r--r--src/emu/layout/ho88ffff.lay18
-rw-r--r--src/emu/layout/hoa0a0ff.lay18
-rw-r--r--src/emu/layout/hoffe457.lay18
-rw-r--r--src/emu/layout/hoffff20.lay18
-rw-r--r--src/emu/layout/horizont.lay24
-rw-r--r--src/emu/layout/hp9122c.lay33
-rw-r--r--src/emu/layout/ie15.lay129
-rw-r--r--src/emu/layout/lx800.lay92
-rw-r--r--src/emu/layout/monitors.lay41
-rw-r--r--src/emu/layout/nes_rob.lay64
-rw-r--r--src/emu/layout/noscreens.lay30
-rw-r--r--src/emu/layout/quadhsxs.lay65
-rw-r--r--src/emu/layout/qx10ascii.lay98
-rw-r--r--src/emu/layout/qx10hasci.lay86
-rw-r--r--src/emu/layout/smartboard.lay434
-rw-r--r--src/emu/layout/snap.lay50
-rw-r--r--src/emu/layout/teletex800.lay167
-rw-r--r--src/emu/layout/triphsxs.lay39
-rw-r--r--src/emu/layout/vertical.lay24
-rw-r--r--src/emu/layout/voffff20.lay18
-rw-r--r--src/emu/logmacro.h26
-rw-r--r--src/emu/machine.cpp1404
-rw-r--r--src/emu/machine.h411
-rw-r--r--src/emu/machine/53c810.c919
-rw-r--r--src/emu/machine/53c810.h27
-rw-r--r--src/emu/machine/6522via.c1160
-rw-r--r--src/emu/machine/6522via.h97
-rw-r--r--src/emu/machine/6526cia.c919
-rw-r--r--src/emu/machine/6526cia.h78
-rw-r--r--src/emu/machine/6532riot.c514
-rw-r--r--src/emu/machine/6532riot.h64
-rw-r--r--src/emu/machine/6821pia.c1336
-rw-r--r--src/emu/machine/6821pia.h125
-rw-r--r--src/emu/machine/6840ptm.c849
-rw-r--r--src/emu/machine/6840ptm.h64
-rw-r--r--src/emu/machine/6850acia.c846
-rw-r--r--src/emu/machine/6850acia.h75
-rw-r--r--src/emu/machine/68681.c634
-rw-r--r--src/emu/machine/68681.h26
-rw-r--r--src/emu/machine/74123.c241
-rw-r--r--src/emu/machine/74123.h88
-rw-r--r--src/emu/machine/74148.c202
-rw-r--r--src/emu/machine/74148.h63
-rw-r--r--src/emu/machine/74153.c167
-rw-r--r--src/emu/machine/74153.h58
-rw-r--r--src/emu/machine/74181.c165
-rw-r--r--src/emu/machine/74181.h40
-rw-r--r--src/emu/machine/7474.c171
-rw-r--r--src/emu/machine/7474.h63
-rw-r--r--src/emu/machine/8042kbdc.c622
-rw-r--r--src/emu/machine/8042kbdc.h41
-rw-r--r--src/emu/machine/8237dma.c646
-rw-r--r--src/emu/machine/8237dma.h66
-rw-r--r--src/emu/machine/8255ppi.c644
-rw-r--r--src/emu/machine/8255ppi.h71
-rw-r--r--src/emu/machine/8257dma.c421
-rw-r--r--src/emu/machine/8257dma.h52
-rw-r--r--src/emu/machine/adc083x.c517
-rw-r--r--src/emu/machine/adc083x.h86
-rw-r--r--src/emu/machine/adc1213x.c374
-rw-r--r--src/emu/machine/adc1213x.h64
-rw-r--r--src/emu/machine/am53cf96.c289
-rw-r--r--src/emu/machine/am53cf96.h25
-rw-r--r--src/emu/machine/at28c16.c233
-rw-r--r--src/emu/machine/at28c16.h33
-rw-r--r--src/emu/machine/cdp1852.c232
-rw-r--r--src/emu/machine/cdp1852.h81
-rw-r--r--src/emu/machine/cr589.c156
-rw-r--r--src/emu/machine/cr589.h3
-rw-r--r--src/emu/machine/ds1302.c229
-rw-r--r--src/emu/machine/ds1302.h34
-rw-r--r--src/emu/machine/ds2401.c259
-rw-r--r--src/emu/machine/ds2401.h18
-rw-r--r--src/emu/machine/ds2404.c320
-rw-r--r--src/emu/machine/ds2404.h18
-rw-r--r--src/emu/machine/eeprom.c376
-rw-r--r--src/emu/machine/eeprom.h42
-rw-r--r--src/emu/machine/eepromdev.c447
-rw-r--r--src/emu/machine/eepromdev.h69
-rw-r--r--src/emu/machine/f3853.c233
-rw-r--r--src/emu/machine/f3853.h44
-rw-r--r--src/emu/machine/generic.c785
-rw-r--r--src/emu/machine/generic.h190
-rw-r--r--src/emu/machine/i2cmem.c431
-rw-r--r--src/emu/machine/i2cmem.h27
-rw-r--r--src/emu/machine/i2cmemdev.c478
-rw-r--r--src/emu/machine/i2cmemdev.h43
-rw-r--r--src/emu/machine/i8243.c186
-rw-r--r--src/emu/machine/i8243.h59
-rw-r--r--src/emu/machine/i8255a.c858
-rw-r--r--src/emu/machine/i8255a.h87
-rw-r--r--src/emu/machine/idectrl.c1944
-rw-r--r--src/emu/machine/idectrl.h89
-rw-r--r--src/emu/machine/intelfsh.c494
-rw-r--r--src/emu/machine/intelfsh.h24
-rw-r--r--src/emu/machine/laserdsc.h228
-rw-r--r--src/emu/machine/latch8.c259
-rw-r--r--src/emu/machine/latch8.h144
-rw-r--r--src/emu/machine/ldcore.c1671
-rw-r--r--src/emu/machine/ldcore.h268
-rw-r--r--src/emu/machine/ldpr8210.c1270
-rw-r--r--src/emu/machine/ldv1000.c756
-rw-r--r--src/emu/machine/ldvp931.c780
-rw-r--r--src/emu/machine/mb3773.c116
-rw-r--r--src/emu/machine/mb3773.h32
-rw-r--r--src/emu/machine/mb87078.c169
-rw-r--r--src/emu/machine/mb87078.h103
-rw-r--r--src/emu/machine/mc146818.c408
-rw-r--r--src/emu/machine/mc146818.h55
-rw-r--r--src/emu/machine/microtch.c184
-rw-r--r--src/emu/machine/microtch.h12
-rw-r--r--src/emu/machine/msm6242.c203
-rw-r--r--src/emu/machine/msm6242.h29
-rw-r--r--src/emu/machine/pc16552d.c439
-rw-r--r--src/emu/machine/pc16552d.h12
-rw-r--r--src/emu/machine/pci.c267
-rw-r--r--src/emu/machine/pci.h71
-rw-r--r--src/emu/machine/pckeybrd.h35
-rw-r--r--src/emu/machine/pcshare.h11
-rw-r--r--src/emu/machine/pd4990a.c536
-rw-r--r--src/emu/machine/pd4990a.h38
-rw-r--r--src/emu/machine/pic8259.c450
-rw-r--r--src/emu/machine/pic8259.h42
-rw-r--r--src/emu/machine/pit8253.c1154
-rw-r--r--src/emu/machine/pit8253.h72
-rw-r--r--src/emu/machine/rescap.h20
-rw-r--r--src/emu/machine/roc10937.c407
-rw-r--r--src/emu/machine/roc10937.h34
-rw-r--r--src/emu/machine/rp5h01.c221
-rw-r--r--src/emu/machine/rp5h01.h47
-rw-r--r--src/emu/machine/rtc65271.c676
-rw-r--r--src/emu/machine/rtc65271.h13
-rw-r--r--src/emu/machine/scsi.c158
-rw-r--r--src/emu/machine/scsi.h112
-rw-r--r--src/emu/machine/scsicd.c774
-rw-r--r--src/emu/machine/scsicd.h17
-rw-r--r--src/emu/machine/scsidev.c159
-rw-r--r--src/emu/machine/scsidev.h15
-rw-r--r--src/emu/machine/scsihd.c317
-rw-r--r--src/emu/machine/scsihd.h16
-rw-r--r--src/emu/machine/smc91c9x.c636
-rw-r--r--src/emu/machine/smc91c9x.h58
-rw-r--r--src/emu/machine/timekpr.c531
-rw-r--r--src/emu/machine/timekpr.h54
-rw-r--r--src/emu/machine/tmp68301.c179
-rw-r--r--src/emu/machine/tmp68301.h16
-rw-r--r--src/emu/machine/upd4701.c316
-rw-r--r--src/emu/machine/upd4701.h43
-rw-r--r--src/emu/machine/wd33c93.c876
-rw-r--r--src/emu/machine/wd33c93.h27
-rw-r--r--src/emu/machine/x2212.c172
-rw-r--r--src/emu/machine/x2212.h29
-rw-r--r--src/emu/machine/x76f041.c616
-rw-r--r--src/emu/machine/x76f041.h22
-rw-r--r--src/emu/machine/x76f100.c490
-rw-r--r--src/emu/machine/x76f100.h22
-rw-r--r--src/emu/machine/z80ctc.c544
-rw-r--r--src/emu/machine/z80ctc.h85
-rw-r--r--src/emu/machine/z80dma.c509
-rw-r--r--src/emu/machine/z80dma.h44
-rw-r--r--src/emu/machine/z80pio.c622
-rw-r--r--src/emu/machine/z80pio.h113
-rw-r--r--src/emu/machine/z80sio.c839
-rw-r--r--src/emu/machine/z80sio.h75
-rw-r--r--src/emu/main.cpp40
-rw-r--r--src/emu/main.h102
-rw-r--r--src/emu/mame.c1876
-rw-r--r--src/emu/mame.h375
-rw-r--r--src/emu/mamecore.c17
-rw-r--r--src/emu/mamecore.h394
-rw-r--r--src/emu/mconfig.c333
-rw-r--r--src/emu/mconfig.cpp409
-rw-r--r--src/emu/mconfig.h609
-rw-r--r--src/emu/memarray.cpp188
-rw-r--r--src/emu/memarray.h119
-rw-r--r--src/emu/memconv.h1020
-rw-r--r--src/emu/memory.c4607
-rw-r--r--src/emu/memory.h1271
-rw-r--r--src/emu/natkeyboard.cpp1105
-rw-r--r--src/emu/natkeyboard.h136
-rw-r--r--src/emu/network.cpp99
-rw-r--r--src/emu/network.h33
-rw-r--r--src/emu/output.c406
-rw-r--r--src/emu/output.cpp270
-rw-r--r--src/emu/output.h282
-rw-r--r--src/emu/parameters.cpp27
-rw-r--r--src/emu/parameters.h48
-rw-r--r--src/emu/profiler.c208
-rw-r--r--src/emu/profiler.cpp234
-rw-r--r--src/emu/profiler.h298
-rw-r--r--src/emu/recording.cpp309
-rw-r--r--src/emu/recording.h89
-rw-r--r--src/emu/render.c3138
-rw-r--r--src/emu/render.cpp3738
-rw-r--r--src/emu/render.h949
-rw-r--r--src/emu/rendersw.c2395
-rw-r--r--src/emu/rendersw.hxx1768
-rw-r--r--src/emu/rendertypes.h163
-rw-r--r--src/emu/rendfont.c844
-rw-r--r--src/emu/rendfont.cpp1646
-rw-r--r--src/emu/rendfont.h118
-rw-r--r--src/emu/rendlay.c2127
-rw-r--r--src/emu/rendlay.cpp5476
-rw-r--r--src/emu/rendlay.h815
-rw-r--r--src/emu/rendutil.c772
-rw-r--r--src/emu/rendutil.cpp965
-rw-r--r--src/emu/rendutil.h146
-rw-r--r--src/emu/resampler.cpp615
-rw-r--r--src/emu/resampler.h69
-rw-r--r--src/emu/restrack.c373
-rw-r--r--src/emu/restrack.h97
-rw-r--r--src/emu/romentry.cpp78
-rw-r--r--src/emu/romentry.h235
-rw-r--r--src/emu/romload.c1410
-rw-r--r--src/emu/romload.cpp1644
-rw-r--r--src/emu/romload.h718
-rw-r--r--src/emu/save.cpp1009
-rw-r--r--src/emu/save.h418
-rw-r--r--src/emu/schedule.cpp998
-rw-r--r--src/emu/schedule.h187
-rw-r--r--src/emu/screen.cpp1976
-rw-r--r--src/emu/screen.h546
-rw-r--r--src/emu/sndintrf.h23
-rw-r--r--src/emu/softlist.cpp980
-rw-r--r--src/emu/softlist.h174
-rw-r--r--src/emu/softlist_dev.cpp617
-rw-r--r--src/emu/softlist_dev.h167
-rw-r--r--src/emu/sound.c1000
-rw-r--r--src/emu/sound.cpp2874
-rw-r--r--src/emu/sound.h802
-rw-r--r--src/emu/sound/2151intf.c144
-rw-r--r--src/emu/sound/2151intf.h23
-rw-r--r--src/emu/sound/2203intf.c211
-rw-r--r--src/emu/sound/2203intf.h28
-rw-r--r--src/emu/sound/2413intf.c145
-rw-r--r--src/emu/sound/2413intf.h14
-rw-r--r--src/emu/sound/2608intf.c236
-rw-r--r--src/emu/sound/2608intf.h33
-rw-r--r--src/emu/sound/2610intf.c261
-rw-r--r--src/emu/sound/2610intf.h36
-rw-r--r--src/emu/sound/2612intf.c202
-rw-r--r--src/emu/sound/2612intf.h56
-rw-r--r--src/emu/sound/262intf.c162
-rw-r--r--src/emu/sound/262intf.h27
-rw-r--r--src/emu/sound/3526intf.c170
-rw-r--r--src/emu/sound/3526intf.h23
-rw-r--r--src/emu/sound/3812intf.c171
-rw-r--r--src/emu/sound/3812intf.h23
-rw-r--r--src/emu/sound/5110intf.c373
-rw-r--r--src/emu/sound/5110intf.h41
-rw-r--r--src/emu/sound/5220intf.c290
-rw-r--r--src/emu/sound/5220intf.h36
-rw-r--r--src/emu/sound/8950intf.c205
-rw-r--r--src/emu/sound/8950intf.h28
-rw-r--r--src/emu/sound/aica.c1377
-rw-r--r--src/emu/sound/aica.h30
-rw-r--r--src/emu/sound/aicadsp.c352
-rw-r--r--src/emu/sound/aicadsp.h40
-rw-r--r--src/emu/sound/aicalfo.c159
-rw-r--r--src/emu/sound/astrocde.c334
-rw-r--r--src/emu/sound/astrocde.h11
-rw-r--r--src/emu/sound/ay8910.c1077
-rw-r--r--src/emu/sound/ay8910.h119
-rw-r--r--src/emu/sound/beep.c192
-rw-r--r--src/emu/sound/beep.h13
-rw-r--r--src/emu/sound/bsmt2000.c488
-rw-r--r--src/emu/sound/bsmt2000.h18
-rw-r--r--src/emu/sound/c140.c530
-rw-r--r--src/emu/sound/c140.h29
-rw-r--r--src/emu/sound/c352.c605
-rw-r--r--src/emu/sound/c352.h13
-rw-r--r--src/emu/sound/c6280.c376
-rw-r--r--src/emu/sound/c6280.h19
-rw-r--r--src/emu/sound/cdda.c323
-rw-r--r--src/emu/sound/cdda.h21
-rw-r--r--src/emu/sound/cdp1869.c929
-rw-r--r--src/emu/sound/cdp1869.h179
-rw-r--r--src/emu/sound/cem3394.c591
-rw-r--r--src/emu/sound/cem3394.h49
-rw-r--r--src/emu/sound/dac.c160
-rw-r--r--src/emu/sound/dac.h17
-rw-r--r--src/emu/sound/digitalk.c709
-rw-r--r--src/emu/sound/digitalk.h13
-rw-r--r--src/emu/sound/disc_dev.c1664
-rw-r--r--src/emu/sound/disc_flt.c1423
-rw-r--r--src/emu/sound/disc_inp.c275
-rw-r--r--src/emu/sound/disc_mth.c2032
-rw-r--r--src/emu/sound/disc_wav.c1749
-rw-r--r--src/emu/sound/discrete.c754
-rw-r--r--src/emu/sound/discrete.h4303
-rw-r--r--src/emu/sound/dmadac.c262
-rw-r--r--src/emu/sound/dmadac.h21
-rw-r--r--src/emu/sound/es5503.c534
-rw-r--r--src/emu/sound/es5503.h21
-rw-r--r--src/emu/sound/es5506.c2098
-rw-r--r--src/emu/sound/es5506.h48
-rw-r--r--src/emu/sound/es8712.c413
-rw-r--r--src/emu/sound/es8712.h17
-rw-r--r--src/emu/sound/filter.c232
-rw-r--r--src/emu/sound/filter.h120
-rw-r--r--src/emu/sound/flt_rc.c141
-rw-r--r--src/emu/sound/flt_rc.h64
-rw-r--r--src/emu/sound/flt_vol.c76
-rw-r--r--src/emu/sound/flt_vol.h11
-rw-r--r--src/emu/sound/fm.c4975
-rw-r--r--src/emu/sound/fm.h214
-rw-r--r--src/emu/sound/fmopl.c2610
-rw-r--r--src/emu/sound/fmopl.h113
-rw-r--r--src/emu/sound/gaelco.c347
-rw-r--r--src/emu/sound/gaelco.h24
-rw-r--r--src/emu/sound/hc55516.c348
-rw-r--r--src/emu/sound/hc55516.h24
-rw-r--r--src/emu/sound/ics2115.c566
-rw-r--r--src/emu/sound/ics2115.h17
-rw-r--r--src/emu/sound/iremga20.c297
-rw-r--r--src/emu/sound/iremga20.h17
-rw-r--r--src/emu/sound/k005289.c278
-rw-r--r--src/emu/sound/k005289.h16
-rw-r--r--src/emu/sound/k007232.c478
-rw-r--r--src/emu/sound/k007232.h34
-rw-r--r--src/emu/sound/k051649.c248
-rw-r--r--src/emu/sound/k051649.h17
-rw-r--r--src/emu/sound/k053260.c446
-rw-r--r--src/emu/sound/k053260.h25
-rw-r--r--src/emu/sound/k054539.c715
-rw-r--r--src/emu/sound/k054539.h49
-rw-r--r--src/emu/sound/msm5205.c330
-rw-r--r--src/emu/sound/msm5205.h42
-rw-r--r--src/emu/sound/msm5232.c841
-rw-r--r--src/emu/sound/msm5232.h20
-rw-r--r--src/emu/sound/multipcm.c705
-rw-r--r--src/emu/sound/multipcm.h14
-rw-r--r--src/emu/sound/n63701x.c189
-rw-r--r--src/emu/sound/n63701x.h11
-rw-r--r--src/emu/sound/namco.c881
-rw-r--r--src/emu/sound/namco.h43
-rw-r--r--src/emu/sound/nes_apu.c784
-rw-r--r--src/emu/sound/nes_apu.h51
-rw-r--r--src/emu/sound/nes_defs.h207
-rw-r--r--src/emu/sound/nile.c265
-rw-r--r--src/emu/sound/nile.h16
-rw-r--r--src/emu/sound/okim6258.c387
-rw-r--r--src/emu/sound/okim6258.h38
-rw-r--r--src/emu/sound/okim6295.c603
-rw-r--r--src/emu/sound/okim6295.h44
-rw-r--r--src/emu/sound/okim6376.c499
-rw-r--r--src/emu/sound/okim6376.h14
-rw-r--r--src/emu/sound/pokey.c1423
-rw-r--r--src/emu/sound/pokey.h97
-rw-r--r--src/emu/sound/psx.c735
-rw-r--r--src/emu/sound/psx.h33
-rw-r--r--src/emu/sound/qsound.c404
-rw-r--r--src/emu/sound/qsound.h20
-rw-r--r--src/emu/sound/rf5c400.c587
-rw-r--r--src/emu/sound/rf5c400.h14
-rw-r--r--src/emu/sound/rf5c68.c259
-rw-r--r--src/emu/sound/rf5c68.h19
-rw-r--r--src/emu/sound/s14001a.c645
-rw-r--r--src/emu/sound/s14001a.h16
-rw-r--r--src/emu/sound/saa1099.c470
-rw-r--r--src/emu/sound/saa1099.h16
-rw-r--r--src/emu/sound/samples.c542
-rw-r--r--src/emu/sound/samples.h48
-rw-r--r--src/emu/sound/scsp.c1380
-rw-r--r--src/emu/sound/scsp.h32
-rw-r--r--src/emu/sound/scspdsp.c356
-rw-r--r--src/emu/sound/scspdsp.h40
-rw-r--r--src/emu/sound/scsplfo.c160
-rw-r--r--src/emu/sound/segapcm.c157
-rw-r--r--src/emu/sound/segapcm.h29
-rw-r--r--src/emu/sound/sid.c363
-rw-r--r--src/emu/sound/sid.h67
-rw-r--r--src/emu/sound/sid6581.c123
-rw-r--r--src/emu/sound/sid6581.h38
-rw-r--r--src/emu/sound/side6581.h126
-rw-r--r--src/emu/sound/sidenvel.c590
-rw-r--r--src/emu/sound/sidenvel.h37
-rw-r--r--src/emu/sound/sidvoice.c810
-rw-r--r--src/emu/sound/sidvoice.h119
-rw-r--r--src/emu/sound/sidw6581.h1051
-rw-r--r--src/emu/sound/sn76477.c2490
-rw-r--r--src/emu/sound/sn76477.h130
-rw-r--r--src/emu/sound/sn76496.c488
-rw-r--r--src/emu/sound/sn76496.h23
-rw-r--r--src/emu/sound/snkwave.c190
-rw-r--r--src/emu/sound/snkwave.h11
-rw-r--r--src/emu/sound/sound.mak769
-rw-r--r--src/emu/sound/sp0250.c272
-rw-r--r--src/emu/sound/sp0250.h16
-rw-r--r--src/emu/sound/sp0256.c1371
-rw-r--r--src/emu/sound/sp0256.h71
-rw-r--r--src/emu/sound/speaker.c104
-rw-r--r--src/emu/sound/speaker.h36
-rw-r--r--src/emu/sound/st0016.c179
-rw-r--r--src/emu/sound/st0016.h18
-rw-r--r--src/emu/sound/t6w28.c396
-rw-r--r--src/emu/sound/t6w28.h12
-rw-r--r--src/emu/sound/tiaintf.c80
-rw-r--r--src/emu/sound/tiaintf.h11
-rw-r--r--src/emu/sound/tiasound.c596
-rw-r--r--src/emu/sound/tms3615.c123
-rw-r--r--src/emu/sound/tms3615.h14
-rw-r--r--src/emu/sound/tms36xx.c556
-rw-r--r--src/emu/sound/tms36xx.h32
-rw-r--r--src/emu/sound/tms5110.c961
-rw-r--r--src/emu/sound/tms5110.h47
-rw-r--r--src/emu/sound/tms5110r.c238
-rw-r--r--src/emu/sound/tms5220.c1198
-rw-r--r--src/emu/sound/tms5220.h35
-rw-r--r--src/emu/sound/tms5220r.c107
-rw-r--r--src/emu/sound/upd7759.c774
-rw-r--r--src/emu/sound/upd7759.h29
-rw-r--r--src/emu/sound/vlm5030.c726
-rw-r--r--src/emu/sound/vlm5030.h29
-rw-r--r--src/emu/sound/votrax.c188
-rw-r--r--src/emu/sound/votrax.h12
-rw-r--r--src/emu/sound/vrender0.c270
-rw-r--r--src/emu/sound/vrender0.h21
-rw-r--r--src/emu/sound/wave.c101
-rw-r--r--src/emu/sound/wave.h22
-rw-r--r--src/emu/sound/wavwrite.c200
-rw-r--r--src/emu/sound/wavwrite.h16
-rw-r--r--src/emu/sound/x1_010.c316
-rw-r--r--src/emu/sound/x1_010.h25
-rw-r--r--src/emu/sound/ym2151.c2495
-rw-r--r--src/emu/sound/ym2151.h89
-rw-r--r--src/emu/sound/ym2413.c2197
-rw-r--r--src/emu/sound/ym2413.h43
-rw-r--r--src/emu/sound/ymdeltat.c652
-rw-r--r--src/emu/sound/ymdeltat.h84
-rw-r--r--src/emu/sound/ymf262.c2724
-rw-r--r--src/emu/sound/ymf262.h48
-rw-r--r--src/emu/sound/ymf271.c1831
-rw-r--r--src/emu/sound/ymf271.h22
-rw-r--r--src/emu/sound/ymf278b.c741
-rw-r--r--src/emu/sound/ymf278b.h21
-rw-r--r--src/emu/sound/ymz280b.c976
-rw-r--r--src/emu/sound/ymz280b.h29
-rw-r--r--src/emu/speaker.cpp78
-rw-r--r--src/emu/speaker.h137
-rw-r--r--src/emu/state.c692
-rw-r--r--src/emu/state.h198
-rw-r--r--src/emu/streams.c988
-rw-r--r--src/emu/streams.h112
-rw-r--r--src/emu/tilemap.c2284
-rw-r--r--src/emu/tilemap.cpp1901
-rw-r--r--src/emu/tilemap.h917
-rw-r--r--src/emu/timer.c1299
-rw-r--r--src/emu/timer.h275
-rw-r--r--src/emu/tokenize.h258
-rw-r--r--src/emu/ui.c2017
-rw-r--r--src/emu/ui.h167
-rw-r--r--src/emu/ui/cmddata.h279
-rw-r--r--src/emu/ui/uimain.h65
-rw-r--r--src/emu/uigfx.c1080
-rw-r--r--src/emu/uigfx.h31
-rw-r--r--src/emu/uiinput.c290
-rw-r--r--src/emu/uiinput.cpp341
-rw-r--r--src/emu/uiinput.h242
-rw-r--r--src/emu/uimenu.c3791
-rw-r--r--src/emu/uimenu.h154
-rw-r--r--src/emu/uismall.pngbin1488 -> 0 bytes-rw-r--r--src/emu/validity.c1747
-rw-r--r--src/emu/validity.cpp3174
-rw-r--r--src/emu/validity.h118
-rw-r--r--src/emu/video.c2895
-rw-r--r--src/emu/video.cpp1277
-rw-r--r--src/emu/video.h414
-rw-r--r--src/emu/video/generic.c1111
-rw-r--r--src/emu/video/generic.cpp203
-rw-r--r--src/emu/video/generic.h198
-rw-r--r--src/emu/video/mc6845.c1066
-rw-r--r--src/emu/video/mc6845.h130
-rw-r--r--src/emu/video/poly.c1424
-rw-r--r--src/emu/video/poly.h158
-rw-r--r--src/emu/video/resnet.c723
-rw-r--r--src/emu/video/resnet.cpp705
-rw-r--r--src/emu/video/resnet.h167
-rw-r--r--src/emu/video/rgbgen.h396
-rw-r--r--src/emu/video/rgbsse.h350
-rw-r--r--src/emu/video/rgbutil.c302
-rw-r--r--src/emu/video/rgbutil.cpp305
-rw-r--r--src/emu/video/rgbutil.h438
-rw-r--r--src/emu/video/rgbvmx.h414
-rw-r--r--src/emu/video/s2636.c317
-rw-r--r--src/emu/video/s2636.h24
-rw-r--r--src/emu/video/tlc34076.c284
-rw-r--r--src/emu/video/tlc34076.h22
-rw-r--r--src/emu/video/tms34061.c553
-rw-r--r--src/emu/video/tms34061.h70
-rw-r--r--src/emu/video/tms9927.c364
-rw-r--r--src/emu/video/tms9927.h60
-rw-r--r--src/emu/video/tms9928a.c834
-rw-r--r--src/emu/video/tms9928a.h88
-rw-r--r--src/emu/video/v9938.c2593
-rw-r--r--src/emu/video/v9938.h39
-rw-r--r--src/emu/video/v9938mod.c736
-rw-r--r--src/emu/video/vector.c315
-rw-r--r--src/emu/video/vector.h30
-rw-r--r--src/emu/video/vooddefs.h3632
-rw-r--r--src/emu/video/voodoo.c5837
-rw-r--r--src/emu/video/voodoo.h118
-rw-r--r--src/emu/watchdog.c146
-rw-r--r--src/emu/watchdog.h28
-rw-r--r--src/emu/xtal.cpp620
-rw-r--r--src/emu/xtal.h93
-rw-r--r--src/frontend/mame/audit.cpp742
-rw-r--r--src/frontend/mame/audit.h177
-rw-r--r--src/frontend/mame/cheat.cpp1469
-rw-r--r--src/frontend/mame/cheat.h353
-rw-r--r--src/frontend/mame/clifront.cpp1873
-rw-r--r--src/frontend/mame/clifront.h86
-rw-r--r--src/frontend/mame/infoxml.cpp2308
-rw-r--r--src/frontend/mame/infoxml.h48
-rw-r--r--src/frontend/mame/iptseqpoll.cpp514
-rw-r--r--src/frontend/mame/iptseqpoll.h123
-rw-r--r--src/frontend/mame/language.cpp42
-rw-r--r--src/frontend/mame/language.h22
-rw-r--r--src/frontend/mame/luaengine.cpp2381
-rw-r--r--src/frontend/mame/luaengine.h215
-rw-r--r--src/frontend/mame/luaengine.ipp672
-rw-r--r--src/frontend/mame/luaengine_debug.cpp533
-rw-r--r--src/frontend/mame/luaengine_input.cpp673
-rw-r--r--src/frontend/mame/luaengine_mem.cpp802
-rw-r--r--src/frontend/mame/luaengine_render.cpp1276
-rw-r--r--src/frontend/mame/mame.cpp499
-rw-r--r--src/frontend/mame/mame.h106
-rw-r--r--src/frontend/mame/mameopts.cpp216
-rw-r--r--src/frontend/mame/mameopts.h63
-rw-r--r--src/frontend/mame/media_ident.cpp431
-rw-r--r--src/frontend/mame/media_ident.h132
-rw-r--r--src/frontend/mame/pluginopts.cpp184
-rw-r--r--src/frontend/mame/pluginopts.h53
-rw-r--r--src/frontend/mame/ui/about.cpp123
-rw-r--r--src/frontend/mame/ui/about.h45
-rw-r--r--src/frontend/mame/ui/analogipt.cpp812
-rw-r--r--src/frontend/mame/ui/analogipt.h115
-rw-r--r--src/frontend/mame/ui/audio_effect_compressor.cpp514
-rw-r--r--src/frontend/mame/ui/audio_effect_compressor.h74
-rw-r--r--src/frontend/mame/ui/audio_effect_eq.cpp526
-rw-r--r--src/frontend/mame/ui/audio_effect_eq.h59
-rw-r--r--src/frontend/mame/ui/audio_effect_filter.cpp512
-rw-r--r--src/frontend/mame/ui/audio_effect_filter.h61
-rw-r--r--src/frontend/mame/ui/audio_effect_reverb.cpp747
-rw-r--r--src/frontend/mame/ui/audio_effect_reverb.h92
-rw-r--r--src/frontend/mame/ui/audioeffects.cpp288
-rw-r--r--src/frontend/mame/ui/audioeffects.h53
-rw-r--r--src/frontend/mame/ui/audiomix.cpp1206
-rw-r--r--src/frontend/mame/ui/audiomix.h100
-rw-r--r--src/frontend/mame/ui/auditmenu.cpp256
-rw-r--r--src/frontend/mame/ui/auditmenu.h59
-rw-r--r--src/frontend/mame/ui/barcode.cpp148
-rw-r--r--src/frontend/mame/ui/barcode.h40
-rw-r--r--src/frontend/mame/ui/cheatopt.cpp177
-rw-r--r--src/frontend/mame/ui/cheatopt.h34
-rw-r--r--src/frontend/mame/ui/confswitch.cpp548
-rw-r--r--src/frontend/mame/ui/confswitch.h111
-rw-r--r--src/frontend/mame/ui/custui.cpp1120
-rw-r--r--src/frontend/mame/ui/custui.h190
-rw-r--r--src/frontend/mame/ui/datmenu.cpp440
-rw-r--r--src/frontend/mame/ui/datmenu.h80
-rw-r--r--src/frontend/mame/ui/defimg.ipp273
-rw-r--r--src/frontend/mame/ui/devctrl.h161
-rw-r--r--src/frontend/mame/ui/devopt.cpp408
-rw-r--r--src/frontend/mame/ui/devopt.h39
-rw-r--r--src/frontend/mame/ui/dirmenu.cpp619
-rw-r--r--src/frontend/mame/ui/dirmenu.h40
-rw-r--r--src/frontend/mame/ui/filecreate.cpp405
-rw-r--r--src/frontend/mame/ui/filecreate.h132
-rw-r--r--src/frontend/mame/ui/filemngr.cpp311
-rw-r--r--src/frontend/mame/ui/filemngr.h53
-rw-r--r--src/frontend/mame/ui/filesel.cpp709
-rw-r--r--src/frontend/mame/ui/filesel.h151
-rw-r--r--src/frontend/mame/ui/floppycntrl.cpp273
-rw-r--r--src/frontend/mame/ui/floppycntrl.h49
-rw-r--r--src/frontend/mame/ui/icorender.cpp345
-rw-r--r--src/frontend/mame/ui/icorender.h34
-rw-r--r--src/frontend/mame/ui/imgcntrl.cpp523
-rw-r--r--src/frontend/mame/ui/imgcntrl.h69
-rw-r--r--src/frontend/mame/ui/info.cpp831
-rw-r--r--src/frontend/mame/ui/info.h137
-rw-r--r--src/frontend/mame/ui/info_pty.cpp47
-rw-r--r--src/frontend/mame/ui/info_pty.h33
-rw-r--r--src/frontend/mame/ui/inifile.cpp598
-rw-r--r--src/frontend/mame/ui/inifile.h128
-rw-r--r--src/frontend/mame/ui/inputdevices.cpp310
-rw-r--r--src/frontend/mame/ui/inputdevices.h34
-rw-r--r--src/frontend/mame/ui/inputmap.cpp647
-rw-r--r--src/frontend/mame/ui/inputmap.h122
-rw-r--r--src/frontend/mame/ui/inputopts.cpp144
-rw-r--r--src/frontend/mame/ui/inputopts.h37
-rw-r--r--src/frontend/mame/ui/inputtoggle.cpp220
-rw-r--r--src/frontend/mame/ui/inputtoggle.h42
-rw-r--r--src/frontend/mame/ui/keyboard.cpp121
-rw-r--r--src/frontend/mame/ui/keyboard.h36
-rw-r--r--src/frontend/mame/ui/mainmenu.cpp347
-rw-r--r--src/frontend/mame/ui/mainmenu.h39
-rw-r--r--src/frontend/mame/ui/menu.cpp2227
-rw-r--r--src/frontend/mame/ui/menu.h624
-rw-r--r--src/frontend/mame/ui/menuitem.h69
-rw-r--r--src/frontend/mame/ui/midiinout.cpp78
-rw-r--r--src/frontend/mame/ui/midiinout.h48
-rw-r--r--src/frontend/mame/ui/miscmenu.cpp999
-rw-r--r--src/frontend/mame/ui/miscmenu.h183
-rw-r--r--src/frontend/mame/ui/moptions.cpp122
-rw-r--r--src/frontend/mame/ui/moptions.h164
-rw-r--r--src/frontend/mame/ui/optsmenu.cpp278
-rw-r--r--src/frontend/mame/ui/optsmenu.h85
-rw-r--r--src/frontend/mame/ui/pluginopt.cpp241
-rw-r--r--src/frontend/mame/ui/pluginopt.h61
-rw-r--r--src/frontend/mame/ui/prscntrl.cpp72
-rw-r--r--src/frontend/mame/ui/prscntrl.h45
-rw-r--r--src/frontend/mame/ui/quitmenu.cpp53
-rw-r--r--src/frontend/mame/ui/quitmenu.h33
-rw-r--r--src/frontend/mame/ui/selector.cpp197
-rw-r--r--src/frontend/mame/ui/selector.h64
-rw-r--r--src/frontend/mame/ui/selgame.cpp1075
-rw-r--r--src/frontend/mame/ui/selgame.h97
-rw-r--r--src/frontend/mame/ui/selmenu.cpp4321
-rw-r--r--src/frontend/mame/ui/selmenu.h479
-rw-r--r--src/frontend/mame/ui/selsoft.cpp768
-rw-r--r--src/frontend/mame/ui/selsoft.h80
-rw-r--r--src/frontend/mame/ui/simpleselgame.cpp472
-rw-r--r--src/frontend/mame/ui/simpleselgame.h71
-rw-r--r--src/frontend/mame/ui/slider.cpp20
-rw-r--r--src/frontend/mame/ui/slider.h44
-rw-r--r--src/frontend/mame/ui/sliders.cpp367
-rw-r--r--src/frontend/mame/ui/sliders.h43
-rw-r--r--src/frontend/mame/ui/slotopt.cpp336
-rw-r--r--src/frontend/mame/ui/slotopt.h58
-rw-r--r--src/frontend/mame/ui/sndmenu.cpp142
-rw-r--r--src/frontend/mame/ui/sndmenu.h51
-rw-r--r--src/frontend/mame/ui/state.cpp592
-rw-r--r--src/frontend/mame/ui/state.h114
-rw-r--r--src/frontend/mame/ui/submenu.cpp520
-rw-r--r--src/frontend/mame/ui/submenu.h76
-rw-r--r--src/frontend/mame/ui/swlist.cpp502
-rw-r--r--src/frontend/mame/ui/swlist.h139
-rw-r--r--src/frontend/mame/ui/systemlist.cpp422
-rw-r--r--src/frontend/mame/ui/systemlist.h122
-rw-r--r--src/frontend/mame/ui/tapectrl.cpp202
-rw-r--r--src/frontend/mame/ui/tapectrl.h41
-rw-r--r--src/frontend/mame/ui/text.cpp683
-rw-r--r--src/frontend/mame/ui/text.h120
-rw-r--r--src/frontend/mame/ui/textbox.cpp553
-rw-r--r--src/frontend/mame/ui/textbox.h100
-rw-r--r--src/frontend/mame/ui/toolbar.ipp75
-rw-r--r--src/frontend/mame/ui/ui.cpp2877
-rw-r--r--src/frontend/mame/ui/ui.h401
-rw-r--r--src/frontend/mame/ui/uicmd14.md4
-rw-r--r--src/frontend/mame/ui/uicmd14.pngbin0 -> 3254 bytes-rw-r--r--src/frontend/mame/ui/utils.cpp2178
-rw-r--r--src/frontend/mame/ui/utils.h488
-rw-r--r--src/frontend/mame/ui/videoopt.cpp449
-rw-r--r--src/frontend/mame/ui/videoopt.h50
-rw-r--r--src/frontend/mame/ui/viewgfx.cpp1620
-rw-r--r--src/frontend/mame/ui/viewgfx.h27
-rw-r--r--src/frontend/mame/ui/widgets.cpp113
-rw-r--r--src/frontend/mame/ui/widgets.h62
-rw-r--r--src/ldplayer/ldpdriv.c44
-rw-r--r--src/ldplayer/ldplayer.c630
-rw-r--r--src/ldplayer/ldplayer.mak55
-rw-r--r--src/lib/expat/ascii.h85
-rw-r--r--src/lib/expat/asciitab.h36
-rw-r--r--src/lib/expat/expat.h1013
-rw-r--r--src/lib/expat/expat_external.h115
-rw-r--r--src/lib/expat/iasciitab.h37
-rw-r--r--src/lib/expat/intconfig.h19
-rw-r--r--src/lib/expat/internal.h73
-rw-r--r--src/lib/expat/latin1tab.h36
-rw-r--r--src/lib/expat/nametab.h150
-rw-r--r--src/lib/expat/utf8tab.h37
-rw-r--r--src/lib/expat/xmlparse.c6258
-rw-r--r--src/lib/expat/xmlrole.c1320
-rw-r--r--src/lib/expat/xmlrole.h114
-rw-r--r--src/lib/expat/xmltok.c1629
-rw-r--r--src/lib/expat/xmltok.h316
-rw-r--r--src/lib/expat/xmltok_impl.c1779
-rw-r--r--src/lib/expat/xmltok_impl.h46
-rw-r--r--src/lib/expat/xmltok_ns.c106
-rw-r--r--src/lib/formats/2d_dsk.cpp41
-rw-r--r--src/lib/formats/2d_dsk.h32
-rw-r--r--src/lib/formats/86f_dsk.cpp268
-rw-r--r--src/lib/formats/86f_dsk.h35
-rw-r--r--src/lib/formats/a26_cas.cpp166
-rw-r--r--src/lib/formats/a26_cas.h17
-rw-r--r--src/lib/formats/a5105_dsk.cpp45
-rw-r--r--src/lib/formats/a5105_dsk.h32
-rw-r--r--src/lib/formats/abc1600_dsk.cpp79
-rw-r--r--src/lib/formats/abc1600_dsk.h35
-rw-r--r--src/lib/formats/abc800_dsk.cpp161
-rw-r--r--src/lib/formats/abc800_dsk.h35
-rw-r--r--src/lib/formats/abc800i_dsk.cpp122
-rw-r--r--src/lib/formats/abc800i_dsk.h37
-rw-r--r--src/lib/formats/abcfd2_dsk.cpp60
-rw-r--r--src/lib/formats/abcfd2_dsk.h32
-rw-r--r--src/lib/formats/ace_tap.cpp190
-rw-r--r--src/lib/formats/ace_tap.h31
-rw-r--r--src/lib/formats/acorn_dsk.cpp808
-rw-r--r--src/lib/formats/acorn_dsk.h161
-rw-r--r--src/lib/formats/adam_cas.cpp209
-rw-r--r--src/lib/formats/adam_cas.h19
-rw-r--r--src/lib/formats/adam_dsk.cpp363
-rw-r--r--src/lib/formats/adam_dsk.h28
-rw-r--r--src/lib/formats/afs_dsk.cpp61
-rw-r--r--src/lib/formats/afs_dsk.h36
-rw-r--r--src/lib/formats/agat840k_hle_dsk.cpp60
-rw-r--r--src/lib/formats/agat840k_hle_dsk.h18
-rw-r--r--src/lib/formats/aiffile.cpp173
-rw-r--r--src/lib/formats/aiffile.h11
-rw-r--r--src/lib/formats/aim_dsk.cpp136
-rw-r--r--src/lib/formats/aim_dsk.h35
-rw-r--r--src/lib/formats/all.cpp1567
-rw-r--r--src/lib/formats/all.h27
-rw-r--r--src/lib/formats/ami_dsk.cpp164
-rw-r--r--src/lib/formats/ami_dsk.h38
-rw-r--r--src/lib/formats/ap2_dsk.cpp991
-rw-r--r--src/lib/formats/ap2_dsk.h160
-rw-r--r--src/lib/formats/ap_dsk35.cpp535
-rw-r--r--src/lib/formats/ap_dsk35.h71
-rw-r--r--src/lib/formats/apd_dsk.cpp211
-rw-r--r--src/lib/formats/apd_dsk.h32
-rw-r--r--src/lib/formats/apf_apt.cpp250
-rw-r--r--src/lib/formats/apf_apt.h12
-rw-r--r--src/lib/formats/apollo_dsk.cpp48
-rw-r--r--src/lib/formats/apollo_dsk.h32
-rw-r--r--src/lib/formats/applix_dsk.cpp41
-rw-r--r--src/lib/formats/applix_dsk.h32
-rw-r--r--src/lib/formats/apricotpc_dsk.cpp50
-rw-r--r--src/lib/formats/apricotpc_dsk.h33
-rw-r--r--src/lib/formats/apridisk.cpp152
-rw-r--r--src/lib/formats/apridisk.h54
-rw-r--r--src/lib/formats/aquarius_caq.cpp101
-rw-r--r--src/lib/formats/aquarius_caq.h19
-rw-r--r--src/lib/formats/as_dsk.cpp613
-rw-r--r--src/lib/formats/as_dsk.h76
-rw-r--r--src/lib/formats/asst128_dsk.cpp41
-rw-r--r--src/lib/formats/asst128_dsk.h31
-rw-r--r--src/lib/formats/atari_dsk.cpp35
-rw-r--r--src/lib/formats/atari_dsk.h19
-rw-r--r--src/lib/formats/atom_dsk.cpp33
-rw-r--r--src/lib/formats/atom_dsk.h26
-rw-r--r--src/lib/formats/atom_tap.cpp134
-rw-r--r--src/lib/formats/atom_tap.h19
-rw-r--r--src/lib/formats/basicdsk.cpp354
-rw-r--r--src/lib/formats/basicdsk.h38
-rw-r--r--src/lib/formats/bk0010_dsk.cpp39
-rw-r--r--src/lib/formats/bk0010_dsk.h30
-rw-r--r--src/lib/formats/bw12_dsk.cpp58
-rw-r--r--src/lib/formats/bw12_dsk.h32
-rw-r--r--src/lib/formats/bw2_dsk.cpp44
-rw-r--r--src/lib/formats/bw2_dsk.h32
-rw-r--r--src/lib/formats/c3040_dsk.cpp99
-rw-r--r--src/lib/formats/c3040_dsk.h39
-rw-r--r--src/lib/formats/c4040_dsk.cpp89
-rw-r--r--src/lib/formats/c4040_dsk.h37
-rw-r--r--src/lib/formats/c8280_dsk.cpp69
-rw-r--r--src/lib/formats/c8280_dsk.h32
-rw-r--r--src/lib/formats/camplynx_cas.cpp262
-rw-r--r--src/lib/formats/camplynx_cas.h20
-rw-r--r--src/lib/formats/camplynx_dsk.cpp55
-rw-r--r--src/lib/formats/camplynx_dsk.h32
-rw-r--r--src/lib/formats/cassimg.cpp950
-rw-r--r--src/lib/formats/cassimg.h241
-rw-r--r--src/lib/formats/cbm_crt.cpp258
-rw-r--r--src/lib/formats/cbm_crt.h136
-rw-r--r--src/lib/formats/cbm_tap.cpp376
-rw-r--r--src/lib/formats/cbm_tap.h19
-rw-r--r--src/lib/formats/ccvf_dsk.cpp156
-rw-r--r--src/lib/formats/ccvf_dsk.h55
-rw-r--r--src/lib/formats/cgen_cas.cpp162
-rw-r--r--src/lib/formats/cgen_cas.h19
-rw-r--r--src/lib/formats/cgenie_dsk.cpp79
-rw-r--r--src/lib/formats/cgenie_dsk.h36
-rw-r--r--src/lib/formats/coco_cas.cpp296
-rw-r--r--src/lib/formats/coco_cas.h20
-rw-r--r--src/lib/formats/coco_rawdsk.cpp45
-rw-r--r--src/lib/formats/coco_rawdsk.h33
-rw-r--r--src/lib/formats/comx35_dsk.cpp77
-rw-r--r--src/lib/formats/comx35_dsk.h32
-rw-r--r--src/lib/formats/concept_dsk.cpp155
-rw-r--r--src/lib/formats/concept_dsk.h37
-rw-r--r--src/lib/formats/coupedsk.cpp129
-rw-r--r--src/lib/formats/coupedsk.h36
-rw-r--r--src/lib/formats/cp68_dsk.cpp296
-rw-r--r--src/lib/formats/cp68_dsk.h31
-rw-r--r--src/lib/formats/cpis_dsk.cpp57
-rw-r--r--src/lib/formats/cpis_dsk.h31
-rw-r--r--src/lib/formats/cqm_dsk.cpp372
-rw-r--r--src/lib/formats/cqm_dsk.h32
-rw-r--r--src/lib/formats/csw_cas.cpp231
-rw-r--r--src/lib/formats/csw_cas.h20
-rw-r--r--src/lib/formats/d64_dsk.cpp325
-rw-r--r--src/lib/formats/d64_dsk.h87
-rw-r--r--src/lib/formats/d71_dsk.cpp39
-rw-r--r--src/lib/formats/d71_dsk.h32
-rw-r--r--src/lib/formats/d80_dsk.cpp135
-rw-r--r--src/lib/formats/d80_dsk.h46
-rw-r--r--src/lib/formats/d81_dsk.cpp162
-rw-r--r--src/lib/formats/d81_dsk.h34
-rw-r--r--src/lib/formats/d82_dsk.cpp39
-rw-r--r--src/lib/formats/d82_dsk.h32
-rw-r--r--src/lib/formats/d88_dsk.cpp564
-rw-r--r--src/lib/formats/d88_dsk.h33
-rw-r--r--src/lib/formats/dcp_dsk.cpp305
-rw-r--r--src/lib/formats/dcp_dsk.h33
-rw-r--r--src/lib/formats/dfi_dsk.cpp241
-rw-r--r--src/lib/formats/dfi_dsk.h25
-rw-r--r--src/lib/formats/dim_dsk.cpp135
-rw-r--r--src/lib/formats/dim_dsk.h34
-rw-r--r--src/lib/formats/dip_dsk.cpp96
-rw-r--r--src/lib/formats/dip_dsk.h33
-rw-r--r--src/lib/formats/dmk_dsk.cpp349
-rw-r--r--src/lib/formats/dmk_dsk.h34
-rw-r--r--src/lib/formats/dmv_dsk.cpp53
-rw-r--r--src/lib/formats/dmv_dsk.h32
-rw-r--r--src/lib/formats/ds9_dsk.cpp122
-rw-r--r--src/lib/formats/ds9_dsk.h36
-rw-r--r--src/lib/formats/dsk_dsk.cpp499
-rw-r--r--src/lib/formats/dsk_dsk.h32
-rw-r--r--src/lib/formats/dvk_mx_dsk.cpp224
-rw-r--r--src/lib/formats/dvk_mx_dsk.h42
-rw-r--r--src/lib/formats/ep64_dsk.cpp41
-rw-r--r--src/lib/formats/ep64_dsk.h32
-rw-r--r--src/lib/formats/esq16_dsk.cpp154
-rw-r--r--src/lib/formats/esq16_dsk.h41
-rw-r--r--src/lib/formats/esq8_dsk.cpp191
-rw-r--r--src/lib/formats/esq8_dsk.h43
-rw-r--r--src/lib/formats/excali64_dsk.cpp41
-rw-r--r--src/lib/formats/excali64_dsk.h32
-rw-r--r--src/lib/formats/fc100_cas.cpp154
-rw-r--r--src/lib/formats/fc100_cas.h19
-rw-r--r--src/lib/formats/fdd_dsk.cpp150
-rw-r--r--src/lib/formats/fdd_dsk.h33
-rw-r--r--src/lib/formats/fdi_dsk.cpp292
-rw-r--r--src/lib/formats/fdos_dsk.cpp189
-rw-r--r--src/lib/formats/fdos_dsk.h30
-rw-r--r--src/lib/formats/fl1_dsk.cpp57
-rw-r--r--src/lib/formats/fl1_dsk.h32
-rw-r--r--src/lib/formats/flacfile.cpp152
-rw-r--r--src/lib/formats/flacfile.h10
-rw-r--r--src/lib/formats/flex_dsk.cpp1307
-rw-r--r--src/lib/formats/flex_dsk.h68
-rw-r--r--src/lib/formats/flopimg.cpp2385
-rw-r--r--src/lib/formats/flopimg.h677
-rw-r--r--src/lib/formats/flopimg_legacy.cpp877
-rw-r--r--src/lib/formats/flopimg_legacy.h214
-rw-r--r--src/lib/formats/fm7_cas.cpp113
-rw-r--r--src/lib/formats/fm7_cas.h15
-rw-r--r--src/lib/formats/fmsx_cas.cpp149
-rw-r--r--src/lib/formats/fmsx_cas.h19
-rw-r--r--src/lib/formats/fmtowns_dsk.cpp41
-rw-r--r--src/lib/formats/fmtowns_dsk.h30
-rw-r--r--src/lib/formats/fs_cbmdos.cpp862
-rw-r--r--src/lib/formats/fs_cbmdos.h44
-rw-r--r--src/lib/formats/fs_coco_os9.cpp788
-rw-r--r--src/lib/formats/fs_coco_os9.h47
-rw-r--r--src/lib/formats/fs_coco_rsdos.cpp807
-rw-r--r--src/lib/formats/fs_coco_rsdos.h43
-rw-r--r--src/lib/formats/fs_fat.cpp1378
-rw-r--r--src/lib/formats/fs_fat.h60
-rw-r--r--src/lib/formats/fs_hp98x5.cpp1588
-rw-r--r--src/lib/formats/fs_hp98x5.h88
-rw-r--r--src/lib/formats/fs_hplif.cpp541
-rw-r--r--src/lib/formats/fs_hplif.h43
-rw-r--r--src/lib/formats/fs_isis.cpp1052
-rw-r--r--src/lib/formats/fs_isis.h44
-rw-r--r--src/lib/formats/fs_oric_jasmin.cpp719
-rw-r--r--src/lib/formats/fs_oric_jasmin.h38
-rw-r--r--src/lib/formats/fs_prodos.cpp642
-rw-r--r--src/lib/formats/fs_prodos.h40
-rw-r--r--src/lib/formats/fs_unformatted.cpp158
-rw-r--r--src/lib/formats/fs_unformatted.h67
-rw-r--r--src/lib/formats/fs_vtech.cpp473
-rw-r--r--src/lib/formats/fs_vtech.h38
-rw-r--r--src/lib/formats/fsblk.cpp315
-rw-r--r--src/lib/formats/fsblk.h191
-rw-r--r--src/lib/formats/fsblk_vec.cpp54
-rw-r--r--src/lib/formats/fsblk_vec.h39
-rw-r--r--src/lib/formats/fsd_dsk.cpp192
-rw-r--r--src/lib/formats/fsd_dsk.h41
-rw-r--r--src/lib/formats/fsmeta.cpp131
-rw-r--r--src/lib/formats/fsmeta.h125
-rw-r--r--src/lib/formats/fsmgr.cpp80
-rw-r--r--src/lib/formats/fsmgr.h91
-rw-r--r--src/lib/formats/fz1_dsk.cpp40
-rw-r--r--src/lib/formats/fz1_dsk.h29
-rw-r--r--src/lib/formats/g64_dsk.cpp209
-rw-r--r--src/lib/formats/g64_dsk.h54
-rw-r--r--src/lib/formats/gtp_cas.cpp200
-rw-r--r--src/lib/formats/gtp_cas.h18
-rw-r--r--src/lib/formats/guab_dsk.cpp42
-rw-r--r--src/lib/formats/guab_dsk.h32
-rw-r--r--src/lib/formats/h17disk.cpp253
-rw-r--r--src/lib/formats/h17disk.h38
-rw-r--r--src/lib/formats/h8_cas.cpp96
-rw-r--r--src/lib/formats/h8_cas.h19
-rw-r--r--src/lib/formats/hect_dsk.cpp100
-rw-r--r--src/lib/formats/hect_dsk.h23
-rw-r--r--src/lib/formats/hect_tap.cpp308
-rw-r--r--src/lib/formats/hect_tap.h19
-rw-r--r--src/lib/formats/hector_minidisc.cpp41
-rw-r--r--src/lib/formats/hector_minidisc.h32
-rw-r--r--src/lib/formats/hp300_dsk.cpp48
-rw-r--r--src/lib/formats/hp300_dsk.h32
-rw-r--r--src/lib/formats/hp_ipc_dsk.cpp40
-rw-r--r--src/lib/formats/hp_ipc_dsk.h32
-rw-r--r--src/lib/formats/hpi_dsk.cpp493
-rw-r--r--src/lib/formats/hpi_dsk.h59
-rw-r--r--src/lib/formats/hti_tape.cpp526
-rw-r--r--src/lib/formats/hti_tape.h140
-rw-r--r--src/lib/formats/hxchfe_dsk.cpp876
-rw-r--r--src/lib/formats/hxchfe_dsk.h105
-rw-r--r--src/lib/formats/hxcmfm_dsk.cpp165
-rw-r--r--src/lib/formats/hxcmfm_dsk.h34
-rw-r--r--src/lib/formats/ibmxdf_dsk.cpp268
-rw-r--r--src/lib/formats/ibmxdf_dsk.h45
-rw-r--r--src/lib/formats/idpart_dsk.cpp53
-rw-r--r--src/lib/formats/idpart_dsk.h32
-rw-r--r--src/lib/formats/imageutl.cpp193
-rw-r--r--src/lib/formats/imageutl.h41
-rw-r--r--src/lib/formats/imd_dsk.cpp653
-rw-r--r--src/lib/formats/imd_dsk.h33
-rw-r--r--src/lib/formats/img_dsk.cpp439
-rw-r--r--src/lib/formats/img_dsk.h54
-rw-r--r--src/lib/formats/ipf_dsk.cpp767
-rw-r--r--src/lib/formats/ipf_dsk.h28
-rw-r--r--src/lib/formats/iq151_dsk.cpp45
-rw-r--r--src/lib/formats/iq151_dsk.h32
-rw-r--r--src/lib/formats/itt3030_dsk.cpp57
-rw-r--r--src/lib/formats/itt3030_dsk.h33
-rw-r--r--src/lib/formats/jfd_dsk.cpp378
-rw-r--r--src/lib/formats/jfd_dsk.h32
-rw-r--r--src/lib/formats/juku_dsk.cpp45
-rw-r--r--src/lib/formats/juku_dsk.h32
-rw-r--r--src/lib/formats/jvc_dsk.cpp308
-rw-r--r--src/lib/formats/jvc_dsk.h49
-rw-r--r--src/lib/formats/kaypro_dsk.cpp76
-rw-r--r--src/lib/formats/kaypro_dsk.h43
-rw-r--r--src/lib/formats/kc85_dsk.cpp61
-rw-r--r--src/lib/formats/kc85_dsk.h31
-rw-r--r--src/lib/formats/kc_cas.cpp391
-rw-r--r--src/lib/formats/kc_cas.h17
-rw-r--r--src/lib/formats/kim1_cas.cpp199
-rw-r--r--src/lib/formats/kim1_cas.h19
-rw-r--r--src/lib/formats/lviv_lvt.cpp147
-rw-r--r--src/lib/formats/lviv_lvt.h19
-rw-r--r--src/lib/formats/lw30_dsk.cpp207
-rw-r--r--src/lib/formats/lw30_dsk.h28
-rw-r--r--src/lib/formats/m20_dsk.cpp126
-rw-r--r--src/lib/formats/m20_dsk.h33
-rw-r--r--src/lib/formats/m5_dsk.cpp103
-rw-r--r--src/lib/formats/m5_dsk.h46
-rw-r--r--src/lib/formats/mbee_cas.cpp259
-rw-r--r--src/lib/formats/mbee_cas.h19
-rw-r--r--src/lib/formats/mdos_dsk.cpp300
-rw-r--r--src/lib/formats/mdos_dsk.h45
-rw-r--r--src/lib/formats/mfi_dsk.cpp299
-rw-r--r--src/lib/formats/mfi_dsk.h60
-rw-r--r--src/lib/formats/mfm_hd.cpp750
-rw-r--r--src/lib/formats/mfm_hd.h213
-rw-r--r--src/lib/formats/mm_dsk.cpp88
-rw-r--r--src/lib/formats/mm_dsk.h44
-rw-r--r--src/lib/formats/ms0515_dsk.cpp53
-rw-r--r--src/lib/formats/ms0515_dsk.h30
-rw-r--r--src/lib/formats/msx_dsk.cpp69
-rw-r--r--src/lib/formats/msx_dsk.h32
-rw-r--r--src/lib/formats/mtx_dsk.cpp53
-rw-r--r--src/lib/formats/mtx_dsk.h32
-rw-r--r--src/lib/formats/mz_cas.cpp428
-rw-r--r--src/lib/formats/mz_cas.h20
-rw-r--r--src/lib/formats/nabupc_dsk.cpp229
-rw-r--r--src/lib/formats/nabupc_dsk.h53
-rw-r--r--src/lib/formats/nanos_dsk.cpp46
-rw-r--r--src/lib/formats/nanos_dsk.h31
-rw-r--r--src/lib/formats/nascom_dsk.cpp53
-rw-r--r--src/lib/formats/nascom_dsk.h32
-rw-r--r--src/lib/formats/naslite_dsk.cpp53
-rw-r--r--src/lib/formats/naslite_dsk.h34
-rw-r--r--src/lib/formats/nes_dsk.cpp73
-rw-r--r--src/lib/formats/nes_dsk.h19
-rw-r--r--src/lib/formats/nfd_dsk.cpp286
-rw-r--r--src/lib/formats/nfd_dsk.h33
-rw-r--r--src/lib/formats/opd_dsk.cpp62
-rw-r--r--src/lib/formats/opd_dsk.h37
-rw-r--r--src/lib/formats/orao_cas.cpp130
-rw-r--r--src/lib/formats/orao_cas.h18
-rw-r--r--src/lib/formats/oric_dsk.cpp223
-rw-r--r--src/lib/formats/oric_dsk.h49
-rw-r--r--src/lib/formats/oric_tap.cpp521
-rw-r--r--src/lib/formats/oric_tap.h19
-rw-r--r--src/lib/formats/os9_dsk.cpp598
-rw-r--r--src/lib/formats/os9_dsk.h35
-rw-r--r--src/lib/formats/p2000t_cas.cpp322
-rw-r--r--src/lib/formats/p2000t_cas.h19
-rw-r--r--src/lib/formats/p6001_cas.cpp94
-rw-r--r--src/lib/formats/p6001_cas.h15
-rw-r--r--src/lib/formats/pasti_dsk.cpp607
-rw-r--r--src/lib/formats/pasti_dsk.h65
-rw-r--r--src/lib/formats/pc98_dsk.cpp94
-rw-r--r--src/lib/formats/pc98_dsk.h36
-rw-r--r--src/lib/formats/pc98fdi_dsk.cpp109
-rw-r--r--src/lib/formats/pc98fdi_dsk.h33
-rw-r--r--src/lib/formats/pc_dsk.cpp97
-rw-r--r--src/lib/formats/pc_dsk.h33
-rw-r--r--src/lib/formats/phc25_cas.cpp179
-rw-r--r--src/lib/formats/phc25_cas.h19
-rw-r--r--src/lib/formats/pk8020_dsk.cpp44
-rw-r--r--src/lib/formats/pk8020_dsk.h32
-rw-r--r--src/lib/formats/pmd_cas.cpp218
-rw-r--r--src/lib/formats/pmd_cas.h19
-rw-r--r--src/lib/formats/poly_dsk.cpp126
-rw-r--r--src/lib/formats/poly_dsk.h30
-rw-r--r--src/lib/formats/ppg_dsk.cpp65
-rw-r--r--src/lib/formats/ppg_dsk.h34
-rw-r--r--src/lib/formats/primoptp.cpp245
-rw-r--r--src/lib/formats/primoptp.h19
-rw-r--r--src/lib/formats/pyldin_dsk.cpp46
-rw-r--r--src/lib/formats/pyldin_dsk.h32
-rw-r--r--src/lib/formats/ql_dsk.cpp53
-rw-r--r--src/lib/formats/ql_dsk.h32
-rw-r--r--src/lib/formats/rc759_dsk.cpp41
-rw-r--r--src/lib/formats/rc759_dsk.h33
-rw-r--r--src/lib/formats/rk_cas.cpp312
-rw-r--r--src/lib/formats/rk_cas.h26
-rw-r--r--src/lib/formats/roland_dsk.cpp38
-rw-r--r--src/lib/formats/roland_dsk.h27
-rw-r--r--src/lib/formats/rpk.cpp474
-rw-r--r--src/lib/formats/rpk.h143
-rw-r--r--src/lib/formats/rx01_dsk.cpp37
-rw-r--r--src/lib/formats/rx01_dsk.h19
-rw-r--r--src/lib/formats/rx50_dsk.cpp235
-rw-r--r--src/lib/formats/rx50_dsk.h43
-rw-r--r--src/lib/formats/sap_dsk.cpp165
-rw-r--r--src/lib/formats/sap_dsk.h29
-rw-r--r--src/lib/formats/sc3000_bit.cpp103
-rw-r--r--src/lib/formats/sc3000_bit.h19
-rw-r--r--src/lib/formats/sdd_dsk.cpp64
-rw-r--r--src/lib/formats/sdd_dsk.h32
-rw-r--r--src/lib/formats/sdf_dsk.cpp190
-rw-r--r--src/lib/formats/sdf_dsk.h44
-rw-r--r--src/lib/formats/sf7000_dsk.cpp45
-rw-r--r--src/lib/formats/sf7000_dsk.h32
-rw-r--r--src/lib/formats/smx_dsk.cpp46
-rw-r--r--src/lib/formats/smx_dsk.h32
-rw-r--r--src/lib/formats/sol_cas.cpp385
-rw-r--r--src/lib/formats/sol_cas.h19
-rw-r--r--src/lib/formats/sorc_cas.cpp157
-rw-r--r--src/lib/formats/sorc_cas.h19
-rw-r--r--src/lib/formats/sorc_dsk.cpp157
-rw-r--r--src/lib/formats/sorc_dsk.h21
-rw-r--r--src/lib/formats/sord_cas.cpp136
-rw-r--r--src/lib/formats/sord_cas.h19
-rw-r--r--src/lib/formats/spc1000_cas.cpp192
-rw-r--r--src/lib/formats/spc1000_cas.h19
-rw-r--r--src/lib/formats/st_dsk.cpp328
-rw-r--r--src/lib/formats/st_dsk.h58
-rw-r--r--src/lib/formats/svi_cas.cpp213
-rw-r--r--src/lib/formats/svi_cas.h19
-rw-r--r--src/lib/formats/svi_dsk.cpp145
-rw-r--r--src/lib/formats/svi_dsk.h34
-rw-r--r--src/lib/formats/swd_dsk.cpp50
-rw-r--r--src/lib/formats/swd_dsk.h32
-rw-r--r--src/lib/formats/tandy2k_dsk.cpp40
-rw-r--r--src/lib/formats/tandy2k_dsk.h32
-rw-r--r--src/lib/formats/td0_dsk.cpp1056
-rw-r--r--src/lib/formats/td0_dsk.h26
-rw-r--r--src/lib/formats/thom_cas.cpp796
-rw-r--r--src/lib/formats/thom_cas.h25
-rw-r--r--src/lib/formats/thom_dsk.cpp107
-rw-r--r--src/lib/formats/thom_dsk.h44
-rw-r--r--src/lib/formats/ti99_dsk.cpp1522
-rw-r--r--src/lib/formats/ti99_dsk.h112
-rw-r--r--src/lib/formats/tibdd001_dsk.cpp40
-rw-r--r--src/lib/formats/tibdd001_dsk.h33
-rw-r--r--src/lib/formats/tiki100_dsk.cpp117
-rw-r--r--src/lib/formats/tiki100_dsk.h32
-rw-r--r--src/lib/formats/tim011_dsk.cpp45
-rw-r--r--src/lib/formats/tim011_dsk.h32
-rw-r--r--src/lib/formats/trd_dsk.cpp118
-rw-r--r--src/lib/formats/trd_dsk.h32
-rw-r--r--src/lib/formats/trs80_dsk.cpp459
-rw-r--r--src/lib/formats/trs80_dsk.h51
-rw-r--r--src/lib/formats/trs_cas.cpp270
-rw-r--r--src/lib/formats/trs_cas.h20
-rw-r--r--src/lib/formats/tvc_cas.cpp229
-rw-r--r--src/lib/formats/tvc_cas.h19
-rw-r--r--src/lib/formats/tvc_dsk.cpp46
-rw-r--r--src/lib/formats/tvc_dsk.h32
-rw-r--r--src/lib/formats/tzx_cas.cpp1083
-rw-r--r--src/lib/formats/tzx_cas.h23
-rw-r--r--src/lib/formats/uef_cas.cpp371
-rw-r--r--src/lib/formats/uef_cas.h19
-rw-r--r--src/lib/formats/uniflex_dsk.cpp159
-rw-r--r--src/lib/formats/uniflex_dsk.h32
-rw-r--r--src/lib/formats/upd765_dsk.cpp442
-rw-r--r--src/lib/formats/upd765_dsk.h60
-rw-r--r--src/lib/formats/vdk_dsk.cpp144
-rw-r--r--src/lib/formats/vdk_dsk.h41
-rw-r--r--src/lib/formats/vector06_dsk.cpp48
-rw-r--r--src/lib/formats/vector06_dsk.h32
-rw-r--r--src/lib/formats/vg5k_cas.cpp239
-rw-r--r--src/lib/formats/vg5k_cas.h17
-rw-r--r--src/lib/formats/vgi_dsk.cpp146
-rw-r--r--src/lib/formats/vgi_dsk.h34
-rw-r--r--src/lib/formats/victor9k_dsk.cpp508
-rw-r--r--src/lib/formats/victor9k_dsk.h66
-rw-r--r--src/lib/formats/vt_cas.cpp224
-rw-r--r--src/lib/formats/vt_cas.h20
-rw-r--r--src/lib/formats/vt_dsk.cpp420
-rw-r--r--src/lib/formats/vt_dsk.h58
-rw-r--r--src/lib/formats/wavfile.cpp253
-rw-r--r--src/lib/formats/wavfile.h17
-rw-r--r--src/lib/formats/wd177x_dsk.cpp533
-rw-r--r--src/lib/formats/wd177x_dsk.h65
-rw-r--r--src/lib/formats/wren_dsk.cpp43
-rw-r--r--src/lib/formats/wren_dsk.h34
-rw-r--r--src/lib/formats/x07_cas.cpp172
-rw-r--r--src/lib/formats/x07_cas.h19
-rw-r--r--src/lib/formats/x1_tap.cpp142
-rw-r--r--src/lib/formats/x1_tap.h17
-rw-r--r--src/lib/formats/xdf_dsk.cpp45
-rw-r--r--src/lib/formats/xdf_dsk.h32
-rw-r--r--src/lib/formats/zx81_p.cpp310
-rw-r--r--src/lib/formats/zx81_p.h21
-rw-r--r--src/lib/lib.mak94
-rw-r--r--src/lib/netlist/.clang-tidy14
-rw-r--r--src/lib/netlist/.gitignore28
-rw-r--r--src/lib/netlist/FAQ.md152
-rw-r--r--src/lib/netlist/adding_devices.md82
-rw-r--r--src/lib/netlist/analog/nld_bjt.cpp574
-rw-r--r--src/lib/netlist/analog/nld_generic_models.h383
-rw-r--r--src/lib/netlist/analog/nld_mosfet.cpp664
-rw-r--r--src/lib/netlist/analog/nld_opamps.cpp283
-rw-r--r--src/lib/netlist/analog/nld_switches.cpp125
-rw-r--r--src/lib/netlist/analog/nlid_fourterm.cpp129
-rw-r--r--src/lib/netlist/analog/nlid_fourterm.h260
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.cpp231
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.h686
-rw-r--r--src/lib/netlist/build/.clang-format114
-rw-r--r--src/lib/netlist/build/create_devinc.py126
-rw-r--r--src/lib/netlist/build/create_lib_entries.py56
-rw-r--r--src/lib/netlist/build/create_modules.py84
-rw-r--r--src/lib/netlist/build/cspell.json166
-rw-r--r--src/lib/netlist/build/doxygen.conf2428
-rw-r--r--src/lib/netlist/build/html/nltool.html366
-rw-r--r--src/lib/netlist/build/html/nlwav.html285
-rw-r--r--src/lib/netlist/build/makefile481
-rw-r--r--src/lib/netlist/build/man/nltool.1176
-rw-r--r--src/lib/netlist/build/man/nlwav.1116
-rw-r--r--src/lib/netlist/build/nltool.help2man5
-rw-r--r--src/lib/netlist/build/nlwav.help2man5
-rw-r--r--src/lib/netlist/buildVS/netlist.sln65
-rw-r--r--src/lib/netlist/buildVS/netlistlib.vcxproj345
-rw-r--r--src/lib/netlist/buildVS/netlistlib.vcxproj.filters534
-rw-r--r--src/lib/netlist/buildVS/nltool.vcxproj241
-rw-r--r--src/lib/netlist/buildVS/nltool.vcxproj.filters34
-rw-r--r--src/lib/netlist/buildVS/nlwav.vcxproj237
-rw-r--r--src/lib/netlist/buildVS/nlwav.vcxproj.filters22
-rw-r--r--src/lib/netlist/core/analog.h173
-rw-r--r--src/lib/netlist/core/base_objects.h317
-rw-r--r--src/lib/netlist/core/core_device.h203
-rw-r--r--src/lib/netlist/core/device.h116
-rw-r--r--src/lib/netlist/core/device_macros.h154
-rw-r--r--src/lib/netlist/core/devices.h166
-rw-r--r--src/lib/netlist/core/exec.h124
-rw-r--r--src/lib/netlist/core/logic.h212
-rw-r--r--src/lib/netlist/core/logic_family.h145
-rw-r--r--src/lib/netlist/core/netlist_state.h295
-rw-r--r--src/lib/netlist/core/nets.h401
-rw-r--r--src/lib/netlist/core/object_array.h251
-rw-r--r--src/lib/netlist/core/param.h367
-rw-r--r--src/lib/netlist/core/queue.h107
-rw-r--r--src/lib/netlist/core/setup.h377
-rw-r--r--src/lib/netlist/core/state_var.h214
-rw-r--r--src/lib/netlist/devices/net_lib.cpp33
-rw-r--r--src/lib/netlist/devices/net_lib.h35
-rw-r--r--src/lib/netlist/devices/nld_2102a.cpp91
-rw-r--r--src/lib/netlist/devices/nld_4006.cpp114
-rw-r--r--src/lib/netlist/devices/nld_4013.cpp122
-rw-r--r--src/lib/netlist/devices/nld_4017.cpp113
-rw-r--r--src/lib/netlist/devices/nld_4020.cpp118
-rw-r--r--src/lib/netlist/devices/nld_4029.cpp268
-rw-r--r--src/lib/netlist/devices/nld_4042.cpp116
-rw-r--r--src/lib/netlist/devices/nld_4053.cpp142
-rw-r--r--src/lib/netlist/devices/nld_4066.cpp83
-rw-r--r--src/lib/netlist/devices/nld_4076.cpp127
-rw-r--r--src/lib/netlist/devices/nld_4316.cpp70
-rw-r--r--src/lib/netlist/devices/nld_74107.cpp155
-rw-r--r--src/lib/netlist/devices/nld_74113.cpp142
-rw-r--r--src/lib/netlist/devices/nld_74123.cpp290
-rw-r--r--src/lib/netlist/devices/nld_74125.cpp77
-rw-r--r--src/lib/netlist/devices/nld_74153.cpp107
-rw-r--r--src/lib/netlist/devices/nld_74161.cpp26
-rw-r--r--src/lib/netlist/devices/nld_74163.cpp24
-rw-r--r--src/lib/netlist/devices/nld_74164.cpp116
-rw-r--r--src/lib/netlist/devices/nld_74165.cpp97
-rw-r--r--src/lib/netlist/devices/nld_74166.cpp120
-rw-r--r--src/lib/netlist/devices/nld_74174.cpp103
-rw-r--r--src/lib/netlist/devices/nld_74175.cpp115
-rw-r--r--src/lib/netlist/devices/nld_74192.cpp153
-rw-r--r--src/lib/netlist/devices/nld_74193.cpp137
-rw-r--r--src/lib/netlist/devices/nld_74194.cpp113
-rw-r--r--src/lib/netlist/devices/nld_74365.cpp71
-rw-r--r--src/lib/netlist/devices/nld_74377.cpp101
-rw-r--r--src/lib/netlist/devices/nld_74393.cpp88
-rw-r--r--src/lib/netlist/devices/nld_7448.cpp137
-rw-r--r--src/lib/netlist/devices/nld_7450.cpp90
-rw-r--r--src/lib/netlist/devices/nld_7473.cpp135
-rw-r--r--src/lib/netlist/devices/nld_7474.cpp117
-rw-r--r--src/lib/netlist/devices/nld_7475.cpp98
-rw-r--r--src/lib/netlist/devices/nld_7483.cpp112
-rw-r--r--src/lib/netlist/devices/nld_7485.cpp96
-rw-r--r--src/lib/netlist/devices/nld_7490.cpp143
-rw-r--r--src/lib/netlist/devices/nld_7492.cpp135
-rw-r--r--src/lib/netlist/devices/nld_7493.cpp133
-rw-r--r--src/lib/netlist/devices/nld_7497.cpp168
-rw-r--r--src/lib/netlist/devices/nld_74ls629.cpp207
-rw-r--r--src/lib/netlist/devices/nld_8277.cpp166
-rw-r--r--src/lib/netlist/devices/nld_82s115.cpp94
-rw-r--r--src/lib/netlist/devices/nld_82s16.cpp124
-rw-r--r--src/lib/netlist/devices/nld_9310.cpp24
-rw-r--r--src/lib/netlist/devices/nld_9316.cpp100
-rw-r--r--src/lib/netlist/devices/nld_9316_base.hxx155
-rw-r--r--src/lib/netlist/devices/nld_9321.cpp66
-rw-r--r--src/lib/netlist/devices/nld_9322.cpp109
-rw-r--r--src/lib/netlist/devices/nld_am2847.cpp129
-rw-r--r--src/lib/netlist/devices/nld_dm9314.cpp111
-rw-r--r--src/lib/netlist/devices/nld_dm9334.cpp178
-rw-r--r--src/lib/netlist/devices/nld_legacy.cpp97
-rw-r--r--src/lib/netlist/devices/nld_log.cpp192
-rw-r--r--src/lib/netlist/devices/nld_mm5837.cpp116
-rw-r--r--src/lib/netlist/devices/nld_ne555.cpp163
-rw-r--r--src/lib/netlist/devices/nld_r2r_dac.cpp94
-rw-r--r--src/lib/netlist/devices/nld_roms.cpp311
-rw-r--r--src/lib/netlist/devices/nld_schmitt.cpp122
-rw-r--r--src/lib/netlist/devices/nld_system.cpp197
-rw-r--r--src/lib/netlist/devices/nld_tms4800.cpp89
-rw-r--r--src/lib/netlist/devices/nld_tristate.cpp74
-rw-r--r--src/lib/netlist/devices/nlid_proxy.cpp184
-rw-r--r--src/lib/netlist/devices/nlid_proxy.h120
-rw-r--r--src/lib/netlist/devices/nlid_system.h594
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.cpp706
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.h31
-rw-r--r--src/lib/netlist/documentation/doc.css14
-rw-r--r--src/lib/netlist/documentation/mainpage.dox.h169
-rw-r--r--src/lib/netlist/documentation/primer_1.dox.h70
-rw-r--r--src/lib/netlist/documentation/structure.dox.h48
-rw-r--r--src/lib/netlist/documentation/test1-50r.svg1172
-rw-r--r--src/lib/netlist/examples/2n6027.cpp99
-rw-r--r--src/lib/netlist/examples/7400_astable.c36
-rw-r--r--src/lib/netlist/examples/74123_mstable.c48
-rw-r--r--src/lib/netlist/examples/74125.cpp43
-rw-r--r--src/lib/netlist/examples/7414.cpp34
-rw-r--r--src/lib/netlist/examples/9602_mstable.c54
-rw-r--r--src/lib/netlist/examples/bjt.c47
-rw-r--r--src/lib/netlist/examples/bjt_eb.c45
-rw-r--r--src/lib/netlist/examples/bjt_eb_pnp.c36
-rw-r--r--src/lib/netlist/examples/cccs.cpp40
-rw-r--r--src/lib/netlist/examples/cd4066.c47
-rw-r--r--src/lib/netlist/examples/cdelay.c55
-rw-r--r--src/lib/netlist/examples/cmos_inverter.cpp50
-rw-r--r--src/lib/netlist/examples/cmos_inverter_clk.cpp64
-rw-r--r--src/lib/netlist/examples/cmos_inverter_rs.cpp136
-rw-r--r--src/lib/netlist/examples/congo_bongo.cpp511
-rw-r--r--src/lib/netlist/examples/congo_bongo.csv21
-rw-r--r--src/lib/netlist/examples/cs.cpp28
-rw-r--r--src/lib/netlist/examples/diode.c32
-rw-r--r--src/lib/netlist/examples/lm3900_test.cpp104
-rw-r--r--src/lib/netlist/examples/lostfound.cpp218
-rw-r--r--src/lib/netlist/examples/mm5837_noise.c39
-rw-r--r--src/lib/netlist/examples/msx_mixer_stage.c66
-rw-r--r--src/lib/netlist/examples/ne555_astable.c54
-rw-r--r--src/lib/netlist/examples/ne566.cpp35
-rw-r--r--src/lib/netlist/examples/nld_74393_test.c27
-rw-r--r--src/lib/netlist/examples/nmos_fet.cpp55
-rw-r--r--src/lib/netlist/examples/noise.cpp37
-rw-r--r--src/lib/netlist/examples/norton_opamp.c129
-rw-r--r--src/lib/netlist/examples/opamp.c190
-rw-r--r--src/lib/netlist/examples/opamp_amplification_curve.cpp95
-rw-r--r--src/lib/netlist/examples/rc.c32
-rw-r--r--src/lib/netlist/examples/rl.c33
-rw-r--r--src/lib/netlist/examples/sn74ls629_osc.c36
-rw-r--r--src/lib/netlist/examples/test.c88
-rw-r--r--src/lib/netlist/examples/todo.c143
-rw-r--r--src/lib/netlist/examples/turkey_shoot.cpp214
-rw-r--r--src/lib/netlist/examples/turkey_shoot.csv256
-rw-r--r--src/lib/netlist/examples/vccs.c31
-rw-r--r--src/lib/netlist/examples/vccs1.c36
-rw-r--r--src/lib/netlist/examples/vs_cs.c53
-rw-r--r--src/lib/netlist/examples/zdiode.cpp46
-rw-r--r--src/lib/netlist/generated/lib_entries.hxx120
-rw-r--r--src/lib/netlist/generated/nld_devinc.h1753
-rw-r--r--src/lib/netlist/generated/nlm_modules_lib.cpp15
-rw-r--r--src/lib/netlist/generated/static_solvers.cpp83703
-rw-r--r--src/lib/netlist/macro/modules/nlmod_icl8038_dip.cpp62
-rw-r--r--src/lib/netlist/macro/modules/nlmod_ne556_dip.cpp25
-rw-r--r--src/lib/netlist/macro/modules/nlmod_rtest.cpp13
-rw-r--r--src/lib/netlist/macro/nlm_base_lib.cpp166
-rw-r--r--src/lib/netlist/macro/nlm_cd4xxx_lib.cpp978
-rw-r--r--src/lib/netlist/macro/nlm_opamp_lib.cpp685
-rw-r--r--src/lib/netlist/macro/nlm_otheric_lib.cpp209
-rw-r--r--src/lib/netlist/macro/nlm_roms_lib.cpp453
-rw-r--r--src/lib/netlist/macro/nlm_ttl74xx_lib.cpp3652
-rw-r--r--src/lib/netlist/netlist.cppcheck26
-rw-r--r--src/lib/netlist/nl_base.cpp1199
-rw-r--r--src/lib/netlist/nl_base.h23
-rw-r--r--src/lib/netlist/nl_config.h419
-rwxr-xr-xsrc/lib/netlist/nl_create_mame_solvers.sh24
-rw-r--r--src/lib/netlist/nl_dice_compat.h241
-rw-r--r--src/lib/netlist/nl_errstr.h245
-rw-r--r--src/lib/netlist/nl_factory.cpp99
-rw-r--r--src/lib/netlist/nl_factory.h234
-rw-r--r--src/lib/netlist/nl_interface.h248
-rw-r--r--src/lib/netlist/nl_parser.cpp588
-rw-r--r--src/lib/netlist/nl_parser.h119
-rw-r--r--src/lib/netlist/nl_setup.cpp1896
-rw-r--r--src/lib/netlist/nl_setup.h286
-rw-r--r--src/lib/netlist/nltypes.h313
-rw-r--r--src/lib/netlist/plib/gmres.h525
-rw-r--r--src/lib/netlist/plib/palloc.h808
-rw-r--r--src/lib/netlist/plib/parray.h183
-rw-r--r--src/lib/netlist/plib/pchrono.h278
-rw-r--r--src/lib/netlist/plib/pconfig.h175
-rw-r--r--src/lib/netlist/plib/pdynlib.cpp91
-rw-r--r--src/lib/netlist/plib/pdynlib.h131
-rw-r--r--src/lib/netlist/plib/penum.h55
-rw-r--r--src/lib/netlist/plib/pexception.cpp175
-rw-r--r--src/lib/netlist/plib/pexception.h134
-rw-r--r--src/lib/netlist/plib/pfmtlog.cpp150
-rw-r--r--src/lib/netlist/plib/pfmtlog.h483
-rw-r--r--src/lib/netlist/plib/pfunction.cpp487
-rw-r--r--src/lib/netlist/plib/pfunction.h181
-rw-r--r--src/lib/netlist/plib/pgsl.h181
-rw-r--r--src/lib/netlist/plib/plists.h323
-rw-r--r--src/lib/netlist/plib/pmain.cpp47
-rw-r--r--src/lib/netlist/plib/pmain.h71
-rw-r--r--src/lib/netlist/plib/pmath.h422
-rw-r--r--src/lib/netlist/plib/pmatrix2d.h248
-rw-r--r--src/lib/netlist/plib/pmatrix_cr.h648
-rw-r--r--src/lib/netlist/plib/pmempool.h223
-rw-r--r--src/lib/netlist/plib/pmulti_threading.h89
-rw-r--r--src/lib/netlist/plib/pomp.h76
-rw-r--r--src/lib/netlist/plib/poptions.cpp294
-rw-r--r--src/lib/netlist/plib/poptions.h274
-rw-r--r--src/lib/netlist/plib/ppmf.cpp109
-rw-r--r--src/lib/netlist/plib/ppmf.h587
-rw-r--r--src/lib/netlist/plib/ppreprocessor.cpp766
-rw-r--r--src/lib/netlist/plib/ppreprocessor.h127
-rw-r--r--src/lib/netlist/plib/prandom.h233
-rw-r--r--src/lib/netlist/plib/psource.h173
-rw-r--r--src/lib/netlist/plib/pstate.h227
-rw-r--r--src/lib/netlist/plib/pstonum.h145
-rw-r--r--src/lib/netlist/plib/pstream.h453
-rw-r--r--src/lib/netlist/plib/pstring.cpp121
-rw-r--r--src/lib/netlist/plib/pstring.h527
-rw-r--r--src/lib/netlist/plib/pstrutil.h358
-rw-r--r--src/lib/netlist/plib/ptests.h313
-rw-r--r--src/lib/netlist/plib/ptime.h229
-rw-r--r--src/lib/netlist/plib/ptimed_queue.h357
-rw-r--r--src/lib/netlist/plib/ptokenizer.cpp371
-rw-r--r--src/lib/netlist/plib/ptokenizer.h277
-rw-r--r--src/lib/netlist/plib/ptypes.h425
-rw-r--r--src/lib/netlist/plib/putil.cpp84
-rw-r--r--src/lib/netlist/plib/putil.h221
-rw-r--r--src/lib/netlist/plib/vector_ops.h159
-rw-r--r--src/lib/netlist/prg/nltool.cpp1438
-rw-r--r--src/lib/netlist/prg/nlwav.cpp856
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.cpp762
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h464
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver_ext.h288
-rw-r--r--src/lib/netlist/solver/nld_ms_direct.h202
-rw-r--r--src/lib/netlist/solver/nld_ms_direct1.h47
-rw-r--r--src/lib/netlist/solver/nld_ms_direct2.h54
-rw-r--r--src/lib/netlist/solver/nld_ms_direct_lu.h627
-rw-r--r--src/lib/netlist/solver/nld_ms_gcr.h387
-rw-r--r--src/lib/netlist/solver/nld_ms_gmres.h131
-rw-r--r--src/lib/netlist/solver/nld_ms_sm.h289
-rw-r--r--src/lib/netlist/solver/nld_ms_sor.h164
-rw-r--r--src/lib/netlist/solver/nld_ms_sor_mat.h157
-rw-r--r--src/lib/netlist/solver/nld_ms_w.h360
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp609
-rw-r--r--src/lib/netlist/solver/nld_solver.h91
-rw-r--r--src/lib/netlist/tests/test_penum.cpp254
-rw-r--r--src/lib/netlist/tests/test_pfunction.cpp60
-rw-r--r--src/lib/netlist/tests/test_pmfp.cpp77
-rw-r--r--src/lib/netlist/tests/test_pmfp_multibase.cpp451
-rw-r--r--src/lib/netlist/tests/test_precommit.cpp27
-rw-r--r--src/lib/netlist/tests/test_pstring.cpp19
-rw-r--r--src/lib/netlist/tools/nl_convert.cpp1139
-rw-r--r--src/lib/netlist/tools/nl_convert.h287
-rw-r--r--src/lib/util/abi.h117
-rw-r--r--src/lib/util/aes256cbc.cpp8
-rw-r--r--src/lib/util/aes256cbc.h28
-rw-r--r--src/lib/util/astring.c714
-rw-r--r--src/lib/util/astring.h247
-rw-r--r--src/lib/util/avcomp.c851
-rw-r--r--src/lib/util/avcomp.h95
-rw-r--r--src/lib/util/avhuff.cpp1066
-rw-r--r--src/lib/util/avhuff.h193
-rw-r--r--src/lib/util/aviio.c2869
-rw-r--r--src/lib/util/aviio.cpp3552
-rw-r--r--src/lib/util/aviio.h221
-rw-r--r--src/lib/util/base64.hpp167
-rw-r--r--src/lib/util/bitmap.c311
-rw-r--r--src/lib/util/bitmap.cpp470
-rw-r--r--src/lib/util/bitmap.h461
-rw-r--r--src/lib/util/bitstream.h281
-rw-r--r--src/lib/util/cdrom.c644
-rw-r--r--src/lib/util/cdrom.cpp3137
-rw-r--r--src/lib/util/cdrom.h412
-rw-r--r--src/lib/util/chd.c3058
-rw-r--r--src/lib/util/chd.cpp3514
-rw-r--r--src/lib/util/chd.h796
-rw-r--r--src/lib/util/chdcodec.cpp1986
-rw-r--r--src/lib/util/chdcodec.h177
-rw-r--r--src/lib/util/client_http.hpp442
-rw-r--r--src/lib/util/client_https.hpp152
-rw-r--r--src/lib/util/client_ws.hpp548
-rw-r--r--src/lib/util/client_wss.hpp82
-rw-r--r--src/lib/util/corealloc.cpp34
-rw-r--r--src/lib/util/corealloc.h49
-rw-r--r--src/lib/util/corefile.c1025
-rw-r--r--src/lib/util/corefile.cpp1040
-rw-r--r--src/lib/util/corefile.h137
-rw-r--r--src/lib/util/corestr.c121
-rw-r--r--src/lib/util/corestr.cpp314
-rw-r--r--src/lib/util/corestr.h66
-rw-r--r--src/lib/util/coretmpl.h723
-rw-r--r--src/lib/util/coreutil.c97
-rw-r--r--src/lib/util/coreutil.cpp56
-rw-r--r--src/lib/util/coreutil.h73
-rw-r--r--src/lib/util/crypto.hpp31
-rw-r--r--src/lib/util/delegate.cpp95
-rw-r--r--src/lib/util/delegate.h969
-rw-r--r--src/lib/util/disasmintf.cpp47
-rw-r--r--src/lib/util/disasmintf.h83
-rw-r--r--src/lib/util/dvdrom.cpp105
-rw-r--r--src/lib/util/dvdrom.h41
-rw-r--r--src/lib/util/dynamicclass.cpp229
-rw-r--r--src/lib/util/dynamicclass.h488
-rw-r--r--src/lib/util/dynamicclass.ipp505
-rw-r--r--src/lib/util/endianness.h161
-rw-r--r--src/lib/util/flac.cpp734
-rw-r--r--src/lib/util/flac.h153
-rw-r--r--src/lib/util/harddisk.c172
-rw-r--r--src/lib/util/harddisk.cpp221
-rw-r--r--src/lib/util/harddisk.h65
-rw-r--r--src/lib/util/hash.cpp449
-rw-r--r--src/lib/util/hash.h118
-rw-r--r--src/lib/util/hashing.cpp512
-rw-r--r--src/lib/util/hashing.h314
-rw-r--r--src/lib/util/huffman.c1665
-rw-r--r--src/lib/util/huffman.cpp761
-rw-r--r--src/lib/util/huffman.h227
-rw-r--r--src/lib/util/ioprocs.cpp991
-rw-r--r--src/lib/util/ioprocs.h377
-rw-r--r--src/lib/util/ioprocsfill.h190
-rw-r--r--src/lib/util/ioprocsfilter.cpp792
-rw-r--r--src/lib/util/ioprocsfilter.h283
-rw-r--r--src/lib/util/ioprocsvec.h212
-rw-r--r--src/lib/util/jedparse.c435
-rw-r--r--src/lib/util/jedparse.cpp509
-rw-r--r--src/lib/util/jedparse.h43
-rw-r--r--src/lib/util/language.cpp220
-rw-r--r--src/lib/util/language.h57
-rw-r--r--src/lib/util/lrucache.h408
-rw-r--r--src/lib/util/md5.c239
-rw-r--r--src/lib/util/md5.cpp251
-rw-r--r--src/lib/util/md5.h3
-rw-r--r--src/lib/util/mfpresolve.cpp431
-rw-r--r--src/lib/util/mfpresolve.h151
-rw-r--r--src/lib/util/msdib.cpp673
-rw-r--r--src/lib/util/msdib.h45
-rw-r--r--src/lib/util/multibyte.h301
-rw-r--r--src/lib/util/nanosvg.cpp10
-rw-r--r--src/lib/util/nanosvg.h33
-rw-r--r--src/lib/util/notifier.h240
-rw-r--r--src/lib/util/opresolv.cpp484
-rw-r--r--src/lib/util/opresolv.h277
-rw-r--r--src/lib/util/options.c1133
-rw-r--r--src/lib/util/options.cpp1425
-rw-r--r--src/lib/util/options.h457
-rw-r--r--src/lib/util/palette.c758
-rw-r--r--src/lib/util/palette.cpp569
-rw-r--r--src/lib/util/palette.h484
-rw-r--r--src/lib/util/path.cpp82
-rw-r--r--src/lib/util/path.h100
-rw-r--r--src/lib/util/path_to_regex.cpp217
-rw-r--r--src/lib/util/path_to_regex.hpp110
-rw-r--r--src/lib/util/plaparse.cpp384
-rw-r--r--src/lib/util/plaparse.h26
-rw-r--r--src/lib/util/png.c1145
-rw-r--r--src/lib/util/png.cpp1350
-rw-r--r--src/lib/util/png.h173
-rw-r--r--src/lib/util/pool.c624
-rw-r--r--src/lib/util/pool.h117
-rw-r--r--src/lib/util/server_http.hpp67
-rw-r--r--src/lib/util/server_http_impl.hpp482
-rw-r--r--src/lib/util/server_https.hpp99
-rw-r--r--src/lib/util/server_ws.hpp49
-rw-r--r--src/lib/util/server_ws_impl.hpp718
-rw-r--r--src/lib/util/server_wss.hpp82
-rw-r--r--src/lib/util/sha1.c387
-rw-r--r--src/lib/util/sha1.h61
-rw-r--r--src/lib/util/simh_tape_file.cpp622
-rw-r--r--src/lib/util/simh_tape_file.h65
-rw-r--r--src/lib/util/strformat.cpp138
-rw-r--r--src/lib/util/strformat.h1946
-rw-r--r--src/lib/util/tape_file_interface.h58
-rw-r--r--src/lib/util/timeconv.cpp101
-rw-r--r--src/lib/util/timeconv.h336
-rw-r--r--src/lib/util/un7z.cpp688
-rw-r--r--src/lib/util/unicode.c346
-rw-r--r--src/lib/util/unicode.cpp588
-rw-r--r--src/lib/util/unicode.h97
-rw-r--r--src/lib/util/unzip.c616
-rw-r--r--src/lib/util/unzip.cpp1735
-rw-r--r--src/lib/util/unzip.h167
-rw-r--r--src/lib/util/utf8.h20
-rw-r--r--src/lib/util/utilfwd.h52
-rw-r--r--src/lib/util/vbiparse.c378
-rw-r--r--src/lib/util/vbiparse.cpp402
-rw-r--r--src/lib/util/vbiparse.h79
-rw-r--r--src/lib/util/vecstream.cpp22
-rw-r--r--src/lib/util/vecstream.h408
-rw-r--r--src/lib/util/wavwrite.cpp195
-rw-r--r--src/lib/util/wavwrite.h39
-rw-r--r--src/lib/util/xmlfile.c912
-rw-r--r--src/lib/util/xmlfile.cpp1003
-rw-r--r--src/lib/util/xmlfile.h276
-rw-r--r--src/lib/util/zippath.cpp796
-rw-r--r--src/lib/util/zippath.h71
-rw-r--r--src/lib/zlib/Makefile154
-rw-r--r--src/lib/zlib/Makefile.in154
-rw-r--r--src/lib/zlib/adler32.c149
-rw-r--r--src/lib/zlib/compress.c79
-rw-r--r--src/lib/zlib/crc32.c423
-rw-r--r--src/lib/zlib/crc32.h441
-rw-r--r--src/lib/zlib/deflate.c1736
-rw-r--r--src/lib/zlib/deflate.h331
-rw-r--r--src/lib/zlib/example.c565
-rw-r--r--src/lib/zlib/gzio.c1026
-rw-r--r--src/lib/zlib/inffast.c318
-rw-r--r--src/lib/zlib/inffast.h11
-rw-r--r--src/lib/zlib/inflate.c1368
-rw-r--r--src/lib/zlib/inftrees.h55
-rw-r--r--src/lib/zlib/minigzip.c322
-rw-r--r--src/lib/zlib/readme125
-rw-r--r--src/lib/zlib/trees.c1219
-rw-r--r--src/lib/zlib/uncompr.c61
-rw-r--r--src/lib/zlib/zconf.h332
-rw-r--r--src/lib/zlib/zconf.in.h332
-rw-r--r--src/lib/zlib/zlib.h1357
-rw-r--r--src/lib/zlib/zutil.c318
-rw-r--r--src/lib/zlib/zutil.h269
-rw-r--r--src/mame/access/acvirus.cpp850
-rw-r--r--src/mame/acorn/aa310.cpp2073
-rw-r--r--src/mame/acorn/accomm.cpp614
-rw-r--r--src/mame/acorn/acorn_serproc.cpp324
-rw-r--r--src/mame/acorn/acorn_serproc.h117
-rw-r--r--src/mame/acorn/acrnsys.cpp418
-rw-r--r--src/mame/acorn/acrnsys1.cpp306
-rw-r--r--src/mame/acorn/acrnsys_kbd.cpp299
-rw-r--r--src/mame/acorn/acrnsys_kbd.h74
-rw-r--r--src/mame/acorn/aristmk5.cpp9563
-rw-r--r--src/mame/acorn/atom.cpp1361
-rw-r--r--src/mame/acorn/bbc.h209
-rw-r--r--src/mame/acorn/bbc_kbd.cpp1013
-rw-r--r--src/mame/acorn/bbc_kbd.h195
-rw-r--r--src/mame/acorn/bbc_m.cpp385
-rw-r--r--src/mame/acorn/bbc_v.cpp426
-rw-r--r--src/mame/acorn/bbcb.cpp1003
-rw-r--r--src/mame/acorn/bbcbp.cpp934
-rw-r--r--src/mame/acorn/bbcm.cpp1477
-rw-r--r--src/mame/acorn/bbcmc.cpp813
-rw-r--r--src/mame/acorn/belatra.cpp230
-rw-r--r--src/mame/acorn/cms.cpp203
-rw-r--r--src/mame/acorn/electron.cpp775
-rw-r--r--src/mame/acorn/electron_ula.cpp657
-rw-r--r--src/mame/acorn/electron_ula.h144
-rw-r--r--src/mame/acorn/ertictac.cpp356
-rw-r--r--src/mame/acorn/eurocube.cpp482
-rw-r--r--src/mame/acorn/reutapm.cpp426
-rw-r--r--src/mame/acorn/riscpc.cpp342
-rw-r--r--src/mame/acorn/ssfindo.cpp763
-rw-r--r--src/mame/act/apricot.cpp523
-rw-r--r--src/mame/act/apricotf.cpp484
-rw-r--r--src/mame/act/apricotkb.cpp373
-rw-r--r--src/mame/act/apricotkb.h75
-rw-r--r--src/mame/act/apricotp.cpp673
-rw-r--r--src/mame/act/apxen.cpp583
-rw-r--r--src/mame/act/victor9k.cpp903
-rw-r--r--src/mame/act/victor9k_fdc.cpp1419
-rw-r--r--src/mame/act/victor9k_fdc.h217
-rw-r--r--src/mame/act/victor9k_hdc.cpp300
-rw-r--r--src/mame/act/victor9k_hdc.h112
-rw-r--r--src/mame/act/victor9k_kb.cpp666
-rw-r--r--src/mame/act/victor9k_kb.h69
-rw-r--r--src/mame/adc/super6.cpp545
-rw-r--r--src/mame/adc/super6.h91
-rw-r--r--src/mame/adc/superslave.cpp455
-rw-r--r--src/mame/adds/4000_260.cpp991
-rw-r--r--src/mame/adds/adds2020.cpp144
-rw-r--r--src/mame/adds/multivision.cpp548
-rw-r--r--src/mame/adds/vp60.cpp136
-rw-r--r--src/mame/adp/adp.cpp817
-rw-r--r--src/mame/adp/manohman.cpp349
-rw-r--r--src/mame/adp/servicetastatur.cpp321
-rw-r--r--src/mame/adp/stella8085.cpp916
-rw-r--r--src/mame/adp/stellafr.cpp686
-rw-r--r--src/mame/agat/agat.cpp1380
-rw-r--r--src/mame/agat/agat7.cpp348
-rw-r--r--src/mame/agat/agat7.h78
-rw-r--r--src/mame/agat/agat9.cpp681
-rw-r--r--src/mame/agat/agat9.h96
-rw-r--r--src/mame/agat/agatkeyb.cpp282
-rw-r--r--src/mame/agat/agatkeyb.h70
-rw-r--r--src/mame/akai/akaiax80.cpp141
-rw-r--r--src/mame/akai/akaivx600.cpp88
-rw-r--r--src/mame/akai/mpc2000.cpp869
-rw-r--r--src/mame/akai/mpc3000.cpp715
-rw-r--r--src/mame/akai/mpc60.cpp777
-rw-r--r--src/mame/akai/s3000.cpp1058
-rw-r--r--src/mame/alesis/alesis.cpp544
-rw-r--r--src/mame/alesis/alesis.h234
-rw-r--r--src/mame/alesis/alesis_a.cpp161
-rw-r--r--src/mame/alesis/alesis_v.cpp167
-rw-r--r--src/mame/alesis/midiverb.cpp610
-rw-r--r--src/mame/alesis/qs.cpp105
-rw-r--r--src/mame/alliedleisure/ace.cpp390
-rw-r--r--src/mame/alliedleisure/aleisttl.cpp140
-rw-r--r--src/mame/alliedleisure/aztarac.cpp431
-rw-r--r--src/mame/alliedleisure/clayshoo.cpp352
-rw-r--r--src/mame/alliedleisure/killcom.cpp1340
-rw-r--r--src/mame/alliedleisure/killcom.h92
-rw-r--r--src/mame/alliedleisure/trvquest.cpp279
-rw-r--r--src/mame/alpha/ad_sound.cpp517
-rw-r--r--src/mame/alpha/ad_sound.h131
-rw-r--r--src/mame/alpha/alpha68k.cpp2200
-rw-r--r--src/mame/alpha/alpha68k.h446
-rw-r--r--src/mame/alpha/alpha68k_i.cpp574
-rw-r--r--src/mame/alpha/alpha68k_n.cpp1067
-rw-r--r--src/mame/alpha/alpha68k_v.cpp125
-rw-r--r--src/mame/alpha/alpha8201.cpp428
-rw-r--r--src/mame/alpha/alpha8201.h55
-rw-r--r--src/mame/alpha/champbas.cpp1720
-rw-r--r--src/mame/alpha/equites.cpp1478
-rw-r--r--src/mame/alpha/meijinsn.cpp456
-rw-r--r--src/mame/alpha/shougi.cpp466
-rw-r--r--src/mame/alpha/splendor.cpp992
-rw-r--r--src/mame/altos/acs8600_ics.cpp203
-rw-r--r--src/mame/altos/acs8600_ics.h46
-rw-r--r--src/mame/altos/altos2.cpp193
-rw-r--r--src/mame/altos/altos2_kbd.cpp259
-rw-r--r--src/mame/altos/altos2_kbd.h71
-rw-r--r--src/mame/altos/altos486.cpp246
-rw-r--r--src/mame/altos/altos5.cpp468
-rw-r--r--src/mame/altos/altos586.cpp774
-rw-r--r--src/mame/altos/altos586_hdc.cpp381
-rw-r--r--src/mame/altos/altos586_hdc.h85
-rw-r--r--src/mame/altos/altos8600.cpp820
-rw-r--r--src/mame/amcoe/au1250.cpp122
-rw-r--r--src/mame/amcoe/sfbonus.cpp6486
-rw-r--r--src/mame/amiga/agnus_copper.cpp421
-rw-r--r--src/mame/amiga/agnus_copper.h82
-rw-r--r--src/mame/amiga/akiko.cpp892
-rw-r--r--src/mame/amiga/akiko.h133
-rw-r--r--src/mame/amiga/alg.cpp975
-rw-r--r--src/mame/amiga/amiga.cpp2926
-rw-r--r--src/mame/amiga/amiga.h744
-rw-r--r--src/mame/amiga/amiga_m.cpp1916
-rw-r--r--src/mame/amiga/amiga_v.cpp979
-rw-r--r--src/mame/amiga/amigaaga.cpp1062
-rw-r--r--src/mame/amiga/amigaaga.h8
-rw-r--r--src/mame/amiga/arsystems.cpp1050
-rw-r--r--src/mame/amiga/cubo.cpp1450
-rw-r--r--src/mame/amiga/gayle.cpp427
-rw-r--r--src/mame/amiga/gayle.h158
-rw-r--r--src/mame/amiga/mquake.cpp488
-rw-r--r--src/mame/amiga/paula.cpp412
-rw-r--r--src/mame/amiga/paula.h120
-rw-r--r--src/mame/amiga/paulafdc.cpp702
-rw-r--r--src/mame/amiga/paulafdc.h130
-rw-r--r--src/mame/amiga/upscope.cpp384
-rw-r--r--src/mame/amirix/wxstar4000.cpp293
-rw-r--r--src/mame/ampex/ampex.cpp408
-rw-r--r--src/mame/ampex/ampex210.cpp247
-rw-r--r--src/mame/ampex/ampex210_kbd.cpp250
-rw-r--r--src/mame/ampex/ampex210_kbd.h51
-rw-r--r--src/mame/ampro/ampro.cpp279
-rw-r--r--src/mame/ampro/lb186.cpp166
-rw-r--r--src/mame/ampro/lbpc.cpp420
-rw-r--r--src/mame/amstrad/ams40041.cpp671
-rw-r--r--src/mame/amstrad/ams40041.h70
-rw-r--r--src/mame/amstrad/amstr_pc.cpp873
-rw-r--r--src/mame/amstrad/amstrad.cpp1315
-rw-r--r--src/mame/amstrad/amstrad.h318
-rw-r--r--src/mame/amstrad/amstrad_m.cpp3266
-rw-r--r--src/mame/amstrad/nc.cpp1483
-rw-r--r--src/mame/amstrad/pc1512.cpp1498
-rw-r--r--src/mame/amstrad/pc1512.h238
-rw-r--r--src/mame/amstrad/pc1512kb.cpp472
-rw-r--r--src/mame/amstrad/pc1512kb.h97
-rw-r--r--src/mame/amstrad/pcw.cpp1465
-rw-r--r--src/mame/amstrad/pcw.h172
-rw-r--r--src/mame/amstrad/pcw16.cpp1097
-rw-r--r--src/mame/amstrad/pcw16.h155
-rw-r--r--src/mame/amstrad/pcw16_v.cpp269
-rw-r--r--src/mame/amstrad/pcw_v.cpp224
-rw-r--r--src/mame/amstrad/pda600.cpp583
-rw-r--r--src/mame/amstrad/pda600_copro.cpp517
-rw-r--r--src/mame/amstrad/pda600_copro.h67
-rw-r--r--src/mame/apf/apf.cpp642
-rw-r--r--src/mame/apollo/apollo.cpp1261
-rw-r--r--src/mame/apollo/apollo.h719
-rw-r--r--src/mame/apollo/apollo_dbg.cpp1173
-rw-r--r--src/mame/apollo/apollo_dbg.h21
-rw-r--r--src/mame/apollo/apollo_kbd.cpp981
-rw-r--r--src/mame/apollo/apollo_kbd.h152
-rw-r--r--src/mame/apollo/apollo_m.cpp1378
-rw-r--r--src/mame/apollo/apollo_v.cpp1950
-rw-r--r--src/mame/apple/adbmodem.cpp218
-rw-r--r--src/mame/apple/adbmodem.h97
-rw-r--r--src/mame/apple/apple1.cpp620
-rw-r--r--src/mame/apple/apple2.cpp1245
-rw-r--r--src/mame/apple/apple2common.cpp866
-rw-r--r--src/mame/apple/apple2common.h56
-rw-r--r--src/mame/apple/apple2e.cpp6304
-rw-r--r--src/mame/apple/apple2e.h14
-rw-r--r--src/mame/apple/apple2gs.cpp4010
-rw-r--r--src/mame/apple/apple2video.cpp1269
-rw-r--r--src/mame/apple/apple2video.h168
-rw-r--r--src/mame/apple/apple3.cpp345
-rw-r--r--src/mame/apple/apple3.h182
-rw-r--r--src/mame/apple/apple3_m.cpp1478
-rw-r--r--src/mame/apple/apple3_v.cpp500
-rw-r--r--src/mame/apple/awacs_macrisc.cpp206
-rw-r--r--src/mame/apple/awacs_macrisc.h76
-rw-r--r--src/mame/apple/bandit.cpp209
-rw-r--r--src/mame/apple/bandit.h83
-rw-r--r--src/mame/apple/burgundy.cpp165
-rw-r--r--src/mame/apple/burgundy.h62
-rw-r--r--src/mame/apple/csc.cpp340
-rw-r--r--src/mame/apple/csc.h55
-rw-r--r--src/mame/apple/cuda.cpp419
-rw-r--r--src/mame/apple/cuda.h121
-rw-r--r--src/mame/apple/dafb.cpp1442
-rw-r--r--src/mame/apple/dafb.h196
-rw-r--r--src/mame/apple/dbdma.cpp269
-rw-r--r--src/mame/apple/dbdma.h70
-rw-r--r--src/mame/apple/dfac.cpp164
-rw-r--r--src/mame/apple/dfac.h34
-rw-r--r--src/mame/apple/dfac2.cpp89
-rw-r--r--src/mame/apple/dfac2.h32
-rw-r--r--src/mame/apple/djmemc.cpp200
-rw-r--r--src/mame/apple/djmemc.h77
-rw-r--r--src/mame/apple/egret.cpp350
-rw-r--r--src/mame/apple/egret.h108
-rw-r--r--src/mame/apple/f108.cpp212
-rw-r--r--src/mame/apple/f108.h76
-rw-r--r--src/mame/apple/gsc.cpp176
-rw-r--r--src/mame/apple/gsc.h51
-rw-r--r--src/mame/apple/heathrow.cpp711
-rw-r--r--src/mame/apple/heathrow.h186
-rw-r--r--src/mame/apple/imacg3.cpp231
-rw-r--r--src/mame/apple/iosb.cpp681
-rw-r--r--src/mame/apple/iosb.h193
-rw-r--r--src/mame/apple/iphone2g.cpp317
-rw-r--r--src/mame/apple/lisa.cpp829
-rw-r--r--src/mame/apple/lisafdc.cpp476
-rw-r--r--src/mame/apple/lisafdc.h123
-rw-r--r--src/mame/apple/lisammu.cpp480
-rw-r--r--src/mame/apple/lisammu.h128
-rw-r--r--src/mame/apple/lisavideo.cpp270
-rw-r--r--src/mame/apple/lisavideo.h100
-rw-r--r--src/mame/apple/lwriter.cpp820
-rw-r--r--src/mame/apple/mac128.cpp1643
-rw-r--r--src/mame/apple/macadb.cpp1117
-rw-r--r--src/mame/apple/macadb.h83
-rw-r--r--src/mame/apple/macii.cpp1183
-rw-r--r--src/mame/apple/maciici.cpp705
-rw-r--r--src/mame/apple/maciifx.cpp521
-rw-r--r--src/mame/apple/maciivx.cpp446
-rw-r--r--src/mame/apple/maclc.cpp649
-rw-r--r--src/mame/apple/maclc3.cpp434
-rw-r--r--src/mame/apple/macpdm.cpp1285
-rw-r--r--src/mame/apple/macprtb.cpp831
-rw-r--r--src/mame/apple/macpwrbk030.cpp1489
-rw-r--r--src/mame/apple/macpwrbkmsc.cpp950
-rw-r--r--src/mame/apple/macquadra605.cpp276
-rw-r--r--src/mame/apple/macquadra630.cpp241
-rw-r--r--src/mame/apple/macquadra700.cpp960
-rw-r--r--src/mame/apple/macquadra800.cpp357
-rw-r--r--src/mame/apple/macrtc.cpp425
-rw-r--r--src/mame/apple/macrtc.h120
-rw-r--r--src/mame/apple/macscsi.cpp308
-rw-r--r--src/mame/apple/macscsi.h69
-rw-r--r--src/mame/apple/mactoolbox.cpp891
-rw-r--r--src/mame/apple/mactoolbox.h12
-rw-r--r--src/mame/apple/msc.cpp508
-rw-r--r--src/mame/apple/msc.h149
-rw-r--r--src/mame/apple/newton.cpp199
-rw-r--r--src/mame/apple/omega.cpp141
-rw-r--r--src/mame/apple/omega.h34
-rw-r--r--src/mame/apple/pippin.cpp258
-rw-r--r--src/mame/apple/powermacg3.cpp245
-rw-r--r--src/mame/apple/prav8ckb.cpp248
-rw-r--r--src/mame/apple/prav8ckb.h65
-rw-r--r--src/mame/apple/rbv.cpp287
-rw-r--r--src/mame/apple/rbv.h72
-rw-r--r--src/mame/apple/scsidma.cpp337
-rw-r--r--src/mame/apple/scsidma.h57
-rw-r--r--src/mame/apple/sonora.cpp420
-rw-r--r--src/mame/apple/sonora.h110
-rw-r--r--src/mame/apple/superga2.cpp245
-rw-r--r--src/mame/apple/tk2000.cpp504
-rw-r--r--src/mame/apple/v8.cpp1100
-rw-r--r--src/mame/apple/v8.h193
-rw-r--r--src/mame/apple/valkyrie.cpp573
-rw-r--r--src/mame/apple/valkyrie.h72
-rw-r--r--src/mame/apple/vasp.cpp563
-rw-r--r--src/mame/apple/vasp.h113
-rw-r--r--src/mame/appliedconcepts/boris.cpp249
-rw-r--r--src/mame/appliedconcepts/borisdpl.cpp226
-rw-r--r--src/mame/appliedconcepts/ggm.cpp621
-rw-r--r--src/mame/appliedconcepts/prodigy.cpp308
-rw-r--r--src/mame/arcadia/arcadia.cpp832
-rw-r--r--src/mame/arcadia/arcadia.h140
-rw-r--r--src/mame/arcadia/arcadia_a.cpp176
-rw-r--r--src/mame/arcadia/arcadia_a.h37
-rw-r--r--src/mame/arcadia/arcadia_v.cpp680
-rw-r--r--src/mame/aristocrat/aristmk4.cpp3109
-rw-r--r--src/mame/aristocrat/aristmk6.cpp6981
-rw-r--r--src/mame/aristocrat/aristmk7.cpp235
-rw-r--r--src/mame/aristocrat/caswin.cpp505
-rw-r--r--src/mame/astrocorp/astrcorp.cpp4691
-rw-r--r--src/mame/astrocorp/astropc.cpp479
-rw-r--r--src/mame/astrocorp/hummer.cpp355
-rw-r--r--src/mame/atari/a2600.cpp831
-rw-r--r--src/mame/atari/a7800.cpp1510
-rw-r--r--src/mame/atari/akkaarrh.cpp451
-rw-r--r--src/mame/atari/antic.cpp2335
-rw-r--r--src/mame/atari/antic.h199
-rw-r--r--src/mame/atari/arcadecl.cpp552
-rw-r--r--src/mame/atari/asic65.cpp765
-rw-r--r--src/mame/atari/asic65.h81
-rw-r--r--src/mame/atari/asteroid.cpp1356
-rw-r--r--src/mame/atari/asteroid.h94
-rw-r--r--src/mame/atari/asteroid_a.cpp342
-rw-r--r--src/mame/atari/asteroid_m.cpp140
-rw-r--r--src/mame/atari/atari400.cpp2445
-rw-r--r--src/mame/atari/atari400.h69
-rw-r--r--src/mame/atari/atari400_m.cpp154
-rw-r--r--src/mame/atari/atari400_v.cpp128
-rw-r--r--src/mame/atari/atarifb.cpp803
-rw-r--r--src/mame/atari/atarifb.h140
-rw-r--r--src/mame/atari/atarifb_a.cpp210
-rw-r--r--src/mame/atari/atarifb_m.cpp300
-rw-r--r--src/mame/atari/atarifb_v.cpp207
-rw-r--r--src/mame/atari/atarig1.cpp1348
-rw-r--r--src/mame/atari/atarig1.h88
-rw-r--r--src/mame/atari/atarig1_v.cpp139
-rw-r--r--src/mame/atari/atarig42.cpp1014
-rw-r--r--src/mame/atari/atarig42.h115
-rw-r--r--src/mame/atari/atarig42_v.cpp190
-rw-r--r--src/mame/atari/atarigen.cpp117
-rw-r--r--src/mame/atari/atarigen.h97
-rw-r--r--src/mame/atari/atarigt.cpp1525
-rw-r--r--src/mame/atari/atarigt.h127
-rw-r--r--src/mame/atari/atarigt_v.cpp601
-rw-r--r--src/mame/atari/atarigx2.cpp2362
-rw-r--r--src/mame/atari/atarigx2.h96
-rw-r--r--src/mame/atari/atarigx2_v.cpp196
-rw-r--r--src/mame/atari/atarijsa.cpp1066
-rw-r--r--src/mame/atari/atarijsa.h267
-rw-r--r--src/mame/atari/atarimo.cpp640
-rw-r--r--src/mame/atari/atarimo.h222
-rw-r--r--src/mame/atari/atarirle.cpp1519
-rw-r--r--src/mame/atari/atarirle.h176
-rw-r--r--src/mame/atari/atarisac.cpp326
-rw-r--r--src/mame/atari/atarisac.h79
-rw-r--r--src/mame/atari/atariscom.cpp212
-rw-r--r--src/mame/atari/atariscom.h89
-rw-r--r--src/mame/atari/atarist.cpp2349
-rw-r--r--src/mame/atari/atarist_v.cpp671
-rw-r--r--src/mame/atari/atarist_v.h133
-rw-r--r--src/mame/atari/ataristb.cpp548
-rw-r--r--src/mame/atari/ataristb.h89
-rw-r--r--src/mame/atari/atarisy1.cpp2705
-rw-r--r--src/mame/atari/atarisy1.h177
-rw-r--r--src/mame/atari/atarisy1_v.cpp655
-rw-r--r--src/mame/atari/atarisy2.cpp3369
-rw-r--r--src/mame/atari/atarisy2.h177
-rw-r--r--src/mame/atari/atarisy2_v.cpp265
-rw-r--r--src/mame/atari/atarisy4.cpp1112
-rw-r--r--src/mame/atari/atarittl.cpp673
-rw-r--r--src/mame/atari/atarivad.cpp478
-rw-r--r--src/mame/atari/atarivad.h104
-rw-r--r--src/mame/atari/atarixga.cpp505
-rw-r--r--src/mame/atari/atarixga.h111
-rw-r--r--src/mame/atari/atetris.cpp1073
-rw-r--r--src/mame/atari/avalnche.cpp307
-rw-r--r--src/mame/atari/avalnche.h51
-rw-r--r--src/mame/atari/avalnche_a.cpp144
-rw-r--r--src/mame/atari/badlands.cpp532
-rw-r--r--src/mame/atari/badlands.h139
-rw-r--r--src/mame/atari/badlands_m.cpp79
-rw-r--r--src/mame/atari/badlands_ms.cpp202
-rw-r--r--src/mame/atari/badlands_v.cpp134
-rw-r--r--src/mame/atari/badlandsbl.cpp331
-rw-r--r--src/mame/atari/bartop52.cpp175
-rw-r--r--src/mame/atari/batman.cpp564
-rw-r--r--src/mame/atari/beathead.cpp651
-rw-r--r--src/mame/atari/blstroid.cpp620
-rw-r--r--src/mame/atari/boxer.cpp541
-rw-r--r--src/mame/atari/bsktball.cpp298
-rw-r--r--src/mame/atari/bsktball.h97
-rw-r--r--src/mame/atari/bsktball_a.cpp132
-rw-r--r--src/mame/atari/bsktball_m.cpp152
-rw-r--r--src/mame/atari/bsktball_v.cpp56
-rw-r--r--src/mame/atari/bwidow.cpp1115
-rw-r--r--src/mame/atari/bwidow.h67
-rw-r--r--src/mame/atari/bwidow_a.cpp176
-rw-r--r--src/mame/atari/bzone.cpp1020
-rw-r--r--src/mame/atari/bzone.h95
-rw-r--r--src/mame/atari/bzone_a.cpp409
-rw-r--r--src/mame/atari/canyon.cpp480
-rw-r--r--src/mame/atari/canyon_a.cpp187
-rw-r--r--src/mame/atari/canyon_a.h28
-rw-r--r--src/mame/atari/cball.cpp299
-rw-r--r--src/mame/atari/ccastles.cpp1123
-rw-r--r--src/mame/atari/centiped.cpp2398
-rw-r--r--src/mame/atari/centiped.h188
-rw-r--r--src/mame/atari/centiped_v.cpp546
-rw-r--r--src/mame/atari/cloak.cpp871
-rw-r--r--src/mame/atari/cloud9.cpp862
-rw-r--r--src/mame/atari/cmmb.cpp453
-rw-r--r--src/mame/atari/cops.cpp858
-rw-r--r--src/mame/atari/copsnrob.cpp507
-rw-r--r--src/mame/atari/copsnrob_a.cpp678
-rw-r--r--src/mame/atari/copsnrob_a.h32
-rw-r--r--src/mame/atari/cyberbal.cpp1395
-rw-r--r--src/mame/atari/cybstorm.cpp605
-rw-r--r--src/mame/atari/destroyr.cpp574
-rw-r--r--src/mame/atari/dragrace.cpp509
-rw-r--r--src/mame/atari/dragrace_a.cpp196
-rw-r--r--src/mame/atari/dragrace_a.h36
-rw-r--r--src/mame/atari/eprom.cpp1219
-rw-r--r--src/mame/atari/firefox.cpp783
-rw-r--r--src/mame/atari/firetrk.cpp1689
-rw-r--r--src/mame/atari/firetrk_a.cpp639
-rw-r--r--src/mame/atari/firetrk_a.h47
-rw-r--r--src/mame/atari/flyball.cpp564
-rw-r--r--src/mame/atari/foodf.cpp719
-rw-r--r--src/mame/atari/gauntlet.cpp2129
-rw-r--r--src/mame/atari/gtia.cpp1044
-rw-r--r--src/mame/atari/gtia.h193
-rw-r--r--src/mame/atari/gumrally.cpp144
-rw-r--r--src/mame/atari/harddriv.cpp5418
-rw-r--r--src/mame/atari/harddriv.h755
-rw-r--r--src/mame/atari/harddriv_a.cpp456
-rw-r--r--src/mame/atari/harddriv_m.cpp1965
-rw-r--r--src/mame/atari/harddriv_v.cpp456
-rw-r--r--src/mame/atari/hitparade.cpp224
-rw-r--r--src/mame/atari/irobot.cpp378
-rw-r--r--src/mame/atari/irobot.h164
-rw-r--r--src/mame/atari/irobot_m.cpp945
-rw-r--r--src/mame/atari/irobot_v.cpp385
-rw-r--r--src/mame/atari/jag_blitter.cpp235
-rw-r--r--src/mame/atari/jag_blitter.h98
-rw-r--r--src/mame/atari/jagblit.h (renamed from src/mame/video/jagblit.h)32
-rw-r--r--src/mame/atari/jagblit.ipp591
-rw-r--r--src/mame/atari/jagobj.ipp1069
-rw-r--r--src/mame/atari/jaguar.cpp2699
-rw-r--r--src/mame/atari/jaguar.h411
-rw-r--r--src/mame/atari/jaguar_a.cpp475
-rw-r--r--src/mame/atari/jaguar_v.cpp1085
-rw-r--r--src/mame/atari/jedi.cpp1031
-rw-r--r--src/mame/atari/klax.cpp779
-rw-r--r--src/mame/atari/liberatr.cpp950
-rw-r--r--src/mame/atari/lynx.cpp193
-rw-r--r--src/mame/atari/lynx.h413
-rw-r--r--src/mame/atari/lynx_m.cpp2122
-rw-r--r--src/mame/atari/marblmd2.cpp394
-rw-r--r--src/mame/atari/maria.cpp513
-rw-r--r--src/mame/atari/maria.h77
-rw-r--r--src/mame/atari/mathbox.cpp305
-rw-r--r--src/mame/atari/mathbox.h43
-rw-r--r--src/mame/atari/maxaflex.cpp454
-rw-r--r--src/mame/atari/mediagx.cpp1039
-rw-r--r--src/mame/atari/metalmx.cpp908
-rw-r--r--src/mame/atari/mgolf.cpp399
-rw-r--r--src/mame/atari/mhavoc.cpp1290
-rw-r--r--src/mame/atari/missile.cpp1423
-rw-r--r--src/mame/atari/nitedrvr.cpp615
-rw-r--r--src/mame/atari/nitedrvr_a.cpp149
-rw-r--r--src/mame/atari/nitedrvr_a.h27
-rw-r--r--src/mame/atari/nl_breakout.cpp1893
-rw-r--r--src/mame/atari/nl_breakout.h4
-rw-r--r--src/mame/atari/nl_destroyr.cpp299
-rw-r--r--src/mame/atari/nl_destroyr.h10
-rw-r--r--src/mame/atari/nl_flyball.cpp171
-rw-r--r--src/mame/atari/nl_flyball.h10
-rw-r--r--src/mame/atari/nl_gtrak10.cpp826
-rw-r--r--src/mame/atari/nl_gtrak10.h6
-rw-r--r--src/mame/atari/nl_pong.cpp586
-rw-r--r--src/mame/atari/nl_pong.h4
-rw-r--r--src/mame/atari/nl_pongdoubles.cpp1250
-rw-r--r--src/mame/atari/nl_pongdoubles.h4
-rw-r--r--src/mame/atari/nl_rebound.cpp1309
-rw-r--r--src/mame/atari/nl_rebound.h4
-rw-r--r--src/mame/atari/nl_stuntcyc.cpp735
-rw-r--r--src/mame/atari/nl_stuntcyc.h12
-rw-r--r--src/mame/atari/nl_tank.cpp1912
-rw-r--r--src/mame/atari/nl_tank.h12
-rw-r--r--src/mame/atari/offtwall.cpp661
-rw-r--r--src/mame/atari/orbit.cpp526
-rw-r--r--src/mame/atari/orbit_a.cpp105
-rw-r--r--src/mame/atari/orbit_a.h28
-rw-r--r--src/mame/atari/pofo.cpp1054
-rw-r--r--src/mame/atari/pofo_kbd.cpp138
-rw-r--r--src/mame/atari/pofo_kbd.h39
-rw-r--r--src/mame/atari/pong.cpp695
-rw-r--r--src/mame/atari/poolshrk.cpp397
-rw-r--r--src/mame/atari/poolshrk_a.cpp142
-rw-r--r--src/mame/atari/poolshrk_a.h31
-rw-r--r--src/mame/atari/quantum.cpp429
-rw-r--r--src/mame/atari/quizshow.cpp480
-rw-r--r--src/mame/atari/rampart.cpp635
-rw-r--r--src/mame/atari/redbaron.cpp240
-rw-r--r--src/mame/atari/redbaron.h49
-rw-r--r--src/mame/atari/relief.cpp708
-rw-r--r--src/mame/atari/runaway.cpp645
-rw-r--r--src/mame/atari/sbrkout.cpp680
-rw-r--r--src/mame/atari/shuuz.cpp517
-rw-r--r--src/mame/atari/skullxbo.cpp977
-rw-r--r--src/mame/atari/skydiver.cpp596
-rw-r--r--src/mame/atari/skydiver_a.cpp149
-rw-r--r--src/mame/atari/skydiver_a.h32
-rw-r--r--src/mame/atari/skyraid.cpp502
-rw-r--r--src/mame/atari/skyraid_a.cpp278
-rw-r--r--src/mame/atari/skyraid_a.h28
-rw-r--r--src/mame/atari/slapstic.cpp1298
-rw-r--r--src/mame/atari/slapstic.h293
-rw-r--r--src/mame/atari/sprint2.cpp988
-rw-r--r--src/mame/atari/sprint2_a.cpp406
-rw-r--r--src/mame/atari/sprint2_a.h36
-rw-r--r--src/mame/atari/sprint4.cpp751
-rw-r--r--src/mame/atari/sprint4_a.cpp303
-rw-r--r--src/mame/atari/sprint4_a.h38
-rw-r--r--src/mame/atari/sprint8.cpp592
-rw-r--r--src/mame/atari/sprint8_a.cpp283
-rw-r--r--src/mame/atari/sprint8_a.h33
-rw-r--r--src/mame/atari/starshp1.cpp946
-rw-r--r--src/mame/atari/starshp1_a.cpp300
-rw-r--r--src/mame/atari/starshp1_a.h32
-rw-r--r--src/mame/atari/starwars.cpp578
-rw-r--r--src/mame/atari/starwars.h101
-rw-r--r--src/mame/atari/starwars_m.cpp414
-rw-r--r--src/mame/atari/stkbd.cpp366
-rw-r--r--src/mame/atari/stkbd.h71
-rw-r--r--src/mame/atari/stmmu.cpp514
-rw-r--r--src/mame/atari/stmmu.h107
-rw-r--r--src/mame/atari/stvideo.cpp968
-rw-r--r--src/mame/atari/stvideo.h114
-rw-r--r--src/mame/atari/subs.cpp555
-rw-r--r--src/mame/atari/subs_a.cpp119
-rw-r--r--src/mame/atari/subs_a.h29
-rw-r--r--src/mame/atari/tank8.cpp827
-rw-r--r--src/mame/atari/tank8_a.cpp271
-rw-r--r--src/mame/atari/tank8_a.h36
-rw-r--r--src/mame/atari/tempest.cpp930
-rw-r--r--src/mame/atari/thunderj.cpp738
-rw-r--r--src/mame/atari/tia.cpp2226
-rw-r--r--src/mame/atari/tia.h245
-rw-r--r--src/mame/atari/tomcat.cpp402
-rw-r--r--src/mame/atari/toobin.cpp906
-rw-r--r--src/mame/atari/tourtabl.cpp208
-rw-r--r--src/mame/atari/triplhnt.cpp519
-rw-r--r--src/mame/atari/triplhnt_a.cpp181
-rw-r--r--src/mame/atari/triplhnt_a.h28
-rw-r--r--src/mame/atari/tunhunt.cpp867
-rw-r--r--src/mame/atari/ultratnk.cpp558
-rw-r--r--src/mame/atari/videopin.cpp619
-rw-r--r--src/mame/atari/videopin_a.cpp101
-rw-r--r--src/mame/atari/videopin_a.h28
-rw-r--r--src/mame/atari/vindictr.cpp883
-rw-r--r--src/mame/atari/wolfpack.cpp736
-rw-r--r--src/mame/atari/xybots.cpp590
-rw-r--r--src/mame/atlus/bowltry.cpp192
-rw-r--r--src/mame/atlus/cave.cpp5698
-rw-r--r--src/mame/atlus/cave.h326
-rw-r--r--src/mame/atlus/cave_v.cpp455
-rw-r--r--src/mame/atlus/ohmygod.cpp536
-rw-r--r--src/mame/atlus/patapata.cpp357
-rw-r--r--src/mame/atlus/pitchtry.cpp167
-rw-r--r--src/mame/atlus/rallypnt.cpp155
-rw-r--r--src/mame/atlus/sprite013.cpp587
-rw-r--r--src/mame/atlus/sprite013.h96
-rw-r--r--src/mame/att/att3b2.cpp142
-rw-r--r--src/mame/att/att4425.cpp313
-rw-r--r--src/mame/att/att610.cpp191
-rw-r--r--src/mame/att/att630.cpp204
-rw-r--r--src/mame/att/blit.cpp292
-rw-r--r--src/mame/att/unixpc.cpp460
-rw-r--r--src/mame/audio/8080bw.c1181
-rw-r--r--src/mame/audio/amiga.c298
-rw-r--r--src/mame/audio/asteroid.c322
-rw-r--r--src/mame/audio/astrof.c277
-rw-r--r--src/mame/audio/atarifb.c208
-rw-r--r--src/mame/audio/atarijsa.c957
-rw-r--r--src/mame/audio/atarijsa.h25
-rw-r--r--src/mame/audio/attckufo.c279
-rw-r--r--src/mame/audio/avalnche.c128
-rw-r--r--src/mame/audio/aztarac.c53
-rw-r--r--src/mame/audio/blockade.c70
-rw-r--r--src/mame/audio/bsktball.c135
-rw-r--r--src/mame/audio/bzone.c298
-rw-r--r--src/mame/audio/cage.c687
-rw-r--r--src/mame/audio/cage.h20
-rw-r--r--src/mame/audio/canyon.c212
-rw-r--r--src/mame/audio/carnival.c312
-rw-r--r--src/mame/audio/cchasm.c137
-rw-r--r--src/mame/audio/cclimber.c96
-rw-r--r--src/mame/audio/cinemat.c1632
-rw-r--r--src/mame/audio/circus.c282
-rw-r--r--src/mame/audio/cliffhgr.c52
-rw-r--r--src/mame/audio/cps3.c173
-rw-r--r--src/mame/audio/crbaloon.c179
-rw-r--r--src/mame/audio/cyberbal.c157
-rw-r--r--src/mame/audio/dcs.c2405
-rw-r--r--src/mame/audio/dcs.h34
-rw-r--r--src/mame/audio/depthch.c94
-rw-r--r--src/mame/audio/dkong.c1346
-rw-r--r--src/mame/audio/dragrace.c191
-rw-r--r--src/mame/audio/exidy.c1052
-rw-r--r--src/mame/audio/exidy440.c964
-rw-r--r--src/mame/audio/fghtbskt.c31
-rw-r--r--src/mame/audio/firetrk.c696
-rw-r--r--src/mame/audio/flower.c310
-rw-r--r--src/mame/audio/galaga.c373
-rw-r--r--src/mame/audio/galaxian.c575
-rw-r--r--src/mame/audio/geebee.c144
-rw-r--r--src/mame/audio/gomoku.c277
-rw-r--r--src/mame/audio/gorf.c187
-rw-r--r--src/mame/audio/gottlieb.c629
-rw-r--r--src/mame/audio/gotya.c82
-rw-r--r--src/mame/audio/grchamp.c62
-rw-r--r--src/mame/audio/gridlee.c186
-rw-r--r--src/mame/audio/harddriv.c387
-rw-r--r--src/mame/audio/hitme.c80
-rw-r--r--src/mame/audio/invinco.c114
-rw-r--r--src/mame/audio/irem.c452
-rw-r--r--src/mame/audio/irem.h11
-rw-r--r--src/mame/audio/jaguar.c470
-rw-r--r--src/mame/audio/jedi.c230
-rw-r--r--src/mame/audio/laserbat.c108
-rw-r--r--src/mame/audio/leland.c2176
-rw-r--r--src/mame/audio/llander.c95
-rw-r--r--src/mame/audio/m72.c207
-rw-r--r--src/mame/audio/m72.h20
-rw-r--r--src/mame/audio/m79amb.c341
-rw-r--r--src/mame/audio/madalien.c258
-rw-r--r--src/mame/audio/mario.c634
-rw-r--r--src/mame/audio/mcr.c997
-rw-r--r--src/mame/audio/mcr.h71
-rw-r--r--src/mame/audio/meadows.c129
-rw-r--r--src/mame/audio/mw8080bw.c4090
-rw-r--r--src/mame/audio/n8080.c605
-rw-r--r--src/mame/audio/namco52.c239
-rw-r--r--src/mame/audio/namco52.h36
-rw-r--r--src/mame/audio/namco54.c195
-rw-r--r--src/mame/audio/namco54.h36
-rw-r--r--src/mame/audio/namcoc7x.c196
-rw-r--r--src/mame/audio/namcoc7x.h54
-rw-r--r--src/mame/audio/nitedrvr.c146
-rw-r--r--src/mame/audio/orbit.c130
-rw-r--r--src/mame/audio/phoenix.c560
-rw-r--r--src/mame/audio/pleiads.c696
-rw-r--r--src/mame/audio/polepos.c356
-rw-r--r--src/mame/audio/polyplay.c76
-rw-r--r--src/mame/audio/poolshrk.c176
-rw-r--r--src/mame/audio/pulsar.c191
-rw-r--r--src/mame/audio/qix.c269
-rw-r--r--src/mame/audio/redalert.c426
-rw-r--r--src/mame/audio/redbaron.c226
-rw-r--r--src/mame/audio/scramble.c401
-rw-r--r--src/mame/audio/segag80r.c1018
-rw-r--r--src/mame/audio/segag80v.c333
-rw-r--r--src/mame/audio/segasnd.c938
-rw-r--r--src/mame/audio/segasnd.h22
-rw-r--r--src/mame/audio/seibu.c565
-rw-r--r--src/mame/audio/seibu.h169
-rw-r--r--src/mame/audio/senjyo.c89
-rw-r--r--src/mame/audio/skydiver.c146
-rw-r--r--src/mame/audio/snes.c1366
-rw-r--r--src/mame/audio/snk6502.c1212
-rw-r--r--src/mame/audio/spacefb.c98
-rw-r--r--src/mame/audio/spiders.c207
-rw-r--r--src/mame/audio/sprint2.c403
-rw-r--r--src/mame/audio/sprint4.c305
-rw-r--r--src/mame/audio/sprint4.h31
-rw-r--r--src/mame/audio/starshp1.c305
-rw-r--r--src/mame/audio/starwars.c152
-rw-r--r--src/mame/audio/subs.c146
-rw-r--r--src/mame/audio/suna8.c58
-rw-r--r--src/mame/audio/t5182.c317
-rw-r--r--src/mame/audio/t5182.h18
-rw-r--r--src/mame/audio/taito_en.c273
-rw-r--r--src/mame/audio/taito_en.h30
-rw-r--r--src/mame/audio/taitosnd.c250
-rw-r--r--src/mame/audio/taitosnd.h17
-rw-r--r--src/mame/audio/tank8.c267
-rw-r--r--src/mame/audio/targ.c223
-rw-r--r--src/mame/audio/tiamc1.c328
-rw-r--r--src/mame/audio/timeplt.c218
-rw-r--r--src/mame/audio/timeplt.h4
-rw-r--r--src/mame/audio/toaplan2.c147
-rw-r--r--src/mame/audio/trackfld.c106
-rw-r--r--src/mame/audio/triplhnt.c185
-rw-r--r--src/mame/audio/turbo.c745
-rw-r--r--src/mame/audio/tx1.c577
-rw-r--r--src/mame/audio/vicdual.c589
-rw-r--r--src/mame/audio/videopin.c99
-rw-r--r--src/mame/audio/warpwarp.c236
-rw-r--r--src/mame/audio/williams.c702
-rw-r--r--src/mame/audio/williams.h23
-rw-r--r--src/mame/audio/wiping.c259
-rw-r--r--src/mame/audio/wow.c182
-rw-r--r--src/mame/audio/zaxxon.c267
-rw-r--r--src/mame/ausnz/amust.cpp550
-rw-r--r--src/mame/ausnz/applix.cpp1094
-rw-r--r--src/mame/ausnz/aussiebyte.cpp615
-rw-r--r--src/mame/ausnz/aussiebyte.h156
-rw-r--r--src/mame/ausnz/aussiebyte_v.cpp196
-rw-r--r--src/mame/ausnz/binbug.cpp281
-rw-r--r--src/mame/ausnz/d6800.cpp436
-rw-r--r--src/mame/ausnz/datum.cpp238
-rw-r--r--src/mame/ausnz/dg680.cpp342
-rw-r--r--src/mame/ausnz/dmax8000.cpp211
-rw-r--r--src/mame/ausnz/eacc.cpp306
-rw-r--r--src/mame/ausnz/eti660.cpp407
-rw-r--r--src/mame/ausnz/excali64.cpp688
-rw-r--r--src/mame/ausnz/labtam.cpp115
-rw-r--r--src/mame/ausnz/magnum.cpp343
-rw-r--r--src/mame/ausnz/mbee.cpp1187
-rw-r--r--src/mame/ausnz/mbee.h208
-rw-r--r--src/mame/ausnz/mbee_m.cpp752
-rw-r--r--src/mame/ausnz/mbee_v.cpp408
-rw-r--r--src/mame/ausnz/pegasus.cpp576
-rw-r--r--src/mame/ausnz/pipbug.cpp237
-rw-r--r--src/mame/ausnz/poly.cpp444
-rw-r--r--src/mame/ausnz/poly.h185
-rw-r--r--src/mame/ausnz/poly_m.cpp260
-rw-r--r--src/mame/ausnz/proteus.cpp437
-rw-r--r--src/mame/ausnz/pulsar.cpp278
-rw-r--r--src/mame/ausnz/super80.cpp990
-rw-r--r--src/mame/ausnz/super80.h187
-rw-r--r--src/mame/ausnz/super80_m.cpp287
-rw-r--r--src/mame/ausnz/super80_v.cpp420
-rw-r--r--src/mame/ausnz/tec1.cpp415
-rw-r--r--src/mame/banctec/banctec.cpp190
-rw-r--r--src/mame/bandai/design_master.cpp166
-rw-r--r--src/mame/bandai/rx78.cpp577
-rw-r--r--src/mame/bandai/sv8000.cpp333
-rw-r--r--src/mame/bandai/wswan.cpp1174
-rw-r--r--src/mame/bandai/wswan_v.cpp877
-rw-r--r--src/mame/bandai/wswan_v.h159
-rw-r--r--src/mame/barcrest/mpu1.cpp1509
-rw-r--r--src/mame/barcrest/mpu3.cpp1768
-rw-r--r--src/mame/barcrest/mpu4.cpp2428
-rw-r--r--src/mame/barcrest/mpu4.h565
-rw-r--r--src/mame/barcrest/mpu4_characteriser_bootleg.cpp76
-rw-r--r--src/mame/barcrest/mpu4_characteriser_bootleg.h70
-rw-r--r--src/mame/barcrest/mpu4_characteriser_pal.cpp299
-rw-r--r--src/mame/barcrest/mpu4_characteriser_pal.h1438
-rw-r--r--src/mame/barcrest/mpu4_characteriser_pal_bwb.cpp134
-rw-r--r--src/mame/barcrest/mpu4_characteriser_pal_bwb.h51
-rw-r--r--src/mame/barcrest/mpu4_oki_sampled_sound.cpp202
-rw-r--r--src/mame/barcrest/mpu4_oki_sampled_sound.h54
-rw-r--r--src/mame/barcrest/mpu4avan.cpp852
-rw-r--r--src/mame/barcrest/mpu4bwb.cpp2092
-rw-r--r--src/mame/barcrest/mpu4concept.cpp158
-rw-r--r--src/mame/barcrest/mpu4crystal.cpp992
-rw-r--r--src/mame/barcrest/mpu4dealem.cpp412
-rw-r--r--src/mame/barcrest/mpu4empire.cpp975
-rw-r--r--src/mame/barcrest/mpu4mdm.cpp493
-rw-r--r--src/mame/barcrest/mpu4misc.cpp509
-rw-r--r--src/mame/barcrest/mpu4mod2sw.cpp2558
-rw-r--r--src/mame/barcrest/mpu4mod4oki.cpp9138
-rw-r--r--src/mame/barcrest/mpu4mod4yam.cpp1668
-rw-r--r--src/mame/barcrest/mpu4plasma.cpp219
-rw-r--r--src/mame/barcrest/mpu4redpoint.cpp146
-rw-r--r--src/mame/barcrest/mpu4union.cpp320
-rw-r--r--src/mame/barcrest/mpu4unsorted.cpp855
-rw-r--r--src/mame/barcrest/mpu4vid.cpp9238
-rw-r--r--src/mame/barcrest/mpu5.cpp443
-rw-r--r--src/mame/barcrest/mpu5.h65
-rw-r--r--src/mame/barcrest/mpu5sw.cpp8426
-rw-r--r--src/mame/be/bebox.cpp297
-rw-r--r--src/mame/be/bebox.h139
-rw-r--r--src/mame/be/bebox_m.cpp769
-rw-r--r--src/mame/beehive/microb.cpp392
-rw-r--r--src/mame/benesse/challenge_gear.cpp154
-rw-r--r--src/mame/benesse/pockchal.cpp141
-rw-r--r--src/mame/bfm/bfcobra.cpp3132
-rw-r--r--src/mame/bfm/bfm_ad5.cpp190
-rw-r--r--src/mame/bfm/bfm_ad5.h33
-rw-r--r--src/mame/bfm/bfm_ad5sw.cpp2360
-rw-r--r--src/mame/bfm/bfm_adr2.cpp454
-rw-r--r--src/mame/bfm/bfm_adr2.h74
-rw-r--r--src/mame/bfm/bfm_bd1.cpp592
-rw-r--r--src/mame/bfm/bfm_bd1.h73
-rw-r--r--src/mame/bfm/bfm_bda.cpp523
-rw-r--r--src/mame/bfm/bfm_bda.h70
-rw-r--r--src/mame/bfm/bfm_blackbox.cpp1917
-rw-r--r--src/mame/bfm/bfm_cobra3.cpp599
-rw-r--r--src/mame/bfm/bfm_comn.cpp69
-rw-r--r--src/mame/bfm/bfm_comn.h5
-rw-r--r--src/mame/bfm/bfm_dm01.cpp288
-rw-r--r--src/mame/bfm/bfm_dm01.h67
-rw-r--r--src/mame/bfm/bfm_gu96x8m_k657c2.cpp1017
-rw-r--r--src/mame/bfm/bfm_gu96x8m_k657c2.h77
-rw-r--r--src/mame/bfm/bfm_sc1.cpp3367
-rw-r--r--src/mame/bfm/bfm_sc2.cpp9751
-rw-r--r--src/mame/bfm/bfm_sc4.cpp51506
-rw-r--r--src/mame/bfm/bfm_sc4.h3381
-rw-r--r--src/mame/bfm/bfm_sc45_helper.cpp912
-rw-r--r--src/mame/bfm/bfm_sc45_helper.h6
-rw-r--r--src/mame/bfm/bfm_sc5.cpp361
-rw-r--r--src/mame/bfm/bfm_sc5.h44
-rw-r--r--src/mame/bfm/bfm_sc5sw.cpp17135
-rw-r--r--src/mame/bfm/bfm_sc6.cpp80
-rw-r--r--src/mame/bfm/bfmsys83.cpp75
-rw-r--r--src/mame/bfm/bfmsys85.cpp875
-rw-r--r--src/mame/bfm/rastersp.cpp1596
-rw-r--r--src/mame/bitcorp/gamate.cpp240
-rw-r--r--src/mame/bitcorp/gamate_v.cpp346
-rw-r--r--src/mame/bitcorp/gamate_v.h63
-rw-r--r--src/mame/bmc/bmcbowl.cpp535
-rw-r--r--src/mame/bmc/bmcpokr.cpp1689
-rw-r--r--src/mame/bmc/koftball.cpp863
-rw-r--r--src/mame/bmc/popobear.cpp725
-rw-r--r--src/mame/bondwell/bw12.cpp660
-rw-r--r--src/mame/bondwell/bw2.cpp610
-rw-r--r--src/mame/booth/apexc.cpp391
-rw-r--r--src/mame/booth/apexc.h84
-rw-r--r--src/mame/booth/apexc_m.cpp102
-rw-r--r--src/mame/booth/apexc_m.h141
-rw-r--r--src/mame/booth/apexc_v.cpp212
-rw-r--r--src/mame/bordun/att.cpp669
-rw-r--r--src/mame/bordun/skylncr.cpp2723
-rw-r--r--src/mame/brainchild/pls1000.cpp209
-rw-r--r--src/mame/brother/ax145.cpp294
-rw-r--r--src/mame/brother/lw30.cpp817
-rw-r--r--src/mame/brother/lw350.cpp916
-rw-r--r--src/mame/brother/lw700i.cpp308
-rw-r--r--src/mame/brother/lw840.cpp377
-rw-r--r--src/mame/brother/pn8800fxb.cpp789
-rw-r--r--src/mame/burroughs/anzterm.cpp488
-rw-r--r--src/mame/burroughs/td831.cpp135
-rw-r--r--src/mame/camputers/camplynx.cpp1035
-rw-r--r--src/mame/canon/canon_s80.cpp360
-rw-r--r--src/mame/canon/cat.cpp1159
-rw-r--r--src/mame/canon/x07.cpp1767
-rw-r--r--src/mame/canon/x07.h171
-rw-r--r--src/mame/cantab/jupace.cpp664
-rw-r--r--src/mame/capcom/1942.cpp1034
-rw-r--r--src/mame/capcom/1942.h112
-rw-r--r--src/mame/capcom/1942_v.cpp324
-rw-r--r--src/mame/capcom/1943.cpp944
-rw-r--r--src/mame/capcom/1943.h113
-rw-r--r--src/mame/capcom/1943_v.cpp333
-rw-r--r--src/mame/capcom/alien.cpp738
-rw-r--r--src/mame/capcom/bionicc.cpp1006
-rw-r--r--src/mame/capcom/blktiger.cpp1075
-rw-r--r--src/mame/capcom/blktiger_ms.cpp398
-rw-r--r--src/mame/capcom/cbasebal.cpp554
-rw-r--r--src/mame/capcom/chakumelo.cpp106
-rw-r--r--src/mame/capcom/commando.cpp1064
-rw-r--r--src/mame/capcom/cps1.cpp15205
-rw-r--r--src/mame/capcom/cps1.h372
-rw-r--r--src/mame/capcom/cps1_v.cpp3070
-rw-r--r--src/mame/capcom/cps1bl_5205.cpp1387
-rw-r--r--src/mame/capcom/cps1bl_pic.cpp1852
-rw-r--r--src/mame/capcom/cps2.cpp12902
-rw-r--r--src/mame/capcom/cps2comm.cpp857
-rw-r--r--src/mame/capcom/cps2comm.h59
-rw-r--r--src/mame/capcom/cps2crypt.cpp713
-rw-r--r--src/mame/capcom/cps2crypt.h15
-rw-r--r--src/mame/capcom/cps3.cpp4461
-rw-r--r--src/mame/capcom/cps3.h196
-rw-r--r--src/mame/capcom/cps3_a.cpp187
-rw-r--r--src/mame/capcom/cps3_a.h60
-rw-r--r--src/mame/capcom/egghunt.cpp494
-rw-r--r--src/mame/capcom/exedexes.cpp629
-rw-r--r--src/mame/capcom/fcrash.cpp2335
-rw-r--r--src/mame/capcom/fcrash.h125
-rw-r--r--src/mame/capcom/gng.cpp1177
-rw-r--r--src/mame/capcom/gunsmoke.cpp1012
-rw-r--r--src/mame/capcom/higemaru.cpp428
-rw-r--r--src/mame/capcom/instantm.cpp162
-rw-r--r--src/mame/capcom/kabuki.cpp196
-rw-r--r--src/mame/capcom/kabuki.h18
-rw-r--r--src/mame/capcom/kenseim.cpp694
-rw-r--r--src/mame/capcom/lastduel.cpp1297
-rw-r--r--src/mame/capcom/lastduel_ms.cpp182
-rw-r--r--src/mame/capcom/lwings.cpp2320
-rw-r--r--src/mame/capcom/mitchell.cpp3348
-rw-r--r--src/mame/capcom/miteshin.cpp172
-rw-r--r--src/mame/capcom/nl_1942.cpp94
-rw-r--r--src/mame/capcom/nl_1942.h6
-rw-r--r--src/mame/capcom/psrockman.cpp142
-rw-r--r--src/mame/capcom/sf.cpp1430
-rw-r--r--src/mame/capcom/sidearms.cpp1322
-rw-r--r--src/mame/capcom/sidearms.h109
-rw-r--r--src/mame/capcom/sidearms_v.cpp356
-rw-r--r--src/mame/capcom/sonson.cpp531
-rw-r--r--src/mame/capcom/srumbler.cpp685
-rw-r--r--src/mame/capcom/supduck.cpp509
-rw-r--r--src/mame/capcom/tigeroad.cpp1482
-rw-r--r--src/mame/capcom/tigeroad.h157
-rw-r--r--src/mame/capcom/tigeroad_m.cpp77
-rw-r--r--src/mame/capcom/tigeroad_spr.cpp101
-rw-r--r--src/mame/capcom/tigeroad_spr.h30
-rw-r--r--src/mame/capcom/tigeroad_v.cpp112
-rw-r--r--src/mame/capcom/tvcapcom.cpp97
-rw-r--r--src/mame/capcom/vulgus.cpp849
-rw-r--r--src/mame/casio/casio_rompack.cpp65
-rw-r--r--src/mame/casio/casloopy.cpp2105
-rw-r--r--src/mame/casio/casloopy_tbl.ipp23070
-rw-r--r--src/mame/casio/cfx9850.cpp381
-rw-r--r--src/mame/casio/cps2000.cpp401
-rw-r--r--src/mame/casio/ct8000.cpp874
-rw-r--r--src/mame/casio/ct8000_midi.cpp409
-rw-r--r--src/mame/casio/ct8000_midi.h89
-rw-r--r--src/mame/casio/ctk2000.cpp300
-rw-r--r--src/mame/casio/ctk551.cpp1232
-rw-r--r--src/mame/casio/cz1.cpp949
-rw-r--r--src/mame/casio/cz101.cpp525
-rw-r--r--src/mame/casio/cz230s.cpp693
-rw-r--r--src/mame/casio/dg20.cpp445
-rw-r--r--src/mame/casio/fp1100.cpp857
-rw-r--r--src/mame/casio/fp200.cpp460
-rw-r--r--src/mame/casio/fp6000.cpp536
-rw-r--r--src/mame/casio/fp6000_kbd.cpp311
-rw-r--r--src/mame/casio/fp6000_kbd.h65
-rw-r--r--src/mame/casio/fz1.cpp732
-rw-r--r--src/mame/casio/ht6000.cpp350
-rw-r--r--src/mame/casio/ld50.cpp352
-rw-r--r--src/mame/casio/pb1000.cpp566
-rw-r--r--src/mame/casio/pickytlk.cpp832
-rw-r--r--src/mame/casio/pv1000.cpp590
-rw-r--r--src/mame/casio/pv2000.cpp427
-rw-r--r--src/mame/casio/ra3.cpp122
-rw-r--r--src/mame/casio/ra3.h69
-rw-r--r--src/mame/casio/rz1.cpp536
-rw-r--r--src/mame/casio/sk1.cpp252
-rw-r--r--src/mame/casio/superjr.cpp299
-rw-r--r--src/mame/casio/sx1000.cpp332
-rw-r--r--src/mame/casio/wk1800.cpp646
-rw-r--r--src/mame/casio/zoomer.cpp700
-rw-r--r--src/mame/casio/zoomer_rtc.cpp150
-rw-r--r--src/mame/casio/zoomer_rtc.h72
-rw-r--r--src/mame/cave/cavepc.cpp154
-rw-r--r--src/mame/cave/cv1k.cpp1064
-rw-r--r--src/mame/cave/cv1k_v.cpp1023
-rw-r--r--src/mame/cave/cv1k_v.h895
-rw-r--r--src/mame/cave/cv1k_v_blit0.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit1.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit2.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit3.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit4.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit5.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit6.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit7.cpp559
-rw-r--r--src/mame/cave/cv1k_v_blit8.cpp42
-rw-r--r--src/mame/cave/cv1k_v_in.ipp155
-rw-r--r--src/mame/cave/cv1k_v_pixel.ipp193
-rw-r--r--src/mame/cave/fstgfish.cpp178
-rw-r--r--src/mame/cce/mc1000.cpp618
-rw-r--r--src/mame/ccs/ccs2810.cpp1165
-rw-r--r--src/mame/ceres/ceres.cpp435
-rw-r--r--src/mame/ces/cesclass.cpp442
-rw-r--r--src/mame/ces/galgames.cpp1305
-rw-r--r--src/mame/chess/README.md3
-rw-r--r--src/mame/chess/ave_arb.cpp357
-rw-r--r--src/mame/chess/compuchess.cpp510
-rw-r--r--src/mame/chess/conchess.cpp390
-rw-r--r--src/mame/chess/conic_cchess2.cpp285
-rw-r--r--src/mame/chess/conic_cchess3.cpp161
-rw-r--r--src/mame/chess/regence.cpp249
-rw-r--r--src/mame/chess/tasc.cpp369
-rw-r--r--src/mame/chessking/master.cpp266
-rw-r--r--src/mame/chessking/pmicrodx.cpp248
-rw-r--r--src/mame/chessking/triomphe.cpp191
-rw-r--r--src/mame/chromatics/cgc7900.cpp574
-rw-r--r--src/mame/chromatics/cgc7900.h130
-rw-r--r--src/mame/chromatics/cgc7900_v.cpp244
-rw-r--r--src/mame/ci.flt17
-rw-r--r--src/mame/cinematronics/cchasm.cpp580
-rw-r--r--src/mame/cinematronics/cinemat.cpp1659
-rw-r--r--src/mame/cinematronics/cinemat.h230
-rw-r--r--src/mame/cinematronics/cinemat_a.cpp482
-rw-r--r--src/mame/cinematronics/cinemat_a.h142
-rw-r--r--src/mame/cinematronics/cinemat_v.cpp179
-rw-r--r--src/mame/cinematronics/dlair.cpp1038
-rw-r--r--src/mame/cinematronics/dlair2.cpp362
-rw-r--r--src/mame/cinematronics/embargo.cpp317
-rw-r--r--src/mame/cinematronics/jack.cpp1960
-rw-r--r--src/mame/cinematronics/leland.cpp3650
-rw-r--r--src/mame/cinematronics/leland.h330
-rw-r--r--src/mame/cinematronics/leland_a.cpp761
-rw-r--r--src/mame/cinematronics/leland_a.h135
-rw-r--r--src/mame/cinematronics/leland_m.cpp1307
-rw-r--r--src/mame/cinematronics/leland_v.cpp522
-rw-r--r--src/mame/cinematronics/nl_armora.cpp682
-rw-r--r--src/mame/cinematronics/nl_armora.h10
-rw-r--r--src/mame/cinematronics/nl_barrier.cpp302
-rw-r--r--src/mame/cinematronics/nl_barrier.h10
-rw-r--r--src/mame/cinematronics/nl_boxingb.cpp1727
-rw-r--r--src/mame/cinematronics/nl_boxingb.h10
-rw-r--r--src/mame/cinematronics/nl_cinemat_common.h383
-rw-r--r--src/mame/cinematronics/nl_ripoff.cpp706
-rw-r--r--src/mame/cinematronics/nl_ripoff.h10
-rw-r--r--src/mame/cinematronics/nl_solarq.cpp1274
-rw-r--r--src/mame/cinematronics/nl_solarq.h10
-rw-r--r--src/mame/cinematronics/nl_spacewar.cpp316
-rw-r--r--src/mame/cinematronics/nl_spacewar.h10
-rw-r--r--src/mame/cinematronics/nl_speedfrk.cpp452
-rw-r--r--src/mame/cinematronics/nl_speedfrk.h10
-rw-r--r--src/mame/cinematronics/nl_starcas.cpp814
-rw-r--r--src/mame/cinematronics/nl_starcas.h11
-rw-r--r--src/mame/cinematronics/nl_starhawk.cpp641
-rw-r--r--src/mame/cinematronics/nl_starhawk.h10
-rw-r--r--src/mame/cinematronics/nl_sundance.cpp483
-rw-r--r--src/mame/cinematronics/nl_sundance.h10
-rw-r--r--src/mame/cinematronics/nl_tailg.cpp698
-rw-r--r--src/mame/cinematronics/nl_tailg.h10
-rw-r--r--src/mame/cinematronics/nl_warrior.cpp492
-rw-r--r--src/mame/cinematronics/nl_warrior.h10
-rw-r--r--src/mame/cirsa/cirsa2080606.cpp198
-rw-r--r--src/mame/cirsa/cirsa820xxx.cpp145
-rw-r--r--src/mame/cirsa/cirsa910510.cpp208
-rw-r--r--src/mame/cirsa/miniguay.cpp232
-rw-r--r--src/mame/cirsa/missbamby.cpp395
-rw-r--r--src/mame/cirsa/neptunp2.cpp729
-rw-r--r--src/mame/citoh/cit101.cpp541
-rw-r--r--src/mame/citoh/cit101_kbd.cpp392
-rw-r--r--src/mame/citoh/cit101_kbd.h90
-rw-r--r--src/mame/citoh/cit101xl.cpp118
-rw-r--r--src/mame/citoh/cit220.cpp263
-rw-r--r--src/mame/citoh/cit220_kbd.cpp265
-rw-r--r--src/mame/citoh/cit220_kbd.h64
-rw-r--r--src/mame/coleco/adam.cpp1137
-rw-r--r--src/mame/coleco/adam.h120
-rw-r--r--src/mame/coleco/coleco.cpp768
-rw-r--r--src/mame/coleco/coleco.h140
-rw-r--r--src/mame/coleco/coleco_m.cpp177
-rw-r--r--src/mame/coleco/coleco_m.h10
-rw-r--r--src/mame/coleco/wrinkles.cpp132
-rw-r--r--src/mame/comad/funybubl.cpp467
-rw-r--r--src/mame/comad/galspnbl.cpp471
-rw-r--r--src/mame/comad/zerozone.cpp363
-rw-r--r--src/mame/commodore/c128.cpp2216
-rw-r--r--src/mame/commodore/c64.cpp2310
-rw-r--r--src/mame/commodore/c64dtv.cpp85
-rw-r--r--src/mame/commodore/c65.cpp1534
-rw-r--r--src/mame/commodore/c900.cpp176
-rw-r--r--src/mame/commodore/cbm2.cpp3095
-rw-r--r--src/mame/commodore/cbm_snqk.cpp98
-rw-r--r--src/mame/commodore/cbm_snqk.h30
-rw-r--r--src/mame/commodore/chessmate.cpp329
-rw-r--r--src/mame/commodore/clcd.cpp832
-rw-r--r--src/mame/commodore/kim1.cpp432
-rw-r--r--src/mame/commodore/mps1230.cpp183
-rw-r--r--src/mame/commodore/pet.cpp2601
-rw-r--r--src/mame/commodore/plus4.cpp1249
-rw-r--r--src/mame/commodore/vic10.cpp724
-rw-r--r--src/mame/commodore/vic20.cpp1044
-rw-r--r--src/mame/compugraphic/pwrview.cpp562
-rw-r--r--src/mame/comx/comx35.cpp692
-rw-r--r--src/mame/comx/comx35.h106
-rw-r--r--src/mame/comx/comx35_v.cpp114
-rw-r--r--src/mame/concept/concept.cpp233
-rw-r--r--src/mame/concept/concept.h75
-rw-r--r--src/mame/concept/concept_kbd.cpp227
-rw-r--r--src/mame/concept/concept_kbd.h62
-rw-r--r--src/mame/concept/concept_m.cpp362
-rw-r--r--src/mame/conitec/prof180x.cpp327
-rw-r--r--src/mame/conitec/prof180x.h61
-rw-r--r--src/mame/conitec/prof80.cpp532
-rw-r--r--src/mame/conitec/prof80.h101
-rw-r--r--src/mame/conitec/prof80mmu.cpp131
-rw-r--r--src/mame/conitec/prof80mmu.h55
-rw-r--r--src/mame/cromemco/c10.cpp207
-rw-r--r--src/mame/cromemco/mcb216.cpp173
-rw-r--r--src/mame/cybiko/cybiko.cpp535
-rw-r--r--src/mame/cybiko/cybiko.h101
-rw-r--r--src/mame/cybiko/cybiko_m.cpp406
-rw-r--r--src/mame/dai/dai.cpp252
-rw-r--r--src/mame/dai/dai.h84
-rw-r--r--src/mame/dai/dai_m.cpp215
-rw-r--r--src/mame/dai/dai_snd.cpp138
-rw-r--r--src/mame/dai/dai_snd.h44
-rw-r--r--src/mame/dai/dai_v.cpp751
-rw-r--r--src/mame/dataeast/actfancr.cpp651
-rw-r--r--src/mame/dataeast/astrof.cpp1519
-rw-r--r--src/mame/dataeast/astrof.h113
-rw-r--r--src/mame/dataeast/astrof_a.cpp218
-rw-r--r--src/mame/dataeast/backfire.cpp604
-rw-r--r--src/mame/dataeast/battlera.cpp435
-rw-r--r--src/mame/dataeast/boogwing.cpp1038
-rw-r--r--src/mame/dataeast/brkthru.cpp1109
-rw-r--r--src/mame/dataeast/btime.cpp3293
-rw-r--r--src/mame/dataeast/bwing.cpp868
-rw-r--r--src/mame/dataeast/cbuster.cpp693
-rw-r--r--src/mame/dataeast/chanbara.cpp480
-rw-r--r--src/mame/dataeast/cninja.cpp2272
-rw-r--r--src/mame/dataeast/cninja.h120
-rw-r--r--src/mame/dataeast/cninja_v.cpp302
-rw-r--r--src/mame/dataeast/cntsteer.cpp1297
-rw-r--r--src/mame/dataeast/compgolf.cpp531
-rw-r--r--src/mame/dataeast/darkseal.cpp561
-rw-r--r--src/mame/dataeast/dassault.cpp1257
-rw-r--r--src/mame/dataeast/dblewing.cpp500
-rw-r--r--src/mame/dataeast/dec0.cpp4405
-rw-r--r--src/mame/dataeast/dec0.h304
-rw-r--r--src/mame/dataeast/dec0_m.cpp299
-rw-r--r--src/mame/dataeast/dec0_v.cpp344
-rw-r--r--src/mame/dataeast/dec8.cpp4149
-rw-r--r--src/mame/dataeast/dec8.h361
-rw-r--r--src/mame/dataeast/dec8_v.cpp536
-rw-r--r--src/mame/dataeast/decbac06.cpp644
-rw-r--r--src/mame/dataeast/decbac06.h151
-rw-r--r--src/mame/dataeast/deckarn.cpp147
-rw-r--r--src/mame/dataeast/deckarn.h38
-rw-r--r--src/mame/dataeast/decmxc06.cpp251
-rw-r--r--src/mame/dataeast/decmxc06.h50
-rw-r--r--src/mame/dataeast/deco102.cpp85
-rw-r--r--src/mame/dataeast/deco102.h4
-rw-r--r--src/mame/dataeast/deco104.cpp1066
-rw-r--r--src/mame/dataeast/deco104.h25
-rw-r--r--src/mame/dataeast/deco146.cpp1450
-rw-r--r--src/mame/dataeast/deco146.h148
-rw-r--r--src/mame/dataeast/deco156.cpp706
-rw-r--r--src/mame/dataeast/deco156_m.cpp135
-rw-r--r--src/mame/dataeast/deco156_m.h10
-rw-r--r--src/mame/dataeast/deco16ic.cpp1013
-rw-r--r--src/mame/dataeast/deco16ic.h176
-rw-r--r--src/mame/dataeast/deco222.cpp87
-rw-r--r--src/mame/dataeast/deco222.h70
-rw-r--r--src/mame/dataeast/deco32.cpp4034
-rw-r--r--src/mame/dataeast/deco32.h336
-rw-r--r--src/mame/dataeast/deco32_v.cpp724
-rw-r--r--src/mame/dataeast/deco_ace.cpp246
-rw-r--r--src/mame/dataeast/deco_ace.h58
-rw-r--r--src/mame/dataeast/deco_irq.cpp232
-rw-r--r--src/mame/dataeast/deco_irq.h92
-rw-r--r--src/mame/dataeast/deco_ld.cpp674
-rw-r--r--src/mame/dataeast/deco_mlc.cpp1087
-rw-r--r--src/mame/dataeast/deco_mlc.h104
-rw-r--r--src/mame/dataeast/deco_mlc_v.cpp585
-rw-r--r--src/mame/dataeast/decocass.cpp2206
-rw-r--r--src/mame/dataeast/decocass.h485
-rw-r--r--src/mame/dataeast/decocass_m.cpp1835
-rw-r--r--src/mame/dataeast/decocass_tape.cpp376
-rw-r--r--src/mame/dataeast/decocass_tape.h76
-rw-r--r--src/mame/dataeast/decocass_v.cpp783
-rw-r--r--src/mame/dataeast/decocpu6.cpp52
-rw-r--r--src/mame/dataeast/decocpu6.h36
-rw-r--r--src/mame/dataeast/decocpu7.cpp61
-rw-r--r--src/mame/dataeast/decocpu7.h42
-rw-r--r--src/mame/dataeast/decocrpt.cpp663
-rw-r--r--src/mame/dataeast/decocrpt.h6
-rw-r--r--src/mame/dataeast/decrmc3.cpp225
-rw-r--r--src/mame/dataeast/decrmc3.h113
-rw-r--r--src/mame/dataeast/deshoros.cpp327
-rw-r--r--src/mame/dataeast/dfruit2.cpp449
-rw-r--r--src/mame/dataeast/dietgo.cpp497
-rw-r--r--src/mame/dataeast/dreambal.cpp383
-rw-r--r--src/mame/dataeast/dvi.cpp388
-rw-r--r--src/mame/dataeast/exprraid.cpp1106
-rw-r--r--src/mame/dataeast/ffantasy_ms.cpp395
-rw-r--r--src/mame/dataeast/firetrap.cpp1298
-rw-r--r--src/mame/dataeast/funkyjet.cpp594
-rw-r--r--src/mame/dataeast/karnov.cpp1268
-rw-r--r--src/mame/dataeast/kchamp.cpp1003
-rw-r--r--src/mame/dataeast/kchamp.h107
-rw-r--r--src/mame/dataeast/kchamp_v.cpp101
-rw-r--r--src/mame/dataeast/kingobox.cpp1209
-rw-r--r--src/mame/dataeast/lemmings.cpp534
-rw-r--r--src/mame/dataeast/liberate.cpp1255
-rw-r--r--src/mame/dataeast/liberate.h113
-rw-r--r--src/mame/dataeast/liberate_v.cpp587
-rw-r--r--src/mame/dataeast/madalien.cpp453
-rw-r--r--src/mame/dataeast/madalien.h112
-rw-r--r--src/mame/dataeast/madalien_a.cpp261
-rw-r--r--src/mame/dataeast/madalien_v.cpp377
-rw-r--r--src/mame/dataeast/madmotor.cpp410
-rw-r--r--src/mame/dataeast/metlclsh.cpp744
-rw-r--r--src/mame/dataeast/mirage.cpp346
-rw-r--r--src/mame/dataeast/pcktgal.cpp609
-rw-r--r--src/mame/dataeast/pktgaldx.cpp665
-rw-r--r--src/mame/dataeast/progolf.cpp613
-rw-r--r--src/mame/dataeast/rohga.cpp2292
-rw-r--r--src/mame/dataeast/shootout.cpp697
-rw-r--r--src/mame/dataeast/sidepckt.cpp746
-rw-r--r--src/mame/dataeast/simpl156.cpp1236
-rw-r--r--src/mame/dataeast/sshangha.cpp723
-rw-r--r--src/mame/dataeast/stadhero.cpp456
-rw-r--r--src/mame/dataeast/supbtime.cpp678
-rw-r--r--src/mame/dataeast/thedeep.cpp640
-rw-r--r--src/mame/dataeast/tryout.cpp570
-rw-r--r--src/mame/dataeast/tumbleb.cpp4582
-rw-r--r--src/mame/dataeast/vaportra.cpp618
-rw-r--r--src/mame/ddr/README.md6
-rw-r--r--src/mame/ddr/ac1.cpp442
-rw-r--r--src/mame/ddr/bcs3.cpp570
-rw-r--r--src/mame/ddr/c80.cpp355
-rw-r--r--src/mame/ddr/chessmst.cpp299
-rw-r--r--src/mame/ddr/chessmstdm.cpp354
-rw-r--r--src/mame/ddr/huebler.cpp420
-rw-r--r--src/mame/ddr/huebler.h86
-rw-r--r--src/mame/ddr/jtc.cpp900
-rw-r--r--src/mame/ddr/k7659kb.cpp295
-rw-r--r--src/mame/ddr/k7659kb.h65
-rw-r--r--src/mame/ddr/kc.cpp315
-rw-r--r--src/mame/ddr/kc.h235
-rw-r--r--src/mame/ddr/kc_keyb.cpp605
-rw-r--r--src/mame/ddr/kc_keyb.h64
-rw-r--r--src/mame/ddr/kc_m.cpp1043
-rw-r--r--src/mame/ddr/kramermc.cpp295
-rw-r--r--src/mame/ddr/lc80.cpp454
-rw-r--r--src/mame/ddr/llc1.cpp370
-rw-r--r--src/mame/ddr/llc2.cpp309
-rw-r--r--src/mame/ddr/mc8020.cpp385
-rw-r--r--src/mame/ddr/mc8030.cpp301
-rw-r--r--src/mame/ddr/nanos.cpp549
-rw-r--r--src/mame/ddr/pcm.cpp384
-rw-r--r--src/mame/ddr/poly880.cpp380
-rw-r--r--src/mame/ddr/polyplay.cpp405
-rw-r--r--src/mame/ddr/polyplay.h89
-rw-r--r--src/mame/ddr/polyplay_a.cpp33
-rw-r--r--src/mame/ddr/polyplay_v.cpp60
-rw-r--r--src/mame/ddr/sc2.cpp261
-rw-r--r--src/mame/ddr/slc1.cpp252
-rw-r--r--src/mame/ddr/sprachmg.cpp431
-rw-r--r--src/mame/ddr/vcs80.cpp304
-rw-r--r--src/mame/dec/dc305.cpp87
-rw-r--r--src/mame/dec/dc305.h74
-rw-r--r--src/mame/dec/dc7061.cpp701
-rw-r--r--src/mame/dec/dc7061.h115
-rw-r--r--src/mame/dec/dc7085.cpp361
-rw-r--r--src/mame/dec/dc7085.h113
-rw-r--r--src/mame/dec/dct11em.cpp322
-rw-r--r--src/mame/dec/decioga.cpp175
-rw-r--r--src/mame/dec/decioga.h62
-rw-r--r--src/mame/dec/decmate2.cpp1013
-rw-r--r--src/mame/dec/dectalk.cpp988
-rw-r--r--src/mame/dec/decwritr.cpp497
-rw-r--r--src/mame/dec/dtc03.cpp372
-rw-r--r--src/mame/dec/jensen.cpp314
-rw-r--r--src/mame/dec/kn01.cpp529
-rw-r--r--src/mame/dec/kn02.cpp317
-rw-r--r--src/mame/dec/lk201.cpp916
-rw-r--r--src/mame/dec/lk201.h132
-rw-r--r--src/mame/dec/pdp1.cpp1816
-rw-r--r--src/mame/dec/pdp1.h463
-rw-r--r--src/mame/dec/pdp11.cpp490
-rw-r--r--src/mame/dec/pdp1_v.cpp587
-rw-r--r--src/mame/dec/rainbow.cpp3433
-rw-r--r--src/mame/dec/rx01.cpp295
-rw-r--r--src/mame/dec/rx01.h84
-rw-r--r--src/mame/dec/sfb.cpp172
-rw-r--r--src/mame/dec/sfb.h38
-rw-r--r--src/mame/dec/uvax1.cpp88
-rw-r--r--src/mame/dec/uvax2.cpp65
-rw-r--r--src/mame/dec/uvax3.cpp66
-rw-r--r--src/mame/dec/uvax3100.cpp184
-rw-r--r--src/mame/dec/vax11.cpp182
-rw-r--r--src/mame/dec/vk100.cpp1275
-rw-r--r--src/mame/dec/vt100.cpp906
-rw-r--r--src/mame/dec/vt220.cpp187
-rw-r--r--src/mame/dec/vt240.cpp782
-rw-r--r--src/mame/dec/vt320.cpp147
-rw-r--r--src/mame/dec/vt52.cpp447
-rw-r--r--src/mame/dec/vt520.cpp163
-rw-r--r--src/mame/dec/vt62.cpp126
-rw-r--r--src/mame/dec/vtvideo.cpp894
-rw-r--r--src/mame/dec/vtvideo.h112
-rw-r--r--src/mame/dg/aviion88k.cpp304
-rw-r--r--src/mame/dgrm/blackt96.cpp575
-rw-r--r--src/mame/dgrm/onetwo.cpp436
-rw-r--r--src/mame/dgrm/pokechmp.cpp462
-rw-r--r--src/mame/dms/dms5000.cpp123
-rw-r--r--src/mame/dms/dms86.cpp193
-rw-r--r--src/mame/dms/zsbc3.cpp130
-rw-r--r--src/mame/dooyong/dooyong.cpp2876
-rw-r--r--src/mame/dooyong/dooyong_tilemap.cpp263
-rw-r--r--src/mame/dooyong/dooyong_tilemap.h154
-rw-r--r--src/mame/dooyong/gundealr.cpp842
-rw-r--r--src/mame/drc/zrt80.cpp330
-rw-r--r--src/mame/drivers/1942.c487
-rw-r--r--src/mame/drivers/1943.c461
-rw-r--r--src/mame/drivers/1945kiii.c288
-rw-r--r--src/mame/drivers/20pacgal.c347
-rw-r--r--src/mame/drivers/2mindril.c469
-rw-r--r--src/mame/drivers/39in1.c1223
-rw-r--r--src/mame/drivers/3super8.c122
-rw-r--r--src/mame/drivers/40love.c1274
-rw-r--r--src/mame/drivers/4enraya.c207
-rw-r--r--src/mame/drivers/4roses.c471
-rw-r--r--src/mame/drivers/8080bw.c2758
-rw-r--r--src/mame/drivers/86lions.c406
-rw-r--r--src/mame/drivers/88games.c501
-rw-r--r--src/mame/drivers/ace.c356
-rw-r--r--src/mame/drivers/acefruit.c716
-rw-r--r--src/mame/drivers/acommand.c630
-rw-r--r--src/mame/drivers/actfancr.c600
-rw-r--r--src/mame/drivers/adp.c671
-rw-r--r--src/mame/drivers/aeroboto.c338
-rw-r--r--src/mame/drivers/aerofgt.c2453
-rw-r--r--src/mame/drivers/airbustr.c787
-rw-r--r--src/mame/drivers/ajax.c395
-rw-r--r--src/mame/drivers/aladbl.c164
-rw-r--r--src/mame/drivers/albazc.c274
-rw-r--r--src/mame/drivers/albazg.c389
-rw-r--r--src/mame/drivers/aleck64.c634
-rw-r--r--src/mame/drivers/alg.c810
-rw-r--r--src/mame/drivers/aliens.c509
-rw-r--r--src/mame/drivers/alpha68k.c3333
-rw-r--r--src/mame/drivers/ambush.c299
-rw-r--r--src/mame/drivers/ampoker2.c1227
-rw-r--r--src/mame/drivers/amspdwy.c397
-rw-r--r--src/mame/drivers/angelkds.c750
-rw-r--r--src/mame/drivers/appoooh.c580
-rw-r--r--src/mame/drivers/aquarium.c425
-rw-r--r--src/mame/drivers/arabian.c466
-rw-r--r--src/mame/drivers/arcadecl.c411
-rw-r--r--src/mame/drivers/arcadia.c831
-rw-r--r--src/mame/drivers/argus.c783
-rw-r--r--src/mame/drivers/aristmk4.c531
-rw-r--r--src/mame/drivers/aristmk5.c175
-rw-r--r--src/mame/drivers/arkanoid.c1201
-rw-r--r--src/mame/drivers/armedf.c1447
-rw-r--r--src/mame/drivers/artmagic.c938
-rw-r--r--src/mame/drivers/ashnojoe.c465
-rw-r--r--src/mame/drivers/asterix.c372
-rw-r--r--src/mame/drivers/asteroid.c947
-rw-r--r--src/mame/drivers/astinvad.c702
-rw-r--r--src/mame/drivers/astrocde.c1806
-rw-r--r--src/mame/drivers/astrocorp.c448
-rw-r--r--src/mame/drivers/astrof.c1246
-rw-r--r--src/mame/drivers/asuka.c1385
-rw-r--r--src/mame/drivers/atarifb.c743
-rw-r--r--src/mame/drivers/atarig1.c1119
-rw-r--r--src/mame/drivers/atarig42.c778
-rw-r--r--src/mame/drivers/atarigt.c1287
-rw-r--r--src/mame/drivers/atarigx2.c2128
-rw-r--r--src/mame/drivers/atarisy1.c2425
-rw-r--r--src/mame/drivers/atarisy2.c3289
-rw-r--r--src/mame/drivers/ataxx.c803
-rw-r--r--src/mame/drivers/atetris.c515
-rw-r--r--src/mame/drivers/attckufo.c168
-rw-r--r--src/mame/drivers/avalnche.c282
-rw-r--r--src/mame/drivers/aztarac.c221
-rw-r--r--src/mame/drivers/backfire.c675
-rw-r--r--src/mame/drivers/badlands.c782
-rw-r--r--src/mame/drivers/bagman.c971
-rw-r--r--src/mame/drivers/balsente.c2171
-rw-r--r--src/mame/drivers/bankp.c362
-rw-r--r--src/mame/drivers/baraduke.c572
-rw-r--r--src/mame/drivers/batman.c359
-rw-r--r--src/mame/drivers/battlane.c381
-rw-r--r--src/mame/drivers/battlera.c348
-rw-r--r--src/mame/drivers/battlex.c288
-rw-r--r--src/mame/drivers/battlnts.c351
-rw-r--r--src/mame/drivers/bbusters.c957
-rw-r--r--src/mame/drivers/beaminv.c357
-rw-r--r--src/mame/drivers/beathead.c529
-rw-r--r--src/mame/drivers/beezer.c158
-rw-r--r--src/mame/drivers/berzerk.c964
-rw-r--r--src/mame/drivers/bestleag.c412
-rw-r--r--src/mame/drivers/bfcobra.c1906
-rw-r--r--src/mame/drivers/bfm_sc1.c1413
-rw-r--r--src/mame/drivers/bfm_sc2.c4264
-rw-r--r--src/mame/drivers/bfmsys85.c487
-rw-r--r--src/mame/drivers/big10.c291
-rw-r--r--src/mame/drivers/bigevglf.c553
-rw-r--r--src/mame/drivers/bigfghtr.c625
-rw-r--r--src/mame/drivers/bigstrkb.c275
-rw-r--r--src/mame/drivers/bingoc.c182
-rw-r--r--src/mame/drivers/bingor.c272
-rw-r--r--src/mame/drivers/bionicc.c548
-rw-r--r--src/mame/drivers/bishi.c503
-rw-r--r--src/mame/drivers/bishjan.c1023
-rw-r--r--src/mame/drivers/bking.c785
-rw-r--r--src/mame/drivers/blackt96.c543
-rw-r--r--src/mame/drivers/bladestl.c361
-rw-r--r--src/mame/drivers/blktiger.c538
-rw-r--r--src/mame/drivers/blmbycar.c530
-rw-r--r--src/mame/drivers/blockade.c570
-rw-r--r--src/mame/drivers/blockhl.c291
-rw-r--r--src/mame/drivers/blockout.c364
-rw-r--r--src/mame/drivers/bloodbro.c659
-rw-r--r--src/mame/drivers/blstroid.c439
-rw-r--r--src/mame/drivers/blueprnt.c382
-rw-r--r--src/mame/drivers/bmcbowl.c557
-rw-r--r--src/mame/drivers/bnstars.c1444
-rw-r--r--src/mame/drivers/bogeyman.c284
-rw-r--r--src/mame/drivers/bombjack.c431
-rw-r--r--src/mame/drivers/boogwing.c536
-rw-r--r--src/mame/drivers/bottom9.c489
-rw-r--r--src/mame/drivers/boxer.c347
-rw-r--r--src/mame/drivers/brkthru.c597
-rw-r--r--src/mame/drivers/bsktball.c271
-rw-r--r--src/mame/drivers/btime.c2126
-rw-r--r--src/mame/drivers/btoads.c407
-rw-r--r--src/mame/drivers/bublbobl.c1295
-rw-r--r--src/mame/drivers/buggychl.c500
-rw-r--r--src/mame/drivers/buster.c121
-rw-r--r--src/mame/drivers/bwidow.c949
-rw-r--r--src/mame/drivers/bwing.c611
-rw-r--r--src/mame/drivers/bzone.c826
-rw-r--r--src/mame/drivers/cabal.c873
-rw-r--r--src/mame/drivers/cabaret.c378
-rw-r--r--src/mame/drivers/calchase.c716
-rw-r--r--src/mame/drivers/calomega.c3020
-rw-r--r--src/mame/drivers/calorie.c474
-rw-r--r--src/mame/drivers/canyon.c327
-rw-r--r--src/mame/drivers/capbowl.c510
-rw-r--r--src/mame/drivers/cardline.c249
-rw-r--r--src/mame/drivers/carjmbre.c235
-rw-r--r--src/mame/drivers/carpolo.c322
-rw-r--r--src/mame/drivers/carrera.c364
-rw-r--r--src/mame/drivers/caswin.c339
-rw-r--r--src/mame/drivers/cave.c4119
-rw-r--r--src/mame/drivers/cb2001.c235
-rw-r--r--src/mame/drivers/cball.c246
-rw-r--r--src/mame/drivers/cbasebal.c314
-rw-r--r--src/mame/drivers/cbuster.c534
-rw-r--r--src/mame/drivers/ccastles.c704
-rw-r--r--src/mame/drivers/cchance.c226
-rw-r--r--src/mame/drivers/cchasm.c266
-rw-r--r--src/mame/drivers/cclimber.c1966
-rw-r--r--src/mame/drivers/centiped.c2022
-rw-r--r--src/mame/drivers/chaknpop.c318
-rw-r--r--src/mame/drivers/cham24.c295
-rw-r--r--src/mame/drivers/champbas.c1104
-rw-r--r--src/mame/drivers/champbwl.c386
-rw-r--r--src/mame/drivers/chanbara.c412
-rw-r--r--src/mame/drivers/changela.c556
-rw-r--r--src/mame/drivers/cheekyms.c183
-rw-r--r--src/mame/drivers/chihiro.c215
-rw-r--r--src/mame/drivers/chinagat.c897
-rw-r--r--src/mame/drivers/chinsan.c592
-rw-r--r--src/mame/drivers/chqflag.c447
-rw-r--r--src/mame/drivers/chsuper.c269
-rw-r--r--src/mame/drivers/cidelsa.c644
-rw-r--r--src/mame/drivers/cinemat.c1502
-rw-r--r--src/mame/drivers/circus.c540
-rw-r--r--src/mame/drivers/circusc.c557
-rw-r--r--src/mame/drivers/cischeat.c3052
-rw-r--r--src/mame/drivers/citycon.c352
-rw-r--r--src/mame/drivers/clayshoo.c353
-rw-r--r--src/mame/drivers/cliffhgr.c788
-rw-r--r--src/mame/drivers/cloak.c628
-rw-r--r--src/mame/drivers/cloud9.c555
-rw-r--r--src/mame/drivers/clshroad.c468
-rw-r--r--src/mame/drivers/cmmb.c315
-rw-r--r--src/mame/drivers/cninja.c1725
-rw-r--r--src/mame/drivers/cntsteer.c999
-rw-r--r--src/mame/drivers/coinmstr.c1217
-rw-r--r--src/mame/drivers/cojag.c1658
-rw-r--r--src/mame/drivers/combatsc.c820
-rw-r--r--src/mame/drivers/comebaby.c108
-rw-r--r--src/mame/drivers/commando.c551
-rw-r--r--src/mame/drivers/compgolf.c302
-rw-r--r--src/mame/drivers/contra.c431
-rw-r--r--src/mame/drivers/coolpool.c1017
-rw-r--r--src/mame/drivers/coolridr.c328
-rw-r--r--src/mame/drivers/cop01.c589
-rw-r--r--src/mame/drivers/copsnrob.c328
-rw-r--r--src/mame/drivers/cosmic.c1600
-rw-r--r--src/mame/drivers/cowrace.c257
-rw-r--r--src/mame/drivers/cps1.c8733
-rw-r--r--src/mame/drivers/cps2.c8653
-rw-r--r--src/mame/drivers/cps3.c2994
-rw-r--r--src/mame/drivers/crbaloon.c442
-rw-r--r--src/mame/drivers/crgolf.c600
-rw-r--r--src/mame/drivers/crimfght.c380
-rw-r--r--src/mame/drivers/crospang.c569
-rw-r--r--src/mame/drivers/crshrace.c578
-rw-r--r--src/mame/drivers/crystal.c921
-rw-r--r--src/mame/drivers/cshooter.c703
-rw-r--r--src/mame/drivers/cubeqst.c669
-rw-r--r--src/mame/drivers/cubocd32.c1312
-rw-r--r--src/mame/drivers/cultures.c441
-rw-r--r--src/mame/drivers/cvs.c1665
-rw-r--r--src/mame/drivers/cyberbal.c1011
-rw-r--r--src/mame/drivers/cybertnk.c697
-rw-r--r--src/mame/drivers/dacholer.c502
-rw-r--r--src/mame/drivers/dambustr.c299
-rw-r--r--src/mame/drivers/darius.c1224
-rw-r--r--src/mame/drivers/darkhors.c967
-rw-r--r--src/mame/drivers/darkmist.c500
-rw-r--r--src/mame/drivers/darkseal.c466
-rw-r--r--src/mame/drivers/dassault.c851
-rw-r--r--src/mame/drivers/dblewing.c781
-rw-r--r--src/mame/drivers/dbz.c469
-rw-r--r--src/mame/drivers/dcheese.c807
-rw-r--r--src/mame/drivers/dcon.c404
-rw-r--r--src/mame/drivers/dday.c341
-rw-r--r--src/mame/drivers/ddayjlc.c581
-rw-r--r--src/mame/drivers/ddealer.c653
-rw-r--r--src/mame/drivers/ddenlovr.c8916
-rw-r--r--src/mame/drivers/ddragon.c2050
-rw-r--r--src/mame/drivers/ddragon3.c992
-rw-r--r--src/mame/drivers/ddrible.c350
-rw-r--r--src/mame/drivers/ddz.c94
-rw-r--r--src/mame/drivers/deadang.c422
-rw-r--r--src/mame/drivers/dec0.c2722
-rw-r--r--src/mame/drivers/dec8.c3467
-rw-r--r--src/mame/drivers/deco156.c685
-rw-r--r--src/mame/drivers/deco32.c3103
-rw-r--r--src/mame/drivers/deco_ld.c504
-rw-r--r--src/mame/drivers/deco_mlc.c768
-rw-r--r--src/mame/drivers/decocass.c1130
-rw-r--r--src/mame/drivers/deniam.c408
-rw-r--r--src/mame/drivers/deshoros.c209
-rw-r--r--src/mame/drivers/destroyr.c387
-rw-r--r--src/mame/drivers/dgpix.c601
-rw-r--r--src/mame/drivers/dietgo.c340
-rw-r--r--src/mame/drivers/discoboy.c543
-rw-r--r--src/mame/drivers/diverboy.c248
-rw-r--r--src/mame/drivers/djboy.c1063
-rw-r--r--src/mame/drivers/djmain.c2268
-rw-r--r--src/mame/drivers/dkong.c2983
-rw-r--r--src/mame/drivers/dlair.c983
-rw-r--r--src/mame/drivers/dmndrby.c636
-rw-r--r--src/mame/drivers/docastle.c1037
-rw-r--r--src/mame/drivers/dogfgt.c329
-rw-r--r--src/mame/drivers/dominob.c300
-rw-r--r--src/mame/drivers/dooyong.c1863
-rw-r--r--src/mame/drivers/dorachan.c264
-rw-r--r--src/mame/drivers/dotrikun.c102
-rw-r--r--src/mame/drivers/dragrace.c377
-rw-r--r--src/mame/drivers/dreamwld.c463
-rw-r--r--src/mame/drivers/drgnmst.c552
-rw-r--r--src/mame/drivers/dribling.c371
-rw-r--r--src/mame/drivers/drmicro.c286
-rw-r--r--src/mame/drivers/drtomy.c306
-rw-r--r--src/mame/drivers/drw80pkr.c362
-rw-r--r--src/mame/drivers/dunhuang.c736
-rw-r--r--src/mame/drivers/dwarfd.c793
-rw-r--r--src/mame/drivers/dynadice.c265
-rw-r--r--src/mame/drivers/dynax.c6255
-rw-r--r--src/mame/drivers/dynduke.c538
-rw-r--r--src/mame/drivers/egghunt.c422
-rw-r--r--src/mame/drivers/embargo.c278
-rw-r--r--src/mame/drivers/enigma2.c671
-rw-r--r--src/mame/drivers/eolith.c1059
-rw-r--r--src/mame/drivers/eolith16.c260
-rw-r--r--src/mame/drivers/eolithsp.c103
-rw-r--r--src/mame/drivers/epos.c647
-rw-r--r--src/mame/drivers/eprom.c762
-rw-r--r--src/mame/drivers/equites.c1883
-rw-r--r--src/mame/drivers/ertictac.c444
-rw-r--r--src/mame/drivers/esd16.c1143
-rw-r--r--src/mame/drivers/esh.c386
-rw-r--r--src/mame/drivers/espial.c425
-rw-r--r--src/mame/drivers/esripsys.c1132
-rw-r--r--src/mame/drivers/ettrivia.c425
-rw-r--r--src/mame/drivers/exedexes.c342
-rw-r--r--src/mame/drivers/exerion.c486
-rw-r--r--src/mame/drivers/exidy.c1460
-rw-r--r--src/mame/drivers/exidy440.c2023
-rw-r--r--src/mame/drivers/expro02.c729
-rw-r--r--src/mame/drivers/exprraid.c763
-rw-r--r--src/mame/drivers/exterm.c560
-rw-r--r--src/mame/drivers/exzisus.c380
-rw-r--r--src/mame/drivers/f-32.c236
-rw-r--r--src/mame/drivers/f1gp.c674
-rw-r--r--src/mame/drivers/fantland.c1378
-rw-r--r--src/mame/drivers/fastfred.c997
-rw-r--r--src/mame/drivers/fastlane.c268
-rw-r--r--src/mame/drivers/fcombat.c444
-rw-r--r--src/mame/drivers/fcrash.c848
-rw-r--r--src/mame/drivers/feversoc.c287
-rw-r--r--src/mame/drivers/fgoal.c424
-rw-r--r--src/mame/drivers/finalizr.c352
-rw-r--r--src/mame/drivers/findout.c683
-rw-r--r--src/mame/drivers/firebeat.c2417
-rw-r--r--src/mame/drivers/firefox.c810
-rw-r--r--src/mame/drivers/firetrap.c771
-rw-r--r--src/mame/drivers/firetrk.c1033
-rw-r--r--src/mame/drivers/fitfight.c993
-rw-r--r--src/mame/drivers/flkatck.c289
-rw-r--r--src/mame/drivers/flower.c369
-rw-r--r--src/mame/drivers/flstory.c1057
-rw-r--r--src/mame/drivers/flyball.c307
-rw-r--r--src/mame/drivers/foodf.c483
-rw-r--r--src/mame/drivers/forte2.c172
-rw-r--r--src/mame/drivers/fortecar.c321
-rw-r--r--src/mame/drivers/freekick.c1107
-rw-r--r--src/mame/drivers/fromanc2.c827
-rw-r--r--src/mame/drivers/fromance.c1309
-rw-r--r--src/mame/drivers/funkybee.c432
-rw-r--r--src/mame/drivers/funkyjet.c396
-rw-r--r--src/mame/drivers/funworld.c3172
-rw-r--r--src/mame/drivers/funybubl.c323
-rw-r--r--src/mame/drivers/fuukifg2.c671
-rw-r--r--src/mame/drivers/fuukifg3.c705
-rw-r--r--src/mame/drivers/gaelco.c805
-rw-r--r--src/mame/drivers/gaelco2.c1430
-rw-r--r--src/mame/drivers/gaelco3d.c1184
-rw-r--r--src/mame/drivers/gaiden.c1404
-rw-r--r--src/mame/drivers/gal3.c356
-rw-r--r--src/mame/drivers/galaga.c3370
-rw-r--r--src/mame/drivers/galastrm.c396
-rw-r--r--src/mame/drivers/galaxi.c415
-rw-r--r--src/mame/drivers/galaxia.c325
-rw-r--r--src/mame/drivers/galaxian.c2931
-rw-r--r--src/mame/drivers/galaxold.c3027
-rw-r--r--src/mame/drivers/galdrvr.c5254
-rw-r--r--src/mame/drivers/galivan.c1012
-rw-r--r--src/mame/drivers/galpani2.c957
-rw-r--r--src/mame/drivers/galpani3.c964
-rw-r--r--src/mame/drivers/galpanic.c1298
-rw-r--r--src/mame/drivers/galspnbl.c308
-rw-r--r--src/mame/drivers/gamecstl.c778
-rw-r--r--src/mame/drivers/gameplan.c1204
-rw-r--r--src/mame/drivers/gaplus.c827
-rw-r--r--src/mame/drivers/gatron.c505
-rw-r--r--src/mame/drivers/gauntlet.c1724
-rw-r--r--src/mame/drivers/gberet.c563
-rw-r--r--src/mame/drivers/gbusters.c390
-rw-r--r--src/mame/drivers/gcpinbal.c464
-rw-r--r--src/mame/drivers/genesis.c625
-rw-r--r--src/mame/drivers/getrivia.c870
-rw-r--r--src/mame/drivers/ghosteo.c602
-rw-r--r--src/mame/drivers/gijoe.c409
-rw-r--r--src/mame/drivers/ginganin.c458
-rw-r--r--src/mame/drivers/gladiatr.c1058
-rw-r--r--src/mame/drivers/glass.c328
-rw-r--r--src/mame/drivers/gng.c707
-rw-r--r--src/mame/drivers/go2000.c334
-rw-r--r--src/mame/drivers/goal92.c413
-rw-r--r--src/mame/drivers/goindol.c408
-rw-r--r--src/mame/drivers/goldnpkr.c3315
-rw-r--r--src/mame/drivers/goldstar.c8034
-rw-r--r--src/mame/drivers/gomoku.c182
-rw-r--r--src/mame/drivers/good.c302
-rw-r--r--src/mame/drivers/goodejan.c462
-rw-r--r--src/mame/drivers/gotcha.c381
-rw-r--r--src/mame/drivers/gottlieb.c2612
-rw-r--r--src/mame/drivers/gotya.c270
-rw-r--r--src/mame/drivers/gpworld.c518
-rw-r--r--src/mame/drivers/gradius3.c484
-rw-r--r--src/mame/drivers/grchamp.c793
-rw-r--r--src/mame/drivers/gridlee.c502
-rw-r--r--src/mame/drivers/groundfx.c499
-rw-r--r--src/mame/drivers/gstream.c554
-rw-r--r--src/mame/drivers/gstriker.c1067
-rw-r--r--src/mame/drivers/gsword.c968
-rw-r--r--src/mame/drivers/gticlub.c1254
-rw-r--r--src/mame/drivers/guab.c926
-rw-r--r--src/mame/drivers/gumbo.c409
-rw-r--r--src/mame/drivers/gunbustr.c425
-rw-r--r--src/mame/drivers/gundealr.c579
-rw-r--r--src/mame/drivers/gunpey.c169
-rw-r--r--src/mame/drivers/gunsmoke.c527
-rw-r--r--src/mame/drivers/gyruss.c696
-rw-r--r--src/mame/drivers/halleys.c2238
-rw-r--r--src/mame/drivers/hanaawas.c254
-rw-r--r--src/mame/drivers/harddriv.c3984
-rw-r--r--src/mame/drivers/hcastle.c353
-rw-r--r--src/mame/drivers/hexa.c216
-rw-r--r--src/mame/drivers/hexion.c290
-rw-r--r--src/mame/drivers/higemaru.c227
-rw-r--r--src/mame/drivers/highvdeo.c1229
-rw-r--r--src/mame/drivers/hikaru.c491
-rw-r--r--src/mame/drivers/himesiki.c343
-rw-r--r--src/mame/drivers/hitme.c582
-rw-r--r--src/mame/drivers/hitpoker.c520
-rw-r--r--src/mame/drivers/hnayayoi.c695
-rw-r--r--src/mame/drivers/hng64.c2114
-rw-r--r--src/mame/drivers/holeland.c514
-rw-r--r--src/mame/drivers/homedata.c1813
-rw-r--r--src/mame/drivers/homerun.c285
-rw-r--r--src/mame/drivers/hornet.c1601
-rw-r--r--src/mame/drivers/hotblock.c225
-rw-r--r--src/mame/drivers/hshavoc.c321
-rw-r--r--src/mame/drivers/hvyunit.c758
-rw-r--r--src/mame/drivers/hyhoo.c334
-rw-r--r--src/mame/drivers/hyperspt.c505
-rw-r--r--src/mame/drivers/hyprduel.c869
-rw-r--r--src/mame/drivers/igs009.c796
-rw-r--r--src/mame/drivers/igs017.c1383
-rw-r--r--src/mame/drivers/igs_blit.c3368
-rw-r--r--src/mame/drivers/igs_m027.c606
-rw-r--r--src/mame/drivers/igs_m68.c542
-rw-r--r--src/mame/drivers/igspoker.c2253
-rw-r--r--src/mame/drivers/ikki.c301
-rw-r--r--src/mame/drivers/ilpag.c559
-rw-r--r--src/mame/drivers/imolagp.c532
-rw-r--r--src/mame/drivers/intrscti.c131
-rw-r--r--src/mame/drivers/inufuku.c430
-rw-r--r--src/mame/drivers/iqblock.c473
-rw-r--r--src/mame/drivers/irobot.c382
-rw-r--r--src/mame/drivers/ironhors.c513
-rw-r--r--src/mame/drivers/istellar.c404
-rw-r--r--src/mame/drivers/itech32.c4232
-rw-r--r--src/mame/drivers/itech8.c2777
-rw-r--r--src/mame/drivers/itgambl2.c796
-rw-r--r--src/mame/drivers/itgambl3.c432
-rw-r--r--src/mame/drivers/itgamble.c614
-rw-r--r--src/mame/drivers/jack.c1447
-rw-r--r--src/mame/drivers/jackal.c396
-rw-r--r--src/mame/drivers/jackie.c574
-rw-r--r--src/mame/drivers/jackpool.c306
-rw-r--r--src/mame/drivers/jailbrek.c435
-rw-r--r--src/mame/drivers/jalmah.c2371
-rw-r--r--src/mame/drivers/jangou.c1114
-rw-r--r--src/mame/drivers/janshi.c120
-rw-r--r--src/mame/drivers/jantotsu.c485
-rw-r--r--src/mame/drivers/jchan.c786
-rw-r--r--src/mame/drivers/jedi.c411
-rw-r--r--src/mame/drivers/jokrwild.c461
-rw-r--r--src/mame/drivers/jollyjgr.c451
-rw-r--r--src/mame/drivers/jongkyo.c485
-rw-r--r--src/mame/drivers/jpmimpct.c1357
-rw-r--r--src/mame/drivers/jpmsys5.c687
-rw-r--r--src/mame/drivers/jrpacman.c388
-rw-r--r--src/mame/drivers/junofrst.c387
-rw-r--r--src/mame/drivers/kaneko16.c4082
-rw-r--r--src/mame/drivers/kangaroo.c578
-rw-r--r--src/mame/drivers/karnov.c1066
-rw-r--r--src/mame/drivers/kchamp.c703
-rw-r--r--src/mame/drivers/kickgoal.c816
-rw-r--r--src/mame/drivers/kingdrby.c765
-rw-r--r--src/mame/drivers/kingobox.c821
-rw-r--r--src/mame/drivers/kingpin.c219
-rw-r--r--src/mame/drivers/kinst.c922
-rw-r--r--src/mame/drivers/klax.c372
-rw-r--r--src/mame/drivers/kncljoe.c402
-rw-r--r--src/mame/drivers/koftball.c288
-rw-r--r--src/mame/drivers/koikoi.c311
-rw-r--r--src/mame/drivers/konamigq.c516
-rw-r--r--src/mame/drivers/konamigv.c906
-rw-r--r--src/mame/drivers/konamigx.c3614
-rw-r--r--src/mame/drivers/konamim2.c1242
-rw-r--r--src/mame/drivers/kopunch.c239
-rw-r--r--src/mame/drivers/ksayakyu.c320
-rw-r--r--src/mame/drivers/ksys573.c4776
-rw-r--r--src/mame/drivers/kungfur.c388
-rw-r--r--src/mame/drivers/kyugo.c1246
-rw-r--r--src/mame/drivers/labyrunr.c292
-rw-r--r--src/mame/drivers/ladybug.c984
-rw-r--r--src/mame/drivers/ladyfrog.c329
-rw-r--r--src/mame/drivers/laserbas.c241
-rw-r--r--src/mame/drivers/laserbat.c938
-rw-r--r--src/mame/drivers/lasso.c853
-rw-r--r--src/mame/drivers/lastduel.c834
-rw-r--r--src/mame/drivers/lastfght.c513
-rw-r--r--src/mame/drivers/lazercmd.c859
-rw-r--r--src/mame/drivers/legionna.c2127
-rw-r--r--src/mame/drivers/leland.c2477
-rw-r--r--src/mame/drivers/lemmings.c325
-rw-r--r--src/mame/drivers/lethal.c878
-rw-r--r--src/mame/drivers/lethalj.c943
-rw-r--r--src/mame/drivers/lgp.c465
-rw-r--r--src/mame/drivers/liberate.c1357
-rw-r--r--src/mame/drivers/liberatr.c502
-rw-r--r--src/mame/drivers/limenko.c1047
-rw-r--r--src/mame/drivers/littlerb.c392
-rw-r--r--src/mame/drivers/lkage.c657
-rw-r--r--src/mame/drivers/lockon.c758
-rw-r--r--src/mame/drivers/looping.c810
-rw-r--r--src/mame/drivers/lordgun.c721
-rw-r--r--src/mame/drivers/lsasquad.c740
-rw-r--r--src/mame/drivers/ltcasino.c713
-rw-r--r--src/mame/drivers/luckgrln.c196
-rw-r--r--src/mame/drivers/lucky74.c1385
-rw-r--r--src/mame/drivers/lvcards.c590
-rw-r--r--src/mame/drivers/lwings.c1314
-rw-r--r--src/mame/drivers/m10.c1048
-rw-r--r--src/mame/drivers/m107.c676
-rw-r--r--src/mame/drivers/m14.c331
-rw-r--r--src/mame/drivers/m52.c543
-rw-r--r--src/mame/drivers/m57.c331
-rw-r--r--src/mame/drivers/m58.c369
-rw-r--r--src/mame/drivers/m62.c2204
-rw-r--r--src/mame/drivers/m63.c908
-rw-r--r--src/mame/drivers/m72.c3523
-rw-r--r--src/mame/drivers/m79amb.c242
-rw-r--r--src/mame/drivers/m90.c1301
-rw-r--r--src/mame/drivers/m92.c2194
-rw-r--r--src/mame/drivers/macrossp.c777
-rw-r--r--src/mame/drivers/macs.c616
-rw-r--r--src/mame/drivers/madalien.c423
-rw-r--r--src/mame/drivers/madmotor.c337
-rw-r--r--src/mame/drivers/magic10.c1141
-rw-r--r--src/mame/drivers/magicard.c617
-rw-r--r--src/mame/drivers/magicfly.c837
-rw-r--r--src/mame/drivers/magictg.c226
-rw-r--r--src/mame/drivers/magmax.c452
-rw-r--r--src/mame/drivers/mainevt.c722
-rw-r--r--src/mame/drivers/mainsnk.c501
-rw-r--r--src/mame/drivers/malzak.c458
-rw-r--r--src/mame/drivers/mappy.c2169
-rw-r--r--src/mame/drivers/marineb.c853
-rw-r--r--src/mame/drivers/marinedt.c630
-rw-r--r--src/mame/drivers/mario.c567
-rw-r--r--src/mame/drivers/markham.c252
-rw-r--r--src/mame/drivers/mastboy.c977
-rw-r--r--src/mame/drivers/matmania.c599
-rw-r--r--src/mame/drivers/maxaflex.c544
-rw-r--r--src/mame/drivers/maygay1b.c826
-rw-r--r--src/mame/drivers/maygayv1.c1107
-rw-r--r--src/mame/drivers/mayumi.c329
-rw-r--r--src/mame/drivers/mazerbla.c1614
-rw-r--r--src/mame/drivers/mcatadv.c672
-rw-r--r--src/mame/drivers/mcr.c2614
-rw-r--r--src/mame/drivers/mcr3.c1633
-rw-r--r--src/mame/drivers/mcr68.c1516
-rw-r--r--src/mame/drivers/meadows.c836
-rw-r--r--src/mame/drivers/mediagx.c1245
-rw-r--r--src/mame/drivers/megadriv.c6611
-rw-r--r--src/mame/drivers/megadriv.h58
-rw-r--r--src/mame/drivers/megaplay.c1066
-rw-r--r--src/mame/drivers/megasys1.c3920
-rw-r--r--src/mame/drivers/megatech.c1305
-rw-r--r--src/mame/drivers/megazone.c528
-rw-r--r--src/mame/drivers/meijinsn.c372
-rw-r--r--src/mame/drivers/merit.c1922
-rw-r--r--src/mame/drivers/meritm.c1615
-rw-r--r--src/mame/drivers/mermaid.c489
-rw-r--r--src/mame/drivers/metlclsh.c433
-rw-r--r--src/mame/drivers/metro.c5903
-rw-r--r--src/mame/drivers/mexico86.c629
-rw-r--r--src/mame/drivers/mgolf.c340
-rw-r--r--src/mame/drivers/mhavoc.c747
-rw-r--r--src/mame/drivers/micro3d.c978
-rw-r--r--src/mame/drivers/midas.c582
-rw-r--r--src/mame/drivers/midtunit.c1298
-rw-r--r--src/mame/drivers/midvunit.c1695
-rw-r--r--src/mame/drivers/midwunit.c1245
-rw-r--r--src/mame/drivers/midxunit.c361
-rw-r--r--src/mame/drivers/midyunit.c2372
-rw-r--r--src/mame/drivers/midzeus.c1398
-rw-r--r--src/mame/drivers/mikie.c314
-rw-r--r--src/mame/drivers/mil4000.c458
-rw-r--r--src/mame/drivers/miniboy7.c332
-rw-r--r--src/mame/drivers/minivadr.c103
-rw-r--r--src/mame/drivers/mirage.c384
-rw-r--r--src/mame/drivers/mirax.c457
-rw-r--r--src/mame/drivers/missb2.c445
-rw-r--r--src/mame/drivers/missile.c1203
-rw-r--r--src/mame/drivers/mitchell.c2197
-rw-r--r--src/mame/drivers/mjkjidai.c448
-rw-r--r--src/mame/drivers/mjsister.c362
-rw-r--r--src/mame/drivers/mlanding.c804
-rw-r--r--src/mame/drivers/model1.c1538
-rw-r--r--src/mame/drivers/model2.c4538
-rw-r--r--src/mame/drivers/model3.c5314
-rw-r--r--src/mame/drivers/mogura.c214
-rw-r--r--src/mame/drivers/mole.c242
-rw-r--r--src/mame/drivers/momoko.c327
-rw-r--r--src/mame/drivers/moo.c827
-rw-r--r--src/mame/drivers/mosaic.c360
-rw-r--r--src/mame/drivers/mouser.c285
-rw-r--r--src/mame/drivers/mpoker.c614
-rw-r--r--src/mame/drivers/mpu4.c1940
-rw-r--r--src/mame/drivers/mpu4drvr.c2085
-rw-r--r--src/mame/drivers/mpu5.c68
-rw-r--r--src/mame/drivers/mquake.c469
-rw-r--r--src/mame/drivers/mrdo.c397
-rw-r--r--src/mame/drivers/mrflea.c378
-rw-r--r--src/mame/drivers/mrjong.c254
-rw-r--r--src/mame/drivers/ms32.c2207
-rw-r--r--src/mame/drivers/msisaac.c570
-rw-r--r--src/mame/drivers/mugsmash.c470
-rw-r--r--src/mame/drivers/multfish.c1304
-rw-r--r--src/mame/drivers/multigam.c736
-rw-r--r--src/mame/drivers/munchmo.c367
-rw-r--r--src/mame/drivers/murogem.c275
-rw-r--r--src/mame/drivers/murogmbl.c211
-rw-r--r--src/mame/drivers/mustache.c309
-rw-r--r--src/mame/drivers/mw8080bw.c3092
-rw-r--r--src/mame/drivers/mwarr.c548
-rw-r--r--src/mame/drivers/mystston.c301
-rw-r--r--src/mame/drivers/mystwarr.c1993
-rw-r--r--src/mame/drivers/n8080.c800
-rw-r--r--src/mame/drivers/namcofl.c747
-rw-r--r--src/mame/drivers/namcoic.c1687
-rw-r--r--src/mame/drivers/namcona1.c1415
-rw-r--r--src/mame/drivers/namconb1.c2012
-rw-r--r--src/mame/drivers/namcond1.c409
-rw-r--r--src/mame/drivers/namcos1.c2748
-rw-r--r--src/mame/drivers/namcos10.c515
-rw-r--r--src/mame/drivers/namcos11.c1659
-rw-r--r--src/mame/drivers/namcos12.c2444
-rw-r--r--src/mame/drivers/namcos2.c5080
-rw-r--r--src/mame/drivers/namcos21.c2591
-rw-r--r--src/mame/drivers/namcos22.c5651
-rw-r--r--src/mame/drivers/namcos23.c1882
-rw-r--r--src/mame/drivers/namcos86.c1567
-rw-r--r--src/mame/drivers/naomi.c5424
-rw-r--r--src/mame/drivers/naughtyb.c831
-rw-r--r--src/mame/drivers/nbmj8688.c4126
-rw-r--r--src/mame/drivers/nbmj8891.c3918
-rw-r--r--src/mame/drivers/nbmj8991.c2231
-rw-r--r--src/mame/drivers/nbmj9195.c3849
-rw-r--r--src/mame/drivers/nemesis.c2490
-rw-r--r--src/mame/drivers/neodrvr.c7929
-rw-r--r--src/mame/drivers/neogeo.c1362
-rw-r--r--src/mame/drivers/news.c171
-rw-r--r--src/mame/drivers/nightgal.c1036
-rw-r--r--src/mame/drivers/ninjakd2.c1482
-rw-r--r--src/mame/drivers/ninjaw.c1018
-rw-r--r--src/mame/drivers/nitedrvr.c202
-rw-r--r--src/mame/drivers/niyanpai.c919
-rw-r--r--src/mame/drivers/nmg5.c1501
-rw-r--r--src/mame/drivers/nmk16.c7058
-rw-r--r--src/mame/drivers/norautp.c641
-rw-r--r--src/mame/drivers/nova2001.c1063
-rw-r--r--src/mame/drivers/nss.c605
-rw-r--r--src/mame/drivers/nwk-tr.c1186
-rw-r--r--src/mame/drivers/nycaptor.c1224
-rw-r--r--src/mame/drivers/nyny.c796
-rw-r--r--src/mame/drivers/offtwall.c524
-rw-r--r--src/mame/drivers/ohmygod.c400
-rw-r--r--src/mame/drivers/ojankohs.c1063
-rw-r--r--src/mame/drivers/olibochu.c476
-rw-r--r--src/mame/drivers/omegrace.c588
-rw-r--r--src/mame/drivers/oneshot.c477
-rw-r--r--src/mame/drivers/onetwo.c349
-rw-r--r--src/mame/drivers/opwolf.c988
-rw-r--r--src/mame/drivers/orbit.c365
-rw-r--r--src/mame/drivers/othldrby.c282
-rw-r--r--src/mame/drivers/othunder.c900
-rw-r--r--src/mame/drivers/overdriv.c442
-rw-r--r--src/mame/drivers/pachifev.c147
-rw-r--r--src/mame/drivers/pacland.c599
-rw-r--r--src/mame/drivers/pacman.c5783
-rw-r--r--src/mame/drivers/pandoras.c405
-rw-r--r--src/mame/drivers/pangofun.c163
-rw-r--r--src/mame/drivers/panicr.c552
-rw-r--r--src/mame/drivers/paradise.c1050
-rw-r--r--src/mame/drivers/paranoia.c195
-rw-r--r--src/mame/drivers/parodius.c355
-rw-r--r--src/mame/drivers/pasha2.c453
-rw-r--r--src/mame/drivers/pass.c305
-rw-r--r--src/mame/drivers/pastelg.c544
-rw-r--r--src/mame/drivers/pbaction.c430
-rw-r--r--src/mame/drivers/pcat_nit.c747
-rw-r--r--src/mame/drivers/pcktgal.c464
-rw-r--r--src/mame/drivers/pcxt.c1084
-rw-r--r--src/mame/drivers/pengo.c710
-rw-r--r--src/mame/drivers/peplus.c1522
-rw-r--r--src/mame/drivers/pgm.c4188
-rw-r--r--src/mame/drivers/phoenix.c1090
-rw-r--r--src/mame/drivers/photon.c251
-rw-r--r--src/mame/drivers/photoply.c547
-rw-r--r--src/mame/drivers/pingpong.c618
-rw-r--r--src/mame/drivers/pipedrm.c874
-rw-r--r--src/mame/drivers/pipeline.c443
-rw-r--r--src/mame/drivers/pirates.c487
-rw-r--r--src/mame/drivers/pitnrun.c347
-rw-r--r--src/mame/drivers/pkscram.c317
-rw-r--r--src/mame/drivers/pktgaldx.c438
-rw-r--r--src/mame/drivers/playch10.c1717
-rw-r--r--src/mame/drivers/playmark.c1477
-rw-r--r--src/mame/drivers/plygonet.c779
-rw-r--r--src/mame/drivers/pntnpuzl.c490
-rw-r--r--src/mame/drivers/pokechmp.c303
-rw-r--r--src/mame/drivers/polepos.c1844
-rw-r--r--src/mame/drivers/policetr.c744
-rw-r--r--src/mame/drivers/polyplay.c363
-rw-r--r--src/mame/drivers/poolshrk.c261
-rw-r--r--src/mame/drivers/pooyan.c336
-rw-r--r--src/mame/drivers/popeye.c686
-rw-r--r--src/mame/drivers/popper.c349
-rw-r--r--src/mame/drivers/portrait.c357
-rw-r--r--src/mame/drivers/powerbal.c696
-rw-r--r--src/mame/drivers/powerins.c740
-rw-r--r--src/mame/drivers/ppmast93.c397
-rw-r--r--src/mame/drivers/prehisle.c342
-rw-r--r--src/mame/drivers/progolf.c554
-rw-r--r--src/mame/drivers/psattack.c213
-rw-r--r--src/mame/drivers/psikyo.c2026
-rw-r--r--src/mame/drivers/psikyo4.c1085
-rw-r--r--src/mame/drivers/psikyosh.c1153
-rw-r--r--src/mame/drivers/psychic5.c928
-rw-r--r--src/mame/drivers/pturn.c527
-rw-r--r--src/mame/drivers/puckpkmn.c302
-rw-r--r--src/mame/drivers/punchout.c1044
-rw-r--r--src/mame/drivers/pushman.c628
-rw-r--r--src/mame/drivers/pzletime.c341
-rw-r--r--src/mame/drivers/qdrmfgp.c738
-rw-r--r--src/mame/drivers/qix.c1323
-rw-r--r--src/mame/drivers/quakeat.c102
-rw-r--r--src/mame/drivers/quantum.c329
-rw-r--r--src/mame/drivers/quasar.c419
-rw-r--r--src/mame/drivers/queen.c104
-rw-r--r--src/mame/drivers/quizdna.c593
-rw-r--r--src/mame/drivers/quizo.c251
-rw-r--r--src/mame/drivers/quizpani.c298
-rw-r--r--src/mame/drivers/quizpun2.c495
-rw-r--r--src/mame/drivers/r2dtank.c584
-rw-r--r--src/mame/drivers/rabbit.c1009
-rw-r--r--src/mame/drivers/raiden.c532
-rw-r--r--src/mame/drivers/raiden2.c2234
-rw-r--r--src/mame/drivers/rainbow.c863
-rw-r--r--src/mame/drivers/rallyx.c1286
-rw-r--r--src/mame/drivers/rampart.c506
-rw-r--r--src/mame/drivers/rastan.c583
-rw-r--r--src/mame/drivers/rbmk.c537
-rw-r--r--src/mame/drivers/rcorsair.c157
-rw-r--r--src/mame/drivers/re900.c456
-rw-r--r--src/mame/drivers/realbrk.c1172
-rw-r--r--src/mame/drivers/redalert.c428
-rw-r--r--src/mame/drivers/redclash.c517
-rw-r--r--src/mame/drivers/relief.c477
-rw-r--r--src/mame/drivers/renegade.c950
-rw-r--r--src/mame/drivers/retofinv.c504
-rw-r--r--src/mame/drivers/rmhaihai.c670
-rw-r--r--src/mame/drivers/rockrage.c401
-rw-r--r--src/mame/drivers/rocnrope.c281
-rw-r--r--src/mame/drivers/rohga.c1503
-rw-r--r--src/mame/drivers/rollerg.c339
-rw-r--r--src/mame/drivers/rollrace.c412
-rw-r--r--src/mame/drivers/rotaryf.c182
-rw-r--r--src/mame/drivers/roul.c289
-rw-r--r--src/mame/drivers/route16.c1011
-rw-r--r--src/mame/drivers/royalmah.c4656
-rw-r--r--src/mame/drivers/rpunch.c741
-rw-r--r--src/mame/drivers/runaway.c443
-rw-r--r--src/mame/drivers/rungun.c609
-rw-r--r--src/mame/drivers/safarir.c460
-rw-r--r--src/mame/drivers/sandscrp.c551
-rw-r--r--src/mame/drivers/sangho.c327
-rw-r--r--src/mame/drivers/sauro.c493
-rw-r--r--src/mame/drivers/sbasketb.c407
-rw-r--r--src/mame/drivers/sbowling.c378
-rw-r--r--src/mame/drivers/sbrkout.c540
-rw-r--r--src/mame/drivers/sbugger.c286
-rw-r--r--src/mame/drivers/scobra.c1368
-rw-r--r--src/mame/drivers/scotrsht.c256
-rw-r--r--src/mame/drivers/scramble.c1963
-rw-r--r--src/mame/drivers/scregg.c375
-rw-r--r--src/mame/drivers/sderby.c666
-rw-r--r--src/mame/drivers/seattle.c2969
-rw-r--r--src/mame/drivers/segac2.c2268
-rw-r--r--src/mame/drivers/segae.c2354
-rw-r--r--src/mame/drivers/segae.h26
-rw-r--r--src/mame/drivers/segag80r.c1556
-rw-r--r--src/mame/drivers/segag80v.c1447
-rw-r--r--src/mame/drivers/segahang.c1775
-rw-r--r--src/mame/drivers/segald.c581
-rw-r--r--src/mame/drivers/segaorun.c1828
-rw-r--r--src/mame/drivers/segas16a.c3422
-rw-r--r--src/mame/drivers/segas16b.c6411
-rw-r--r--src/mame/drivers/segas18.c2267
-rw-r--r--src/mame/drivers/segas24.c2340
-rw-r--r--src/mame/drivers/segas32.c4065
-rw-r--r--src/mame/drivers/segaxbd.c2875
-rw-r--r--src/mame/drivers/segaybd.c1830
-rw-r--r--src/mame/drivers/seibuspi.c3547
-rw-r--r--src/mame/drivers/seicross.c600
-rw-r--r--src/mame/drivers/sengokmj.c350
-rw-r--r--src/mame/drivers/senjyo.c929
-rw-r--r--src/mame/drivers/seta.c9582
-rw-r--r--src/mame/drivers/seta2.c2885
-rw-r--r--src/mame/drivers/sf.c1142
-rw-r--r--src/mame/drivers/sfbonus.c5633
-rw-r--r--src/mame/drivers/sfkick.c581
-rw-r--r--src/mame/drivers/sg1000a.c341
-rw-r--r--src/mame/drivers/shadfrce.c699
-rw-r--r--src/mame/drivers/shangha3.c683
-rw-r--r--src/mame/drivers/shanghai.c624
-rw-r--r--src/mame/drivers/shangkid.c994
-rw-r--r--src/mame/drivers/shaolins.c286
-rw-r--r--src/mame/drivers/shisen.c444
-rw-r--r--src/mame/drivers/shootout.c444
-rw-r--r--src/mame/drivers/shougi.c463
-rw-r--r--src/mame/drivers/shuuz.c367
-rw-r--r--src/mame/drivers/sidearms.c1180
-rw-r--r--src/mame/drivers/sidepckt.c403
-rw-r--r--src/mame/drivers/silkroad.c398
-rw-r--r--src/mame/drivers/simpl156.c1224
-rw-r--r--src/mame/drivers/simpsons.c490
-rw-r--r--src/mame/drivers/skeetsht.c279
-rw-r--r--src/mame/drivers/skimaxx.c318
-rw-r--r--src/mame/drivers/skullxbo.c628
-rw-r--r--src/mame/drivers/skyarmy.c286
-rw-r--r--src/mame/drivers/skydiver.c438
-rw-r--r--src/mame/drivers/skyfox.c414
-rw-r--r--src/mame/drivers/skykid.c658
-rw-r--r--src/mame/drivers/skylncr.c840
-rw-r--r--src/mame/drivers/skyraid.c294
-rw-r--r--src/mame/drivers/slapfght.c1874
-rw-r--r--src/mame/drivers/slapshot.c720
-rw-r--r--src/mame/drivers/sliver.c596
-rw-r--r--src/mame/drivers/slotcarn.c752
-rw-r--r--src/mame/drivers/sms.c861
-rw-r--r--src/mame/drivers/snesb.c776
-rw-r--r--src/mame/drivers/snk.c6217
-rw-r--r--src/mame/drivers/snk6502.c1445
-rw-r--r--src/mame/drivers/snk68.c1028
-rw-r--r--src/mame/drivers/snookr10.c870
-rw-r--r--src/mame/drivers/snowbros.c2762
-rw-r--r--src/mame/drivers/solomon.c302
-rw-r--r--src/mame/drivers/sonson.c346
-rw-r--r--src/mame/drivers/sothello.c415
-rw-r--r--src/mame/drivers/spacefb.c506
-rw-r--r--src/mame/drivers/spaceg.c422
-rw-r--r--src/mame/drivers/spbactn.c429
-rw-r--r--src/mame/drivers/spcforce.c360
-rw-r--r--src/mame/drivers/spdodgeb.c607
-rw-r--r--src/mame/drivers/speedatk.c331
-rw-r--r--src/mame/drivers/speedbal.c293
-rw-r--r--src/mame/drivers/speedspn.c354
-rw-r--r--src/mame/drivers/speglsht.c385
-rw-r--r--src/mame/drivers/spiders.c825
-rw-r--r--src/mame/drivers/splash.c919
-rw-r--r--src/mame/drivers/spoker.c449
-rw-r--r--src/mame/drivers/spool99.c333
-rw-r--r--src/mame/drivers/sprcros2.c387
-rw-r--r--src/mame/drivers/sprint2.c660
-rw-r--r--src/mame/drivers/sprint4.c478
-rw-r--r--src/mame/drivers/sprint8.c520
-rw-r--r--src/mame/drivers/spy.c594
-rw-r--r--src/mame/drivers/srmp2.c1339
-rw-r--r--src/mame/drivers/srmp5.c588
-rw-r--r--src/mame/drivers/srmp6.c704
-rw-r--r--src/mame/drivers/srumbler.c430
-rw-r--r--src/mame/drivers/ssf2md.c32
-rw-r--r--src/mame/drivers/ssfindo.c709
-rw-r--r--src/mame/drivers/ssgbl.c74
-rw-r--r--src/mame/drivers/sshangha.c468
-rw-r--r--src/mame/drivers/ssingles.c318
-rw-r--r--src/mame/drivers/sslam.c967
-rw-r--r--src/mame/drivers/ssozumo.c288
-rw-r--r--src/mame/drivers/sspeedr.c233
-rw-r--r--src/mame/drivers/ssrj.c208
-rw-r--r--src/mame/drivers/sstrangr.c289
-rw-r--r--src/mame/drivers/ssv.c4667
-rw-r--r--src/mame/drivers/st0016.c685
-rw-r--r--src/mame/drivers/stactics.c358
-rw-r--r--src/mame/drivers/stadhero.c299
-rw-r--r--src/mame/drivers/starcrus.c218
-rw-r--r--src/mame/drivers/starfire.c385
-rw-r--r--src/mame/drivers/starshp1.c398
-rw-r--r--src/mame/drivers/starwars.c568
-rw-r--r--src/mame/drivers/statriv2.c1097
-rw-r--r--src/mame/drivers/stepstag.c233
-rw-r--r--src/mame/drivers/stfight.c756
-rw-r--r--src/mame/drivers/stlforce.c419
-rw-r--r--src/mame/drivers/strnskil.c522
-rw-r--r--src/mame/drivers/stv.c3891
-rw-r--r--src/mame/drivers/stvinit.c662
-rw-r--r--src/mame/drivers/subs.c252
-rw-r--r--src/mame/drivers/subsino.c799
-rw-r--r--src/mame/drivers/suna16.c1262
-rw-r--r--src/mame/drivers/suna8.c2287
-rw-r--r--src/mame/drivers/supbtime.c485
-rw-r--r--src/mame/drivers/supdrapo.c293
-rw-r--r--src/mame/drivers/superchs.c491
-rw-r--r--src/mame/drivers/superdq.c393
-rw-r--r--src/mame/drivers/superqix.c1444
-rw-r--r--src/mame/drivers/supertnk.c492
-rw-r--r--src/mame/drivers/suprgolf.c556
-rw-r--r--src/mame/drivers/suprloco.c309
-rw-r--r--src/mame/drivers/suprnova.c1657
-rw-r--r--src/mame/drivers/suprridr.c447
-rw-r--r--src/mame/drivers/suprslam.c368
-rw-r--r--src/mame/drivers/surpratk.c297
-rw-r--r--src/mame/drivers/system1.c4762
-rw-r--r--src/mame/drivers/system16.c3495
-rw-r--r--src/mame/drivers/tagteam.c333
-rw-r--r--src/mame/drivers/tail2nos.c349
-rw-r--r--src/mame/drivers/taito_b.c3631
-rw-r--r--src/mame/drivers/taito_f2.c5325
-rw-r--r--src/mame/drivers/taito_f3.c3899
-rw-r--r--src/mame/drivers/taito_h.c753
-rw-r--r--src/mame/drivers/taito_l.c2797
-rw-r--r--src/mame/drivers/taito_o.c284
-rw-r--r--src/mame/drivers/taito_x.c1317
-rw-r--r--src/mame/drivers/taito_z.c4677
-rw-r--r--src/mame/drivers/taitoair.c756
-rw-r--r--src/mame/drivers/taitogn.c1316
-rw-r--r--src/mame/drivers/taitojc.c1827
-rw-r--r--src/mame/drivers/taitopjc.c152
-rw-r--r--src/mame/drivers/taitosj.c2757
-rw-r--r--src/mame/drivers/taitotz.c146
-rw-r--r--src/mame/drivers/taitowlf.c735
-rw-r--r--src/mame/drivers/tank8.c489
-rw-r--r--src/mame/drivers/tankbatt.c355
-rw-r--r--src/mame/drivers/tankbust.c432
-rw-r--r--src/mame/drivers/taotaido.c419
-rw-r--r--src/mame/drivers/targeth.c226
-rw-r--r--src/mame/drivers/tarzan.c127
-rw-r--r--src/mame/drivers/tatsumi.c1375
-rw-r--r--src/mame/drivers/tattack.c261
-rw-r--r--src/mame/drivers/taxidrvr.c454
-rw-r--r--src/mame/drivers/tbowl.c698
-rw-r--r--src/mame/drivers/tceptor.c575
-rw-r--r--src/mame/drivers/tcl.c212
-rw-r--r--src/mame/drivers/tecmo.c1108
-rw-r--r--src/mame/drivers/tecmo16.c662
-rw-r--r--src/mame/drivers/tecmosys.c1110
-rw-r--r--src/mame/drivers/tehkanwc.c927
-rw-r--r--src/mame/drivers/tempest.c801
-rw-r--r--src/mame/drivers/terracre.c1013
-rw-r--r--src/mame/drivers/tetrisp2.c1836
-rw-r--r--src/mame/drivers/thayers.c817
-rw-r--r--src/mame/drivers/thedeep.c486
-rw-r--r--src/mame/drivers/thepit.c1066
-rw-r--r--src/mame/drivers/thief.c674
-rw-r--r--src/mame/drivers/thoop2.c243
-rw-r--r--src/mame/drivers/thunderj.c411
-rw-r--r--src/mame/drivers/thunderx.c948
-rw-r--r--src/mame/drivers/tiamc1.c317
-rw-r--r--src/mame/drivers/tickee.c592
-rw-r--r--src/mame/drivers/tigeroad.c792
-rw-r--r--src/mame/drivers/timelimt.c363
-rw-r--r--src/mame/drivers/timeplt.c488
-rw-r--r--src/mame/drivers/timetrv.c166
-rw-r--r--src/mame/drivers/tmaster.c1483
-rw-r--r--src/mame/drivers/tmmjprd.c833
-rw-r--r--src/mame/drivers/tmnt.c3996
-rw-r--r--src/mame/drivers/tnzs.c2711
-rw-r--r--src/mame/drivers/toaplan1.c2263
-rw-r--r--src/mame/drivers/toaplan2.c5278
-rw-r--r--src/mame/drivers/toki.c848
-rw-r--r--src/mame/drivers/tokyocop.c68
-rw-r--r--src/mame/drivers/tomcat.c425
-rw-r--r--src/mame/drivers/toobin.c622
-rw-r--r--src/mame/drivers/topshoot.c296
-rw-r--r--src/mame/drivers/topspeed.c861
-rw-r--r--src/mame/drivers/toratora.c430
-rw-r--r--src/mame/drivers/tourtabl.c240
-rw-r--r--src/mame/drivers/toypop.c672
-rw-r--r--src/mame/drivers/tp84.c442
-rw-r--r--src/mame/drivers/trackfld.c1190
-rw-r--r--src/mame/drivers/travrusa.c494
-rw-r--r--src/mame/drivers/triforce.c709
-rw-r--r--src/mame/drivers/triplhnt.c368
-rw-r--r--src/mame/drivers/truco.c181
-rw-r--r--src/mame/drivers/trucocl.c194
-rw-r--r--src/mame/drivers/trvmadns.c342
-rw-r--r--src/mame/drivers/trvquest.c261
-rw-r--r--src/mame/drivers/tryout.c257
-rw-r--r--src/mame/drivers/tsamurai.c1241
-rw-r--r--src/mame/drivers/ttchamp.c331
-rw-r--r--src/mame/drivers/tubep.c1213
-rw-r--r--src/mame/drivers/tugboat.c412
-rw-r--r--src/mame/drivers/tumbleb.c3683
-rw-r--r--src/mame/drivers/tumblep.c390
-rw-r--r--src/mame/drivers/tunhunt.c435
-rw-r--r--src/mame/drivers/turbo.c1777
-rw-r--r--src/mame/drivers/turrett.c140
-rw-r--r--src/mame/drivers/tutankhm.c282
-rw-r--r--src/mame/drivers/twin16.c1298
-rw-r--r--src/mame/drivers/twincobr.c1156
-rw-r--r--src/mame/drivers/twinkle.c1165
-rw-r--r--src/mame/drivers/twins.c317
-rw-r--r--src/mame/drivers/tx1.c1252
-rw-r--r--src/mame/drivers/uapce.c236
-rw-r--r--src/mame/drivers/ultraman.c332
-rw-r--r--src/mame/drivers/ultratnk.c347
-rw-r--r--src/mame/drivers/ultrsprt.c266
-rw-r--r--src/mame/drivers/undrfire.c1031
-rw-r--r--src/mame/drivers/unico.c1078
-rw-r--r--src/mame/drivers/upscope.c406
-rw-r--r--src/mame/drivers/usgames.c404
-rw-r--r--src/mame/drivers/vamphalf.c1756
-rw-r--r--src/mame/drivers/vaportra.c777
-rw-r--r--src/mame/drivers/vastar.c428
-rw-r--r--src/mame/drivers/vball.c553
-rw-r--r--src/mame/drivers/vcombat.c690
-rw-r--r--src/mame/drivers/vegaeo.c272
-rw-r--r--src/mame/drivers/vegas.c2605
-rw-r--r--src/mame/drivers/vendetta.c738
-rw-r--r--src/mame/drivers/vertigo.c210
-rw-r--r--src/mame/drivers/vicdual.c3253
-rw-r--r--src/mame/drivers/victory.c320
-rw-r--r--src/mame/drivers/videopin.c402
-rw-r--r--src/mame/drivers/videopkr.c1368
-rw-r--r--src/mame/drivers/vigilant.c929
-rw-r--r--src/mame/drivers/vindictr.c554
-rw-r--r--src/mame/drivers/viper.c1078
-rw-r--r--src/mame/drivers/vmetal.c498
-rw-r--r--src/mame/drivers/volfied.c408
-rw-r--r--src/mame/drivers/vp101.c87
-rw-r--r--src/mame/drivers/vpoker.c455
-rw-r--r--src/mame/drivers/vroulet.c310
-rw-r--r--src/mame/drivers/vsnes.c2549
-rw-r--r--src/mame/drivers/vulgus.c398
-rw-r--r--src/mame/drivers/wallc.c341
-rw-r--r--src/mame/drivers/wardner.c656
-rw-r--r--src/mame/drivers/warpwarp.c1009
-rw-r--r--src/mame/drivers/warriorb.c721
-rw-r--r--src/mame/drivers/wc90.c490
-rw-r--r--src/mame/drivers/wc90b.c564
-rw-r--r--src/mame/drivers/wecleman.c1450
-rw-r--r--src/mame/drivers/welltris.c851
-rw-r--r--src/mame/drivers/wgp.c1238
-rw-r--r--src/mame/drivers/wheelfir.c685
-rw-r--r--src/mame/drivers/williams.c2920
-rw-r--r--src/mame/drivers/wink.c422
-rw-r--r--src/mame/drivers/wiping.c382
-rw-r--r--src/mame/drivers/witch.c850
-rw-r--r--src/mame/drivers/wiz.c1107
-rw-r--r--src/mame/drivers/wldarrow.c463
-rw-r--r--src/mame/drivers/wolfpack.c369
-rw-r--r--src/mame/drivers/wrally.c367
-rw-r--r--src/mame/drivers/wwfsstar.c699
-rw-r--r--src/mame/drivers/wwfwfest.c604
-rw-r--r--src/mame/drivers/xain.c722
-rw-r--r--src/mame/drivers/xexex.c636
-rw-r--r--src/mame/drivers/xmen.c743
-rw-r--r--src/mame/drivers/xorworld.c273
-rw-r--r--src/mame/drivers/xtheball.c397
-rw-r--r--src/mame/drivers/xxmissio.c378
-rw-r--r--src/mame/drivers/xybots.c403
-rw-r--r--src/mame/drivers/xyonix.c273
-rw-r--r--src/mame/drivers/yiear.c283
-rw-r--r--src/mame/drivers/yunsun16.c928
-rw-r--r--src/mame/drivers/yunsung8.c708
-rw-r--r--src/mame/drivers/zac2650.c320
-rw-r--r--src/mame/drivers/zaccaria.c783
-rw-r--r--src/mame/drivers/zaxxon.c1546
-rw-r--r--src/mame/drivers/zerozone.c253
-rw-r--r--src/mame/drivers/zn.c4504
-rw-r--r--src/mame/drivers/zodiack.c670
-rw-r--r--src/mame/drivers/zr107.c971
-rw-r--r--src/mame/dummy.lst12
-rw-r--r--src/mame/dynax/ddenlovr.cpp13717
-rw-r--r--src/mame/dynax/dynax.cpp7335
-rw-r--r--src/mame/dynax/dynax.h479
-rw-r--r--src/mame/dynax/dynax_blitter_rev2.cpp376
-rw-r--r--src/mame/dynax/dynax_blitter_rev2.h91
-rw-r--r--src/mame/dynax/dynax_v.cpp1097
-rw-r--r--src/mame/dynax/hanafuda.cpp118
-rw-r--r--src/mame/dynax/hanafuda.h11
-rw-r--r--src/mame/dynax/hnayayoi.cpp1128
-rw-r--r--src/mame/dynax/mjdipsw.h78
-rw-r--r--src/mame/dynax/realbrk.cpp1253
-rw-r--r--src/mame/dynax/realbrk.h98
-rw-r--r--src/mame/dynax/realbrk_v.cpp500
-rw-r--r--src/mame/dynax/royalmah.cpp6670
-rw-r--r--src/mame/eaca/cgenie.cpp532
-rw-r--r--src/mame/edevices/diverboy.cpp378
-rw-r--r--src/mame/edevices/edevices.cpp340
-rw-r--r--src/mame/edevices/edevices.h103
-rw-r--r--src/mame/edevices/fantland.cpp1806
-rw-r--r--src/mame/edevices/mugsmash.cpp552
-rw-r--r--src/mame/edevices/mwarr.cpp384
-rw-r--r--src/mame/edevices/ppmast93.cpp437
-rw-r--r--src/mame/edevices/pzletime.cpp354
-rw-r--r--src/mame/edevices/stlforce.cpp567
-rw-r--r--src/mame/edevices/twins.cpp745
-rw-r--r--src/mame/efo/cedar_magnet.cpp1176
-rw-r--r--src/mame/efo/cedar_magnet_flop.cpp228
-rw-r--r--src/mame/efo/cedar_magnet_flop.h48
-rw-r--r--src/mame/efo/cedar_magnet_plane.cpp155
-rw-r--r--src/mame/efo/cedar_magnet_plane.h60
-rw-r--r--src/mame/efo/cedar_magnet_sprite.cpp324
-rw-r--r--src/mame/efo/cedar_magnet_sprite.h80
-rw-r--r--src/mame/efo/cidelsa.cpp568
-rw-r--r--src/mame/efo/cidelsa.h136
-rw-r--r--src/mame/efo/cidelsa_v.cpp197
-rw-r--r--src/mame/efo/nightmare.cpp467
-rw-r--r--src/mame/elektor/avrmax.cpp377
-rw-r--r--src/mame/elektor/ec65.cpp308
-rw-r--r--src/mame/elektor/elekscmp.cpp237
-rw-r--r--src/mame/elektor/junior.cpp235
-rw-r--r--src/mame/elektron/elektronmono.cpp183
-rw-r--r--src/mame/emusys/emax.cpp315
-rw-r--r--src/mame/emusys/emu2.cpp335
-rw-r--r--src/mame/emusys/emu3.cpp297
-rw-r--r--src/mame/emusys/emu68k.cpp249
-rw-r--r--src/mame/ensoniq/enmirage.cpp444
-rw-r--r--src/mame/ensoniq/esq1.cpp919
-rw-r--r--src/mame/ensoniq/esq5505.cpp1280
-rw-r--r--src/mame/ensoniq/esqasr.cpp228
-rw-r--r--src/mame/ensoniq/esqkt.cpp426
-rw-r--r--src/mame/ensoniq/esqlcd.cpp365
-rw-r--r--src/mame/ensoniq/esqlcd.h43
-rw-r--r--src/mame/ensoniq/esqmr.cpp369
-rw-r--r--src/mame/ensoniq/esqpanel.cpp1013
-rw-r--r--src/mame/ensoniq/esqpanel.h200
-rw-r--r--src/mame/ensoniq/esqvfd.cpp561
-rw-r--r--src/mame/ensoniq/esqvfd.h124
-rw-r--r--src/mame/ensoniq/vfxcart.cpp193
-rw-r--r--src/mame/ensoniq/vfxcart.h71
-rw-r--r--src/mame/enterprise/dave.cpp620
-rw-r--r--src/mame/enterprise/dave.h118
-rw-r--r--src/mame/enterprise/ep64.cpp695
-rw-r--r--src/mame/enterprise/nick.cpp1050
-rw-r--r--src/mame/enterprise/nick.h168
-rw-r--r--src/mame/entex/advision.cpp471
-rw-r--r--src/mame/entex/sag.cpp350
-rw-r--r--src/mame/eolith/eolith.cpp1791
-rw-r--r--src/mame/eolith/eolith16.cpp262
-rw-r--r--src/mame/eolith/eolith_speedup.cpp125
-rw-r--r--src/mame/eolith/eolith_speedup.h46
-rw-r--r--src/mame/eolith/ghosteo.cpp773
-rw-r--r--src/mame/eolith/vegaeo.cpp310
-rw-r--r--src/mame/epoch/cassvisn.cpp112
-rw-r--r--src/mame/epoch/gamepock.cpp262
-rw-r--r--src/mame/epoch/scv.cpp626
-rw-r--r--src/mame/epson/hx20.cpp1048
-rw-r--r--src/mame/epson/hx20.h126
-rw-r--r--src/mame/epson/px4.cpp1607
-rw-r--r--src/mame/epson/px8.cpp831
-rw-r--r--src/mame/epson/px8.h94
-rw-r--r--src/mame/epson/qx10.cpp1113
-rw-r--r--src/mame/ericsson/alfaskop41xx.cpp584
-rw-r--r--src/mame/ericsson/e9161.cpp88
-rw-r--r--src/mame/ericsson/eispc.cpp1074
-rw-r--r--src/mame/ericsson/eispc_kb.cpp404
-rw-r--r--src/mame/ericsson/eispc_kb.h49
-rw-r--r--src/mame/esprit/esp250c.cpp242
-rw-r--r--src/mame/esprit/executive10.cpp352
-rw-r--r--src/mame/esprit/executive10_102_kbd.cpp278
-rw-r--r--src/mame/esprit/executive10_102_kbd.h65
-rw-r--r--src/mame/etc/fd1094dp.c587
-rw-r--r--src/mame/etc/jrcrypt.c534
-rw-r--r--src/mame/excalibur/ivant.cpp433
-rw-r--r--src/mame/excalibur/ivanto.cpp349
-rw-r--r--src/mame/excalibur/mirage.cpp341
-rw-r--r--src/mame/excellent/aquarium.cpp577
-rw-r--r--src/mame/excellent/d9final.cpp390
-rw-r--r--src/mame/excellent/dblcrown.cpp630
-rw-r--r--src/mame/excellent/es8906.cpp364
-rw-r--r--src/mame/excellent/es9501.cpp614
-rw-r--r--src/mame/excellent/es9606.cpp355
-rw-r--r--src/mame/excellent/excellent_spr.cpp282
-rw-r--r--src/mame/excellent/excellent_spr.h42
-rw-r--r--src/mame/excellent/gcpinbal.cpp685
-rw-r--r--src/mame/excellent/lastbank.cpp1065
-rw-r--r--src/mame/excellent/witch.cpp1312
-rw-r--r--src/mame/exidy/carpolo.cpp346
-rw-r--r--src/mame/exidy/carpolo.h161
-rw-r--r--src/mame/exidy/carpolo_m.cpp474
-rw-r--r--src/mame/exidy/carpolo_v.cpp679
-rw-r--r--src/mame/exidy/circus.cpp671
-rw-r--r--src/mame/exidy/circus.h144
-rw-r--r--src/mame/exidy/circus_a.cpp309
-rw-r--r--src/mame/exidy/circus_v.cpp223
-rw-r--r--src/mame/exidy/exidy.cpp2617
-rw-r--r--src/mame/exidy/exidy440.cpp2158
-rw-r--r--src/mame/exidy/exidy440.h126
-rw-r--r--src/mame/exidy/exidy440_a.cpp841
-rw-r--r--src/mame/exidy/exidy440_a.h121
-rw-r--r--src/mame/exidy/exidy440_v.cpp488
-rw-r--r--src/mame/exidy/exidyttl.cpp244
-rw-r--r--src/mame/exidy/micropolis.cpp325
-rw-r--r--src/mame/exidy/micropolis.h93
-rw-r--r--src/mame/exidy/nl_carpolo.cpp156
-rw-r--r--src/mame/exidy/nl_carpolo.h10
-rw-r--r--src/mame/exidy/nl_fireone.cpp605
-rw-r--r--src/mame/exidy/nl_fireone.h10
-rw-r--r--src/mame/exidy/nl_starfire.cpp358
-rw-r--r--src/mame/exidy/nl_starfire.h10
-rw-r--r--src/mame/exidy/sorcerer.cpp703
-rw-r--r--src/mame/exidy/sorcerer.h185
-rw-r--r--src/mame/exidy/sorcerer_m.cpp644
-rw-r--r--src/mame/exidy/starfire.cpp584
-rw-r--r--src/mame/exidy/starfire.h202
-rw-r--r--src/mame/exidy/starfire_v.cpp268
-rw-r--r--src/mame/exidy/vertigo.cpp226
-rw-r--r--src/mame/exidy/vertigo.h148
-rw-r--r--src/mame/exidy/vertigo_m.cpp173
-rw-r--r--src/mame/exidy/vertigo_v.cpp565
-rw-r--r--src/mame/exidy/victory.cpp331
-rw-r--r--src/mame/exidy/victory.h113
-rw-r--r--src/mame/exidy/victory_v.cpp1132
-rw-r--r--src/mame/f32/crospang.cpp1021
-rw-r--r--src/mame/f32/f-32.cpp597
-rw-r--r--src/mame/f32/silvmil.cpp598
-rw-r--r--src/mame/facit/f4431.cpp461
-rw-r--r--src/mame/facit/f4431_kbd.cpp331
-rw-r--r--src/mame/facit/f4431_kbd.h70
-rw-r--r--src/mame/facit/facit4440.cpp325
-rw-r--r--src/mame/fairchild/channelf.cpp333
-rw-r--r--src/mame/fairchild/channelf.h65
-rw-r--r--src/mame/fairchild/channelf_a.cpp130
-rw-r--r--src/mame/fairchild/channelf_a.h39
-rw-r--r--src/mame/fairchild/channelf_v.cpp85
-rw-r--r--src/mame/fairchild/f387x.cpp178
-rw-r--r--src/mame/fairlight/cmi.cpp2237
-rw-r--r--src/mame/fairlight/cmi01a.cpp896
-rw-r--r--src/mame/fairlight/cmi01a.h205
-rw-r--r--src/mame/fairlight/cmi_ankbd.cpp215
-rw-r--r--src/mame/fairlight/cmi_ankbd.h51
-rw-r--r--src/mame/fairlight/cmi_mkbd.cpp576
-rw-r--r--src/mame/fairlight/cmi_mkbd.h183
-rw-r--r--src/mame/falco/f5220_kbd.cpp298
-rw-r--r--src/mame/falco/f5220_kbd.h61
-rw-r--r--src/mame/falco/falco500.cpp660
-rw-r--r--src/mame/falco/falcots.cpp714
-rw-r--r--src/mame/falco/falcots28.cpp449
-rw-r--r--src/mame/fidelity/bridgeb.cpp296
-rw-r--r--src/mame/fidelity/card.cpp728
-rw-r--r--src/mame/fidelity/cc1.cpp324
-rw-r--r--src/mame/fidelity/cc10.cpp370
-rw-r--r--src/mame/fidelity/cc7.cpp283
-rw-r--r--src/mame/fidelity/checkc2.cpp248
-rw-r--r--src/mame/fidelity/chesster.cpp261
-rw-r--r--src/mame/fidelity/clockdiv.cpp101
-rw-r--r--src/mame/fidelity/clockdiv.h52
-rw-r--r--src/mame/fidelity/csc.cpp872
-rw-r--r--src/mame/fidelity/dames.cpp255
-rw-r--r--src/mame/fidelity/desdis.cpp411
-rw-r--r--src/mame/fidelity/eag68k.cpp1089
-rw-r--r--src/mame/fidelity/eldorado.cpp189
-rw-r--r--src/mame/fidelity/elegance.cpp328
-rw-r--r--src/mame/fidelity/elite.cpp1196
-rw-r--r--src/mame/fidelity/excel.cpp613
-rw-r--r--src/mame/fidelity/msc.cpp222
-rw-r--r--src/mame/fidelity/phantom.cpp526
-rw-r--r--src/mame/fidelity/sc12.cpp304
-rw-r--r--src/mame/fidelity/sc6.cpp457
-rw-r--r--src/mame/fidelity/sc8.cpp205
-rw-r--r--src/mame/fidelity/sc9.cpp309
-rw-r--r--src/mame/fidelity/vcc.cpp446
-rw-r--r--src/mame/fidelity/vsc.cpp477
-rw-r--r--src/mame/force/miniforce.cpp173
-rw-r--r--src/mame/fujitsu/fm7.cpp2301
-rw-r--r--src/mame/fujitsu/fm7.h425
-rw-r--r--src/mame/fujitsu/fm7_v.cpp1188
-rw-r--r--src/mame/fujitsu/fmt_icmem.cpp171
-rw-r--r--src/mame/fujitsu/fmt_icmem.h63
-rw-r--r--src/mame/fujitsu/fmtowns.cpp3013
-rw-r--r--src/mame/fujitsu/fmtowns.h439
-rw-r--r--src/mame/fujitsu/fmtowns_v.cpp1578
-rw-r--r--src/mame/fujitsu/secoinsa20.cpp626
-rw-r--r--src/mame/funtech/funtech_h8.cpp433
-rw-r--r--src/mame/funtech/funtech_z80.cpp757
-rw-r--r--src/mame/funworld/4roses.cpp604
-rw-r--r--src/mame/funworld/funworld.cpp9043
-rw-r--r--src/mame/funworld/funworld.h213
-rw-r--r--src/mame/funworld/funworld_v.cpp151
-rw-r--r--src/mame/funworld/photoply.cpp531
-rw-r--r--src/mame/funworld/photoplys.cpp78
-rw-r--r--src/mame/funworld/photoplysx.cpp104
-rw-r--r--src/mame/funworld/snookr10.cpp1222
-rw-r--r--src/mame/funworld/snookr10.h67
-rw-r--r--src/mame/funworld/snookr10_v.cpp257
-rw-r--r--src/mame/funworld/supercrd.cpp1244
-rw-r--r--src/mame/fuuki/fuukifg2.cpp738
-rw-r--r--src/mame/fuuki/fuukifg3.cpp873
-rw-r--r--src/mame/fuuki/fuukispr.cpp180
-rw-r--r--src/mame/fuuki/fuukispr.h39
-rw-r--r--src/mame/fuuki/fuukitmap.cpp263
-rw-r--r--src/mame/fuuki/fuukitmap.h119
-rw-r--r--src/mame/gaelco/atvtrack.cpp752
-rw-r--r--src/mame/gaelco/bigkarnk_ms.cpp836
-rw-r--r--src/mame/gaelco/blmbycar.cpp766
-rw-r--r--src/mame/gaelco/ds5002fp_programmer.cpp128
-rw-r--r--src/mame/gaelco/futbol3.cpp196
-rw-r--r--src/mame/gaelco/gaelco.cpp1885
-rw-r--r--src/mame/gaelco/gaelco.h182
-rw-r--r--src/mame/gaelco/gaelco2.cpp3392
-rw-r--r--src/mame/gaelco/gaelco2.h209
-rw-r--r--src/mame/gaelco/gaelco2_m.cpp337
-rw-r--r--src/mame/gaelco/gaelco2_v.cpp641
-rw-r--r--src/mame/gaelco/gaelco3d.cpp1866
-rw-r--r--src/mame/gaelco/gaelco3d.h183
-rw-r--r--src/mame/gaelco/gaelco3d_m.cpp429
-rw-r--r--src/mame/gaelco/gaelco3d_m.h108
-rw-r--r--src/mame/gaelco/gaelco3d_v.cpp476
-rw-r--r--src/mame/gaelco/gaelco_ds5002fp.cpp57
-rw-r--r--src/mame/gaelco/gaelco_ds5002fp.h36
-rw-r--r--src/mame/gaelco/gaelco_v.cpp331
-rw-r--r--src/mame/gaelco/gaelco_wrally_sprites.cpp243
-rw-r--r--src/mame/gaelco/gaelco_wrally_sprites.h58
-rw-r--r--src/mame/gaelco/gaelcopc.cpp146
-rw-r--r--src/mame/gaelco/gaelcrpt.cpp180
-rw-r--r--src/mame/gaelco/gaelcrpt.h36
-rw-r--r--src/mame/gaelco/glass.cpp982
-rw-r--r--src/mame/gaelco/goldart.cpp576
-rw-r--r--src/mame/gaelco/lotoplay.cpp146
-rw-r--r--src/mame/gaelco/mastboy.cpp1540
-rw-r--r--src/mame/gaelco/mastboyo.cpp369
-rw-r--r--src/mame/gaelco/mastboyo_ms.cpp267
-rw-r--r--src/mame/gaelco/radsys.cpp82
-rw-r--r--src/mame/gaelco/rollext.cpp811
-rw-r--r--src/mame/gaelco/scalextric.cpp319
-rw-r--r--src/mame/gaelco/splash.cpp1680
-rw-r--r--src/mame/gaelco/splash.h184
-rw-r--r--src/mame/gaelco/splash_ms.cpp638
-rw-r--r--src/mame/gaelco/splash_v.cpp292
-rw-r--r--src/mame/gaelco/sralslot.cpp105
-rw-r--r--src/mame/gaelco/targeth.cpp642
-rw-r--r--src/mame/gaelco/thoop2.cpp794
-rw-r--r--src/mame/gaelco/wrally.cpp872
-rw-r--r--src/mame/gaelco/wrally_ms.cpp593
-rw-r--r--src/mame/gaelco/xorworld.cpp402
-rw-r--r--src/mame/gaelco/xorworld_ms.cpp540
-rw-r--r--src/mame/galaxian/119.cpp343
-rw-r--r--src/mame/galaxian/dambustr.cpp386
-rw-r--r--src/mame/galaxian/fastfred.cpp1084
-rw-r--r--src/mame/galaxian/fastfred.h111
-rw-r--r--src/mame/galaxian/fastfred_v.cpp374
-rw-r--r--src/mame/galaxian/galaxian.cpp17229
-rw-r--r--src/mame/galaxian/galaxian.h948
-rw-r--r--src/mame/galaxian/galaxian_a.cpp777
-rw-r--r--src/mame/galaxian/galaxian_a.h77
-rw-r--r--src/mame/galaxian/galaxian_rockclim.cpp299
-rw-r--r--src/mame/galaxian/galaxian_v.cpp1545
-rw-r--r--src/mame/galaxian/galaxold.cpp3028
-rw-r--r--src/mame/galaxian/galaxold.h325
-rw-r--r--src/mame/galaxian/galaxold_m.cpp195
-rw-r--r--src/mame/galaxian/galaxold_v.cpp1709
-rw-r--r--src/mame/galaxian/nl_konami.cpp206
-rw-r--r--src/mame/galaxian/nl_konami.h7
-rw-r--r--src/mame/galaxian/scobra.cpp1890
-rw-r--r--src/mame/galaxian/scramble.cpp2092
-rw-r--r--src/mame/galaxian/scramble.h153
-rw-r--r--src/mame/galaxian/scramble_a.cpp302
-rw-r--r--src/mame/galaxian/scramble_m.cpp590
-rw-r--r--src/mame/gamepark/gp2x.cpp406
-rw-r--r--src/mame/gamepark/gp32.cpp1727
-rw-r--r--src/mame/gamepark/gp32.h262
-rw-r--r--src/mame/gametron/gatron.cpp715
-rw-r--r--src/mame/gametron/gotya.cpp599
-rw-r--r--src/mame/gametron/sbugger.cpp363
-rw-r--r--src/mame/gottlieb/exterm.cpp527
-rw-r--r--src/mame/gottlieb/gottlieb.cpp3093
-rw-r--r--src/mame/gridcomp/gridcomp.cpp580
-rw-r--r--src/mame/gridcomp/gridkeyb.cpp307
-rw-r--r--src/mame/gridcomp/gridkeyb.h80
-rw-r--r--src/mame/gridcomp/gridrom.cpp63
-rw-r--r--src/mame/gridcomp/gridrom.h49
-rw-r--r--src/mame/grundy/newbrain.cpp967
-rw-r--r--src/mame/grundy/newbrain.h145
-rw-r--r--src/mame/grundy/newbrain_v.cpp196
-rw-r--r--src/mame/handheld/README.md4
-rw-r--r--src/mame/handheld/chessking.cpp366
-rw-r--r--src/mame/handheld/dbridgec.cpp260
-rw-r--r--src/mame/handheld/evolution_handheld.cpp261
-rw-r--r--src/mame/handheld/gameking.cpp358
-rw-r--r--src/mame/handheld/generalplus_gp3x_unknown.cpp116
-rw-r--r--src/mame/handheld/generalplus_gpce4.cpp498
-rw-r--r--src/mame/handheld/generalplus_gpel31xx.cpp84
-rw-r--r--src/mame/handheld/generalplus_gpl162xx_lcdtype.cpp891
-rw-r--r--src/mame/handheld/generalplus_gpl951xx.cpp743
-rw-r--r--src/mame/handheld/gmaster.cpp275
-rw-r--r--src/mame/handheld/gw35th.cpp86
-rw-r--r--src/mame/handheld/hh_cop400.cpp2911
-rw-r--r--src/mame/handheld/hh_cops1.cpp860
-rw-r--r--src/mame/handheld/hh_e0c6200.cpp597
-rw-r--r--src/mame/handheld/hh_hmcs40.cpp5422
-rw-r--r--src/mame/handheld/hh_ht11xx.cpp331
-rw-r--r--src/mame/handheld/hh_mediatek_mt6260a.cpp78
-rw-r--r--src/mame/handheld/hh_melps4.cpp369
-rw-r--r--src/mame/handheld/hh_mn1400.cpp566
-rw-r--r--src/mame/handheld/hh_pic16.cpp2220
-rw-r--r--src/mame/handheld/hh_pps41.cpp1830
-rw-r--r--src/mame/handheld/hh_rw5000.cpp1128
-rw-r--r--src/mame/handheld/hh_sm510.cpp12505
-rw-r--r--src/mame/handheld/hh_sm510.h118
-rw-r--r--src/mame/handheld/hh_smc1k.cpp329
-rw-r--r--src/mame/handheld/hh_tms1k.cpp17957
-rw-r--r--src/mame/handheld/hh_ucom4.cpp3376
-rw-r--r--src/mame/handheld/lk3000.cpp355
-rw-r--r--src/mame/handheld/monty.cpp294
-rw-r--r--src/mame/handheld/nl_bship.cpp223
-rw-r--r--src/mame/handheld/nl_bship.h12
-rw-r--r--src/mame/handheld/nl_sfxphasor.cpp83
-rw-r--r--src/mame/handheld/nl_sfxphasor.h12
-rw-r--r--src/mame/handheld/pensebem.cpp322
-rw-r--r--src/mame/handheld/rzone.cpp357
-rw-r--r--src/mame/handheld/scrablex.cpp233
-rw-r--r--src/mame/handheld/st2302u_bbl_rom.cpp444
-rw-r--r--src/mame/handheld/st2302u_bbl_spi.cpp499
-rw-r--r--src/mame/handheld/talkingbb.cpp350
-rw-r--r--src/mame/handheld/talkingfb.cpp258
-rw-r--r--src/mame/handheld/tama_4u.cpp84
-rw-r--r--src/mame/handheld/tama_id.cpp82
-rw-r--r--src/mame/handheld/tama_mix.cpp83
-rw-r--r--src/mame/handheld/teammate.cpp260
-rw-r--r--src/mame/handheld/unknown_bftetris_lcdc.cpp357
-rw-r--r--src/mame/handheld/unknown_bftetris_lcdc.h38
-rw-r--r--src/mame/handheld/vegaplus.cpp81
-rw-r--r--src/mame/handheld/wildfire.cpp201
-rw-r--r--src/mame/hds/hds200.cpp395
-rw-r--r--src/mame/hds/hds200_kbd.cpp405
-rw-r--r--src/mame/hds/hds200_kbd.h66
-rw-r--r--src/mame/heathzenith/et3400.cpp268
-rw-r--r--src/mame/heathzenith/h19.cpp73
-rw-r--r--src/mame/heathzenith/h8.cpp129
-rw-r--r--src/mame/heathzenith/h89.cpp1265
-rw-r--r--src/mame/heathzenith/mdt60.cpp269
-rw-r--r--src/mame/heathzenith/z100.cpp1032
-rw-r--r--src/mame/heathzenith/z22.cpp221
-rw-r--r--src/mame/heathzenith/z29.cpp199
-rw-r--r--src/mame/hec2hrp/hec2hrp.cpp642
-rw-r--r--src/mame/hec2hrp/hec2hrp.h213
-rw-r--r--src/mame/hec2hrp/hec2hrp_m.cpp972
-rw-r--r--src/mame/hec2hrp/hec2hrp_v.cpp107
-rw-r--r--src/mame/hegenerglaser/academy.cpp210
-rw-r--r--src/mame/hegenerglaser/amsterdam.cpp263
-rw-r--r--src/mame/hegenerglaser/berlin.cpp226
-rw-r--r--src/mame/hegenerglaser/brikett.cpp725
-rw-r--r--src/mame/hegenerglaser/europa.cpp227
-rw-r--r--src/mame/hegenerglaser/excalibur.cpp263
-rw-r--r--src/mame/hegenerglaser/glasgow.cpp339
-rw-r--r--src/mame/hegenerglaser/mboard.cpp225
-rw-r--r--src/mame/hegenerglaser/mboard.h108
-rw-r--r--src/mame/hegenerglaser/mdisplay1.cpp91
-rw-r--r--src/mame/hegenerglaser/mdisplay1.h49
-rw-r--r--src/mame/hegenerglaser/mdisplay2.cpp111
-rw-r--r--src/mame/hegenerglaser/mdisplay2.h52
-rw-r--r--src/mame/hegenerglaser/mdisplay3.cpp126
-rw-r--r--src/mame/hegenerglaser/mdisplay3.h49
-rw-r--r--src/mame/hegenerglaser/milano.cpp226
-rw-r--r--src/mame/hegenerglaser/mm1.cpp326
-rw-r--r--src/mame/hegenerglaser/mm2.cpp626
-rw-r--r--src/mame/hegenerglaser/mm6.cpp241
-rw-r--r--src/mame/hegenerglaser/modena.cpp228
-rw-r--r--src/mame/hegenerglaser/modular.cpp654
-rw-r--r--src/mame/hegenerglaser/modular_tm.cpp284
-rw-r--r--src/mame/hegenerglaser/mondial.cpp212
-rw-r--r--src/mame/hegenerglaser/mondial2.cpp217
-rw-r--r--src/mame/hegenerglaser/mondial68k.cpp244
-rw-r--r--src/mame/hegenerglaser/montec.cpp274
-rw-r--r--src/mame/hegenerglaser/polgar.cpp182
-rw-r--r--src/mame/hegenerglaser/risc.cpp211
-rw-r--r--src/mame/hegenerglaser/roma2.cpp238
-rw-r--r--src/mame/hegenerglaser/smondial.cpp411
-rw-r--r--src/mame/hitachi/b16.cpp582
-rw-r--r--src/mame/hitachi/bmjr.cpp520
-rw-r--r--src/mame/hitachi/bml3.cpp990
-rw-r--r--src/mame/hitachi/bml3.h229
-rw-r--r--src/mame/hitachi/mbs1.cpp346
-rw-r--r--src/mame/hitachi/mbs1_mmu.cpp94
-rw-r--r--src/mame/hitachi/mbs1_mmu.h41
-rw-r--r--src/mame/homebrew/4004clk.cpp207
-rw-r--r--src/mame/homebrew/68ksbc.cpp98
-rw-r--r--src/mame/homebrew/chaos.cpp191
-rw-r--r--src/mame/homebrew/d6809.cpp231
-rw-r--r--src/mame/homebrew/dcebridge.cpp312
-rw-r--r--src/mame/homebrew/gigatron.cpp263
-rw-r--r--src/mame/homebrew/gs6502.cpp83
-rw-r--r--src/mame/homebrew/gs6809.cpp83
-rw-r--r--src/mame/homebrew/gscpm.cpp189
-rw-r--r--src/mame/homebrew/gsz80.cpp106
-rw-r--r--src/mame/homebrew/homez80.cpp327
-rw-r--r--src/mame/homebrew/lft_chiptune.cpp93
-rw-r--r--src/mame/homebrew/lft_craft.cpp232
-rw-r--r--src/mame/homebrew/lft_phasor.cpp235
-rw-r--r--src/mame/homebrew/linux4004.cpp278
-rw-r--r--src/mame/homebrew/minib.cpp173
-rw-r--r--src/mame/homebrew/mk1forth.cpp107
-rw-r--r--src/mame/homebrew/p112.cpp158
-rw-r--r--src/mame/homebrew/pc532.cpp399
-rw-r--r--src/mame/homebrew/phunsy.cpp401
-rw-r--r--src/mame/homebrew/pimps.cpp198
-rw-r--r--src/mame/homebrew/ravens.cpp417
-rw-r--r--src/mame/homebrew/rc2014.cpp434
-rw-r--r--src/mame/homebrew/sbc6510.cpp332
-rw-r--r--src/mame/homebrew/sitcom.cpp392
-rw-r--r--src/mame/homebrew/test_t400.cpp65
-rw-r--r--src/mame/homebrew/ultim809.cpp183
-rw-r--r--src/mame/homebrew/uzebox.cpp351
-rw-r--r--src/mame/homebrew/z80clock.cpp439
-rw-r--r--src/mame/homebrew/z80dev.cpp151
-rw-r--r--src/mame/homebrew/zexall.cpp199
-rw-r--r--src/mame/homelab/braiplus.cpp268
-rw-r--r--src/mame/homelab/homelab.cpp1047
-rw-r--r--src/mame/hominn/hominn_980924.cpp352
-rw-r--r--src/mame/hominn/hominn_mcs51.cpp159
-rw-r--r--src/mame/hp/hp16500.cpp547
-rw-r--r--src/mame/hp/hp2100.cpp351
-rw-r--r--src/mame/hp/hp2620.cpp251
-rw-r--r--src/mame/hp/hp2640.cpp1276
-rw-r--r--src/mame/hp/hp2640_tape.cpp556
-rw-r--r--src/mame/hp/hp2640_tape.h98
-rw-r--r--src/mame/hp/hp3478a.cpp732
-rw-r--r--src/mame/hp/hp48.cpp1366
-rw-r--r--src/mame/hp/hp48.h221
-rw-r--r--src/mame/hp/hp48_m.cpp1045
-rw-r--r--src/mame/hp/hp48_port.cpp118
-rw-r--r--src/mame/hp/hp48_port.h75
-rw-r--r--src/mame/hp/hp48_v.cpp202
-rw-r--r--src/mame/hp/hp49gp.cpp352
-rw-r--r--src/mame/hp/hp620lx.cpp79
-rw-r--r--src/mame/hp/hp64k.cpp1491
-rw-r--r--src/mame/hp/hp700.cpp148
-rw-r--r--src/mame/hp/hp7596a.cpp63
-rw-r--r--src/mame/hp/hp80.cpp2450
-rw-r--r--src/mame/hp/hp80_optrom.cpp89
-rw-r--r--src/mame/hp/hp80_optrom.h54
-rw-r--r--src/mame/hp/hp95lx.cpp780
-rw-r--r--src/mame/hp/hp9825.cpp1531
-rw-r--r--src/mame/hp/hp9825_optrom.cpp149
-rw-r--r--src/mame/hp/hp9825_optrom.h53
-rw-r--r--src/mame/hp/hp9825_tape.cpp487
-rw-r--r--src/mame/hp/hp9825_tape.h94
-rw-r--r--src/mame/hp/hp9845.cpp3945
-rw-r--r--src/mame/hp/hp9845.h143
-rw-r--r--src/mame/hp/hp9845_optrom.cpp98
-rw-r--r--src/mame/hp/hp9845_optrom.h45
-rw-r--r--src/mame/hp/hp9845_printer.cpp968
-rw-r--r--src/mame/hp/hp9845_printer.h126
-rw-r--r--src/mame/hp/hp98x5_io_sys.cpp148
-rw-r--r--src/mame/hp/hp98x5_io_sys.h67
-rw-r--r--src/mame/hp/hp98x6.cpp2117
-rw-r--r--src/mame/hp/hp98x6_optrom.cpp95
-rw-r--r--src/mame/hp/hp98x6_optrom.h46
-rw-r--r--src/mame/hp/hp98x6_upi.cpp1036
-rw-r--r--src/mame/hp/hp98x6_upi.h96
-rw-r--r--src/mame/hp/hp9k.cpp426
-rw-r--r--src/mame/hp/hp9k_3xx.cpp528
-rw-r--r--src/mame/hp/hp_ipc.cpp902
-rw-r--r--src/mame/hp/hp_ipc_optrom.cpp82
-rw-r--r--src/mame/hp/hp_ipc_optrom.h52
-rw-r--r--src/mame/hp/hpz80unk.cpp237
-rw-r--r--src/mame/hp/jornada.cpp658
-rw-r--r--src/mame/huangyeh/hy-268a.cpp173
-rw-r--r--src/mame/huangyeh/hy-9802.cpp311
-rw-r--r--src/mame/husky/hawk.cpp158
-rw-r--r--src/mame/husky/hunter16.cpp279
-rw-r--r--src/mame/husky/hunter2.cpp511
-rw-r--r--src/mame/husky/husky.cpp563
-rw-r--r--src/mame/ibm/ibm3153.cpp140
-rw-r--r--src/mame/ibm/ibm3477.cpp113
-rw-r--r--src/mame/ibm/ibm5100.cpp818
-rw-r--r--src/mame/ibm/ibm5100_kbd.cpp316
-rw-r--r--src/mame/ibm/ibm5100_kbd.h62
-rw-r--r--src/mame/ibm/ibm5550.cpp290
-rw-r--r--src/mame/ibm/ibm6580.cpp1076
-rw-r--r--src/mame/ibm/ibm6580_fdc.cpp134
-rw-r--r--src/mame/ibm/ibm6580_fdc.h54
-rw-r--r--src/mame/ibm/ibm6580_kbd.cpp298
-rw-r--r--src/mame/ibm/ibm6580_kbd.h51
-rw-r--r--src/mame/ibm/ptpc110.cpp348
-rw-r--r--src/mame/ibm/rosetta.cpp1282
-rw-r--r--src/mame/ibm/rosetta.h192
-rw-r--r--src/mame/ibm/rs6000_type7xxx.cpp73
-rw-r--r--src/mame/ibm/rtpc.cpp586
-rw-r--r--src/mame/ibm/rtpc_iocc.cpp402
-rw-r--r--src/mame/ibm/rtpc_iocc.h175
-rw-r--r--src/mame/ibm/rtpc_kbd.cpp466
-rw-r--r--src/mame/ibm/rtpc_kbd.h49
-rw-r--r--src/mame/ibm/rtpc_kbdc.cpp122
-rw-r--r--src/mame/ibm/rtpc_kbdc.h76
-rw-r--r--src/mame/ibm/rtpc_kls.cpp425
-rw-r--r--src/mame/ibm/rtpc_kls.h71
-rw-r--r--src/mame/ibm/rtpc_mouse.cpp316
-rw-r--r--src/mame/ibm/rtpc_mouse.h61
-rw-r--r--src/mame/ibm/thinkpad600.cpp406
-rw-r--r--src/mame/ibm/thinkpad8xx.cpp112
-rw-r--r--src/mame/ice/calchase.cpp780
-rw-r--r--src/mame/ice/chexx.cpp615
-rw-r--r--src/mame/ice/cutrope.cpp80
-rw-r--r--src/mame/ice/fcourtfev.cpp118
-rw-r--r--src/mame/ice/frenzyxprss.cpp107
-rw-r--r--src/mame/ice/ice_bozopail.cpp175
-rw-r--r--src/mame/ice/ice_hhhippos.cpp94
-rw-r--r--src/mame/ice/ice_tbd.cpp94
-rw-r--r--src/mame/ice/lethalj.cpp1501
-rw-r--r--src/mame/ice/schexx4gen.cpp54
-rw-r--r--src/mame/ice/skimaxx.cpp632
-rw-r--r--src/mame/ice/vp101.cpp668
-rw-r--r--src/mame/igs/5clown.cpp1233
-rw-r--r--src/mame/igs/cabaret.cpp584
-rw-r--r--src/mame/igs/dunhuang.cpp872
-rw-r--r--src/mame/igs/goldstar.cpp34288
-rw-r--r--src/mame/igs/igs009.cpp1158
-rw-r--r--src/mame/igs/igs011.cpp4687
-rw-r--r--src/mame/igs/igs011_video.cpp549
-rw-r--r--src/mame/igs/igs011_video.h97
-rw-r--r--src/mame/igs/igs012.cpp163
-rw-r--r--src/mame/igs/igs012.h38
-rw-r--r--src/mame/igs/igs017.cpp7517
-rw-r--r--src/mame/igs/igs017_igs031.cpp663
-rw-r--r--src/mame/igs/igs017_igs031.h119
-rw-r--r--src/mame/igs/igs022.cpp416
-rw-r--r--src/mame/igs/igs022.h43
-rw-r--r--src/mame/igs/igs023_video.cpp811
-rw-r--r--src/mame/igs/igs023_video.h111
-rw-r--r--src/mame/igs/igs025.cpp338
-rw-r--r--src/mame/igs/igs025.h59
-rw-r--r--src/mame/igs/igs027a.cpp202
-rw-r--r--src/mame/igs/igs027a.h59
-rw-r--r--src/mame/igs/igs028.cpp215
-rw-r--r--src/mame/igs/igs028.h32
-rw-r--r--src/mame/igs/igs036crypt.cpp790
-rw-r--r--src/mame/igs/igs036crypt.h57
-rw-r--r--src/mame/igs/igs_68k_023vid.cpp391
-rw-r--r--src/mame/igs/igs_fear.cpp791
-rw-r--r--src/mame/igs/igs_m027.cpp4945
-rw-r--r--src/mame/igs/igs_m027_023vid.cpp488
-rw-r--r--src/mame/igs/igs_m027_033vid.cpp503
-rw-r--r--src/mame/igs/igs_m027_link.cpp499
-rw-r--r--src/mame/igs/igs_m027xa.cpp1196
-rw-r--r--src/mame/igs/igs_m036.cpp940
-rw-r--r--src/mame/igs/igsmahjong.cpp27
-rw-r--r--src/mame/igs/igsmahjong.h53
-rw-r--r--src/mame/igs/igspc.cpp130
-rw-r--r--src/mame/igs/igspoker.cpp2978
-rw-r--r--src/mame/igs/iqblock.cpp655
-rw-r--r--src/mame/igs/jackie.cpp786
-rw-r--r--src/mame/igs/lordgun.cpp1214
-rw-r--r--src/mame/igs/lordgun.h159
-rw-r--r--src/mame/igs/lordgun_v.cpp366
-rw-r--r--src/mame/igs/pgm.cpp5856
-rw-r--r--src/mame/igs/pgm.h108
-rw-r--r--src/mame/igs/pgm2.cpp1574
-rw-r--r--src/mame/igs/pgm2.h202
-rw-r--r--src/mame/igs/pgm2_memcard.cpp149
-rw-r--r--src/mame/igs/pgm2_memcard.h65
-rw-r--r--src/mame/igs/pgm2_v.cpp385
-rw-r--r--src/mame/igs/pgm3.cpp241
-rw-r--r--src/mame/igs/pgmcrypt.cpp2149
-rw-r--r--src/mame/igs/pgmcrypt.h74
-rw-r--r--src/mame/igs/pgmprot_igs025_igs012.cpp230
-rw-r--r--src/mame/igs/pgmprot_igs025_igs012.h37
-rw-r--r--src/mame/igs/pgmprot_igs025_igs022.cpp447
-rw-r--r--src/mame/igs/pgmprot_igs025_igs022.h44
-rw-r--r--src/mame/igs/pgmprot_igs025_igs028.cpp216
-rw-r--r--src/mame/igs/pgmprot_igs025_igs028.h38
-rw-r--r--src/mame/igs/pgmprot_igs027a_type1.cpp2518
-rw-r--r--src/mame/igs/pgmprot_igs027a_type1.h162
-rw-r--r--src/mame/igs/pgmprot_igs027a_type2.cpp342
-rw-r--r--src/mame/igs/pgmprot_igs027a_type2.h70
-rw-r--r--src/mame/igs/pgmprot_igs027a_type3.cpp869
-rw-r--r--src/mame/igs/pgmprot_igs027a_type3.h87
-rw-r--r--src/mame/igs/pgmprot_orlegend.cpp231
-rw-r--r--src/mame/igs/pgmprot_orlegend.h37
-rw-r--r--src/mame/igs/spoker.cpp2882
-rw-r--r--src/mame/igs/xamcu.cpp314
-rw-r--r--src/mame/igs/xamcu.h106
-rw-r--r--src/mame/igt/drw80pkr.cpp691
-rw-r--r--src/mame/igt/fortune1.cpp1776
-rw-r--r--src/mame/igt/gkigt.cpp1369
-rw-r--r--src/mame/igt/peplus.cpp16889
-rw-r--r--src/mame/igt/splus.cpp754
-rw-r--r--src/mame/includes/20pacgal.h29
-rw-r--r--src/mame/includes/8080bw.h93
-rw-r--r--src/mame/includes/aerofgt.h39
-rw-r--r--src/mame/includes/ajax.h16
-rw-r--r--src/mame/includes/amiga.h433
-rw-r--r--src/mame/includes/appoooh.h16
-rw-r--r--src/mame/includes/aquarium.h17
-rw-r--r--src/mame/includes/arabian.h20
-rw-r--r--src/mame/includes/arcadecl.h13
-rw-r--r--src/mame/includes/archimds.h62
-rw-r--r--src/mame/includes/argus.h49
-rw-r--r--src/mame/includes/arkanoid.h53
-rw-r--r--src/mame/includes/armedf.h26
-rw-r--r--src/mame/includes/artmagic.h22
-rw-r--r--src/mame/includes/asteroid.h45
-rw-r--r--src/mame/includes/astrocde.h53
-rw-r--r--src/mame/includes/astrof.h19
-rw-r--r--src/mame/includes/atari.h631
-rw-r--r--src/mame/includes/atarifb.h56
-rw-r--r--src/mame/includes/atarig1.h16
-rw-r--r--src/mame/includes/atarig42.h19
-rw-r--r--src/mame/includes/atarigt.h22
-rw-r--r--src/mame/includes/atarigx2.h18
-rw-r--r--src/mame/includes/atarisy1.h20
-rw-r--r--src/mame/includes/atarisy2.h21
-rw-r--r--src/mame/includes/atetris.h15
-rw-r--r--src/mame/includes/attckufo.h20
-rw-r--r--src/mame/includes/avalnche.h15
-rw-r--r--src/mame/includes/aztarac.h26
-rw-r--r--src/mame/includes/badlands.h12
-rw-r--r--src/mame/includes/bagman.h18
-rw-r--r--src/mame/includes/balsente.h81
-rw-r--r--src/mame/includes/batman.h14
-rw-r--r--src/mame/includes/beathead.h22
-rw-r--r--src/mame/includes/beezer.h15
-rw-r--r--src/mame/includes/bigevglf.h31
-rw-r--r--src/mame/includes/blockade.h20
-rw-r--r--src/mame/includes/blstroid.h14
-rw-r--r--src/mame/includes/bsktball.h42
-rw-r--r--src/mame/includes/btime.h49
-rw-r--r--src/mame/includes/btoads.h40
-rw-r--r--src/mame/includes/bublbobl.h55
-rw-r--r--src/mame/includes/buggychl.h30
-rw-r--r--src/mame/includes/bzone.h27
-rw-r--r--src/mame/includes/canyon.h36
-rw-r--r--src/mame/includes/capbowl.h18
-rw-r--r--src/mame/includes/carpolo.h53
-rw-r--r--src/mame/includes/cave.h52
-rw-r--r--src/mame/includes/ccastles.h27
-rw-r--r--src/mame/includes/cchasm.h33
-rw-r--r--src/mame/includes/cchip.h51
-rw-r--r--src/mame/includes/cclimber.h58
-rw-r--r--src/mame/includes/centiped.h32
-rw-r--r--src/mame/includes/chaknpop.h30
-rw-r--r--src/mame/includes/changela.h22
-rw-r--r--src/mame/includes/cidelsa.h57
-rw-r--r--src/mame/includes/cinemat.h47
-rw-r--r--src/mame/includes/circus.h34
-rw-r--r--src/mame/includes/cloak.h18
-rw-r--r--src/mame/includes/cloud9.h25
-rw-r--r--src/mame/includes/cninja.h12
-rw-r--r--src/mame/includes/copsnrob.h20
-rw-r--r--src/mame/includes/cps1.h96
-rw-r--r--src/mame/includes/cps3.h14
-rw-r--r--src/mame/includes/crbaloon.h38
-rw-r--r--src/mame/includes/crgolf.h18
-rw-r--r--src/mame/includes/crshrace.h12
-rw-r--r--src/mame/includes/cubocd32.h17
-rw-r--r--src/mame/includes/cvs.h55
-rw-r--r--src/mame/includes/cyberbal.h40
-rw-r--r--src/mame/includes/dc.h323
-rw-r--r--src/mame/includes/dcheese.h25
-rw-r--r--src/mame/includes/dec0.h72
-rw-r--r--src/mame/includes/dec8.h37
-rw-r--r--src/mame/includes/deco16ic.h60
-rw-r--r--src/mame/includes/deco32.h38
-rw-r--r--src/mame/includes/decocrpt.h15
-rw-r--r--src/mame/includes/decoprot.h29
-rw-r--r--src/mame/includes/dkong.h161
-rw-r--r--src/mame/includes/docastle.h24
-rw-r--r--src/mame/includes/dogfgt.h14
-rw-r--r--src/mame/includes/dooyong.h41
-rw-r--r--src/mame/includes/dragrace.h36
-rw-r--r--src/mame/includes/drgnmst.h19
-rw-r--r--src/mame/includes/dribling.h16
-rw-r--r--src/mame/includes/dynax.h96
-rw-r--r--src/mame/includes/eolithsp.h6
-rw-r--r--src/mame/includes/epos.h10
-rw-r--r--src/mame/includes/eprom.h18
-rw-r--r--src/mame/includes/equites.h23
-rw-r--r--src/mame/includes/espial.h81
-rw-r--r--src/mame/includes/esripsys.h33
-rw-r--r--src/mame/includes/exerion.h31
-rw-r--r--src/mame/includes/exidy.h60
-rw-r--r--src/mame/includes/exidy440.h44
-rw-r--r--src/mame/includes/exterm.h18
-rw-r--r--src/mame/includes/f1gp.h24
-rw-r--r--src/mame/includes/fastfred.h34
-rw-r--r--src/mame/includes/fgoal.h15
-rw-r--r--src/mame/includes/firetrk.h72
-rw-r--r--src/mame/includes/fitfight.h20
-rw-r--r--src/mame/includes/flower.h23
-rw-r--r--src/mame/includes/flstory.h44
-rw-r--r--src/mame/includes/foodf.h13
-rw-r--r--src/mame/includes/fromanc2.h41
-rw-r--r--src/mame/includes/fromance.h30
-rw-r--r--src/mame/includes/gaelco2.h35
-rw-r--r--src/mame/includes/gaelco3d.h24
-rw-r--r--src/mame/includes/gaelcrpt.h3
-rw-r--r--src/mame/includes/galaga.h98
-rw-r--r--src/mame/includes/galaxian.h138
-rw-r--r--src/mame/includes/galaxold.h207
-rw-r--r--src/mame/includes/gameplan.h50
-rw-r--r--src/mame/includes/gaplus.h18
-rw-r--r--src/mame/includes/gauntlet.h15
-rw-r--r--src/mame/includes/gcpinbal.h11
-rw-r--r--src/mame/includes/genesis.h51
-rw-r--r--src/mame/includes/gomoku.h27
-rw-r--r--src/mame/includes/gottlieb.h41
-rw-r--r--src/mame/includes/gotya.h17
-rw-r--r--src/mame/includes/grchamp.h63
-rw-r--r--src/mame/includes/gridlee.h29
-rw-r--r--src/mame/includes/gstriker.h77
-rw-r--r--src/mame/includes/harddriv.h245
-rw-r--r--src/mame/includes/hitme.h18
-rw-r--r--src/mame/includes/homedata.h32
-rw-r--r--src/mame/includes/hyprduel.h24
-rw-r--r--src/mame/includes/inufuku.h22
-rw-r--r--src/mame/includes/iqblock.h13
-rw-r--r--src/mame/includes/irobot.h36
-rw-r--r--src/mame/includes/itech32.h57
-rw-r--r--src/mame/includes/itech8.h48
-rw-r--r--src/mame/includes/jackal.h22
-rw-r--r--src/mame/includes/jaguar.h68
-rw-r--r--src/mame/includes/jedi.h60
-rw-r--r--src/mame/includes/jpmimpct.h18
-rw-r--r--src/mame/includes/kaneko16.h146
-rw-r--r--src/mame/includes/kangaroo.h17
-rw-r--r--src/mame/includes/klax.h12
-rw-r--r--src/mame/includes/konamipt.h440
-rw-r--r--src/mame/includes/kyugo.h33
-rw-r--r--src/mame/includes/lasso.h34
-rw-r--r--src/mame/includes/lazercmd.h24
-rw-r--r--src/mame/includes/legionna.h19
-rw-r--r--src/mame/includes/leland.h149
-rw-r--r--src/mame/includes/lemmings.h10
-rw-r--r--src/mame/includes/lethalj.h15
-rw-r--r--src/mame/includes/liberatr.h22
-rw-r--r--src/mame/includes/lkage.h23
-rw-r--r--src/mame/includes/lockon.h47
-rw-r--r--src/mame/includes/lordgun.h34
-rw-r--r--src/mame/includes/lsasquad.h42
-rw-r--r--src/mame/includes/lwings.h17
-rw-r--r--src/mame/includes/m10.h62
-rw-r--r--src/mame/includes/m107.h18
-rw-r--r--src/mame/includes/m52.h25
-rw-r--r--src/mame/includes/m57.h17
-rw-r--r--src/mame/includes/m58.h20
-rw-r--r--src/mame/includes/m62.h65
-rw-r--r--src/mame/includes/m72.h35
-rw-r--r--src/mame/includes/m79amb.h9
-rw-r--r--src/mame/includes/m92.h25
-rw-r--r--src/mame/includes/madalien.h39
-rw-r--r--src/mame/includes/mario.h85
-rw-r--r--src/mame/includes/matmania.h30
-rw-r--r--src/mame/includes/mcatadv.h15
-rw-r--r--src/mame/includes/mcr.h131
-rw-r--r--src/mame/includes/meadows.h26
-rw-r--r--src/mame/includes/megasys1.h61
-rw-r--r--src/mame/includes/mexico86.h23
-rw-r--r--src/mame/includes/mhavoc.h47
-rw-r--r--src/mame/includes/midtunit.h64
-rw-r--r--src/mame/includes/midvunit.h37
-rw-r--r--src/mame/includes/midwunit.h52
-rw-r--r--src/mame/includes/midyunit.h64
-rw-r--r--src/mame/includes/midzeus.h27
-rw-r--r--src/mame/includes/model1.h36
-rw-r--r--src/mame/includes/model2.h17
-rw-r--r--src/mame/includes/model3.h43
-rw-r--r--src/mame/includes/ms32.h39
-rw-r--r--src/mame/includes/mw8080bw.h194
-rw-r--r--src/mame/includes/mystston.h41
-rw-r--r--src/mame/includes/n64.h90
-rw-r--r--src/mame/includes/n8080.h31
-rw-r--r--src/mame/includes/namcoic.h175
-rw-r--r--src/mame/includes/namcona1.h39
-rw-r--r--src/mame/includes/namconb1.h28
-rw-r--r--src/mame/includes/namcond1.h30
-rw-r--r--src/mame/includes/namcos1.h56
-rw-r--r--src/mame/includes/namcos2.h248
-rw-r--r--src/mame/includes/namcos21.h23
-rw-r--r--src/mame/includes/namcos22.h79
-rw-r--r--src/mame/includes/naomi.h25
-rw-r--r--src/mame/includes/naomibd.h98
-rw-r--r--src/mame/includes/nb1413m3.h160
-rw-r--r--src/mame/includes/nbmj8688.h29
-rw-r--r--src/mame/includes/nbmj8891.h23
-rw-r--r--src/mame/includes/nbmj8991.h12
-rw-r--r--src/mame/includes/nbmj9195.h21
-rw-r--r--src/mame/includes/nemesis.h30
-rw-r--r--src/mame/includes/neogeo.h144
-rw-r--r--src/mame/includes/news.h10
-rw-r--r--src/mame/includes/ninjakd2.h32
-rw-r--r--src/mame/includes/nitedrvr.h44
-rw-r--r--src/mame/includes/niyanpai.h20
-rw-r--r--src/mame/includes/nmk16.h53
-rw-r--r--src/mame/includes/nova2001.h23
-rw-r--r--src/mame/includes/nycaptor.h43
-rw-r--r--src/mame/includes/offtwall.h10
-rw-r--r--src/mame/includes/oneshot.h20
-rw-r--r--src/mame/includes/orbit.h36
-rw-r--r--src/mame/includes/pacman.h68
-rw-r--r--src/mame/includes/paradise.h21
-rw-r--r--src/mame/includes/pgm.h56
-rw-r--r--src/mame/includes/phoenix.h77
-rw-r--r--src/mame/includes/pitnrun.h32
-rw-r--r--src/mame/includes/pk8000.h21
-rw-r--r--src/mame/includes/playch10.h56
-rw-r--r--src/mame/includes/playmark.h26
-rw-r--r--src/mame/includes/polepos.h52
-rw-r--r--src/mame/includes/policetr.h21
-rw-r--r--src/mame/includes/polyplay.h19
-rw-r--r--src/mame/includes/poolshrk.h28
-rw-r--r--src/mame/includes/pooyan.h15
-rw-r--r--src/mame/includes/psikyosh.h29
-rw-r--r--src/mame/includes/psx.h60
-rw-r--r--src/mame/includes/qix.h91
-rw-r--r--src/mame/includes/raiden2.h16
-rw-r--r--src/mame/includes/rampart.h15
-rw-r--r--src/mame/includes/realbrk.h21
-rw-r--r--src/mame/includes/redalert.h32
-rw-r--r--src/mame/includes/relief.h10
-rw-r--r--src/mame/includes/retofinv.h28
-rw-r--r--src/mame/includes/segag80r.h63
-rw-r--r--src/mame/includes/segag80v.h21
-rw-r--r--src/mame/includes/segas24.h23
-rw-r--r--src/mame/includes/segas32.h81
-rw-r--r--src/mame/includes/sei_crtc.h14
-rw-r--r--src/mame/includes/seibuspi.h46
-rw-r--r--src/mame/includes/senjyo.h36
-rw-r--r--src/mame/includes/seta.h84
-rw-r--r--src/mame/includes/shuuz.h10
-rw-r--r--src/mame/includes/simpsons.h19
-rw-r--r--src/mame/includes/skullxbo.h17
-rw-r--r--src/mame/includes/skydiver.h45
-rw-r--r--src/mame/includes/slapfght.h88
-rw-r--r--src/mame/includes/slapstic.h18
-rw-r--r--src/mame/includes/snes.h564
-rw-r--r--src/mame/includes/snk.h73
-rw-r--r--src/mame/includes/snk6502.h64
-rw-r--r--src/mame/includes/spacefb.h46
-rw-r--r--src/mame/includes/spiders.h15
-rw-r--r--src/mame/includes/sprint2.h45
-rw-r--r--src/mame/includes/sprint8.h19
-rw-r--r--src/mame/includes/sspeedr.h20
-rw-r--r--src/mame/includes/st0016.h59
-rw-r--r--src/mame/includes/stactics.h50
-rw-r--r--src/mame/includes/starfire.h26
-rw-r--r--src/mame/includes/starshp1.h89
-rw-r--r--src/mame/includes/starwars.h50
-rw-r--r--src/mame/includes/stfight.h30
-rw-r--r--src/mame/includes/stv.h97
-rw-r--r--src/mame/includes/subs.h47
-rw-r--r--src/mame/includes/suna8.h27
-rw-r--r--src/mame/includes/suprnova.h26
-rw-r--r--src/mame/includes/suprridr.h25
-rw-r--r--src/mame/includes/system16.h228
-rw-r--r--src/mame/includes/taito_b.h28
-rw-r--r--src/mame/includes/taito_f2.h48
-rw-r--r--src/mame/includes/taito_f3.h65
-rw-r--r--src/mame/includes/taito_l.h24
-rw-r--r--src/mame/includes/taitosj.h47
-rw-r--r--src/mame/includes/tank8.h50
-rw-r--r--src/mame/includes/taotaido.h13
-rw-r--r--src/mame/includes/targ.h16
-rw-r--r--src/mame/includes/tatsumi.h75
-rw-r--r--src/mame/includes/taxidrvr.h10
-rw-r--r--src/mame/includes/tecmosys.h41
-rw-r--r--src/mame/includes/tetrisp2.h44
-rw-r--r--src/mame/includes/thedeep.h12
-rw-r--r--src/mame/includes/thunderj.h14
-rw-r--r--src/mame/includes/tiamc1.h25
-rw-r--r--src/mame/includes/timeplt.h17
-rw-r--r--src/mame/includes/tmnt.h34
-rw-r--r--src/mame/includes/tnzs.h37
-rw-r--r--src/mame/includes/toaplan1.h86
-rw-r--r--src/mame/includes/toaplan2.h71
-rw-r--r--src/mame/includes/toobin.h16
-rw-r--r--src/mame/includes/trackfld.h31
-rw-r--r--src/mame/includes/triplhnt.h41
-rw-r--r--src/mame/includes/tubep.h26
-rw-r--r--src/mame/includes/tumbleb.h40
-rw-r--r--src/mame/includes/turbo.h100
-rw-r--r--src/mame/includes/tutankhm.h17
-rw-r--r--src/mame/includes/twin16.h23
-rw-r--r--src/mame/includes/twincobr.h88
-rw-r--r--src/mame/includes/tx1.h101
-rw-r--r--src/mame/includes/ultratnk.h17
-rw-r--r--src/mame/includes/unico.h23
-rw-r--r--src/mame/includes/vball.h18
-rw-r--r--src/mame/includes/vertigo.h28
-rw-r--r--src/mame/includes/vicdual.h75
-rw-r--r--src/mame/includes/victory.h22
-rw-r--r--src/mame/includes/videopin.h32
-rw-r--r--src/mame/includes/vindictr.h14
-rw-r--r--src/mame/includes/vsnes.h55
-rw-r--r--src/mame/includes/warpwarp.h36
-rw-r--r--src/mame/includes/wc90.h18
-rw-r--r--src/mame/includes/williams.h123
-rw-r--r--src/mame/includes/wiping.h16
-rw-r--r--src/mame/includes/wrally.h19
-rw-r--r--src/mame/includes/wwfwfest.h12
-rw-r--r--src/mame/includes/xmen.h16
-rw-r--r--src/mame/includes/xybots.h10
-rw-r--r--src/mame/includes/zaxxon.h44
-rw-r--r--src/mame/informer/informer_207_100.cpp275
-rw-r--r--src/mame/informer/informer_207_376.cpp346
-rw-r--r--src/mame/informer/informer_207_376_kbd.cpp297
-rw-r--r--src/mame/informer/informer_207_376_kbd.h60
-rw-r--r--src/mame/informer/informer_213.cpp571
-rw-r--r--src/mame/intel/basic52.cpp175
-rw-r--r--src/mame/intel/i420ex.cpp277
-rw-r--r--src/mame/intel/imds2.cpp350
-rw-r--r--src/mame/intel/imds2ioc.cpp675
-rw-r--r--src/mame/intel/imds2ioc.h129
-rw-r--r--src/mame/intel/imm6_76.cpp214
-rw-r--r--src/mame/intel/imm6_76.h202
-rw-r--r--src/mame/intel/intellec4.cpp1500
-rw-r--r--src/mame/intel/intellec8.cpp127
-rw-r--r--src/mame/intel/ipc.cpp154
-rw-r--r--src/mame/intel/ipds.cpp188
-rw-r--r--src/mame/intel/isbc.cpp724
-rw-r--r--src/mame/intel/isbc660.cpp82
-rw-r--r--src/mame/intel/isbc8010.cpp290
-rw-r--r--src/mame/intel/isbc8030.cpp131
-rw-r--r--src/mame/intel/isbc_208.cpp125
-rw-r--r--src/mame/intel/isbc_208.h54
-rw-r--r--src/mame/intel/rex6000.cpp1068
-rw-r--r--src/mame/intel/sdk51.cpp327
-rw-r--r--src/mame/intel/sdk80.cpp162
-rw-r--r--src/mame/intel/sdk85.cpp277
-rw-r--r--src/mame/intel/sdk86.cpp261
-rw-r--r--src/mame/intergraph/interpro.cpp1761
-rw-r--r--src/mame/intergraph/interpro_arbga.cpp90
-rw-r--r--src/mame/intergraph/interpro_arbga.h90
-rw-r--r--src/mame/intergraph/interpro_ioga.cpp1474
-rw-r--r--src/mame/intergraph/interpro_ioga.h571
-rw-r--r--src/mame/intergraph/interpro_mcga.cpp100
-rw-r--r--src/mame/intergraph/interpro_mcga.h126
-rw-r--r--src/mame/intergraph/interpro_sga.cpp162
-rw-r--r--src/mame/intergraph/interpro_sga.h191
-rw-r--r--src/mame/interton/vc4000.cpp696
-rw-r--r--src/mame/interton/vc4000.h186
-rw-r--r--src/mame/interton/vc4000_a.cpp68
-rw-r--r--src/mame/interton/vc4000_a.h46
-rw-r--r--src/mame/interton/vc4000_v.cpp647
-rw-r--r--src/mame/irem/irem.cpp535
-rw-r--r--src/mame/irem/irem.h94
-rw-r--r--src/mame/irem/irem_cpu.cpp659
-rw-r--r--src/mame/irem/irem_cpu.h19
-rw-r--r--src/mame/irem/iremipt.h (renamed from src/mame/includes/iremipt.h)70
-rw-r--r--src/mame/irem/m10.cpp1250
-rw-r--r--src/mame/irem/m102.cpp145
-rw-r--r--src/mame/irem/m107.cpp1500
-rw-r--r--src/mame/irem/m119.cpp142
-rw-r--r--src/mame/irem/m14.cpp465
-rw-r--r--src/mame/irem/m52.cpp1182
-rw-r--r--src/mame/irem/m57.cpp632
-rw-r--r--src/mame/irem/m58.cpp784
-rw-r--r--src/mame/irem/m62.cpp2577
-rw-r--r--src/mame/irem/m62.h198
-rw-r--r--src/mame/irem/m62_bkungfu.cpp1000
-rw-r--r--src/mame/irem/m62_v.cpp860
-rw-r--r--src/mame/irem/m63.cpp1014
-rw-r--r--src/mame/irem/m72.cpp4700
-rw-r--r--src/mame/irem/m72.h303
-rw-r--r--src/mame/irem/m72_a.cpp131
-rw-r--r--src/mame/irem/m72_a.h47
-rw-r--r--src/mame/irem/m72_v.cpp560
-rw-r--r--src/mame/irem/m78.cpp392
-rw-r--r--src/mame/irem/m80.cpp636
-rw-r--r--src/mame/irem/m90.cpp1372
-rw-r--r--src/mame/irem/m90.h95
-rw-r--r--src/mame/irem/m90_v.cpp514
-rw-r--r--src/mame/irem/m92.cpp2647
-rw-r--r--src/mame/irem/m92.h172
-rw-r--r--src/mame/irem/m92_v.cpp592
-rw-r--r--src/mame/irem/nl_kidniki.cpp461
-rw-r--r--src/mame/irem/nl_kidniki.h6
-rw-r--r--src/mame/irem/olibochu.cpp686
-rw-r--r--src/mame/irem/redalert.cpp548
-rw-r--r--src/mame/irem/redalert.h85
-rw-r--r--src/mame/irem/redalert_a.cpp418
-rw-r--r--src/mame/irem/redalert_a.h127
-rw-r--r--src/mame/irem/redalert_v.cpp580
-rw-r--r--src/mame/irem/spartanxtec.cpp456
-rw-r--r--src/mame/irem/travrusa.cpp1015
-rw-r--r--src/mame/irem/vigilant.cpp2136
-rw-r--r--src/mame/isc/compucolor.cpp475
-rw-r--r--src/mame/itech/capbowl.cpp734
-rw-r--r--src/mame/itech/iteagle.cpp776
-rw-r--r--src/mame/itech/iteagle_fpga.cpp895
-rw-r--r--src/mame/itech/iteagle_fpga.h179
-rw-r--r--src/mame/itech/itech32.cpp5341
-rw-r--r--src/mame/itech/itech32.h312
-rw-r--r--src/mame/itech/itech32_v.cpp1513
-rw-r--r--src/mame/itech/itech8.cpp2828
-rw-r--r--src/mame/itech/itech8.h275
-rw-r--r--src/mame/itech/itech8_m.cpp618
-rw-r--r--src/mame/itech/itech8_v.cpp721
-rw-r--r--src/mame/jaleco/acommand.cpp563
-rw-r--r--src/mame/jaleco/aeroboto.cpp640
-rw-r--r--src/mame/jaleco/argus.cpp749
-rw-r--r--src/mame/jaleco/argus.h186
-rw-r--r--src/mame/jaleco/argus_v.cpp1031
-rw-r--r--src/mame/jaleco/armchamp.cpp479
-rw-r--r--src/mame/jaleco/bestleag.cpp468
-rw-r--r--src/mame/jaleco/bigstrkb.cpp480
-rw-r--r--src/mame/jaleco/blueprnt.cpp757
-rw-r--r--src/mame/jaleco/bnstars.cpp737
-rw-r--r--src/mame/jaleco/cischeat.cpp3134
-rw-r--r--src/mame/jaleco/citycon.cpp565
-rw-r--r--src/mame/jaleco/dday.cpp751
-rw-r--r--src/mame/jaleco/exerion.cpp1195
-rw-r--r--src/mame/jaleco/fcombat.cpp743
-rw-r--r--src/mame/jaleco/ginganin.cpp652
-rw-r--r--src/mame/jaleco/homerun.cpp761
-rw-r--r--src/mame/jaleco/jalblend.cpp195
-rw-r--r--src/mame/jaleco/jalblend.h44
-rw-r--r--src/mame/jaleco/jalcrpt.cpp120
-rw-r--r--src/mame/jaleco/jalcrpt.h5
-rw-r--r--src/mame/jaleco/jaleco_ms32_sysctrl.cpp356
-rw-r--r--src/mame/jaleco/jaleco_ms32_sysctrl.h114
-rw-r--r--src/mame/jaleco/jaleco_road.cpp288
-rw-r--r--src/mame/jaleco/jaleco_road.h77
-rw-r--r--src/mame/jaleco/jaleco_vj_pc.cpp166
-rw-r--r--src/mame/jaleco/jaleco_vj_pc.h50
-rw-r--r--src/mame/jaleco/jaleco_vj_qtaro.cpp527
-rw-r--r--src/mame/jaleco/jaleco_vj_qtaro.h129
-rw-r--r--src/mame/jaleco/jaleco_vj_sound.cpp328
-rw-r--r--src/mame/jaleco/jaleco_vj_sound.h76
-rw-r--r--src/mame/jaleco/jaleco_vj_ups.cpp44
-rw-r--r--src/mame/jaleco/jaleco_vj_ups.h13
-rw-r--r--src/mame/jaleco/jaleco_zoomspr.cpp327
-rw-r--r--src/mame/jaleco/jaleco_zoomspr.h69
-rw-r--r--src/mame/jaleco/jalmah.cpp1777
-rw-r--r--src/mame/jaleco/megasys1.cpp5378
-rw-r--r--src/mame/jaleco/megasys1.h337
-rw-r--r--src/mame/jaleco/megasys1_v.cpp852
-rw-r--r--src/mame/jaleco/momoko.cpp796
-rw-r--r--src/mame/jaleco/ms1_gatearray.cpp223
-rw-r--r--src/mame/jaleco/ms1_gatearray.h89
-rw-r--r--src/mame/jaleco/ms1_tmap.cpp309
-rw-r--r--src/mame/jaleco/ms1_tmap.h96
-rw-r--r--src/mame/jaleco/ms32.cpp2752
-rw-r--r--src/mame/jaleco/ms32.h209
-rw-r--r--src/mame/jaleco/ms32_sprite.cpp1154
-rw-r--r--src/mame/jaleco/ms32_sprite.h94
-rw-r--r--src/mame/jaleco/ms32_v.cpp705
-rw-r--r--src/mame/jaleco/psychic5.cpp1430
-rw-r--r--src/mame/jaleco/pturn.cpp583
-rw-r--r--src/mame/jaleco/scudhamm.cpp1762
-rw-r--r--src/mame/jaleco/skyfox.cpp684
-rw-r--r--src/mame/jaleco/tetrisp2.cpp3462
-rw-r--r--src/mame/jaleco/tetrisp2.h369
-rw-r--r--src/mame/jaleco/tetrisp2_v.cpp870
-rw-r--r--src/mame/jpm/guab.cpp581
-rw-r--r--src/mame/jpm/jpmimpct.cpp1864
-rw-r--r--src/mame/jpm/jpmimpct.h226
-rw-r--r--src/mame/jpm/jpmimpct_v.cpp48
-rw-r--r--src/mame/jpm/jpmimpctsw.cpp12833
-rw-r--r--src/mame/jpm/jpmmps.cpp2342
-rw-r--r--src/mame/jpm/jpms80.cpp387
-rw-r--r--src/mame/jpm/jpmsru.cpp1756
-rw-r--r--src/mame/jpm/jpmsys5.cpp1272
-rw-r--r--src/mame/jpm/jpmsys5.h199
-rw-r--r--src/mame/jpm/jpmsys5sw.cpp1635
-rw-r--r--src/mame/jpm/jpmsys7.cpp246
-rw-r--r--src/mame/jpm/nl_jpmsru.cpp64
-rw-r--r--src/mame/jpm/nl_jpmsru.h12
-rw-r--r--src/mame/jpm/pl6_exp.cpp60
-rw-r--r--src/mame/jpm/pl6_exp.h67
-rw-r--r--src/mame/jpm/pl6_fpga.cpp388
-rw-r--r--src/mame/jpm/pl6_fpga.h253
-rw-r--r--src/mame/jpm/pl6_pic.cpp164
-rw-r--r--src/mame/jpm/pl6_pic.h84
-rw-r--r--src/mame/jpm/pluto5.cpp1037
-rw-r--r--src/mame/jpm/pluto6.cpp653
-rw-r--r--src/mame/kaneko/airbustr.cpp911
-rw-r--r--src/mame/kaneko/djboy.cpp880
-rw-r--r--src/mame/kaneko/expro02.cpp2067
-rw-r--r--src/mame/kaneko/galpani2.cpp1345
-rw-r--r--src/mame/kaneko/galpani2.h85
-rw-r--r--src/mame/kaneko/galpani2_v.cpp149
-rw-r--r--src/mame/kaneko/galpani3.cpp588
-rw-r--r--src/mame/kaneko/galpanic.cpp469
-rw-r--r--src/mame/kaneko/galpanic_ms.cpp588
-rw-r--r--src/mame/kaneko/galpnipt.h165
-rw-r--r--src/mame/kaneko/hvyunit.cpp836
-rw-r--r--src/mame/kaneko/jchan.cpp765
-rw-r--r--src/mame/kaneko/kan_pand.cpp264
-rw-r--r--src/mame/kaneko/kan_pand.h72
-rw-r--r--src/mame/kaneko/kaneko16.cpp4555
-rw-r--r--src/mame/kaneko/kaneko16.h273
-rw-r--r--src/mame/kaneko/kaneko16_v.cpp208
-rw-r--r--src/mame/kaneko/kaneko_calc3.cpp1687
-rw-r--r--src/mame/kaneko/kaneko_calc3.h76
-rw-r--r--src/mame/kaneko/kaneko_grap2.cpp167
-rw-r--r--src/mame/kaneko/kaneko_grap2.h88
-rw-r--r--src/mame/kaneko/kaneko_hit.cpp583
-rw-r--r--src/mame/kaneko/kaneko_hit.h87
-rw-r--r--src/mame/kaneko/kaneko_rlespr.cpp553
-rw-r--r--src/mame/kaneko/kaneko_rlespr.h43
-rw-r--r--src/mame/kaneko/kaneko_spr.cpp649
-rw-r--r--src/mame/kaneko/kaneko_spr.h159
-rw-r--r--src/mame/kaneko/kaneko_tmap.cpp278
-rw-r--r--src/mame/kaneko/kaneko_tmap.h97
-rw-r--r--src/mame/kaneko/kaneko_toybox.cpp571
-rw-r--r--src/mame/kaneko/kaneko_toybox.h64
-rw-r--r--src/mame/kaneko/sandscrp.cpp561
-rw-r--r--src/mame/kaneko/snowbros.cpp3392
-rw-r--r--src/mame/kaneko/snowbros.h185
-rw-r--r--src/mame/kaneko/snowbros_v.cpp245
-rw-r--r--src/mame/kaneko/suprnova.cpp2189
-rw-r--r--src/mame/kaneko/suprnova.h188
-rw-r--r--src/mame/kaneko/suprnova_v.cpp495
-rw-r--r--src/mame/kawai/acr20.cpp60
-rw-r--r--src/mame/kawai/k1.cpp119
-rw-r--r--src/mame/kawai/k4.cpp86
-rw-r--r--src/mame/kawai/k5.cpp85
-rw-r--r--src/mame/kawai/ksp10.cpp60
-rw-r--r--src/mame/kawai/mb63h158.cpp44
-rw-r--r--src/mame/kawai/mb63h158.h42
-rw-r--r--src/mame/kawai/r100.cpp156
-rw-r--r--src/mame/kawai/sx240.cpp144
-rw-r--r--src/mame/kaypro/kaypro.cpp726
-rw-r--r--src/mame/kaypro/kaypro.h167
-rw-r--r--src/mame/kaypro/kaypro_m.cpp330
-rw-r--r--src/mame/kaypro/kaypro_v.cpp252
-rw-r--r--src/mame/koei/pasogo.cpp593
-rw-r--r--src/mame/konami/3dom2.cpp2000
-rw-r--r--src/mame/konami/3dom2.h716
-rw-r--r--src/mame/konami/3dom2_te.cpp3880
-rw-r--r--src/mame/konami/3dom2_te.h418
-rw-r--r--src/mame/konami/88games.cpp670
-rw-r--r--src/mame/konami/ajax.cpp764
-rw-r--r--src/mame/konami/aliens.cpp612
-rw-r--r--src/mame/konami/asterix.cpp565
-rw-r--r--src/mame/konami/battlnts.cpp459
-rw-r--r--src/mame/konami/bishi.cpp664
-rw-r--r--src/mame/konami/bladestl.cpp549
-rw-r--r--src/mame/konami/blockhl.cpp386
-rw-r--r--src/mame/konami/bottom9.cpp642
-rw-r--r--src/mame/konami/chqflag.cpp545
-rw-r--r--src/mame/konami/circusc.cpp861
-rw-r--r--src/mame/konami/cobra.cpp3283
-rw-r--r--src/mame/konami/combatsc.cpp941
-rw-r--r--src/mame/konami/combatsc.h171
-rw-r--r--src/mame/konami/combatsc_v.cpp500
-rw-r--r--src/mame/konami/contra.cpp959
-rw-r--r--src/mame/konami/cougar.cpp113
-rw-r--r--src/mame/konami/crimfght.cpp565
-rw-r--r--src/mame/konami/dbz.cpp828
-rw-r--r--src/mame/konami/ddribble.cpp651
-rw-r--r--src/mame/konami/divebomb.cpp836
-rw-r--r--src/mame/konami/djmain.cpp2734
-rw-r--r--src/mame/konami/fastlane.cpp410
-rw-r--r--src/mame/konami/finalizr.cpp637
-rw-r--r--src/mame/konami/firebeat.cpp2827
-rw-r--r--src/mame/konami/flkatck.cpp499
-rw-r--r--src/mame/konami/gberet.cpp901
-rw-r--r--src/mame/konami/giclassic.cpp395
-rw-r--r--src/mame/konami/gijoe.cpp793
-rw-r--r--src/mame/konami/goldenregion.cpp335
-rw-r--r--src/mame/konami/gradius3.cpp731
-rw-r--r--src/mame/konami/gryzor_ms.cpp188
-rw-r--r--src/mame/konami/gticlub.cpp1421
-rw-r--r--src/mame/konami/gyruss.cpp949
-rw-r--r--src/mame/konami/hcastle.cpp627
-rw-r--r--src/mame/konami/hexion.cpp604
-rw-r--r--src/mame/konami/hornet.cpp3766
-rw-r--r--src/mame/konami/hyperspt.cpp955
-rw-r--r--src/mame/konami/hyprolyb.cpp81
-rw-r--r--src/mame/konami/hyprolyb.h42
-rw-r--r--src/mame/konami/ironhors.cpp1020
-rw-r--r--src/mame/konami/jackal.cpp781
-rw-r--r--src/mame/konami/jailbrek.cpp567
-rw-r--r--src/mame/konami/junofrst.cpp495
-rw-r--r--src/mame/konami/k001005.cpp968
-rw-r--r--src/mame/konami/k001005.h143
-rw-r--r--src/mame/konami/k001006.cpp197
-rw-r--r--src/mame/konami/k001006.h51
-rw-r--r--src/mame/konami/k001604.cpp560
-rw-r--r--src/mame/konami/k001604.h53
-rw-r--r--src/mame/konami/k005849.cpp143
-rw-r--r--src/mame/konami/k005849.h49
-rw-r--r--src/mame/konami/k007121.cpp469
-rw-r--r--src/mame/konami/k007121.h82
-rw-r--r--src/mame/konami/k007342.cpp294
-rw-r--r--src/mame/konami/k007342.h69
-rw-r--r--src/mame/konami/k007420.cpp271
-rw-r--r--src/mame/konami/k007420.h52
-rw-r--r--src/mame/konami/k007452.cpp104
-rw-r--r--src/mame/konami/k007452.h46
-rw-r--r--src/mame/konami/k037122.cpp283
-rw-r--r--src/mame/konami/k037122.h52
-rw-r--r--src/mame/konami/k051733.cpp209
-rw-r--r--src/mame/konami/k051733.h45
-rw-r--r--src/mame/konami/k051960.cpp618
-rw-r--r--src/mame/konami/k051960.h105
-rw-r--r--src/mame/konami/k052109.cpp772
-rw-r--r--src/mame/konami/k052109.h113
-rw-r--r--src/mame/konami/k053244_k053245.cpp542
-rw-r--r--src/mame/konami/k053244_k053245.h69
-rw-r--r--src/mame/konami/k053246_k053247_k055673.cpp877
-rw-r--r--src/mame/konami/k053246_k053247_k055673.h465
-rw-r--r--src/mame/konami/k053250.cpp458
-rw-r--r--src/mame/konami/k053250.h68
-rw-r--r--src/mame/konami/k053250_ps.cpp589
-rw-r--r--src/mame/konami/k053250_ps.h85
-rw-r--r--src/mame/konami/k053251.cpp194
-rw-r--r--src/mame/konami/k053251.h41
-rw-r--r--src/mame/konami/k054000.cpp269
-rw-r--r--src/mame/konami/k054000.h42
-rw-r--r--src/mame/konami/k054156_k054157_k056832.cpp1981
-rw-r--r--src/mame/konami/k054156_k054157_k056832.h204
-rw-r--r--src/mame/konami/k054338.cpp201
-rw-r--r--src/mame/konami/k054338.h66
-rw-r--r--src/mame/konami/k055555.cpp150
-rw-r--r--src/mame/konami/k055555.h102
-rw-r--r--src/mame/konami/k057714.cpp939
-rw-r--r--src/mame/konami/k057714.h100
-rw-r--r--src/mame/konami/k573cass.cpp435
-rw-r--r--src/mame/konami/k573cass.h224
-rw-r--r--src/mame/konami/k573dio.cpp484
-rw-r--r--src/mame/konami/k573dio.h99
-rw-r--r--src/mame/konami/k573fpga.cpp356
-rw-r--r--src/mame/konami/k573fpga.h112
-rw-r--r--src/mame/konami/k573kara.cpp162
-rw-r--r--src/mame/konami/k573kara.h49
-rw-r--r--src/mame/konami/k573mcal.cpp211
-rw-r--r--src/mame/konami/k573mcal.h50
-rw-r--r--src/mame/konami/k573mcr.cpp514
-rw-r--r--src/mame/konami/k573mcr.h79
-rw-r--r--src/mame/konami/k573msu.cpp97
-rw-r--r--src/mame/konami/k573msu.h27
-rw-r--r--src/mame/konami/konami1.cpp74
-rw-r--r--src/mame/konami/konami1.h45
-rw-r--r--src/mame/konami/konami_gn676_lan.cpp394
-rw-r--r--src/mame/konami/konami_gn676_lan.h73
-rw-r--r--src/mame/konami/konami_helper.cpp16
-rw-r--r--src/mame/konami/konami_helper.h53
-rw-r--r--src/mame/konami/konamigq.cpp502
-rw-r--r--src/mame/konami/konamigs.cpp1139
-rw-r--r--src/mame/konami/konamigv.cpp1459
-rw-r--r--src/mame/konami/konamigx.cpp4270
-rw-r--r--src/mame/konami/konamigx.h363
-rw-r--r--src/mame/konami/konamigx_m.cpp536
-rw-r--r--src/mame/konami/konamigx_v.cpp1624
-rw-r--r--src/mame/konami/konamiic.txt260
-rw-r--r--src/mame/konami/konamim2.cpp1698
-rw-r--r--src/mame/konami/konamipt.h472
-rw-r--r--src/mame/konami/konblands.cpp338
-rw-r--r--src/mame/konami/konendev.cpp936
-rw-r--r--src/mame/konami/kongs470.cpp100
-rw-r--r--src/mame/konami/konmedal.cpp1411
-rw-r--r--src/mame/konami/konmedal020.cpp131
-rw-r--r--src/mame/konami/konmedal68k.cpp900
-rw-r--r--src/mame/konami/konmedalppc.cpp166
-rw-r--r--src/mame/konami/konppc.cpp423
-rw-r--r--src/mame/konami/konppc.h117
-rw-r--r--src/mame/konami/konppc_jvshost.cpp91
-rw-r--r--src/mame/konami/konppc_jvshost.h40
-rw-r--r--src/mame/konami/kontest.cpp280
-rw-r--r--src/mame/konami/kpontoon.cpp433
-rw-r--r--src/mame/konami/kpython.cpp381
-rw-r--r--src/mame/konami/kpython2.cpp1963
-rw-r--r--src/mame/konami/ksys573.cpp6626
-rw-r--r--src/mame/konami/labyrunr.cpp533
-rw-r--r--src/mame/konami/lethal.cpp968
-rw-r--r--src/mame/konami/mainevt.cpp936
-rw-r--r--src/mame/konami/megazone.cpp920
-rw-r--r--src/mame/konami/midikbd.cpp132
-rw-r--r--src/mame/konami/midikbd.h39
-rw-r--r--src/mame/konami/mikie.cpp615
-rw-r--r--src/mame/konami/mogura.cpp341
-rw-r--r--src/mame/konami/moo.cpp1292
-rw-r--r--src/mame/konami/mystwarr.cpp2443
-rw-r--r--src/mame/konami/mystwarr.h127
-rw-r--r--src/mame/konami/mystwarr_v.cpp484
-rw-r--r--src/mame/konami/nemesis.cpp3275
-rw-r--r--src/mame/konami/nemesis.h258
-rw-r--r--src/mame/konami/nemesis_v.cpp292
-rw-r--r--src/mame/konami/nwk-tr.cpp1787
-rw-r--r--src/mame/konami/otomedius.cpp79
-rw-r--r--src/mame/konami/overdriv.cpp648
-rw-r--r--src/mame/konami/pandoras.cpp669
-rw-r--r--src/mame/konami/parodius.cpp501
-rw-r--r--src/mame/konami/pingpong.cpp850
-rw-r--r--src/mame/konami/piratesh.cpp683
-rw-r--r--src/mame/konami/plygonet.cpp1151
-rw-r--r--src/mame/konami/pooyan.cpp546
-rw-r--r--src/mame/konami/qdrmfgp.cpp804
-rw-r--r--src/mame/konami/quickpick5.cpp713
-rw-r--r--src/mame/konami/rockrage.cpp510
-rw-r--r--src/mame/konami/rocnrope.cpp572
-rw-r--r--src/mame/konami/rollerg.cpp461
-rw-r--r--src/mame/konami/rungun.cpp1258
-rw-r--r--src/mame/konami/sbasketb.cpp635
-rw-r--r--src/mame/konami/scotrsht.cpp437
-rw-r--r--src/mame/konami/shaolins.cpp649
-rw-r--r--src/mame/konami/simpsons.cpp980
-rw-r--r--src/mame/konami/spy.cpp683
-rw-r--r--src/mame/konami/stingnet.cpp360
-rw-r--r--src/mame/konami/surpratk.cpp424
-rw-r--r--src/mame/konami/tasman.cpp899
-rw-r--r--src/mame/konami/tgtpanic.cpp195
-rw-r--r--src/mame/konami/thunderx.cpp1231
-rw-r--r--src/mame/konami/timeplt.cpp1034
-rw-r--r--src/mame/konami/tmnt.cpp1736
-rw-r--r--src/mame/konami/tmnt2.cpp4002
-rw-r--r--src/mame/konami/tp84.cpp751
-rw-r--r--src/mame/konami/trackfld.cpp2084
-rw-r--r--src/mame/konami/trackfld_a.cpp107
-rw-r--r--src/mame/konami/trackfld_a.h46
-rw-r--r--src/mame/konami/tutankhm.cpp448
-rw-r--r--src/mame/konami/tutankhm.h103
-rw-r--r--src/mame/konami/tutankhm_v.cpp444
-rw-r--r--src/mame/konami/twin16.cpp1480
-rw-r--r--src/mame/konami/twin16_v.cpp526
-rw-r--r--src/mame/konami/twin16_v.h101
-rw-r--r--src/mame/konami/twinkle.cpp1674
-rw-r--r--src/mame/konami/ultraman.cpp454
-rw-r--r--src/mame/konami/ultrsprt.cpp304
-rw-r--r--src/mame/konami/vendetta.cpp1095
-rw-r--r--src/mame/konami/viper.cpp3309
-rw-r--r--src/mame/konami/wecleman.cpp1737
-rw-r--r--src/mame/konami/wecleman.h202
-rw-r--r--src/mame/konami/wecleman_v.cpp1057
-rw-r--r--src/mame/konami/windy2.cpp300
-rw-r--r--src/mame/konami/windy2.h136
-rw-r--r--src/mame/konami/xexex.cpp885
-rw-r--r--src/mame/konami/xmen.cpp1219
-rw-r--r--src/mame/konami/yiear.cpp574
-rw-r--r--src/mame/konami/zr107.cpp1152
-rw-r--r--src/mame/konami/zs01.cpp727
-rw-r--r--src/mame/konami/zs01.h116
-rw-r--r--src/mame/kontron/kdt6.cpp737
-rw-r--r--src/mame/korg/korgds8.cpp270
-rw-r--r--src/mame/korg/korgdss1.cpp584
-rw-r--r--src/mame/korg/korgdvp1.cpp119
-rw-r--r--src/mame/korg/korgdw8k.cpp172
-rw-r--r--src/mame/korg/korgm1.cpp407
-rw-r--r--src/mame/korg/korgtriton.cpp336
-rw-r--r--src/mame/korg/korgws.cpp111
-rw-r--r--src/mame/korg/korgz3.cpp150
-rw-r--r--src/mame/korg/microkorg.cpp88
-rw-r--r--src/mame/korg/poly61.cpp128
-rw-r--r--src/mame/korg/poly800.cpp154
-rw-r--r--src/mame/korg/polysix.cpp991
-rw-r--r--src/mame/kurzweil/krz2000.cpp479
-rw-r--r--src/mame/kyber/kminus.cpp342
-rw-r--r--src/mame/kyocera/kyocera.cpp1629
-rw-r--r--src/mame/kyocera/kyocera.h267
-rw-r--r--src/mame/kyocera/kyocera_v.cpp74
-rw-r--r--src/mame/layout/18w.lay111
-rw-r--r--src/mame/layout/24cdjuke.lay72
-rw-r--r--src/mame/layout/280zzzap.lay143
-rw-r--r--src/mame/layout/30test.lay700
-rw-r--r--src/mame/layout/3bagfull.lay396
-rw-r--r--src/mame/layout/3bagfullnz.lay364
-rw-r--r--src/mame/layout/4004clk.lay50
-rw-r--r--src/mame/layout/4dpi.lay32
-rw-r--r--src/mame/layout/5acespkr.lay175
-rw-r--r--src/mame/layout/7smash.lay83
-rw-r--r--src/mame/layout/README.md6
-rw-r--r--src/mame/layout/abaseb.lay40
-rw-r--r--src/mame/layout/abc1600.lay17
-rw-r--r--src/mame/layout/ac1clbmn.lay4070
-rw-r--r--src/mame/layout/ac1gogld.lay3001
-rw-r--r--src/mame/layout/ac1primt.lay3240
-rw-r--r--src/mame/layout/ac1pster.lay4026
-rw-r--r--src/mame/layout/ac1pstrt.lay3782
-rw-r--r--src/mame/layout/ac1taklv.lay4172
-rw-r--r--src/mame/layout/accomm.lay71
-rw-r--r--src/mame/layout/ace.lay21
-rw-r--r--src/mame/layout/ace_sp_dmd.lay39
-rw-r--r--src/mame/layout/aces1.lay460
-rw-r--r--src/mame/layout/aci_boris.lay178
-rw-r--r--src/mame/layout/aci_borisdpl.lay288
-rw-r--r--src/mame/layout/aci_ggm.lay497
-rw-r--r--src/mame/layout/aci_prodigy.lay627
-rw-r--r--src/mame/layout/acommand.lay45
-rw-r--r--src/mame/layout/acrnsys1.lay49
-rw-r--r--src/mame/layout/acrnsys_kbd.lay89
-rw-r--r--src/mame/layout/addocalc.lay49
-rw-r--r--src/mame/layout/adonisce.lay389
-rw-r--r--src/mame/layout/adonisu.lay680
-rw-r--r--src/mame/layout/adpservice.lay97
-rw-r--r--src/mame/layout/aim65.lay97
-rw-r--r--src/mame/layout/aim65_40.lay51
-rw-r--r--src/mame/layout/akkaarrh.lay100
-rw-r--r--src/mame/layout/alesis_midifex.lay807
-rw-r--r--src/mame/layout/alesis_midiverb.lay802
-rw-r--r--src/mame/layout/alinvade.lay29
-rw-r--r--src/mame/layout/allied.lay101
-rw-r--r--src/mame/layout/alnchase.lay16
-rw-r--r--src/mame/layout/alphie.lay75
-rw-r--r--src/mame/layout/alvg.lay145
-rw-r--r--src/mame/layout/amaztron.lay180
-rw-r--r--src/mame/layout/amerihok.lay53
-rw-r--r--src/mame/layout/amico2k.lay33
-rw-r--r--src/mame/layout/amiga.lay37
-rw-r--r--src/mame/layout/ampoker2.lay211
-rw-r--r--src/mame/layout/amusco.lay127
-rw-r--r--src/mame/layout/animalhs.lay258
-rw-r--r--src/mame/layout/ap10.lay248
-rw-r--r--src/mame/layout/apollo.lay118
-rw-r--r--src/mame/layout/apollo_15i.lay122
-rw-r--r--src/mame/layout/apollo_dsp.lay69
-rw-r--r--src/mame/layout/apricotp.lay35
-rw-r--r--src/mame/layout/aquastge.lay18
-rw-r--r--src/mame/layout/arcmania.lay108
-rw-r--r--src/mame/layout/arcwins.lay376
-rw-r--r--src/mame/layout/arimk4nz.lay416
-rw-r--r--src/mame/layout/aristmk4.lay412
-rw-r--r--src/mame/layout/aristmk5.lay369
-rw-r--r--src/mame/layout/aristmk5_us.lay361
-rw-r--r--src/mame/layout/aristmk5_us_200.lay361
-rw-r--r--src/mame/layout/armora.lay238
-rw-r--r--src/mame/layout/arrball.lay201
-rw-r--r--src/mame/layout/astdelux.lay21
-rw-r--r--src/mame/layout/astoneag.lay151
-rw-r--r--src/mame/layout/astro.lay71
-rw-r--r--src/mame/layout/atari_s1.lay135
-rw-r--r--src/mame/layout/atari_s2.lay135
-rw-r--r--src/mame/layout/atarifb.lay40
-rw-r--r--src/mame/layout/atarifb4.lay48
-rw-r--r--src/mame/layout/atm18mcc.lay70
-rw-r--r--src/mame/layout/attackfc.lay21
-rw-r--r--src/mame/layout/autorace.lay84
-rw-r--r--src/mame/layout/avalnche.lay13
-rw-r--r--src/mame/layout/ave_arb.lay500
-rw-r--r--src/mame/layout/avigo.lay64
-rw-r--r--src/mame/layout/avrmax.lay70
-rw-r--r--src/mame/layout/awpdmd.lay1201
-rw-r--r--src/mame/layout/awpvid14.lay1298
-rw-r--r--src/mame/layout/awpvid16.lay1298
-rw-r--r--src/mame/layout/babbage.lay71
-rw-r--r--src/mame/layout/babydad.lay361
-rw-r--r--src/mame/layout/babyfrts.lay411
-rw-r--r--src/mame/layout/babypkr.lay384
-rw-r--r--src/mame/layout/babysuprem.lay449
-rw-r--r--src/mame/layout/baddog.lay639
-rw-r--r--src/mame/layout/ballch.lay180
-rw-r--r--src/mame/layout/bambball.lay92
-rw-r--r--src/mame/layout/bankshot.lay257
-rw-r--r--src/mame/layout/barata.lay74
-rw-r--r--src/mame/layout/barni.lay94
-rw-r--r--src/mame/layout/barricad.lay35
-rw-r--r--src/mame/layout/barrier.lay21
-rw-r--r--src/mame/layout/bb_21up.lay168
-rw-r--r--src/mame/layout/bb_bellt.lay174
-rw-r--r--src/mame/layout/bb_cjack.lay162
-rw-r--r--src/mame/layout/bb_dblit.lay145
-rw-r--r--src/mame/layout/bb_fiest.lay162
-rw-r--r--src/mame/layout/bb_firec.lay162
-rw-r--r--src/mame/layout/bb_gspin.lay199
-rw-r--r--src/mame/layout/bb_nudcl.lay161
-rw-r--r--src/mame/layout/bb_nudgm.lay173
-rw-r--r--src/mame/layout/bb_oal.lay162
-rw-r--r--src/mame/layout/bb_spinu.lay145
-rw-r--r--src/mame/layout/bb_upndn.lay180
-rw-r--r--src/mame/layout/bbc.lay92
-rw-r--r--src/mame/layout/bbcm.lay143
-rw-r--r--src/mame/layout/bbombo.lay1091
-rw-r--r--src/mame/layout/bcheetah.lay113
-rw-r--r--src/mame/layout/beaminv.lay30
-rw-r--r--src/mame/layout/beena.lay192
-rw-r--r--src/mame/layout/bejpoker.lay271
-rw-r--r--src/mame/layout/beta.lay52
-rw-r--r--src/mame/layout/bfm_blackbox.lay113
-rw-r--r--src/mame/layout/bfm_sc1.lay4184
-rw-r--r--src/mame/layout/bfm_sc2.lay911
-rw-r--r--src/mame/layout/bfm_sc4.lay1940
-rw-r--r--src/mame/layout/bfm_sc5.lay1940
-rw-r--r--src/mame/layout/bfm_sc5_gu96x8.lay306
-rw-r--r--src/mame/layout/bfmsys85.lay533
-rw-r--r--src/mame/layout/bigtrak.lay80
-rw-r--r--src/mame/layout/bingo.lay88
-rw-r--r--src/mame/layout/bingowng.lay283
-rw-r--r--src/mame/layout/blackpntu.lay271
-rw-r--r--src/mame/layout/blastit.lay66
-rw-r--r--src/mame/layout/blckjack.lay218
-rw-r--r--src/mame/layout/blockade.lay35
-rw-r--r--src/mame/layout/blockch.lay19
-rw-r--r--src/mame/layout/blockfvr.lay78
-rw-r--r--src/mame/layout/bmboxing.lay17
-rw-r--r--src/mame/layout/bmiidx.lay154
-rw-r--r--src/mame/layout/bmsafari.lay17
-rw-r--r--src/mame/layout/bob85.lay42
-rw-r--r--src/mame/layout/bonusch.lay349
-rw-r--r--src/mame/layout/bonuscrd.lay143
-rw-r--r--src/mame/layout/bparty.lay870
-rw-r--r--src/mame/layout/bpartyb.lay876
-rw-r--r--src/mame/layout/bpoker.lay250
-rw-r--r--src/mame/layout/brainbaf.lay21
-rw-r--r--src/mame/layout/breakout.lay138
-rw-r--r--src/mame/layout/brkball.lay46
-rw-r--r--src/mame/layout/bship.lay224
-rw-r--r--src/mame/layout/bshipg.lay222
-rw-r--r--src/mame/layout/buckrog.lay253
-rw-r--r--src/mame/layout/buggybjr.lay98
-rw-r--r--src/mame/layout/buggyboy.lay193
-rw-r--r--src/mame/layout/buggychl.lay95
-rw-r--r--src/mame/layout/bumblbug.lay262
-rw-r--r--src/mame/layout/by17.lay1259
-rw-r--r--src/mame/layout/by17_matahari.lay1014
-rw-r--r--src/mame/layout/by17_pwerplay.lay873
-rw-r--r--src/mame/layout/by35.lay1269
-rw-r--r--src/mame/layout/by35_playboy.lay942
-rw-r--r--src/mame/layout/by6803.lay52
-rw-r--r--src/mame/layout/by6803a.lay144
-rw-r--r--src/mame/layout/bzone.lay7
-rw-r--r--src/mame/layout/c80.lay41
-rw-r--r--src/mame/layout/calspeed.lay110
-rw-r--r--src/mame/layout/cambrp.lay23
-rw-r--r--src/mame/layout/captflag.lay110
-rw-r--r--src/mame/layout/cardline.lay35
-rw-r--r--src/mame/layout/cashcatnz.lay447
-rw-r--r--src/mame/layout/cashcham.lay365
-rw-r--r--src/mame/layout/cashchama.lay365
-rw-r--r--src/mame/layout/cashchamnz.lay443
-rw-r--r--src/mame/layout/cashchamu.lay838
-rw-r--r--src/mame/layout/cbombers.lay95
-rw-r--r--src/mame/layout/cbrava_77.lay733
-rw-r--r--src/mame/layout/cbrava_81.lay733
-rw-r--r--src/mame/layout/cc40.lay217
-rw-r--r--src/mame/layout/ccly.lay415
-rw-r--r--src/mame/layout/cd3000i.lay881
-rw-r--r--src/mame/layout/cd3000xl.lay865
-rw-r--r--src/mame/layout/cdi.lay39
-rw-r--r--src/mame/layout/cdtv.lay259
-rw-r--r--src/mame/layout/ces_ccclass.lay156
-rw-r--r--src/mame/layout/ces_hrclass.lay81
-rw-r--r--src/mame/layout/ces_tsclass.lay114
-rw-r--r--src/mame/layout/cgang.lay434
-rw-r--r--src/mame/layout/cgold2.lay344
-rw-r--r--src/mame/layout/chance32.lay231
-rw-r--r--src/mame/layout/changela.lay95
-rw-r--r--src/mame/layout/chasehq.lay125
-rw-r--r--src/mame/layout/checkma5.lay622
-rw-r--r--src/mame/layout/cherryb3.lay404
-rw-r--r--src/mame/layout/chessmate.lay227
-rw-r--r--src/mame/layout/chessmst.lay469
-rw-r--r--src/mame/layout/chessmstdm.lay433
-rw-r--r--src/mame/layout/chexx.lay78
-rw-r--r--src/mame/layout/chickna5v.lay365
-rw-r--r--src/mame/layout/chqflag.lay95
-rw-r--r--src/mame/layout/chrygld.lay267
-rw-r--r--src/mame/layout/chsuper.lay262
-rw-r--r--src/mame/layout/circus.lay19
-rw-r--r--src/mame/layout/cischeat.lay125
-rw-r--r--src/mame/layout/cking_master.lay403
-rw-r--r--src/mame/layout/cking_pmicrodx.lay82
-rw-r--r--src/mame/layout/cking_triomphe.lay391
-rw-r--r--src/mame/layout/clowns.lay10
-rw-r--r--src/mame/layout/cluedo.lay1248
-rw-r--r--src/mame/layout/cmast97.lay262
-rw-r--r--src/mame/layout/cmaster.lay258
-rw-r--r--src/mame/layout/cmasterb.lay250
-rw-r--r--src/mame/layout/cmasterc.lay254
-rw-r--r--src/mame/layout/cmezspin.lay258
-rw-r--r--src/mame/layout/cmpacman.lay267
-rw-r--r--src/mame/layout/cmpchess.lay168
-rw-r--r--src/mame/layout/cmsport.lay70
-rw-r--r--src/mame/layout/cmv4.lay258
-rw-r--r--src/mame/layout/cnbaskb.lay97
-rw-r--r--src/mame/layout/cnfball.lay143
-rw-r--r--src/mame/layout/cnfball2.lay185
-rw-r--r--src/mame/layout/cnsector.lay207
-rw-r--r--src/mame/layout/codemagik.lay153
-rw-r--r--src/mame/layout/comp4.lay160
-rw-r--r--src/mame/layout/comparc.lay405
-rw-r--r--src/mame/layout/comparca.lay405
-rw-r--r--src/mame/layout/compperf.lay210
-rw-r--r--src/mame/layout/conchess.lay484
-rw-r--r--src/mame/layout/conic_cchess.lay198
-rw-r--r--src/mame/layout/conic_cchess2.lay463
-rw-r--r--src/mame/layout/connect4.lay964
-rw-r--r--src/mame/layout/contcirc.lay148
-rw-r--r--src/mame/layout/cops.lay25
-rw-r--r--src/mame/layout/copsnrob.lay7
-rw-r--r--src/mame/layout/copycat.lay164
-rw-r--r--src/mame/layout/copycata.lay111
-rw-r--r--src/mame/layout/coralrc2.lay365
-rw-r--r--src/mame/layout/cosmicm.lay29
-rw-r--r--src/mame/layout/cosmicos.lay142
-rw-r--r--src/mame/layout/cothello.lay34
-rw-r--r--src/mame/layout/cots.lay212
-rw-r--r--src/mame/layout/cp1.lay35
-rw-r--r--src/mame/layout/cqback.lay136
-rw-r--r--src/mame/layout/crash.lay27
-rw-r--r--src/mame/layout/crasha.lay25
-rw-r--r--src/mame/layout/crazybon.lay338
-rw-r--r--src/mame/layout/crei680.lay47
-rw-r--r--src/mame/layout/critcrsh.lay30
-rw-r--r--src/mame/layout/crmaze2p.lay74
-rw-r--r--src/mame/layout/crmaze4p.lay105
-rw-r--r--src/mame/layout/crsbingo.lay159
-rw-r--r--src/mame/layout/crusnexo.lay115
-rw-r--r--src/mame/layout/crusnusa.lay129
-rw-r--r--src/mame/layout/crzybugs.lay208
-rw-r--r--src/mame/layout/ct8000.lay393
-rw-r--r--src/mame/layout/ctainv.lay19
-rw-r--r--src/mame/layout/ctfk1.lay241
-rw-r--r--src/mame/layout/ctk530.lay356
-rw-r--r--src/mame/layout/ctntune.lay132
-rw-r--r--src/mame/layout/ctstein.lay125
-rw-r--r--src/mame/layout/cuckoou.lay874
-rw-r--r--src/mame/layout/cvicny.lay45
-rw-r--r--src/mame/layout/cxg_chess2001.lay456
-rw-r--r--src/mame/layout/cxg_chess3008.lay480
-rw-r--r--src/mame/layout/cxg_commander.lay480
-rw-r--r--src/mame/layout/cxg_cpchess2.lay498
-rw-r--r--src/mame/layout/cxg_dominator.lay553
-rw-r--r--src/mame/layout/cxg_enterprise.lay453
-rw-r--r--src/mame/layout/cxg_galaxy.lay517
-rw-r--r--src/mame/layout/cxg_granada.lay458
-rw-r--r--src/mame/layout/cxg_junior.lay480
-rw-r--r--src/mame/layout/cxg_legend.lay500
-rw-r--r--src/mame/layout/cxg_pchess.lay73
-rw-r--r--src/mame/layout/cxg_professor.lay481
-rw-r--r--src/mame/layout/cxg_royal.lay510
-rw-r--r--src/mame/layout/cxg_scpchess.lay375
-rw-r--r--src/mame/layout/cxg_scpchessa.lay375
-rw-r--r--src/mame/layout/cxg_senterprise.lay477
-rw-r--r--src/mame/layout/cxg_senterprisec.lay523
-rw-r--r--src/mame/layout/cxg_sphinx40.lay478
-rw-r--r--src/mame/layout/cxg_supra.lay521
-rw-r--r--src/mame/layout/cz1.lay749
-rw-r--r--src/mame/layout/cz101.lay709
-rw-r--r--src/mame/layout/cz230s.lay571
-rw-r--r--src/mame/layout/dallaspk.lay206
-rw-r--r--src/mame/layout/darius.lay39
-rw-r--r--src/mame/layout/dataman.lay150
-rw-r--r--src/mame/layout/datum.lay42
-rw-r--r--src/mame/layout/db32016.lay37
-rw-r--r--src/mame/layout/dblaxle.lay95
-rw-r--r--src/mame/layout/dblcrown.lay249
-rw-r--r--src/mame/layout/dbridgec.lay178
-rw-r--r--src/mame/layout/dcebridge.lay87
-rw-r--r--src/mame/layout/dct11em.lay44
-rw-r--r--src/mame/layout/dd9.lay161
-rw-r--r--src/mame/layout/de1.lay87
-rw-r--r--src/mame/layout/de2.lay65
-rw-r--r--src/mame/layout/de2a3.lay65
-rw-r--r--src/mame/layout/deadeye.lay19
-rw-r--r--src/mame/layout/debutm.lay461
-rw-r--r--src/mame/layout/demon.lay33
-rw-r--r--src/mame/layout/dendego.lay348
-rw-r--r--src/mame/layout/depthch.lay23
-rw-r--r--src/mame/layout/design6.lay121
-rw-r--r--src/mame/layout/destroyr.lay125
-rw-r--r--src/mame/layout/dfs500.lay507
-rw-r--r--src/mame/layout/digel804.lay172
-rw-r--r--src/mame/layout/dimtouch.lay399
-rw-r--r--src/mame/layout/dinodino.lay143
-rw-r--r--src/mame/layout/disc2000.lay353
-rw-r--r--src/mame/layout/ditto.lay65
-rw-r--r--src/mame/layout/dlair.lay117
-rw-r--r--src/mame/layout/dmv.lay180
-rw-r--r--src/mame/layout/dnbanban.lay674
-rw-r--r--src/mame/layout/dodgem.lay19
-rw-r--r--src/mame/layout/dolphntr.lay262
-rw-r--r--src/mame/layout/dolphntrb.lay369
-rw-r--r--src/mame/layout/dolphntrceb.lay842
-rw-r--r--src/mame/layout/dolphntru.lay365
-rw-r--r--src/mame/layout/dolphntrua.lay365
-rw-r--r--src/mame/layout/dolphunk.lay45
-rw-r--r--src/mame/layout/dpoker.lay162
-rw-r--r--src/mame/layout/dragrace.lay90
-rw-r--r--src/mame/layout/drdunk.lay110
-rw-r--r--src/mame/layout/dreamwv.lay399
-rw-r--r--src/mame/layout/drw80pkr.lay182
-rw-r--r--src/mame/layout/drwho.lay2710
-rw-r--r--src/mame/layout/dunksunk.lay127
-rw-r--r--src/mame/layout/dx100.lay969
-rw-r--r--src/mame/layout/dx9.lay590
-rw-r--r--src/mame/layout/dxfootb.lay82
-rw-r--r--src/mame/layout/dynajack.lay1051
-rw-r--r--src/mame/layout/eacc.lay139
-rw-r--r--src/mame/layout/ebaskb2.lay149
-rw-r--r--src/mame/layout/ebball.lay181
-rw-r--r--src/mame/layout/ebball2.lay194
-rw-r--r--src/mame/layout/ebball3.lay258
-rw-r--r--src/mame/layout/ebknight.lay74
-rw-r--r--src/mame/layout/ecoinf2.lay875
-rw-r--r--src/mame/layout/ecoinf3.lay875
-rw-r--r--src/mame/layout/ecoinfr.lay122
-rw-r--r--src/mame/layout/efball.lay260
-rw-r--r--src/mame/layout/efootb4.lay202
-rw-r--r--src/mame/layout/eforest.lay333
-rw-r--r--src/mame/layout/eforestu.lay376
-rw-r--r--src/mame/layout/eibise.lay222
-rw-r--r--src/mame/layout/einvader.lay93
-rw-r--r--src/mame/layout/einvaderc.lay92
-rw-r--r--src/mame/layout/elbaskb.lay138
-rw-r--r--src/mame/layout/elcirculo.lay53
-rw-r--r--src/mame/layout/elecbowl.lay61
-rw-r--r--src/mame/layout/elecdet.lay273
-rw-r--r--src/mame/layout/eleciq.lay160
-rw-r--r--src/mame/layout/elecyoyo.lay26
-rw-r--r--src/mame/layout/elekscmp.lay48
-rw-r--r--src/mame/layout/elf2.lay172
-rw-r--r--src/mame/layout/emma2.lay37
-rw-r--r--src/mame/layout/enforceja.lay166
-rw-r--r--src/mame/layout/enmirage.lay210
-rw-r--r--src/mame/layout/epc.lay35
-rw-r--r--src/mame/layout/esbattle.lay87
-rw-r--r--src/mame/layout/escmars.lay33
-rw-r--r--src/mame/layout/esoccer.lay138
-rw-r--r--src/mame/layout/esq1.lay822
-rw-r--r--src/mame/layout/esq1by22.lay36
-rw-r--r--src/mame/layout/esq2by16.lay143
-rw-r--r--src/mame/layout/esq2by40.lay43
-rw-r--r--src/mame/layout/esq2by40_vfx.lay64
-rw-r--r--src/mame/layout/et3400.lay226
-rw-r--r--src/mame/layout/excal_igor.lay450
-rw-r--r--src/mame/layout/excal_ivant.lay476
-rw-r--r--src/mame/layout/excal_ivanto.lay472
-rw-r--r--src/mame/layout/excal_mirage.lay518
-rw-r--r--src/mame/layout/f1gpstar.lay125
-rw-r--r--src/mame/layout/f1superb.lay125
-rw-r--r--src/mame/layout/f2pbball.lay221
-rw-r--r--src/mame/layout/f3in1.lay77
-rw-r--r--src/mame/layout/f4431.lay85
-rw-r--r--src/mame/layout/fashion.lay27
-rw-r--r--src/mame/layout/fb01.lay184
-rw-r--r--src/mame/layout/fccpu1.lay18
-rw-r--r--src/mame/layout/ferie.lay108
-rw-r--r--src/mame/layout/fhunter.lay344
-rw-r--r--src/mame/layout/fidel_acr.lay129
-rw-r--r--src/mame/layout/fidel_bkc.lay134
-rw-r--r--src/mame/layout/fidel_brc.lay408
-rw-r--r--src/mame/layout/fidel_bridgeb.lay198
-rw-r--r--src/mame/layout/fidel_bv3.lay375
-rw-r--r--src/mame/layout/fidel_cc1.lay113
-rw-r--r--src/mame/layout/fidel_cc10.lay129
-rw-r--r--src/mame/layout/fidel_cc10c.lay116
-rw-r--r--src/mame/layout/fidel_cc3.lay113
-rw-r--r--src/mame/layout/fidel_cc7.lay129
-rw-r--r--src/mame/layout/fidel_chesster.lay452
-rw-r--r--src/mame/layout/fidel_classic.lay449
-rw-r--r--src/mame/layout/fidel_cphantom.lay626
-rw-r--r--src/mame/layout/fidel_cr.lay129
-rw-r--r--src/mame/layout/fidel_csc.lay478
-rw-r--r--src/mame/layout/fidel_desdis.lay478
-rw-r--r--src/mame/layout/fidel_desdis_68kg.lay481
-rw-r--r--src/mame/layout/fidel_desdis_68kr.lay476
-rw-r--r--src/mame/layout/fidel_dsc.lay541
-rw-r--r--src/mame/layout/fidel_eag.lay485
-rw-r--r--src/mame/layout/fidel_eag_68k.lay485
-rw-r--r--src/mame/layout/fidel_eag_priv.lay526
-rw-r--r--src/mame/layout/fidel_eas.lay641
-rw-r--r--src/mame/layout/fidel_eldorado.lay457
-rw-r--r--src/mame/layout/fidel_elegance.lay404
-rw-r--r--src/mame/layout/fidel_ex.lay445
-rw-r--r--src/mame/layout/fidel_ex_68k.lay464
-rw-r--r--src/mame/layout/fidel_exb.lay441
-rw-r--r--src/mame/layout/fidel_exd.lay477
-rw-r--r--src/mame/layout/fidel_exv.lay450
-rw-r--r--src/mame/layout/fidel_gambitv.lay435
-rw-r--r--src/mame/layout/fidel_gin.lay379
-rw-r--r--src/mame/layout/fidel_msc_v1.lay437
-rw-r--r--src/mame/layout/fidel_msc_v2.lay416
-rw-r--r--src/mame/layout/fidel_pc.lay460
-rw-r--r--src/mame/layout/fidel_phantom.lay623
-rw-r--r--src/mame/layout/fidel_playmatic.lay389
-rw-r--r--src/mame/layout/fidel_rsc.lay334
-rw-r--r--src/mame/layout/fidel_sc12.lay500
-rw-r--r--src/mame/layout/fidel_sc6.lay406
-rw-r--r--src/mame/layout/fidel_sc8.lay399
-rw-r--r--src/mame/layout/fidel_sc9.lay413
-rw-r--r--src/mame/layout/fidel_su9.lay491
-rw-r--r--src/mame/layout/fidel_vcc.lay134
-rw-r--r--src/mame/layout/fidel_vsc.lay476
-rw-r--r--src/mame/layout/finalapr.lay125
-rw-r--r--src/mame/layout/finallap.lay95
-rw-r--r--src/mame/layout/fingbowl.lay533
-rw-r--r--src/mame/layout/fireball.lay137
-rw-r--r--src/mame/layout/firebeat.lay3
-rw-r--r--src/mame/layout/flash.lay93
-rw-r--r--src/mame/layout/flicker.lay78
-rw-r--r--src/mame/layout/fortecrd.lay153
-rw-r--r--src/mame/layout/fortellr.lay1055
-rw-r--r--src/mame/layout/fruitstb.lay262
-rw-r--r--src/mame/layout/ftri1.lay214
-rw-r--r--src/mame/layout/fts2in1.lay261
-rw-r--r--src/mame/layout/funjacks.lay57
-rw-r--r--src/mame/layout/funrlgl.lay62
-rw-r--r--src/mame/layout/funtag.lay61
-rw-r--r--src/mame/layout/funworld.lay120
-rw-r--r--src/mame/layout/fvrpitch.lay364
-rw-r--r--src/mame/layout/fxmcr165.lay146
-rw-r--r--src/mame/layout/g627.lay133
-rw-r--r--src/mame/layout/galactic.lay33
-rw-r--r--src/mame/layout/galaxi.lay27
-rw-r--r--src/mame/layout/gamball.lay4356
-rw-r--r--src/mame/layout/gamecom.lay32
-rw-r--r--src/mame/layout/gamemach.lay24
-rw-r--r--src/mame/layout/gamepock.lay22
-rw-r--r--src/mame/layout/gammonm2.lay197
-rw-r--r--src/mame/layout/gckong.lay45
-rw-r--r--src/mame/layout/geebee.lay91
-rw-r--r--src/mame/layout/geishanz.lay447
-rw-r--r--src/mame/layout/genmagi.lay325
-rw-r--r--src/mame/layout/gigatron.lay32
-rw-r--r--src/mame/layout/gjackpot.lay162
-rw-r--r--src/mame/layout/gl3000s.lay147
-rw-r--r--src/mame/layout/gldarrow.lay96
-rw-r--r--src/mame/layout/gldncrwn.lay157
-rw-r--r--src/mame/layout/gldnpkr.lay312
-rw-r--r--src/mame/layout/globalfr.lay22
-rw-r--r--src/mame/layout/gmaster.lay22
-rw-r--r--src/mame/layout/goldenc.lay416
-rw-r--r--src/mame/layout/goldenra.lay369
-rw-r--r--src/mame/layout/goldnjkr.lay277
-rw-r--r--src/mame/layout/goldnpkr.lay222
-rw-r--r--src/mame/layout/goldnswp.lay170
-rw-r--r--src/mame/layout/goldpyr.lay369
-rw-r--r--src/mame/layout/goldstar.lay295
-rw-r--r--src/mame/layout/gorf.lay281
-rw-r--r--src/mame/layout/gotcha.lay90
-rw-r--r--src/mame/layout/gp_1.lay89
-rw-r--r--src/mame/layout/gp_2.lay89
-rw-r--r--src/mame/layout/gpoker.lay143
-rw-r--r--src/mame/layout/grandmaster.lay730
-rw-r--r--src/mame/layout/granits.lay481
-rw-r--r--src/mame/layout/gravity.lay68
-rw-r--r--src/mame/layout/grchamp.lay95
-rw-r--r--src/mame/layout/gridiron.lay79
-rw-r--r--src/mame/layout/grnlizrd.lay412
-rw-r--r--src/mame/layout/grobot9.lay309
-rw-r--r--src/mame/layout/gts1.lay114
-rw-r--r--src/mame/layout/gts3.lay145
-rw-r--r--src/mame/layout/gts80.lay155
-rw-r--r--src/mame/layout/gts80a.lay173
-rw-r--r--src/mame/layout/gts80a_caveman.lay162
-rw-r--r--src/mame/layout/gts80b.lay145
-rw-r--r--src/mame/layout/guab.lay166
-rw-r--r--src/mame/layout/gunchamp.lay75
-rw-r--r--src/mame/layout/gunchamps.lay75
-rw-r--r--src/mame/layout/gunfight.lay21
-rw-r--r--src/mame/layout/gunnrose.lay360
-rw-r--r--src/mame/layout/gypsyjug.lay21
-rw-r--r--src/mame/layout/h19.lay46
-rw-r--r--src/mame/layout/h2hbaseb.lay162
-rw-r--r--src/mame/layout/h2hbaskb.lay163
-rw-r--r--src/mame/layout/h2hbaskbc.lay163
-rw-r--r--src/mame/layout/h2hboxing.lay120
-rw-r--r--src/mame/layout/h2hfootb.lay215
-rw-r--r--src/mame/layout/h2hhockey.lay157
-rw-r--r--src/mame/layout/h2hhockeyc.lay157
-rw-r--r--src/mame/layout/h2hsoccerc.lay161
-rw-r--r--src/mame/layout/h89.lay46
-rw-r--r--src/mame/layout/hankin.lay86
-rw-r--r--src/mame/layout/hc110.lay772
-rw-r--r--src/mame/layout/hccbaskb.lay118
-rw-r--r--src/mame/layout/hh_cop400_test.lay37
-rw-r--r--src/mame/layout/hh_cops1_test.lay37
-rw-r--r--src/mame/layout/hh_e0c6200_lcd.lay15
-rw-r--r--src/mame/layout/hh_hmcs40_test.lay37
-rw-r--r--src/mame/layout/hh_ht11xx_lcd.lay15
-rw-r--r--src/mame/layout/hh_melps4_test.lay37
-rw-r--r--src/mame/layout/hh_mn1400_test.lay37
-rw-r--r--src/mame/layout/hh_pic16_test.lay37
-rw-r--r--src/mame/layout/hh_pps41_test.lay37
-rw-r--r--src/mame/layout/hh_rw5000_test.lay37
-rw-r--r--src/mame/layout/hh_sm500_test.lay47
-rw-r--r--src/mame/layout/hh_sm510_dualh.lay34
-rw-r--r--src/mame/layout/hh_sm510_dualv.lay34
-rw-r--r--src/mame/layout/hh_sm510_single.lay15
-rw-r--r--src/mame/layout/hh_sm510_test.lay61
-rw-r--r--src/mame/layout/hh_sm510_tripleh.lay35
-rw-r--r--src/mame/layout/hh_smc1k_test.lay37
-rw-r--r--src/mame/layout/hh_tms1k_test.lay37
-rw-r--r--src/mame/layout/hh_ucom4_test.lay37
-rw-r--r--src/mame/layout/hitparade.lay40
-rw-r--r--src/mame/layout/horocomp.lay22
-rw-r--r--src/mame/layout/hotchili.lay223
-rw-r--r--src/mame/layout/hp2640.lay12
-rw-r--r--src/mame/layout/hp3478a.lay202
-rw-r--r--src/mame/layout/hp86b.lay31
-rw-r--r--src/mame/layout/hp9825.lay77
-rw-r--r--src/mame/layout/hp9845b.lay19
-rw-r--r--src/mame/layout/hp9k_3xx.lay41
-rw-r--r--src/mame/layout/hyprdriv.lay187
-rw-r--r--src/mame/layout/ibm6580.lay111
-rw-r--r--src/mame/layout/icecold.lay134
-rw-r--r--src/mame/layout/ifslots.lay641
-rw-r--r--src/mame/layout/igspoker.lay27
-rw-r--r--src/mame/layout/im01.lay199
-rw-r--r--src/mame/layout/im05.lay212
-rw-r--r--src/mame/layout/imolagp.lay507
-rw-r--r--src/mame/layout/incasun.lay369
-rw-r--r--src/mame/layout/incasunnz.lay447
-rw-r--r--src/mame/layout/inder.lay142
-rw-r--r--src/mame/layout/inderp.lay112
-rw-r--r--src/mame/layout/indrema5.lay369
-rw-r--r--src/mame/layout/instruct.lay37
-rw-r--r--src/mame/layout/intchess.lay243
-rw-r--r--src/mame/layout/intellect02.lay145
-rw-r--r--src/mame/layout/interpro.lay40
-rw-r--r--src/mame/layout/intlc44.lay416
-rw-r--r--src/mame/layout/intlc440.lay411
-rw-r--r--src/mame/layout/inttoote.lay414
-rw-r--r--src/mame/layout/invad2ct.lay11
-rw-r--r--src/mame/layout/invaders.lay7
-rw-r--r--src/mame/layout/invrvnge.lay26
-rw-r--r--src/mame/layout/iris1400.lay54
-rw-r--r--src/mame/layout/irrmaze.lay122
-rw-r--r--src/mame/layout/j2adnote.lay4878
-rw-r--r--src/mame/layout/j2always.lay2426
-rw-r--r--src/mame/layout/j2bankch.lay4022
-rw-r--r--src/mame/layout/j2bigbnk.lay4358
-rw-r--r--src/mame/layout/j2bigbox.lay4174
-rw-r--r--src/mame/layout/j2blustr.lay3664
-rw-r--r--src/mame/layout/j2cashbn.lay4562
-rw-r--r--src/mame/layout/j2cashrl.lay3975
-rw-r--r--src/mame/layout/j2cashro.lay4324
-rw-r--r--src/mame/layout/j2cashrv.lay3433
-rw-r--r--src/mame/layout/j2cashtk.lay3865
-rw-r--r--src/mame/layout/j2coinsh.lay3484
-rw-r--r--src/mame/layout/j2coppot.lay3989
-rw-r--r--src/mame/layout/j2cprndx.lay2641
-rw-r--r--src/mame/layout/j2criscr.lay2765
-rw-r--r--src/mame/layout/j2crown.lay2364
-rw-r--r--src/mame/layout/j2cshalm.lay3727
-rw-r--r--src/mame/layout/j2cshcrd.lay3905
-rw-r--r--src/mame/layout/j2cshfil.lay3944
-rw-r--r--src/mame/layout/j2cshnud.lay2391
-rw-r--r--src/mame/layout/j2cshsmh.lay4119
-rw-r--r--src/mame/layout/j2cvault.lay4127
-rw-r--r--src/mame/layout/j2droplt.lay3069
-rw-r--r--src/mame/layout/j2ewn.lay2297
-rw-r--r--src/mame/layout/j2ews.lay2275
-rw-r--r--src/mame/layout/j2exec.lay3658
-rw-r--r--src/mame/layout/j2fasttk.lay4918
-rw-r--r--src/mame/layout/j2fiveal.lay4357
-rw-r--r--src/mame/layout/j2fiveln.lay2852
-rw-r--r--src/mame/layout/j2fqueen.lay3588
-rw-r--r--src/mame/layout/j2frucnx.lay3552
-rw-r--r--src/mame/layout/j2fullhs.lay3925
-rw-r--r--src/mame/layout/j2fws.lay3346
-rw-r--r--src/mame/layout/j2ghostb.lay2016
-rw-r--r--src/mame/layout/j2gldchy.lay2259
-rw-r--r--src/mame/layout/j2goldbr.lay2408
-rw-r--r--src/mame/layout/j2hilocl.lay3977
-rw-r--r--src/mame/layout/j2hinote.lay4407
-rw-r--r--src/mame/layout/j2hiroll.lay4333
-rw-r--r--src/mame/layout/j2hitmon.lay3864
-rw-r--r--src/mame/layout/j2hotpot.lay3057
-rw-r--r--src/mame/layout/j2hotsht.lay3935
-rw-r--r--src/mame/layout/j2hypnot.lay5028
-rw-r--r--src/mame/layout/j2jackbr.lay2074
-rw-r--r--src/mame/layout/j2kingcl.lay3106
-rw-r--r--src/mame/layout/j2litean.lay2645
-rw-r--r--src/mame/layout/j2litnot.lay3607
-rw-r--r--src/mame/layout/j2lovshd.lay3378
-rw-r--r--src/mame/layout/j2lovsht.lay3456
-rw-r--r--src/mame/layout/j2luckar.lay2394
-rw-r--r--src/mame/layout/j2lucky2.lay3135
-rw-r--r--src/mame/layout/j2maxima.lay2052
-rw-r--r--src/mame/layout/j2missis.lay3693
-rw-r--r--src/mame/layout/j2monblt.lay3719
-rw-r--r--src/mame/layout/j2mongam.lay4038
-rw-r--r--src/mame/layout/j2montrp.lay3078
-rw-r--r--src/mame/layout/j2nolimt.lay2797
-rw-r--r--src/mame/layout/j2notesh.lay4776
-rw-r--r--src/mame/layout/j2nudbnz.lay3388
-rw-r--r--src/mame/layout/j2nudfev.lay3596
-rw-r--r--src/mame/layout/j2nudmon.lay5236
-rw-r--r--src/mame/layout/j2nudshf.lay3560
-rw-r--r--src/mame/layout/j2paypkt.lay3731
-rw-r--r--src/mame/layout/j2penny.lay3210
-rw-r--r--src/mame/layout/j2plsmnd.lay3941
-rw-r--r--src/mame/layout/j2plsnud.lay3225
-rw-r--r--src/mame/layout/j2pndrsh.lay4549
-rw-r--r--src/mame/layout/j2rdclb.lay3460
-rw-r--r--src/mame/layout/j2reelbn.lay3508
-rw-r--r--src/mame/layout/j2reelbo.lay3906
-rw-r--r--src/mame/layout/j2reelcz.lay3334
-rw-r--r--src/mame/layout/j2reelmc.lay4380
-rw-r--r--src/mame/layout/j2reelmo.lay4237
-rw-r--r--src/mame/layout/j2silvcl.lay1979
-rw-r--r--src/mame/layout/j2silvsh.lay1979
-rw-r--r--src/mame/layout/j2sldgld.lay4003
-rw-r--r--src/mame/layout/j2slvrgh.lay2242
-rw-r--r--src/mame/layout/j2spcrsv.lay3472
-rw-r--r--src/mame/layout/j2sstrea.lay3842
-rw-r--r--src/mame/layout/j2stahed.lay2927
-rw-r--r--src/mame/layout/j2supfrc.lay2759
-rw-r--r--src/mame/layout/j2suprsh.lay3286
-rw-r--r--src/mame/layout/j2supsft.lay5579
-rw-r--r--src/mame/layout/j2supstp.lay3048
-rw-r--r--src/mame/layout/j2suptrk.lay3871
-rw-r--r--src/mame/layout/j2swbank.lay4596
-rw-r--r--src/mame/layout/j2take2.lay3043
-rw-r--r--src/mame/layout/j2trail.lay3653
-rw-r--r--src/mame/layout/j2tstplt.lay4692
-rw-r--r--src/mame/layout/j5ar80cla.lay5027
-rw-r--r--src/mame/layout/j5cira.lay4247
-rw-r--r--src/mame/layout/j5fairp.lay5171
-rw-r--r--src/mame/layout/j5firebl.lay2087
-rw-r--r--src/mame/layout/j5hollyc.lay4671
-rw-r--r--src/mame/layout/j5hotdoga.lay5288
-rw-r--r--src/mame/layout/j5indsum.lay2391
-rw-r--r--src/mame/layout/j5intr.lay4358
-rw-r--r--src/mame/layout/j5movie.lay4735
-rw-r--r--src/mame/layout/j5nite.lay4412
-rw-r--r--src/mame/layout/j5palma.lay2454
-rw-r--r--src/mame/layout/j5popeye.lay6036
-rw-r--r--src/mame/layout/j5sizl.lay2231
-rw-r--r--src/mame/layout/j5supbara.lay3164
-rw-r--r--src/mame/layout/j5suphi.lay4605
-rw-r--r--src/mame/layout/j5swop.lay3362
-rw-r--r--src/mame/layout/j5term.lay2947
-rw-r--r--src/mame/layout/j5topshp.lay3731
-rw-r--r--src/mame/layout/j5trail.lay3869
-rw-r--r--src/mame/layout/j5ujb.lay2348
-rw-r--r--src/mame/layout/j5wsc.lay4188
-rw-r--r--src/mame/layout/j6aceclb.lay4357
-rw-r--r--src/mame/layout/j6acehi.lay4084
-rw-r--r--src/mame/layout/j6amdrm.lay5243
-rw-r--r--src/mame/layout/j6arcadee.lay3695
-rw-r--r--src/mame/layout/j6big50.lay3980
-rw-r--r--src/mame/layout/j6bigbukc.lay4389
-rw-r--r--src/mame/layout/j6bigtopa.lay4826
-rw-r--r--src/mame/layout/j6bnkrcl.lay1550
-rw-r--r--src/mame/layout/j6bnza.lay5495
-rw-r--r--src/mame/layout/j6btbwd.lay3428
-rw-r--r--src/mame/layout/j6camelt.lay3822
-rw-r--r--src/mame/layout/j6casclaf.lay5902
-rw-r--r--src/mame/layout/j6cascze.lay4712
-rw-r--r--src/mame/layout/j6colcsh.lay5984
-rw-r--r--src/mame/layout/j6cpal.lay3655
-rw-r--r--src/mame/layout/j6crack.lay5139
-rw-r--r--src/mame/layout/j6drdogh.lay4478
-rw-r--r--src/mame/layout/j6euphor.lay6454
-rw-r--r--src/mame/layout/j6ewn.lay3488
-rw-r--r--src/mame/layout/j6fastfr.lay6632
-rw-r--r--src/mame/layout/j6ffce.lay5301
-rw-r--r--src/mame/layout/j6frtpot.lay5800
-rw-r--r--src/mame/layout/j6gidogh.lay5424
-rw-r--r--src/mame/layout/j6gldclb.lay5997
-rw-r--r--src/mame/layout/j6gogold.lay4556
-rw-r--r--src/mame/layout/j6goldgla.lay7059
-rw-r--r--src/mame/layout/j6guabc.lay4575
-rw-r--r--src/mame/layout/j6guabcl.lay5384
-rw-r--r--src/mame/layout/j6hapyhrb.lay2982
-rw-r--r--src/mame/layout/j6impuls.lay3280
-rw-r--r--src/mame/layout/j6impuls15.lay3297
-rw-r--r--src/mame/layout/j6indy6.lay3802
-rw-r--r--src/mame/layout/j6indy8.lay3802
-rw-r--r--src/mame/layout/j6kfc.lay4424
-rw-r--r--src/mame/layout/j6kungfu.lay2606
-rw-r--r--src/mame/layout/j6megbck.lay6449
-rw-r--r--src/mame/layout/j6mono60.lay4766
-rw-r--r--src/mame/layout/j6mono6010.lay4760
-rw-r--r--src/mame/layout/j6mono608.lay4760
-rw-r--r--src/mame/layout/j6monst.lay4807
-rw-r--r--src/mame/layout/j6montlk.lay4430
-rw-r--r--src/mame/layout/j6montlk6.lay4424
-rw-r--r--src/mame/layout/j6oxobin.lay2076
-rw-r--r--src/mame/layout/j6oxobin10.lay2076
-rw-r--r--src/mame/layout/j6quick.lay4323
-rw-r--r--src/mame/layout/j6ra.lay4633
-rw-r--r--src/mame/layout/j6redarwf.lay5129
-rw-r--r--src/mame/layout/j6reelmn.lay2468
-rw-r--r--src/mame/layout/j6rh6cld.lay3424
-rw-r--r--src/mame/layout/j6rhchil.lay4379
-rw-r--r--src/mame/layout/j6rico10.lay3940
-rw-r--r--src/mame/layout/j6roller10.lay3500
-rw-r--r--src/mame/layout/j6roller15.lay4701
-rw-r--r--src/mame/layout/j6roller8.lay3500
-rw-r--r--src/mame/layout/j6slagng.lay5612
-rw-r--r--src/mame/layout/j6snakes.lay5071
-rw-r--r--src/mame/layout/j6sonic10.lay4027
-rw-r--r--src/mame/layout/j6stards.lay3723
-rw-r--r--src/mame/layout/j6swpdrp.lay4096
-rw-r--r--src/mame/layout/j6tombc.lay4375
-rw-r--r--src/mame/layout/j6topflg.lay7131
-rw-r--r--src/mame/layout/j6twst.lay3717
-rw-r--r--src/mame/layout/j6untch.lay4185
-rw-r--r--src/mame/layout/j6vindal.lay5025
-rw-r--r--src/mame/layout/j6vivark.lay5246
-rw-r--r--src/mame/layout/j6wizardd.lay3156
-rw-r--r--src/mame/layout/j6wldkng.lay2012
-rw-r--r--src/mame/layout/j80bac.lay3008
-rw-r--r--src/mame/layout/j80bounc.lay3014
-rw-r--r--src/mame/layout/j80frogh.lay3220
-rw-r--r--src/mame/layout/j80golds.lay1978
-rw-r--r--src/mame/layout/j80hotln.lay2498
-rw-r--r--src/mame/layout/j80myspn.lay2824
-rw-r--r--src/mame/layout/j80nudg2.lay2732
-rw-r--r--src/mame/layout/j80rr.lay3172
-rw-r--r--src/mame/layout/j80supbk.lay3026
-rw-r--r--src/mame/layout/j80supst.lay3160
-rw-r--r--src/mame/layout/j80topsp.lay3037
-rw-r--r--src/mame/layout/j80wsprt2.lay2917
-rw-r--r--src/mame/layout/j_cnudgr.lay138
-rw-r--r--src/mame/layout/j_dud.lay138
-rw-r--r--src/mame/layout/j_ewn.lay138
-rw-r--r--src/mame/layout/j_ews.lay138
-rw-r--r--src/mame/layout/j_ewsdlx.lay138
-rw-r--r--src/mame/layout/j_la.lay138
-rw-r--r--src/mame/layout/j_lal.lay373
-rw-r--r--src/mame/layout/j_lan.lay138
-rw-r--r--src/mame/layout/j_lc.lay164
-rw-r--r--src/mame/layout/j_lt.lay138
-rw-r--r--src/mame/layout/j_ndu.lay138
-rw-r--r--src/mame/layout/j_plus2.lay138
-rw-r--r--src/mame/layout/j_ssh.lay138
-rw-r--r--src/mame/layout/j_sup2p.lay138
-rw-r--r--src/mame/layout/j_super2.lay138
-rw-r--r--src/mame/layout/j_supsh.lay138
-rw-r--r--src/mame/layout/jackhouse.lay282
-rw-r--r--src/mame/layout/jankenmn.lay672
-rw-r--r--src/mame/layout/jazz.lay26
-rw-r--r--src/mame/layout/jclub2.lay465
-rw-r--r--src/mame/layout/jclub2o.lay444
-rw-r--r--src/mame/layout/jeutel.lay142
-rw-r--r--src/mame/layout/jinpaish.lay291
-rw-r--r--src/mame/layout/jking02.lay332
-rw-r--r--src/mame/layout/jking04.lay204
-rw-r--r--src/mame/layout/jockeyc.lay431
-rw-r--r--src/mame/layout/jollycrd.lay192
-rw-r--r--src/mame/layout/jp.lay144
-rw-r--r--src/mame/layout/jpmimpct.lay89
-rw-r--r--src/mame/layout/jpmmps.lay921
-rw-r--r--src/mame/layout/jpms80.lay921
-rw-r--r--src/mame/layout/jpmsru.lay90
-rw-r--r--src/mame/layout/jpmsys5.lay108
-rw-r--r--src/mame/layout/jungjuic.lay333
-rw-r--r--src/mame/layout/junior.lay37
-rw-r--r--src/mame/layout/k1003.lay75
-rw-r--r--src/mame/layout/k28.lay34
-rw-r--r--src/mame/layout/k28o.lay70
-rw-r--r--src/mame/layout/kas89.lay161
-rw-r--r--src/mame/layout/kchal.lay462
-rw-r--r--src/mame/layout/kdt6.lay44
-rw-r--r--src/mame/layout/kenokb.lay195
-rw-r--r--src/mame/layout/kenseim.lay206
-rw-r--r--src/mame/layout/kgalah.lay365
-rw-r--r--src/mame/layout/kgbirda5.lay333
-rw-r--r--src/mame/layout/kgbirdnz.lay416
-rw-r--r--src/mame/layout/kim1.lay439
-rw-r--r--src/mame/layout/kingdrby.lay149
-rw-r--r--src/mame/layout/kingpin.lay152
-rw-r--r--src/mame/layout/kingsran.lay447
-rw-r--r--src/mame/layout/kn01.lay30
-rw-r--r--src/mame/layout/kn5000.lay1337
-rw-r--r--src/mame/layout/konamigt.lay125
-rw-r--r--src/mame/layout/krzykeno.lay225
-rw-r--r--src/mame/layout/kungfur.lay370
-rw-r--r--src/mame/layout/lafootb.lay105
-rw-r--r--src/mame/layout/lagunar.lay95
-rw-r--r--src/mame/layout/lazercmd.lay19
-rw-r--r--src/mame/layout/lbeach.lay49
-rw-r--r--src/mame/layout/lc80.lay63
-rw-r--r--src/mame/layout/lchicken.lay135
-rw-r--r--src/mame/layout/lckydraw.lay82
-rw-r--r--src/mame/layout/leboom.lay125
-rw-r--r--src/mame/layout/lependu.lay108
-rw-r--r--src/mame/layout/lespendu.lay93
-rw-r--r--src/mame/layout/lightfgt.lay208
-rw-r--r--src/mame/layout/lilcomp.lay46
-rw-r--r--src/mame/layout/lilprof.lay90
-rw-r--r--src/mame/layout/lilprofo.lay88
-rw-r--r--src/mame/layout/linn_linndrum.lay905
-rw-r--r--src/mame/layout/litelrn.lay105
-rw-r--r--src/mame/layout/liveafb.lay63
-rw-r--r--src/mame/layout/lk3000.lay33
-rw-r--r--src/mame/layout/ll3.lay349
-rw-r--r--src/mame/layout/llc1.lay61
-rw-r--r--src/mame/layout/lnux4004.lay79
-rw-r--r--src/mame/layout/locoloota.lay365
-rw-r--r--src/mame/layout/lostreas.lay240
-rw-r--r--src/mame/layout/ltcasinn.lay43
-rw-r--r--src/mame/layout/ltcasino.lay68
-rw-r--r--src/mame/layout/ltd.lay126
-rw-r--r--src/mame/layout/luckgrln.lay215
-rw-r--r--src/mame/layout/lucky74.lay51
-rw-r--r--src/mame/layout/lucky8.lay232
-rw-r--r--src/mame/layout/lucky8p1.lay163
-rw-r--r--src/mame/layout/luckybal.lay259
-rw-r--r--src/mame/layout/luckyrlt.lay144
-rw-r--r--src/mame/layout/lynx.lay23
-rw-r--r--src/mame/layout/m1albsqp.lay4059
-rw-r--r--src/mame/layout/m1apollo2.lay5938
-rw-r--r--src/mame/layout/m1bargnc.lay3754
-rw-r--r--src/mame/layout/m1bghou.lay3863
-rw-r--r--src/mame/layout/m1bigdel.lay4012
-rw-r--r--src/mame/layout/m1calypsa.lay5084
-rw-r--r--src/mame/layout/m1casclb.lay3118
-rw-r--r--src/mame/layout/m1casroy1.lay3523
-rw-r--r--src/mame/layout/m1chain.lay3827
-rw-r--r--src/mame/layout/m1cik51o.lay5072
-rw-r--r--src/mame/layout/m1clbfvr.lay6361
-rw-r--r--src/mame/layout/m1cluecb1.lay5281
-rw-r--r--src/mame/layout/m1cluedo4.lay4845
-rw-r--r--src/mame/layout/m1cluessf.lay7080
-rw-r--r--src/mame/layout/m1coro21n.lay4035
-rw-r--r--src/mame/layout/m1cororrk.lay4444
-rw-r--r--src/mame/layout/m1dkong91n.lay5617
-rw-r--r--src/mame/layout/m1dxmono51o.lay4072
-rw-r--r--src/mame/layout/m1eastndl.lay4844
-rw-r--r--src/mame/layout/m1eastqv3.lay4620
-rw-r--r--src/mame/layout/m1fantfbb.lay5081
-rw-r--r--src/mame/layout/m1fightb.lay4968
-rw-r--r--src/mame/layout/m1frexplc.lay6766
-rw-r--r--src/mame/layout/m1gladg.lay5485
-rw-r--r--src/mame/layout/m1grescb.lay4619
-rw-r--r--src/mame/layout/m1guvnor.lay3214
-rw-r--r--src/mame/layout/m1hotpoth.lay5646
-rw-r--r--src/mame/layout/m1htclb.lay4137
-rw-r--r--src/mame/layout/m1imclb.lay4736
-rw-r--r--src/mame/layout/m1infern.lay5515
-rw-r--r--src/mame/layout/m1inwinc.lay4989
-rw-r--r--src/mame/layout/m1itjobc.lay5027
-rw-r--r--src/mame/layout/m1itskob.lay5351
-rw-r--r--src/mame/layout/m1jpmult.lay2795
-rw-r--r--src/mame/layout/m1lucknon.lay2648
-rw-r--r--src/mame/layout/m1luxorb.lay4998
-rw-r--r--src/mame/layout/m1manhat.lay4646
-rw-r--r--src/mame/layout/m1monclb.lay7016
-rw-r--r--src/mame/layout/m1mongam.lay4813
-rw-r--r--src/mame/layout/m1monmon.lay3418
-rw-r--r--src/mame/layout/m1monou.lay4281
-rw-r--r--src/mame/layout/m1nhp.lay5340
-rw-r--r--src/mame/layout/m1nudbnke.lay5916
-rw-r--r--src/mame/layout/m1omega.lay3839
-rw-r--r--src/mame/layout/m1onbusa.lay4217
-rw-r--r--src/mame/layout/m1pinkpc.lay3633
-rw-r--r--src/mame/layout/m1przeeb.lay4168
-rw-r--r--src/mame/layout/m1retpp.lay4141
-rw-r--r--src/mame/layout/m1search.lay2832
-rw-r--r--src/mame/layout/m1sptlgtc.lay3102
-rw-r--r--src/mame/layout/m1startr.lay4796
-rw-r--r--src/mame/layout/m1sudnima.lay2955
-rw-r--r--src/mame/layout/m1taknot.lay4035
-rw-r--r--src/mame/layout/m1thatlfc.lay3706
-rw-r--r--src/mame/layout/m1topstr.lay3782
-rw-r--r--src/mame/layout/m1triviax.lay6529
-rw-r--r--src/mame/layout/m1trtr.lay2975
-rw-r--r--src/mame/layout/m1ttcash.lay2778
-rw-r--r--src/mame/layout/m1wldzner.lay4983
-rw-r--r--src/mame/layout/m1wotwa.lay4790
-rw-r--r--src/mame/layout/m2comet.lay146
-rw-r--r--src/mame/layout/m2frpoly.lay162
-rw-r--r--src/mame/layout/m2hilite.lay162
-rw-r--r--src/mame/layout/m2luckyl.lay162
-rw-r--r--src/mame/layout/m2luckys.lay162
-rw-r--r--src/mame/layout/m2rockon.lay134
-rw-r--r--src/mame/layout/m2splite.lay162
-rw-r--r--src/mame/layout/m2sstar.lay178
-rw-r--r--src/mame/layout/m2starl.lay209
-rw-r--r--src/mame/layout/m2svlite.lay162
-rw-r--r--src/mame/layout/m2triple.lay162
-rw-r--r--src/mame/layout/m3acech.lay3093
-rw-r--r--src/mame/layout/m3autort.lay3297
-rw-r--r--src/mame/layout/m3biggam.lay3131
-rw-r--r--src/mame/layout/m3bigsht.lay2897
-rw-r--r--src/mame/layout/m3blkhle.lay3131
-rw-r--r--src/mame/layout/m3cabreta.lay2973
-rw-r--r--src/mame/layout/m3chase.lay3059
-rw-r--r--src/mame/layout/m3circle.lay3075
-rw-r--r--src/mame/layout/m3cskill.lay3099
-rw-r--r--src/mame/layout/m3cunlim.lay3036
-rw-r--r--src/mame/layout/m3fortun.lay3167
-rw-r--r--src/mame/layout/m3gcrown.lay2633
-rw-r--r--src/mame/layout/m3gmine.lay2804
-rw-r--r--src/mame/layout/m3lineup.lay3285
-rw-r--r--src/mame/layout/m3loony.lay3216
-rw-r--r--src/mame/layout/m3nnice.lay3131
-rw-r--r--src/mame/layout/m3oddson.lay3206
-rw-r--r--src/mame/layout/m3online.lay2461
-rw-r--r--src/mame/layout/m3oxo.lay2898
-rw-r--r--src/mame/layout/m3ratrce.lay2799
-rw-r--r--src/mame/layout/m3razdaza.lay3190
-rw-r--r--src/mame/layout/m3replay.lay2847
-rw-r--r--src/mame/layout/m3rockpl.lay3209
-rw-r--r--src/mame/layout/m3rollem.lay3168
-rw-r--r--src/mame/layout/m3rxchng.lay3389
-rw-r--r--src/mame/layout/m3sexcu.lay2876
-rw-r--r--src/mame/layout/m3slight.lay3240
-rw-r--r--src/mame/layout/m3snaphp.lay3148
-rw-r--r--src/mame/layout/m3spoof.lay3199
-rw-r--r--src/mame/layout/m3supadr.lay1990
-rw-r--r--src/mame/layout/m3supnud.lay2582
-rw-r--r--src/mame/layout/m3supspo.lay3141
-rw-r--r--src/mame/layout/m3supwin.lay2824
-rw-r--r--src/mame/layout/m3sweep.lay2876
-rw-r--r--src/mame/layout/m3tfair.lay2477
-rw-r--r--src/mame/layout/m3toplin.lay2735
-rw-r--r--src/mame/layout/m3winagnb.lay2846
-rw-r--r--src/mame/layout/m3winstr.lay2962
-rw-r--r--src/mame/layout/m3xchngg.lay2892
-rw-r--r--src/mame/layout/m4aao.lay1963
-rw-r--r--src/mame/layout/m4actbnk.lay2202
-rw-r--r--src/mame/layout/m4actclb.lay4058
-rw-r--r--src/mame/layout/m4actpak.lay2734
-rw-r--r--src/mame/layout/m4addr.lay4364
-rw-r--r--src/mame/layout/m4alladv.lay2534
-rw-r--r--src/mame/layout/m4alpha.lay4478
-rw-r--r--src/mame/layout/m4andybt.lay4749
-rw-r--r--src/mame/layout/m4andycp.lay2425
-rw-r--r--src/mame/layout/m4andyfh.lay852
-rw-r--r--src/mame/layout/m4andyge.lay1870
-rw-r--r--src/mame/layout/m4apachg.lay2927
-rw-r--r--src/mame/layout/m4tenten.lay1959
-rw-r--r--src/mame/layout/m5addams.lay5518
-rw-r--r--src/mame/layout/m5all41d.lay3149
-rw-r--r--src/mame/layout/m5arab.lay4148
-rw-r--r--src/mame/layout/m5austin11.lay5828
-rw-r--r--src/mame/layout/m5barkng.lay3286
-rw-r--r--src/mame/layout/m5barmy.lay5577
-rw-r--r--src/mame/layout/m5baxe04.lay4717
-rw-r--r--src/mame/layout/m5bbro.lay5067
-rw-r--r--src/mame/layout/m5bbrocl.lay4584
-rw-r--r--src/mame/layout/m5beansa.lay5157
-rw-r--r--src/mame/layout/m5bigchs.lay5387
-rw-r--r--src/mame/layout/m5biggam.lay5823
-rw-r--r--src/mame/layout/m5bling.lay5041
-rw-r--r--src/mame/layout/m5blkwht11.lay3077
-rw-r--r--src/mame/layout/m5bnzclb.lay5551
-rw-r--r--src/mame/layout/m5btlbnk.lay5069
-rw-r--r--src/mame/layout/m5bttf.lay6783
-rw-r--r--src/mame/layout/m5bwaves.lay4330
-rw-r--r--src/mame/layout/m5carou.lay4039
-rw-r--r--src/mame/layout/m5cashat.lay5607
-rw-r--r--src/mame/layout/m5cashrn.lay4178
-rw-r--r--src/mame/layout/m5cbw.lay6474
-rw-r--r--src/mame/layout/m5centcl.lay6119
-rw-r--r--src/mame/layout/m5circlb33.lay1904
-rw-r--r--src/mame/layout/m5circus0a.lay1715
-rw-r--r--src/mame/layout/m5clifhn.lay4898
-rw-r--r--src/mame/layout/m5clown11.lay4658
-rw-r--r--src/mame/layout/m5codft.lay6067
-rw-r--r--src/mame/layout/m5cosclb.lay5496
-rw-r--r--src/mame/layout/m5crzkni.lay4441
-rw-r--r--src/mame/layout/m5cshkcb.lay7360
-rw-r--r--src/mame/layout/m5cshstx.lay5579
-rw-r--r--src/mame/layout/m5dblqtsb.lay5113
-rw-r--r--src/mame/layout/m5devil.lay6903
-rw-r--r--src/mame/layout/m5dick10.lay3773
-rw-r--r--src/mame/layout/m5doshpk05.lay6427
-rw-r--r--src/mame/layout/m5egr.lay2348
-rw-r--r--src/mame/layout/m5elband.lay5045
-rw-r--r--src/mame/layout/m5elim.lay6327
-rw-r--r--src/mame/layout/m5evgrhr.lay2339
-rw-r--r--src/mame/layout/m5ewn.lay3850
-rw-r--r--src/mame/layout/m5extrm.lay5341
-rw-r--r--src/mame/layout/m5fiddle.lay2635
-rw-r--r--src/mame/layout/m5fire.lay6089
-rw-r--r--src/mame/layout/m5firebl.lay6616
-rw-r--r--src/mame/layout/m5flipcr.lay3998
-rw-r--r--src/mame/layout/m5fortby.lay4248
-rw-r--r--src/mame/layout/m5frnzy.lay5219
-rw-r--r--src/mame/layout/m5funsun.lay6078
-rw-r--r--src/mame/layout/m5gdrag.lay4813
-rw-r--r--src/mame/layout/m5ggems20.lay4154
-rw-r--r--src/mame/layout/m5gimmie.lay4673
-rw-r--r--src/mame/layout/m5grush.lay2436
-rw-r--r--src/mame/layout/m5grush5.lay2787
-rw-r--r--src/mame/layout/m5gsstrk07.lay2351
-rw-r--r--src/mame/layout/m5gstrik.lay5233
-rw-r--r--src/mame/layout/m5hellrz.lay4410
-rw-r--r--src/mame/layout/m5hgl14.lay4004
-rw-r--r--src/mame/layout/m5hiclau.lay2024
-rw-r--r--src/mame/layout/m5hifly.lay5067
-rw-r--r--src/mame/layout/m5hilok.lay5560
-rw-r--r--src/mame/layout/m5hisprt.lay5638
-rw-r--r--src/mame/layout/m5hlsumo.lay5256
-rw-r--r--src/mame/layout/m5holy.lay4622
-rw-r--r--src/mame/layout/m5hopidl.lay5079
-rw-r--r--src/mame/layout/m5hotslt.lay2343
-rw-r--r--src/mame/layout/m5hotstf.lay4683
-rw-r--r--src/mame/layout/m5hypvip.lay6059
-rw-r--r--src/mame/layout/m5jackbx.lay1948
-rw-r--r--src/mame/layout/m5jackp2.lay5482
-rw-r--r--src/mame/layout/m5jackpt.lay4635
-rw-r--r--src/mame/layout/m5jlyjwl.lay2611
-rw-r--r--src/mame/layout/m5jmpgem01.lay5614
-rw-r--r--src/mame/layout/m5kingqc06.lay3135
-rw-r--r--src/mame/layout/m5kkebab.lay5720
-rw-r--r--src/mame/layout/m5korma.lay4666
-rw-r--r--src/mame/layout/m5loony.lay5416
-rw-r--r--src/mame/layout/m5loot.lay2141
-rw-r--r--src/mame/layout/m5lotta.lay4004
-rw-r--r--src/mame/layout/m5martns07.lay5233
-rw-r--r--src/mame/layout/m5mega.lay5671
-rw-r--r--src/mame/layout/m5mmak06.lay5429
-rw-r--r--src/mame/layout/m5monmst.lay5468
-rw-r--r--src/mame/layout/m5mpfc.lay4025
-rw-r--r--src/mame/layout/m5mprio.lay2878
-rw-r--r--src/mame/layout/m5neptun.lay4459
-rw-r--r--src/mame/layout/m5nnww.lay2485
-rw-r--r--src/mame/layout/m5oohaah.lay4165
-rw-r--r--src/mame/layout/m5oohrio.lay2832
-rw-r--r--src/mame/layout/m5openbx05.lay3144
-rw-r--r--src/mame/layout/m5overld.lay6121
-rw-r--r--src/mame/layout/m5peepsh.lay4875
-rw-r--r--src/mame/layout/m5piefac.lay4157
-rw-r--r--src/mame/layout/m5piefcr.lay1860
-rw-r--r--src/mame/layout/m5ppussy.lay3249
-rw-r--r--src/mame/layout/m5psyccl01.lay6220
-rw-r--r--src/mame/layout/m5psycho.lay5249
-rw-r--r--src/mame/layout/m5ptyani.lay5537
-rw-r--r--src/mame/layout/m5qdrawb.lay5695
-rw-r--r--src/mame/layout/m5qshot04.lay2381
-rw-r--r--src/mame/layout/m5ratpka.lay6478
-rw-r--r--src/mame/layout/m5razdz10.lay3635
-rw-r--r--src/mame/layout/m5redbal.lay2627
-rw-r--r--src/mame/layout/m5redrcka.lay5530
-rw-r--r--src/mame/layout/m5resfrg.lay5289
-rw-r--r--src/mame/layout/m5revo13.lay4828
-rw-r--r--src/mame/layout/m5rfymc.lay3100
-rw-r--r--src/mame/layout/m5rgclb12.lay2853
-rw-r--r--src/mame/layout/m5rhrgt02.lay1758
-rw-r--r--src/mame/layout/m5ritj.lay4857
-rw-r--r--src/mame/layout/m5rollup.lay1973
-rw-r--r--src/mame/layout/m5rollx.lay1988
-rw-r--r--src/mame/layout/m5rthh.lay6721
-rw-r--r--src/mame/layout/m5rub.lay2805
-rw-r--r--src/mame/layout/m5rwb.lay2023
-rw-r--r--src/mame/layout/m5scharg.lay5482
-rw-r--r--src/mame/layout/m5seven.lay2739
-rw-r--r--src/mame/layout/m5shark.lay6373
-rw-r--r--src/mame/layout/m5sheik.lay5553
-rw-r--r--src/mame/layout/m5skulcl20.lay4357
-rw-r--r--src/mame/layout/m5sondra.lay4653
-rw-r--r--src/mame/layout/m5speccl.lay2714
-rw-r--r--src/mame/layout/m5spiker.lay6155
-rw-r--r--src/mame/layout/m5spins.lay3095
-rw-r--r--src/mame/layout/m5squids06.lay5993
-rw-r--r--src/mame/layout/m5sstrk.lay2011
-rw-r--r--src/mame/layout/m5starcl.lay2056
-rw-r--r--src/mame/layout/m5stars26.lay2016
-rw-r--r--src/mame/layout/m5stax.lay3126
-rw-r--r--src/mame/layout/m5supnov.lay4989
-rw-r--r--src/mame/layout/m5supro.lay1661
-rw-r--r--src/mame/layout/m5tbird.lay4539
-rw-r--r--src/mame/layout/m5tempcl.lay8617
-rw-r--r--src/mame/layout/m5tempp.lay2937
-rw-r--r--src/mame/layout/m5tempt2.lay4605
-rw-r--r--src/mame/layout/m5tictacbwb.lay2380
-rw-r--r--src/mame/layout/m5trail.lay6475
-rw-r--r--src/mame/layout/m5ultimo04.lay5155
-rw-r--r--src/mame/layout/m5upover.lay5125
-rw-r--r--src/mame/layout/m5vampup.lay4738
-rw-r--r--src/mame/layout/m5vertgo.lay5200
-rw-r--r--src/mame/layout/m5wking05.lay2072
-rw-r--r--src/mame/layout/m5wonga.lay5748
-rw-r--r--src/mame/layout/m5wthing20.lay4664
-rw-r--r--src/mame/layout/m5xchn.lay2590
-rw-r--r--src/mame/layout/m5xfact11.lay2142
-rw-r--r--src/mame/layout/m68705prg.lay112
-rw-r--r--src/mame/layout/m_bappl2.lay148
-rw-r--r--src/mame/layout/m_bapple.lay148
-rw-r--r--src/mame/layout/m_gndgit.lay148
-rw-r--r--src/mame/layout/m_lndg.lay148
-rw-r--r--src/mame/layout/m_mtchit.lay145
-rw-r--r--src/mame/layout/m_mtchup.lay145
-rw-r--r--src/mame/layout/mac3.lay37
-rw-r--r--src/mame/layout/macp.lay134
-rw-r--r--src/mame/layout/magibomb.lay167
-rw-r--r--src/mame/layout/magibomb_ab45a.lay167
-rw-r--r--src/mame/layout/magicard.lay196
-rw-r--r--src/mame/layout/magimaska.lay596
-rw-r--r--src/mame/layout/majorpkr.lay240
-rw-r--r--src/mame/layout/maniac.lay50
-rw-r--r--src/mame/layout/marmagic.lay1038
-rw-r--r--src/mame/layout/marmagicua.lay600
-rw-r--r--src/mame/layout/marywu.lay162
-rw-r--r--src/mame/layout/mastmind.lay62
-rw-r--r--src/mame/layout/matchme.lay161
-rw-r--r--src/mame/layout/matchnum.lay150
-rw-r--r--src/mame/layout/mathmagi.lay99
-rw-r--r--src/mame/layout/mathmarv.lay81
-rw-r--r--src/mame/layout/maxaflex.lay41
-rw-r--r--src/mame/layout/maygay1b.lay921
-rw-r--r--src/mame/layout/maze.lay20
-rw-r--r--src/mame/layout/mbaseb.lay201
-rw-r--r--src/mame/layout/mbaskb.lay114
-rw-r--r--src/mame/layout/mbaskb2.lay114
-rw-r--r--src/mame/layout/mbdtower.lay202
-rw-r--r--src/mame/layout/mchess.lay167
-rw-r--r--src/mame/layout/mcompgin.lay109
-rw-r--r--src/mame/layout/md6802.lay381
-rw-r--r--src/mame/layout/mdallas.lay41
-rw-r--r--src/mame/layout/mdndclab.lay390
-rw-r--r--src/mame/layout/mdrawpkr.lay161
-rw-r--r--src/mame/layout/medlanes.lay21
-rw-r--r--src/mame/layout/mega10k.lay26
-rw-r--r--src/mame/layout/megacd.lay50
-rw-r--r--src/mame/layout/megaline.lay250
-rw-r--r--src/mame/layout/mekd2.lay42
-rw-r--r--src/mame/layout/mekd3.lay316
-rw-r--r--src/mame/layout/mekd4.lay316
-rw-r--r--src/mame/layout/mekd5.lay295
-rw-r--r--src/mame/layout/melodym.lay161
-rw-r--r--src/mame/layout/memoquiz.lay56
-rw-r--r--src/mame/layout/mephisto_1.lay252
-rw-r--r--src/mame/layout/mephisto_3.lay613
-rw-r--r--src/mame/layout/mephisto_academy.lay507
-rw-r--r--src/mame/layout/mephisto_alm16.lay468
-rw-r--r--src/mame/layout/mephisto_alm32.lay468
-rw-r--r--src/mame/layout/mephisto_amsterdam.lay569
-rw-r--r--src/mame/layout/mephisto_berlin.lay427
-rw-r--r--src/mame/layout/mephisto_bup.lay588
-rw-r--r--src/mame/layout/mephisto_esb2.lay620
-rw-r--r--src/mame/layout/mephisto_europa.lay561
-rw-r--r--src/mame/layout/mephisto_excalibur.lay621
-rw-r--r--src/mame/layout/mephisto_gen32.lay468
-rw-r--r--src/mame/layout/mephisto_glasgow.lay556
-rw-r--r--src/mame/layout/mephisto_junior.lay222
-rw-r--r--src/mame/layout/mephisto_mega4.lay562
-rw-r--r--src/mame/layout/mephisto_milano.lay446
-rw-r--r--src/mame/layout/mephisto_mirage.lay550
-rw-r--r--src/mame/layout/mephisto_mm1.lay547
-rw-r--r--src/mame/layout/mephisto_mm2.lay598
-rw-r--r--src/mame/layout/mephisto_mm5.lay594
-rw-r--r--src/mame/layout/mephisto_mm6.lay469
-rw-r--r--src/mame/layout/mephisto_modena.lay472
-rw-r--r--src/mame/layout/mephisto_modular_tm.lay419
-rw-r--r--src/mame/layout/mephisto_mondial.lay477
-rw-r--r--src/mame/layout/mephisto_mondial2.lay477
-rw-r--r--src/mame/layout/mephisto_mondial68k.lay465
-rw-r--r--src/mame/layout/mephisto_montec.lay542
-rw-r--r--src/mame/layout/mephisto_montreal.lay562
-rw-r--r--src/mame/layout/mephisto_montreux.lay474
-rw-r--r--src/mame/layout/mephisto_polgar.lay445
-rw-r--r--src/mame/layout/mephisto_risc.lay445
-rw-r--r--src/mame/layout/mephisto_roma2.lay569
-rw-r--r--src/mame/layout/mephisto_schachak.lay508
-rw-r--r--src/mame/layout/mephisto_smondial.lay562
-rw-r--r--src/mame/layout/mephisto_smondial2.lay559
-rw-r--r--src/mame/layout/merlin.lay402
-rw-r--r--src/mame/layout/metalman.lay142
-rw-r--r--src/mame/layout/meybjack.lay145
-rw-r--r--src/mame/layout/mfootb.lay147
-rw-r--r--src/mame/layout/mfootb2.lay153
-rw-r--r--src/mame/layout/mg1.lay36
-rw-r--r--src/mame/layout/mgames.lay156
-rw-r--r--src/mame/layout/mgavegas.lay238
-rw-r--r--src/mame/layout/mhockey.lay138
-rw-r--r--src/mame/layout/mhockeya.lay110
-rw-r--r--src/mame/layout/micon2.lay42
-rw-r--r--src/mame/layout/micropin.lay272
-rw-r--r--src/mame/layout/microtouch.lay113
-rw-r--r--src/mame/layout/microvision.lay65
-rw-r--r--src/mame/layout/mil4000.lay31
-rw-r--r--src/mame/layout/milton.lay118
-rw-r--r--src/mame/layout/mindset.lay67
-rw-r--r--src/mame/layout/minferno.lay37
-rw-r--r--src/mame/layout/miniboy7.lay145
-rw-r--r--src/mame/layout/minicom.lay116
-rw-r--r--src/mame/layout/minspace.lay71
-rw-r--r--src/mame/layout/misatk.lay121
-rw-r--r--src/mame/layout/missamer.lay1361
-rw-r--r--src/mame/layout/mk14.lay48
-rw-r--r--src/mame/layout/mk14vdu.lay58
-rw-r--r--src/mame/layout/mkit09.lay42
-rw-r--r--src/mame/layout/ml20.lay254
-rw-r--r--src/mame/layout/mmarvin.lay175
-rw-r--r--src/mame/layout/mmd1.lay128
-rw-r--r--src/mame/layout/mmd2.lay209
-rw-r--r--src/mame/layout/mmerlin.lay401
-rw-r--r--src/mame/layout/model1io2.lay42
-rw-r--r--src/mame/layout/modulab.lay430
-rw-r--r--src/mame/layout/monkeysee.lay52
-rw-r--r--src/mame/layout/montree.lay443
-rw-r--r--src/mame/layout/monty.lay26
-rw-r--r--src/mame/layout/monzagp.lay109
-rw-r--r--src/mame/layout/moog_source.lay1331
-rw-r--r--src/mame/layout/mountmon.lay333
-rw-r--r--src/mame/layout/mp68a.lay191
-rw-r--r--src/mame/layout/mpc2000xl.lay1255
-rw-r--r--src/mame/layout/mpc3000.lay1466
-rw-r--r--src/mame/layout/mpc60.lay1275
-rw-r--r--src/mame/layout/mpf1.lay52
-rw-r--r--src/mame/layout/mpf1b.lay52
-rw-r--r--src/mame/layout/mpf1p.lay99
-rw-r--r--src/mame/layout/mpoker.lay153
-rw-r--r--src/mame/layout/mps65.lay42
-rw-r--r--src/mame/layout/mpu1.lay75
-rw-r--r--src/mame/layout/mpu2.lay109
-rw-r--r--src/mame/layout/mpu3.lay93
-rw-r--r--src/mame/layout/mpu4.lay1265
-rw-r--r--src/mame/layout/mpu4ext.lay98
-rw-r--r--src/mame/layout/mpu4plasma.lay83
-rw-r--r--src/mame/layout/mpu5.lay347
-rw-r--r--src/mame/layout/ms0515.lay56
-rw-r--r--src/mame/layout/msoccer.lay99
-rw-r--r--src/mame/layout/msoccer2.lay116
-rw-r--r--src/mame/layout/msthawk.lay45
-rw-r--r--src/mame/layout/msx_ar.lay59
-rw-r--r--src/mame/layout/msx_ar_1fdd.lay72
-rw-r--r--src/mame/layout/msx_ar_2fdd.lay76
-rw-r--r--src/mame/layout/msx_en.lay56
-rw-r--r--src/mame/layout/msx_jp.lay56
-rw-r--r--src/mame/layout/msx_jp_1fdd.lay69
-rw-r--r--src/mame/layout/msx_jp_2fdd.lay73
-rw-r--r--src/mame/layout/msx_kr.lay56
-rw-r--r--src/mame/layout/msx_kr_1fdd.lay69
-rw-r--r--src/mame/layout/msx_nocode.lay51
-rw-r--r--src/mame/layout/msx_nocode_1fdd.lay64
-rw-r--r--src/mame/layout/msx_nocode_2fdd.lay69
-rw-r--r--src/mame/layout/msx_nocode_nocaps.lay38
-rw-r--r--src/mame/layout/msx_ru.lay56
-rw-r--r--src/mame/layout/msx_ru_1fdd.lay69
-rw-r--r--src/mame/layout/msx_ru_2fdd.lay73
-rw-r--r--src/mame/layout/msx_turbor.lay91
-rw-r--r--src/mame/layout/mt2090.lay256
-rw-r--r--src/mame/layout/mt80z.lay52
-rw-r--r--src/mame/layout/mu128.lay54
-rw-r--r--src/mame/layout/mu2000.lay367
-rw-r--r--src/mame/layout/mu50.lay170
-rw-r--r--src/mame/layout/mulcd.lay43
-rw-r--r--src/mame/layout/multidrw.lay297
-rw-r--r--src/mame/layout/musicsrt.lay155
-rw-r--r--src/mame/layout/mvbfree.lay33
-rw-r--r--src/mame/layout/mwcbaseb.lay44
-rw-r--r--src/mame/layout/mwcfootb.lay36
-rw-r--r--src/mame/layout/mystgard.lay333
-rw-r--r--src/mame/layout/mz1.lay654
-rw-r--r--src/mame/layout/nabupc.lay90
-rw-r--r--src/mame/layout/navarone.lay40
-rw-r--r--src/mame/layout/nbmj8688.lay59
-rw-r--r--src/mame/layout/nd8lines.lay327
-rw-r--r--src/mame/layout/neogeo.lay36
-rw-r--r--src/mame/layout/newbrain.lay65
-rw-r--r--src/mame/layout/newbraina.lay11
-rw-r--r--src/mame/layout/newufo.lay265
-rw-r--r--src/mame/layout/nfb96.lay264
-rw-r--r--src/mame/layout/nfb96tx.lay264
-rw-r--r--src/mame/layout/ninjaw.lay37
-rw-r--r--src/mame/layout/noraut09_sureshot.lay166
-rw-r--r--src/mame/layout/noraut10.lay183
-rw-r--r--src/mame/layout/noraut11.lay236
-rw-r--r--src/mame/layout/noraut12.lay215
-rw-r--r--src/mame/layout/notechan.lay564
-rw-r--r--src/mame/layout/novag_accord.lay542
-rw-r--r--src/mame/layout/novag_beluga.lay502
-rw-r--r--src/mame/layout/novag_cexpert.lay505
-rw-r--r--src/mame/layout/novag_cforte.lay530
-rw-r--r--src/mame/layout/novag_chesstea.lay184
-rw-r--r--src/mame/layout/novag_cnchess.lay939
-rw-r--r--src/mame/layout/novag_const.lay507
-rw-r--r--src/mame/layout/novag_constjr.lay445
-rw-r--r--src/mame/layout/novag_constq.lay493
-rw-r--r--src/mame/layout/novag_diablo68.lay504
-rw-r--r--src/mame/layout/novag_diamond.lay496
-rw-r--r--src/mame/layout/novag_diamond2.lay508
-rw-r--r--src/mame/layout/novag_emerclp.lay519
-rw-r--r--src/mame/layout/novag_gomoku.lay513
-rw-r--r--src/mame/layout/novag_mentor16.lay541
-rw-r--r--src/mame/layout/novag_micro.lay443
-rw-r--r--src/mame/layout/novag_micro2.lay441
-rw-r--r--src/mame/layout/novag_mk1.lay205
-rw-r--r--src/mame/layout/novag_mk2.lay184
-rw-r--r--src/mame/layout/novag_mk2a.lay169
-rw-r--r--src/mame/layout/novag_obsidian.lay488
-rw-r--r--src/mame/layout/novag_primo.lay471
-rw-r--r--src/mame/layout/novag_robotadv.lay655
-rw-r--r--src/mame/layout/novag_sapphire.lay200
-rw-r--r--src/mame/layout/novag_sapphire2.lay230
-rw-r--r--src/mame/layout/novag_savant.lay317
-rw-r--r--src/mame/layout/novag_scorpio68.lay531
-rw-r--r--src/mame/layout/novag_sdiamond.lay508
-rw-r--r--src/mame/layout/novag_sexpert.lay504
-rw-r--r--src/mame/layout/novag_sforte.lay553
-rw-r--r--src/mame/layout/novag_snova.lay459
-rw-r--r--src/mame/layout/novag_ssensor4.lay536
-rw-r--r--src/mame/layout/novag_supercon.lay624
-rw-r--r--src/mame/layout/novag_supremo.lay479
-rw-r--r--src/mame/layout/novag_svip.lay201
-rw-r--r--src/mame/layout/novag_vip.lay179
-rw-r--r--src/mame/layout/novag_zircon2.lay547
-rw-r--r--src/mame/layout/novoplay.lay151
-rw-r--r--src/mame/layout/nsm.lay165
-rw-r--r--src/mame/layout/oberheim_dmx.lay832
-rw-r--r--src/mame/layout/oberheim_xpander.lay73
-rw-r--r--src/mame/layout/oceanpar.lay208
-rw-r--r--src/mame/layout/omar1.lay187
-rw-r--r--src/mame/layout/omar2.lay233
-rw-r--r--src/mame/layout/omegrace.lay32
-rw-r--r--src/mame/layout/one4all.lay447
-rw-r--r--src/mame/layout/orchidms.lay365
-rw-r--r--src/mame/layout/orchidmsnz.lay447
-rw-r--r--src/mame/layout/outrun.lay95
-rw-r--r--src/mame/layout/overdriv.lay95
-rw-r--r--src/mame/layout/packmon.lay85
-rw-r--r--src/mame/layout/pacominv.lay38
-rw-r--r--src/mame/layout/paia_fatman.lay717
-rw-r--r--src/mame/layout/paia_midi2cv8.lay282
-rw-r--r--src/mame/layout/pairmtch.lay193
-rw-r--r--src/mame/layout/palmf31.lay31
-rw-r--r--src/mame/layout/palmmd8.lay89
-rw-r--r--src/mame/layout/pantmag.lay485
-rw-r--r--src/mame/layout/pantmaga.lay317
-rw-r--r--src/mame/layout/paradice.lay136
-rw-r--r--src/mame/layout/parentj.lay304
-rw-r--r--src/mame/layout/pasha2.lay89
-rw-r--r--src/mame/layout/patinho.lay1397
-rw-r--r--src/mame/layout/pbactiont.lay198
-rw-r--r--src/mame/layout/pbmastm.lay58
-rw-r--r--src/mame/layout/pc1500.lay135
-rw-r--r--src/mame/layout/pce220.lay209
-rw-r--r--src/mame/layout/pcg850v.lay197
-rw-r--r--src/mame/layout/pcw.lay26
-rw-r--r--src/mame/layout/pda600.lay81
-rw-r--r--src/mame/layout/pdrift.lay95
-rw-r--r--src/mame/layout/pe_bjack.lay108
-rw-r--r--src/mame/layout/pe_fantasy.lay208
-rw-r--r--src/mame/layout/pe_keno.lay76
-rw-r--r--src/mame/layout/pe_poker.lay108
-rw-r--r--src/mame/layout/pe_schip.lay16
-rw-r--r--src/mame/layout/pe_slots.lay68
-rw-r--r--src/mame/layout/pengpayce.lay838
-rw-r--r--src/mame/layout/pengpaycea.lay895
-rw-r--r--src/mame/layout/pengpaydx.lay760
-rw-r--r--src/mame/layout/pengpuck.lay870
-rw-r--r--src/mame/layout/penpir2.lay365
-rw-r--r--src/mame/layout/peplus.lay68
-rw-r--r--src/mame/layout/petshop.lay365
-rw-r--r--src/mame/layout/peyper.lay173
-rw-r--r--src/mame/layout/pg1000.lay1042
-rw-r--r--src/mame/layout/phantom2.lay21
-rw-r--r--src/mame/layout/phpball.lay76
-rw-r--r--src/mame/layout/pickytlk.lay116
-rw-r--r--src/mame/layout/piggypas.lay30
-rw-r--r--src/mame/layout/pilot1k.lay70
-rw-r--r--src/mame/layout/pirpok2.lay53
-rw-r--r--src/mame/layout/pl6dev.lay126
-rw-r--r--src/mame/layout/pl6vdev.lay131
-rw-r--r--src/mame/layout/play_1.lay108
-rw-r--r--src/mame/layout/play_2.lay90
-rw-r--r--src/mame/layout/play_3.lay93
-rw-r--r--src/mame/layout/playch10.lay66
-rw-r--r--src/mame/layout/playmaker.lay57
-rw-r--r--src/mame/layout/pm5644.lay419
-rw-r--r--src/mame/layout/pmi80.lay48
-rw-r--r--src/mame/layout/pmpoker.lay27
-rw-r--r--src/mame/layout/pmroulet.lay11
-rw-r--r--src/mame/layout/pnchmn.lay106
-rw-r--r--src/mame/layout/pntnpuzl.lay160
-rw-r--r--src/mame/layout/pntnpuzls.lay163
-rw-r--r--src/mame/layout/poker41.lay39
-rw-r--r--src/mame/layout/pokeri.lay196
-rw-r--r--src/mame/layout/pokio.lay163
-rw-r--r--src/mame/layout/pokonl97.lay288
-rw-r--r--src/mame/layout/polepos.lay95
-rw-r--r--src/mame/layout/poly880.lay39
-rw-r--r--src/mame/layout/polyplay.lay117
-rw-r--r--src/mame/layout/ppsatan.lay17
-rw-r--r--src/mame/layout/pr8210.lay (renamed from src/ldplayer/layout/pr8210.lay)35
-rw-r--r--src/mame/layout/pro80.lay43
-rw-r--r--src/mame/layout/proconn.lay950
-rw-r--r--src/mame/layout/prophet600.lay27
-rw-r--r--src/mame/layout/przfight.lay269
-rw-r--r--src/mame/layout/psr11.lay496
-rw-r--r--src/mame/layout/psr110.lay243
-rw-r--r--src/mame/layout/psr150.lay317
-rw-r--r--src/mame/layout/psr180.lay463
-rw-r--r--src/mame/layout/psr60.lay1085
-rw-r--r--src/mame/layout/psr70.lay1010
-rw-r--r--src/mame/layout/psr75.lay255
-rw-r--r--src/mame/layout/psr76.lay397
-rw-r--r--src/mame/layout/pss11.lay230
-rw-r--r--src/mame/layout/pss12.lay409
-rw-r--r--src/mame/layout/pss170.lay15
-rw-r--r--src/mame/layout/pss21.lay226
-rw-r--r--src/mame/layout/pss31.lay240
-rw-r--r--src/mame/layout/pss6.lay372
-rw-r--r--src/mame/layout/pulltabs.lay19
-rw-r--r--src/mame/layout/pve500.lay134
-rw-r--r--src/mame/layout/pvmil.lay75
-rw-r--r--src/mame/layout/px4.lay31
-rw-r--r--src/mame/layout/px8.lay29
-rw-r--r--src/mame/layout/pylo.lay396
-rw-r--r--src/mame/layout/pyramid.lay127
-rw-r--r--src/mame/layout/qfire.lay112
-rw-r--r--src/mame/layout/qkracer.lay78
-rw-r--r--src/mame/layout/qkracera.lay78
-rw-r--r--src/mame/layout/qkspeller.lay36
-rw-r--r--src/mame/layout/qnile.lay369
-rw-r--r--src/mame/layout/qnilec.lay369
-rw-r--r--src/mame/layout/qnilecea.lay842
-rw-r--r--src/mame/layout/qniled.lay329
-rw-r--r--src/mame/layout/qnilenl.lay337
-rw-r--r--src/mame/layout/qtbird.lay333
-rw-r--r--src/mame/layout/quintoon.lay136
-rw-r--r--src/mame/layout/quizshow.lay46
-rw-r--r--src/mame/layout/quizwizc.lay85
-rw-r--r--src/mame/layout/racedrivpan.lay37
-rw-r--r--src/mame/layout/radr.lay95
-rw-r--r--src/mame/layout/rainbow.lay238
-rw-r--r--src/mame/layout/raisedvl.lay75
-rw-r--r--src/mame/layout/ravens.lay88
-rw-r--r--src/mame/layout/rdqa.lay23
-rw-r--r--src/mame/layout/re800.lay144
-rw-r--r--src/mame/layout/re900.lay179
-rw-r--r--src/mame/layout/rebound.lay26
-rw-r--r--src/mame/layout/recel.lay102
-rw-r--r--src/mame/layout/redbaron.lay21
-rw-r--r--src/mame/layout/reelrock.lay365
-rw-r--r--src/mame/layout/regence.lay448
-rw-r--r--src/mame/layout/retrsam.lay277
-rw-r--r--src/mame/layout/retrsamb.lay341
-rw-r--r--src/mame/layout/revlatns.lay136
-rw-r--r--src/mame/layout/rocknms.lay33
-rw-r--r--src/mame/layout/rockpin.lay152
-rw-r--r--src/mame/layout/roland_d70.lay709
-rw-r--r--src/mame/layout/roland_tr707.lay1236
-rw-r--r--src/mame/layout/roul.lay153
-rw-r--r--src/mame/layout/roundup5.lay99
-rw-r--r--src/mame/layout/rowamet.lay129
-rw-r--r--src/mame/layout/royal5p.lay207
-rw-r--r--src/mame/layout/royalcrd.lay139
-rw-r--r--src/mame/layout/roypok96.lay270
-rw-r--r--src/mame/layout/rtpc.lay69
-rw-r--r--src/mame/layout/rulechan.lay461
-rw-r--r--src/mame/layout/rungun_dual.lay36
-rw-r--r--src/mame/layout/rw10r.lay22
-rw-r--r--src/mame/layout/rw24k.lay23
-rw-r--r--src/mame/layout/rw30r.lay23
-rw-r--r--src/mame/layout/rz1.lay693
-rw-r--r--src/mame/layout/rzone.lay22
-rw-r--r--src/mame/layout/s11.lay93
-rw-r--r--src/mame/layout/s11a.lay99
-rw-r--r--src/mame/layout/s11b.lay82
-rw-r--r--src/mame/layout/s11c.lay82
-rw-r--r--src/mame/layout/s2000.lay826
-rw-r--r--src/mame/layout/s3.lay91
-rw-r--r--src/mame/layout/s3000.lay877
-rwxr-xr-xsrc/mame/layout/s3000xl.lay840
-rw-r--r--src/mame/layout/s4.lay91
-rw-r--r--src/mame/layout/s6.lay91
-rw-r--r--src/mame/layout/s6a.lay88
-rw-r--r--src/mame/layout/s7.lay147
-rw-r--r--src/mame/layout/s8pfevr.lay84
-rw-r--r--src/mame/layout/s8ratrc.lay62
-rw-r--r--src/mame/layout/s8scrzy.lay53
-rw-r--r--src/mame/layout/s9.lay88
-rw-r--r--src/mame/layout/sag.lay236
-rw-r--r--src/mame/layout/saitek_blitz.lay374
-rw-r--r--src/mame/layout/saitek_centurion.lay470
-rw-r--r--src/mame/layout/saitek_chessac.lay508
-rw-r--r--src/mame/layout/saitek_chesstrv.lay139
-rw-r--r--src/mame/layout/saitek_chesstrvi.lay137
-rw-r--r--src/mame/layout/saitek_companion.lay500
-rw-r--r--src/mame/layout/saitek_companion2.lay479
-rw-r--r--src/mame/layout/saitek_companion3.lay447
-rw-r--r--src/mame/layout/saitek_conquistador.lay562
-rw-r--r--src/mame/layout/saitek_corona.lay614
-rw-r--r--src/mame/layout/saitek_cougar.lay458
-rw-r--r--src/mame/layout/saitek_cp2000.lay540
-rw-r--r--src/mame/layout/saitek_delta1.lay196
-rw-r--r--src/mame/layout/saitek_ecbackg.lay682
-rw-r--r--src/mame/layout/saitek_edames.lay822
-rw-r--r--src/mame/layout/saitek_electrio.lay910
-rw-r--r--src/mame/layout/saitek_exechess.lay147
-rw-r--r--src/mame/layout/saitek_expchess.lay466
-rw-r--r--src/mame/layout/saitek_galileo.lay594
-rw-r--r--src/mame/layout/saitek_gk2000.lay455
-rw-r--r--src/mame/layout/saitek_gk2100.lay459
-rw-r--r--src/mame/layout/saitek_leonardo.lay681
-rw-r--r--src/mame/layout/saitek_mark5.lay470
-rw-r--r--src/mame/layout/saitek_mark6.lay806
-rw-r--r--src/mame/layout/saitek_minichess.lay143
-rw-r--r--src/mame/layout/saitek_mk12.lay530
-rw-r--r--src/mame/layout/saitek_pcheckers.lay647
-rw-r--r--src/mame/layout/saitek_pchess.lay434
-rw-r--r--src/mame/layout/saitek_pplus.lay462
-rw-r--r--src/mame/layout/saitek_prisma.lay566
-rw-r--r--src/mame/layout/saitek_prschess.lay432
-rw-r--r--src/mame/layout/saitek_renaissance.lay618
-rw-r--r--src/mame/layout/saitek_risc2500.lay460
-rw-r--r--src/mame/layout/saitek_sbackgc.lay681
-rw-r--r--src/mame/layout/saitek_schess.lay486
-rw-r--r--src/mame/layout/saitek_simultano.lay560
-rw-r--r--src/mame/layout/saitek_sstar28k.lay485
-rw-r--r--src/mame/layout/saitek_ssystem3.lay347
-rw-r--r--src/mame/layout/saitek_ssystem4.lay184
-rw-r--r--src/mame/layout/saitek_stratos.lay646
-rw-r--r--src/mame/layout/saitek_tatrain.lay480
-rw-r--r--src/mame/layout/saitek_teammate.lay458
-rw-r--r--src/mame/layout/saitek_tking.lay709
-rw-r--r--src/mame/layout/saitek_tschess.lay464
-rw-r--r--src/mame/layout/saitek_tstar432.lay477
-rw-r--r--src/mame/layout/saitek_turbo16k.lay578
-rw-r--r--src/mame/layout/saitek_turbos24k.lay658
-rw-r--r--src/mame/layout/saiyukip.lay113
-rw-r--r--src/mame/layout/sanremo.lay136
-rw-r--r--src/mame/layout/savia84.lay76
-rw-r--r--src/mame/layout/sball2k1.lay203
-rw-r--r--src/mame/layout/sbrkout.lay27
-rw-r--r--src/mame/layout/sbuk2.lay221
-rw-r--r--src/mame/layout/sbuk2a.lay213
-rw-r--r--src/mame/layout/sbuk3.lay281
-rw-r--r--src/mame/layout/sc1_vfd.lay237
-rw-r--r--src/mame/layout/sc1_vid.lay118
-rw-r--r--src/mame/layout/sc1barcd.lay3186
-rw-r--r--src/mame/layout/sc1bartk.lay1682
-rw-r--r--src/mame/layout/sc1cl65.lay3457
-rw-r--r--src/mame/layout/sc1clbtma.lay5152
-rw-r--r--src/mame/layout/sc1cwcl.lay2962
-rw-r--r--src/mame/layout/sc1dblch.lay4413
-rw-r--r--src/mame/layout/sc1pwrl.lay3415
-rw-r--r--src/mame/layout/sc1sirb.lay3460
-rw-r--r--src/mame/layout/sc1spct.lay3146
-rw-r--r--src/mame/layout/sc1str4.lay1383
-rw-r--r--src/mame/layout/sc2.lay147
-rw-r--r--src/mame/layout/sc2_dmd.lay92
-rw-r--r--src/mame/layout/sc2_vfd.lay210
-rw-r--r--src/mame/layout/sc2_vid.lay71
-rw-r--r--src/mame/layout/sc2casr2.lay3691
-rw-r--r--src/mame/layout/sc2copcl7.lay4240
-rw-r--r--src/mame/layout/sc2cpe.lay4263
-rw-r--r--src/mame/layout/sc2cpg.lay4555
-rw-r--r--src/mame/layout/sc2eggs1.lay4296
-rw-r--r--src/mame/layout/sc2heypr.lay2781
-rw-r--r--src/mame/layout/sc2in1.lay244
-rw-r--r--src/mame/layout/sc2majes.lay3158
-rw-r--r--src/mame/layout/sc2prem2.lay4570
-rw-r--r--src/mame/layout/sc2prom.lay3126
-rw-r--r--src/mame/layout/sc2ptytm1.lay2574
-rw-r--r--src/mame/layout/sc2suprz1.lay2895
-rw-r--r--src/mame/layout/sc2town2.lay3515
-rw-r--r--src/mame/layout/sc4_dmd.lay265
-rw-r--r--src/mame/layout/sc4acesh.lay4058
-rw-r--r--src/mame/layout/sc4bantm.lay5229
-rw-r--r--src/mame/layout/sc4bedcl.lay6251
-rw-r--r--src/mame/layout/sc4blast.lay5393
-rw-r--r--src/mame/layout/sc4blokq.lay7539
-rw-r--r--src/mame/layout/sc4bobcl.lay6400
-rw-r--r--src/mame/layout/sc4brksp.lay6881
-rw-r--r--src/mame/layout/sc4brollb.lay6035
-rw-r--r--src/mame/layout/sc4cabin.lay5655
-rw-r--r--src/mame/layout/sc4canca.lay2218
-rw-r--r--src/mame/layout/sc4captn.lay5754
-rw-r--r--src/mame/layout/sc4cariqd.lay4829
-rw-r--r--src/mame/layout/sc4carrya.lay3218
-rw-r--r--src/mame/layout/sc4cashm.lay5117
-rw-r--r--src/mame/layout/sc4cclasd.lay3591
-rw-r--r--src/mame/layout/sc4cclim.lay1879
-rw-r--r--src/mame/layout/sc4cfcas.lay2044
-rw-r--r--src/mame/layout/sc4chainb.lay4725
-rw-r--r--src/mame/layout/sc4chavy.lay6442
-rw-r--r--src/mame/layout/sc4chick.lay1799
-rw-r--r--src/mame/layout/sc4chuba.lay4649
-rw-r--r--src/mame/layout/sc4clashd.lay6214
-rw-r--r--src/mame/layout/sc4clue.lay7117
-rw-r--r--src/mame/layout/sc4cmania.lay5199
-rw-r--r--src/mame/layout/sc4cmous.lay5664
-rw-r--r--src/mame/layout/sc4cnfr.lay3840
-rw-r--r--src/mame/layout/sc4coro.lay7197
-rw-r--r--src/mame/layout/sc4crc.lay5472
-rw-r--r--src/mame/layout/sc4crcla.lay6076
-rw-r--r--src/mame/layout/sc4crzgna.lay1723
-rw-r--r--src/mame/layout/sc4crzkya.lay2197
-rw-r--r--src/mame/layout/sc4cvanif.lay4966
-rw-r--r--src/mame/layout/sc4cvclb.lay5939
-rw-r--r--src/mame/layout/sc4dayltf.lay6317
-rw-r--r--src/mame/layout/sc4deepi.lay4829
-rw-r--r--src/mame/layout/sc4derby.lay4929
-rw-r--r--src/mame/layout/sc4dmineb.lay5022
-rw-r--r--src/mame/layout/sc4dnd.lay1028
-rw-r--r--src/mame/layout/sc4dnddw.lay1022
-rw-r--r--src/mame/layout/sc4dndtp.lay1028
-rw-r--r--src/mame/layout/sc4drubyb.lay2158
-rw-r--r--src/mame/layout/sc4duckqa.lay6796
-rw-r--r--src/mame/layout/sc4dyna.lay4419
-rw-r--r--src/mame/layout/sc4eascsc.lay1898
-rw-r--r--src/mame/layout/sc4emmerc.lay6720
-rw-r--r--src/mame/layout/sc4fastfb.lay6161
-rw-r--r--src/mame/layout/sc4fd7tha.lay5919
-rw-r--r--src/mame/layout/sc4fever.lay5661
-rw-r--r--src/mame/layout/sc4fire.lay4517
-rw-r--r--src/mame/layout/sc4fpitcb.lay4563
-rw-r--r--src/mame/layout/sc4ftopib.lay5902
-rw-r--r--src/mame/layout/sc4fullt.lay5369
-rw-r--r--src/mame/layout/sc4fwpcs.lay2102
-rw-r--r--src/mame/layout/sc4gaga.lay4053
-rw-r--r--src/mame/layout/sc4gball.lay5080
-rw-r--r--src/mame/layout/sc4gd.lay6045
-rw-r--r--src/mame/layout/sc4gdclb.lay5097
-rw-r--r--src/mame/layout/sc4ggdlxf.lay1808
-rw-r--r--src/mame/layout/sc4gldcl.lay6596
-rw-r--r--src/mame/layout/sc4gslam.lay3289
-rw-r--r--src/mame/layout/sc4gx.lay1839
-rw-r--r--src/mame/layout/sc4hdd.lay5313
-rw-r--r--src/mame/layout/sc4hi5.lay4455
-rw-r--r--src/mame/layout/sc4hilo.lay5221
-rw-r--r--src/mame/layout/sc4himi.lay4517
-rw-r--r--src/mame/layout/sc4hissa.lay5945
-rw-r--r--src/mame/layout/sc4holyw.lay5303
-rw-r--r--src/mame/layout/sc4hotpr.lay5434
-rw-r--r--src/mame/layout/sc4hotwd.lay4800
-rw-r--r--src/mame/layout/sc4hyde.lay5821
-rw-r--r--src/mame/layout/sc4jack.lay4773
-rw-r--r--src/mame/layout/sc4kalei.lay6396
-rw-r--r--src/mame/layout/sc4knokb.lay4075
-rw-r--r--src/mame/layout/sc4lined.lay1725
-rw-r--r--src/mame/layout/sc4lions.lay5097
-rw-r--r--src/mame/layout/sc4lirb.lay4621
-rw-r--r--src/mame/layout/sc4lkbcl.lay6796
-rw-r--r--src/mame/layout/sc4lockb.lay5317
-rw-r--r--src/mame/layout/sc4mgr.lay3105
-rw-r--r--src/mame/layout/sc4mmmg.lay6283
-rw-r--r--src/mame/layout/sc4mondxe.lay2675
-rw-r--r--src/mame/layout/sc4monoba.lay5142
-rw-r--r--src/mame/layout/sc4monot.lay2851
-rw-r--r--src/mame/layout/sc4motor.lay5440
-rw-r--r--src/mame/layout/sc4mou.lay6406
-rw-r--r--src/mame/layout/sc4mr2rc.lay6899
-rw-r--r--src/mame/layout/sc4mspid.lay2645
-rw-r--r--src/mame/layout/sc4mtbb.lay5554
-rw-r--r--src/mame/layout/sc4mtbclb.lay7253
-rw-r--r--src/mame/layout/sc4nmtj.lay6654
-rw-r--r--src/mame/layout/sc4nudita.lay3004
-rw-r--r--src/mame/layout/sc4paccl.lay7592
-rw-r--r--src/mame/layout/sc4pacqpa.lay6096
-rw-r--r--src/mame/layout/sc4pen1c.lay3021
-rw-r--r--src/mame/layout/sc4pgold.lay5784
-rw-r--r--src/mame/layout/sc4pipe.lay5524
-rw-r--r--src/mame/layout/sc4plumb.lay8184
-rw-r--r--src/mame/layout/sc4po8.lay6017
-rw-r--r--src/mame/layout/sc4polic.lay7454
-rw-r--r--src/mame/layout/sc4pony.lay5882
-rw-r--r--src/mame/layout/sc4potsha.lay6314
-rw-r--r--src/mame/layout/sc4ppclb.lay8888
-rw-r--r--src/mame/layout/sc4pstata.lay6344
-rw-r--r--src/mame/layout/sc4pwrbq.lay7448
-rw-r--r--src/mame/layout/sc4pwrsg.lay6646
-rw-r--r--src/mame/layout/sc4qmodo.lay7030
-rw-r--r--src/mame/layout/sc4quidrb.lay5994
-rw-r--r--src/mame/layout/sc4redsq.lay5979
-rw-r--r--src/mame/layout/sc4revod.lay6398
-rw-r--r--src/mame/layout/sc4rhxcl.lay2951
-rw-r--r--src/mame/layout/sc4rhxcsa.lay2862
-rw-r--r--src/mame/layout/sc4richl.lay6620
-rw-r--r--src/mame/layout/sc4rmo.lay3345
-rw-r--r--src/mame/layout/sc4rogds.lay5961
-rw-r--r--src/mame/layout/sc4roksc.lay5384
-rw-r--r--src/mame/layout/sc4rotc.lay6256
-rw-r--r--src/mame/layout/sc4rtc.lay6552
-rw-r--r--src/mame/layout/sc4rttt.lay6658
-rw-r--r--src/mame/layout/sc4s6cd.lay4123
-rw-r--r--src/mame/layout/sc4sahed.lay6068
-rw-r--r--src/mame/layout/sc4sbust.lay5581
-rw-r--r--src/mame/layout/sc4slci.lay5394
-rw-r--r--src/mame/layout/sc4slihd.lay6609
-rw-r--r--src/mame/layout/sc4smk7.lay3153
-rw-r--r--src/mame/layout/sc4solgl.lay6201
-rw-r--r--src/mame/layout/sc4sparkd.lay6032
-rw-r--r--src/mame/layout/sc4sprng.lay6809
-rw-r--r--src/mame/layout/sc4srrca.lay2784
-rw-r--r--src/mame/layout/sc4starpk.lay5574
-rw-r--r--src/mame/layout/sc4strk.lay2916
-rw-r--r--src/mame/layout/sc4suscl.lay7896
-rw-r--r--src/mame/layout/sc4susk.lay8445
-rw-r--r--src/mame/layout/sc4taekw.lay6913
-rw-r--r--src/mame/layout/sc4takcl.lay6009
-rw-r--r--src/mame/layout/sc4tbana.lay5501
-rw-r--r--src/mame/layout/sc4tempt.lay7144
-rw-r--r--src/mame/layout/sc4tfclb.lay6269
-rw-r--r--src/mame/layout/sc4tic2.lay2998
-rw-r--r--src/mame/layout/sc4tload.lay4871
-rw-r--r--src/mame/layout/sc4tpshta.lay7143
-rw-r--r--src/mame/layout/sc4trail.lay7130
-rw-r--r--src/mame/layout/sc4tridn.lay5129
-rw-r--r--src/mame/layout/sc4ttomb.lay6261
-rw-r--r--src/mame/layout/sc4vrgclb.lay6456
-rw-r--r--src/mame/layout/sc4wldjkc.lay3159
-rw-r--r--src/mame/layout/sc4xmarka.lay6528
-rw-r--r--src/mame/layout/scat.lay27
-rw-r--r--src/mame/layout/scrablex.lay22
-rw-r--r--src/mame/layout/scrablexa.lay22
-rw-r--r--src/mame/layout/scrabsen.lay69
-rw-r--r--src/mame/layout/scruiser.lay102
-rw-r--r--src/mame/layout/sd1.lay3388
-rw-r--r--src/mame/layout/sd132.lay3398
-rw-r--r--src/mame/layout/sda5708.lay65
-rw-r--r--src/mame/layout/sderby.lay15
-rw-r--r--src/mame/layout/sdk85.lay42
-rw-r--r--src/mame/layout/sdk86.lay33
-rw-r--r--src/mame/layout/seabattl.lay45
-rw-r--r--src/mame/layout/seawolf.lay198
-rw-r--r--src/mame/layout/seawolf2.lay182
-rw-r--r--src/mame/layout/segaai.lay94
-rw-r--r--src/mame/layout/segabill.lay83
-rw-r--r--src/mame/layout/segabillv.lay84
-rw-r--r--src/mame/layout/segajw.lay137
-rw-r--r--src/mame/layout/selz80.lay48
-rw-r--r--src/mame/layout/sentx6p.lay605
-rw-r--r--src/mame/layout/sequential_prophet5.lay1279
-rw-r--r--src/mame/layout/sequential_sixtrak.lay1351
-rw-r--r--src/mame/layout/setaroul.lay401
-rw-r--r--src/mame/layout/sevilla_77.lay662
-rw-r--r--src/mame/layout/sevilla_81.lay662
-rw-r--r--src/mame/layout/sf2049.lay152
-rw-r--r--src/mame/layout/sfiii2.lay19
-rw-r--r--src/mame/layout/sfrush.lay198
-rw-r--r--src/mame/layout/sgsafari.lay35
-rw-r--r--src/mame/layout/sharkpy.lay155
-rw-r--r--src/mame/layout/sharkpye.lay149
-rw-r--r--src/mame/layout/showhand.lay175
-rw-r--r--src/mame/layout/showhandc.lay175
-rw-r--r--src/mame/layout/shuffle11.lay117
-rw-r--r--src/mame/layout/shuffle4.lay99
-rw-r--r--src/mame/layout/shuffle9.lay99
-rw-r--r--src/mame/layout/shuttlei.lay27
-rw-r--r--src/mame/layout/sidewndr.lay51
-rw-r--r--src/mame/layout/sigmab52.lay130
-rw-r--r--src/mame/layout/sigmapkr.lay35
-rw-r--r--src/mame/layout/simon.lay159
-rw-r--r--src/mame/layout/simpbest.lay261
-rw-r--r--src/mame/layout/sitcom.lay76
-rw-r--r--src/mame/layout/sitcomtmr.lay102
-rw-r--r--src/mame/layout/skill98.lay251
-rw-r--r--src/mame/layout/skillch.lay250
-rw-r--r--src/mame/layout/skillcha.lay250
-rw-r--r--src/mame/layout/skilldrp.lay119
-rw-r--r--src/mame/layout/skydiver.lay21
-rw-r--r--src/mame/layout/slc1.lay50
-rw-r--r--src/mame/layout/slots.lay145
-rw-r--r--src/mame/layout/sltblgpo.lay127
-rw-r--r--src/mame/layout/sltblgtk.lay145
-rw-r--r--src/mame/layout/smastmind.lay72
-rw-r--r--src/mame/layout/smc777.lay89
-rw-r--r--src/mame/layout/smiconk.lay20
-rw-r--r--src/mame/layout/sminiboy.lay272
-rw-r--r--src/mame/layout/smoto.lay167
-rw-r--r--src/mame/layout/sms1.lay69
-rw-r--r--src/mame/layout/snmath.lay71
-rw-r--r--src/mame/layout/snookr10.lay31
-rw-r--r--src/mame/layout/snowcat.lay365
-rw-r--r--src/mame/layout/snread.lay49
-rw-r--r--src/mame/layout/snspell.lay46
-rw-r--r--src/mame/layout/snspellsp.lay60
-rw-r--r--src/mame/layout/solarq.lay7
-rw-r--r--src/mame/layout/solvalou.lay33
-rw-r--r--src/mame/layout/sos.lay26
-rw-r--r--src/mame/layout/spacecom.lay33
-rw-r--r--src/mame/layout/spacewin.lay31
-rw-r--r--src/mame/layout/spacezap.lay216
-rw-r--r--src/mame/layout/spacwalk.lay61
-rw-r--r--src/mame/layout/spbactnp.lay16
-rw-r--r--src/mame/layout/spcenctr.lay30
-rw-r--r--src/mame/layout/spdheat.lay372
-rw-r--r--src/mame/layout/spectra.lay136
-rw-r--r--src/mame/layout/speechp.lay44
-rw-r--r--src/mame/layout/speedbal.lay200
-rw-r--r--src/mame/layout/speedbsk.lay62
-rw-r--r--src/mame/layout/speedfrk.lay164
-rw-r--r--src/mame/layout/speedrs.lay143
-rw-r--r--src/mame/layout/speedup.lay125
-rw-r--r--src/mame/layout/spellb.lay47
-rw-r--r--src/mame/layout/spirit76.lay97
-rw-r--r--src/mame/layout/splasfgt.lay17
-rw-r--r--src/mame/layout/splitsec.lay96
-rw-r--r--src/mame/layout/splus.lay146
-rw-r--r--src/mame/layout/sprachmg.lay525
-rw-r--r--src/mame/layout/sprinter.lay75
-rw-r--r--src/mame/layout/spyhunt.lay411
-rw-r--r--src/mame/layout/spyhunttec.lay411
-rw-r--r--src/mame/layout/sr16.lay338
-rw-r--r--src/mame/layout/ssimon.lay248
-rw-r--r--src/mame/layout/sspeedr.lay393
-rw-r--r--src/mame/layout/ssports4.lay110
-rw-r--r--src/mame/layout/sstrangr.lay76
-rw-r--r--src/mame/layout/st_mp100.lay90
-rw-r--r--src/mame/layout/st_mp200.lay90
-rw-r--r--src/mame/layout/stactics.lay1404
-rw-r--r--src/mame/layout/starcas.lay7
-rw-r--r--src/mame/layout/stargame.lay150
-rw-r--r--src/mame/layout/starwbc.lay262
-rw-r--r--src/mame/layout/starwlb.lay118
-rw-r--r--src/mame/layout/starzan.lay382
-rw-r--r--src/mame/layout/stellafr.lay93
-rw-r--r--src/mame/layout/stepstag.lay56
-rw-r--r--src/mame/layout/stisub.lay146
-rw-r--r--src/mame/layout/stocker.lay95
-rw-r--r--src/mame/layout/stopthief.lay164
-rw-r--r--src/mame/layout/strobe.lay195
-rw-r--r--src/mame/layout/submar.lay164
-rw-r--r--src/mame/layout/subroc3d.lay301
-rw-r--r--src/mame/layout/subwars.lay172
-rw-r--r--src/mame/layout/summit.lay112
-rw-r--r--src/mame/layout/sundance.lay21
-rw-r--r--src/mame/layout/super80.lay38
-rw-r--r--src/mame/layout/superbug.lay29
-rw-r--r--src/mame/layout/superchs.lay193
-rw-r--r--src/mame/layout/suprstar.lay133
-rw-r--r--src/mame/layout/svision.lay21
-rw-r--r--src/mame/layout/svmu.lay53
-rw-r--r--src/mame/layout/swhr2.lay333
-rw-r--r--src/mame/layout/swhr2u.lay361
-rw-r--r--src/mame/layout/sym1.lay41
-rw-r--r--src/mame/layout/sz1.lay230
-rw-r--r--src/mame/layout/t1850.lay519
-rw-r--r--src/mame/layout/t3in1sa.lay62
-rw-r--r--src/mame/layout/t7in1ss.lay95
-rw-r--r--src/mame/layout/tactix.lay148
-rw-r--r--src/mame/layout/tailg.lay21
-rw-r--r--src/mame/layout/taito.lay132
-rw-r--r--src/mame/layout/talkingbb.lay52
-rw-r--r--src/mame/layout/tarzan103m.lay268
-rw-r--r--src/mame/layout/tascr30.lay526
-rw-r--r--src/mame/layout/tb303.lay48
-rw-r--r--src/mame/layout/tbreakup.lay128
-rw-r--r--src/mame/layout/tc4.lay106
-rw-r--r--src/mame/layout/tc7atc.lay383
-rw-r--r--src/mame/layout/tccombat.lay23
-rw-r--r--src/mame/layout/tceptor2.lay63
-rw-r--r--src/mame/layout/tcfball.lay143
-rw-r--r--src/mame/layout/tcfballa.lay144
-rw-r--r--src/mame/layout/tchess.lay180
-rw-r--r--src/mame/layout/tdracula.lay24
-rw-r--r--src/mame/layout/tdv2100kbd.lay206
-rw-r--r--src/mame/layout/teammate.lay51
-rw-r--r--src/mame/layout/tec1.lay42
-rw-r--r--src/mame/layout/techno.lay122
-rw-r--r--src/mame/layout/technodr.lay28
-rw-r--r--src/mame/layout/tecnbras.lay70
-rw-r--r--src/mame/layout/tenpindx.lay214
-rw-r--r--src/mame/layout/teqsun.lay368
-rw-r--r--src/mame/layout/thayers.lay24
-rw-r--r--src/mame/layout/ti1250.lay46
-rw-r--r--src/mame/layout/ti1270.lay43
-rw-r--r--src/mame/layout/ti1680.lay90
-rw-r--r--src/mame/layout/ti25502.lay31
-rw-r--r--src/mame/layout/ti30.lay46
-rw-r--r--src/mame/layout/ti5100.lay58
-rw-r--r--src/mame/layout/ti5200.lay60
-rw-r--r--src/mame/layout/ti74.lay213
-rw-r--r--src/mame/layout/ti95.lay302
-rw-r--r--src/mame/layout/timaze.lay17
-rw-r--r--src/mame/layout/timetrv.lay67
-rw-r--r--src/mame/layout/tinv2650.lay7
-rw-r--r--src/mame/layout/tisr16.lay55
-rw-r--r--src/mame/layout/tisub.lay138
-rw-r--r--src/mame/layout/tisubb.lay142
-rw-r--r--src/mame/layout/tithermos.lay18
-rw-r--r--src/mame/layout/tk80.lay44
-rw-r--r--src/mame/layout/tm990189.lay81
-rw-r--r--src/mame/layout/tm990189v.lay146
-rw-r--r--src/mame/layout/tmbaskb.lay263
-rw-r--r--src/mame/layout/tmtennis.lay40
-rw-r--r--src/mame/layout/tmvolleyb.lay196
-rw-r--r--src/mame/layout/tntell.lay105
-rw-r--r--src/mame/layout/toledo_83.lay725
-rw-r--r--src/mame/layout/toledo_87.lay725
-rw-r--r--src/mame/layout/tonypok.lay416
-rw-r--r--src/mame/layout/topgear.lay260
-rw-r--r--src/mame/layout/topracer.lay125
-rw-r--r--src/mame/layout/topspeed.lay107
-rw-r--r--src/mame/layout/toratora.lay29
-rw-r--r--src/mame/layout/touchme.lay182
-rw-r--r--src/mame/layout/toutangonl.lay333
-rw-r--r--src/mame/layout/tranz330.lay230
-rw-r--r--src/mame/layout/tripfev.lay208
-rw-r--r--src/mame/layout/tripslot.lay280
-rw-r--r--src/mame/layout/triton.lay29
-rw-r--r--src/mame/layout/tritreat.lay568
-rw-r--r--src/mame/layout/trstrove.lay369
-rw-r--r--src/mame/layout/trvmadns.lay55
-rw-r--r--src/mame/layout/ttfball.lay143
-rw-r--r--src/mame/layout/turbo.lay630
-rw-r--r--src/mame/layout/turbotag.lay95
-rw-r--r--src/mame/layout/tvochken.lay47
-rw-r--r--src/mame/layout/tx1.lay193
-rw-r--r--src/mame/layout/tx81z.lay240
-rw-r--r--src/mame/layout/uboat.lay24
-rw-r--r--src/mame/layout/ufo21.lay245
-rw-r--r--src/mame/layout/ufo800.lay173
-rw-r--r--src/mame/layout/ufoalac.lay162
-rw-r--r--src/mame/layout/ufombs.lay17
-rw-r--r--src/mame/layout/ufomini.lay196
-rw-r--r--src/mame/layout/unixpc.lay48
-rw-r--r--src/mame/layout/unkch.lay182
-rw-r--r--src/mame/layout/unkchx.lay183
-rw-r--r--src/mame/layout/upndown.lay105
-rw-r--r--src/mame/layout/us2pfball.lay168
-rw-r--r--src/mame/layout/ut88mini.lay42
-rw-r--r--src/mame/layout/v4addlad.lay553
-rw-r--r--src/mame/layout/v4barqst.lay604
-rw-r--r--src/mame/layout/v4dbltak.lay228
-rw-r--r--src/mame/layout/v4in1eg.lay54
-rw-r--r--src/mame/layout/v4psi.lay30
-rw-r--r--src/mame/layout/v4strike.lay464
-rw-r--r--src/mame/layout/vaportrx.lay55
-rw-r--r--src/mame/layout/vboy.lay33
-rw-r--r--src/mame/layout/vclock3.lay55
-rw-r--r--src/mame/layout/vcs80.lay54
-rw-r--r--src/mame/layout/vd.lay72
-rw-r--r--src/mame/layout/venicea5.lay879
-rw-r--r--src/mame/layout/vet3000.lay425
-rw-r--r--src/mame/layout/vfx.lay3158
-rw-r--r--src/mame/layout/vfxsd.lay3388
-rw-r--r--src/mame/layout/vgmplay.lay301
-rw-r--r--src/mame/layout/victor21.lay147
-rw-r--r--src/mame/layout/victor5.lay155
-rw-r--r--src/mame/layout/vidchal.lay38
-rw-r--r--src/mame/layout/video21.lay142
-rw-r--r--src/mame/layout/videoart.lay76
-rw-r--r--src/mame/layout/videocba.lay136
-rw-r--r--src/mame/layout/videodad.lay288
-rw-r--r--src/mame/layout/videopin.lay182
-rw-r--r--src/mame/layout/videopkr.lay349
-rw-r--r--src/mame/layout/videosaa.lay55
-rw-r--r--src/mame/layout/virusa.lay1190
-rw-r--r--src/mame/layout/virusb.lay1217
-rw-r--r--src/mame/layout/virusc.lay1375
-rw-r--r--src/mame/layout/viruscl.lay1253
-rw-r--r--src/mame/layout/virusrck.lay680
-rw-r--r--src/mame/layout/virusrckxl.lay675
-rw-r--r--src/mame/layout/visnqust.lay51
-rw-r--r--src/mame/layout/vjdash.lay20
-rw-r--r--src/mame/layout/vk100.lay109
-rw-r--r--src/mame/layout/votrpss.lay19
-rw-r--r--src/mame/layout/votrtnt.lay19
-rw-r--r--src/mame/layout/vpoker.lay192
-rw-r--r--src/mame/layout/vr.lay16
-rw-r--r--src/mame/layout/vsmile.lay69
-rw-r--r--src/mame/layout/vt100.lay109
-rw-r--r--src/mame/layout/wackygtr.lay363
-rw-r--r--src/mame/layout/wamazon.lay329
-rw-r--r--src/mame/layout/wamazona.lay293
-rw-r--r--src/mame/layout/warp1bl.lay29
-rw-r--r--src/mame/layout/warrior.lay65
-rw-r--r--src/mame/layout/wcat3.lay240
-rw-r--r--src/mame/layout/wcat3a.lay258
-rw-r--r--src/mame/layout/wcougar.lay333
-rw-r--r--src/mame/layout/wecleman.lay95
-rw-r--r--src/mame/layout/whousetc.lay848
-rw-r--r--src/mame/layout/wicat.lay193
-rw-r--r--src/mame/layout/wico.lay156
-rw-r--r--src/mame/layout/wikwin.lay361
-rw-r--r--src/mame/layout/wildbill.lay325
-rw-r--r--src/mame/layout/wildfire.lay133
-rw-r--r--src/mame/layout/wildone.lay360
-rw-r--r--src/mame/layout/winbingo.lay159
-rw-r--r--src/mame/layout/wizways.lay365
-rw-r--r--src/mame/layout/wldarrow.lay96
-rw-r--r--src/mame/layout/wnpost.lay361
-rw-r--r--src/mame/layout/wotw.lay69
-rw-r--r--src/mame/layout/wpc_an.lay142
-rw-r--r--src/mame/layout/wswan.lay17
-rw-r--r--src/mame/layout/wtigerc.lay389
-rw-r--r--src/mame/layout/x68000.lay178
-rw-r--r--src/mame/layout/xl25.lay171
-rw-r--r--src/mame/layout/yeno_301xl.lay503
-rw-r--r--src/mame/layout/yeno_416xl.lay556
-rw-r--r--src/mame/layout/yeno_532xl.lay558
-rw-r--r--src/mame/layout/yosakdon.lay65
-rw-r--r--src/mame/layout/yukongl5.lay730
-rw-r--r--src/mame/layout/z80clock.lay36
-rw-r--r--src/mame/layout/z80dev.lay43
-rw-r--r--src/mame/layout/z80ne.lay614
-rw-r--r--src/mame/layout/z80net.lay633
-rw-r--r--src/mame/layout/z80netb.lay59
-rw-r--r--src/mame/layout/z80netf.lay672
-rw-r--r--src/mame/layout/zac_1.lay152
-rw-r--r--src/mame/layout/zac_2.lay164
-rw-r--r--src/mame/layout/zac_proto.lay60
-rw-r--r--src/mame/layout/zapcomputer.lay47
-rw-r--r--src/mame/layout/zodiac.lay224
-rw-r--r--src/mame/layout/zoo.lay175
-rw-r--r--src/mame/layout/zoomer.lay309
-rw-r--r--src/mame/leapfrog/iquest.cpp779
-rw-r--r--src/mame/leapfrog/leappad.cpp281
-rw-r--r--src/mame/leapfrog/leapster.cpp598
-rw-r--r--src/mame/leapfrog/leapster_explorer.cpp112
-rw-r--r--src/mame/learsiegler/adm11.cpp202
-rw-r--r--src/mame/learsiegler/adm23.cpp91
-rw-r--r--src/mame/learsiegler/adm31.cpp518
-rw-r--r--src/mame/learsiegler/adm36.cpp205
-rw-r--r--src/mame/liberty/freedom120.cpp154
-rw-r--r--src/mame/liberty/freedom200.cpp425
-rw-r--r--src/mame/liberty/freedom220_kbd.cpp298
-rw-r--r--src/mame/liberty/freedom220_kbd.h65
-rw-r--r--src/mame/linn/linndrum.cpp1893
-rw-r--r--src/mame/lsi/m3.cpp677
-rw-r--r--src/mame/lsi/octo_kbd.cpp257
-rw-r--r--src/mame/lsi/octo_kbd.h34
-rw-r--r--src/mame/lsi/octopus.cpp1036
-rw-r--r--src/mame/luxor/abc1600.cpp1217
-rw-r--r--src/mame/luxor/abc1600_mmu.cpp638
-rw-r--r--src/mame/luxor/abc1600_mmu.h156
-rw-r--r--src/mame/luxor/abc1600_v.cpp1288
-rw-r--r--src/mame/luxor/abc1600_v.h156
-rw-r--r--src/mame/luxor/abc80.cpp888
-rw-r--r--src/mame/luxor/abc80.h265
-rw-r--r--src/mame/luxor/abc80_v.cpp370
-rw-r--r--src/mame/luxor/abc80kb.cpp211
-rw-r--r--src/mame/luxor/abc80kb.h56
-rw-r--r--src/mame/luxor/abc80x.cpp2562
-rw-r--r--src/mame/luxor/abc80x.h358
-rw-r--r--src/mame/luxor/x37.cpp651
-rw-r--r--src/mame/luxor/x37_sasi.cpp293
-rw-r--r--src/mame/luxor/x37_sasi.h84
-rw-r--r--src/mame/machine/acitya.c205
-rw-r--r--src/mame/machine/ajax.c216
-rw-r--r--src/mame/machine/amiga.c1815
-rw-r--r--src/mame/machine/archimds.c693
-rw-r--r--src/mame/machine/arkanoid.c581
-rw-r--r--src/mame/machine/asic65.c754
-rw-r--r--src/mame/machine/asic65.h18
-rw-r--r--src/mame/machine/asteroid.c139
-rw-r--r--src/mame/machine/atari.c375
-rw-r--r--src/mame/machine/atari_vg.c154
-rw-r--r--src/mame/machine/atari_vg.h29
-rw-r--r--src/mame/machine/atarifb.c349
-rw-r--r--src/mame/machine/atarigen.c1700
-rw-r--r--src/mame/machine/atarigen.h289
-rw-r--r--src/mame/machine/bagman.c244
-rw-r--r--src/mame/machine/balsente.c1282
-rw-r--r--src/mame/machine/beezer.c123
-rw-r--r--src/mame/machine/bfm_bd1.c567
-rw-r--r--src/mame/machine/bfm_bd1.h22
-rw-r--r--src/mame/machine/bigevglf.c108
-rw-r--r--src/mame/machine/bonzeadv.c468
-rw-r--r--src/mame/machine/bsktball.c166
-rw-r--r--src/mame/machine/btime.c93
-rw-r--r--src/mame/machine/bublbobl.c509
-rw-r--r--src/mame/machine/buggychl.c156
-rw-r--r--src/mame/machine/carpolo.c610
-rw-r--r--src/mame/machine/cchasm.c15
-rw-r--r--src/mame/machine/cchip.c184
-rw-r--r--src/mame/machine/cclimber.c148
-rw-r--r--src/mame/machine/chaknpop.c167
-rw-r--r--src/mame/machine/copsnrob.c60
-rw-r--r--src/mame/machine/cps2crpt.c988
-rw-r--r--src/mame/machine/cubocd32.c863
-rw-r--r--src/mame/machine/daikaiju.c348
-rw-r--r--src/mame/machine/dc.c1229
-rw-r--r--src/mame/machine/dec0.c621
-rw-r--r--src/mame/machine/deco102.c93
-rw-r--r--src/mame/machine/deco156.c134
-rw-r--r--src/mame/machine/decocass.c2201
-rw-r--r--src/mame/machine/decocass.h115
-rw-r--r--src/mame/machine/decocrpt.c664
-rw-r--r--src/mame/machine/decoprot.c1785
-rw-r--r--src/mame/machine/docastle.c85
-rw-r--r--src/mame/machine/fd1089.c436
-rw-r--r--src/mame/machine/fd1089.h4
-rw-r--r--src/mame/machine/fd1094.c843
-rw-r--r--src/mame/machine/fd1094.h15
-rw-r--r--src/mame/machine/fddebug.c2428
-rw-r--r--src/mame/machine/fddebug.h4
-rw-r--r--src/mame/machine/flstory.c272
-rw-r--r--src/mame/machine/gaelco2.c337
-rw-r--r--src/mame/machine/gaelcrpt.c152
-rw-r--r--src/mame/machine/galaxold.c414
-rw-r--r--src/mame/machine/gaplus.c49
-rw-r--r--src/mame/machine/gdcrypt.c382
-rw-r--r--src/mame/machine/harddriv.c1920
-rw-r--r--src/mame/machine/irem_cpu.c649
-rw-r--r--src/mame/machine/irem_cpu.h18
-rw-r--r--src/mame/machine/irobot.c1023
-rw-r--r--src/mame/machine/jackal.c85
-rw-r--r--src/mame/machine/jumpshot.c56
-rw-r--r--src/mame/machine/kabuki.c216
-rw-r--r--src/mame/machine/kaneko16.c852
-rw-r--r--src/mame/machine/kanekotb.h286
-rw-r--r--src/mame/machine/konami1.c58
-rw-r--r--src/mame/machine/konami1.h1
-rw-r--r--src/mame/machine/konamigx.c2148
-rw-r--r--src/mame/machine/konamigx.h93
-rw-r--r--src/mame/machine/konamiic.c126
-rw-r--r--src/mame/machine/konamiic.h10
-rw-r--r--src/mame/machine/konppc.c686
-rw-r--r--src/mame/machine/konppc.h44
-rw-r--r--src/mame/machine/leland.c1491
-rw-r--r--src/mame/machine/lkage.c140
-rw-r--r--src/mame/machine/lsasquad.c193
-rw-r--r--src/mame/machine/m68kfmly.c217
-rw-r--r--src/mame/machine/m68kfmly.h18
-rw-r--r--src/mame/machine/maniach.c137
-rw-r--r--src/mame/machine/mathbox.c365
-rw-r--r--src/mame/machine/mathbox.h30
-rw-r--r--src/mame/machine/mb14241.c50
-rw-r--r--src/mame/machine/mb14241.h16
-rw-r--r--src/mame/machine/mc8123.c419
-rw-r--r--src/mame/machine/mc8123.h5
-rw-r--r--src/mame/machine/mcr.c998
-rw-r--r--src/mame/machine/meters.c113
-rw-r--r--src/mame/machine/meters.h33
-rw-r--r--src/mame/machine/mexico86.c339
-rw-r--r--src/mame/machine/mhavoc.c346
-rw-r--r--src/mame/machine/midtunit.c629
-rw-r--r--src/mame/machine/midwayic.c1093
-rw-r--r--src/mame/machine/midwayic.h55
-rw-r--r--src/mame/machine/midwunit.c710
-rw-r--r--src/mame/machine/midyunit.c588
-rw-r--r--src/mame/machine/model1.c2175
-rw-r--r--src/mame/machine/model3.c364
-rw-r--r--src/mame/machine/mw8080bw.c125
-rw-r--r--src/mame/machine/n64.c1807
-rw-r--r--src/mame/machine/namco06.c302
-rw-r--r--src/mame/machine/namco06.h38
-rw-r--r--src/mame/machine/namco50.c303
-rw-r--r--src/mame/machine/namco50.h19
-rw-r--r--src/mame/machine/namco51.c441
-rw-r--r--src/mame/machine/namco51.h29
-rw-r--r--src/mame/machine/namco53.c205
-rw-r--r--src/mame/machine/namco53.h30
-rw-r--r--src/mame/machine/namcoio.c539
-rw-r--r--src/mame/machine/namcoio.h32
-rw-r--r--src/mame/machine/namcond1.c113
-rw-r--r--src/mame/machine/namcos1.c1459
-rw-r--r--src/mame/machine/namcos2.c858
-rw-r--r--src/mame/machine/naomi.c80
-rw-r--r--src/mame/machine/naomibd.c877
-rw-r--r--src/mame/machine/nb1413m3.c773
-rw-r--r--src/mame/machine/neoboot.c1125
-rw-r--r--src/mame/machine/neocrypt.c1587
-rw-r--r--src/mame/machine/neoprot.c528
-rw-r--r--src/mame/machine/nitedrvr.c303
-rw-r--r--src/mame/machine/nmk004.c1072
-rw-r--r--src/mame/machine/nmk004.h4
-rw-r--r--src/mame/machine/nmk112.c64
-rw-r--r--src/mame/machine/nmk112.h9
-rw-r--r--src/mame/machine/nycaptor.c128
-rw-r--r--src/mame/machine/opwolf.c757
-rw-r--r--src/mame/machine/pacplus.c56
-rw-r--r--src/mame/machine/pcecommn.c73
-rw-r--r--src/mame/machine/pcecommn.h34
-rw-r--r--src/mame/machine/pckeybrd.c1264
-rw-r--r--src/mame/machine/pcshare.c138
-rw-r--r--src/mame/machine/pgmcrypt.c947
-rw-r--r--src/mame/machine/pgmprot.c798
-rw-r--r--src/mame/machine/pitnrun.c153
-rw-r--r--src/mame/machine/playch10.c980
-rw-r--r--src/mame/machine/psx.c1652
-rw-r--r--src/mame/machine/pxa255.h503
-rw-r--r--src/mame/machine/qix.c550
-rw-r--r--src/mame/machine/r2crypt.c281
-rw-r--r--src/mame/machine/rainbow.c832
-rw-r--r--src/mame/machine/retofinv.c138
-rw-r--r--src/mame/machine/s16fd.c228
-rw-r--r--src/mame/machine/s24fd.c184
-rw-r--r--src/mame/machine/scramble.c657
-rw-r--r--src/mame/machine/scudsp.c1277
-rw-r--r--src/mame/machine/scudsp.h9
-rw-r--r--src/mame/machine/segacrpt.c1427
-rw-r--r--src/mame/machine/segacrpt.h35
-rw-r--r--src/mame/machine/segag80.c347
-rw-r--r--src/mame/machine/segaic16.c707
-rw-r--r--src/mame/machine/segaic16.h57
-rw-r--r--src/mame/machine/segas24.c109
-rw-r--r--src/mame/machine/segas32.c402
-rw-r--r--src/mame/machine/seibuspi.c400
-rw-r--r--src/mame/machine/seicop.c1998
-rw-r--r--src/mame/machine/seicop.h20
-rw-r--r--src/mame/machine/simpsons.c143
-rw-r--r--src/mame/machine/slapfght.c812
-rw-r--r--src/mame/machine/slapstic.c1191
-rw-r--r--src/mame/machine/slikshot.c671
-rw-r--r--src/mame/machine/snes.c2081
-rw-r--r--src/mame/machine/snesdsp1.c1618
-rw-r--r--src/mame/machine/snesdsp2.c363
-rw-r--r--src/mame/machine/snesobc1.c106
-rw-r--r--src/mame/machine/spisprit.c283
-rw-r--r--src/mame/machine/starwars.c493
-rw-r--r--src/mame/machine/steppers.c749
-rw-r--r--src/mame/machine/steppers.h56
-rw-r--r--src/mame/machine/stfight.c256
-rw-r--r--src/mame/machine/stvcd.c1862
-rw-r--r--src/mame/machine/stvcd.h18
-rw-r--r--src/mame/machine/stvprot.c519
-rw-r--r--src/mame/machine/stvprot.h8
-rw-r--r--src/mame/machine/subs.c186
-rw-r--r--src/mame/machine/system16.c74
-rw-r--r--src/mame/machine/tait8741.c535
-rw-r--r--src/mame/machine/tait8741.h53
-rw-r--r--src/mame/machine/taitosj.c315
-rw-r--r--src/mame/machine/tatsumi.c375
-rw-r--r--src/mame/machine/tecmosys.c199
-rw-r--r--src/mame/machine/theglobp.c259
-rw-r--r--src/mame/machine/ticket.c185
-rw-r--r--src/mame/machine/ticket.h41
-rw-r--r--src/mame/machine/tnzs.c726
-rw-r--r--src/mame/machine/toaplan1.c347
-rw-r--r--src/mame/machine/twincobr.c369
-rw-r--r--src/mame/machine/tx1.c1440
-rw-r--r--src/mame/machine/vertigo.c243
-rw-r--r--src/mame/machine/volfied.c496
-rw-r--r--src/mame/machine/vsnes.c1379
-rw-r--r--src/mame/machine/williams.c994
-rw-r--r--src/mame/machine/wrally.c52
-rw-r--r--src/mame/machine/xevious.c192
-rw-r--r--src/mame/machine/znsec.c181
-rw-r--r--src/mame/machine/znsec.h5
-rw-r--r--src/mame/machine/zs01.c690
-rw-r--r--src/mame/machine/zs01.h25
-rw-r--r--src/mame/makerbot/replicator.cpp830
-rw-r--r--src/mame/mame.cpp24
-rw-r--r--src/mame/mame.lst49550
-rw-r--r--src/mame/mame.mak1846
-rw-r--r--src/mame/mamedriv.c9614
-rw-r--r--src/mame/matic/barata.cpp348
-rw-r--r--src/mame/matsushita/duet16.cpp466
-rw-r--r--src/mame/matsushita/jr100.cpp432
-rw-r--r--src/mame/matsushita/jr200.cpp666
-rw-r--r--src/mame/matsushita/kn5000.cpp732
-rw-r--r--src/mame/matsushita/kn5000_cpanel.cpp913
-rw-r--r--src/mame/matsushita/kn5000_cpanel.h124
-rw-r--r--src/mame/matsushita/myb3k.cpp1079
-rw-r--r--src/mame/mattel/aquarius.cpp536
-rw-r--r--src/mame/mattel/aquarius.h101
-rw-r--r--src/mame/mattel/aquarius_v.cpp103
-rw-r--r--src/mame/mattel/chess.cpp247
-rw-r--r--src/mame/mattel/intv.cpp651
-rw-r--r--src/mame/mattel/intv.h152
-rw-r--r--src/mame/mattel/intv_m.cpp720
-rw-r--r--src/mame/mattel/intv_v.cpp88
-rw-r--r--src/mame/mattel/juicebox.cpp366
-rw-r--r--src/mame/mattel/pixtermu.cpp546
-rw-r--r--src/mame/mattel/stic.cpp1329
-rw-r--r--src/mame/mattel/stic.h185
-rw-r--r--src/mame/maygay/maygay1b.cpp868
-rw-r--r--src/mame/maygay/maygay1b.h149
-rw-r--r--src/mame/maygay/maygay1bsw.cpp3544
-rw-r--r--src/mame/maygay/maygayep.cpp8080
-rw-r--r--src/mame/maygay/maygayew.cpp820
-rw-r--r--src/mame/maygay/maygayv1.cpp1256
-rw-r--r--src/mame/maygay/mmm.cpp216
-rw-r--r--src/mame/mc/mc68000.cpp578
-rw-r--r--src/mame/mc/mccpm.cpp261
-rw-r--r--src/mame/mchester/ssem.cpp687
-rw-r--r--src/mame/meadows/lazercmd.cpp911
-rw-r--r--src/mame/meadows/meadows.cpp1146
-rw-r--r--src/mame/meadows/meadwttl.cpp174
-rw-r--r--src/mame/meadows/warpsped.cpp388
-rw-r--r--src/mame/memotech/mtx.cpp516
-rw-r--r--src/mame/memotech/mtx.h142
-rw-r--r--src/mame/memotech/mtx_m.cpp570
-rw-r--r--src/mame/mera/ec7915.cpp98
-rw-r--r--src/mame/mera/konin.cpp161
-rw-r--r--src/mame/mera/m79152pc.cpp371
-rw-r--r--src/mame/mera/vdm7932x.cpp148
-rw-r--r--src/mame/merit/merit.cpp3229
-rw-r--r--src/mame/merit/merit3xx.cpp1501
-rw-r--r--src/mame/merit/meritm.cpp2634
-rw-r--r--src/mame/merit/merits.cpp154
-rw-r--r--src/mame/merit/meritsdx.cpp88
-rw-r--r--src/mame/merit/mgames.cpp697
-rw-r--r--src/mame/merit/mtouchxl.cpp515
-rw-r--r--src/mame/merit/pubtimed.cpp108
-rw-r--r--src/mame/metro/hyprduel.cpp534
-rw-r--r--src/mame/metro/metro.cpp5501
-rw-r--r--src/mame/metro/metro.h325
-rw-r--r--src/mame/metro/metro_v.cpp66
-rw-r--r--src/mame/metro/rabbit.cpp1094
-rw-r--r--src/mame/metro/tmmjprd.cpp781
-rw-r--r--src/mame/mg1/kbd.cpp250
-rw-r--r--src/mame/mg1/kbd.h39
-rw-r--r--src/mame/mg1/mg1.cpp625
-rw-r--r--src/mame/microcraft/dim68k.cpp519
-rw-r--r--src/mame/microcraft/dim68k_kbd.cpp230
-rw-r--r--src/mame/microcraft/dim68k_kbd.h66
-rw-r--r--src/mame/microkey/primo.cpp388
-rw-r--r--src/mame/microkey/primo.h92
-rw-r--r--src/mame/microkey/primo_m.cpp328
-rw-r--r--src/mame/microsoft/jazz.cpp495
-rw-r--r--src/mame/microsoft/mct_adr.cpp344
-rw-r--r--src/mame/microsoft/mct_adr.h164
-rw-r--r--src/mame/microsoft/xbox.cpp166
-rw-r--r--src/mame/microterm/ergo201.cpp189
-rw-r--r--src/mame/microterm/microterm_f8.cpp581
-rw-r--r--src/mame/microterm/mt420.cpp179
-rw-r--r--src/mame/microterm/mt440.cpp193
-rw-r--r--src/mame/microterm/mt5510.cpp124
-rw-r--r--src/mame/midcoin/24cdjuke.cpp333
-rw-r--r--src/mame/midcoin/wallc.cpp844
-rw-r--r--src/mame/midcoin/wink.cpp491
-rw-r--r--src/mame/midw8080/8080bw.cpp6285
-rw-r--r--src/mame/midw8080/8080bw.h696
-rw-r--r--src/mame/midw8080/8080bw_a.cpp1744
-rw-r--r--src/mame/midw8080/8080bw_a.h45
-rw-r--r--src/mame/midw8080/8080bw_v.cpp645
-rw-r--r--src/mame/midw8080/mw8080bw.cpp3313
-rw-r--r--src/mame/midw8080/mw8080bw.h504
-rw-r--r--src/mame/midw8080/mw8080bw_a.cpp4984
-rw-r--r--src/mame/midw8080/mw8080bw_a.h363
-rw-r--r--src/mame/midw8080/mw8080bw_v.cpp407
-rw-r--r--src/mame/midw8080/nl_280zzzap.cpp1097
-rw-r--r--src/mame/midw8080/nl_280zzzap.h13
-rw-r--r--src/mame/midw8080/nl_gunfight.cpp826
-rw-r--r--src/mame/midw8080/nl_gunfight.h12
-rw-r--r--src/mame/midw8080/rotaryf.cpp320
-rw-r--r--src/mame/midway/astrocde.cpp1897
-rw-r--r--src/mame/midway/astrocde.h284
-rw-r--r--src/mame/midway/astrocde_v.cpp1067
-rw-r--r--src/mame/midway/astrohome.cpp297
-rw-r--r--src/mame/midway/atlantis.cpp962
-rw-r--r--src/mame/midway/balsente.cpp3063
-rw-r--r--src/mame/midway/balsente.h212
-rw-r--r--src/mame/midway/balsente_m.cpp489
-rw-r--r--src/mame/midway/balsente_v.cpp199
-rw-r--r--src/mame/midway/cashline.cpp228
-rw-r--r--src/mame/midway/csd.cpp186
-rw-r--r--src/mame/midway/csd.h70
-rw-r--r--src/mame/midway/gridlee.cpp469
-rw-r--r--src/mame/midway/gridlee.h124
-rw-r--r--src/mame/midway/gridlee_a.cpp160
-rw-r--r--src/mame/midway/gridlee_v.cpp207
-rw-r--r--src/mame/midway/mcr.cpp3158
-rw-r--r--src/mame/midway/mcr.h241
-rw-r--r--src/mame/midway/mcr3.cpp1703
-rw-r--r--src/mame/midway/mcr3.h152
-rw-r--r--src/mame/midway/mcr3_v.cpp269
-rw-r--r--src/mame/midway/mcr68.cpp1989
-rw-r--r--src/mame/midway/mcr_m.cpp197
-rw-r--r--src/mame/midway/mcr_v.cpp411
-rw-r--r--src/mame/midway/midqslvr.cpp550
-rw-r--r--src/mame/midway/midtunit.cpp1846
-rw-r--r--src/mame/midway/midtunit.h144
-rw-r--r--src/mame/midway/midtunit_m.cpp599
-rw-r--r--src/mame/midway/midtunit_v.cpp1085
-rw-r--r--src/mame/midway/midtunit_v.h233
-rw-r--r--src/mame/midway/midtunit_v.ipp143
-rw-r--r--src/mame/midway/midtview.ipp280
-rw-r--r--src/mame/midway/midvunit.cpp2300
-rw-r--r--src/mame/midway/midvunit.h286
-rw-r--r--src/mame/midway/midvunit_v.cpp577
-rw-r--r--src/mame/midway/midway.cpp832
-rw-r--r--src/mame/midway/midway.h208
-rw-r--r--src/mame/midway/midwayic.cpp1252
-rw-r--r--src/mame/midway/midwayic.h242
-rw-r--r--src/mame/midway/midwayttl.cpp112
-rw-r--r--src/mame/midway/midwunit.cpp1798
-rw-r--r--src/mame/midway/midwunit.h92
-rw-r--r--src/mame/midway/midwunit_m.cpp394
-rw-r--r--src/mame/midway/midxunit.cpp925
-rw-r--r--src/mame/midway/midyunit.cpp3916
-rw-r--r--src/mame/midway/midyunit.h307
-rw-r--r--src/mame/midway/midyunit_m.cpp715
-rw-r--r--src/mame/midway/midyunit_v.cpp558
-rw-r--r--src/mame/midway/midzeus.cpp2004
-rw-r--r--src/mame/midway/midzeus.h205
-rw-r--r--src/mame/midway/midzeus_v.cpp1503
-rw-r--r--src/mame/midway/mw18w.cpp328
-rw-r--r--src/mame/midway/mwsub.cpp260
-rw-r--r--src/mame/midway/omegrace.cpp686
-rw-r--r--src/mame/midway/pinball2k.cpp766
-rw-r--r--src/mame/midway/predators.cpp953
-rw-r--r--src/mame/midway/seattle.cpp3077
-rw-r--r--src/mame/midway/sente6vb.cpp466
-rw-r--r--src/mame/midway/sente6vb.h84
-rw-r--r--src/mame/midway/spyhuntertec.cpp930
-rw-r--r--src/mame/midway/starrider.cpp1114
-rw-r--r--src/mame/midway/tmaster.cpp1261
-rw-r--r--src/mame/midway/vegas.cpp2842
-rw-r--r--src/mame/midway/williams.cpp4013
-rw-r--r--src/mame/midway/williams.h380
-rw-r--r--src/mame/midway/williams_m.cpp551
-rw-r--r--src/mame/midway/williams_v.cpp623
-rw-r--r--src/mame/midway/williamsblitter.cpp251
-rw-r--r--src/mame/midway/williamsblitter.h129
-rw-r--r--src/mame/midway/wmg.cpp590
-rw-r--r--src/mame/midway/zwackery.cpp602
-rw-r--r--src/mame/miltonbradley/grandmaster.cpp286
-rw-r--r--src/mame/miltonbradley/microvision.cpp515
-rw-r--r--src/mame/miltonbradley/milton.cpp311
-rw-r--r--src/mame/miltonbradley/vectrex.cpp251
-rw-r--r--src/mame/miltonbradley/vectrex.h188
-rw-r--r--src/mame/miltonbradley/vectrex_m.cpp341
-rw-r--r--src/mame/miltonbradley/vectrex_v.cpp425
-rw-r--r--src/mame/mips/mips.cpp71
-rw-r--r--src/mame/mips/mips.h8
-rw-r--r--src/mame/mips/mips_i2000.cpp713
-rw-r--r--src/mame/mips/mips_r3030.cpp549
-rw-r--r--src/mame/mips/mips_rambo.cpp360
-rw-r--r--src/mame/mips/mips_rambo.h147
-rw-r--r--src/mame/misc/39in1.cpp635
-rw-r--r--src/mame/misc/3do.cpp577
-rw-r--r--src/mame/misc/3do.h113
-rw-r--r--src/mame/misc/3do_amy.cpp150
-rw-r--r--src/mame/misc/3do_amy.h46
-rw-r--r--src/mame/misc/3do_clio.cpp759
-rw-r--r--src/mame/misc/3do_clio.h182
-rw-r--r--src/mame/misc/3do_m.cpp232
-rw-r--r--src/mame/misc/3do_madam.cpp1411
-rw-r--r--src/mame/misc/3do_madam.h225
-rw-r--r--src/mame/misc/3do_portfolio.cpp221
-rw-r--r--src/mame/misc/3do_portfolio.h12
-rw-r--r--src/mame/misc/4enlinea.cpp790
-rw-r--r--src/mame/misc/4enraya.cpp1166
-rw-r--r--src/mame/misc/a1supply.cpp161
-rw-r--r--src/mame/misc/ace_sp_reelctrl.cpp63
-rw-r--r--src/mame/misc/ace_sp_reelctrl.h54
-rw-r--r--src/mame/misc/acefruit.cpp792
-rw-r--r--src/mame/misc/aces1.cpp914
-rw-r--r--src/mame/misc/acesp.cpp4533
-rw-r--r--src/mame/misc/adi_unk_kbd.cpp318
-rw-r--r--src/mame/misc/adi_unk_kbd.h65
-rw-r--r--src/mame/misc/adi_vt52.cpp312
-rw-r--r--src/mame/misc/age_candy.cpp77
-rw-r--r--src/mame/misc/alinvade.cpp248
-rw-r--r--src/mame/misc/amaticmg.cpp1595
-rw-r--r--src/mame/misc/amerihok.cpp193
-rw-r--r--src/mame/misc/ampoker2.cpp1600
-rw-r--r--src/mame/misc/ampoker2.h61
-rw-r--r--src/mame/misc/ampoker2_v.cpp166
-rw-r--r--src/mame/misc/amspdwy.cpp578
-rw-r--r--src/mame/misc/amstarz80.cpp241
-rw-r--r--src/mame/misc/amusco.cpp681
-rw-r--r--src/mame/misc/amuzy.cpp560
-rw-r--r--src/mame/misc/anes.cpp836
-rw-r--r--src/mame/misc/arachnid.cpp566
-rw-r--r--src/mame/misc/artmagic.cpp1207
-rw-r--r--src/mame/misc/artmagic.h97
-rw-r--r--src/mame/misc/artmagic_v.cpp346
-rw-r--r--src/mame/misc/astrafr.cpp2370
-rw-r--r--src/mame/misc/atronic.cpp1765
-rw-r--r--src/mame/misc/attckufo.cpp174
-rw-r--r--src/mame/misc/avt.cpp1112
-rw-r--r--src/mame/misc/babysuprem.cpp368
-rw-r--r--src/mame/misc/bailey.cpp163
-rw-r--r--src/mame/misc/banpresto_bpsc68000.cpp502
-rw-r--r--src/mame/misc/beaminv.cpp415
-rw-r--r--src/mame/misc/beezer.cpp609
-rw-r--r--src/mame/misc/bingoman.cpp481
-rw-r--r--src/mame/misc/bingor.cpp1322
-rw-r--r--src/mame/misc/blitz68k.cpp3400
-rw-r--r--src/mame/misc/blocktax.cpp135
-rw-r--r--src/mame/misc/bntyhunt.cpp89
-rw-r--r--src/mame/misc/boramz80.cpp767
-rw-r--r--src/mame/misc/brglitz.cpp192
-rw-r--r--src/mame/misc/buster.cpp373
-rw-r--r--src/mame/misc/calomega.cpp6328
-rw-r--r--src/mame/misc/calomega.h164
-rw-r--r--src/mame/misc/calomega_v.cpp103
-rw-r--r--src/mame/misc/cardline.cpp382
-rw-r--r--src/mame/misc/carrera.cpp553
-rw-r--r--src/mame/misc/castle.cpp139
-rw-r--r--src/mame/misc/cb2001.cpp1881
-rw-r--r--src/mame/misc/chamrx1.cpp81
-rw-r--r--src/mame/misc/chance32.cpp548
-rw-r--r--src/mame/misc/changyu.cpp568
-rw-r--r--src/mame/misc/chicago.cpp150
-rw-r--r--src/mame/misc/chsuper.cpp642
-rw-r--r--src/mame/misc/cleartone.cpp110
-rw-r--r--src/mame/misc/clowndwn.cpp91
-rw-r--r--src/mame/misc/clpoker.cpp318
-rw-r--r--src/mame/misc/cocoloco.cpp565
-rw-r--r--src/mame/misc/coinmstr.cpp1620
-rw-r--r--src/mame/misc/coinmvga.cpp953
-rw-r--r--src/mame/misc/cointek.cpp433
-rw-r--r--src/mame/misc/comebaby.cpp367
-rw-r--r--src/mame/misc/compucranes.cpp182
-rw-r--r--src/mame/misc/coolpool.cpp1315
-rw-r--r--src/mame/misc/corona.cpp1800
-rw-r--r--src/mame/misc/cosmos_playc8f.cpp178
-rw-r--r--src/mame/misc/cowtipping.cpp128
-rw-r--r--src/mame/misc/crazybal.cpp161
-rw-r--r--src/mame/misc/cromptons.cpp170
-rw-r--r--src/mame/misc/crospuzl.cpp401
-rw-r--r--src/mame/misc/crystal.cpp855
-rw-r--r--src/mame/misc/ctvboy.cpp282
-rw-r--r--src/mame/misc/cubeqst.cpp777
-rw-r--r--src/mame/misc/cupidon.cpp188
-rw-r--r--src/mame/misc/cvs.cpp2046
-rw-r--r--src/mame/misc/cwheel.cpp57
-rw-r--r--src/mame/misc/cybertnk.cpp977
-rw-r--r--src/mame/misc/daphor32.cpp257
-rw-r--r--src/mame/misc/daryde.cpp193
-rw-r--r--src/mame/misc/dcheese.cpp787
-rw-r--r--src/mame/misc/dcheese.h98
-rw-r--r--src/mame/misc/dcheese_v.cpp301
-rw-r--r--src/mame/misc/ddz.cpp239
-rw-r--r--src/mame/misc/deecoseal.cpp170
-rw-r--r--src/mame/misc/dfruit.cpp353
-rw-r--r--src/mame/misc/dgpix.cpp971
-rw-r--r--src/mame/misc/diamondking.cpp418
-rw-r--r--src/mame/misc/discoboy.cpp562
-rw-r--r--src/mame/misc/dmainevent.cpp78
-rw-r--r--src/mame/misc/dominob.cpp371
-rw-r--r--src/mame/misc/dorachan.cpp297
-rw-r--r--src/mame/misc/drdmania.cpp232
-rw-r--r--src/mame/misc/dreamwld.cpp1275
-rw-r--r--src/mame/misc/ds2000.cpp353
-rw-r--r--src/mame/misc/dwarfd.cpp1007
-rw-r--r--src/mame/misc/dynadice.cpp325
-rw-r--r--src/mame/misc/dynamoah.cpp126
-rw-r--r--src/mame/misc/ecoinf1.cpp378
-rw-r--r--src/mame/misc/ecoinf2.cpp805
-rw-r--r--src/mame/misc/ecoinf3.cpp867
-rw-r--r--src/mame/misc/ecoinfr.cpp1706
-rw-r--r--src/mame/misc/efdt.cpp625
-rw-r--r--src/mame/misc/efdt.h78
-rw-r--r--src/mame/misc/efg8080.cpp326
-rw-r--r--src/mame/misc/electra.cpp149
-rw-r--r--src/mame/misc/enigma2.cpp844
-rw-r--r--src/mame/misc/epos.cpp1054
-rw-r--r--src/mame/misc/esd16.cpp2227
-rw-r--r--src/mame/misc/esh.cpp463
-rw-r--r--src/mame/misc/esripsys.cpp1551
-rw-r--r--src/mame/misc/esripsys.h146
-rw-r--r--src/mame/misc/esripsys_v.cpp369
-rw-r--r--src/mame/misc/ettrivia.cpp505
-rw-r--r--src/mame/misc/eva.cpp246
-rw-r--r--src/mame/misc/extrema.cpp474
-rw-r--r--src/mame/misc/ez2d.cpp229
-rw-r--r--src/mame/misc/falgas_m89.cpp359
-rw-r--r--src/mame/misc/fastinvaders.cpp783
-rw-r--r--src/mame/misc/fireball.cpp552
-rw-r--r--src/mame/misc/flipjack.cpp494
-rw-r--r--src/mame/misc/flower.cpp682
-rw-r--r--src/mame/misc/flower_a.cpp274
-rw-r--r--src/mame/misc/flower_a.h94
-rw-r--r--src/mame/misc/fortecar.cpp810
-rw-r--r--src/mame/misc/freekick.cpp1959
-rw-r--r--src/mame/misc/freeway.cpp284
-rw-r--r--src/mame/misc/fresh.cpp595
-rw-r--r--src/mame/misc/funeball.cpp65
-rw-r--r--src/mame/misc/fungames.cpp196
-rw-r--r--src/mame/misc/funkball.cpp834
-rw-r--r--src/mame/misc/galaxi.cpp516
-rw-r--r--src/mame/misc/galgame.cpp473
-rw-r--r--src/mame/misc/gambl186.cpp634
-rw-r--r--src/mame/misc/gameace.cpp550
-rw-r--r--src/mame/misc/gamemasters.cpp157
-rw-r--r--src/mame/misc/gammagic.cpp255
-rw-r--r--src/mame/misc/gamtor.cpp1929
-rw-r--r--src/mame/misc/gei.cpp2289
-rw-r--r--src/mame/misc/gfamily.cpp219
-rw-r--r--src/mame/misc/gi6809.cpp848
-rw-r--r--src/mame/misc/globalfr.cpp241
-rw-r--r--src/mame/misc/globalvr.cpp442
-rw-r--r--src/mame/misc/gluck2.cpp738
-rw-r--r--src/mame/misc/gms.cpp3653
-rw-r--r--src/mame/misc/goldngam.cpp684
-rw-r--r--src/mame/misc/goldnpkr.cpp15144
-rw-r--r--src/mame/misc/good.cpp340
-rw-r--r--src/mame/misc/gotcha.cpp576
-rw-r--r--src/mame/misc/gsspade.cpp96
-rw-r--r--src/mame/misc/gumbo.cpp523
-rw-r--r--src/mame/misc/gunpey.cpp1207
-rw-r--r--src/mame/misc/h01x.cpp639
-rw-r--r--src/mame/misc/haiwei.cpp263
-rw-r--r--src/mame/misc/hapyfish.cpp608
-rw-r--r--src/mame/misc/hazelgr.cpp124
-rw-r--r--src/mame/misc/hideseek.cpp169
-rw-r--r--src/mame/misc/highvdeo.cpp1770
-rw-r--r--src/mame/misc/hitpoker.cpp508
-rw-r--r--src/mame/misc/hobbyplay.cpp110
-rw-r--r--src/mame/misc/homedata.cpp1898
-rw-r--r--src/mame/misc/homedata.h229
-rw-r--r--src/mame/misc/homedata_v.cpp933
-rw-r--r--src/mame/misc/hotblock.cpp264
-rw-r--r--src/mame/misc/hotchili.cpp630
-rw-r--r--src/mame/misc/hotstuff.cpp134
-rw-r--r--src/mame/misc/houseball.cpp96
-rw-r--r--src/mame/misc/imolagp.cpp633
-rw-r--r--src/mame/misc/inder_sb.cpp190
-rw-r--r--src/mame/misc/inder_sb.h62
-rw-r--r--src/mame/misc/interflip8035.cpp1480
-rw-r--r--src/mame/misc/intrscti.cpp257
-rw-r--r--src/mame/misc/island.cpp85
-rw-r--r--src/mame/misc/istellar.cpp511
-rw-r--r--src/mame/misc/itgambl2.cpp1294
-rw-r--r--src/mame/misc/itgambl3.cpp531
-rw-r--r--src/mame/misc/itgamble.cpp703
-rw-r--r--src/mame/misc/jackhouse.cpp748
-rw-r--r--src/mame/misc/jackpool.cpp313
-rw-r--r--src/mame/misc/jackpot.cpp347
-rw-r--r--src/mame/misc/jaminator.cpp292
-rw-r--r--src/mame/misc/jokrwild.cpp523
-rw-r--r--src/mame/misc/joystand.cpp828
-rw-r--r--src/mame/misc/jubilee.cpp732
-rw-r--r--src/mame/misc/jungleyo.cpp1332
-rw-r--r--src/mame/misc/kas89.cpp851
-rw-r--r--src/mame/misc/katosmedz80.cpp623
-rw-r--r--src/mame/misc/kingpin.cpp373
-rw-r--r--src/mame/misc/ladyfrog.cpp402
-rw-r--r--src/mame/misc/ladyfrog.h97
-rw-r--r--src/mame/misc/ladyfrog_v.cpp154
-rw-r--r--src/mame/misc/laserbas.cpp541
-rw-r--r--src/mame/misc/laz_aftrshok.cpp259
-rw-r--r--src/mame/misc/laz_ribrac.cpp363
-rw-r--r--src/mame/misc/lependu.cpp817
-rw-r--r--src/mame/misc/limenko.cpp1278
-rw-r--r--src/mame/misc/ltcasino.cpp721
-rw-r--r--src/mame/misc/luckybal.cpp769
-rw-r--r--src/mame/misc/magic10.cpp2044
-rw-r--r--src/mame/misc/magicard.cpp2494
-rw-r--r--src/mame/misc/magicfly.cpp1150
-rw-r--r--src/mame/misc/magictg.cpp1037
-rw-r--r--src/mame/misc/magreel.cpp214
-rw-r--r--src/mame/misc/magtouch.cpp279
-rw-r--r--src/mame/misc/majorpkr.cpp1291
-rw-r--r--src/mame/misc/malzak.cpp593
-rw-r--r--src/mame/misc/marywu.cpp257
-rw-r--r--src/mame/misc/matrix.cpp171
-rw-r--r--src/mame/misc/mcatadv.cpp950
-rw-r--r--src/mame/misc/mcm70.cpp416
-rw-r--r--src/mame/misc/megaphx.cpp644
-rw-r--r--src/mame/misc/megaturbo.cpp295
-rw-r--r--src/mame/misc/menghong.cpp671
-rw-r--r--src/mame/misc/meyc8080.cpp744
-rw-r--r--src/mame/misc/meyc8088.cpp421
-rw-r--r--src/mame/misc/mgavegas.cpp604
-rw-r--r--src/mame/misc/micro3d.cpp800
-rw-r--r--src/mame/misc/micro3d.h204
-rw-r--r--src/mame/misc/micro3d_a.cpp288
-rw-r--r--src/mame/misc/micro3d_a.h79
-rw-r--r--src/mame/misc/micro3d_m.cpp511
-rw-r--r--src/mame/misc/micro3d_v.cpp751
-rw-r--r--src/mame/misc/microbox2.cpp391
-rw-r--r--src/mame/misc/microdar.cpp531
-rw-r--r--src/mame/misc/mil4000.cpp788
-rw-r--r--src/mame/misc/mindset.cpp1516
-rw-r--r--src/mame/misc/miniboy7.cpp1125
-rw-r--r--src/mame/misc/minivideo.cpp151
-rw-r--r--src/mame/misc/mirax.cpp645
-rw-r--r--src/mame/misc/mirderby.cpp715
-rw-r--r--src/mame/misc/miuchiz.cpp234
-rw-r--r--src/mame/misc/mjsenpu.cpp491
-rw-r--r--src/mame/misc/monon_color.cpp989
-rw-r--r--src/mame/misc/mosaic.cpp529
-rw-r--r--src/mame/misc/mpu12wbk.cpp1448
-rw-r--r--src/mame/misc/mtu130.cpp986
-rw-r--r--src/mame/misc/multfish.cpp5824
-rw-r--r--src/mame/misc/multfish.h129
-rw-r--r--src/mame/misc/multfish_boot.cpp2230
-rw-r--r--src/mame/misc/murogem.cpp343
-rw-r--r--src/mame/misc/murogmbl.cpp429
-rw-r--r--src/mame/misc/musclem.cpp372
-rw-r--r--src/mame/misc/nabupc.cpp530
-rw-r--r--src/mame/misc/nabupc_kbd.cpp350
-rw-r--r--src/mame/misc/nabupc_kbd.h65
-rw-r--r--src/mame/misc/ncarrera.cpp574
-rw-r--r--src/mame/misc/neomania.cpp123
-rw-r--r--src/mame/misc/neoprint.cpp1034
-rw-r--r--src/mame/misc/news.cpp290
-rw-r--r--src/mame/misc/nexus3d.cpp383
-rw-r--r--src/mame/misc/nibble.cpp414
-rw-r--r--src/mame/misc/nl_cocoloco.cpp54
-rw-r--r--src/mame/misc/nl_cocoloco.h6
-rw-r--r--src/mame/misc/nl_gi6809.cpp99
-rw-r--r--src/mame/misc/nl_gi6809.h13
-rw-r--r--src/mame/misc/norautp.cpp6856
-rw-r--r--src/mame/misc/notechan.cpp547
-rw-r--r--src/mame/misc/nsg6809.cpp112
-rw-r--r--src/mame/misc/nsmpoker.cpp478
-rw-r--r--src/mame/misc/odyssey.cpp285
-rw-r--r--src/mame/misc/oneshot.cpp920
-rw-r--r--src/mame/misc/opercoin.cpp148
-rw-r--r--src/mame/misc/pachifev.cpp400
-rw-r--r--src/mame/misc/paracaidista.cpp472
-rw-r--r--src/mame/misc/pasha2.cpp601
-rw-r--r--src/mame/misc/pass.cpp389
-rw-r--r--src/mame/misc/photon.cpp295
-rw-r--r--src/mame/misc/photon2.cpp434
-rw-r--r--src/mame/misc/piggypas.cpp399
-rw-r--r--src/mame/misc/pipeline.cpp469
-rw-r--r--src/mame/misc/pkscram.cpp364
-rw-r--r--src/mame/misc/playcenter.cpp142
-rw-r--r--src/mame/misc/plsonic4.cpp232
-rw-r--r--src/mame/misc/pmc.cpp108
-rw-r--r--src/mame/misc/pntnpuzl.cpp449
-rw-r--r--src/mame/misc/pntnpuzls.cpp308
-rw-r--r--src/mame/misc/poker72.cpp414
-rw-r--r--src/mame/misc/pokerout.cpp402
-rw-r--r--src/mame/misc/policetr.cpp761
-rw-r--r--src/mame/misc/policetr.h165
-rw-r--r--src/mame/misc/policetr_v.cpp321
-rw-r--r--src/mame/misc/potgoldu.cpp141
-rw-r--r--src/mame/misc/proconn.cpp1380
-rw-r--r--src/mame/misc/ps_m3.cpp485
-rw-r--r--src/mame/misc/psattack.cpp298
-rw-r--r--src/mame/misc/pse.cpp198
-rw-r--r--src/mame/misc/quizo.cpp265
-rw-r--r--src/mame/misc/quizpun2.cpp724
-rw-r--r--src/mame/misc/rawthrillspc.cpp151
-rw-r--r--src/mame/misc/rcorsair.cpp224
-rw-r--r--src/mame/misc/re900.cpp467
-rw-r--r--src/mame/misc/rgum.cpp363
-rw-r--r--src/mame/misc/roul.cpp364
-rw-r--r--src/mame/misc/rulechan.cpp815
-rw-r--r--src/mame/misc/sanremmg.cpp148
-rw-r--r--src/mame/misc/sanremo.cpp465
-rw-r--r--src/mame/misc/savquest.cpp533
-rw-r--r--src/mame/misc/scm_500.cpp103
-rw-r--r--src/mame/misc/shangkid.cpp1040
-rw-r--r--src/mame/misc/shangkid.h130
-rw-r--r--src/mame/misc/shangkid_v.cpp296
-rw-r--r--src/mame/misc/silverball.cpp265
-rw-r--r--src/mame/misc/skeetsht.cpp295
-rw-r--r--src/mame/misc/skyarmy.cpp377
-rw-r--r--src/mame/misc/sliver.cpp599
-rw-r--r--src/mame/misc/smd2144c.cpp142
-rw-r--r--src/mame/misc/smotor.cpp542
-rw-r--r--src/mame/misc/smsmcorp.cpp984
-rw-r--r--src/mame/misc/spcforce.cpp481
-rw-r--r--src/mame/misc/spdamjes.cpp154
-rw-r--r--src/mame/misc/spool99.cpp495
-rw-r--r--src/mame/misc/sshanghai.cpp685
-rw-r--r--src/mame/misc/startouch.cpp212
-rw-r--r--src/mame/misc/statriv2.cpp1867
-rw-r--r--src/mame/misc/stc3910.cpp392
-rw-r--r--src/mame/misc/stop.cpp109
-rw-r--r--src/mame/misc/strkzn.cpp90
-rw-r--r--src/mame/misc/sttechno.cpp625
-rw-r--r--src/mame/misc/stuntair.cpp603
-rw-r--r--src/mame/misc/su2000.cpp302
-rw-r--r--src/mame/misc/summit.cpp449
-rw-r--r--src/mame/misc/sumt8035.cpp269
-rw-r--r--src/mame/misc/tapatune.cpp663
-rw-r--r--src/mame/misc/tattack.cpp506
-rw-r--r--src/mame/misc/taxidriv.cpp627
-rw-r--r--src/mame/misc/teamjocs.cpp86
-rw-r--r--src/mame/misc/tecnodar.cpp363
-rw-r--r--src/mame/misc/thayers.cpp723
-rw-r--r--src/mame/misc/tickee.cpp1216
-rw-r--r--src/mame/misc/timelimt.cpp575
-rw-r--r--src/mame/misc/tmspoker.cpp710
-rw-r--r--src/mame/misc/tomsadvs.cpp109
-rw-r--r--src/mame/misc/toratora.cpp526
-rw-r--r--src/mame/misc/triton.cpp655
-rw-r--r--src/mame/misc/triviaquiz.cpp210
-rw-r--r--src/mame/misc/trivrus.cpp331
-rw-r--r--src/mame/misc/truco.cpp632
-rw-r--r--src/mame/misc/trucocl.cpp347
-rw-r--r--src/mame/misc/truesys.cpp118
-rw-r--r--src/mame/misc/trvmadns.cpp435
-rw-r--r--src/mame/misc/ttchamp.cpp702
-rw-r--r--src/mame/misc/tugboat.cpp569
-rw-r--r--src/mame/misc/tvg01.cpp334
-rw-r--r--src/mame/misc/twinbskt.cpp86
-rw-r--r--src/mame/misc/umipoker.cpp1052
-rw-r--r--src/mame/misc/unkgolf.cpp273
-rw-r--r--src/mame/misc/unkpoker.cpp192
-rw-r--r--src/mame/misc/unktop.cpp97
-rw-r--r--src/mame/misc/usbilliards.cpp143
-rw-r--r--src/mame/misc/usgames.cpp532
-rw-r--r--src/mame/misc/v0bowl.cpp177
-rw-r--r--src/mame/misc/vamphalf.cpp3465
-rw-r--r--src/mame/misc/vamphalf_prot.cpp420
-rw-r--r--src/mame/misc/vamphalf_prot.h77
-rw-r--r--src/mame/misc/vampire.cpp693
-rw-r--r--src/mame/misc/vcombat.cpp831
-rw-r--r--src/mame/misc/videoart.cpp418
-rw-r--r--src/mame/misc/videosaa.cpp553
-rw-r--r--src/mame/misc/vlc.cpp683
-rw-r--r--src/mame/misc/vlc34010.cpp233
-rw-r--r--src/mame/misc/vocalizer.cpp568
-rw-r--r--src/mame/misc/voyager.cpp115
-rw-r--r--src/mame/misc/vpoker.cpp612
-rw-r--r--src/mame/misc/vroulet.cpp346
-rw-r--r--src/mame/misc/whtm68k.cpp463
-rw-r--r--src/mame/misc/wildpkr.cpp616
-rw-r--r--src/mame/misc/winbingo.cpp121
-rw-r--r--src/mame/misc/wms.cpp685
-rw-r--r--src/mame/misc/wren.cpp680
-rw-r--r--src/mame/misc/xtom3d.cpp1022
-rw-r--r--src/mame/misc/xtom3d_piu10.cpp203
-rw-r--r--src/mame/misc/xtom3d_piu10.h53
-rw-r--r--src/mame/misc/xyonix.cpp459
-rw-r--r--src/mame/misc/yuvomz80.cpp172
-rw-r--r--src/mame/misc/z80ne.cpp1582
-rw-r--r--src/mame/mit/tx0.cpp1666
-rw-r--r--src/mame/mit/tx0.h331
-rw-r--r--src/mame/mit/tx0_v.cpp449
-rw-r--r--src/mame/mits/al8800b.cpp46
-rw-r--r--src/mame/mits/altair.cpp152
-rw-r--r--src/mame/mits/mits680b.cpp113
-rw-r--r--src/mame/mitsubishi/multi16.cpp204
-rw-r--r--src/mame/mitsubishi/multi8.cpp704
-rw-r--r--src/mame/mitsubishi/trium.cpp72
-rw-r--r--src/mame/modelracing/dribling.cpp635
-rw-r--r--src/mame/modelracing/nl_dribling.cpp622
-rw-r--r--src/mame/modelracing/nl_dribling.h10
-rw-r--r--src/mame/modelracing/sshot.cpp463
-rw-r--r--src/mame/modelracing/subhuntr.cpp388
-rw-r--r--src/mame/moog/memorymoog.cpp1128
-rw-r--r--src/mame/moog/nl_source.cpp105
-rw-r--r--src/mame/moog/nl_source.h12
-rw-r--r--src/mame/moog/source.cpp1074
-rw-r--r--src/mame/morrow/microdec.cpp278
-rw-r--r--src/mame/morrow/mpz80.cpp785
-rw-r--r--src/mame/morrow/mpz80.h103
-rw-r--r--src/mame/morrow/tricep.cpp148
-rw-r--r--src/mame/motorola/ampscarp.cpp57
-rw-r--r--src/mame/motorola/assist05.cpp136
-rw-r--r--src/mame/motorola/exorciser.cpp797
-rw-r--r--src/mame/motorola/exorterm.cpp64
-rw-r--r--src/mame/motorola/m6805evs.cpp128
-rw-r--r--src/mame/motorola/m68705prg.cpp292
-rw-r--r--src/mame/motorola/m8120.cpp39
-rw-r--r--src/mame/motorola/mekd1.cpp469
-rw-r--r--src/mame/motorola/mekd2.cpp429
-rw-r--r--src/mame/motorola/mekd3.cpp1076
-rw-r--r--src/mame/motorola/mekd4.cpp1084
-rw-r--r--src/mame/motorola/mekd5.cpp523
-rw-r--r--src/mame/motorola/mex68kecb.cpp236
-rw-r--r--src/mame/motorola/mvme162.cpp336
-rw-r--r--src/mame/motorola/powerstack.cpp47
-rw-r--r--src/mame/motorola/sys1121.cpp54
-rw-r--r--src/mame/motorola/uchroma68.cpp497
-rw-r--r--src/mame/msx/forte2.cpp219
-rw-r--r--src/mame/msx/msx.cpp830
-rw-r--r--src/mame/msx/msx.h370
-rw-r--r--src/mame/msx/msx1.cpp3812
-rw-r--r--src/mame/msx/msx1_bruc100.cpp120
-rw-r--r--src/mame/msx/msx1_v9938.cpp501
-rw-r--r--src/mame/msx/msx2.cpp4082
-rw-r--r--src/mame/msx/msx2p.cpp652
-rw-r--r--src/mame/msx/msx_kanji12.cpp88
-rw-r--r--src/mame/msx/msx_kanji12.h41
-rw-r--r--src/mame/msx/msx_keyboard.cpp787
-rw-r--r--src/mame/msx/msx_keyboard.h43
-rw-r--r--src/mame/msx/msx_matsushita.cpp149
-rw-r--r--src/mame/msx/msx_matsushita.h49
-rw-r--r--src/mame/msx/msx_s1985.cpp124
-rw-r--r--src/mame/msx/msx_s1985.h44
-rw-r--r--src/mame/msx/msx_s1990.cpp268
-rw-r--r--src/mame/msx/msx_s1990.h93
-rw-r--r--src/mame/msx/msx_switched.h16
-rw-r--r--src/mame/msx/msx_systemflags.cpp38
-rw-r--r--src/mame/msx/msx_systemflags.h45
-rw-r--r--src/mame/msx/msxtr.cpp463
-rw-r--r--src/mame/msx/pengadvb.cpp405
-rw-r--r--src/mame/msx/sangho.cpp588
-rw-r--r--src/mame/msx/sfkick.cpp523
-rw-r--r--src/mame/multitech/mkit09.cpp363
-rw-r--r--src/mame/multitech/mpf1.cpp528
-rw-r--r--src/mame/multitech/mpf1_88.cpp385
-rw-r--r--src/mame/multitech/mpf1p.cpp393
-rw-r--r--src/mame/mupid/mdisk.cpp275
-rw-r--r--src/mame/mupid/mupid2.cpp302
-rw-r--r--src/mame/nakajima/nakajies.cpp833
-rw-r--r--src/mame/namco/20pacgal.cpp583
-rw-r--r--src/mame/namco/20pacgal.h123
-rw-r--r--src/mame/namco/20pacgal_v.cpp402
-rw-r--r--src/mame/namco/30test.cpp294
-rw-r--r--src/mame/namco/baraduke.cpp864
-rw-r--r--src/mame/namco/bosco.cpp318
-rw-r--r--src/mame/namco/bosco.h57
-rw-r--r--src/mame/namco/c117.cpp219
-rw-r--r--src/mame/namco/c117.h78
-rw-r--r--src/mame/namco/cgang.cpp865
-rw-r--r--src/mame/namco/cswat.cpp371
-rw-r--r--src/mame/namco/dangbar.cpp162
-rw-r--r--src/mame/namco/digdug.cpp293
-rw-r--r--src/mame/namco/digdug.h58
-rw-r--r--src/mame/namco/dkmb.cpp163
-rw-r--r--src/mame/namco/ds5000.cpp400
-rw-r--r--src/mame/namco/ds6000.cpp232
-rw-r--r--src/mame/namco/funcube.cpp675
-rw-r--r--src/mame/namco/funcube_touchscreen.cpp92
-rw-r--r--src/mame/namco/funcube_touchscreen.h47
-rw-r--r--src/mame/namco/gal3.cpp939
-rw-r--r--src/mame/namco/galaga.cpp3604
-rw-r--r--src/mame/namco/galaga.h109
-rw-r--r--src/mame/namco/galaga_a.cpp368
-rw-r--r--src/mame/namco/galaga_v.cpp268
-rw-r--r--src/mame/namco/gaplus.cpp1043
-rw-r--r--src/mame/namco/gaplus.h156
-rw-r--r--src/mame/namco/gaplus_m.cpp49
-rw-r--r--src/mame/namco/gaplus_v.cpp417
-rw-r--r--src/mame/namco/geebee.cpp150
-rw-r--r--src/mame/namco/geebee.h38
-rw-r--r--src/mame/namco/kungfur.cpp342
-rw-r--r--src/mame/namco/mappy.cpp2082
-rw-r--r--src/mame/namco/mappy.h129
-rw-r--r--src/mame/namco/mappy_v.cpp549
-rw-r--r--src/mame/namco/md8412b_s23.cpp1063
-rw-r--r--src/mame/namco/md8412b_s23.h334
-rw-r--r--src/mame/namco/namco06.cpp273
-rw-r--r--src/mame/namco/namco06.h55
-rw-r--r--src/mame/namco/namco50.cpp255
-rw-r--r--src/mame/namco/namco50.h47
-rw-r--r--src/mame/namco/namco51.cpp188
-rw-r--r--src/mame/namco/namco51.h54
-rw-r--r--src/mame/namco/namco52.cpp189
-rw-r--r--src/mame/namco/namco52.h65
-rw-r--r--src/mame/namco/namco53.cpp154
-rw-r--r--src/mame/namco/namco53.h48
-rw-r--r--src/mame/namco/namco54.cpp153
-rw-r--r--src/mame/namco/namco54.h53
-rw-r--r--src/mame/namco/namco62.cpp71
-rw-r--r--src/mame/namco/namco62.h32
-rw-r--r--src/mame/namco/namco65.cpp195
-rw-r--r--src/mame/namco/namco65.h93
-rw-r--r--src/mame/namco/namco68.cpp130
-rw-r--r--src/mame/namco/namco68.h97
-rw-r--r--src/mame/namco/namco_c116.cpp182
-rw-r--r--src/mame/namco/namco_c116.h51
-rw-r--r--src/mame/namco/namco_c123tmap.cpp246
-rw-r--r--src/mame/namco/namco_c123tmap.h92
-rw-r--r--src/mame/namco/namco_c139.cpp112
-rw-r--r--src/mame/namco/namco_c139.h65
-rw-r--r--src/mame/namco/namco_c148.cpp218
-rw-r--r--src/mame/namco/namco_c148.h116
-rw-r--r--src/mame/namco/namco_c169roz.cpp278
-rw-r--r--src/mame/namco/namco_c169roz.h75
-rw-r--r--src/mame/namco/namco_c45road.cpp235
-rw-r--r--src/mame/namco/namco_c45road.h68
-rw-r--r--src/mame/namco/namco_cus4xtmap.cpp119
-rw-r--r--src/mame/namco/namco_cus4xtmap.h73
-rw-r--r--src/mame/namco/namco_dsp.cpp52
-rw-r--r--src/mame/namco/namco_dsp.h34
-rw-r--r--src/mame/namco/namco_settings.cpp65
-rw-r--r--src/mame/namco/namco_settings.h31
-rw-r--r--src/mame/namco/namcoeva.cpp440
-rw-r--r--src/mame/namco/namcofl.cpp966
-rw-r--r--src/mame/namco/namcoio.cpp547
-rw-r--r--src/mame/namco/namcoio.h92
-rw-r--r--src/mame/namco/namcoio_gearbox.cpp135
-rw-r--r--src/mame/namco/namcoio_gearbox.h43
-rw-r--r--src/mame/namco/namcomcu.cpp104
-rw-r--r--src/mame/namco/namcomcu.h63
-rw-r--r--src/mame/namco/namcona1.cpp1592
-rw-r--r--src/mame/namco/namcona1.h222
-rw-r--r--src/mame/namco/namcona1_v.cpp623
-rw-r--r--src/mame/namco/namconb1.cpp2066
-rw-r--r--src/mame/namco/namconb1.h193
-rw-r--r--src/mame/namco/namconb1_v.cpp216
-rw-r--r--src/mame/namco/namcond1.cpp697
-rw-r--r--src/mame/namco/namcops2.cpp1779
-rw-r--r--src/mame/namco/namcos1.cpp2938
-rw-r--r--src/mame/namco/namcos1.h180
-rw-r--r--src/mame/namco/namcos10.cpp4265
-rw-r--r--src/mame/namco/namcos10_exio.cpp319
-rw-r--r--src/mame/namco/namcos10_exio.h143
-rw-r--r--src/mame/namco/namcos11.cpp2090
-rw-r--r--src/mame/namco/namcos12.cpp3673
-rw-r--r--src/mame/namco/namcos12_cdxa.cpp335
-rw-r--r--src/mame/namco/namcos12_cdxa.h93
-rw-r--r--src/mame/namco/namcos14x.cpp637
-rw-r--r--src/mame/namco/namcos1_m.cpp1080
-rw-r--r--src/mame/namco/namcos1_sprite.cpp193
-rw-r--r--src/mame/namco/namcos1_sprite.h63
-rw-r--r--src/mame/namco/namcos1_v.cpp159
-rw-r--r--src/mame/namco/namcos1b.cpp153
-rw-r--r--src/mame/namco/namcos2.cpp5856
-rw-r--r--src/mame/namco/namcos2.h382
-rw-r--r--src/mame/namco/namcos21.cpp1134
-rw-r--r--src/mame/namco/namcos21_3d.cpp317
-rw-r--r--src/mame/namco/namcos21_3d.h76
-rw-r--r--src/mame/namco/namcos21_c67.cpp1305
-rw-r--r--src/mame/namco/namcos21_de.cpp840
-rw-r--r--src/mame/namco/namcos21_dsp.cpp300
-rw-r--r--src/mame/namco/namcos21_dsp.h83
-rw-r--r--src/mame/namco/namcos21_dsp_c67.cpp761
-rw-r--r--src/mame/namco/namcos21_dsp_c67.h148
-rw-r--r--src/mame/namco/namcos22.cpp6444
-rw-r--r--src/mame/namco/namcos22.h693
-rw-r--r--src/mame/namco/namcos22_v.cpp2717
-rw-r--r--src/mame/namco/namcos23.cpp8854
-rw-r--r--src/mame/namco/namcos2_m.cpp412
-rw-r--r--src/mame/namco/namcos2_roz.cpp297
-rw-r--r--src/mame/namco/namcos2_roz.h43
-rw-r--r--src/mame/namco/namcos2_sprite.cpp408
-rw-r--r--src/mame/namco/namcos2_sprite.h106
-rw-r--r--src/mame/namco/namcos2_v.cpp281
-rw-r--r--src/mame/namco/namcos6.cpp284
-rw-r--r--src/mame/namco/namcos86.cpp1762
-rw-r--r--src/mame/namco/namcos86.h110
-rw-r--r--src/mame/namco/namcos86_v.cpp199
-rw-r--r--src/mame/namco/nl_tankbatt.cpp165
-rw-r--r--src/mame/namco/nl_tankbatt.h10
-rw-r--r--src/mame/namco/ns10crypt.cpp372
-rw-r--r--src/mame/namco/ns10crypt.h156
-rw-r--r--src/mame/namco/ns11prot.cpp495
-rw-r--r--src/mame/namco/ns11prot.h147
-rw-r--r--src/mame/namco/pacland.cpp1155
-rw-r--r--src/mame/namco/polepos.cpp2581
-rw-r--r--src/mame/namco/polepos.h172
-rw-r--r--src/mame/namco/polepos_a.cpp532
-rw-r--r--src/mame/namco/polepos_a.h59
-rw-r--r--src/mame/namco/polepos_v.cpp460
-rw-r--r--src/mame/namco/quickncrash.cpp277
-rw-r--r--src/mame/namco/rallyx.cpp1561
-rw-r--r--src/mame/namco/rallyx.h131
-rw-r--r--src/mame/namco/rallyx_v.cpp664
-rw-r--r--src/mame/namco/rbowlorama.cpp149
-rw-r--r--src/mame/namco/sg_vga.cpp702
-rw-r--r--src/mame/namco/shootaway2.cpp129
-rw-r--r--src/mame/namco/skykid.cpp915
-rw-r--r--src/mame/namco/starfield_05xx.cpp686
-rw-r--r--src/mame/namco/starfield_05xx.h40
-rw-r--r--src/mame/namco/sweetland.cpp182
-rw-r--r--src/mame/namco/sweetland4.cpp214
-rw-r--r--src/mame/namco/tankbatt.cpp449
-rw-r--r--src/mame/namco/tceptor.cpp475
-rw-r--r--src/mame/namco/tceptor.h129
-rw-r--r--src/mame/namco/tceptor_v.cpp543
-rw-r--r--src/mame/namco/toypop.cpp816
-rw-r--r--src/mame/namco/turrett.cpp413
-rw-r--r--src/mame/namco/turrett.h152
-rw-r--r--src/mame/namco/turrett_a.cpp157
-rw-r--r--src/mame/namco/turrett_v.cpp406
-rw-r--r--src/mame/namco/vpx3220a.cpp818
-rw-r--r--src/mame/namco/vpx3220a.h103
-rw-r--r--src/mame/namco/wacky_gator.cpp355
-rw-r--r--src/mame/namco/warpwarp.cpp1100
-rw-r--r--src/mame/namco/warpwarp.h128
-rw-r--r--src/mame/namco/warpwarp_a.cpp249
-rw-r--r--src/mame/namco/warpwarp_a.h52
-rw-r--r--src/mame/namco/warpwarp_v.cpp268
-rw-r--r--src/mame/namco/xevious.cpp412
-rw-r--r--src/mame/namco/xevious.h109
-rw-r--r--src/mame/namco/xevious_m.cpp170
-rw-r--r--src/mame/namco/ygv608.cpp2430
-rw-r--r--src/mame/namco/ygv608.h313
-rw-r--r--src/mame/nasco/crgolf.cpp1010
-rw-r--r--src/mame/nasco/himesiki.cpp730
-rw-r--r--src/mame/nasco/suprgolf.cpp688
-rw-r--r--src/mame/nascom/nascom1.cpp943
-rw-r--r--src/mame/natsemi/icm3216.cpp533
-rw-r--r--src/mame/natsemi/ns32kdb.cpp288
-rw-r--r--src/mame/natsemi/ns5652.cpp97
-rw-r--r--src/mame/natsemi/sys16.cpp332
-rw-r--r--src/mame/ncd/bert_m.cpp96
-rw-r--r--src/mame/ncd/bert_m.h40
-rw-r--r--src/mame/ncd/ncd68k.cpp731
-rw-r--r--src/mame/ncd/ncd88k.cpp394
-rw-r--r--src/mame/ncd/ncdmips.cpp137
-rw-r--r--src/mame/ncd/ncdppc.cpp111
-rw-r--r--src/mame/ncr/dmv.cpp945
-rw-r--r--src/mame/ncr/dmv_keyb.cpp311
-rw-r--r--src/mame/ncr/dmv_keyb.h57
-rw-r--r--src/mame/nec/apc.cpp1008
-rw-r--r--src/mame/nec/bungo.cpp203
-rw-r--r--src/mame/nec/bungo.h48
-rw-r--r--src/mame/nec/ews4800.cpp176
-rw-r--r--src/mame/nec/pc100.cpp720
-rw-r--r--src/mame/nec/pc6001.cpp2020
-rw-r--r--src/mame/nec/pc6001.h389
-rw-r--r--src/mame/nec/pc6001_v.cpp587
-rw-r--r--src/mame/nec/pc8001.cpp904
-rw-r--r--src/mame/nec/pc8001.h175
-rw-r--r--src/mame/nec/pc8401a.cpp884
-rw-r--r--src/mame/nec/pc8801.cpp2057
-rw-r--r--src/mame/nec/pc8801.h324
-rw-r--r--src/mame/nec/pc88va.cpp1453
-rw-r--r--src/mame/nec/pc88va.h329
-rw-r--r--src/mame/nec/pc88va_sgp.cpp548
-rw-r--r--src/mame/nec/pc88va_sgp.h86
-rw-r--r--src/mame/nec/pc88va_v.cpp1890
-rw-r--r--src/mame/nec/pc9801.cpp3002
-rw-r--r--src/mame/nec/pc9801.h561
-rw-r--r--src/mame/nec/pc9801_epson.cpp631
-rw-r--r--src/mame/nec/pc9801_epson.h67
-rw-r--r--src/mame/nec/pc9801_v.cpp867
-rw-r--r--src/mame/nec/pc9821.cpp2051
-rw-r--r--src/mame/nec/pc9821.h248
-rw-r--r--src/mame/nec/pc98_cd.cpp54
-rw-r--r--src/mame/nec/pc98_cd.h23
-rw-r--r--src/mame/nec/pc98_kbd.cpp517
-rw-r--r--src/mame/nec/pc98_kbd.h94
-rw-r--r--src/mame/nec/pc98_memsw.cpp142
-rw-r--r--src/mame/nec/pc98_memsw.h37
-rw-r--r--src/mame/nec/pc98_sdip.cpp85
-rw-r--r--src/mame/nec/pc98_sdip.h49
-rw-r--r--src/mame/nec/pc98ha.cpp627
-rw-r--r--src/mame/nec/pc98ha.h114
-rw-r--r--src/mame/nec/pc_h98.cpp213
-rw-r--r--src/mame/nec/pce.cpp335
-rw-r--r--src/mame/nec/pce.h66
-rw-r--r--src/mame/nec/pce_cd.cpp1695
-rw-r--r--src/mame/nec/pce_cd.h219
-rw-r--r--src/mame/nec/pcfx.cpp359
-rw-r--r--src/mame/nec/piet1.cpp420
-rw-r--r--src/mame/nec/tk80bs.cpp243
-rw-r--r--src/mame/neogeo/midas.cpp932
-rw-r--r--src/mame/neogeo/neogeo.cpp12260
-rw-r--r--src/mame/neogeo/neogeo.h289
-rw-r--r--src/mame/neogeo/neogeo_spr.cpp790
-rw-r--r--src/mame/neogeo/neogeo_spr.h162
-rw-r--r--src/mame/neogeo/neogeo_v.cpp272
-rw-r--r--src/mame/neogeo/neogeocd.cpp1176
-rw-r--r--src/mame/neogeo/neopcb.cpp566
-rw-r--r--src/mame/neogeo/ng_memcard.cpp123
-rw-r--r--src/mame/neogeo/ng_memcard.h57
-rw-r--r--src/mame/netronics/elf.cpp258
-rw-r--r--src/mame/netronics/elf.h75
-rw-r--r--src/mame/netronics/exp85.cpp391
-rw-r--r--src/mame/newcrest/chess2001.cpp220
-rw-r--r--src/mame/newcrest/chess3008.cpp260
-rw-r--r--src/mame/newcrest/chess3008_lcd.cpp104
-rw-r--r--src/mame/newcrest/chess3008_lcd.h42
-rw-r--r--src/mame/newcrest/computachess.cpp245
-rw-r--r--src/mame/newcrest/computachess2.cpp206
-rw-r--r--src/mame/newcrest/dominator.cpp307
-rw-r--r--src/mame/newcrest/junior.cpp250
-rw-r--r--src/mame/newcrest/legend.cpp468
-rw-r--r--src/mame/newcrest/pchess.cpp220
-rw-r--r--src/mame/newcrest/professor.cpp255
-rw-r--r--src/mame/newcrest/royal.cpp366
-rw-r--r--src/mame/newcrest/senterprise.cpp328
-rw-r--r--src/mame/newcrest/sphinx40.cpp320
-rw-r--r--src/mame/next/next.cpp1296
-rw-r--r--src/mame/next/next.h221
-rw-r--r--src/mame/next/nextkbd.cpp454
-rw-r--r--src/mame/next/nextkbd.h112
-rw-r--r--src/mame/next/nextmo.cpp195
-rw-r--r--src/mame/next/nextmo.h58
-rw-r--r--src/mame/nichibutsu/armedf.cpp2062
-rw-r--r--src/mame/nichibutsu/armedf.h195
-rw-r--r--src/mame/nichibutsu/armedf_v.cpp397
-rw-r--r--src/mame/nichibutsu/cclimber.cpp4290
-rw-r--r--src/mame/nichibutsu/clshroad.cpp1032
-rw-r--r--src/mame/nichibutsu/cop01.cpp950
-rw-r--r--src/mame/nichibutsu/dacholer.cpp855
-rw-r--r--src/mame/nichibutsu/galivan.cpp1923
-rw-r--r--src/mame/nichibutsu/gomoku.cpp435
-rw-r--r--src/mame/nichibutsu/gomoku_a.cpp215
-rw-r--r--src/mame/nichibutsu/gomoku_a.h61
-rw-r--r--src/mame/nichibutsu/hrdvd.cpp1041
-rw-r--r--src/mame/nichibutsu/hyhoo.cpp606
-rw-r--r--src/mame/nichibutsu/jangou.cpp1389
-rw-r--r--src/mame/nichibutsu/magmax.cpp746
-rw-r--r--src/mame/nichibutsu/myvision.cpp249
-rw-r--r--src/mame/nichibutsu/nb1412m2.cpp355
-rw-r--r--src/mame/nichibutsu/nb1412m2.h90
-rw-r--r--src/mame/nichibutsu/nb1413m3.cpp869
-rw-r--r--src/mame/nichibutsu/nb1413m3.h207
-rw-r--r--src/mame/nichibutsu/nb1414m4.cpp370
-rw-r--r--src/mame/nichibutsu/nb1414m4.h41
-rw-r--r--src/mame/nichibutsu/nbmj8688.cpp4026
-rw-r--r--src/mame/nichibutsu/nbmj8688.h159
-rw-r--r--src/mame/nichibutsu/nbmj8688_v.cpp658
-rw-r--r--src/mame/nichibutsu/nbmj8891.cpp3631
-rw-r--r--src/mame/nichibutsu/nbmj8891.h155
-rw-r--r--src/mame/nichibutsu/nbmj8891_v.cpp602
-rw-r--r--src/mame/nichibutsu/nbmj8900.cpp397
-rw-r--r--src/mame/nichibutsu/nbmj8900.h91
-rw-r--r--src/mame/nichibutsu/nbmj8900_v.cpp453
-rw-r--r--src/mame/nichibutsu/nbmj8991.cpp2153
-rw-r--r--src/mame/nichibutsu/nbmj8991.h115
-rw-r--r--src/mame/nichibutsu/nbmj8991_v.cpp395
-rw-r--r--src/mame/nichibutsu/nbmj9195.cpp2578
-rw-r--r--src/mame/nichibutsu/nbmj9195.h195
-rw-r--r--src/mame/nichibutsu/nbmj9195_v.cpp540
-rw-r--r--src/mame/nichibutsu/nbmjctrl.cpp102
-rw-r--r--src/mame/nichibutsu/nbmjctrl.h16
-rw-r--r--src/mame/nichibutsu/nichild.cpp580
-rw-r--r--src/mame/nichibutsu/nichisnd.cpp145
-rw-r--r--src/mame/nichibutsu/nichisnd.h53
-rw-r--r--src/mame/nichibutsu/nightgal.cpp1350
-rw-r--r--src/mame/nichibutsu/nyanpai.cpp717
-rw-r--r--src/mame/nichibutsu/nyanpai.h180
-rw-r--r--src/mame/nichibutsu/nyanpai_v.cpp397
-rw-r--r--src/mame/nichibutsu/pastelg.cpp950
-rw-r--r--src/mame/nichibutsu/seicross.cpp947
-rw-r--r--src/mame/nichibutsu/shettle.cpp469
-rw-r--r--src/mame/nichibutsu/terracre.cpp1395
-rw-r--r--src/mame/nichibutsu/tubep.cpp1100
-rw-r--r--src/mame/nichibutsu/tubep.h169
-rw-r--r--src/mame/nichibutsu/tubep_v.cpp844
-rw-r--r--src/mame/nichibutsu/wiping.cpp575
-rw-r--r--src/mame/nichibutsu/wiping_a.cpp193
-rw-r--r--src/mame/nichibutsu/wiping_a.h56
-rw-r--r--src/mame/nintendo/aleck64.cpp1431
-rw-r--r--src/mame/nintendo/blockfvr.cpp290
-rw-r--r--src/mame/nintendo/cham24.cpp282
-rw-r--r--src/mame/nintendo/compmahj.cpp99
-rw-r--r--src/mame/nintendo/cothello.cpp313
-rw-r--r--src/mame/nintendo/cx4data.ipp200
-rw-r--r--src/mame/nintendo/cx4fn.ipp326
-rw-r--r--src/mame/nintendo/cx4oam.ipp307
-rw-r--r--src/mame/nintendo/cx4ops.ipp278
-rw-r--r--src/mame/nintendo/dkong.cpp3962
-rw-r--r--src/mame/nintendo/dkong.h371
-rw-r--r--src/mame/nintendo/dkong_a.cpp1444
-rw-r--r--src/mame/nintendo/dkong_v.cpp1024
-rw-r--r--src/mame/nintendo/famibox.cpp637
-rw-r--r--src/mame/nintendo/gamecube.cpp281
-rw-r--r--src/mame/nintendo/gb.cpp1306
-rw-r--r--src/mame/nintendo/gba.cpp1508
-rw-r--r--src/mame/nintendo/gba.h128
-rw-r--r--src/mame/nintendo/m6502_swap_op_d2_d7.cpp69
-rw-r--r--src/mame/nintendo/m6502_swap_op_d2_d7.h53
-rw-r--r--src/mame/nintendo/m6502_swap_op_d5_d6.cpp156
-rw-r--r--src/mame/nintendo/m6502_swap_op_d5_d6.h96
-rw-r--r--src/mame/nintendo/mario.cpp1125
-rw-r--r--src/mame/nintendo/mmagic.cpp410
-rw-r--r--src/mame/nintendo/multigam.cpp1417
-rw-r--r--src/mame/nintendo/n64.cpp515
-rw-r--r--src/mame/nintendo/n64.h423
-rw-r--r--src/mame/nintendo/n64_gateway.cpp381
-rw-r--r--src/mame/nintendo/n64_m.cpp2782
-rw-r--r--src/mame/nintendo/n64_v.cpp4227
-rw-r--r--src/mame/nintendo/n64_v.h402
-rw-r--r--src/mame/nintendo/n64types.h345
-rw-r--r--src/mame/nintendo/n8080.cpp1474
-rw-r--r--src/mame/nintendo/n8080_a.cpp520
-rw-r--r--src/mame/nintendo/n8080_a.h47
-rw-r--r--src/mame/nintendo/nds.cpp1007
-rw-r--r--src/mame/nintendo/nds.h116
-rw-r--r--src/mame/nintendo/nes.cpp805
-rw-r--r--src/mame/nintendo/nes_arcade_bl.cpp341
-rw-r--r--src/mame/nintendo/nes_clone.cpp1604
-rw-r--r--src/mame/nintendo/nes_m8.cpp848
-rw-r--r--src/mame/nintendo/nes_m82.cpp235
-rw-r--r--src/mame/nintendo/nes_sh6578.cpp861
-rw-r--r--src/mame/nintendo/nes_vt02_vt03.cpp1704
-rw-r--r--src/mame/nintendo/nes_vt09.cpp598
-rw-r--r--src/mame/nintendo/nes_vt09_soc.cpp41
-rw-r--r--src/mame/nintendo/nes_vt09_soc.h40
-rw-r--r--src/mame/nintendo/nes_vt32.cpp578
-rw-r--r--src/mame/nintendo/nes_vt32_soc.cpp481
-rw-r--r--src/mame/nintendo/nes_vt32_soc.h76
-rw-r--r--src/mame/nintendo/nes_vt369_vtunknown.cpp1997
-rw-r--r--src/mame/nintendo/nes_vt369_vtunknown_soc.cpp988
-rw-r--r--src/mame/nintendo/nes_vt369_vtunknown_soc.h210
-rw-r--r--src/mame/nintendo/nes_vt42xx.cpp618
-rw-r--r--src/mame/nintendo/nes_vt42xx_soc.cpp202
-rw-r--r--src/mame/nintendo/nes_vt42xx_soc.h58
-rw-r--r--src/mame/nintendo/nes_vt4ffx_soc.cpp510
-rw-r--r--src/mame/nintendo/nes_vt4ffx_soc.h141
-rw-r--r--src/mame/nintendo/nes_vt_soc.cpp1270
-rw-r--r--src/mame/nintendo/nes_vt_soc.h261
-rw-r--r--src/mame/nintendo/nl_mario.cpp317
-rw-r--r--src/mame/nintendo/nl_mario.h4
-rw-r--r--src/mame/nintendo/nl_popeye.cpp95
-rw-r--r--src/mame/nintendo/nl_popeye.h6
-rw-r--r--src/mame/nintendo/nss.cpp1112
-rw-r--r--src/mame/nintendo/pin64.cpp503
-rw-r--r--src/mame/nintendo/pin64.h180
-rw-r--r--src/mame/nintendo/playch10.cpp3069
-rw-r--r--src/mame/nintendo/pokemini.cpp1735
-rw-r--r--src/mame/nintendo/popeye.cpp934
-rw-r--r--src/mame/nintendo/popeye.h173
-rw-r--r--src/mame/nintendo/popeye_v.cpp434
-rw-r--r--src/mame/nintendo/punchout.cpp1329
-rw-r--r--src/mame/nintendo/punchout.h112
-rw-r--r--src/mame/nintendo/punchout_v.cpp378
-rw-r--r--src/mame/nintendo/rdpblend.cpp462
-rw-r--r--src/mame/nintendo/rdpblend.h70
-rw-r--r--src/mame/nintendo/rdpfiltr.ipp617
-rw-r--r--src/mame/nintendo/rdptpipe.cpp1019
-rw-r--r--src/mame/nintendo/rdptpipe.h167
-rw-r--r--src/mame/nintendo/rp2a03_vtscr.cpp92
-rw-r--r--src/mame/nintendo/rp2a03_vtscr.h58
-rw-r--r--src/mame/nintendo/sfcbox.cpp590
-rw-r--r--src/mame/nintendo/snes.cpp1420
-rw-r--r--src/mame/nintendo/snes.h458
-rw-r--r--src/mame/nintendo/snes_m.cpp1500
-rw-r--r--src/mame/nintendo/snesb.cpp2036
-rw-r--r--src/mame/nintendo/snesb51.cpp417
-rw-r--r--src/mame/nintendo/snescx4.cpp248
-rw-r--r--src/mame/nintendo/snescx4.h29
-rw-r--r--src/mame/nintendo/spacefb.cpp1148
-rw-r--r--src/mame/nintendo/vboy.cpp1293
-rw-r--r--src/mame/nintendo/vsnes.cpp3669
-rw-r--r--src/mame/nintendo/vt1682.cpp6672
-rw-r--r--src/mame/nintendo/vt1682_alu.cpp328
-rw-r--r--src/mame/nintendo/vt1682_alu.h47
-rw-r--r--src/mame/nintendo/vt1682_io.cpp287
-rw-r--r--src/mame/nintendo/vt1682_io.h75
-rw-r--r--src/mame/nintendo/vt1682_timer.cpp207
-rw-r--r--src/mame/nintendo/vt1682_timer.h57
-rw-r--r--src/mame/nintendo/vt1682_uio.cpp128
-rw-r--r--src/mame/nintendo/vt1682_uio.h56
-rw-r--r--src/mame/nintendo/vt369_adpcm.cpp46
-rw-r--r--src/mame/nintendo/vt369_adpcm.h52
-rw-r--r--src/mame/nintendo/vt_menu_protection.cpp117
-rw-r--r--src/mame/nintendo/vt_menu_protection.h38
-rw-r--r--src/mame/nintendo/vt_menu_protection_lxcap.cpp113
-rw-r--r--src/mame/nintendo/vt_menu_protection_lxcap.h36
-rw-r--r--src/mame/nix/fitfight.cpp1050
-rw-r--r--src/mame/nix/fitfight.h95
-rw-r--r--src/mame/nix/fitfight_v.cpp161
-rw-r--r--src/mame/nix/pirates.cpp643
-rw-r--r--src/mame/nl.flt85
-rw-r--r--src/mame/nmk/cultures.cpp489
-rw-r--r--src/mame/nmk/ddealer.cpp498
-rw-r--r--src/mame/nmk/macrossp.cpp1170
-rw-r--r--src/mame/nmk/nmk004.cpp153
-rw-r--r--src/mame/nmk/nmk004.h80
-rw-r--r--src/mame/nmk/nmk16.cpp10818
-rw-r--r--src/mame/nmk/nmk16.h455
-rw-r--r--src/mame/nmk/nmk16_v.cpp564
-rw-r--r--src/mame/nmk/nmk16spr.cpp270
-rw-r--r--src/mame/nmk/nmk16spr.h54
-rw-r--r--src/mame/nmk/nmk214.cpp213
-rw-r--r--src/mame/nmk/nmk214.h54
-rw-r--r--src/mame/nmk/nmk_irq.cpp252
-rw-r--r--src/mame/nmk/nmk_irq.h66
-rw-r--r--src/mame/nmk/nmkmedal.cpp522
-rw-r--r--src/mame/nmk/quizdna.cpp830
-rw-r--r--src/mame/nmk/quizpani.cpp507
-rw-r--r--src/mame/nokia/dbox.cpp664
-rw-r--r--src/mame/nokia/mikromik.cpp754
-rw-r--r--src/mame/nokia/mikromik.h188
-rw-r--r--src/mame/nokia/mikromik_v.cpp171
-rw-r--r--src/mame/nokia/mikromikko2.cpp397
-rw-r--r--src/mame/nokia/mm1kb.cpp267
-rw-r--r--src/mame/nokia/mm1kb.h65
-rw-r--r--src/mame/nokia/nokia_3310.cpp882
-rw-r--r--src/mame/northstar/horizon.cpp280
-rw-r--r--src/mame/novadesitec/novadesitec_fr002.cpp143
-rw-r--r--src/mame/novadesitec/novadesitec_fr004.cpp163
-rw-r--r--src/mame/novadesitec/novadesitec_fr009.cpp122
-rw-r--r--src/mame/novag/accord.cpp235
-rw-r--r--src/mame/novag/cexpert.cpp259
-rw-r--r--src/mame/novag/cforte.cpp297
-rw-r--r--src/mame/novag/cnchess.cpp246
-rw-r--r--src/mame/novag/const.cpp524
-rw-r--r--src/mame/novag/constjr.cpp240
-rw-r--r--src/mame/novag/diablo.cpp392
-rw-r--r--src/mame/novag/diamond.cpp538
-rw-r--r--src/mame/novag/emerclp.cpp391
-rw-r--r--src/mame/novag/gomoku.cpp248
-rw-r--r--src/mame/novag/mentor16.cpp315
-rw-r--r--src/mame/novag/micro.cpp246
-rw-r--r--src/mame/novag/micro2.cpp235
-rw-r--r--src/mame/novag/primo.cpp540
-rw-r--r--src/mame/novag/robotadv.cpp571
-rw-r--r--src/mame/novag/sapphire.cpp586
-rw-r--r--src/mame/novag/savant.cpp438
-rw-r--r--src/mame/novag/sdiamond.cpp377
-rw-r--r--src/mame/novag/sexpert.cpp603
-rw-r--r--src/mame/novag/vip.cpp429
-rw-r--r--src/mame/novag/zircon2.cpp334
-rw-r--r--src/mame/novation/basssta.cpp187
-rw-r--r--src/mame/novation/drumsta.cpp78
-rw-r--r--src/mame/oberheim/dmx.cpp1625
-rw-r--r--src/mame/oberheim/ob8.cpp446
-rw-r--r--src/mame/oberheim/xpander.cpp1152
-rw-r--r--src/mame/olivetti/att6300p.cpp1065
-rw-r--r--src/mame/olivetti/att6300p_fdc.cpp74
-rw-r--r--src/mame/olivetti/att6300p_fdc.h29
-rw-r--r--src/mame/olivetti/att6300p_mmu.cpp337
-rw-r--r--src/mame/olivetti/att6300p_mmu.h88
-rw-r--r--src/mame/olivetti/celint2k.cpp375
-rw-r--r--src/mame/olivetti/m20.cpp855
-rw-r--r--src/mame/olivetti/m20_8086.cpp118
-rw-r--r--src/mame/olivetti/m20_8086.h54
-rw-r--r--src/mame/olivetti/m20_kbd.cpp231
-rw-r--r--src/mame/olivetti/m20_kbd.h29
-rw-r--r--src/mame/olivetti/m24.cpp678
-rw-r--r--src/mame/olivetti/m24_kbd.cpp385
-rw-r--r--src/mame/olivetti/m24_kbd.h58
-rw-r--r--src/mame/olivetti/m24_z8000.cpp224
-rw-r--r--src/mame/olivetti/m24_z8000.h64
-rw-r--r--src/mame/olivetti/olivpc1.cpp218
-rw-r--r--src/mame/olympia/dday.cpp732
-rw-r--r--src/mame/olympia/lbeach.cpp427
-rw-r--r--src/mame/olympia/monzagp.cpp619
-rw-r--r--src/mame/olympia/portrait.cpp677
-rw-r--r--src/mame/olympia/vega.cpp888
-rw-r--r--src/mame/olympiaint/olyboss.cpp604
-rw-r--r--src/mame/olympiaint/olytext.cpp199
-rw-r--r--src/mame/olympiaint/peoplepc.cpp359
-rw-r--r--src/mame/omnibyte/msbc1.cpp143
-rw-r--r--src/mame/omnibyte/ob68k1a.cpp257
-rw-r--r--src/mame/omnibyte/ob68k1a.h63
-rw-r--r--src/mame/omori/battlex.cpp599
-rw-r--r--src/mame/omori/carjmbre.cpp446
-rw-r--r--src/mame/omori/popper.cpp607
-rw-r--r--src/mame/omori/spaceg.cpp601
-rw-r--r--src/mame/omori/yakyuken.cpp344
-rw-r--r--src/mame/omron/luna_68k.cpp455
-rw-r--r--src/mame/omron/luna_68k_bm.cpp74
-rw-r--r--src/mame/omron/luna_68k_bm.h39
-rw-r--r--src/mame/omron/luna_68k_cmc.cpp74
-rw-r--r--src/mame/omron/luna_68k_cmc.h40
-rw-r--r--src/mame/omron/luna_68k_gpu.cpp764
-rw-r--r--src/mame/omron/luna_68k_gpu.h136
-rw-r--r--src/mame/omron/luna_68k_ioc.cpp355
-rw-r--r--src/mame/omron/luna_68k_ioc.h94
-rw-r--r--src/mame/omron/luna_68k_video.cpp55
-rw-r--r--src/mame/omron/luna_68k_video.h51
-rw-r--r--src/mame/omron/luna_88k.cpp997
-rw-r--r--src/mame/omron/luna_kbd.cpp275
-rw-r--r--src/mame/omron/luna_kbd.h58
-rw-r--r--src/mame/openuni/hektor.cpp625
-rw-r--r--src/mame/orca/akazukin.cpp344
-rw-r--r--src/mame/orca/espial.cpp872
-rw-r--r--src/mame/orca/funkybee.cpp609
-rw-r--r--src/mame/orca/kyugo.cpp1905
-rw-r--r--src/mame/orca/marineb.cpp1440
-rw-r--r--src/mame/orca/orca40c.cpp290
-rw-r--r--src/mame/orca/orca40c.h79
-rw-r--r--src/mame/orca/sub.cpp564
-rw-r--r--src/mame/orca/vastar.cpp747
-rw-r--r--src/mame/orca/vastar_viddev.cpp291
-rw-r--r--src/mame/orca/vastar_viddev.h104
-rw-r--r--src/mame/orca/zodiack.cpp822
-rw-r--r--src/mame/orla/hk1000.cpp163
-rw-r--r--src/mame/orla/xm200.cpp64
-rw-r--r--src/mame/osborne/osbexec.cpp626
-rw-r--r--src/mame/osborne/osborne1.cpp1116
-rw-r--r--src/mame/osborne/vixen.cpp913
-rw-r--r--src/mame/osi/osi.cpp948
-rw-r--r--src/mame/osi/osi.h160
-rw-r--r--src/mame/osi/osi_v.cpp180
-rw-r--r--src/mame/pacific/mrflea.cpp526
-rw-r--r--src/mame/pacific/thief.cpp990
-rw-r--r--src/mame/pacman/jrpacman.cpp420
-rw-r--r--src/mame/pacman/jumpshot.cpp51
-rw-r--r--src/mame/pacman/jumpshot.h2
-rw-r--r--src/mame/pacman/pacman.cpp9173
-rw-r--r--src/mame/pacman/pacman.h371
-rw-r--r--src/mame/pacman/pacman_m.cpp219
-rw-r--r--src/mame/pacman/pacman_v.cpp709
-rw-r--r--src/mame/pacman/pacplus.cpp51
-rw-r--r--src/mame/pacman/pacplus.h2
-rw-r--r--src/mame/pacman/pengo.cpp800
-rw-r--r--src/mame/pacman/schick.cpp792
-rw-r--r--src/mame/paia/fatman.cpp792
-rw-r--r--src/mame/paia/midi2cv8.cpp541
-rw-r--r--src/mame/palm/palm.cpp1008
-rw-r--r--src/mame/palm/palm_dbg.ipp1185
-rw-r--r--src/mame/palm/palmz22.cpp354
-rw-r--r--src/mame/pc/README.md52
-rw-r--r--src/mame/pc/agro.cpp89
-rw-r--r--src/mame/pc/asst128.cpp160
-rw-r--r--src/mame/pc/at.cpp5914
-rw-r--r--src/mame/pc/atpci.cpp271
-rw-r--r--src/mame/pc/champ2.cpp225
-rw-r--r--src/mame/pc/compc.cpp294
-rw-r--r--src/mame/pc/conliner.cpp106
-rw-r--r--src/mame/pc/ct486.cpp264
-rw-r--r--src/mame/pc/dawg.cpp131
-rw-r--r--src/mame/pc/ec184x.cpp351
-rw-r--r--src/mame/pc/europc.cpp529
-rw-r--r--src/mame/pc/europc_kbd.cpp307
-rw-r--r--src/mame/pc/europc_kbd.h70
-rw-r--r--src/mame/pc/filetto.cpp431
-rw-r--r--src/mame/pc/fruitpc.cpp188
-rw-r--r--src/mame/pc/genpc.cpp335
-rw-r--r--src/mame/pc/ibmpc.cpp597
-rw-r--r--src/mame/pc/ibmpcjr.cpp790
-rw-r--r--src/mame/pc/iskr103x.cpp139
-rw-r--r--src/mame/pc/kb_7007_3.h129
-rw-r--r--src/mame/pc/kb_poisk1.h241
-rw-r--r--src/mame/pc/mc1502.cpp486
-rw-r--r--src/mame/pc/mdartstr.cpp718
-rw-r--r--src/mame/pc/megapc.cpp215
-rw-r--r--src/mame/pc/nforcepc.cpp1282
-rw-r--r--src/mame/pc/nforcepc.h332
-rw-r--r--src/mame/pc/pangofun.cpp295
-rw-r--r--src/mame/pc/paokaipc.cpp258
-rw-r--r--src/mame/pc/pc.cpp2462
-rw-r--r--src/mame/pc/pc_t1t.cpp1379
-rw-r--r--src/mame/pc/pc_t1t.h242
-rw-r--r--src/mame/pc/pcat_dyn.cpp289
-rw-r--r--src/mame/pc/pcat_nit.cpp471
-rw-r--r--src/mame/pc/pcipc.cpp918
-rw-r--r--src/mame/pc/pcipc_sis.cpp508
-rw-r--r--src/mame/pc/pcipc_via.cpp483
-rw-r--r--src/mame/pc/play4texash.cpp97
-rw-r--r--src/mame/pc/poisk1.cpp771
-rw-r--r--src/mame/pc/przone.cpp323
-rw-r--r--src/mame/pc/ps2.cpp310
-rw-r--r--src/mame/pc/pulltrig.cpp189
-rw-r--r--src/mame/pc/quakeat.cpp248
-rw-r--r--src/mame/pc/queen.cpp319
-rw-r--r--src/mame/pc/scatsx.cpp197
-rw-r--r--src/mame/pc/seawolfnm.cpp87
-rw-r--r--src/mame/pc/sis630.cpp460
-rw-r--r--src/mame/pc/sshuffle.cpp96
-rw-r--r--src/mame/pc/tandy1t.cpp1214
-rw-r--r--src/mame/pc/teradrive.cpp1097
-rw-r--r--src/mame/pc/tetriskr.cpp281
-rw-r--r--src/mame/pc/tosh1000.cpp317
-rw-r--r--src/mame/pc/tosh1000_bram.cpp89
-rw-r--r--src/mame/pc/tosh1000_bram.h47
-rw-r--r--src/mame/pce/ggconnie.cpp517
-rw-r--r--src/mame/pce/paranoia.cpp207
-rw-r--r--src/mame/pce/pcecommn.cpp104
-rw-r--r--src/mame/pce/pcecommn.h72
-rw-r--r--src/mame/pce/tourvis.cpp448
-rw-r--r--src/mame/pce/uapce.cpp389
-rw-r--r--src/mame/philips/cdi.cpp945
-rw-r--r--src/mame/philips/cdi.h132
-rw-r--r--src/mame/philips/cdicdic.cpp1409
-rw-r--r--src/mame/philips/cdicdic.h231
-rw-r--r--src/mame/philips/cdislavehle.cpp470
-rw-r--r--src/mame/philips/cdislavehle.h104
-rw-r--r--src/mame/philips/mcd212.cpp1229
-rw-r--r--src/mame/philips/mcd212.h285
-rw-r--r--src/mame/philips/minitel_2_rpic.cpp603
-rw-r--r--src/mame/philips/odyssey2.cpp946
-rw-r--r--src/mame/philips/p2000t.cpp734
-rw-r--r--src/mame/philips/patgen.cpp423
-rw-r--r--src/mame/philips/philipsbo.cpp267
-rw-r--r--src/mame/philips/vg5k.cpp479
-rw-r--r--src/mame/philips/yes.cpp91
-rw-r--r--src/mame/phoenix/naughtyb.cpp922
-rw-r--r--src/mame/phoenix/naughtyb.h78
-rw-r--r--src/mame/phoenix/naughtyb_v.cpp251
-rw-r--r--src/mame/phoenix/phoenix.cpp1830
-rw-r--r--src/mame/phoenix/phoenix.h92
-rw-r--r--src/mame/phoenix/phoenix_a.cpp535
-rw-r--r--src/mame/phoenix/phoenix_a.h62
-rw-r--r--src/mame/phoenix/phoenix_v.cpp439
-rw-r--r--src/mame/phoenix/pleiads.cpp712
-rw-r--r--src/mame/phoenix/pleiads.h130
-rw-r--r--src/mame/phoenix/safarir.cpp501
-rw-r--r--src/mame/pinball/allied.cpp786
-rw-r--r--src/mame/pinball/alvg.cpp1064
-rw-r--r--src/mame/pinball/atari_4x4.cpp120
-rw-r--r--src/mame/pinball/atari_s1.cpp618
-rw-r--r--src/mame/pinball/atari_s2.cpp587
-rw-r--r--src/mame/pinball/barni.cpp314
-rw-r--r--src/mame/pinball/bingo.cpp351
-rw-r--r--src/mame/pinball/by17.cpp1167
-rw-r--r--src/mame/pinball/by35.cpp2956
-rw-r--r--src/mame/pinball/by6803.cpp909
-rw-r--r--src/mame/pinball/by68701.cpp159
-rw-r--r--src/mame/pinball/byvid.cpp921
-rw-r--r--src/mame/pinball/capcom.cpp438
-rw-r--r--src/mame/pinball/criter75.cpp131
-rw-r--r--src/mame/pinball/de_2.cpp1024
-rw-r--r--src/mame/pinball/de_3.cpp2260
-rw-r--r--src/mame/pinball/decodmd1.cpp338
-rw-r--r--src/mame/pinball/decodmd1.h83
-rw-r--r--src/mame/pinball/decodmd2.cpp195
-rw-r--r--src/mame/pinball/decodmd2.h65
-rw-r--r--src/mame/pinball/decodmd3.cpp190
-rw-r--r--src/mame/pinball/decodmd3.h59
-rw-r--r--src/mame/pinball/decopincpu.cpp341
-rw-r--r--src/mame/pinball/decopincpu.h180
-rw-r--r--src/mame/pinball/flicker.cpp437
-rw-r--r--src/mame/pinball/g627.cpp399
-rw-r--r--src/mame/pinball/genpin.cpp20
-rw-r--r--src/mame/pinball/genpin.h50
-rw-r--r--src/mame/pinball/gp_1.cpp590
-rw-r--r--src/mame/pinball/gp_2.cpp858
-rw-r--r--src/mame/pinball/gts1.cpp1102
-rw-r--r--src/mame/pinball/gts3.cpp679
-rw-r--r--src/mame/pinball/gts3a.cpp1475
-rw-r--r--src/mame/pinball/gts80.cpp955
-rw-r--r--src/mame/pinball/gts80a.cpp997
-rw-r--r--src/mame/pinball/gts80b.cpp2290
-rw-r--r--src/mame/pinball/hankin.cpp661
-rw-r--r--src/mame/pinball/icecold.cpp457
-rw-r--r--src/mame/pinball/idsa.cpp413
-rw-r--r--src/mame/pinball/inder.cpp1729
-rw-r--r--src/mame/pinball/inderp.cpp398
-rw-r--r--src/mame/pinball/jeutel.cpp538
-rw-r--r--src/mame/pinball/joctronic.cpp519
-rw-r--r--src/mame/pinball/jp.cpp758
-rw-r--r--src/mame/pinball/jvh.cpp253
-rw-r--r--src/mame/pinball/kissproto.cpp93
-rw-r--r--src/mame/pinball/lancelot.cpp218
-rw-r--r--src/mame/pinball/lckydraw.cpp431
-rw-r--r--src/mame/pinball/ltd.cpp839
-rw-r--r--src/mame/pinball/macp.cpp494
-rw-r--r--src/mame/pinball/mephistp.cpp342
-rw-r--r--src/mame/pinball/micropin.cpp572
-rw-r--r--src/mame/pinball/missamer.cpp563
-rw-r--r--src/mame/pinball/mrgame.cpp982
-rw-r--r--src/mame/pinball/newcanasta.cpp92
-rw-r--r--src/mame/pinball/nsm.cpp484
-rw-r--r--src/mame/pinball/peyper.cpp880
-rw-r--r--src/mame/pinball/pinsnd88.cpp257
-rw-r--r--src/mame/pinball/pinsnd88.h72
-rw-r--r--src/mame/pinball/play_1.cpp684
-rw-r--r--src/mame/pinball/play_2.cpp655
-rw-r--r--src/mame/pinball/play_3.cpp935
-rw-r--r--src/mame/pinball/recel.cpp565
-rw-r--r--src/mame/pinball/rowamet.cpp329
-rw-r--r--src/mame/pinball/s11.cpp718
-rw-r--r--src/mame/pinball/s11.h244
-rw-r--r--src/mame/pinball/s11a.cpp549
-rw-r--r--src/mame/pinball/s11b.cpp1788
-rw-r--r--src/mame/pinball/s11c.cpp813
-rw-r--r--src/mame/pinball/s3.cpp731
-rw-r--r--src/mame/pinball/s4.cpp607
-rw-r--r--src/mame/pinball/s6.cpp791
-rw-r--r--src/mame/pinball/s7.cpp1143
-rw-r--r--src/mame/pinball/s8.cpp726
-rw-r--r--src/mame/pinball/s9.cpp497
-rw-r--r--src/mame/pinball/sam.cpp1345
-rw-r--r--src/mame/pinball/sleic.cpp378
-rw-r--r--src/mame/pinball/spectra.cpp322
-rw-r--r--src/mame/pinball/spike.cpp106
-rw-r--r--src/mame/pinball/spinb.cpp1425
-rw-r--r--src/mame/pinball/spirit76.cpp387
-rw-r--r--src/mame/pinball/st_mp100.cpp997
-rw-r--r--src/mame/pinball/st_mp200.cpp1165
-rw-r--r--src/mame/pinball/stargame.cpp473
-rw-r--r--src/mame/pinball/supstarf.cpp285
-rw-r--r--src/mame/pinball/taito.cpp1248
-rw-r--r--src/mame/pinball/techno.cpp432
-rw-r--r--src/mame/pinball/vd.cpp358
-rw-r--r--src/mame/pinball/whitestar.cpp9552
-rw-r--r--src/mame/pinball/wico.cpp528
-rw-r--r--src/mame/pinball/wms_shuffle.cpp799
-rw-r--r--src/mame/pinball/wpc.cpp233
-rw-r--r--src/mame/pinball/wpc.h145
-rw-r--r--src/mame/pinball/wpc_95.cpp3281
-rw-r--r--src/mame/pinball/wpc_an.cpp838
-rw-r--r--src/mame/pinball/wpc_dcs.cpp961
-rw-r--r--src/mame/pinball/wpc_dmd.cpp196
-rw-r--r--src/mame/pinball/wpc_dmd.h50
-rw-r--r--src/mame/pinball/wpc_dot.cpp716
-rw-r--r--src/mame/pinball/wpc_dot.h101
-rw-r--r--src/mame/pinball/wpc_flip1.cpp296
-rw-r--r--src/mame/pinball/wpc_flip2.cpp982
-rw-r--r--src/mame/pinball/wpc_lamp.cpp84
-rw-r--r--src/mame/pinball/wpc_lamp.h39
-rw-r--r--src/mame/pinball/wpc_out.cpp155
-rw-r--r--src/mame/pinball/wpc_out.h56
-rw-r--r--src/mame/pinball/wpc_pic.cpp141
-rw-r--r--src/mame/pinball/wpc_pic.h37
-rw-r--r--src/mame/pinball/wpc_s.cpp3140
-rw-r--r--src/mame/pinball/wpc_shift.cpp79
-rw-r--r--src/mame/pinball/wpc_shift.h37
-rw-r--r--src/mame/pinball/wpcsnd.cpp206
-rw-r--r--src/mame/pinball/wpcsnd.h69
-rw-r--r--src/mame/pinball/zac_1.cpp971
-rw-r--r--src/mame/pinball/zac_2.cpp1372
-rw-r--r--src/mame/pinball/zac_proto.cpp390
-rw-r--r--src/mame/pinball/zpinball.cpp333
-rw-r--r--src/mame/pitronics/beta.cpp392
-rw-r--r--src/mame/playmark/drtomy.cpp392
-rw-r--r--src/mame/playmark/playmark.cpp1980
-rw-r--r--src/mame/playmark/playmark.h253
-rw-r--r--src/mame/playmark/playmark_v.cpp530
-rw-r--r--src/mame/playmark/powerbal.cpp919
-rw-r--r--src/mame/playmark/sderby.cpp1481
-rw-r--r--src/mame/playmark/sslam.cpp934
-rw-r--r--src/mame/playmark/sslam.h116
-rw-r--r--src/mame/playmark/sslam_v.cpp205
-rw-r--r--src/mame/poly88/poly88.cpp225
-rw-r--r--src/mame/poly88/poly88.h88
-rw-r--r--src/mame/poly88/poly88_m.cpp314
-rw-r--r--src/mame/positron/positron.cpp959
-rw-r--r--src/mame/promat/1945kiii.cpp868
-rw-r--r--src/mame/promat/3x3puzzl.cpp469
-rw-r--r--src/mame/promat/gstream.cpp1136
-rw-r--r--src/mame/psikyo/psikyo.cpp2123
-rw-r--r--src/mame/psikyo/psikyo.h208
-rw-r--r--src/mame/psikyo/psikyo4.cpp793
-rw-r--r--src/mame/psikyo/psikyo4.h84
-rw-r--r--src/mame/psikyo/psikyo4_v.cpp127
-rw-r--r--src/mame/psikyo/psikyo_v.cpp683
-rw-r--r--src/mame/psikyo/psikyosh.cpp1422
-rw-r--r--src/mame/psikyo/psikyosh.h145
-rw-r--r--src/mame/psikyo/psikyosh_v.cpp1092
-rw-r--r--src/mame/psion/codec.cpp108
-rw-r--r--src/mame/psion/codec.h40
-rw-r--r--src/mame/psion/etna.cpp175
-rw-r--r--src/mame/psion/etna.h75
-rw-r--r--src/mame/psion/mc400.cpp473
-rw-r--r--src/mame/psion/mc600.cpp593
-rw-r--r--src/mame/psion/psion.cpp1114
-rw-r--r--src/mame/psion/psion3.cpp379
-rw-r--r--src/mame/psion/psion3a.cpp695
-rw-r--r--src/mame/psion/psion5mx.cpp768
-rw-r--r--src/mame/psion/psion7.cpp478
-rw-r--r--src/mame/psion/psion_pack.cpp335
-rw-r--r--src/mame/psion/psion_pack.h77
-rw-r--r--src/mame/psion/psionhc.cpp418
-rw-r--r--src/mame/psion/siena.cpp347
-rw-r--r--src/mame/psion/thera.cpp696
-rw-r--r--src/mame/psion/thera.h130
-rw-r--r--src/mame/psion/windermere.cpp996
-rw-r--r--src/mame/psion/windermere.h263
-rw-r--r--src/mame/psion/workabout.cpp303
-rw-r--r--src/mame/quantel/dpb7000.cpp3953
-rw-r--r--src/mame/quantel/harriet.cpp140
-rw-r--r--src/mame/qume/qvt102.cpp734
-rw-r--r--src/mame/qume/qvt103.cpp165
-rw-r--r--src/mame/qume/qvt190.cpp155
-rw-r--r--src/mame/qume/qvt201.cpp207
-rw-r--r--src/mame/qume/qvt70.cpp436
-rw-r--r--src/mame/ramtek/hitme.cpp687
-rw-r--r--src/mame/ramtek/hitme.h75
-rw-r--r--src/mame/ramtek/hitme_a.cpp82
-rw-r--r--src/mame/ramtek/m79amb.cpp359
-rw-r--r--src/mame/ramtek/m79amb_a.cpp311
-rw-r--r--src/mame/ramtek/m79amb_a.h30
-rw-r--r--src/mame/ramtek/nl_starcrus.cpp326
-rw-r--r--src/mame/ramtek/nl_starcrus.h10
-rw-r--r--src/mame/ramtek/ramtek.cpp256
-rw-r--r--src/mame/ramtek/starcrus.cpp663
-rw-r--r--src/mame/rare/btoads.cpp993
-rw-r--r--src/mame/rare/kinst.cpp867
-rw-r--r--src/mame/rare/xtheball.cpp371
-rw-r--r--src/mame/rca/microkit.cpp196
-rw-r--r--src/mame/rca/studio2.cpp816
-rw-r--r--src/mame/rca/vip.cpp822
-rw-r--r--src/mame/rca/vip.h135
-rw-r--r--src/mame/recfranco/rf51w14cg.cpp258
-rw-r--r--src/mame/recfranco/rfjailbrk.cpp122
-rw-r--r--src/mame/recfranco/rfslots8085.cpp908
-rw-r--r--src/mame/recfranco/rfslotsmcs48.cpp903
-rw-r--r--src/mame/recfranco/rfslotspcpent.cpp306
-rw-r--r--src/mame/regnecentralen/rc702.cpp434
-rw-r--r--src/mame/regnecentralen/rc759.cpp682
-rw-r--r--src/mame/regnecentralen/rc759_kbd.cpp258
-rw-r--r--src/mame/regnecentralen/rc759_kbd.h55
-rw-r--r--src/mame/rm/rm380z.cpp333
-rw-r--r--src/mame/rm/rm380z.h271
-rw-r--r--src/mame/rm/rm380z_m.cpp409
-rw-r--r--src/mame/rm/rm380z_v.cpp430
-rw-r--r--src/mame/rm/rm480z.cpp372
-rw-r--r--src/mame/rm/rm480z.h153
-rw-r--r--src/mame/rm/rm480z_m.cpp249
-rw-r--r--src/mame/rm/rm480z_v.cpp260
-rw-r--r--src/mame/rm/rm_mq2.cpp256
-rw-r--r--src/mame/rm/rm_mq2.h53
-rw-r--r--src/mame/rm/rmnimbus.cpp267
-rw-r--r--src/mame/rm/rmnimbus.h279
-rw-r--r--src/mame/rm/rmnimbus_m.cpp1246
-rw-r--r--src/mame/rm/rmnimbus_v.cpp669
-rw-r--r--src/mame/rm/rmnkbd.cpp174
-rw-r--r--src/mame/rm/rmnkbd.h26
-rw-r--r--src/mame/robotron/a5105.cpp655
-rw-r--r--src/mame/robotron/a51xx.cpp198
-rw-r--r--src/mame/robotron/a7150.cpp246
-rw-r--r--src/mame/robotron/k1003.cpp317
-rw-r--r--src/mame/robotron/k8915.cpp192
-rw-r--r--src/mame/robotron/rt1715.cpp906
-rw-r--r--src/mame/robotron/z1013.cpp584
-rw-r--r--src/mame/robotron/z9001.cpp360
-rw-r--r--src/mame/rockwell/aim65.cpp336
-rw-r--r--src/mame/rockwell/aim65.h133
-rw-r--r--src/mame/rockwell/aim65_40.cpp177
-rw-r--r--src/mame/rockwell/aim65_m.cpp338
-rw-r--r--src/mame/roland/alphajuno.cpp226
-rw-r--r--src/mame/roland/boss_se70.cpp60
-rw-r--r--src/mame/roland/boss_sx700.cpp85
-rw-r--r--src/mame/roland/bu3905.cpp35
-rw-r--r--src/mame/roland/bu3905.h58
-rw-r--r--src/mame/roland/juno106.cpp173
-rw-r--r--src/mame/roland/juno6.cpp135
-rw-r--r--src/mame/roland/jx8p_synth.cpp98
-rw-r--r--src/mame/roland/jx8p_synth.h48
-rw-r--r--src/mame/roland/mb62h195.cpp55
-rw-r--r--src/mame/roland/mb62h195.h60
-rw-r--r--src/mame/roland/mb63h114.cpp128
-rw-r--r--src/mame/roland/mb63h114.h62
-rw-r--r--src/mame/roland/mb63h149.cpp102
-rw-r--r--src/mame/roland/mb63h149.h62
-rw-r--r--src/mame/roland/mb87013.cpp132
-rw-r--r--src/mame/roland/mb87013.h89
-rw-r--r--src/mame/roland/pg200.cpp37
-rw-r--r--src/mame/roland/pg200.h26
-rw-r--r--src/mame/roland/roland_cm32p.cpp699
-rw-r--r--src/mame/roland/roland_d10.cpp377
-rw-r--r--src/mame/roland/roland_d50.cpp294
-rw-r--r--src/mame/roland/roland_d70.cpp620
-rw-r--r--src/mame/roland/roland_jd800.cpp80
-rw-r--r--src/mame/roland/roland_jv80.cpp146
-rw-r--r--src/mame/roland/roland_jx3p.cpp276
-rw-r--r--src/mame/roland/roland_jx8p.cpp447
-rw-r--r--src/mame/roland/roland_mc50.cpp137
-rw-r--r--src/mame/roland/roland_mt32.cpp488
-rw-r--r--src/mame/roland/roland_mt80s.cpp67
-rw-r--r--src/mame/roland/roland_pg1000.cpp508
-rw-r--r--src/mame/roland/roland_pr100.cpp133
-rw-r--r--src/mame/roland/roland_r8.cpp385
-rw-r--r--src/mame/roland/roland_ra30.cpp58
-rw-r--r--src/mame/roland/roland_s10.cpp310
-rw-r--r--src/mame/roland/roland_s50.cpp656
-rw-r--r--src/mame/roland/roland_sc55.cpp137
-rw-r--r--src/mame/roland/roland_sc55mk2.cpp96
-rw-r--r--src/mame/roland/roland_sc88.cpp71
-rw-r--r--src/mame/roland/roland_tb303.cpp321
-rw-r--r--src/mame/roland/roland_tnsc1.cpp74
-rw-r--r--src/mame/roland/roland_tnsc2.cpp74
-rw-r--r--src/mame/roland/roland_tr505.cpp67
-rw-r--r--src/mame/roland/roland_tr606.cpp94
-rw-r--r--src/mame/roland/roland_tr707.cpp1811
-rw-r--r--src/mame/roland/roland_tr808.cpp94
-rw-r--r--src/mame/roland/roland_tr909.cpp298
-rw-r--r--src/mame/roland/roland_u20.cpp107
-rw-r--r--src/mame/roland/sa16.cpp100
-rw-r--r--src/mame/roland/sa16.h69
-rw-r--r--src/mame/rolm/r9751.cpp1028
-rw-r--r--src/mame/sage/sage2.cpp531
-rw-r--r--src/mame/sage/sage2.h100
-rw-r--r--src/mame/saitek/blitz.cpp378
-rw-r--r--src/mame/saitek/chessac.cpp415
-rw-r--r--src/mame/saitek/chesstrv.cpp317
-rw-r--r--src/mame/saitek/companion.cpp234
-rw-r--r--src/mame/saitek/companion2.cpp419
-rw-r--r--src/mame/saitek/corona.cpp322
-rw-r--r--src/mame/saitek/cp2000.cpp250
-rw-r--r--src/mame/saitek/delta1.cpp255
-rw-r--r--src/mame/saitek/edames.cpp305
-rw-r--r--src/mame/saitek/electrio.cpp443
-rw-r--r--src/mame/saitek/exechess.cpp271
-rw-r--r--src/mame/saitek/gk2000.cpp575
-rw-r--r--src/mame/saitek/intchess.cpp346
-rw-r--r--src/mame/saitek/leonardo.cpp496
-rw-r--r--src/mame/saitek/mark5.cpp522
-rw-r--r--src/mame/saitek/minichess.cpp234
-rw-r--r--src/mame/saitek/prisma.cpp379
-rw-r--r--src/mame/saitek/prschess.cpp229
-rw-r--r--src/mame/saitek/renaissance.cpp492
-rw-r--r--src/mame/saitek/risc2500.cpp495
-rw-r--r--src/mame/saitek/sbackgc.cpp725
-rw-r--r--src/mame/saitek/schess.cpp254
-rw-r--r--src/mame/saitek/simultano.cpp409
-rw-r--r--src/mame/saitek/ssystem3.cpp578
-rw-r--r--src/mame/saitek/stratos.cpp582
-rw-r--r--src/mame/saitek/stratos.h60
-rw-r--r--src/mame/saitek/superstar.cpp307
-rw-r--r--src/mame/saitek/tatrain.cpp299
-rw-r--r--src/mame/saitek/tschess.cpp199
-rw-r--r--src/mame/saitek/turbo16k.cpp524
-rw-r--r--src/mame/saitek/turbos24k.cpp352
-rw-r--r--src/mame/samcoupe/samcoupe.cpp991
-rw-r--r--src/mame/samsung/dvd-n5xx.cpp327
-rw-r--r--src/mame/samsung/spc1000.cpp537
-rw-r--r--src/mame/samsung/spc1500.cpp949
-rw-r--r--src/mame/sanritsu/appoooh.cpp895
-rw-r--r--src/mame/sanritsu/bankp.cpp675
-rw-r--r--src/mame/sanritsu/chinsan.cpp631
-rw-r--r--src/mame/sanritsu/drmicro.cpp506
-rw-r--r--src/mame/sanritsu/jantotsu.cpp557
-rw-r--r--src/mame/sanritsu/jongkyo.cpp596
-rw-r--r--src/mame/sanritsu/koikoi.cpp477
-rw-r--r--src/mame/sanritsu/mermaid.cpp605
-rw-r--r--src/mame/sanritsu/mermaid.h127
-rw-r--r--src/mame/sanritsu/mermaid_v.cpp576
-rw-r--r--src/mame/sanritsu/mjkjidai.cpp506
-rw-r--r--src/mame/sanritsu/mrjong.cpp453
-rw-r--r--src/mame/sanritsu/ron.cpp551
-rw-r--r--src/mame/sanritsu/sprcros2.cpp700
-rw-r--r--src/mame/sanyo/mbc200.cpp507
-rw-r--r--src/mame/sanyo/mbc55x.cpp379
-rw-r--r--src/mame/sanyo/mbc55x.h181
-rw-r--r--src/mame/sanyo/mbc55x_kbd.cpp290
-rw-r--r--src/mame/sanyo/mbc55x_kbd.h63
-rw-r--r--src/mame/sanyo/mbc55x_v.cpp174
-rw-r--r--src/mame/sanyo/phc20.cpp236
-rw-r--r--src/mame/sanyo/phc25.cpp743
-rw-r--r--src/mame/saturn/st17xx.cpp198
-rw-r--r--src/mame/sealy/sealy_8031.cpp276
-rw-r--r--src/mame/sealy/sealy_eagle.cpp177
-rw-r--r--src/mame/sealy/sealy_fr.cpp54
-rw-r--r--src/mame/sealy/sealy_m16c.cpp228
-rw-r--r--src/mame/sealy/sealy_z80.cpp306
-rw-r--r--src/mame/sega/315-5838_317-0229_comp.cpp356
-rw-r--r--src/mame/sega/315-5838_317-0229_comp.h81
-rw-r--r--src/mame/sega/315-5881_crypt.cpp1009
-rw-r--r--src/mame/sega/315-5881_crypt.h105
-rw-r--r--src/mame/sega/315-6154.cpp237
-rw-r--r--src/mame/sega/315-6154.h59
-rw-r--r--src/mame/sega/315_5195.cpp619
-rw-r--r--src/mame/sega/315_5195.h151
-rw-r--r--src/mame/sega/315_5296.cpp169
-rw-r--r--src/mame/sega/315_5296.h70
-rw-r--r--src/mame/sega/315_5338a.cpp178
-rw-r--r--src/mame/sega/315_5338a.h82
-rw-r--r--src/mame/sega/315_5649.cpp175
-rw-r--r--src/mame/sega/315_5649.h80
-rw-r--r--src/mame/sega/9h0-0008_card.cpp165
-rw-r--r--src/mame/sega/9h0-0008_card.h64
-rw-r--r--src/mame/sega/9h0-0008_card_reader.cpp150
-rw-r--r--src/mame/sega/9h0-0008_card_reader.h91
-rw-r--r--src/mame/sega/9h0-0008_iox.cpp52
-rw-r--r--src/mame/sega/9h0-0008_iox.h63
-rw-r--r--src/mame/sega/angelkds.cpp908
-rw-r--r--src/mame/sega/anyworks.cpp115
-rw-r--r--src/mame/sega/awboard.cpp397
-rw-r--r--src/mame/sega/awboard.h64
-rw-r--r--src/mame/sega/bingoc.cpp263
-rw-r--r--src/mame/sega/bingoct.cpp305
-rw-r--r--src/mame/sega/bingoct.h61
-rw-r--r--src/mame/sega/blockade.cpp599
-rw-r--r--src/mame/sega/calcune.cpp328
-rw-r--r--src/mame/sega/chihiro.cpp2686
-rw-r--r--src/mame/sega/coolridr.cpp3396
-rw-r--r--src/mame/sega/dc-ctrl.cpp164
-rw-r--r--src/mame/sega/dc-ctrl.h97
-rw-r--r--src/mame/sega/dc.cpp667
-rw-r--r--src/mame/sega/dc.h287
-rw-r--r--src/mame/sega/dc_atomiswave.cpp1516
-rw-r--r--src/mame/sega/dc_atomiswave.h69
-rw-r--r--src/mame/sega/dc_g2if.cpp534
-rw-r--r--src/mame/sega/dc_g2if.h106
-rw-r--r--src/mame/sega/dcchk.cpp327
-rw-r--r--src/mame/sega/dccons.cpp694
-rw-r--r--src/mame/sega/dccons.h60
-rw-r--r--src/mame/sega/dccons_m.cpp234
-rw-r--r--src/mame/sega/deniam.cpp875
-rw-r--r--src/mame/sega/digamart.cpp137
-rw-r--r--src/mame/sega/dotrikun.cpp280
-rw-r--r--src/mame/sega/dsb2.cpp270
-rw-r--r--src/mame/sega/dsb2.h82
-rw-r--r--src/mame/sega/dsbz80.cpp344
-rw-r--r--src/mame/sega/dsbz80.h69
-rw-r--r--src/mame/sega/eshockey.cpp233
-rw-r--r--src/mame/sega/fd1089.cpp486
-rw-r--r--src/mame/sega/fd1089.h107
-rw-r--r--src/mame/sega/fd1094.cpp941
-rw-r--r--src/mame/sega/fd1094.h128
-rw-r--r--src/mame/sega/flashbeats.cpp206
-rw-r--r--src/mame/sega/fwheel.cpp242
-rw-r--r--src/mame/sega/gpworld.cpp560
-rw-r--r--src/mame/sega/gunsense.cpp53
-rw-r--r--src/mame/sega/gunsense.h24
-rw-r--r--src/mame/sega/hikaru.cpp1491
-rw-r--r--src/mame/sega/hshavoc.cpp254
-rw-r--r--src/mame/sega/jvs13551.cpp192
-rw-r--r--src/mame/sega/jvs13551.h69
-rw-r--r--src/mame/sega/kopunch.cpp497
-rw-r--r--src/mame/sega/lindbergh.cpp657
-rw-r--r--src/mame/sega/m1comm.cpp641
-rw-r--r--src/mame/sega/m1comm.h112
-rw-r--r--src/mame/sega/m2comm.cpp705
-rw-r--r--src/mame/sega/m2comm.h87
-rw-r--r--src/mame/sega/m3comm.cpp432
-rw-r--r--src/mame/sega/m3comm.h80
-rw-r--r--src/mame/sega/m50dass.cpp52
-rw-r--r--src/mame/sega/m50dass.h30
-rw-r--r--src/mame/sega/magistr16.cpp481
-rw-r--r--src/mame/sega/maple-dc.cpp301
-rw-r--r--src/mame/sega/maple-dc.h84
-rw-r--r--src/mame/sega/mapledev.cpp63
-rw-r--r--src/mame/sega/mapledev.h46
-rw-r--r--src/mame/sega/mdconsole.cpp1013
-rw-r--r--src/mame/sega/mdconsole.h114
-rw-r--r--src/mame/sega/megacd.cpp1946
-rw-r--r--src/mame/sega/megacd.h230
-rw-r--r--src/mame/sega/megadriv.cpp995
-rw-r--r--src/mame/sega/megadriv.h187
-rw-r--r--src/mame/sega/megadriv_acbl.cpp1873
-rw-r--r--src/mame/sega/megadriv_firecore.cpp509
-rw-r--r--src/mame/sega/megadriv_rad.cpp303
-rw-r--r--src/mame/sega/megadriv_sunmix.cpp340
-rw-r--r--src/mame/sega/megadriv_unksoc.cpp511
-rw-r--r--src/mame/sega/megadriv_ybox.cpp822
-rw-r--r--src/mame/sega/megaplay.cpp1030
-rw-r--r--src/mame/sega/megatech.cpp1520
-rw-r--r--src/mame/sega/mie.cpp380
-rw-r--r--src/mame/sega/mie.h150
-rw-r--r--src/mame/sega/model1.cpp1909
-rw-r--r--src/mame/sega/model1.h356
-rw-r--r--src/mame/sega/model1_m.cpp287
-rw-r--r--src/mame/sega/model1_v.cpp1677
-rw-r--r--src/mame/sega/model1io.cpp290
-rw-r--r--src/mame/sega/model1io.h85
-rw-r--r--src/mame/sega/model1io2.cpp433
-rw-r--r--src/mame/sega/model1io2.h99
-rw-r--r--src/mame/sega/model2.cpp7735
-rw-r--r--src/mame/sega/model2.h845
-rw-r--r--src/mame/sega/model2_m.cpp322
-rw-r--r--src/mame/sega/model2_v.cpp2450
-rw-r--r--src/mame/sega/model2rd.ipp352
-rw-r--r--src/mame/sega/model3.cpp7039
-rw-r--r--src/mame/sega/model3.h452
-rw-r--r--src/mame/sega/model3_m.cpp305
-rw-r--r--src/mame/sega/model3_v.cpp2493
-rw-r--r--src/mame/sega/monacogp.cpp276
-rw-r--r--src/mame/sega/naomi.cpp11324
-rw-r--r--src/mame/sega/naomi.h125
-rw-r--r--src/mame/sega/naomibd.cpp210
-rw-r--r--src/mame/sega/naomibd.h56
-rw-r--r--src/mame/sega/naomig1.cpp238
-rw-r--r--src/mame/sega/naomig1.h79
-rw-r--r--src/mame/sega/naomigd.cpp1164
-rw-r--r--src/mame/sega/naomigd.h200
-rw-r--r--src/mame/sega/naomim1.cpp236
-rw-r--r--src/mame/sega/naomim1.h63
-rw-r--r--src/mame/sega/naomim2.cpp207
-rw-r--r--src/mame/sega/naomim2.h46
-rw-r--r--src/mame/sega/naomim4.cpp224
-rw-r--r--src/mame/sega/naomim4.h60
-rw-r--r--src/mame/sega/naomirom.cpp40
-rw-r--r--src/mame/sega/naomirom.h35
-rw-r--r--src/mame/sega/nl_astrob.cpp1218
-rw-r--r--src/mame/sega/nl_astrob.h10
-rw-r--r--src/mame/sega/nl_brdrline.cpp1726
-rw-r--r--src/mame/sega/nl_brdrline.h11
-rw-r--r--src/mame/sega/nl_elim.cpp1227
-rw-r--r--src/mame/sega/nl_elim.h11
-rw-r--r--src/mame/sega/nl_frogs.cpp568
-rw-r--r--src/mame/sega/nl_frogs.h10
-rw-r--r--src/mame/sega/nl_segas16b.cpp171
-rw-r--r--src/mame/sega/nl_segas16b.h4
-rw-r--r--src/mame/sega/nl_segaspeech.cpp120
-rw-r--r--src/mame/sega/nl_segaspeech.h10
-rw-r--r--src/mame/sega/nl_segausb.cpp545
-rw-r--r--src/mame/sega/nl_segausb.h10
-rw-r--r--src/mame/sega/nl_spacfury.cpp1106
-rw-r--r--src/mame/sega/nl_spacfury.h10
-rw-r--r--src/mame/sega/powervr2.cpp4112
-rw-r--r--src/mame/sega/powervr2.h591
-rw-r--r--src/mame/sega/s32comm.cpp1084
-rw-r--r--src/mame/sega/s32comm.h92
-rw-r--r--src/mame/sega/saturn.cpp1030
-rw-r--r--src/mame/sega/saturn.h460
-rw-r--r--src/mame/sega/saturn_cd_hle.cpp2920
-rw-r--r--src/mame/sega/saturn_cd_hle.h275
-rw-r--r--src/mame/sega/saturn_cdb.cpp52
-rw-r--r--src/mame/sega/saturn_cdb.h29
-rw-r--r--src/mame/sega/saturn_m.cpp381
-rw-r--r--src/mame/sega/saturn_scu.cpp803
-rw-r--r--src/mame/sega/saturn_scu.h144
-rw-r--r--src/mame/sega/saturn_v.cpp9450
-rw-r--r--src/mame/sega/sderby2.cpp425
-rw-r--r--src/mame/sega/sega16sp.cpp1446
-rw-r--r--src/mame/sega/sega16sp.h236
-rw-r--r--src/mame/sega/sega_beena.cpp2267
-rw-r--r--src/mame/sega/sega_ferie.cpp699
-rw-r--r--src/mame/sega/sega_sawatte.cpp254
-rw-r--r--src/mame/sega/segaai.cpp743
-rw-r--r--src/mame/sega/segaatom.cpp145
-rw-r--r--src/mame/sega/segabb.cpp37
-rw-r--r--src/mame/sega/segabb.h28
-rw-r--r--src/mame/sega/segabill.cpp238
-rw-r--r--src/mame/sega/segabill.h58
-rw-r--r--src/mame/sega/segac2.cpp3222
-rw-r--r--src/mame/sega/segacoin.cpp183
-rw-r--r--src/mame/sega/segae.cpp1181
-rw-r--r--src/mame/sega/segafruit.cpp398
-rw-r--r--src/mame/sega/segag80.cpp179
-rw-r--r--src/mame/sega/segag80.h73
-rw-r--r--src/mame/sega/segag80_m.cpp338
-rw-r--r--src/mame/sega/segag80_m.h5
-rw-r--r--src/mame/sega/segag80r.cpp2056
-rw-r--r--src/mame/sega/segag80r.h194
-rw-r--r--src/mame/sega/segag80r_a.cpp373
-rw-r--r--src/mame/sega/segag80r_a.h107
-rw-r--r--src/mame/sega/segag80r_v.cpp841
-rw-r--r--src/mame/sega/segag80v.cpp1522
-rw-r--r--src/mame/sega/segag80v.h175
-rw-r--r--src/mame/sega/segag80v_v.cpp337
-rw-r--r--src/mame/sega/segahang.cpp2591
-rw-r--r--src/mame/sega/segaic16.cpp1601
-rw-r--r--src/mame/sega/segaic16.h189
-rw-r--r--src/mame/sega/segaic16_m.cpp435
-rw-r--r--src/mame/sega/segaic16_m.h116
-rw-r--r--src/mame/sega/segaic16_road.cpp620
-rw-r--r--src/mame/sega/segaic16_road.h71
-rw-r--r--src/mame/sega/segaic24.cpp816
-rw-r--r--src/mame/sega/segaic24.h124
-rw-r--r--src/mame/sega/segaipt.h149
-rw-r--r--src/mame/sega/segajw.cpp455
-rw-r--r--src/mame/sega/segald.cpp619
-rw-r--r--src/mame/sega/segaorun.cpp3485
-rw-r--r--src/mame/sega/segapico.cpp742
-rw-r--r--src/mame/sega/segapm.cpp94
-rw-r--r--src/mame/sega/segas16a.cpp4321
-rw-r--r--src/mame/sega/segas16b.cpp10398
-rw-r--r--src/mame/sega/segas16b.h339
-rw-r--r--src/mame/sega/segas16b_isgsm.cpp612
-rw-r--r--src/mame/sega/segas16b_v.cpp101
-rw-r--r--src/mame/sega/segas18.cpp3462
-rw-r--r--src/mame/sega/segas18.h205
-rw-r--r--src/mame/sega/segas18_astormbl.cpp762
-rw-r--r--src/mame/sega/segas18_v.cpp277
-rw-r--r--src/mame/sega/segas24.cpp2828
-rw-r--r--src/mame/sega/segas32.cpp6114
-rw-r--r--src/mame/sega/segas32.h426
-rw-r--r--src/mame/sega/segas32_m.cpp416
-rw-r--r--src/mame/sega/segas32_v.cpp2525
-rw-r--r--src/mame/sega/segashiobd.cpp121
-rw-r--r--src/mame/sega/segashiobd.h29
-rw-r--r--src/mame/sega/segasm1.cpp757
-rw-r--r--src/mame/sega/segasp.cpp1318
-rw-r--r--src/mame/sega/segaspeech.cpp220
-rw-r--r--src/mame/sega/segaspeech.h59
-rw-r--r--src/mame/sega/segattl.cpp165
-rw-r--r--src/mame/sega/segaufo.cpp1186
-rw-r--r--src/mame/sega/segaufoh8.cpp166
-rw-r--r--src/mame/sega/segausb.cpp850
-rw-r--r--src/mame/sega/segausb.h192
-rw-r--r--src/mame/sega/segaxbd.cpp4911
-rw-r--r--src/mame/sega/segaxbd.h244
-rw-r--r--src/mame/sega/segaybd.cpp3541
-rw-r--r--src/mame/sega/sg1000.cpp881
-rw-r--r--src/mame/sega/sg1000a.cpp614
-rw-r--r--src/mame/sega/shtzone.cpp378
-rw-r--r--src/mame/sega/smpc.cpp941
-rw-r--r--src/mame/sega/smpc.h192
-rw-r--r--src/mame/sega/sms.cpp1280
-rw-r--r--src/mame/sega/sms.h357
-rw-r--r--src/mame/sega/sms_bootleg.cpp538
-rw-r--r--src/mame/sega/sms_m.cpp1464
-rw-r--r--src/mame/sega/speedbsk.cpp536
-rw-r--r--src/mame/sega/stactics.cpp903
-rw-r--r--src/mame/sega/stv.cpp4075
-rw-r--r--src/mame/sega/stv.h197
-rw-r--r--src/mame/sega/stvdev.cpp76
-rw-r--r--src/mame/sega/suprloco.cpp606
-rw-r--r--src/mame/sega/svmu.cpp420
-rw-r--r--src/mame/sega/system1.cpp5849
-rw-r--r--src/mame/sega/system1.h294
-rw-r--r--src/mame/sega/system16.cpp4220
-rw-r--r--src/mame/sega/system16.h316
-rw-r--r--src/mame/sega/system16_v.cpp898
-rw-r--r--src/mame/sega/system1_v.cpp675
-rw-r--r--src/mame/sega/timetrv.cpp363
-rw-r--r--src/mame/sega/triforce.cpp1386
-rw-r--r--src/mame/sega/turbo.cpp1956
-rw-r--r--src/mame/sega/turbo.h281
-rw-r--r--src/mame/sega/turbo_a.cpp722
-rw-r--r--src/mame/sega/turbo_v.cpp1020
-rw-r--r--src/mame/sega/unkhockey.cpp156
-rw-r--r--src/mame/sega/vicdual-97269pb.cpp157
-rw-r--r--src/mame/sega/vicdual-97269pb.h39
-rw-r--r--src/mame/sega/vicdual-97271p.cpp198
-rw-r--r--src/mame/sega/vicdual-97271p.h38
-rw-r--r--src/mame/sega/vicdual.cpp5251
-rw-r--r--src/mame/sega/vicdual.h345
-rw-r--r--src/mame/sega/vicdual_a.cpp389
-rw-r--r--src/mame/sega/vicdual_a.h49
-rw-r--r--src/mame/sega/vicdual_v.cpp159
-rw-r--r--src/mame/sega/winclub.cpp129
-rw-r--r--src/mame/sega/y2.cpp150
-rw-r--r--src/mame/sega/zaxxon.cpp1644
-rw-r--r--src/mame/sega/zaxxon.h160
-rw-r--r--src/mame/sega/zaxxon_a.cpp244
-rw-r--r--src/mame/sega/zaxxon_v.cpp491
-rw-r--r--src/mame/seibu/airraid.cpp716
-rw-r--r--src/mame/seibu/airraid_dev.cpp258
-rw-r--r--src/mame/seibu/airraid_dev.h73
-rw-r--r--src/mame/seibu/banprestoms.cpp670
-rw-r--r--src/mame/seibu/banprestomsz80.cpp424
-rw-r--r--src/mame/seibu/bloodbro.cpp1292
-rw-r--r--src/mame/seibu/bloodbro_ms.cpp511
-rw-r--r--src/mame/seibu/cabal.cpp1349
-rw-r--r--src/mame/seibu/cabal_ms.cpp176
-rw-r--r--src/mame/seibu/darkmist.cpp734
-rw-r--r--src/mame/seibu/dcon.cpp712
-rw-r--r--src/mame/seibu/deadang.cpp1188
-rw-r--r--src/mame/seibu/dynduke.cpp1080
-rw-r--r--src/mame/seibu/feversoc.cpp368
-rw-r--r--src/mame/seibu/goal92.cpp623
-rw-r--r--src/mame/seibu/goodejan.cpp688
-rw-r--r--src/mame/seibu/kncljoe.cpp670
-rw-r--r--src/mame/seibu/legionna.cpp2660
-rw-r--r--src/mame/seibu/legionna.h141
-rw-r--r--src/mame/seibu/legionna_v.cpp416
-rw-r--r--src/mame/seibu/metlfrzr.cpp483
-rw-r--r--src/mame/seibu/mustache.cpp452
-rw-r--r--src/mame/seibu/panicr.cpp810
-rw-r--r--src/mame/seibu/r2crypt.cpp253
-rw-r--r--src/mame/seibu/r2crypt.h11
-rw-r--r--src/mame/seibu/r2dx_v33.cpp1156
-rw-r--r--src/mame/seibu/raiden.cpp1235
-rw-r--r--src/mame/seibu/raiden2.cpp3290
-rw-r--r--src/mame/seibu/raiden2.h220
-rw-r--r--src/mame/seibu/raiden2_v.cpp360
-rw-r--r--src/mame/seibu/raiden_ms.cpp790
-rw-r--r--src/mame/seibu/sei021x_sei0220_spr.cpp193
-rw-r--r--src/mame/seibu/sei021x_sei0220_spr.h80
-rw-r--r--src/mame/seibu/sei25x_rise1x_spr.cpp212
-rw-r--r--src/mame/seibu/sei25x_rise1x_spr.h62
-rw-r--r--src/mame/seibu/sei80bu.cpp91
-rw-r--r--src/mame/seibu/sei80bu.h31
-rw-r--r--src/mame/seibu/seibu_crtc.cpp387
-rw-r--r--src/mame/seibu/seibu_crtc.h72
-rw-r--r--src/mame/seibu/seibu_helper.cpp44
-rw-r--r--src/mame/seibu/seibu_helper.h13
-rw-r--r--src/mame/seibu/seibucats.cpp444
-rw-r--r--src/mame/seibu/seibucop.cpp1638
-rw-r--r--src/mame/seibu/seibucop.h254
-rw-r--r--src/mame/seibu/seibucop_cmd.ipp804
-rw-r--r--src/mame/seibu/seibucop_dma.ipp188
-rw-r--r--src/mame/seibu/seibuspi.cpp4376
-rw-r--r--src/mame/seibu/seibuspi.h301
-rw-r--r--src/mame/seibu/seibuspi_m.cpp467
-rw-r--r--src/mame/seibu/seibuspi_m.h15
-rw-r--r--src/mame/seibu/seibuspi_v.cpp657
-rw-r--r--src/mame/seibu/seicopbl.cpp468
-rw-r--r--src/mame/seibu/seicopbl.h66
-rw-r--r--src/mame/seibu/seicupbl.cpp961
-rw-r--r--src/mame/seibu/sengokmj.cpp654
-rw-r--r--src/mame/seibu/stfight.cpp1558
-rw-r--r--src/mame/seibu/stfight_dev.cpp402
-rw-r--r--src/mame/seibu/stfight_dev.h74
-rw-r--r--src/mame/seibu/t5182.cpp375
-rw-r--r--src/mame/seibu/t5182.h75
-rw-r--r--src/mame/seibu/toki.cpp1437
-rw-r--r--src/mame/seibu/toki_ms.cpp836
-rw-r--r--src/mame/seibu/wiz.cpp1558
-rw-r--r--src/mame/sequential/prophet5.cpp3445
-rw-r--r--src/mame/sequential/prophet600.cpp317
-rw-r--r--src/mame/sequential/sixtrak.cpp1156
-rw-r--r--src/mame/seta/albazc.cpp275
-rw-r--r--src/mame/seta/albazg.cpp439
-rw-r--r--src/mame/seta/champbwl.cpp869
-rw-r--r--src/mame/seta/downtown.cpp2663
-rw-r--r--src/mame/seta/hanaawas.cpp526
-rw-r--r--src/mame/seta/hanadojo.cpp451
-rw-r--r--src/mame/seta/iox_hle.cpp126
-rw-r--r--src/mame/seta/iox_hle.h41
-rw-r--r--src/mame/seta/jclub2.cpp1584
-rw-r--r--src/mame/seta/kiwame.cpp269
-rw-r--r--src/mame/seta/macs.cpp782
-rw-r--r--src/mame/seta/rmhaihai.cpp876
-rw-r--r--src/mame/seta/seta.cpp11378
-rw-r--r--src/mame/seta/seta2.cpp3965
-rw-r--r--src/mame/seta/simple_st0016.cpp915
-rw-r--r--src/mame/seta/speedatk.cpp795
-rw-r--r--src/mame/seta/speglsht.cpp462
-rw-r--r--src/mame/seta/srmp2.cpp1749
-rw-r--r--src/mame/seta/srmp5.cpp618
-rw-r--r--src/mame/seta/srmp6.cpp730
-rw-r--r--src/mame/seta/ssv.cpp4712
-rw-r--r--src/mame/seta/ssv.h273
-rw-r--r--src/mame/seta/ssv_v.cpp984
-rw-r--r--src/mame/seta/st0016.cpp761
-rw-r--r--src/mame/seta/st0016.h116
-rw-r--r--src/mame/seta/st0020.cpp745
-rw-r--r--src/mame/seta/st0020.h112
-rw-r--r--src/mame/seta/thedealr.cpp542
-rw-r--r--src/mame/seta/vsmjtria.cpp560
-rw-r--r--src/mame/seta/x1_012.cpp194
-rw-r--r--src/mame/seta/x1_012.h64
-rw-r--r--src/mame/sfrj/README.md6
-rw-r--r--src/mame/sfrj/galaxy.cpp612
-rw-r--r--src/mame/sfrj/galeb.cpp362
-rw-r--r--src/mame/sfrj/hr84.cpp343
-rw-r--r--src/mame/sfrj/idpart_video.cpp232
-rw-r--r--src/mame/sfrj/idpart_video.h13
-rw-r--r--src/mame/sfrj/idpartner.cpp481
-rw-r--r--src/mame/sfrj/lola8a.cpp737
-rw-r--r--src/mame/sfrj/orao.cpp325
-rw-r--r--src/mame/sfrj/pecom.cpp474
-rw-r--r--src/mame/sfrj/pmp11.cpp116
-rw-r--r--src/mame/sfrj/tim011.cpp209
-rw-r--r--src/mame/sfrj/tim011_kbd.cpp327
-rw-r--r--src/mame/sfrj/tim011_kbd.h72
-rw-r--r--src/mame/sfrj/tim100.cpp250
-rw-r--r--src/mame/sgi/crime.cpp112
-rw-r--r--src/mame/sgi/crime.h45
-rw-r--r--src/mame/sgi/crimson.cpp127
-rw-r--r--src/mame/sgi/ctl1.cpp366
-rw-r--r--src/mame/sgi/ctl1.h68
-rw-r--r--src/mame/sgi/gl1.cpp380
-rw-r--r--src/mame/sgi/gl1.h13
-rw-r--r--src/mame/sgi/gm1.cpp138
-rw-r--r--src/mame/sgi/gm1.h51
-rw-r--r--src/mame/sgi/hal2.cpp389
-rw-r--r--src/mame/sgi/hal2.h112
-rw-r--r--src/mame/sgi/hpc1.cpp555
-rw-r--r--src/mame/sgi/hpc1.h143
-rw-r--r--src/mame/sgi/hpc3.cpp1146
-rw-r--r--src/mame/sgi/hpc3.h300
-rw-r--r--src/mame/sgi/indy_indigo2.cpp528
-rw-r--r--src/mame/sgi/int2.cpp214
-rw-r--r--src/mame/sgi/int2.h86
-rw-r--r--src/mame/sgi/ioc2.cpp760
-rw-r--r--src/mame/sgi/ioc2.h235
-rw-r--r--src/mame/sgi/ip12.cpp428
-rw-r--r--src/mame/sgi/ip2.cpp829
-rw-r--r--src/mame/sgi/ip2.h13
-rw-r--r--src/mame/sgi/ip20.cpp298
-rw-r--r--src/mame/sgi/ip4.cpp610
-rw-r--r--src/mame/sgi/ip4.h88
-rw-r--r--src/mame/sgi/ip6.cpp653
-rw-r--r--src/mame/sgi/iris.cpp210
-rw-r--r--src/mame/sgi/iris_kbd.cpp299
-rw-r--r--src/mame/sgi/iris_kbd.h13
-rw-r--r--src/mame/sgi/iris_power.cpp79
-rw-r--r--src/mame/sgi/kbd.cpp399
-rw-r--r--src/mame/sgi/kbd.h93
-rw-r--r--src/mame/sgi/light.cpp281
-rw-r--r--src/mame/sgi/light.h168
-rw-r--r--src/mame/sgi/mace.cpp554
-rw-r--r--src/mame/sgi/mace.h115
-rw-r--r--src/mame/sgi/mc.cpp861
-rw-r--r--src/mame/sgi/mc.h123
-rw-r--r--src/mame/sgi/o2.cpp107
-rw-r--r--src/mame/sgi/octane.cpp68
-rw-r--r--src/mame/sgi/pic1.cpp237
-rw-r--r--src/mame/sgi/pic1.h54
-rw-r--r--src/mame/sgi/pm2.cpp391
-rw-r--r--src/mame/sgi/pm2.h13
-rw-r--r--src/mame/sgi/pm2_mmu.cpp322
-rw-r--r--src/mame/sgi/pm2_mmu.h74
-rw-r--r--src/mame/sgi/sgi_ge5.cpp776
-rw-r--r--src/mame/sgi/sgi_ge5.h157
-rw-r--r--src/mame/sgi/sgi_gr1.cpp337
-rw-r--r--src/mame/sgi/sgi_gr1.h144
-rw-r--r--src/mame/sgi/sgi_re2.cpp542
-rw-r--r--src/mame/sgi/sgi_re2.h222
-rw-r--r--src/mame/sgi/sgi_xmap2.cpp192
-rw-r--r--src/mame/sgi/sgi_xmap2.h60
-rw-r--r--src/mame/sgi/tt.cpp139
-rw-r--r--src/mame/sgi/vc1.cpp206
-rw-r--r--src/mame/sgi/vc1.h32
-rw-r--r--src/mame/sgi/vino.cpp1034
-rw-r--r--src/mame/sgi/vino.h255
-rw-r--r--src/mame/shared/alpha68k_palette.cpp166
-rw-r--r--src/mame/shared/alpha68k_palette.h68
-rw-r--r--src/mame/shared/alpha68k_spr.cpp193
-rw-r--r--src/mame/shared/alpha68k_spr.h54
-rw-r--r--src/mame/shared/ballysound.cpp867
-rw-r--r--src/mame/shared/ballysound.h342
-rw-r--r--src/mame/shared/cage.cpp735
-rw-r--r--src/mame/shared/cage.h126
-rw-r--r--src/mame/shared/cclimber_a.cpp123
-rw-r--r--src/mame/shared/cclimber_a.h61
-rw-r--r--src/mame/shared/cedar_magnet_board.cpp89
-rw-r--r--src/mame/shared/cedar_magnet_board.h54
-rw-r--r--src/mame/shared/dcs.cpp2694
-rw-r--r--src/mame/shared/dcs.h417
-rw-r--r--src/mame/shared/decobsmt.cpp145
-rw-r--r--src/mame/shared/decobsmt.h58
-rw-r--r--src/mame/shared/decospr.cpp582
-rw-r--r--src/mame/shared/decospr.h79
-rw-r--r--src/mame/shared/efo_sound3.cpp115
-rw-r--r--src/mame/shared/efo_sound3.h42
-rw-r--r--src/mame/shared/efo_zsu.cpp316
-rw-r--r--src/mame/shared/efo_zsu.h99
-rw-r--r--src/mame/shared/exidysound.cpp878
-rw-r--r--src/mame/shared/exidysound.h219
-rw-r--r--src/mame/shared/fruitsamples.cpp94
-rw-r--r--src/mame/shared/fruitsamples.h57
-rw-r--r--src/mame/shared/gottlieb_a.cpp1211
-rw-r--r--src/mame/shared/gottlieb_a.h342
-rw-r--r--src/mame/shared/inder_vid.cpp130
-rw-r--r--src/mame/shared/inder_vid.h58
-rw-r--r--src/mame/shared/isbc_215g.cpp433
-rw-r--r--src/mame/shared/isbc_215g.h90
-rw-r--r--src/mame/shared/mahjong.cpp554
-rw-r--r--src/mame/shared/mahjong.h89
-rw-r--r--src/mame/shared/mega32x.cpp1823
-rw-r--r--src/mame/shared/mega32x.h232
-rw-r--r--src/mame/shared/megacdcd.cpp1399
-rw-r--r--src/mame/shared/megacdcd.h196
-rw-r--r--src/mame/shared/microtouchlayout.cpp15
-rw-r--r--src/mame/shared/microtouchlayout.h19
-rw-r--r--src/mame/shared/mitcrt.cpp181
-rw-r--r--src/mame/shared/mitcrt.h76
-rw-r--r--src/mame/shared/ms7004.cpp473
-rw-r--r--src/mame/shared/ms7004.h64
-rw-r--r--src/mame/shared/namco_c355spr.cpp626
-rw-r--r--src/mame/shared/namco_c355spr.h149
-rw-r--r--src/mame/shared/pcshare.cpp189
-rw-r--r--src/mame/shared/pcshare.h67
-rw-r--r--src/mame/shared/pk8000_v.cpp180
-rw-r--r--src/mame/shared/pk8000_v.h51
-rw-r--r--src/mame/shared/rax.cpp534
-rw-r--r--src/mame/shared/rax.h103
-rw-r--r--src/mame/shared/s11c_bg.cpp548
-rw-r--r--src/mame/shared/s11c_bg.h125
-rw-r--r--src/mame/shared/sec.cpp403
-rw-r--r--src/mame/shared/sec.h115
-rw-r--r--src/mame/shared/segam1audio.cpp147
-rw-r--r--src/mame/shared/segam1audio.h68
-rw-r--r--src/mame/shared/seibusound.cpp451
-rw-r--r--src/mame/shared/seibusound.h180
-rw-r--r--src/mame/shared/taito68705.cpp349
-rw-r--r--src/mame/shared/taito68705.h143
-rw-r--r--src/mame/shared/taitosnd.cpp335
-rw-r--r--src/mame/shared/taitosnd.h64
-rw-r--r--src/mame/shared/tecmo_spr.cpp382
-rw-r--r--src/mame/shared/tecmo_spr.h55
-rw-r--r--src/mame/shared/teleprinter.cpp237
-rw-r--r--src/mame/shared/teleprinter.h43
-rw-r--r--src/mame/shared/timeplt_a.cpp226
-rw-r--r--src/mame/shared/timeplt_a.h61
-rw-r--r--src/mame/shared/vboysound.cpp498
-rw-r--r--src/mame/shared/vboysound.h92
-rw-r--r--src/mame/shared/vt100_kbd.cpp532
-rw-r--r--src/mame/shared/vt100_kbd.h95
-rw-r--r--src/mame/shared/williamssound.cpp1292
-rw-r--r--src/mame/shared/williamssound.h319
-rw-r--r--src/mame/shared/wswansound.cpp570
-rw-r--r--src/mame/shared/wswansound.h126
-rw-r--r--src/mame/shared/xbox.cpp1003
-rw-r--r--src/mame/shared/xbox.h177
-rw-r--r--src/mame/shared/xbox_nv2a.cpp5144
-rw-r--r--src/mame/shared/xbox_nv2a.h896
-rw-r--r--src/mame/shared/xbox_pci.cpp1722
-rw-r--r--src/mame/shared/xbox_pci.h571
-rw-r--r--src/mame/shared/xbox_usb.cpp1546
-rw-r--r--src/mame/shared/xbox_usb.h529
-rw-r--r--src/mame/shared/z80bin.cpp68
-rw-r--r--src/mame/shared/z80bin.h26
-rw-r--r--src/mame/sharp/fontwriter.cpp165
-rw-r--r--src/mame/sharp/mz2000.cpp1492
-rw-r--r--src/mame/sharp/mz2500.cpp1920
-rw-r--r--src/mame/sharp/mz2500.h218
-rw-r--r--src/mame/sharp/mz3500.cpp920
-rw-r--r--src/mame/sharp/mz5500.cpp521
-rw-r--r--src/mame/sharp/mz700.cpp510
-rw-r--r--src/mame/sharp/mz700.h167
-rw-r--r--src/mame/sharp/mz700_m.cpp675
-rw-r--r--src/mame/sharp/mz700_v.cpp102
-rw-r--r--src/mame/sharp/mz80.cpp383
-rw-r--r--src/mame/sharp/mz80.h82
-rw-r--r--src/mame/sharp/mz80_m.cpp84
-rw-r--r--src/mame/sharp/mz80_v.cpp136
-rw-r--r--src/mame/sharp/pc1251.cpp133
-rw-r--r--src/mame/sharp/pc1251.h83
-rw-r--r--src/mame/sharp/pc1251_m.cpp81
-rw-r--r--src/mame/sharp/pc1350.cpp123
-rw-r--r--src/mame/sharp/pc1350.h60
-rw-r--r--src/mame/sharp/pc1350_m.cpp85
-rw-r--r--src/mame/sharp/pc1401.cpp180
-rw-r--r--src/mame/sharp/pc1401.h66
-rw-r--r--src/mame/sharp/pc1401_m.cpp82
-rw-r--r--src/mame/sharp/pc1403.cpp244
-rw-r--r--src/mame/sharp/pc1403.h86
-rw-r--r--src/mame/sharp/pc1403_m.cpp104
-rw-r--r--src/mame/sharp/pc1500.cpp365
-rw-r--r--src/mame/sharp/pce220.cpp1062
-rw-r--r--src/mame/sharp/pce220_ser.cpp312
-rw-r--r--src/mame/sharp/pce220_ser.h86
-rw-r--r--src/mame/sharp/pocketc.cpp983
-rw-r--r--src/mame/sharp/pocketc.h67
-rw-r--r--src/mame/sharp/pocketc_m.cpp32
-rw-r--r--src/mame/sharp/pocketc_v.cpp48
-rw-r--r--src/mame/sharp/wizard.cpp164
-rw-r--r--src/mame/sharp/x1.cpp2396
-rw-r--r--src/mame/sharp/x1.h373
-rw-r--r--src/mame/sharp/x1_m.cpp86
-rw-r--r--src/mame/sharp/x1_v.cpp389
-rw-r--r--src/mame/sharp/x1twin.cpp556
-rw-r--r--src/mame/sharp/x68k.cpp1306
-rw-r--r--src/mame/sharp/x68k.h313
-rw-r--r--src/mame/sharp/x68k_crtc.cpp639
-rw-r--r--src/mame/sharp/x68k_crtc.h133
-rw-r--r--src/mame/sharp/x68k_hdc.cpp404
-rw-r--r--src/mame/sharp/x68k_hdc.h132
-rw-r--r--src/mame/sharp/x68k_kbd.cpp415
-rw-r--r--src/mame/sharp/x68k_kbd.h43
-rw-r--r--src/mame/sharp/x68k_mouse.cpp103
-rw-r--r--src/mame/sharp/x68k_mouse.h36
-rw-r--r--src/mame/sharp/x68k_v.cpp892
-rw-r--r--src/mame/sharp/zaurus.cpp1626
-rw-r--r--src/mame/siemens/bitel.cpp104
-rw-r--r--src/mame/siemens/pcd.cpp598
-rw-r--r--src/mame/siemens/pcd.h120
-rw-r--r--src/mame/siemens/pcd_kbd.cpp264
-rw-r--r--src/mame/siemens/pcd_kbd.h40
-rw-r--r--src/mame/siemens/pcd_v.cpp458
-rw-r--r--src/mame/siemens/pcmx2.cpp94
-rw-r--r--src/mame/siemens/pg685.cpp609
-rw-r--r--src/mame/sigma/nyny.cpp755
-rw-r--r--src/mame/sigma/r2dtank.cpp512
-rw-r--r--src/mame/sigma/sammymdl.cpp1038
-rw-r--r--src/mame/sigma/sigma21.cpp126
-rw-r--r--src/mame/sigma/sigmab31.cpp216
-rw-r--r--src/mame/sigma/sigmab52.cpp777
-rw-r--r--src/mame/sigma/sigmab88.cpp124
-rw-r--r--src/mame/sigma/sigmab98.cpp1128
-rw-r--r--src/mame/sigma/spiders.cpp670
-rw-r--r--src/mame/sigma/spiders.h65
-rw-r--r--src/mame/sigma/spiders_a.cpp211
-rw-r--r--src/mame/sinclair/atm.cpp602
-rw-r--r--src/mame/sinclair/atm.h109
-rw-r--r--src/mame/sinclair/beta_m.cpp331
-rw-r--r--src/mame/sinclair/beta_m.h67
-rw-r--r--src/mame/sinclair/byte.cpp286
-rw-r--r--src/mame/sinclair/chloe.cpp979
-rw-r--r--src/mame/sinclair/elwro800.cpp637
-rw-r--r--src/mame/sinclair/evo/glukrs.cpp51
-rw-r--r--src/mame/sinclair/evo/glukrs.h38
-rw-r--r--src/mame/sinclair/evo/pentevo.cpp796
-rw-r--r--src/mame/sinclair/evo/tsconf.cpp395
-rw-r--r--src/mame/sinclair/evo/tsconf.h259
-rw-r--r--src/mame/sinclair/evo/tsconf_beta.cpp275
-rw-r--r--src/mame/sinclair/evo/tsconf_beta.h72
-rw-r--r--src/mame/sinclair/evo/tsconf_copper.cpp217
-rw-r--r--src/mame/sinclair/evo/tsconf_copper.h46
-rw-r--r--src/mame/sinclair/evo/tsconf_dma.cpp276
-rw-r--r--src/mame/sinclair/evo/tsconf_dma.h77
-rw-r--r--src/mame/sinclair/evo/tsconf_m.cpp1071
-rw-r--r--src/mame/sinclair/evo/tsconf_rs232.cpp413
-rw-r--r--src/mame/sinclair/evo/tsconf_rs232.h81
-rw-r--r--src/mame/sinclair/hrust.cpp222
-rw-r--r--src/mame/sinclair/hrust.h40
-rw-r--r--src/mame/sinclair/next/specnext.cpp4227
-rw-r--r--src/mame/sinclair/next/specnext_copper.cpp157
-rw-r--r--src/mame/sinclair/next/specnext_copper.h47
-rw-r--r--src/mame/sinclair/next/specnext_ctc.cpp53
-rw-r--r--src/mame/sinclair/next/specnext_ctc.h27
-rw-r--r--src/mame/sinclair/next/specnext_divmmc.cpp143
-rw-r--r--src/mame/sinclair/next/specnext_divmmc.h88
-rw-r--r--src/mame/sinclair/next/specnext_dma.cpp148
-rw-r--r--src/mame/sinclair/next/specnext_dma.h37
-rw-r--r--src/mame/sinclair/next/specnext_im2.cpp62
-rw-r--r--src/mame/sinclair/next/specnext_im2.h40
-rw-r--r--src/mame/sinclair/next/specnext_layer2.cpp258
-rw-r--r--src/mame/sinclair/next/specnext_layer2.h78
-rw-r--r--src/mame/sinclair/next/specnext_lores.cpp136
-rw-r--r--src/mame/sinclair/next/specnext_lores.h65
-rw-r--r--src/mame/sinclair/next/specnext_multiface.cpp114
-rw-r--r--src/mame/sinclair/next/specnext_multiface.h75
-rw-r--r--src/mame/sinclair/next/specnext_sprites.cpp388
-rw-r--r--src/mame/sinclair/next/specnext_sprites.h99
-rw-r--r--src/mame/sinclair/next/specnext_tiles.cpp192
-rw-r--r--src/mame/sinclair/next/specnext_tiles.h80
-rw-r--r--src/mame/sinclair/next/specnext_uart.cpp182
-rw-r--r--src/mame/sinclair/next/specnext_uart.h54
-rw-r--r--src/mame/sinclair/pentagon.cpp334
-rw-r--r--src/mame/sinclair/qimi.cpp182
-rw-r--r--src/mame/sinclair/qimi.h65
-rw-r--r--src/mame/sinclair/ql.cpp1286
-rw-r--r--src/mame/sinclair/scorpion.cpp1069
-rw-r--r--src/mame/sinclair/screen_ula.cpp301
-rw-r--r--src/mame/sinclair/screen_ula.h101
-rw-r--r--src/mame/sinclair/spec128.cpp509
-rw-r--r--src/mame/sinclair/spec128.h68
-rw-r--r--src/mame/sinclair/spec_snqk.cpp2598
-rw-r--r--src/mame/sinclair/spec_snqk.h176
-rw-r--r--src/mame/sinclair/specpls3.cpp533
-rw-r--r--src/mame/sinclair/specpls3.h57
-rw-r--r--src/mame/sinclair/spectrum.cpp1153
-rw-r--r--src/mame/sinclair/spectrum.h223
-rw-r--r--src/mame/sinclair/spectrum_ula.cpp238
-rw-r--r--src/mame/sinclair/spectrum_ula.h148
-rw-r--r--src/mame/sinclair/spectrum_v.cpp281
-rw-r--r--src/mame/sinclair/sprinter.cpp2056
-rw-r--r--src/mame/sinclair/timex.cpp771
-rw-r--r--src/mame/sinclair/timex.h102
-rw-r--r--src/mame/sinclair/timex_v.cpp218
-rw-r--r--src/mame/sinclair/upd65031.cpp812
-rw-r--r--src/mame/sinclair/upd65031.h120
-rw-r--r--src/mame/sinclair/z88.cpp690
-rw-r--r--src/mame/sinclair/z88.h95
-rw-r--r--src/mame/sinclair/z88_impexp.cpp277
-rw-r--r--src/mame/sinclair/z88_impexp.h71
-rw-r--r--src/mame/sinclair/z88_v.cpp150
-rw-r--r--src/mame/sinclair/zx.cpp497
-rw-r--r--src/mame/sinclair/zx.h115
-rw-r--r--src/mame/sinclair/zx8301.cpp342
-rw-r--r--src/mame/sinclair/zx8301.h110
-rw-r--r--src/mame/sinclair/zx8302.cpp585
-rw-r--r--src/mame/sinclair/zx8302.h210
-rw-r--r--src/mame/sinclair/zx_m.cpp280
-rw-r--r--src/mame/sinclair/zx_v.cpp134
-rw-r--r--src/mame/skeleton/600cat.cpp160
-rw-r--r--src/mame/skeleton/aaa.cpp306
-rw-r--r--src/mame/skeleton/acd.cpp52
-rw-r--r--src/mame/skeleton/aceex.cpp107
-rw-r--r--src/mame/skeleton/adacp150.cpp235
-rw-r--r--src/mame/skeleton/aid80f.cpp148
-rw-r--r--src/mame/skeleton/airbase99.cpp95
-rw-r--r--src/mame/skeleton/alcat7100.cpp124
-rw-r--r--src/mame/skeleton/alfaskop_s41_kb.cpp394
-rw-r--r--src/mame/skeleton/alfaskop_s41_kb.h48
-rw-r--r--src/mame/skeleton/alphasma.cpp637
-rw-r--r--src/mame/skeleton/alphasma3k.cpp138
-rw-r--r--src/mame/skeleton/am1000.cpp125
-rw-r--r--src/mame/skeleton/amlogic_aml7212.cpp73
-rw-r--r--src/mame/skeleton/amusement_6502.cpp132
-rw-r--r--src/mame/skeleton/antonelli_hd6305.cpp63
-rw-r--r--src/mame/skeleton/aquaplus_piece.cpp97
-rw-r--r--src/mame/skeleton/argox.cpp93
-rw-r--r--src/mame/skeleton/attache.cpp1344
-rw-r--r--src/mame/skeleton/aws.cpp299
-rw-r--r--src/mame/skeleton/aws_kb.cpp307
-rw-r--r--src/mame/skeleton/aws_kb.h43
-rw-r--r--src/mame/skeleton/ax20.cpp177
-rw-r--r--src/mame/skeleton/banpresto_tomy_h8s.cpp255
-rw-r--r--src/mame/skeleton/basf7100.cpp739
-rw-r--r--src/mame/skeleton/basf7100_kbd.cpp297
-rw-r--r--src/mame/skeleton/basf7100_kbd.h61
-rw-r--r--src/mame/skeleton/bert.cpp127
-rw-r--r--src/mame/skeleton/biorhythm.cpp104
-rw-r--r--src/mame/skeleton/biorhythm_fp.cpp128
-rw-r--r--src/mame/skeleton/bitgraph.cpp636
-rw-r--r--src/mame/skeleton/blaucds32.cpp147
-rw-r--r--src/mame/skeleton/bolsaint.cpp139
-rw-r--r--src/mame/skeleton/boo.cpp172
-rw-r--r--src/mame/skeleton/bpmmicro.cpp427
-rw-r--r--src/mame/skeleton/br8641.cpp219
-rw-r--r--src/mame/skeleton/bullion2.cpp143
-rw-r--r--src/mame/skeleton/busicom.cpp269
-rw-r--r--src/mame/skeleton/busicom.h65
-rw-r--r--src/mame/skeleton/busicom_v.cpp1851
-rw-r--r--src/mame/skeleton/c2color.cpp190
-rw-r--r--src/mame/skeleton/cadillacjack_mc68340.cpp356
-rw-r--r--src/mame/skeleton/camirf1.cpp81
-rw-r--r--src/mame/skeleton/candela.cpp825
-rw-r--r--src/mame/skeleton/caramball.cpp153
-rw-r--r--src/mame/skeleton/cardinal.cpp178
-rw-r--r--src/mame/skeleton/cbnt2039.cpp71
-rw-r--r--src/mame/skeleton/cd100.cpp272
-rw-r--r--src/mame/skeleton/cd2650.cpp370
-rw-r--r--src/mame/skeleton/cdc721.cpp410
-rw-r--r--src/mame/skeleton/cdsys5.cpp139
-rw-r--r--src/mame/skeleton/cit1500.cpp116
-rw-r--r--src/mame/skeleton/ckz80.cpp240
-rw-r--r--src/mame/skeleton/cle68k.cpp687
-rw-r--r--src/mame/skeleton/clownmgc.cpp287
-rw-r--r--src/mame/skeleton/clxvme186.cpp124
-rw-r--r--src/mame/skeleton/codata.cpp119
-rw-r--r--src/mame/skeleton/consola_emt.cpp309
-rw-r--r--src/mame/skeleton/controlid.cpp189
-rw-r--r--src/mame/skeleton/cortex.cpp395
-rw-r--r--src/mame/skeleton/cosmicos.cpp720
-rw-r--r--src/mame/skeleton/cp1.cpp325
-rw-r--r--src/mame/skeleton/css11501sk9.cpp141
-rw-r--r--src/mame/skeleton/ct909e_segadvd.cpp118
-rw-r--r--src/mame/skeleton/cubieboard4.cpp100
-rw-r--r--src/mame/skeleton/cxhumax.cpp1060
-rw-r--r--src/mame/skeleton/cxhumax.h285
-rw-r--r--src/mame/skeleton/d400.cpp122
-rw-r--r--src/mame/skeleton/daruma.cpp155
-rw-r--r--src/mame/skeleton/dash4.cpp88
-rw-r--r--src/mame/skeleton/datacast.cpp253
-rw-r--r--src/mame/skeleton/design.cpp463
-rw-r--r--src/mame/skeleton/dharma_z180.cpp172
-rw-r--r--src/mame/skeleton/diablo1300.cpp212
-rw-r--r--src/mame/skeleton/didact.cpp937
-rw-r--r--src/mame/skeleton/digel804.cpp810
-rw-r--r--src/mame/skeleton/digiblast.cpp126
-rw-r--r--src/mame/skeleton/digijet.cpp72
-rw-r--r--src/mame/skeleton/digilog320.cpp435
-rw-r--r--src/mame/skeleton/digilog400.cpp162
-rw-r--r--src/mame/skeleton/digilog_kbd.cpp280
-rw-r--r--src/mame/skeleton/digilog_kbd.h59
-rw-r--r--src/mame/skeleton/digitech_gsp5.cpp68
-rw-r--r--src/mame/skeleton/dm7000.cpp435
-rw-r--r--src/mame/skeleton/dps1.cpp249
-rw-r--r--src/mame/skeleton/dsb46.cpp153
-rw-r--r--src/mame/skeleton/dual68.cpp161
-rw-r--r--src/mame/skeleton/dyna_d0404.cpp236
-rw-r--r--src/mame/skeleton/dyna_d0703.cpp183
-rw-r--r--src/mame/skeleton/dyna_dc4000.cpp431
-rw-r--r--src/mame/skeleton/e100.cpp577
-rw-r--r--src/mame/skeleton/easy_karaoke.cpp811
-rw-r--r--src/mame/skeleton/eks515.cpp76
-rw-r--r--src/mame/skeleton/elcirculo.cpp185
-rw-r--r--src/mame/skeleton/elzet80.cpp185
-rw-r--r--src/mame/skeleton/epic14e.cpp319
-rw-r--r--src/mame/skeleton/epoch_tv_globe.cpp115
-rw-r--r--src/mame/skeleton/esprit.cpp232
-rw-r--r--src/mame/skeleton/eurit.cpp188
-rw-r--r--src/mame/skeleton/eurocom2.cpp519
-rw-r--r--src/mame/skeleton/extrema_m27sv.cpp386
-rw-r--r--src/mame/skeleton/fanucs15.cpp442
-rw-r--r--src/mame/skeleton/fanucspmg.cpp1046
-rw-r--r--src/mame/skeleton/fc100.cpp587
-rw-r--r--src/mame/skeleton/fdek_h8s.cpp242
-rw-r--r--src/mame/skeleton/fk1.cpp497
-rw-r--r--src/mame/skeleton/flashgun.cpp105
-rw-r--r--src/mame/skeleton/flashvga2.cpp310
-rw-r--r--src/mame/skeleton/fs3216.cpp569
-rw-r--r--src/mame/skeleton/ft68m.cpp141
-rw-r--r--src/mame/skeleton/gamebox.cpp119
-rw-r--r--src/mame/skeleton/ganbaremo.cpp265
-rw-r--r--src/mame/skeleton/gem_rp.cpp71
-rw-r--r--src/mame/skeleton/gimix.cpp793
-rw-r--r--src/mame/skeleton/gm1000.cpp136
-rw-r--r--src/mame/skeleton/gnat10.cpp242
-rw-r--r--src/mame/skeleton/goupil.cpp648
-rw-r--r--src/mame/skeleton/grfd2301.cpp177
-rw-r--r--src/mame/skeleton/happyvideo.cpp108
-rw-r--r--src/mame/skeleton/hazeltin.cpp816
-rw-r--r--src/mame/skeleton/hazl1420.cpp406
-rw-r--r--src/mame/skeleton/hkcastle.cpp145
-rw-r--r--src/mame/skeleton/hohnadam.cpp126
-rw-r--r--src/mame/skeleton/hprot1.cpp343
-rw-r--r--src/mame/skeleton/ht68k.cpp168
-rw-r--r--src/mame/skeleton/hudson_poems.cpp967
-rw-r--r--src/mame/skeleton/i7000.cpp421
-rw-r--r--src/mame/skeleton/iam2.cpp221
-rw-r--r--src/mame/skeleton/icatel.cpp274
-rw-r--r--src/mame/skeleton/icebox.cpp376
-rw-r--r--src/mame/skeleton/iez80.cpp232
-rw-r--r--src/mame/skeleton/if800.cpp128
-rw-r--r--src/mame/skeleton/ikt5a.cpp203
-rw-r--r--src/mame/skeleton/imsai.cpp177
-rw-r--r--src/mame/skeleton/indiana.cpp153
-rw-r--r--src/mame/skeleton/is48x.cpp113
-rw-r--r--src/mame/skeleton/itc4.cpp166
-rw-r--r--src/mame/skeleton/itt1700.cpp130
-rw-r--r--src/mame/skeleton/itt1700_kbd.cpp282
-rw-r--r--src/mame/skeleton/itt1700_kbd.h47
-rw-r--r--src/mame/skeleton/itt3030.cpp785
-rw-r--r--src/mame/skeleton/itt9216.cpp111
-rw-r--r--src/mame/skeleton/jade.cpp107
-rw-r--r--src/mame/skeleton/jinhuang6.cpp149
-rw-r--r--src/mame/skeleton/jonos.cpp233
-rw-r--r--src/mame/skeleton/junior80.cpp306
-rw-r--r--src/mame/skeleton/kkcount.cpp121
-rw-r--r--src/mame/skeleton/koto_zevio.cpp117
-rw-r--r--src/mame/skeleton/kron.cpp326
-rw-r--r--src/mame/skeleton/lanmao.cpp687
-rw-r--r--src/mame/skeleton/leadsinger2.cpp129
-rw-r--r--src/mame/skeleton/lee1214.cpp92
-rw-r--r--src/mame/skeleton/lee1220.cpp151
-rw-r--r--src/mame/skeleton/lft.cpp140
-rw-r--r--src/mame/skeleton/lg-dvd.cpp56
-rw-r--r--src/mame/skeleton/lgtz80.cpp1045
-rw-r--r--src/mame/skeleton/lilith.cpp65
-rw-r--r--src/mame/skeleton/lms46.cpp117
-rw-r--r--src/mame/skeleton/madmoney2.cpp120
-rw-r--r--src/mame/skeleton/marsvending.cpp118
-rw-r--r--src/mame/skeleton/mcc1.cpp181
-rw-r--r--src/mame/skeleton/megacrane.cpp151
-rw-r--r--src/mame/skeleton/mes.cpp192
-rw-r--r--src/mame/skeleton/mfabfz.cpp320
-rw-r--r--src/mame/skeleton/mgt_multigame.cpp159
-rw-r--r--src/mame/skeleton/mice.cpp253
-rw-r--r--src/mame/skeleton/mice3s68k.cpp116
-rw-r--r--src/mame/skeleton/micral.cpp479
-rw-r--r--src/mame/skeleton/micro20.cpp223
-rw-r--r--src/mame/skeleton/micromon.cpp101
-rw-r--r--src/mame/skeleton/micronic.cpp478
-rw-r--r--src/mame/skeleton/mightyframe.cpp58
-rw-r--r--src/mame/skeleton/milwaukee.cpp101
-rw-r--r--src/mame/skeleton/mini2440.cpp291
-rw-r--r--src/mame/skeleton/miniframe.cpp286
-rw-r--r--src/mame/skeleton/minihock.cpp101
-rw-r--r--src/mame/skeleton/ml20.cpp297
-rw-r--r--src/mame/skeleton/mmd1.cpp353
-rw-r--r--src/mame/skeleton/mmd2.cpp407
-rw-r--r--src/mame/skeleton/mod8.cpp188
-rw-r--r--src/mame/skeleton/modellot.cpp259
-rw-r--r--src/mame/skeleton/molecular.cpp374
-rw-r--r--src/mame/skeleton/ms9540.cpp147
-rw-r--r--src/mame/skeleton/mstation.cpp503
-rw-r--r--src/mame/skeleton/mt735.cpp145
-rw-r--r--src/mame/skeleton/mtd1256.cpp160
-rw-r--r--src/mame/skeleton/mw4pole.cpp53
-rw-r--r--src/mame/skeleton/mx2178.cpp201
-rw-r--r--src/mame/skeleton/mx3210.cpp146
-rw-r--r--src/mame/skeleton/mycom.cpp588
-rw-r--r--src/mame/skeleton/ngen.cpp1277
-rw-r--r--src/mame/skeleton/ngen_kb.cpp105
-rw-r--r--src/mame/skeleton/ngen_kb.h34
-rw-r--r--src/mame/skeleton/nl_hazelvid.cpp258
-rw-r--r--src/mame/skeleton/nl_hazelvid.h6
-rw-r--r--src/mame/skeleton/nl_palestra.cpp725
-rw-r--r--src/mame/skeleton/nl_palestra.h4
-rw-r--r--src/mame/skeleton/nl_tp1983.cpp125
-rw-r--r--src/mame/skeleton/nl_tp1983.h4
-rw-r--r--src/mame/skeleton/nl_tp1985.cpp248
-rw-r--r--src/mame/skeleton/nl_tp1985.h4
-rw-r--r--src/mame/skeleton/nordlead.cpp81
-rw-r--r--src/mame/skeleton/omdisv22.cpp176
-rw-r--r--src/mame/skeleton/onyx.cpp292
-rw-r--r--src/mame/skeleton/optomaxv.cpp730
-rw-r--r--src/mame/skeleton/orina_stylish_plus.cpp67
-rw-r--r--src/mame/skeleton/p8k.cpp575
-rw-r--r--src/mame/skeleton/paipaile.cpp123
-rw-r--r--src/mame/skeleton/palestra.cpp96
-rw-r--r--src/mame/skeleton/palsystems_sh2.cpp267
-rw-r--r--src/mame/skeleton/pap2.cpp103
-rw-r--r--src/mame/skeleton/pcksurfer.cpp91
-rw-r--r--src/mame/skeleton/pdt3100.cpp82
-rw-r--r--src/mame/skeleton/pegasos2.cpp158
-rw-r--r--src/mame/skeleton/pencil2.cpp434
-rw-r--r--src/mame/skeleton/perq.cpp52
-rw-r--r--src/mame/skeleton/pes.cpp219
-rw-r--r--src/mame/skeleton/picno.cpp103
-rw-r--r--src/mame/skeleton/plan80.cpp292
-rw-r--r--src/mame/skeleton/pm68k.cpp108
-rw-r--r--src/mame/skeleton/powerpack.cpp80
-rw-r--r--src/mame/skeleton/probowl.cpp171
-rw-r--r--src/mame/skeleton/proteus3.cpp509
-rw-r--r--src/mame/skeleton/pt68k4.cpp514
-rw-r--r--src/mame/skeleton/ptcsol.cpp817
-rw-r--r--src/mame/skeleton/pv9234.cpp210
-rw-r--r--src/mame/skeleton/pwp14.cpp264
-rw-r--r--src/mame/skeleton/qmquasar.cpp150
-rw-r--r--src/mame/skeleton/qmsirius.cpp95
-rw-r--r--src/mame/skeleton/qtsbc.cpp562
-rw-r--r--src/mame/skeleton/ramstar.cpp208
-rw-r--r--src/mame/skeleton/rd100.cpp291
-rw-r--r--src/mame/skeleton/rvoice.cpp149
-rw-r--r--src/mame/skeleton/sacstate.cpp177
-rw-r--r--src/mame/skeleton/sammy_pachislo_z80.cpp101
-rw-r--r--src/mame/skeleton/sansa_fuze.cpp79
-rw-r--r--src/mame/skeleton/sartorius.cpp111
-rw-r--r--src/mame/skeleton/sb180.cpp123
-rw-r--r--src/mame/skeleton/sb8085.cpp330
-rw-r--r--src/mame/skeleton/sbrain.cpp810
-rw-r--r--src/mame/skeleton/scopus.cpp246
-rw-r--r--src/mame/skeleton/seattlecmp.cpp159
-rw-r--r--src/mame/skeleton/semcrossw.cpp158
-rw-r--r--src/mame/skeleton/seoul88.cpp289
-rw-r--r--src/mame/skeleton/sgm.cpp191
-rw-r--r--src/mame/skeleton/sh4robot.cpp110
-rw-r--r--src/mame/skeleton/shine.cpp307
-rw-r--r--src/mame/skeleton/shoken_md06.cpp286
-rw-r--r--src/mame/skeleton/si5500.cpp238
-rw-r--r--src/mame/skeleton/sk101bl.cpp190
-rw-r--r--src/mame/skeleton/slsstars.cpp66
-rw-r--r--src/mame/skeleton/softbox.cpp499
-rw-r--r--src/mame/skeleton/solbourne.cpp59
-rw-r--r--src/mame/skeleton/squale.cpp737
-rw-r--r--src/mame/skeleton/sterz80.cpp232
-rw-r--r--src/mame/skeleton/swyft.cpp885
-rw-r--r--src/mame/skeleton/symbolics.cpp388
-rw-r--r--src/mame/skeleton/synthex.cpp237
-rw-r--r--src/mame/skeleton/sys2900.cpp174
-rw-r--r--src/mame/skeleton/sys9002.cpp191
-rw-r--r--src/mame/skeleton/systec.cpp124
-rw-r--r--src/mame/skeleton/systel1.cpp239
-rw-r--r--src/mame/skeleton/syvg.cpp164
-rw-r--r--src/mame/skeleton/tamagotchi_pix.cpp166
-rw-r--r--src/mame/skeleton/tavernie.cpp494
-rw-r--r--src/mame/skeleton/tc_manhattan.cpp106
-rw-r--r--src/mame/skeleton/tecnbras.cpp151
-rw-r--r--src/mame/skeleton/teleray10.cpp533
-rw-r--r--src/mame/skeleton/telex1192.cpp90
-rw-r--r--src/mame/skeleton/telex274.cpp185
-rw-r--r--src/mame/skeleton/telex277d.cpp78
-rw-r--r--src/mame/skeleton/terak.cpp121
-rw-r--r--src/mame/skeleton/terco.cpp328
-rw-r--r--src/mame/skeleton/terminal.cpp109
-rw-r--r--src/mame/skeleton/testlove.cpp95
-rw-r--r--src/mame/skeleton/testpat.cpp143
-rw-r--r--src/mame/skeleton/textelcomp.cpp390
-rw-r--r--src/mame/skeleton/ti630.cpp178
-rw-r--r--src/mame/skeleton/tk635.cpp218
-rw-r--r--src/mame/skeleton/tnshc08.cpp103
-rw-r--r--src/mame/skeleton/tr175.cpp136
-rw-r--r--src/mame/skeleton/tsispch.cpp551
-rw-r--r--src/mame/skeleton/tulip1.cpp201
-rw-r--r--src/mame/skeleton/turnierdart.cpp141
-rw-r--r--src/mame/skeleton/tvcobrasd.cpp215
-rw-r--r--src/mame/skeleton/tvdear.cpp220
-rw-r--r--src/mame/skeleton/unistar.cpp250
-rw-r--r--src/mame/skeleton/unkcrane8085.cpp160
-rw-r--r--src/mame/skeleton/v6809.cpp381
-rw-r--r--src/mame/skeleton/vanguardmk1.cpp51
-rw-r--r--src/mame/skeleton/vd56sp.cpp62
-rw-r--r--src/mame/skeleton/vector3.cpp202
-rw-r--r--src/mame/skeleton/vectrix.cpp74
-rw-r--r--src/mame/skeleton/venteta.cpp148
-rw-r--r--src/mame/skeleton/vgame.cpp341
-rw-r--r--src/mame/skeleton/vp415.cpp809
-rw-r--r--src/mame/skeleton/webtouchone.cpp168
-rw-r--r--src/mame/skeleton/xbase09.cpp203
-rw-r--r--src/mame/skeleton/xinyun.cpp183
-rw-r--r--src/mame/skeleton/xor100.cpp672
-rw-r--r--src/mame/skeleton/yeno_ks56c1660.cpp109
-rw-r--r--src/mame/skeleton/zeebo_qualcomm_adreno130.cpp147
-rw-r--r--src/mame/skeleton/zfirenze.cpp108
-rw-r--r--src/mame/skeleton/zms8085.cpp379
-rw-r--r--src/mame/skeleton/zorba.cpp661
-rw-r--r--src/mame/skeleton/zorbakbd.cpp340
-rw-r--r--src/mame/skeleton/zorbakbd.h43
-rw-r--r--src/mame/skeleton/zt8802.cpp106
-rw-r--r--src/mame/skeleton/zvenezia.cpp165
-rw-r--r--src/mame/slicer/slicer.cpp168
-rw-r--r--src/mame/snk/bbusters.cpp801
-rw-r--r--src/mame/snk/dmndrby.cpp952
-rw-r--r--src/mame/snk/drderby.cpp254
-rw-r--r--src/mame/snk/hng64.cpp3250
-rw-r--r--src/mame/snk/hng64.h552
-rw-r--r--src/mame/snk/hng64_3d.ipp1541
-rw-r--r--src/mame/snk/hng64_a.cpp335
-rw-r--r--src/mame/snk/hng64_sprite.ipp411
-rw-r--r--src/mame/snk/hng64_v.cpp1508
-rw-r--r--src/mame/snk/k1ge.cpp526
-rw-r--r--src/mame/snk/k1ge.h110
-rw-r--r--src/mame/snk/lasso.cpp1325
-rw-r--r--src/mame/snk/mainsnk.cpp693
-rw-r--r--src/mame/snk/mechatt.cpp711
-rw-r--r--src/mame/snk/miconkit.cpp337
-rw-r--r--src/mame/snk/munchmo.cpp665
-rw-r--r--src/mame/snk/neocrnvl.cpp93
-rw-r--r--src/mame/snk/ngp.cpp934
-rw-r--r--src/mame/snk/prehisle.cpp637
-rw-r--r--src/mame/snk/snk.cpp7072
-rw-r--r--src/mame/snk/snk.h382
-rw-r--r--src/mame/snk/snk6502.cpp1628
-rw-r--r--src/mame/snk/snk6502.h140
-rw-r--r--src/mame/snk/snk6502_a.cpp1214
-rw-r--r--src/mame/snk/snk6502_a.h195
-rw-r--r--src/mame/snk/snk6502_v.cpp277
-rw-r--r--src/mame/snk/snk68.cpp1570
-rw-r--r--src/mame/snk/snk_bbusters_spr.cpp222
-rw-r--r--src/mame/snk/snk_bbusters_spr.h42
-rw-r--r--src/mame/snk/snk_v.cpp1014
-rw-r--r--src/mame/sony/betacam.cpp142
-rw-r--r--src/mame/sony/bvm.cpp94
-rw-r--r--src/mame/sony/clie_db.cpp86
-rw-r--r--src/mame/sony/cxd8442q.cpp354
-rw-r--r--src/mame/sony/cxd8442q.h140
-rw-r--r--src/mame/sony/cxd8452aq.cpp295
-rw-r--r--src/mame/sony/cxd8452aq.h118
-rw-r--r--src/mame/sony/dfs500.cpp1062
-rw-r--r--src/mame/sony/dmac3.cpp228
-rw-r--r--src/mame/sony/dmac3.h193
-rw-r--r--src/mame/sony/dmac_0266.cpp200
-rw-r--r--src/mame/sony/dmac_0266.h80
-rw-r--r--src/mame/sony/dmac_0448.cpp193
-rw-r--r--src/mame/sony/dmac_0448.h99
-rw-r--r--src/mame/sony/dpsv55.cpp140
-rw-r--r--src/mame/sony/librie.cpp124
-rw-r--r--src/mame/sony/news_020_mmu.cpp355
-rw-r--r--src/mame/sony/news_020_mmu.h51
-rw-r--r--src/mame/sony/news_38xx.cpp1034
-rw-r--r--src/mame/sony/news_68k.cpp551
-rw-r--r--src/mame/sony/news_68k_iop.cpp1133
-rw-r--r--src/mame/sony/news_hid.cpp399
-rw-r--r--src/mame/sony/news_hid.h71
-rw-r--r--src/mame/sony/news_iop_scsi.cpp368
-rw-r--r--src/mame/sony/news_iop_scsi.h84
-rw-r--r--src/mame/sony/news_r3k.cpp649
-rw-r--r--src/mame/sony/news_r4k.cpp1247
-rw-r--r--src/mame/sony/pockstat.cpp1026
-rw-r--r--src/mame/sony/ps2sony.cpp931
-rw-r--r--src/mame/sony/psx.cpp706
-rw-r--r--src/mame/sony/psxcd.cpp1333
-rw-r--r--src/mame/sony/psxcd.h183
-rw-r--r--src/mame/sony/pve500.cpp476
-rw-r--r--src/mame/sony/smc777.cpp1095
-rw-r--r--src/mame/sony/smc777_kbd.cpp586
-rw-r--r--src/mame/sony/smc777_kbd.h62
-rw-r--r--src/mame/sony/taito_zm.cpp209
-rw-r--r--src/mame/sony/taito_zm.h62
-rw-r--r--src/mame/sony/taitogn.cpp1401
-rw-r--r--src/mame/sony/umatic.cpp98
-rw-r--r--src/mame/sony/zn.cpp6111
-rw-r--r--src/mame/sony/zn.h68
-rw-r--r--src/mame/sony/znmcu.cpp142
-rw-r--r--src/mame/sony/znmcu.h51
-rw-r--r--src/mame/sord/future32.cpp668
-rw-r--r--src/mame/sord/m5.cpp1809
-rw-r--r--src/mame/stern/astinvad.cpp881
-rw-r--r--src/mame/stern/berzerk.cpp1458
-rw-r--r--src/mame/stern/cliffhgr.cpp789
-rw-r--r--src/mame/stern/cliffhgr_a.cpp54
-rw-r--r--src/mame/stern/cliffhgr_a.h12
-rw-r--r--src/mame/stern/mazerbla.cpp1181
-rw-r--r--src/mame/stern/supdrapo.cpp624
-rw-r--r--src/mame/stm/pp.cpp504
-rw-r--r--src/mame/stm/stmpc.cpp229
-rw-r--r--src/mame/subsino/lastfght.cpp602
-rw-r--r--src/mame/subsino/subsino.cpp4645
-rw-r--r--src/mame/subsino/subsino2.cpp4368
-rw-r--r--src/mame/subsino/subsino_crypt.cpp107
-rw-r--r--src/mame/subsino/subsino_crypt.h25
-rw-r--r--src/mame/subsino/subsino_io.cpp172
-rw-r--r--src/mame/subsino/subsino_io.h64
-rw-r--r--src/mame/subsino/subsino_kr_h8.cpp194
-rw-r--r--src/mame/success/big10.cpp285
-rw-r--r--src/mame/success/kurukuru.cpp971
-rw-r--r--src/mame/success/othello.cpp457
-rw-r--r--src/mame/success/skopro.cpp81
-rw-r--r--src/mame/success/sothello.cpp408
-rw-r--r--src/mame/success/tonton.cpp265
-rw-r--r--src/mame/sun/e250.cpp121
-rw-r--r--src/mame/sun/sun1.cpp125
-rw-r--r--src/mame/sun/sun2.cpp846
-rw-r--r--src/mame/sun/sun3.cpp1339
-rw-r--r--src/mame/sun/sun3x.cpp729
-rw-r--r--src/mame/sun/sun4.cpp1884
-rw-r--r--src/mame/sun/sun_gem.cpp43
-rw-r--r--src/mame/sun/sun_gem.h23
-rw-r--r--src/mame/sun/ultra45.cpp83
-rw-r--r--src/mame/suna/go2000.cpp379
-rw-r--r--src/mame/suna/goindol.cpp610
-rw-r--r--src/mame/suna/suna16.cpp1377
-rw-r--r--src/mame/suna/suna16.h109
-rw-r--r--src/mame/suna/suna16_v.cpp247
-rw-r--r--src/mame/suna/suna8.cpp3140
-rw-r--r--src/mame/suna/suna8.h223
-rw-r--r--src/mame/suna/suna8_a.cpp81
-rw-r--r--src/mame/suna/suna8_v.cpp492
-rw-r--r--src/mame/sunelectronics/arabian.cpp880
-rw-r--r--src/mame/sunelectronics/blockch.cpp397
-rw-r--r--src/mame/sunelectronics/dai3wksi.cpp724
-rw-r--r--src/mame/sunelectronics/ikki.cpp615
-rw-r--r--src/mame/sunelectronics/kangaroo.cpp896
-rw-r--r--src/mame/sunelectronics/markham.cpp1093
-rw-r--r--src/mame/sunelectronics/route16.cpp1691
-rw-r--r--src/mame/sunelectronics/shangha3.cpp1114
-rw-r--r--src/mame/sunelectronics/shanghai.cpp737
-rw-r--r--src/mame/sunwise/anoworld.cpp509
-rw-r--r--src/mame/sunwise/jankenmn.cpp444
-rw-r--r--src/mame/sunwise/jankmg2.cpp188
-rw-r--r--src/mame/svi/svi318.cpp629
-rw-r--r--src/mame/svision/svis_snd.cpp304
-rw-r--r--src/mame/svision/svis_snd.h104
-rw-r--r--src/mame/svision/svision.cpp803
-rw-r--r--src/mame/swtpc/swtpc.cpp337
-rw-r--r--src/mame/swtpc/swtpc09.cpp703
-rw-r--r--src/mame/swtpc/swtpc09.h240
-rw-r--r--src/mame/swtpc/swtpc09_m.cpp1079
-rw-r--r--src/mame/swtpc/swtpc8212.cpp59
-rw-r--r--src/mame/synertek/ktm3.cpp304
-rw-r--r--src/mame/synertek/mbc020.cpp180
-rw-r--r--src/mame/synertek/sym1.cpp496
-rw-r--r--src/mame/ta/alphatpc16.cpp551
-rw-r--r--src/mame/ta/alphatpx.cpp1465
-rw-r--r--src/mame/ta/alphatro.cpp952
-rw-r--r--src/mame/tab/e22_kbd.cpp308
-rw-r--r--src/mame/tab/e22_kbd.h62
-rw-r--r--src/mame/tab/tabe22.cpp329
-rw-r--r--src/mame/taito/2mindril.cpp437
-rw-r--r--src/mame/taito/40love.cpp906
-rw-r--r--src/mame/taito/40love.h122
-rw-r--r--src/mame/taito/40love_v.cpp330
-rw-r--r--src/mame/taito/arkanoid.cpp2367
-rw-r--r--src/mame/taito/arkanoid.h128
-rw-r--r--src/mame/taito/arkanoid_m.cpp551
-rw-r--r--src/mame/taito/arkanoid_v.cpp217
-rw-r--r--src/mame/taito/ashnojoe.cpp650
-rw-r--r--src/mame/taito/asuka.cpp2297
-rw-r--r--src/mame/taito/bigevglf.cpp682
-rw-r--r--src/mame/taito/bingowav.cpp172
-rw-r--r--src/mame/taito/bking.cpp1135
-rw-r--r--src/mame/taito/bublbobl.cpp2166
-rw-r--r--src/mame/taito/bublbobl.h186
-rw-r--r--src/mame/taito/bublbobl_m.cpp423
-rw-r--r--src/mame/taito/bublbobl_v.cpp96
-rw-r--r--src/mame/taito/buggychl.cpp975
-rw-r--r--src/mame/taito/capr1.cpp270
-rw-r--r--src/mame/taito/caprcyc.cpp102
-rw-r--r--src/mame/taito/cchance.cpp332
-rw-r--r--src/mame/taito/chaknpop.cpp753
-rw-r--r--src/mame/taito/changela.cpp1329
-rw-r--r--src/mame/taito/cpzodiac.cpp250
-rw-r--r--src/mame/taito/crbaloon.cpp437
-rw-r--r--src/mame/taito/crbaloon.h83
-rw-r--r--src/mame/taito/crbaloon_a.cpp162
-rw-r--r--src/mame/taito/crbaloon_v.cpp145
-rw-r--r--src/mame/taito/cucaracha.cpp302
-rw-r--r--src/mame/taito/cyclemb.cpp1167
-rw-r--r--src/mame/taito/darius.cpp1323
-rw-r--r--src/mame/taito/dinoking.cpp216
-rw-r--r--src/mame/taito/exzisus.cpp535
-rw-r--r--src/mame/taito/fgoal.cpp610
-rw-r--r--src/mame/taito/flstory.cpp1553
-rw-r--r--src/mame/taito/galastrm.cpp944
-rw-r--r--src/mame/taito/gladiatr.cpp1457
-rw-r--r--src/mame/taito/gladiatr.h223
-rw-r--r--src/mame/taito/gladiatr_v.cpp299
-rw-r--r--src/mame/taito/grchamp.cpp953
-rw-r--r--src/mame/taito/grchamp.h152
-rw-r--r--src/mame/taito/grchamp_a.cpp63
-rw-r--r--src/mame/taito/grchamp_v.cpp527
-rw-r--r--src/mame/taito/groundfx.cpp671
-rw-r--r--src/mame/taito/gsword.cpp1235
-rw-r--r--src/mame/taito/gsword.h177
-rw-r--r--src/mame/taito/gsword_v.cpp190
-rw-r--r--src/mame/taito/gunbustr.cpp690
-rw-r--r--src/mame/taito/gunbustr_link.cpp655
-rw-r--r--src/mame/taito/gunbustr_link.h48
-rw-r--r--src/mame/taito/halleys.cpp2296
-rw-r--r--src/mame/taito/haplucky.cpp212
-rw-r--r--src/mame/taito/heromem.cpp334
-rw-r--r--src/mame/taito/invqix.cpp347
-rw-r--r--src/mame/taito/jollyjgr.cpp793
-rw-r--r--src/mame/taito/kikikai.cpp1391
-rw-r--r--src/mame/taito/ksayakyu.cpp538
-rw-r--r--src/mame/taito/lgp.cpp618
-rw-r--r--src/mame/taito/lkage.cpp1385
-rw-r--r--src/mame/taito/lsasquad.cpp1252
-rw-r--r--src/mame/taito/marinedt.cpp709
-rw-r--r--src/mame/taito/minivadr.cpp140
-rw-r--r--src/mame/taito/missb2.cpp618
-rw-r--r--src/mame/taito/mlanding.cpp1079
-rw-r--r--src/mame/taito/msisaac.cpp866
-rw-r--r--src/mame/taito/ninjaw.cpp1402
-rw-r--r--src/mame/taito/nl_sspeedr.cpp654
-rw-r--r--src/mame/taito/nl_sspeedr.h12
-rw-r--r--src/mame/taito/nycaptor.cpp1303
-rw-r--r--src/mame/taito/nycaptor.h125
-rw-r--r--src/mame/taito/nycaptor_v.cpp286
-rw-r--r--src/mame/taito/opwolf.cpp1142
-rw-r--r--src/mame/taito/othunder.cpp893
-rw-r--r--src/mame/taito/othunder.h108
-rw-r--r--src/mame/taito/othunder_v.cpp227
-rw-r--r--src/mame/taito/pc080sn.cpp434
-rw-r--r--src/mame/taito/pc080sn.h76
-rw-r--r--src/mame/taito/pc090oj.cpp230
-rw-r--r--src/mame/taito/pc090oj.h63
-rw-r--r--src/mame/taito/pitnrun.cpp1046
-rw-r--r--src/mame/taito/pkspirit.cpp543
-rw-r--r--src/mame/taito/qix.cpp1522
-rw-r--r--src/mame/taito/qix.h238
-rw-r--r--src/mame/taito/qix_a.cpp208
-rw-r--r--src/mame/taito/qix_m.cpp285
-rw-r--r--src/mame/taito/qix_v.cpp405
-rw-r--r--src/mame/taito/rastan.cpp823
-rw-r--r--src/mame/taito/rbisland.cpp1133
-rw-r--r--src/mame/taito/retofinv.cpp1086
-rw-r--r--src/mame/taito/rollrace.cpp748
-rw-r--r--src/mame/taito/roundup.cpp1912
-rw-r--r--src/mame/taito/sbmjb.cpp525
-rw-r--r--src/mame/taito/sbowling.cpp464
-rw-r--r--src/mame/taito/scyclone.cpp754
-rw-r--r--src/mame/taito/slapshot.cpp740
-rw-r--r--src/mame/taito/slapshot.h116
-rw-r--r--src/mame/taito/slapshot_v.cpp525
-rw-r--r--src/mame/taito/spdheat.cpp940
-rw-r--r--src/mame/taito/sspeedr.cpp648
-rw-r--r--src/mame/taito/ssrj.cpp496
-rw-r--r--src/mame/taito/superchs.cpp567
-rw-r--r--src/mame/taito/superchs.h76
-rw-r--r--src/mame/taito/superchs_v.cpp227
-rw-r--r--src/mame/taito/superqix.cpp1832
-rw-r--r--src/mame/taito/superqix.h212
-rw-r--r--src/mame/taito/superqix_v.cpp251
-rw-r--r--src/mame/taito/suprridr.cpp680
-rw-r--r--src/mame/taito/taito_b.cpp3726
-rw-r--r--src/mame/taito/taito_b.h195
-rw-r--r--src/mame/taito/taito_b_v.cpp209
-rw-r--r--src/mame/taito/taito_en.cpp262
-rw-r--r--src/mame/taito/taito_en.h76
-rw-r--r--src/mame/taito/taito_f2.cpp5670
-rw-r--r--src/mame/taito/taito_f2.h386
-rw-r--r--src/mame/taito/taito_f2_v.cpp1306
-rw-r--r--src/mame/taito/taito_f3.cpp4738
-rw-r--r--src/mame/taito/taito_f3.h458
-rw-r--r--src/mame/taito/taito_f3_v.cpp1466
-rw-r--r--src/mame/taito/taito_h.cpp1043
-rw-r--r--src/mame/taito/taito_h.h87
-rw-r--r--src/mame/taito/taito_h_v.cpp195
-rw-r--r--src/mame/taito/taito_helper.cpp44
-rw-r--r--src/mame/taito/taito_helper.h13
-rw-r--r--src/mame/taito/taito_l.cpp2557
-rw-r--r--src/mame/taito/taito_o.cpp516
-rw-r--r--src/mame/taito/taito_x.cpp1430
-rw-r--r--src/mame/taito/taito_z.cpp5721
-rw-r--r--src/mame/taito/taito_z.h318
-rw-r--r--src/mame/taito/taito_z_v.cpp1050
-rw-r--r--src/mame/taito/taitoair.cpp1029
-rw-r--r--src/mame/taito/taitoair.h158
-rw-r--r--src/mame/taito/taitoair_v.cpp462
-rw-r--r--src/mame/taito/taitocchip.cpp228
-rw-r--r--src/mame/taito/taitocchip.h62
-rw-r--r--src/mame/taito/taitoio.cpp574
-rw-r--r--src/mame/taito/taitoio.h185
-rw-r--r--src/mame/taito/taitoio_opto.cpp79
-rw-r--r--src/mame/taito/taitoio_opto.h39
-rw-r--r--src/mame/taito/taitoio_yoke.cpp143
-rw-r--r--src/mame/taito/taitoio_yoke.h54
-rw-r--r--src/mame/taito/taitoipt.h (renamed from src/mame/includes/taitoipt.h)5
-rw-r--r--src/mame/taito/taitojc.cpp2269
-rw-r--r--src/mame/taito/taitojc.h179
-rw-r--r--src/mame/taito/taitojc_v.cpp296
-rw-r--r--src/mame/taito/taitopjc.cpp1296
-rw-r--r--src/mame/taito/taitosj.cpp2850
-rw-r--r--src/mame/taito/taitosj.h168
-rw-r--r--src/mame/taito/taitosj_m.cpp162
-rw-r--r--src/mame/taito/taitosj_v.cpp700
-rw-r--r--src/mame/taito/taitosjsec.cpp229
-rw-r--r--src/mame/taito/taitosjsec.h94
-rw-r--r--src/mame/taito/taitottl.cpp480
-rw-r--r--src/mame/taito/taitotx.cpp455
-rw-r--r--src/mame/taito/taitotz.cpp3024
-rw-r--r--src/mame/taito/taitowlf.cpp713
-rw-r--r--src/mame/taito/tc0060dca.cpp54
-rw-r--r--src/mame/taito/tc0060dca.h31
-rw-r--r--src/mame/taito/tc0080vco.cpp786
-rw-r--r--src/mame/taito/tc0080vco.h106
-rw-r--r--src/mame/taito/tc0100scn.cpp709
-rw-r--r--src/mame/taito/tc0100scn.h143
-rw-r--r--src/mame/taito/tc0110pcr.cpp113
-rw-r--r--src/mame/taito/tc0110pcr.h47
-rw-r--r--src/mame/taito/tc0150rod.cpp784
-rw-r--r--src/mame/taito/tc0150rod.h30
-rw-r--r--src/mame/taito/tc0180vcu.cpp599
-rw-r--r--src/mame/taito/tc0180vcu.h81
-rw-r--r--src/mame/taito/tc0280grd.cpp160
-rw-r--r--src/mame/taito/tc0280grd.h59
-rw-r--r--src/mame/taito/tc0360pri.cpp94
-rw-r--r--src/mame/taito/tc0360pri.h29
-rw-r--r--src/mame/taito/tc0480scp.cpp964
-rw-r--r--src/mame/taito/tc0480scp.h103
-rw-r--r--src/mame/taito/tc0780fpa.cpp489
-rw-r--r--src/mame/taito/tc0780fpa.h79
-rw-r--r--src/mame/taito/tnzs.cpp3685
-rw-r--r--src/mame/taito/tnzs_video.cpp46
-rw-r--r--src/mame/taito/tnzs_video.h36
-rw-r--r--src/mame/taito/topspeed.cpp1169
-rw-r--r--src/mame/taito/tsamurai.cpp1376
-rw-r--r--src/mame/taito/tsamurai.h177
-rw-r--r--src/mame/taito/tsamurai_v.cpp298
-rw-r--r--src/mame/taito/undrfire.cpp957
-rw-r--r--src/mame/taito/undrfire.h106
-rw-r--r--src/mame/taito/undrfire_v.cpp605
-rw-r--r--src/mame/taito/vicshoot.cpp165
-rw-r--r--src/mame/taito/volfied.cpp653
-rw-r--r--src/mame/taito/warriorb.cpp920
-rw-r--r--src/mame/taito/wgp.cpp2023
-rw-r--r--src/mame/taito/wyvernf0.cpp742
-rw-r--r--src/mame/tandberg/tdv2100_disp_logic.cpp1108
-rw-r--r--src/mame/tandberg/tdv2100_disp_logic.h147
-rw-r--r--src/mame/tandberg/tdv2100_kbd.cpp576
-rw-r--r--src/mame/tandberg/tdv2100_kbd.h86
-rw-r--r--src/mame/tandberg/tdv2115l.cpp65
-rw-r--r--src/mame/tandberg/tdv2324.cpp361
-rw-r--r--src/mame/tandberg/tdv2324.h92
-rw-r--r--src/mame/tangerine/alphatan.cpp235
-rw-r--r--src/mame/tangerine/hhtiger.cpp596
-rw-r--r--src/mame/tangerine/microtan.cpp407
-rw-r--r--src/mame/tangerine/microtan.h120
-rw-r--r--src/mame/tangerine/microtan_m.cpp491
-rw-r--r--src/mame/tangerine/microtan_v.cpp54
-rw-r--r--src/mame/tangerine/oric.cpp992
-rw-r--r--src/mame/tatsumi/apache3.cpp671
-rw-r--r--src/mame/tatsumi/cyclwarr.cpp1284
-rw-r--r--src/mame/tatsumi/kingdrby.cpp1247
-rw-r--r--src/mame/tatsumi/lockon.cpp761
-rw-r--r--src/mame/tatsumi/lockon.h161
-rw-r--r--src/mame/tatsumi/lockon_v.cpp921
-rw-r--r--src/mame/tatsumi/roundup5.cpp782
-rw-r--r--src/mame/tatsumi/tatsumi.cpp183
-rw-r--r--src/mame/tatsumi/tatsumi.h77
-rw-r--r--src/mame/tatsumi/tx1.cpp848
-rw-r--r--src/mame/tatsumi/tx1.h246
-rw-r--r--src/mame/tatsumi/tx1_a.cpp1101
-rw-r--r--src/mame/tatsumi/tx1_a.h189
-rw-r--r--src/mame/tatsumi/tx1_m.cpp1345
-rw-r--r--src/mame/tatsumi/tx1_v.cpp3074
-rw-r--r--src/mame/tatsumi/tzbx15_sprites.cpp562
-rw-r--r--src/mame/tatsumi/tzbx15_sprites.h83
-rw-r--r--src/mame/tatung/einstein.cpp1077
-rw-r--r--src/mame/tch/kickgoal.cpp838
-rw-r--r--src/mame/tch/littlerb.cpp338
-rw-r--r--src/mame/tch/rltennis.cpp558
-rw-r--r--src/mame/tch/speedspn.cpp508
-rw-r--r--src/mame/tch/topdrive.cpp317
-rw-r--r--src/mame/tch/wheelfir.cpp982
-rw-r--r--src/mame/teamconcepts/comquest.cpp345
-rw-r--r--src/mame/tecfri/ambush.cpp977
-rw-r--r--src/mame/tecfri/holeland.cpp869
-rw-r--r--src/mame/tecfri/sauro.cpp1177
-rw-r--r--src/mame/tecfri/speedbal.cpp634
-rw-r--r--src/mame/technos/battlane.cpp686
-rw-r--r--src/mame/technos/blockout.cpp607
-rw-r--r--src/mame/technos/bogeyman.cpp504
-rw-r--r--src/mame/technos/chinagat.cpp1110
-rw-r--r--src/mame/technos/ddragon.cpp2470
-rw-r--r--src/mame/technos/ddragon.h204
-rw-r--r--src/mame/technos/ddragon3.cpp1524
-rw-r--r--src/mame/technos/ddragon3.h159
-rw-r--r--src/mame/technos/ddragon3_v.cpp317
-rw-r--r--src/mame/technos/ddragon_ms.cpp186
-rw-r--r--src/mame/technos/ddragon_v.cpp232
-rw-r--r--src/mame/technos/dogfgt.cpp693
-rw-r--r--src/mame/technos/matmania.cpp942
-rw-r--r--src/mame/technos/mystston.cpp689
-rw-r--r--src/mame/technos/renegade.cpp945
-rw-r--r--src/mame/technos/shadfrce.cpp933
-rw-r--r--src/mame/technos/spdodgeb.cpp741
-rw-r--r--src/mame/technos/ssozumo.cpp502
-rw-r--r--src/mame/technos/tagteam.cpp587
-rw-r--r--src/mame/technos/vball.cpp789
-rw-r--r--src/mame/technos/wwfsstar.cpp1058
-rw-r--r--src/mame/technos/xain.cpp876
-rw-r--r--src/mame/technos/xain.h103
-rw-r--r--src/mame/technos/xain_v.cpp221
-rw-r--r--src/mame/tecmo/bombjack.cpp1090
-rw-r--r--src/mame/tecmo/gaiden.cpp2266
-rw-r--r--src/mame/tecmo/lvcards.cpp840
-rw-r--r--src/mame/tecmo/pbaction.cpp977
-rw-r--r--src/mame/tecmo/senjyo.cpp1416
-rw-r--r--src/mame/tecmo/shadoww_ms.cpp469
-rw-r--r--src/mame/tecmo/solomon.cpp450
-rw-r--r--src/mame/tecmo/spbactn.cpp939
-rw-r--r--src/mame/tecmo/tbowl.cpp912
-rw-r--r--src/mame/tecmo/tecmo.cpp1848
-rw-r--r--src/mame/tecmo/tecmo16.cpp1014
-rw-r--r--src/mame/tecmo/tecmo_mix.cpp323
-rw-r--r--src/mame/tecmo/tecmo_mix.h87
-rw-r--r--src/mame/tecmo/tecmosys.cpp765
-rw-r--r--src/mame/tecmo/tecmosys.h125
-rw-r--r--src/mame/tecmo/tecmosys_m.cpp235
-rw-r--r--src/mame/tecmo/tecmosys_v.cpp379
-rw-r--r--src/mame/tecmo/tehkanwc.cpp1179
-rw-r--r--src/mame/tecmo/wc90.cpp812
-rw-r--r--src/mame/tecmo/wc90b.cpp1060
-rw-r--r--src/mame/tektronix/tek405x.cpp1193
-rw-r--r--src/mame/tektronix/tek405x.h176
-rw-r--r--src/mame/tektronix/tek410x.cpp383
-rw-r--r--src/mame/tektronix/tek410x_kbd.cpp379
-rw-r--r--src/mame/tektronix/tek410x_kbd.h67
-rw-r--r--src/mame/tektronix/tek43xx.cpp70
-rw-r--r--src/mame/tektronix/tek440x.cpp495
-rw-r--r--src/mame/tektronix/tek_msu_fdc.cpp228
-rw-r--r--src/mame/tektronix/tek_msu_fdc.h53
-rw-r--r--src/mame/tektronix/tekigw.cpp1024
-rw-r--r--src/mame/tektronix/tekxp33x.cpp137
-rw-r--r--src/mame/tektronix/xd88.cpp93
-rw-r--r--src/mame/telenova/compis.cpp889
-rw-r--r--src/mame/telenova/compiskb.cpp357
-rw-r--r--src/mame/telenova/compiskb.h64
-rw-r--r--src/mame/telercas/tmc1800.cpp936
-rw-r--r--src/mame/telercas/tmc1800.h202
-rw-r--r--src/mame/telercas/tmc1800_v.cpp88
-rw-r--r--src/mame/telercas/tmc2000e.cpp332
-rw-r--r--src/mame/telercas/tmc2000e.h77
-rw-r--r--src/mame/telercas/tmc600.cpp414
-rw-r--r--src/mame/telercas/tmc600.h103
-rw-r--r--src/mame/telercas/tmc600_v.cpp133
-rw-r--r--src/mame/televideo/ts3000.cpp64
-rw-r--r--src/mame/televideo/ts802.cpp255
-rw-r--r--src/mame/televideo/ts803.cpp493
-rw-r--r--src/mame/televideo/ts816.cpp334
-rw-r--r--src/mame/televideo/tv910.cpp585
-rw-r--r--src/mame/televideo/tv912.cpp975
-rw-r--r--src/mame/televideo/tv924.cpp104
-rw-r--r--src/mame/televideo/tv950.cpp371
-rw-r--r--src/mame/televideo/tv950kb.cpp215
-rw-r--r--src/mame/televideo/tv950kb.h54
-rw-r--r--src/mame/televideo/tv955.cpp228
-rw-r--r--src/mame/televideo/tv955kb.cpp310
-rw-r--r--src/mame/televideo/tv955kb.h62
-rw-r--r--src/mame/televideo/tv965.cpp245
-rw-r--r--src/mame/televideo/tv990.cpp450
-rw-r--r--src/mame/tesla/ondra.cpp225
-rw-r--r--src/mame/tesla/ondra.h65
-rw-r--r--src/mame/tesla/ondra_m.cpp129
-rw-r--r--src/mame/tesla/pmd85.cpp880
-rw-r--r--src/mame/tesla/pmd85.h152
-rw-r--r--src/mame/tesla/pmd85_m.cpp793
-rw-r--r--src/mame/tesla/pmi80.cpp255
-rw-r--r--src/mame/tesla/sapi1.cpp961
-rw-r--r--src/mame/thomson/thomson.cpp2165
-rw-r--r--src/mame/thomson/thomson.h462
-rw-r--r--src/mame/thomson/thomson_m.cpp3084
-rw-r--r--src/mame/thomson/to_kbd.cpp999
-rw-r--r--src/mame/thomson/to_kbd.h121
-rw-r--r--src/mame/thomson/to_video.cpp1630
-rw-r--r--src/mame/thomson/to_video.h291
-rw-r--r--src/mame/ti/733_asr.cpp644
-rw-r--r--src/mame/ti/733_asr.h83
-rw-r--r--src/mame/ti/911_chr.h3516
-rw-r--r--src/mame/ti/911_key.h4028
-rw-r--r--src/mame/ti/911_vdt.cpp803
-rw-r--r--src/mame/ti/911_vdt.h115
-rw-r--r--src/mame/ti/avigo.cpp904
-rw-r--r--src/mame/ti/avigo.h121
-rw-r--r--src/mame/ti/avigo_v.cpp104
-rw-r--r--src/mame/ti/cc40.cpp704
-rw-r--r--src/mame/ti/evmbug.cpp203
-rw-r--r--src/mame/ti/exelv.cpp975
-rw-r--r--src/mame/ti/geneve.cpp1310
-rw-r--r--src/mame/ti/snspell.cpp1184
-rw-r--r--src/mame/ti/snspellc.cpp888
-rw-r--r--src/mame/ti/spellb.cpp596
-rw-r--r--src/mame/ti/ti74.cpp624
-rw-r--r--src/mame/ti/ti85.cpp1192
-rw-r--r--src/mame/ti/ti85.h262
-rw-r--r--src/mame/ti/ti85_m.cpp1211
-rw-r--r--src/mame/ti/ti85_v.cpp186
-rw-r--r--src/mame/ti/ti89.cpp788
-rw-r--r--src/mame/ti/ti931.cpp150
-rw-r--r--src/mame/ti/ti990_10.cpp407
-rw-r--r--src/mame/ti/ti990_4.cpp367
-rw-r--r--src/mame/ti/ti99_2.cpp512
-rw-r--r--src/mame/ti/ti99_4p.cpp1068
-rw-r--r--src/mame/ti/ti99_4x.cpp1210
-rw-r--r--src/mame/ti/ti99_8.cpp896
-rw-r--r--src/mame/ti/tipc.cpp589
-rw-r--r--src/mame/ti/tm990189.cpp974
-rw-r--r--src/mame/tiger/bingobear.cpp271
-rw-r--r--src/mame/tiger/gamecom.cpp302
-rw-r--r--src/mame/tiger/gamecom.h309
-rw-r--r--src/mame/tiger/gamecom_m.cpp662
-rw-r--r--src/mame/tiger/gamecom_v.cpp77
-rw-r--r--src/mame/tiger/k28.cpp364
-rw-r--r--src/mame/tiger/k28o.cpp384
-rw-r--r--src/mame/tiger/pylo.cpp226
-rw-r--r--src/mame/tigertel/docg3.cpp855
-rw-r--r--src/mame/tigertel/docg3.h100
-rw-r--r--src/mame/tigertel/gizmondo.cpp245
-rw-r--r--src/mame/tiki/tiki100.cpp828
-rw-r--r--src/mame/tiki/tiki100.h165
-rw-r--r--src/mame/tiny.c59
-rw-r--r--src/mame/tiny.lst95
-rw-r--r--src/mame/tiny.mak96
-rw-r--r--src/mame/tms/vet3000.cpp204
-rw-r--r--src/mame/toaplan/batsugun.cpp662
-rw-r--r--src/mame/toaplan/dogyuun.cpp494
-rw-r--r--src/mame/toaplan/dt7.cpp632
-rw-r--r--src/mame/toaplan/enmadaio.cpp397
-rw-r--r--src/mame/toaplan/fireshrk.cpp822
-rw-r--r--src/mame/toaplan/fixeight.cpp704
-rw-r--r--src/mame/toaplan/ghox.cpp330
-rw-r--r--src/mame/toaplan/gp9001.cpp924
-rw-r--r--src/mame/toaplan/gp9001.h173
-rw-r--r--src/mame/toaplan/kbash.cpp493
-rw-r--r--src/mame/toaplan/mjsister.cpp461
-rw-r--r--src/mame/toaplan/pipibibi.cpp477
-rw-r--r--src/mame/toaplan/raizing.cpp1289
-rw-r--r--src/mame/toaplan/raizing.h101
-rw-r--r--src/mame/toaplan/raizing_batrider.cpp1411
-rw-r--r--src/mame/toaplan/rallybik.cpp432
-rw-r--r--src/mame/toaplan/slapfght.cpp2147
-rw-r--r--src/mame/toaplan/slapfght.h202
-rw-r--r--src/mame/toaplan/slapfght_m.cpp283
-rw-r--r--src/mame/toaplan/slapfght_ms.cpp464
-rw-r--r--src/mame/toaplan/slapfght_v.cpp235
-rw-r--r--src/mame/toaplan/snowbro2.cpp441
-rw-r--r--src/mame/toaplan/sunwise.cpp694
-rw-r--r--src/mame/toaplan/tekipaki.cpp338
-rw-r--r--src/mame/toaplan/toaplan1.cpp2880
-rw-r--r--src/mame/toaplan/toaplan_bcu.cpp333
-rw-r--r--src/mame/toaplan/toaplan_bcu.h92
-rw-r--r--src/mame/toaplan/toaplan_coincounter.cpp43
-rw-r--r--src/mame/toaplan/toaplan_coincounter.h25
-rw-r--r--src/mame/toaplan/toaplan_dsp.cpp154
-rw-r--r--src/mame/toaplan/toaplan_dsp.h67
-rw-r--r--src/mame/toaplan/toaplan_fcu.cpp262
-rw-r--r--src/mame/toaplan/toaplan_fcu.h79
-rw-r--r--src/mame/toaplan/toaplan_scu.cpp130
-rw-r--r--src/mame/toaplan/toaplan_scu.h50
-rw-r--r--src/mame/toaplan/toaplan_txtilemap.cpp157
-rw-r--r--src/mame/toaplan/toaplan_txtilemap.h71
-rw-r--r--src/mame/toaplan/toaplan_v25_tables.h179
-rw-r--r--src/mame/toaplan/toaplan_video_controller.cpp139
-rw-r--r--src/mame/toaplan/toaplan_video_controller.h65
-rw-r--r--src/mame/toaplan/toaplipt.h188
-rw-r--r--src/mame/toaplan/truxton2.cpp291
-rw-r--r--src/mame/toaplan/twincobr.cpp1486
-rw-r--r--src/mame/toaplan/twincobr.h150
-rw-r--r--src/mame/toaplan/twincobr_m.cpp152
-rw-r--r--src/mame/toaplan/twincobr_ms.cpp179
-rw-r--r--src/mame/toaplan/twincobr_v.cpp408
-rw-r--r--src/mame/toaplan/vfive.cpp341
-rw-r--r--src/mame/toaplan/wardner.cpp760
-rw-r--r--src/mame/tomy/kisssite.cpp109
-rw-r--r--src/mame/tomy/tomy_princ.cpp1487
-rw-r--r--src/mame/tomy/tutor.cpp822
-rw-r--r--src/mame/torch/quadx.cpp172
-rw-r--r--src/mame/torch/triplex.cpp431
-rw-r--r--src/mame/toshiba/paso1600.cpp347
-rw-r--r--src/mame/toshiba/pasopia.cpp462
-rw-r--r--src/mame/toshiba/pasopia.h106
-rw-r--r--src/mame/toshiba/pasopia7.cpp945
-rw-r--r--src/mame/trainer/amico2k.cpp257
-rw-r--r--src/mame/trainer/babbage.cpp288
-rw-r--r--src/mame/trainer/bob85.cpp267
-rw-r--r--src/mame/trainer/crei680.cpp344
-rw-r--r--src/mame/trainer/cvicny.cpp170
-rw-r--r--src/mame/trainer/dolphunk.cpp293
-rw-r--r--src/mame/trainer/emma2.cpp236
-rw-r--r--src/mame/trainer/instruct.cpp455
-rw-r--r--src/mame/trainer/mac3.cpp287
-rw-r--r--src/mame/trainer/mcg85.cpp85
-rw-r--r--src/mame/trainer/mk14.cpp475
-rw-r--r--src/mame/trainer/ms68k.cpp326
-rw-r--r--src/mame/trainer/pro80.cpp221
-rw-r--r--src/mame/trainer/savia84.cpp212
-rw-r--r--src/mame/trainer/selz80.cpp303
-rw-r--r--src/mame/trainer/thaler.cpp177
-rw-r--r--src/mame/trainer/tk80.cpp432
-rw-r--r--src/mame/trainer/zapcomputer.cpp185
-rw-r--r--src/mame/trs/agvision.cpp407
-rw-r--r--src/mame/trs/coco.cpp1339
-rw-r--r--src/mame/trs/coco.h264
-rw-r--r--src/mame/trs/coco12.cpp775
-rw-r--r--src/mame/trs/coco12.h119
-rw-r--r--src/mame/trs/coco12_m.cpp160
-rw-r--r--src/mame/trs/coco3.cpp386
-rw-r--r--src/mame/trs/coco3.h64
-rw-r--r--src/mame/trs/coco3_m.cpp160
-rw-r--r--src/mame/trs/coco_vhd.cpp268
-rw-r--r--src/mame/trs/coco_vhd.h73
-rw-r--r--src/mame/trs/dgn_beta.cpp402
-rw-r--r--src/mame/trs/dgn_beta.h235
-rw-r--r--src/mame/trs/dgn_beta_m.cpp839
-rw-r--r--src/mame/trs/dgn_beta_v.cpp286
-rw-r--r--src/mame/trs/dgnalpha.cpp388
-rw-r--r--src/mame/trs/dragon.cpp708
-rw-r--r--src/mame/trs/dragon.h151
-rw-r--r--src/mame/trs/gime.cpp2212
-rw-r--r--src/mame/trs/gime.h294
-rw-r--r--src/mame/trs/lnw80.cpp677
-rw-r--r--src/mame/trs/max80.cpp517
-rw-r--r--src/mame/trs/mc10.cpp629
-rw-r--r--src/mame/trs/meritum.cpp481
-rw-r--r--src/mame/trs/radionic.cpp587
-rw-r--r--src/mame/trs/tandy2k.cpp1150
-rw-r--r--src/mame/trs/tandy2k.h277
-rw-r--r--src/mame/trs/tandy2kb.cpp394
-rw-r--r--src/mame/trs/tandy2kb.h82
-rw-r--r--src/mame/trs/trs80.cpp687
-rw-r--r--src/mame/trs/trs80.h129
-rw-r--r--src/mame/trs/trs80_m.cpp351
-rw-r--r--src/mame/trs/trs80_quik.cpp155
-rw-r--r--src/mame/trs/trs80_quik.h39
-rw-r--r--src/mame/trs/trs80_v.cpp215
-rw-r--r--src/mame/trs/trs80dt1.cpp419
-rw-r--r--src/mame/trs/trs80m2.cpp958
-rw-r--r--src/mame/trs/trs80m2.h176
-rw-r--r--src/mame/trs/trs80m2kb.cpp354
-rw-r--r--src/mame/trs/trs80m2kb.h83
-rw-r--r--src/mame/trs/trs80m3.cpp572
-rw-r--r--src/mame/trs/trs80m3.h155
-rw-r--r--src/mame/trs/trs80m3_m.cpp641
-rw-r--r--src/mame/trs/trs80m3_v.cpp132
-rw-r--r--src/mame/trs/vis.cpp1120
-rw-r--r--src/mame/tryom/chess.cpp286
-rw-r--r--src/mame/tryom/gammonm.cpp201
-rw-r--r--src/mame/tryom/omar.cpp382
-rw-r--r--src/mame/tvgames/actions_atj2279b.cpp106
-rw-r--r--src/mame/tvgames/elan_ep3a19a.cpp175
-rw-r--r--src/mame/tvgames/elan_eu3a05.cpp995
-rw-r--r--src/mame/tvgames/elan_eu3a14.cpp849
-rw-r--r--src/mame/tvgames/generalplus_gp327902.cpp242
-rw-r--r--src/mame/tvgames/generalplus_gpl16250.cpp217
-rw-r--r--src/mame/tvgames/generalplus_gpl16250.h74
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_mobigo.cpp183
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_nand.cpp964
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_nand.h92
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_rom.cpp864
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_romram.cpp671
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_romram.h124
-rw-r--r--src/mame/tvgames/generalplus_gpl16250_spi.cpp374
-rw-r--r--src/mame/tvgames/generalplus_gpl32612.cpp723
-rw-r--r--src/mame/tvgames/generalplus_gpm453x_nand.cpp110
-rw-r--r--src/mame/tvgames/generalplus_gpm453x_sdcard.cpp178
-rw-r--r--src/mame/tvgames/hyperscan_card.cpp282
-rw-r--r--src/mame/tvgames/hyperscan_card.h53
-rw-r--r--src/mame/tvgames/hyperscan_ctrl.cpp106
-rw-r--r--src/mame/tvgames/hyperscan_ctrl.h31
-rw-r--r--src/mame/tvgames/magiceyes_pollux_vr3520f.cpp123
-rw-r--r--src/mame/tvgames/micom_mahjong.cpp246
-rw-r--r--src/mame/tvgames/monkey_king_3b.cpp265
-rw-r--r--src/mame/tvgames/myaatari.cpp116
-rw-r--r--src/mame/tvgames/pubint_storyreader.cpp177
-rw-r--r--src/mame/tvgames/spg110.cpp787
-rw-r--r--src/mame/tvgames/spg29x.cpp633
-rw-r--r--src/mame/tvgames/spg29x_lexibook_jg7425.cpp249
-rw-r--r--src/mame/tvgames/spg2xx.cpp3383
-rw-r--r--src/mame/tvgames/spg2xx.h512
-rw-r--r--src/mame/tvgames/spg2xx_digimake.cpp225
-rw-r--r--src/mame/tvgames/spg2xx_dreamlife.cpp145
-rw-r--r--src/mame/tvgames/spg2xx_ican.cpp510
-rw-r--r--src/mame/tvgames/spg2xx_jakks.cpp818
-rw-r--r--src/mame/tvgames/spg2xx_jakks_gkr.cpp721
-rw-r--r--src/mame/tvgames/spg2xx_jakks_sharp.cpp116
-rw-r--r--src/mame/tvgames/spg2xx_jakks_tvtouch.cpp297
-rw-r--r--src/mame/tvgames/spg2xx_lexibook.cpp539
-rw-r--r--src/mame/tvgames/spg2xx_mysprtch.cpp470
-rw-r--r--src/mame/tvgames/spg2xx_pdc.cpp395
-rw-r--r--src/mame/tvgames/spg2xx_playvision.cpp237
-rw-r--r--src/mame/tvgames/spg2xx_senario.cpp337
-rw-r--r--src/mame/tvgames/spg2xx_senario_poker.cpp733
-rw-r--r--src/mame/tvgames/spg2xx_senca.cpp1081
-rw-r--r--src/mame/tvgames/spg2xx_shredmjr.cpp251
-rw-r--r--src/mame/tvgames/spg2xx_skannerztv.cpp438
-rw-r--r--src/mame/tvgames/spg2xx_smarttv.cpp235
-rw-r--r--src/mame/tvgames/spg2xx_telestory.cpp309
-rw-r--r--src/mame/tvgames/spg2xx_tvgogo.cpp270
-rw-r--r--src/mame/tvgames/spg2xx_vii.cpp177
-rw-r--r--src/mame/tvgames/spg2xx_wiwi.cpp1063
-rw-r--r--src/mame/tvgames/spg2xx_zone.cpp428
-rw-r--r--src/mame/tvgames/titan_soc.cpp175
-rw-r--r--src/mame/tvgames/trkfldch.cpp1768
-rw-r--r--src/mame/tvgames/tvgame.cpp143
-rw-r--r--src/mame/tvgames/xavix.cpp2973
-rw-r--r--src/mame/tvgames/xavix.h1222
-rw-r--r--src/mame/tvgames/xavix2.cpp856
-rw-r--r--src/mame/tvgames/xavix2002_io.cpp116
-rw-r--r--src/mame/tvgames/xavix2002_io.h49
-rw-r--r--src/mame/tvgames/xavix_2000.cpp462
-rw-r--r--src/mame/tvgames/xavix_2000.h27
-rw-r--r--src/mame/tvgames/xavix_2002.cpp1215
-rw-r--r--src/mame/tvgames/xavix_2002.h142
-rw-r--r--src/mame/tvgames/xavix_adc.cpp91
-rw-r--r--src/mame/tvgames/xavix_adc.h50
-rw-r--r--src/mame/tvgames/xavix_anport.cpp77
-rw-r--r--src/mame/tvgames/xavix_anport.h41
-rw-r--r--src/mame/tvgames/xavix_io.cpp97
-rw-r--r--src/mame/tvgames/xavix_io.h42
-rw-r--r--src/mame/tvgames/xavix_m.cpp1298
-rw-r--r--src/mame/tvgames/xavix_madfb_ball.cpp86
-rw-r--r--src/mame/tvgames/xavix_madfb_ball.h39
-rw-r--r--src/mame/tvgames/xavix_math.cpp180
-rw-r--r--src/mame/tvgames/xavix_math.h40
-rw-r--r--src/mame/tvgames/xavix_mtrk_wheel.cpp90
-rw-r--r--src/mame/tvgames/xavix_mtrk_wheel.h40
-rw-r--r--src/mame/tvgames/xavix_sound.cpp903
-rw-r--r--src/mame/tvgames/xavix_sound.h139
-rw-r--r--src/mame/tvgames/xavix_v.cpp1800
-rw-r--r--src/mame/ultimachine/rambo.cpp171
-rw-r--r--src/mame/ultratec/minicom.cpp259
-rw-r--r--src/mame/umc/pc486vl.cpp232
-rw-r--r--src/mame/umc/supracan.cpp2473
-rw-r--r--src/mame/umc/umc6619_sound.cpp355
-rw-r--r--src/mame/umc/umc6619_sound.h73
-rw-r--r--src/mame/umc/umc6650.cpp80
-rw-r--r--src/mame/umc/umc6650.h33
-rw-r--r--src/mame/unicard/bbcbc.cpp190
-rw-r--r--src/mame/unico/drgnmst.cpp700
-rw-r--r--src/mame/unico/drgnmst.h147
-rw-r--r--src/mame/unico/drgnmst_v.cpp285
-rw-r--r--src/mame/unico/goori.cpp323
-rw-r--r--src/mame/unico/silkroad.cpp545
-rw-r--r--src/mame/unico/unianapc.cpp105
-rw-r--r--src/mame/unico/unico.cpp1392
-rw-r--r--src/mame/unisonic/gic.cpp313
-rw-r--r--src/mame/unisonic/gic.h99
-rw-r--r--src/mame/unisonic/unichamp.cpp286
-rw-r--r--src/mame/unisys/univac.cpp684
-rw-r--r--src/mame/universal/cheekyms.cpp421
-rw-r--r--src/mame/universal/cheekyms_a.cpp64
-rw-r--r--src/mame/universal/cheekyms_a.h44
-rw-r--r--src/mame/universal/cosmic.cpp1389
-rw-r--r--src/mame/universal/cosmic.h120
-rw-r--r--src/mame/universal/cosmic_v.cpp522
-rw-r--r--src/mame/universal/cosmicg.cpp443
-rw-r--r--src/mame/universal/docastle.cpp1666
-rw-r--r--src/mame/universal/getaway.cpp429
-rw-r--r--src/mame/universal/ladybug.cpp902
-rw-r--r--src/mame/universal/ladybug_video.cpp111
-rw-r--r--src/mame/universal/ladybug_video.h44
-rw-r--r--src/mame/universal/mrdo.cpp533
-rw-r--r--src/mame/universal/mrdo.h96
-rw-r--r--src/mame/universal/mrdo_v.cpp248
-rw-r--r--src/mame/universal/nl_cheekyms.cpp299
-rw-r--r--src/mame/universal/nl_cheekyms.h12
-rw-r--r--src/mame/universal/pachislo_z80.cpp105
-rw-r--r--src/mame/universal/sraider.cpp742
-rw-r--r--src/mame/universal/superdq.cpp427
-rw-r--r--src/mame/universal/zerohour.cpp1089
-rw-r--r--src/mame/universal/zerohour_stars.cpp128
-rw-r--r--src/mame/universal/zerohour_stars.h42
-rw-r--r--src/mame/upl/mouser.cpp487
-rw-r--r--src/mame/upl/ninjakd2.cpp1731
-rw-r--r--src/mame/upl/ninjakd2.h206
-rw-r--r--src/mame/upl/ninjakd2_v.cpp437
-rw-r--r--src/mame/upl/nova2001.cpp1051
-rw-r--r--src/mame/upl/nova2001.h97
-rw-r--r--src/mame/upl/nova2001_v.cpp378
-rw-r--r--src/mame/upl/xxmissio.cpp537
-rw-r--r--src/mame/usp/patinhofeio.cpp384
-rw-r--r--src/mame/ussr/1801vp014.cpp327
-rw-r--r--src/mame/ussr/1801vp014.h75
-rw-r--r--src/mame/ussr/1801vp033.cpp227
-rw-r--r--src/mame/ussr/1801vp033.h117
-rw-r--r--src/mame/ussr/README.md6
-rw-r--r--src/mame/ussr/apogee.cpp321
-rw-r--r--src/mame/ussr/argo.cpp535
-rw-r--r--src/mame/ussr/b2m.cpp293
-rw-r--r--src/mame/ussr/b2m.h100
-rw-r--r--src/mame/ussr/b2m_m.cpp284
-rw-r--r--src/mame/ussr/bk.cpp287
-rw-r--r--src/mame/ussr/bk.h117
-rw-r--r--src/mame/ussr/bk_m.cpp300
-rw-r--r--src/mame/ussr/cm1800.cpp135
-rw-r--r--src/mame/ussr/debut.cpp275
-rw-r--r--src/mame/ussr/dvk_kcgd.cpp512
-rw-r--r--src/mame/ussr/dvk_ksm.cpp475
-rw-r--r--src/mame/ussr/ie15.cpp65
-rw-r--r--src/mame/ussr/im01.cpp428
-rw-r--r--src/mame/ussr/intellect02.cpp262
-rw-r--r--src/mame/ussr/irisha.cpp439
-rw-r--r--src/mame/ussr/istrebiteli.cpp710
-rw-r--r--src/mame/ussr/juku.cpp841
-rw-r--r--src/mame/ussr/jukumouse.cpp118
-rw-r--r--src/mame/ussr/jukumouse.h35
-rw-r--r--src/mame/ussr/km035.cpp342
-rw-r--r--src/mame/ussr/km035.h61
-rw-r--r--src/mame/ussr/krokha.cpp168
-rw-r--r--src/mame/ussr/lviv.cpp490
-rw-r--r--src/mame/ussr/lviv.h100
-rw-r--r--src/mame/ussr/lviv_m.cpp303
-rw-r--r--src/mame/ussr/lviv_v.cpp82
-rw-r--r--src/mame/ussr/mikro80.cpp296
-rw-r--r--src/mame/ussr/mikro80.h75
-rw-r--r--src/mame/ussr/mikro80_m.cpp101
-rw-r--r--src/mame/ussr/mikrosha.cpp305
-rw-r--r--src/mame/ussr/mk85.cpp109
-rw-r--r--src/mame/ussr/mk90.cpp120
-rw-r--r--src/mame/ussr/mk98.cpp488
-rw-r--r--src/mame/ussr/ms0515.cpp625
-rw-r--r--src/mame/ussr/ms6102.cpp373
-rw-r--r--src/mame/ussr/okean240.cpp570
-rw-r--r--src/mame/ussr/orion.cpp380
-rw-r--r--src/mame/ussr/orion.h169
-rw-r--r--src/mame/ussr/orion_m.cpp589
-rw-r--r--src/mame/ussr/orion_v.cpp109
-rw-r--r--src/mame/ussr/partner.cpp246
-rw-r--r--src/mame/ussr/partner.h65
-rw-r--r--src/mame/ussr/partner_m.cpp375
-rw-r--r--src/mame/ussr/pk32.cpp255
-rw-r--r--src/mame/ussr/pk8000.cpp419
-rw-r--r--src/mame/ussr/pk8020.cpp406
-rw-r--r--src/mame/ussr/pk8020.h128
-rw-r--r--src/mame/ussr/pk8020_m.cpp252
-rw-r--r--src/mame/ussr/pk8020_v.cpp174
-rw-r--r--src/mame/ussr/pyl601.cpp654
-rw-r--r--src/mame/ussr/radio86.cpp703
-rw-r--r--src/mame/ussr/radio86.h120
-rw-r--r--src/mame/ussr/radio86_m.cpp236
-rw-r--r--src/mame/ussr/sm1800.cpp217
-rw-r--r--src/mame/ussr/sm7238.cpp444
-rw-r--r--src/mame/ussr/special.cpp733
-rw-r--r--src/mame/ussr/special.h146
-rw-r--r--src/mame/ussr/special_gambl.cpp287
-rw-r--r--src/mame/ussr/special_m.cpp391
-rw-r--r--src/mame/ussr/special_v.cpp122
-rw-r--r--src/mame/ussr/specialsound.cpp83
-rw-r--r--src/mame/ussr/specialsound.h38
-rw-r--r--src/mame/ussr/tiamc1.cpp554
-rw-r--r--src/mame/ussr/tiamc1.h82
-rw-r--r--src/mame/ussr/tiamc1_a.cpp333
-rw-r--r--src/mame/ussr/tiamc1_a.h66
-rw-r--r--src/mame/ussr/tiamc1_v.cpp280
-rw-r--r--src/mame/ussr/uknc.cpp136
-rw-r--r--src/mame/ussr/unior.cpp562
-rw-r--r--src/mame/ussr/ut88.cpp297
-rw-r--r--src/mame/ussr/ut88.h129
-rw-r--r--src/mame/ussr/ut88_m.cpp172
-rw-r--r--src/mame/ussr/vector06.cpp284
-rw-r--r--src/mame/ussr/vector06.h120
-rw-r--r--src/mame/ussr/vector06_m.cpp214
-rw-r--r--src/mame/ussr/vector06_v.cpp50
-rw-r--r--src/mame/ussr/vm1timer.cpp184
-rw-r--r--src/mame/ussr/vm1timer.h63
-rw-r--r--src/mame/ussr/vta2000.cpp255
-rw-r--r--src/mame/valadon/bagman.cpp1290
-rw-r--r--src/mame/valadon/bagman.h160
-rw-r--r--src/mame/valadon/bagman_m.cpp231
-rw-r--r--src/mame/valadon/bagman_v.cpp143
-rw-r--r--src/mame/valadon/tankbust.cpp725
-rw-r--r--src/mame/vectorgraphic/sbcvideo.cpp184
-rw-r--r--src/mame/vectorgraphic/sbcvideo.h43
-rw-r--r--src/mame/vectorgraphic/v4_kbd.cpp324
-rw-r--r--src/mame/vectorgraphic/v4_kbd.h63
-rw-r--r--src/mame/vectorgraphic/vector4.cpp327
-rw-r--r--src/mame/verifone/tranz330.cpp198
-rw-r--r--src/mame/verifone/tranz330.h76
-rw-r--r--src/mame/vidbrain/uv201.cpp578
-rw-r--r--src/mame/vidbrain/uv201.h129
-rw-r--r--src/mame/vidbrain/vidbrain.cpp539
-rw-r--r--src/mame/video/1942.c247
-rw-r--r--src/mame/video/1943.c284
-rw-r--r--src/mame/video/20pacgal.c322
-rw-r--r--src/mame/video/40love.c370
-rw-r--r--src/mame/video/4enraya.c39
-rw-r--r--src/mame/video/8080bw.c501
-rw-r--r--src/mame/video/88games.c105
-rw-r--r--src/mame/video/actfancr.c309
-rw-r--r--src/mame/video/aeroboto.c212
-rw-r--r--src/mame/video/aerofgt.c1035
-rw-r--r--src/mame/video/airbustr.c149
-rw-r--r--src/mame/video/ajax.c117
-rw-r--r--src/mame/video/aliens.c86
-rw-r--r--src/mame/video/alpha68k.c551
-rw-r--r--src/mame/video/ambush.c172
-rw-r--r--src/mame/video/amiga.c990
-rw-r--r--src/mame/video/amigaaga.c1189
-rw-r--r--src/mame/video/ampoker2.c160
-rw-r--r--src/mame/video/amspdwy.c149
-rw-r--r--src/mame/video/angelkds.c299
-rw-r--r--src/mame/video/antic.c588
-rw-r--r--src/mame/video/appoooh.c332
-rw-r--r--src/mame/video/aquarium.c175
-rw-r--r--src/mame/video/arabian.c402
-rw-r--r--src/mame/video/arcadecl.c120
-rw-r--r--src/mame/video/argus.c1252
-rw-r--r--src/mame/video/arkanoid.c175
-rw-r--r--src/mame/video/armedf.c357
-rw-r--r--src/mame/video/artmagic.c365
-rw-r--r--src/mame/video/ashnojoe.c222
-rw-r--r--src/mame/video/asterix.c132
-rw-r--r--src/mame/video/astrocde.c1130
-rw-r--r--src/mame/video/asuka.c93
-rw-r--r--src/mame/video/atari.c1559
-rw-r--r--src/mame/video/atarifb.c211
-rw-r--r--src/mame/video/atarig1.c228
-rw-r--r--src/mame/video/atarig42.c270
-rw-r--r--src/mame/video/atarigt.c688
-rw-r--r--src/mame/video/atarigx2.c263
-rw-r--r--src/mame/video/atarimo.c1077
-rw-r--r--src/mame/video/atarimo.h136
-rw-r--r--src/mame/video/atarirle.c1775
-rw-r--r--src/mame/video/atarirle.h100
-rw-r--r--src/mame/video/atarisy1.c697
-rw-r--r--src/mame/video/atarisy2.c376
-rw-r--r--src/mame/video/atetris.c67
-rw-r--r--src/mame/video/attckufo.c171
-rw-r--r--src/mame/video/avgdvg.c1579
-rw-r--r--src/mame/video/avgdvg.h30
-rw-r--r--src/mame/video/awpvid.c119
-rw-r--r--src/mame/video/awpvid.h15
-rw-r--r--src/mame/video/aztarac.c97
-rw-r--r--src/mame/video/badlands.c147
-rw-r--r--src/mame/video/bagman.c154
-rw-r--r--src/mame/video/balsente.c237
-rw-r--r--src/mame/video/bankp.c202
-rw-r--r--src/mame/video/baraduke.c349
-rw-r--r--src/mame/video/batman.c317
-rw-r--r--src/mame/video/battlane.c244
-rw-r--r--src/mame/video/battlera.c396
-rw-r--r--src/mame/video/battlex.c120
-rw-r--r--src/mame/video/battlnts.c67
-rw-r--r--src/mame/video/bbusters.c296
-rw-r--r--src/mame/video/beathead.c212
-rw-r--r--src/mame/video/beezer.c71
-rw-r--r--src/mame/video/bfm_adr2.c512
-rw-r--r--src/mame/video/bfm_adr2.h24
-rw-r--r--src/mame/video/bfm_dm01.c283
-rw-r--r--src/mame/video/bfm_dm01.h23
-rw-r--r--src/mame/video/bigevglf.c95
-rw-r--r--src/mame/video/bigstrkb.c145
-rw-r--r--src/mame/video/bionicc.c248
-rw-r--r--src/mame/video/bishi.c96
-rw-r--r--src/mame/video/bking.c361
-rw-r--r--src/mame/video/bladestl.c103
-rw-r--r--src/mame/video/blktiger.c249
-rw-r--r--src/mame/video/blmbycar.c260
-rw-r--r--src/mame/video/blockade.c35
-rw-r--r--src/mame/video/blockhl.c67
-rw-r--r--src/mame/video/blockout.c131
-rw-r--r--src/mame/video/bloodbro.c278
-rw-r--r--src/mame/video/blstroid.c185
-rw-r--r--src/mame/video/blueprnt.c129
-rw-r--r--src/mame/video/bogeyman.c153
-rw-r--r--src/mame/video/bombjack.c139
-rw-r--r--src/mame/video/boogwing.c202
-rw-r--r--src/mame/video/bosco.c334
-rw-r--r--src/mame/video/bottom9.c97
-rw-r--r--src/mame/video/boxer.c86
-rw-r--r--src/mame/video/brkthru.c277
-rw-r--r--src/mame/video/bsktball.c62
-rw-r--r--src/mame/video/btime.c583
-rw-r--r--src/mame/video/btoads.c565
-rw-r--r--src/mame/video/bublbobl.c100
-rw-r--r--src/mame/video/buggychl.c252
-rw-r--r--src/mame/video/bwing.c298
-rw-r--r--src/mame/video/cabal.c148
-rw-r--r--src/mame/video/calomega.c101
-rw-r--r--src/mame/video/canyon.c96
-rw-r--r--src/mame/video/capbowl.c196
-rw-r--r--src/mame/video/carjmbre.c145
-rw-r--r--src/mame/video/carpolo.c742
-rw-r--r--src/mame/video/cave.c1601
-rw-r--r--src/mame/video/cbasebal.c186
-rw-r--r--src/mame/video/cbuster.c160
-rw-r--r--src/mame/video/ccastles.c366
-rw-r--r--src/mame/video/cchasm.c131
-rw-r--r--src/mame/video/cclimber.c770
-rw-r--r--src/mame/video/centiped.c548
-rw-r--r--src/mame/video/chaknpop.c292
-rw-r--r--src/mame/video/champbas.c298
-rw-r--r--src/mame/video/changela.c828
-rw-r--r--src/mame/video/cheekyms.c201
-rw-r--r--src/mame/video/chqflag.c87
-rw-r--r--src/mame/video/cidelsa.c314
-rw-r--r--src/mame/video/cinemat.c261
-rw-r--r--src/mame/video/circus.c264
-rw-r--r--src/mame/video/circusc.c219
-rw-r--r--src/mame/video/cischeat.c1371
-rw-r--r--src/mame/video/citycon.c169
-rw-r--r--src/mame/video/cloak.c237
-rw-r--r--src/mame/video/cloud9.c332
-rw-r--r--src/mame/video/clshroad.c346
-rw-r--r--src/mame/video/cninja.c525
-rw-r--r--src/mame/video/combatsc.c675
-rw-r--r--src/mame/video/commando.c141
-rw-r--r--src/mame/video/compgolf.c130
-rw-r--r--src/mame/video/contra.c304
-rw-r--r--src/mame/video/cop01.c218
-rw-r--r--src/mame/video/copsnrob.c140
-rw-r--r--src/mame/video/cosmic.c606
-rw-r--r--src/mame/video/cps1.c2859
-rw-r--r--src/mame/video/crbaloon.c160
-rw-r--r--src/mame/video/crgolf.c215
-rw-r--r--src/mame/video/crimfght.c86
-rw-r--r--src/mame/video/crospang.c209
-rw-r--r--src/mame/video/crshrace.c220
-rw-r--r--src/mame/video/cvs.c369
-rw-r--r--src/mame/video/cyberbal.c403
-rw-r--r--src/mame/video/darius.c151
-rw-r--r--src/mame/video/darkmist.c202
-rw-r--r--src/mame/video/darkseal.c310
-rw-r--r--src/mame/video/dassault.c195
-rw-r--r--src/mame/video/dbz.c188
-rw-r--r--src/mame/video/dc.c2187
-rw-r--r--src/mame/video/dcheese.c331
-rw-r--r--src/mame/video/dcon.c329
-rw-r--r--src/mame/video/dday.c345
-rw-r--r--src/mame/video/ddragon.c259
-rw-r--r--src/mame/video/ddragon3.c224
-rw-r--r--src/mame/video/ddrible.c270
-rw-r--r--src/mame/video/deadang.c158
-rw-r--r--src/mame/video/dec0.c717
-rw-r--r--src/mame/video/dec8.c828
-rw-r--r--src/mame/video/deco16ic.c1057
-rw-r--r--src/mame/video/deco32.c1659
-rw-r--r--src/mame/video/deco_mlc.c529
-rw-r--r--src/mame/video/decocass.c619
-rw-r--r--src/mame/video/deniam.c401
-rw-r--r--src/mame/video/destroyr.c90
-rw-r--r--src/mame/video/dietgo.c92
-rw-r--r--src/mame/video/digdug.c318
-rw-r--r--src/mame/video/diverboy.c53
-rw-r--r--src/mame/video/djboy.c83
-rw-r--r--src/mame/video/djmain.c192
-rw-r--r--src/mame/video/dkong.c1036
-rw-r--r--src/mame/video/docastle.c225
-rw-r--r--src/mame/video/dogfgt.c244
-rw-r--r--src/mame/video/dooyong.c917
-rw-r--r--src/mame/video/dotrikun.c60
-rw-r--r--src/mame/video/dragrace.c81
-rw-r--r--src/mame/video/drgnmst.c202
-rw-r--r--src/mame/video/dribling.c85
-rw-r--r--src/mame/video/drmicro.c175
-rw-r--r--src/mame/video/dynax.c1276
-rw-r--r--src/mame/video/dynduke.c249
-rw-r--r--src/mame/video/eolith.c57
-rw-r--r--src/mame/video/epos.c97
-rw-r--r--src/mame/video/eprom.c463
-rw-r--r--src/mame/video/equites.c485
-rw-r--r--src/mame/video/esd16.c485
-rw-r--r--src/mame/video/espial.c241
-rw-r--r--src/mame/video/esripsys.c399
-rw-r--r--src/mame/video/exedexes.c248
-rw-r--r--src/mame/video/exerion.c422
-rw-r--r--src/mame/video/exidy.c401
-rw-r--r--src/mame/video/exidy440.c505
-rw-r--r--src/mame/video/exprraid.c141
-rw-r--r--src/mame/video/exterm.c114
-rw-r--r--src/mame/video/exzisus.c227
-rw-r--r--src/mame/video/f1gp.c467
-rw-r--r--src/mame/video/fantland.c145
-rw-r--r--src/mame/video/fastfred.c383
-rw-r--r--src/mame/video/fastlane.c169
-rw-r--r--src/mame/video/fcombat.c233
-rw-r--r--src/mame/video/fgoal.c127
-rw-r--r--src/mame/video/finalizr.c237
-rw-r--r--src/mame/video/firetrap.c290
-rw-r--r--src/mame/video/firetrk.c456
-rw-r--r--src/mame/video/fitfight.c160
-rw-r--r--src/mame/video/flkatck.c179
-rw-r--r--src/mame/video/flower.c214
-rw-r--r--src/mame/video/flstory.c245
-rw-r--r--src/mame/video/flyball.c89
-rw-r--r--src/mame/video/foodf.c155
-rw-r--r--src/mame/video/freekick.c154
-rw-r--r--src/mame/video/fromanc2.c498
-rw-r--r--src/mame/video/fromance.c449
-rw-r--r--src/mame/video/funkybee.c164
-rw-r--r--src/mame/video/funkyjet.c89
-rw-r--r--src/mame/video/funworld.c171
-rw-r--r--src/mame/video/funybubl.c116
-rw-r--r--src/mame/video/fuukifg2.c353
-rw-r--r--src/mame/video/fuukifg3.c388
-rw-r--r--src/mame/video/gaelco.c254
-rw-r--r--src/mame/video/gaelco2.c515
-rw-r--r--src/mame/video/gaelco3d.c505
-rw-r--r--src/mame/video/gaiden.c603
-rw-r--r--src/mame/video/galaga.c606
-rw-r--r--src/mame/video/galastrm.c586
-rw-r--r--src/mame/video/galaxian.c1412
-rw-r--r--src/mame/video/galaxold.c1942
-rw-r--r--src/mame/video/galivan.c426
-rw-r--r--src/mame/video/galpani2.c202
-rw-r--r--src/mame/video/galpanic.c135
-rw-r--r--src/mame/video/galspnbl.c138
-rw-r--r--src/mame/video/gameplan.c380
-rw-r--r--src/mame/video/gaplus.c411
-rw-r--r--src/mame/video/gatron.c59
-rw-r--r--src/mame/video/gauntlet.c230
-rw-r--r--src/mame/video/gberet.c227
-rw-r--r--src/mame/video/gbusters.c77
-rw-r--r--src/mame/video/gcpinbal.c356
-rw-r--r--src/mame/video/genesis.c1379
-rw-r--r--src/mame/video/gijoe.c156
-rw-r--r--src/mame/video/ginganin.c290
-rw-r--r--src/mame/video/gladiatr.c308
-rw-r--r--src/mame/video/glass.c210
-rw-r--r--src/mame/video/gng.c161
-rw-r--r--src/mame/video/goal92.c186
-rw-r--r--src/mame/video/goindol.c141
-rw-r--r--src/mame/video/goldstar.c369
-rw-r--r--src/mame/video/gomoku.c236
-rw-r--r--src/mame/video/gotcha.c133
-rw-r--r--src/mame/video/gottlieb.c268
-rw-r--r--src/mame/video/gotya.c191
-rw-r--r--src/mame/video/gradius3.c140
-rw-r--r--src/mame/video/grchamp.c549
-rw-r--r--src/mame/video/gridlee.c233
-rw-r--r--src/mame/video/groundfx.c283
-rw-r--r--src/mame/video/gstriker.c632
-rw-r--r--src/mame/video/gsword.c214
-rw-r--r--src/mame/video/gtia.c1137
-rw-r--r--src/mame/video/gtia.h156
-rw-r--r--src/mame/video/gticlub.c1052
-rw-r--r--src/mame/video/gticlub.h16
-rw-r--r--src/mame/video/gumbo.c51
-rw-r--r--src/mame/video/gunbustr.c252
-rw-r--r--src/mame/video/gundealr.c143
-rw-r--r--src/mame/video/gunsmoke.c196
-rw-r--r--src/mame/video/gyruss.c170
-rw-r--r--src/mame/video/hanaawas.c112
-rw-r--r--src/mame/video/harddriv.c479
-rw-r--r--src/mame/video/hcastle.c252
-rw-r--r--src/mame/video/hd63484.c1473
-rw-r--r--src/mame/video/hd63484.h11
-rw-r--r--src/mame/video/hexa.c75
-rw-r--r--src/mame/video/hexion.c168
-rw-r--r--src/mame/video/higemaru.c145
-rw-r--r--src/mame/video/himesiki.c130
-rw-r--r--src/mame/video/hnayayoi.c274
-rw-r--r--src/mame/video/hng64.c1982
-rw-r--r--src/mame/video/holeland.c194
-rw-r--r--src/mame/video/homedata.c883
-rw-r--r--src/mame/video/homerun.c113
-rw-r--r--src/mame/video/hyhoo.c249
-rw-r--r--src/mame/video/hyperspt.c205
-rw-r--r--src/mame/video/hyprduel.c714
-rw-r--r--src/mame/video/ikki.c223
-rw-r--r--src/mame/video/inufuku.c255
-rw-r--r--src/mame/video/iqblock.c103
-rw-r--r--src/mame/video/irobot.c371
-rw-r--r--src/mame/video/ironhors.c366
-rw-r--r--src/mame/video/itech32.c1486
-rw-r--r--src/mame/video/itech8.c772
-rw-r--r--src/mame/video/jack.c179
-rw-r--r--src/mame/video/jackal.c231
-rw-r--r--src/mame/video/jagblit.c480
-rw-r--r--src/mame/video/jagobj.c970
-rw-r--r--src/mame/video/jaguar.c967
-rw-r--r--src/mame/video/jailbrek.c125
-rw-r--r--src/mame/video/jalblend.c188
-rw-r--r--src/mame/video/jalblend.h5
-rw-r--r--src/mame/video/jedi.c368
-rw-r--r--src/mame/video/jpmimpct.c149
-rw-r--r--src/mame/video/kan_panb.c270
-rw-r--r--src/mame/video/kan_panb.h4
-rw-r--r--src/mame/video/kan_pand.c249
-rw-r--r--src/mame/video/kan_pand.h11
-rw-r--r--src/mame/video/kaneko16.c1113
-rw-r--r--src/mame/video/kangaroo.c202
-rw-r--r--src/mame/video/karnov.c221
-rw-r--r--src/mame/video/kchamp.c135
-rw-r--r--src/mame/video/kickgoal.c255
-rw-r--r--src/mame/video/kingobox.c313
-rw-r--r--src/mame/video/klax.c133
-rw-r--r--src/mame/video/kncljoe.c242
-rw-r--r--src/mame/video/konamigx.c613
-rw-r--r--src/mame/video/konamiic.c8433
-rw-r--r--src/mame/video/konamiic.h458
-rw-r--r--src/mame/video/kopunch.c102
-rw-r--r--src/mame/video/ksayakyu.c117
-rw-r--r--src/mame/video/kyugo.c233
-rw-r--r--src/mame/video/labyrunr.c275
-rw-r--r--src/mame/video/ladybug.c444
-rw-r--r--src/mame/video/ladyfrog.c153
-rw-r--r--src/mame/video/lasso.c434
-rw-r--r--src/mame/video/lastduel.c295
-rw-r--r--src/mame/video/lazercmd.c84
-rw-r--r--src/mame/video/legionna.c443
-rw-r--r--src/mame/video/leland.c566
-rw-r--r--src/mame/video/lemmings.c190
-rw-r--r--src/mame/video/lethal.c135
-rw-r--r--src/mame/video/lethalj.c204
-rw-r--r--src/mame/video/liberate.c568
-rw-r--r--src/mame/video/liberatr.c371
-rw-r--r--src/mame/video/lkage.c211
-rw-r--r--src/mame/video/lockon.c988
-rw-r--r--src/mame/video/lordgun.c307
-rw-r--r--src/mame/video/lsasquad.c216
-rw-r--r--src/mame/video/lucky74.c247
-rw-r--r--src/mame/video/lvcards.c115
-rw-r--r--src/mame/video/lwings.c293
-rw-r--r--src/mame/video/m10.c190
-rw-r--r--src/mame/video/m107.c317
-rw-r--r--src/mame/video/m3raster.c283
-rw-r--r--src/mame/video/m52.c425
-rw-r--r--src/mame/video/m57.c269
-rw-r--r--src/mame/video/m58.c320
-rw-r--r--src/mame/video/m62.c968
-rw-r--r--src/mame/video/m72.c564
-rw-r--r--src/mame/video/m90.c537
-rw-r--r--src/mame/video/m92.c470
-rw-r--r--src/mame/video/macrossp.c409
-rw-r--r--src/mame/video/madalien.c415
-rw-r--r--src/mame/video/madmotor.c256
-rw-r--r--src/mame/video/magmax.c244
-rw-r--r--src/mame/video/mainevt.c115
-rw-r--r--src/mame/video/mainsnk.c142
-rw-r--r--src/mame/video/malzak.c257
-rw-r--r--src/mame/video/mappy.c596
-rw-r--r--src/mame/video/marineb.c465
-rw-r--r--src/mame/video/mario.c230
-rw-r--r--src/mame/video/markham.c135
-rw-r--r--src/mame/video/matmania.c304
-rw-r--r--src/mame/video/mayumi.c41
-rw-r--r--src/mame/video/mcatadv.c266
-rw-r--r--src/mame/video/mcr.c417
-rw-r--r--src/mame/video/mcr3.c292
-rw-r--r--src/mame/video/mcr68.c356
-rw-r--r--src/mame/video/meadows.c112
-rw-r--r--src/mame/video/megasys1.c1042
-rw-r--r--src/mame/video/megazone.c226
-rw-r--r--src/mame/video/mermaid.c534
-rw-r--r--src/mame/video/metlclsh.c256
-rw-r--r--src/mame/video/metro.c953
-rw-r--r--src/mame/video/mexico86.c164
-rw-r--r--src/mame/video/midtunit.c831
-rw-r--r--src/mame/video/midvunit.c585
-rw-r--r--src/mame/video/midyunit.c582
-rw-r--r--src/mame/video/midzeus.c1458
-rw-r--r--src/mame/video/midzeus2.c1389
-rw-r--r--src/mame/video/mikie.c171
-rw-r--r--src/mame/video/mitchell.c288
-rw-r--r--src/mame/video/mjkjidai.c138
-rw-r--r--src/mame/video/mjsister.c109
-rw-r--r--src/mame/video/model1.c1531
-rw-r--r--src/mame/video/model2.c2766
-rw-r--r--src/mame/video/model2rd.c193
-rw-r--r--src/mame/video/model3.c1519
-rw-r--r--src/mame/video/mole.c58
-rw-r--r--src/mame/video/momoko.c319
-rw-r--r--src/mame/video/moo.c169
-rw-r--r--src/mame/video/mosaic.c87
-rw-r--r--src/mame/video/mouser.c158
-rw-r--r--src/mame/video/mrdo.c259
-rw-r--r--src/mame/video/mrflea.c94
-rw-r--r--src/mame/video/mrjong.c146
-rw-r--r--src/mame/video/ms32.c508
-rw-r--r--src/mame/video/msisaac.c250
-rw-r--r--src/mame/video/mugsmash.c154
-rw-r--r--src/mame/video/munchmo.c160
-rw-r--r--src/mame/video/mustache.c143
-rw-r--r--src/mame/video/mw8080bw.c391
-rw-r--r--src/mame/video/mystston.c336
-rw-r--r--src/mame/video/mystwarr.c544
-rw-r--r--src/mame/video/n64.c3511
-rw-r--r--src/mame/video/n8080.c405
-rw-r--r--src/mame/video/namcofl.c127
-rw-r--r--src/mame/video/namcona1.c722
-rw-r--r--src/mame/video/namconb1.c233
-rw-r--r--src/mame/video/namcos1.c432
-rw-r--r--src/mame/video/namcos2.c486
-rw-r--r--src/mame/video/namcos21.c499
-rw-r--r--src/mame/video/namcos22.c2485
-rw-r--r--src/mame/video/namcos86.c390
-rw-r--r--src/mame/video/naughtyb.c250
-rw-r--r--src/mame/video/nbmj8688.c747
-rw-r--r--src/mame/video/nbmj8891.c572
-rw-r--r--src/mame/video/nbmj8991.c391
-rw-r--r--src/mame/video/nbmj9195.c525
-rw-r--r--src/mame/video/nemesis.c467
-rw-r--r--src/mame/video/neogeo.c937
-rw-r--r--src/mame/video/news.c103
-rw-r--r--src/mame/video/ninjakd2.c552
-rw-r--r--src/mame/video/ninjaw.c198
-rw-r--r--src/mame/video/nitedrvr.c78
-rw-r--r--src/mame/video/niyanpai.c450
-rw-r--r--src/mame/video/nmk16.c950
-rw-r--r--src/mame/video/nova2001.c388
-rw-r--r--src/mame/video/nycaptor.c307
-rw-r--r--src/mame/video/offtwall.c118
-rw-r--r--src/mame/video/ohmygod.c113
-rw-r--r--src/mame/video/ojankohs.c320
-rw-r--r--src/mame/video/oneshot.c187
-rw-r--r--src/mame/video/orbit.c95
-rw-r--r--src/mame/video/othldrby.c223
-rw-r--r--src/mame/video/othunder.c247
-rw-r--r--src/mame/video/overdriv.c87
-rw-r--r--src/mame/video/pacland.c405
-rw-r--r--src/mame/video/pacman.c596
-rw-r--r--src/mame/video/pandoras.c175
-rw-r--r--src/mame/video/paradise.c311
-rw-r--r--src/mame/video/parodius.c98
-rw-r--r--src/mame/video/pass.c66
-rw-r--r--src/mame/video/pastelg.c308
-rw-r--r--src/mame/video/pbaction.c133
-rw-r--r--src/mame/video/pcktgal.c99
-rw-r--r--src/mame/video/pgm.c404
-rw-r--r--src/mame/video/phoenix.c455
-rw-r--r--src/mame/video/pingpong.c154
-rw-r--r--src/mame/video/pirates.c116
-rw-r--r--src/mame/video/pitnrun.c279
-rw-r--r--src/mame/video/pk8000.c176
-rw-r--r--src/mame/video/pktgaldx.c157
-rw-r--r--src/mame/video/playch10.c181
-rw-r--r--src/mame/video/playmark.c477
-rw-r--r--src/mame/video/plygonet.c93
-rw-r--r--src/mame/video/pokechmp.c73
-rw-r--r--src/mame/video/polepos.c519
-rw-r--r--src/mame/video/policetr.c372
-rw-r--r--src/mame/video/polyplay.c68
-rw-r--r--src/mame/video/poolshrk.c55
-rw-r--r--src/mame/video/pooyan.c198
-rw-r--r--src/mame/video/popeye.c374
-rw-r--r--src/mame/video/popper.c261
-rw-r--r--src/mame/video/portrait.c170
-rw-r--r--src/mame/video/powerins.c372
-rw-r--r--src/mame/video/ppu2c0x.c1587
-rw-r--r--src/mame/video/ppu2c0x.h156
-rw-r--r--src/mame/video/prehisle.c153
-rw-r--r--src/mame/video/psikyo.c598
-rw-r--r--src/mame/video/psikyo4.c147
-rw-r--r--src/mame/video/psikyosh.c1188
-rw-r--r--src/mame/video/psx.c3933
-rw-r--r--src/mame/video/psychic5.c463
-rw-r--r--src/mame/video/punchout.c432
-rw-r--r--src/mame/video/pushman.c126
-rw-r--r--src/mame/video/qdrmfgp.c69
-rw-r--r--src/mame/video/qix.c474
-rw-r--r--src/mame/video/quasar.c218
-rw-r--r--src/mame/video/quizdna.c206
-rw-r--r--src/mame/video/quizpani.c91
-rw-r--r--src/mame/video/raiden.c174
-rw-r--r--src/mame/video/rallyx.c781
-rw-r--r--src/mame/video/rampart.c138
-rw-r--r--src/mame/video/rastan.c220
-rw-r--r--src/mame/video/realbrk.c620
-rw-r--r--src/mame/video/redalert.c356
-rw-r--r--src/mame/video/redclash.c425
-rw-r--r--src/mame/video/relief.c173
-rw-r--r--src/mame/video/renegade.c134
-rw-r--r--src/mame/video/retofinv.c240
-rw-r--r--src/mame/video/rockrage.c125
-rw-r--r--src/mame/video/rocnrope.c143
-rw-r--r--src/mame/video/rohga.c542
-rw-r--r--src/mame/video/rollerg.c76
-rw-r--r--src/mame/video/rollrace.c168
-rw-r--r--src/mame/video/route16.c195
-rw-r--r--src/mame/video/rpunch.c291
-rw-r--r--src/mame/video/runaway.c159
-rw-r--r--src/mame/video/rungun.c124
-rw-r--r--src/mame/video/sauro.c218
-rw-r--r--src/mame/video/sbasketb.c182
-rw-r--r--src/mame/video/sbugger.c60
-rw-r--r--src/mame/video/scotrsht.c142
-rw-r--r--src/mame/video/sderby.c141
-rw-r--r--src/mame/video/segag80r.c855
-rw-r--r--src/mame/video/segag80v.c343
-rw-r--r--src/mame/video/segahang.c93
-rw-r--r--src/mame/video/segaic16.c3827
-rw-r--r--src/mame/video/segaic16.h92
-rw-r--r--src/mame/video/segaic24.c916
-rw-r--r--src/mame/video/segaic24.h43
-rw-r--r--src/mame/video/segaorun.c122
-rw-r--r--src/mame/video/segas16a.c70
-rw-r--r--src/mame/video/segas16b.c82
-rw-r--r--src/mame/video/segas18.c256
-rw-r--r--src/mame/video/segas24.c52
-rw-r--r--src/mame/video/segas32.c2849
-rw-r--r--src/mame/video/segasyse.c573
-rw-r--r--src/mame/video/segaxbd.c102
-rw-r--r--src/mame/video/segaybd.c75
-rw-r--r--src/mame/video/sei_crtc.c294
-rw-r--r--src/mame/video/seibuspi.c685
-rw-r--r--src/mame/video/seicross.c143
-rw-r--r--src/mame/video/senjyo.c380
-rw-r--r--src/mame/video/seta.c1051
-rw-r--r--src/mame/video/seta2.c387
-rw-r--r--src/mame/video/sf.c235
-rw-r--r--src/mame/video/shadfrce.c175
-rw-r--r--src/mame/video/shangha3.c270
-rw-r--r--src/mame/video/shangkid.c303
-rw-r--r--src/mame/video/shaolins.c189
-rw-r--r--src/mame/video/shisen.c71
-rw-r--r--src/mame/video/shootout.c175
-rw-r--r--src/mame/video/shuuz.c140
-rw-r--r--src/mame/video/sidearms.c364
-rw-r--r--src/mame/video/sidepckt.c147
-rw-r--r--src/mame/video/silkroad.c162
-rw-r--r--src/mame/video/simpl156.c157
-rw-r--r--src/mame/video/simpsons.c173
-rw-r--r--src/mame/video/skullxbo.c310
-rw-r--r--src/mame/video/skydiver.c214
-rw-r--r--src/mame/video/skyfox.c294
-rw-r--r--src/mame/video/skykid.c257
-rw-r--r--src/mame/video/skyraid.c152
-rw-r--r--src/mame/video/slapfght.c252
-rw-r--r--src/mame/video/slapshot.c629
-rw-r--r--src/mame/video/snes.c2248
-rw-r--r--src/mame/video/snk.c982
-rw-r--r--src/mame/video/snk6502.c306
-rw-r--r--src/mame/video/snk68.c281
-rw-r--r--src/mame/video/snookr10.c189
-rw-r--r--src/mame/video/solomon.c106
-rw-r--r--src/mame/video/sonson.c179
-rw-r--r--src/mame/video/spacefb.c410
-rw-r--r--src/mame/video/spbactn.c217
-rw-r--r--src/mame/video/spcforce.c54
-rw-r--r--src/mame/video/spdodgeb.c220
-rw-r--r--src/mame/video/speedatk.c129
-rw-r--r--src/mame/video/speedbal.c134
-rw-r--r--src/mame/video/speedspn.c112
-rw-r--r--src/mame/video/splash.c285
-rw-r--r--src/mame/video/sprcros2.c193
-rw-r--r--src/mame/video/sprint2.c212
-rw-r--r--src/mame/video/sprint4.c150
-rw-r--r--src/mame/video/sprint8.c200
-rw-r--r--src/mame/video/spy.c84
-rw-r--r--src/mame/video/srmp2.c453
-rw-r--r--src/mame/video/srumbler.c175
-rw-r--r--src/mame/video/sshangha.c243
-rw-r--r--src/mame/video/sslam.c216
-rw-r--r--src/mame/video/ssozumo.c180
-rw-r--r--src/mame/video/sspeedr.c272
-rw-r--r--src/mame/video/ssrj.c276
-rw-r--r--src/mame/video/ssv.c1140
-rw-r--r--src/mame/video/st0016.c671
-rw-r--r--src/mame/video/stactics.c428
-rw-r--r--src/mame/video/stadhero.c166
-rw-r--r--src/mame/video/starcrus.c534
-rw-r--r--src/mame/video/starfire.c270
-rw-r--r--src/mame/video/starshp1.c441
-rw-r--r--src/mame/video/stfight.c312
-rw-r--r--src/mame/video/stlforce.c195
-rw-r--r--src/mame/video/strnskil.c147
-rw-r--r--src/mame/video/stvvdp1.c2135
-rw-r--r--src/mame/video/stvvdp2.c6437
-rw-r--r--src/mame/video/subs.c149
-rw-r--r--src/mame/video/suna16.c244
-rw-r--r--src/mame/video/suna8.c448
-rw-r--r--src/mame/video/supbtime.c102
-rw-r--r--src/mame/video/superchs.c249
-rw-r--r--src/mame/video/superqix.c260
-rw-r--r--src/mame/video/suprloco.c273
-rw-r--r--src/mame/video/suprnova.c1176
-rw-r--r--src/mame/video/suprridr.c219
-rw-r--r--src/mame/video/suprslam.c171
-rw-r--r--src/mame/video/surpratk.c99
-rw-r--r--src/mame/video/sys16spr.c3
-rw-r--r--src/mame/video/system1.c663
-rw-r--r--src/mame/video/system1.h27
-rw-r--r--src/mame/video/system16.c1029
-rw-r--r--src/mame/video/tagteam.c185
-rw-r--r--src/mame/video/tail2nos.c168
-rw-r--r--src/mame/video/taito_b.c635
-rw-r--r--src/mame/video/taito_f2.c1442
-rw-r--r--src/mame/video/taito_f3.c3291
-rw-r--r--src/mame/video/taito_h.c490
-rw-r--r--src/mame/video/taito_l.c337
-rw-r--r--src/mame/video/taito_o.c156
-rw-r--r--src/mame/video/taito_z.c1023
-rw-r--r--src/mame/video/taitoair.c410
-rw-r--r--src/mame/video/taitoic.c5053
-rw-r--r--src/mame/video/taitoic.h225
-rw-r--r--src/mame/video/taitojc.c616
-rw-r--r--src/mame/video/taitosj.c768
-rw-r--r--src/mame/video/tank8.c299
-rw-r--r--src/mame/video/tankbatt.c106
-rw-r--r--src/mame/video/tankbust.c252
-rw-r--r--src/mame/video/taotaido.c242
-rw-r--r--src/mame/video/targeth.c149
-rw-r--r--src/mame/video/tatsumi.c1152
-rw-r--r--src/mame/video/taxidrvr.c153
-rw-r--r--src/mame/video/tbowl.c249
-rw-r--r--src/mame/video/tceptor.c580
-rw-r--r--src/mame/video/tecmo.c252
-rw-r--r--src/mame/video/tecmo16.c510
-rw-r--r--src/mame/video/tehkanwc.c169
-rw-r--r--src/mame/video/terracre.c209
-rw-r--r--src/mame/video/tetrisp2.c786
-rw-r--r--src/mame/video/thedeep.c235
-rw-r--r--src/mame/video/thepit.c330
-rw-r--r--src/mame/video/thief.c282
-rw-r--r--src/mame/video/thoop2.c241
-rw-r--r--src/mame/video/thunderj.c296
-rw-r--r--src/mame/video/thunderx.c91
-rw-r--r--src/mame/video/tia.c2000
-rw-r--r--src/mame/video/tia.h26
-rw-r--r--src/mame/video/tiamc1.c216
-rw-r--r--src/mame/video/tigeroad.c171
-rw-r--r--src/mame/video/timelimt.c151
-rw-r--r--src/mame/video/timeplt.c196
-rw-r--r--src/mame/video/tmnt.c822
-rw-r--r--src/mame/video/tnzs.c234
-rw-r--r--src/mame/video/toaplan1.c1236
-rw-r--r--src/mame/video/toaplan2.c1690
-rw-r--r--src/mame/video/toki.c318
-rw-r--r--src/mame/video/toobin.c279
-rw-r--r--src/mame/video/topspeed.c198
-rw-r--r--src/mame/video/toypop.c231
-rw-r--r--src/mame/video/tp84.c213
-rw-r--r--src/mame/video/trackfld.c247
-rw-r--r--src/mame/video/travrusa.c345
-rw-r--r--src/mame/video/triplhnt.c144
-rw-r--r--src/mame/video/truco.c55
-rw-r--r--src/mame/video/trucocl.c82
-rw-r--r--src/mame/video/tryout.c258
-rw-r--r--src/mame/video/tsamurai.c275
-rw-r--r--src/mame/video/tubep.c881
-rw-r--r--src/mame/video/tumbleb.c838
-rw-r--r--src/mame/video/tumblep.c99
-rw-r--r--src/mame/video/tunhunt.c394
-rw-r--r--src/mame/video/turbo.c1104
-rw-r--r--src/mame/video/tutankhm.c182
-rw-r--r--src/mame/video/twin16.c468
-rw-r--r--src/mame/video/twincobr.c517
-rw-r--r--src/mame/video/tx1.c3122
-rw-r--r--src/mame/video/ultraman.c135
-rw-r--r--src/mame/video/ultratnk.c151
-rw-r--r--src/mame/video/undrfire.c639
-rw-r--r--src/mame/video/unico.c412
-rw-r--r--src/mame/video/usgames.c73
-rw-r--r--src/mame/video/vaportra.c186
-rw-r--r--src/mame/video/vastar.c226
-rw-r--r--src/mame/video/vball.c178
-rw-r--r--src/mame/video/vdc.c1206
-rw-r--r--src/mame/video/vdc.h55
-rw-r--r--src/mame/video/vendetta.c124
-rw-r--r--src/mame/video/vertigo.c658
-rw-r--r--src/mame/video/vicdual.c150
-rw-r--r--src/mame/video/victory.c1133
-rw-r--r--src/mame/video/videopin.c115
-rw-r--r--src/mame/video/vigilant.c340
-rw-r--r--src/mame/video/vindictr.c304
-rw-r--r--src/mame/video/volfied.c133
-rw-r--r--src/mame/video/vrender0.c522
-rw-r--r--src/mame/video/vrender0.h2
-rw-r--r--src/mame/video/vsnes.c80
-rw-r--r--src/mame/video/vulgus.c226
-rw-r--r--src/mame/video/warpwarp.c269
-rw-r--r--src/mame/video/warriorb.c154
-rw-r--r--src/mame/video/wc90.c369
-rw-r--r--src/mame/video/wc90b.c153
-rw-r--r--src/mame/video/wecleman.c1160
-rw-r--r--src/mame/video/welltris.c251
-rw-r--r--src/mame/video/wgp.c762
-rw-r--r--src/mame/video/williams.c736
-rw-r--r--src/mame/video/wiping.c228
-rw-r--r--src/mame/video/wiz.c261
-rw-r--r--src/mame/video/wolfpack.c333
-rw-r--r--src/mame/video/wrally.c210
-rw-r--r--src/mame/video/wwfsstar.c225
-rw-r--r--src/mame/video/wwfwfest.c290
-rw-r--r--src/mame/video/xain.c274
-rw-r--r--src/mame/video/xevious.c512
-rw-r--r--src/mame/video/xexex.c143
-rw-r--r--src/mame/video/xmen.c253
-rw-r--r--src/mame/video/xorworld.c114
-rw-r--r--src/mame/video/xxmissio.c152
-rw-r--r--src/mame/video/xybots.c166
-rw-r--r--src/mame/video/xyonix.c63
-rw-r--r--src/mame/video/ygv608.c1789
-rw-r--r--src/mame/video/ygv608.h342
-rw-r--r--src/mame/video/yiear.c149
-rw-r--r--src/mame/video/yunsun16.c234
-rw-r--r--src/mame/video/yunsung8.c206
-rw-r--r--src/mame/video/zac2650.c230
-rw-r--r--src/mame/video/zaccaria.c288
-rw-r--r--src/mame/video/zaxxon.c488
-rw-r--r--src/mame/video/zerozone.c50
-rw-r--r--src/mame/video/zodiack.c204
-rw-r--r--src/mame/videogames/looping.cpp987
-rw-r--r--src/mame/videogames/supertnk.cpp500
-rw-r--r--src/mame/videogames/video21.cpp322
-rw-r--r--src/mame/videoton/tvc.cpp907
-rw-r--r--src/mame/videoton/tvc_a.cpp133
-rw-r--r--src/mame/videoton/tvc_a.h55
-rw-r--r--src/mame/virtual.flt1
-rw-r--r--src/mame/virtual/dsp563xx.ipp11825
-rw-r--r--src/mame/virtual/dsp563xx.lst998
-rw-r--r--src/mame/virtual/ldplayer.cpp681
-rw-r--r--src/mame/virtual/utdsp563xx.cpp706
-rwxr-xr-xsrc/mame/virtual/utdsp563xx.py120
-rw-r--r--src/mame/virtual/utm6502.cpp254
-rw-r--r--src/mame/virtual/vgmplay.cpp4112
-rw-r--r--src/mame/virtual/wavesynth.cpp67
-rw-r--r--src/mame/visual/v100.cpp448
-rw-r--r--src/mame/visual/v102.cpp191
-rw-r--r--src/mame/visual/v102_kbd.cpp381
-rw-r--r--src/mame/visual/v102_kbd.h62
-rw-r--r--src/mame/visual/v1050.cpp1158
-rw-r--r--src/mame/visual/v1050.h238
-rw-r--r--src/mame/visual/v1050_v.cpp124
-rw-r--r--src/mame/visual/v1050kb.cpp388
-rw-r--r--src/mame/visual/v1050kb.h64
-rw-r--r--src/mame/visual/v50.cpp366
-rw-r--r--src/mame/visual/v50_kbd.cpp265
-rw-r--r--src/mame/visual/v50_kbd.h62
-rw-r--r--src/mame/visual/v550.cpp171
-rw-r--r--src/mame/visual/xds.cpp363
-rw-r--r--src/mame/visual/xds_kbd.cpp295
-rw-r--r--src/mame/visual/xds_kbd.h61
-rw-r--r--src/mame/votrax/votrhv.cpp741
-rw-r--r--src/mame/votrax/votrpss.cpp643
-rw-r--r--src/mame/votrax/votrtnt.cpp84
-rw-r--r--src/mame/vsystem/aerofgt.cpp459
-rw-r--r--src/mame/vsystem/crshrace.cpp775
-rw-r--r--src/mame/vsystem/f1gp.cpp1194
-rw-r--r--src/mame/vsystem/fromanc2.cpp751
-rw-r--r--src/mame/vsystem/fromanc2.h184
-rw-r--r--src/mame/vsystem/fromanc2_v.cpp402
-rw-r--r--src/mame/vsystem/fromance.cpp1197
-rw-r--r--src/mame/vsystem/fromance.h129
-rw-r--r--src/mame/vsystem/fromance_v.cpp303
-rw-r--r--src/mame/vsystem/gstriker.cpp1304
-rw-r--r--src/mame/vsystem/inufuku.cpp678
-rw-r--r--src/mame/vsystem/mb60553.cpp328
-rw-r--r--src/mame/vsystem/mb60553.h63
-rw-r--r--src/mame/vsystem/ojankohs.cpp1255
-rw-r--r--src/mame/vsystem/pipedrm.cpp993
-rw-r--r--src/mame/vsystem/pspikes.cpp4004
-rw-r--r--src/mame/vsystem/pspikes_ms.cpp181
-rw-r--r--src/mame/vsystem/rpunch.cpp1187
-rw-r--r--src/mame/vsystem/suprslam.cpp502
-rw-r--r--src/mame/vsystem/tail2nos.cpp693
-rw-r--r--src/mame/vsystem/taotaido.cpp692
-rw-r--r--src/mame/vsystem/vs9209.cpp151
-rw-r--r--src/mame/vsystem/vs9209.h68
-rw-r--r--src/mame/vsystem/vs920a.cpp93
-rw-r--r--src/mame/vsystem/vs920a.h44
-rw-r--r--src/mame/vsystem/vsystem_gga.cpp67
-rw-r--r--src/mame/vsystem/vsystem_gga.h85
-rw-r--r--src/mame/vsystem/vsystem_spr.cpp249
-rw-r--r--src/mame/vsystem/vsystem_spr.h81
-rw-r--r--src/mame/vsystem/vsystem_spr2.cpp221
-rw-r--r--src/mame/vsystem/vsystem_spr2.h72
-rw-r--r--src/mame/vsystem/welltris.cpp966
-rw-r--r--src/mame/vtech/clickstart.cpp481
-rw-r--r--src/mame/vtech/crvision.cpp975
-rw-r--r--src/mame/vtech/crvision.h116
-rw-r--r--src/mame/vtech/gamemachine.cpp403
-rw-r--r--src/mame/vtech/geniuscolor.cpp80
-rw-r--r--src/mame/vtech/geniusiq.cpp778
-rw-r--r--src/mame/vtech/geniusjr.cpp440
-rw-r--r--src/mame/vtech/gkidabc.cpp132
-rw-r--r--src/mame/vtech/glcx.cpp139
-rw-r--r--src/mame/vtech/innotv_innotabmax.cpp168
-rw-r--r--src/mame/vtech/inteladv.cpp109
-rw-r--r--src/mame/vtech/iqunlim.cpp224
-rw-r--r--src/mame/vtech/kidsupstar.cpp98
-rw-r--r--src/mame/vtech/laser3k.cpp1289
-rw-r--r--src/mame/vtech/lcmate2.cpp284
-rw-r--r--src/mame/vtech/learnwin.cpp218
-rw-r--r--src/mame/vtech/magibook.cpp72
-rw-r--r--src/mame/vtech/nl_gamemachine.cpp89
-rw-r--r--src/mame/vtech/nl_gamemachine.h7
-rw-r--r--src/mame/vtech/pc1000.cpp503
-rw-r--r--src/mame/vtech/pc2000.cpp975
-rw-r--r--src/mame/vtech/pc4.cpp259
-rw-r--r--src/mame/vtech/pc4.h84
-rw-r--r--src/mame/vtech/pc4_v.cpp192
-rw-r--r--src/mame/vtech/phusion.cpp91
-rw-r--r--src/mame/vtech/prestige.cpp999
-rw-r--r--src/mame/vtech/primusex.cpp347
-rw-r--r--src/mame/vtech/socrates.cpp1672
-rw-r--r--src/mame/vtech/socrates_a.cpp127
-rw-r--r--src/mame/vtech/socrates_a.h44
-rw-r--r--src/mame/vtech/storio.cpp194
-rw-r--r--src/mame/vtech/vsmile.cpp404
-rw-r--r--src/mame/vtech/vsmile.h184
-rw-r--r--src/mame/vtech/vsmileb.cpp207
-rw-r--r--src/mame/vtech/vsmilepro.cpp81
-rw-r--r--src/mame/vtech/vtech1.cpp630
-rw-r--r--src/mame/vtech/vtech2.cpp584
-rw-r--r--src/mame/vtech/vtech2.h119
-rw-r--r--src/mame/vtech/vtech2_m.cpp354
-rw-r--r--src/mame/vtech/vtech2_v.cpp314
-rw-r--r--src/mame/vtech/vtech5303.cpp86
-rw-r--r--src/mame/vtech/vtech_eu3a12.cpp196
-rw-r--r--src/mame/vtech/vtech_innotab.cpp222
-rw-r--r--src/mame/wang/wangpc.cpp1372
-rw-r--r--src/mame/wang/wangpckb.cpp513
-rw-r--r--src/mame/wang/wangpckb.h67
-rw-r--r--src/mame/wavemate/bullet.cpp1309
-rw-r--r--src/mame/wavemate/bullet.h191
-rw-r--r--src/mame/wavemate/jupiter.cpp454
-rw-r--r--src/mame/westinghouse/testconsole.cpp213
-rw-r--r--src/mame/wicat/t7000.cpp280
-rw-r--r--src/mame/wicat/wicat.cpp696
-rw-r--r--src/mame/wing/luckgrln.cpp996
-rw-r--r--src/mame/wing/lucky37.cpp321
-rw-r--r--src/mame/wing/lucky74.cpp1792
-rw-r--r--src/mame/wing/lucky74.h78
-rw-r--r--src/mame/wing/lucky74_v.cpp241
-rw-r--r--src/mame/wing/pinkiri8.cpp1370
-rw-r--r--src/mame/wing/slotcarn.cpp710
-rw-r--r--src/mame/wing/superwng.cpp502
-rw-r--r--src/mame/wyse/wy100.cpp304
-rw-r--r--src/mame/wyse/wy150.cpp134
-rw-r--r--src/mame/wyse/wy30p.cpp165
-rw-r--r--src/mame/wyse/wy50.cpp376
-rw-r--r--src/mame/wyse/wy50kb.cpp428
-rw-r--r--src/mame/wyse/wy50kb.h47
-rw-r--r--src/mame/wyse/wy55.cpp182
-rw-r--r--src/mame/wyse/wy60.cpp346
-rw-r--r--src/mame/wyse/wy85.cpp407
-rw-r--r--src/mame/xerox/alto1.cpp86
-rw-r--r--src/mame/xerox/alto2.cpp316
-rw-r--r--src/mame/xerox/bigbord2.cpp690
-rw-r--r--src/mame/xerox/notetaker.cpp1003
-rw-r--r--src/mame/xerox/x820kb.cpp364
-rw-r--r--src/mame/xerox/x820kb.h66
-rw-r--r--src/mame/xerox/xerox820.cpp939
-rw-r--r--src/mame/xerox/xerox820.h189
-rw-r--r--src/mame/yachiyo/atamanot.cpp537
-rw-r--r--src/mame/yachiyo/mole.cpp365
-rw-r--r--src/mame/yachiyo/ssingles.cpp320
-rw-r--r--src/mame/yachiyo/sstrangr.cpp695
-rw-r--r--src/mame/yamaha/fb01.cpp228
-rw-r--r--src/mame/yamaha/mks3.cpp301
-rw-r--r--src/mame/yamaha/mks3.h51
-rw-r--r--src/mame/yamaha/mu5lcd.cpp60
-rw-r--r--src/mame/yamaha/mu5lcd.h38
-rw-r--r--src/mame/yamaha/mulcd.cpp91
-rw-r--r--src/mame/yamaha/mulcd.h39
-rw-r--r--src/mame/yamaha/tg100.cpp103
-rw-r--r--src/mame/yamaha/yman1x.cpp86
-rw-r--r--src/mame/yamaha/ymdx100.cpp650
-rw-r--r--src/mame/yamaha/ymdx11.cpp139
-rw-r--r--src/mame/yamaha/ymdx7.cpp338
-rw-r--r--src/mame/yamaha/ymdx9.cpp419
-rw-r--r--src/mame/yamaha/ymmu10.cpp201
-rw-r--r--src/mame/yamaha/ymmu100.cpp563
-rw-r--r--src/mame/yamaha/ymmu128.cpp244
-rw-r--r--src/mame/yamaha/ymmu15.cpp222
-rw-r--r--src/mame/yamaha/ymmu2000.cpp492
-rw-r--r--src/mame/yamaha/ymmu5.cpp232
-rw-r--r--src/mame/yamaha/ymmu50.cpp329
-rw-r--r--src/mame/yamaha/ymmu80.cpp384
-rw-r--r--src/mame/yamaha/ymmu90.cpp272
-rw-r--r--src/mame/yamaha/ympcs30.cpp66
-rw-r--r--src/mame/yamaha/ymps400.cpp68
-rw-r--r--src/mame/yamaha/ympsr11.cpp280
-rw-r--r--src/mame/yamaha/ympsr150.cpp1814
-rw-r--r--src/mame/yamaha/ympsr16.cpp193
-rw-r--r--src/mame/yamaha/ympsr2000.cpp112
-rw-r--r--src/mame/yamaha/ympsr260.cpp133
-rw-r--r--src/mame/yamaha/ympsr340.cpp267
-rw-r--r--src/mame/yamaha/ympsr40.cpp64
-rw-r--r--src/mame/yamaha/ympsr400.cpp141
-rw-r--r--src/mame/yamaha/ympsr540.cpp380
-rw-r--r--src/mame/yamaha/ympsr60.cpp751
-rw-r--r--src/mame/yamaha/ympss170.cpp227
-rw-r--r--src/mame/yamaha/ymqs300.cpp383
-rw-r--r--src/mame/yamaha/ymqy70.cpp210
-rw-r--r--src/mame/yamaha/ymrx15.cpp108
-rw-r--r--src/mame/yamaha/ymsy35.cpp76
-rw-r--r--src/mame/yamaha/ymtx81z.cpp189
-rw-r--r--src/mame/yamaha/ymvl1.cpp281
-rw-r--r--src/mame/yamaha/ymvl70.cpp228
-rw-r--r--src/mame/yeno/301xl.cpp241
-rw-r--r--src/mame/yeno/416xl.cpp222
-rw-r--r--src/mame/yeno/532xl.cpp281
-rw-r--r--src/mame/yunsung/nmg5.cpp1590
-rw-r--r--src/mame/yunsung/paradise.cpp1831
-rw-r--r--src/mame/yunsung/yunsun16.cpp1366
-rw-r--r--src/mame/yunsung/yunsung8.cpp872
-rw-r--r--src/mame/zaccaria/galaxia.cpp889
-rw-r--r--src/mame/zaccaria/laserbat.cpp735
-rw-r--r--src/mame/zaccaria/laserbat.h191
-rw-r--r--src/mame/zaccaria/laserbat_a.cpp326
-rw-r--r--src/mame/zaccaria/laserbat_v.cpp413
-rw-r--r--src/mame/zaccaria/nl_zac1b11142.cpp437
-rw-r--r--src/mame/zaccaria/nl_zac1b11142.h12
-rw-r--r--src/mame/zaccaria/quasar.cpp664
-rw-r--r--src/mame/zaccaria/seabattl.cpp621
-rw-r--r--src/mame/zaccaria/zac1b1120.cpp593
-rw-r--r--src/mame/zaccaria/zaccaria.cpp973
-rw-r--r--src/mame/zaccaria/zaccaria_a.cpp505
-rw-r--r--src/mame/zaccaria/zaccaria_a.h126
-rw-r--r--src/mame/zpa/iq151.cpp495
-rw-r--r--src/mame/zvt/pp01.cpp248
-rw-r--r--src/mame/zvt/pp01.h94
-rw-r--r--src/mame/zvt/pp01_m.cpp230
-rw-r--r--src/mame/zvt/pp01_v.cpp51
-rw-r--r--src/osd/asio.h37
-rw-r--r--src/osd/eigcc.h216
-rw-r--r--src/osd/eigccarm.h298
-rw-r--r--src/osd/eigccppc.h328
-rw-r--r--src/osd/eigccx86.h651
-rw-r--r--src/osd/eivc.h137
-rw-r--r--src/osd/eivcarm.h75
-rw-r--r--src/osd/eivcx86.h468
-rw-r--r--src/osd/eminline.h671
-rw-r--r--src/osd/interface/audio.cpp51
-rw-r--r--src/osd/interface/audio.h162
-rw-r--r--src/osd/interface/inputcode.h907
-rw-r--r--src/osd/interface/inputdev.h66
-rw-r--r--src/osd/interface/inputfwd.h36
-rw-r--r--src/osd/interface/inputman.h46
-rw-r--r--src/osd/interface/inputseq.cpp210
-rw-r--r--src/osd/interface/inputseq.h107
-rw-r--r--src/osd/interface/midiport.h50
-rw-r--r--src/osd/interface/nethandler.cpp23
-rw-r--r--src/osd/interface/nethandler.h70
-rw-r--r--src/osd/interface/uievents.h61
-rw-r--r--src/osd/mac/appdelegate.h15
-rw-r--r--src/osd/mac/appdelegate.mm38
-rw-r--r--src/osd/mac/macmain.cpp265
-rw-r--r--src/osd/mac/main.mm42
-rw-r--r--src/osd/mac/mamefswindow.h15
-rw-r--r--src/osd/mac/mamefswindow.mm41
-rw-r--r--src/osd/mac/oglview.h19
-rw-r--r--src/osd/mac/oglview.mm106
-rw-r--r--src/osd/mac/osdmac.h86
-rw-r--r--src/osd/mac/video.cpp228
-rw-r--r--src/osd/mac/window.cpp858
-rw-r--r--src/osd/mac/window.h95
-rw-r--r--src/osd/mac/windowcontroller.h16
-rw-r--r--src/osd/mac/windowcontroller.mm137
-rw-r--r--src/osd/modules/debugger/debug_module.h32
-rw-r--r--src/osd/modules/debugger/debuggdbstub.cpp1719
-rw-r--r--src/osd/modules/debugger/debugimgui.cpp1648
-rw-r--r--src/osd/modules/debugger/debugosx.mm351
-rw-r--r--src/osd/modules/debugger/debugqt.cpp262
-rw-r--r--src/osd/modules/debugger/debugwin.cpp494
-rw-r--r--src/osd/modules/debugger/none.cpp61
-rw-r--r--src/osd/modules/debugger/osx/breakpointsview.h23
-rw-r--r--src/osd/modules/debugger/osx/breakpointsview.mm27
-rw-r--r--src/osd/modules/debugger/osx/consoleview.h23
-rw-r--r--src/osd/modules/debugger/osx/consoleview.mm27
-rw-r--r--src/osd/modules/debugger/osx/debugcommandhistory.h40
-rw-r--r--src/osd/modules/debugger/osx/debugcommandhistory.mm141
-rw-r--r--src/osd/modules/debugger/osx/debugconsole.h69
-rw-r--r--src/osd/modules/debugger/osx/debugconsole.mm641
-rw-r--r--src/osd/modules/debugger/osx/debugosx.h30
-rw-r--r--src/osd/modules/debugger/osx/debugview.h80
-rw-r--r--src/osd/modules/debugger/osx/debugview.mm944
-rw-r--r--src/osd/modules/debugger/osx/debugwindowhandler.h108
-rw-r--r--src/osd/modules/debugger/osx/debugwindowhandler.mm509
-rw-r--r--src/osd/modules/debugger/osx/deviceinfoviewer.h28
-rw-r--r--src/osd/modules/debugger/osx/deviceinfoviewer.mm246
-rw-r--r--src/osd/modules/debugger/osx/devicesviewer.h31
-rw-r--r--src/osd/modules/debugger/osx/devicesviewer.mm226
-rw-r--r--src/osd/modules/debugger/osx/disassemblyview.h46
-rw-r--r--src/osd/modules/debugger/osx/disassemblyview.mm291
-rw-r--r--src/osd/modules/debugger/osx/disassemblyviewer.h39
-rw-r--r--src/osd/modules/debugger/osx/disassemblyviewer.mm322
-rw-r--r--src/osd/modules/debugger/osx/errorlogview.h23
-rw-r--r--src/osd/modules/debugger/osx/errorlogview.mm28
-rw-r--r--src/osd/modules/debugger/osx/errorlogviewer.h28
-rw-r--r--src/osd/modules/debugger/osx/errorlogviewer.mm72
-rw-r--r--src/osd/modules/debugger/osx/exceptionpointsview.h23
-rw-r--r--src/osd/modules/debugger/osx/exceptionpointsview.mm27
-rw-r--r--src/osd/modules/debugger/osx/memoryview.h49
-rw-r--r--src/osd/modules/debugger/osx/memoryview.mm394
-rw-r--r--src/osd/modules/debugger/osx/memoryviewer.h35
-rw-r--r--src/osd/modules/debugger/osx/memoryviewer.mm202
-rw-r--r--src/osd/modules/debugger/osx/pointsviewer.h32
-rw-r--r--src/osd/modules/debugger/osx/pointsviewer.mm224
-rw-r--r--src/osd/modules/debugger/osx/registerpointsview.h23
-rw-r--r--src/osd/modules/debugger/osx/registerpointsview.mm27
-rw-r--r--src/osd/modules/debugger/osx/registersview.h30
-rw-r--r--src/osd/modules/debugger/osx/registersview.mm70
-rw-r--r--src/osd/modules/debugger/osx/watchpointsview.h23
-rw-r--r--src/osd/modules/debugger/osx/watchpointsview.mm27
-rw-r--r--src/osd/modules/debugger/qt/breakpointswindow.cpp166
-rw-r--r--src/osd/modules/debugger/qt/breakpointswindow.h38
-rw-r--r--src/osd/modules/debugger/qt/dasmwindow.cpp379
-rw-r--r--src/osd/modules/debugger/qt/dasmwindow.h68
-rw-r--r--src/osd/modules/debugger/qt/debuggerview.cpp425
-rw-r--r--src/osd/modules/debugger/qt/debuggerview.h67
-rw-r--r--src/osd/modules/debugger/qt/deviceinformationwindow.cpp126
-rw-r--r--src/osd/modules/debugger/qt/deviceinformationwindow.h39
-rw-r--r--src/osd/modules/debugger/qt/deviceswindow.cpp168
-rw-r--r--src/osd/modules/debugger/qt/deviceswindow.h65
-rw-r--r--src/osd/modules/debugger/qt/logwindow.cpp64
-rw-r--r--src/osd/modules/debugger/qt/logwindow.h37
-rw-r--r--src/osd/modules/debugger/qt/mainwindow.cpp511
-rw-r--r--src/osd/modules/debugger/qt/mainwindow.h163
-rw-r--r--src/osd/modules/debugger/qt/memorywindow.cpp549
-rw-r--r--src/osd/modules/debugger/qt/memorywindow.h91
-rw-r--r--src/osd/modules/debugger/qt/windowqt.cpp404
-rw-r--r--src/osd/modules/debugger/qt/windowqt.h116
-rw-r--r--src/osd/modules/debugger/win/consolewininfo.cpp650
-rw-r--r--src/osd/modules/debugger/win/consolewininfo.h72
-rw-r--r--src/osd/modules/debugger/win/debugbaseinfo.cpp66
-rw-r--r--src/osd/modules/debugger/win/debugbaseinfo.h42
-rw-r--r--src/osd/modules/debugger/win/debugviewinfo.cpp1083
-rw-r--r--src/osd/modules/debugger/win/debugviewinfo.h97
-rw-r--r--src/osd/modules/debugger/win/debugwin.h64
-rw-r--r--src/osd/modules/debugger/win/debugwininfo.cpp753
-rw-r--r--src/osd/modules/debugger/win/debugwininfo.h170
-rw-r--r--src/osd/modules/debugger/win/disasmbasewininfo.cpp283
-rw-r--r--src/osd/modules/debugger/win/disasmbasewininfo.h37
-rw-r--r--src/osd/modules/debugger/win/disasmviewinfo.cpp75
-rw-r--r--src/osd/modules/debugger/win/disasmviewinfo.h41
-rw-r--r--src/osd/modules/debugger/win/disasmwininfo.cpp184
-rw-r--r--src/osd/modules/debugger/win/disasmwininfo.h44
-rw-r--r--src/osd/modules/debugger/win/editwininfo.cpp287
-rw-r--r--src/osd/modules/debugger/win/editwininfo.h69
-rw-r--r--src/osd/modules/debugger/win/logviewinfo.cpp33
-rw-r--r--src/osd/modules/debugger/win/logviewinfo.h31
-rw-r--r--src/osd/modules/debugger/win/logwininfo.cpp76
-rw-r--r--src/osd/modules/debugger/win/logwininfo.h33
-rw-r--r--src/osd/modules/debugger/win/memoryviewinfo.cpp210
-rw-r--r--src/osd/modules/debugger/win/memoryviewinfo.h62
-rw-r--r--src/osd/modules/debugger/win/memorywininfo.cpp428
-rw-r--r--src/osd/modules/debugger/win/memorywininfo.h46
-rw-r--r--src/osd/modules/debugger/win/pointswininfo.cpp199
-rw-r--r--src/osd/modules/debugger/win/pointswininfo.h37
-rw-r--r--src/osd/modules/debugger/win/uimetrics.cpp160
-rw-r--r--src/osd/modules/debugger/win/uimetrics.h81
-rw-r--r--src/osd/modules/debugger/xmlconfig.cpp54
-rw-r--r--src/osd/modules/debugger/xmlconfig.h72
-rw-r--r--src/osd/modules/diagnostics/diagnostics_module.h42
-rw-r--r--src/osd/modules/diagnostics/diagnostics_win32.cpp1156
-rw-r--r--src/osd/modules/diagnostics/none.cpp50
-rw-r--r--src/osd/modules/file/posixdir.cpp305
-rw-r--r--src/osd/modules/file/posixfile.cpp543
-rw-r--r--src/osd/modules/file/posixfile.h35
-rw-r--r--src/osd/modules/file/posixptty.cpp216
-rw-r--r--src/osd/modules/file/posixsocket.cpp264
-rw-r--r--src/osd/modules/file/stdfile.cpp302
-rw-r--r--src/osd/modules/file/windir.cpp141
-rw-r--r--src/osd/modules/file/winfile.cpp550
-rw-r--r--src/osd/modules/file/winfile.h35
-rw-r--r--src/osd/modules/file/winptty.cpp120
-rw-r--r--src/osd/modules/file/winrtdir.cpp141
-rw-r--r--src/osd/modules/file/winrtfile.cpp472
-rw-r--r--src/osd/modules/file/winrtfile.h34
-rw-r--r--src/osd/modules/file/winrtptty.cpp87
-rw-r--r--src/osd/modules/file/winrtsocket.cpp274
-rw-r--r--src/osd/modules/file/winsocket.cpp297
-rw-r--r--src/osd/modules/font/font_dwrite.cpp829
-rw-r--r--src/osd/modules/font/font_module.h37
-rw-r--r--src/osd/modules/font/font_none.cpp40
-rw-r--r--src/osd/modules/font/font_osx.cpp303
-rw-r--r--src/osd/modules/font/font_sdl.cpp381
-rw-r--r--src/osd/modules/font/font_sdl3.cpp389
-rw-r--r--src/osd/modules/font/font_windows.cpp338
-rw-r--r--src/osd/modules/input/assignmenthelper.cpp592
-rw-r--r--src/osd/modules/input/assignmenthelper.h118
-rw-r--r--src/osd/modules/input/input_common.cpp328
-rw-r--r--src/osd/modules/input/input_common.h431
-rw-r--r--src/osd/modules/input/input_dinput.cpp1352
-rw-r--r--src/osd/modules/input/input_dinput.h189
-rw-r--r--src/osd/modules/input/input_mac.cpp51
-rw-r--r--src/osd/modules/input/input_module.h36
-rw-r--r--src/osd/modules/input/input_none.cpp64
-rw-r--r--src/osd/modules/input/input_rawinput.cpp978
-rw-r--r--src/osd/modules/input/input_sdl.cpp2881
-rw-r--r--src/osd/modules/input/input_sdl3.cpp2957
-rw-r--r--src/osd/modules/input/input_win32.cpp690
-rw-r--r--src/osd/modules/input/input_wincommon.h40
-rw-r--r--src/osd/modules/input/input_windows.cpp152
-rw-r--r--src/osd/modules/input/input_windows.h48
-rw-r--r--src/osd/modules/input/input_winhybrid.cpp414
-rw-r--r--src/osd/modules/input/input_x11.cpp728
-rw-r--r--src/osd/modules/input/input_xinput.cpp3141
-rw-r--r--src/osd/modules/input/input_xinput.h51
-rw-r--r--src/osd/modules/lib/osdlib.h213
-rw-r--r--src/osd/modules/lib/osdlib_macosx.cpp353
-rw-r--r--src/osd/modules/lib/osdlib_unix.cpp348
-rw-r--r--src/osd/modules/lib/osdlib_win32.cpp409
-rw-r--r--src/osd/modules/lib/osdobj_common.cpp832
-rw-r--r--src/osd/modules/lib/osdobj_common.h335
-rw-r--r--src/osd/modules/midi/midi_module.h38
-rw-r--r--src/osd/modules/midi/none.cpp41
-rw-r--r--src/osd/modules/midi/portmidi.cpp478
-rw-r--r--src/osd/modules/monitor/monitor_common.cpp120
-rw-r--r--src/osd/modules/monitor/monitor_common.h51
-rw-r--r--src/osd/modules/monitor/monitor_dxgi.cpp182
-rw-r--r--src/osd/modules/monitor/monitor_mac.cpp189
-rw-r--r--src/osd/modules/monitor/monitor_module.h109
-rw-r--r--src/osd/modules/monitor/monitor_sdl.cpp193
-rw-r--r--src/osd/modules/monitor/monitor_win32.cpp152
-rw-r--r--src/osd/modules/netdev/netdev_common.cpp39
-rw-r--r--src/osd/modules/netdev/netdev_common.h36
-rw-r--r--src/osd/modules/netdev/netdev_module.h33
-rw-r--r--src/osd/modules/netdev/none.cpp48
-rw-r--r--src/osd/modules/netdev/pcap.cpp310
-rw-r--r--src/osd/modules/netdev/taptun.cpp407
-rw-r--r--src/osd/modules/opengl/gl_shader_mgr.cpp277
-rw-r--r--src/osd/modules/opengl/gl_shader_mgr.h57
-rw-r--r--src/osd/modules/opengl/gl_shader_tool.cpp670
-rw-r--r--src/osd/modules/opengl/gl_shader_tool.h202
-rw-r--r--src/osd/modules/opengl/osd_opengl.h1921
-rwxr-xr-xsrc/osd/modules/opengl/shader/genc.sh50
-rw-r--r--src/osd/modules/opengl/shader/glsl_bicubic_rgb32_dir.fsh81
-rw-r--r--src/osd/modules/opengl/shader/glsl_bicubic_rgb32_dir.fsh.c82
-rw-r--r--src/osd/modules/opengl/shader/glsl_bilinear.vsh7
-rw-r--r--src/osd/modules/opengl/shader/glsl_bilinear_idx16_lut.fsh56
-rw-r--r--src/osd/modules/opengl/shader/glsl_bilinear_idx16_lut.fsh.c59
-rw-r--r--src/osd/modules/opengl/shader/glsl_bilinear_rgb32_dir.fsh55
-rw-r--r--src/osd/modules/opengl/shader/glsl_bilinear_rgb32_dir.fsh.c57
-rw-r--r--src/osd/modules/opengl/shader/glsl_bilinear_rgb32_lut.fsh59
-rw-r--r--src/osd/modules/opengl/shader/glsl_bilinear_rgb32_lut.fsh.c62
-rw-r--r--src/osd/modules/opengl/shader/glsl_general.vsh7
-rw-r--r--src/osd/modules/opengl/shader/glsl_general.vsh.c11
-rw-r--r--src/osd/modules/opengl/shader/glsl_plain.vsh7
-rw-r--r--src/osd/modules/opengl/shader/glsl_plain_idx16_lut.fsh31
-rw-r--r--src/osd/modules/opengl/shader/glsl_plain_idx16_lut.fsh.c34
-rw-r--r--src/osd/modules/opengl/shader/glsl_plain_rgb32_dir.fsh25
-rw-r--r--src/osd/modules/opengl/shader/glsl_plain_rgb32_dir.fsh.c28
-rw-r--r--src/osd/modules/opengl/shader/glsl_plain_rgb32_lut.fsh29
-rw-r--r--src/osd/modules/opengl/shader/glsl_plain_rgb32_lut.fsh.c32
-rw-r--r--src/osd/modules/osdhelper.h60
-rw-r--r--src/osd/modules/osdmodule.cpp140
-rw-r--r--src/osd/modules/osdmodule.h115
-rw-r--r--src/osd/modules/osdwindow.cpp140
-rw-r--r--src/osd/modules/osdwindow.h446
-rw-r--r--src/osd/modules/output/console.cpp42
-rw-r--r--src/osd/modules/output/network.cpp248
-rw-r--r--src/osd/modules/output/none.cpp40
-rw-r--r--src/osd/modules/output/output_module.h34
-rw-r--r--src/osd/modules/output/win32_output.cpp379
-rw-r--r--src/osd/modules/output/win32_output.h92
-rw-r--r--src/osd/modules/render/aviwrite.cpp156
-rw-r--r--src/osd/modules/render/aviwrite.h57
-rw-r--r--src/osd/modules/render/bgfx/blendreader.cpp54
-rw-r--r--src/osd/modules/render/bgfx/blendreader.h31
-rw-r--r--src/osd/modules/render/bgfx/chain.cpp188
-rw-r--r--src/osd/modules/render/bgfx/chain.h67
-rw-r--r--src/osd/modules/render/bgfx/chainentry.cpp417
-rw-r--r--src/osd/modules/render/bgfx/chainentry.h81
-rw-r--r--src/osd/modules/render/bgfx/chainentryreader.cpp245
-rw-r--r--src/osd/modules/render/bgfx/chainentryreader.h32
-rw-r--r--src/osd/modules/render/bgfx/chainmanager.cpp958
-rw-r--r--src/osd/modules/render/bgfx/chainmanager.h159
-rw-r--r--src/osd/modules/render/bgfx/chainreader.cpp153
-rw-r--r--src/osd/modules/render/bgfx/chainreader.h31
-rw-r--r--src/osd/modules/render/bgfx/clear.cpp22
-rw-r--r--src/osd/modules/render/bgfx/clear.h30
-rw-r--r--src/osd/modules/render/bgfx/clearreader.cpp62
-rw-r--r--src/osd/modules/render/bgfx/clearreader.h31
-rw-r--r--src/osd/modules/render/bgfx/cullreader.cpp24
-rw-r--r--src/osd/modules/render/bgfx/cullreader.h25
-rw-r--r--src/osd/modules/render/bgfx/depthreader.cpp36
-rw-r--r--src/osd/modules/render/bgfx/depthreader.h27
-rw-r--r--src/osd/modules/render/bgfx/effect.cpp62
-rw-r--r--src/osd/modules/render/bgfx/effect.h41
-rw-r--r--src/osd/modules/render/bgfx/effectmanager.cpp127
-rw-r--r--src/osd/modules/render/bgfx/effectmanager.h43
-rw-r--r--src/osd/modules/render/bgfx/effectreader.cpp166
-rw-r--r--src/osd/modules/render/bgfx/effectreader.h43
-rw-r--r--src/osd/modules/render/bgfx/entryuniform.h34
-rw-r--r--src/osd/modules/render/bgfx/entryuniformreader.cpp59
-rw-r--r--src/osd/modules/render/bgfx/entryuniformreader.h33
-rw-r--r--src/osd/modules/render/bgfx/frameparameter.cpp29
-rw-r--r--src/osd/modules/render/bgfx/frameparameter.h32
-rw-r--r--src/osd/modules/render/bgfx/inputpair.cpp152
-rw-r--r--src/osd/modules/render/bgfx/inputpair.h57
-rw-r--r--src/osd/modules/render/bgfx/parameter.h45
-rw-r--r--src/osd/modules/render/bgfx/paramreader.cpp64
-rw-r--r--src/osd/modules/render/bgfx/paramreader.h33
-rw-r--r--src/osd/modules/render/bgfx/paramuniform.cpp23
-rw-r--r--src/osd/modules/render/bgfx/paramuniform.h29
-rw-r--r--src/osd/modules/render/bgfx/paramuniformreader.cpp32
-rw-r--r--src/osd/modules/render/bgfx/paramuniformreader.h32
-rw-r--r--src/osd/modules/render/bgfx/shadermanager.cpp153
-rw-r--r--src/osd/modules/render/bgfx/shadermanager.h44
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/blurs/fs_smart-blur.sc64
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/blurs/varying.def.sc9
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/blurs/vs_smart-blur.sc52
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/crt-geom_common.sc203
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/fs_crt-geom-deluxe.sc143
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/fs_crt-geom.sc102
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/fs_gaussx.sc38
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/fs_gaussy.sc38
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/fs_lowpass.sc37
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/fs_mipmap8.sc148
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/fs_phosphor_apply.sc42
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/fs_phosphor_update.sc45
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/varying.def.sc14
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/vs_crt-geom.sc100
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/vs_gaussx.sc23
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/vs_gaussy.sc23
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/vs_lowpass.sc53
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/vs_mipmap8.sc16
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/vs_phosphor_apply.sc16
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt-geom/vs_phosphor_update.sc16
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt/fs_crt-caligari.sc123
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt/varying.def.sc7
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/crt/vs_crt-caligari.sc49
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/default/fs_blit.sc14
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/default/varying.def.sc6
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/default/vs_blit.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/eagle/fs_eagle.sc165
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/eagle/varying.def.sc14
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/eagle/vs_eagle.sc47
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_chroma.sc39
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_color.sc43
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_deconverge.sc21
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_defocus.sc57
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_distortion.sc248
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_ntsc_decode.sc136
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_ntsc_encode.sc72
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_phosphor.sc24
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_post.sc167
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_prescale.sc30
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/fs_scanline.sc82
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/varying.def.sc9
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_chroma.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_color.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_deconverge.sc36
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_defocus.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_distortion.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_ntsc_decode.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_ntsc_encode.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_phosphor.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_post.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_prescale.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hlsl/vs_scanline.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hqx/fs_hq2x.sc75
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hqx/fs_hq3x.sc75
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hqx/fs_hq4x.sc75
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hqx/varying.def.sc9
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hqx/vs_hq2x.sc40
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hqx/vs_hq3x.sc40
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/hqx/vs_hq4x.sc40
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/lcd-grid/fs_lcd-grid.sc106
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/lcd-grid/fs_persistence.sc16
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/lcd-grid/varying.def.sc6
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/lcd-grid/vs_lcd-grid.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/lcd-grid/vs_persistence.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit.sc14
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_bcg.sc24
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_palette16.sc37
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_rgb32.sc14
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_blit_yuy16.sc38
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_bob-and-ghost-deinterlace.sc55
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_deposterize-pass0.sc45
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_deposterize-pass1.sc45
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_lut.sc28
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/fs_saturation.sc25
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/varying.def.sc7
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/vs_blit.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/vs_bob-and-ghost-deinterlace.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/vs_deposterize-pass0.sc34
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/vs_deposterize-pass1.sc34
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/vs_lut.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/vs_resize_blit.sc21
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/misc/vs_saturation.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/fs_gaussian.sc57
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/fs_offset_sat.sc25
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/varying.def.sc6
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/vs_gaussian.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_horizontal/vs_offset_sat.sc22
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/fs_gaussian.sc57
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/fs_offset_sat.sc25
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/varying.def.sc6
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/vs_gaussian.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_left_vertical/vs_offset_sat.sc22
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/fs_gaussian.sc57
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/fs_offset_sat.sc25
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/varying.def.sc6
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/vs_gaussian.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_horizontal/vs_offset_sat.sc22
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/fs_gaussian.sc57
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/fs_offset_sat.sc25
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/varying.def.sc6
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/vs_gaussian.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/pillarbox_right_vertical/vs_offset_sat.sc22
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/unfiltered/fs_blit.sc14
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/unfiltered/varying.def.sc6
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/unfiltered/vs_blit.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/warp/fs_dilation-horizontal-fast.sc46
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/warp/varying.def.sc7
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/warp/vs_dilation-horizontal-fast.sc55
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv1-noblend.sc132
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2-3d.sc243
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2-fast.sc178
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2-noblend.sc177
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv2.sc203
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv3-noblend.sc213
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/fs_xbr-lv3.sc235
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_custom-jinc2-sharper.sc134
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass0.sc227
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass1.sc211
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-2xbr-3d-pass2.sc213
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass0.sc217
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1.sc210
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass1f.sc211
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass2.sc226
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3.sc210
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-4xbr-3d-pass3f.sc211
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass0.sc169
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass1.sc159
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-fast-pass2.sc162
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass0.sc160
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass1.sc178
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/fs_super-xbr-pass2.sc170
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/varying.def.sc10
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_custom-jinc2-sharper.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass0.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass1.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-2xbr-3d-pass2.sc54
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass0.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass1f.sc28
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass2.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-4xbr-3d-pass3f.sc28
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass0.sc45
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass1.sc45
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-fast-pass2.sc45
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass0.sc54
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass1.sc45
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass2.sc54
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/super-xbr/vs_super-xbr-pass3.sc54
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/varying.def.sc13
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv1-noblend.sc26
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2-3d.sc33
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2-fast.sc33
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2-noblend.sc63
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv2.sc31
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv3-noblend.sc64
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/vs_xbr-lv3.sc64
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-sharp.sc336
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2-gamma.sc265
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v2.sc255
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4-gamma.sc281
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4.sc271
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v4b.sc256
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/fs_2xbr-hybrid-v5-gamma.sc288
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/fs_2xbr-hybrid.sc341
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/varying.def.sc13
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-sharp.sc76
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2-gamma.sc76
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v2.sc76
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4-gamma.sc76
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4.sc76
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v4b.sc76
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/vs_2xbr-hybrid-v5-gamma.sc76
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-hybrid/vs_2xbr-hybrid.sc76
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-a-pass0.sc159
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass0.sc174
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-accuracy-pass1.sc160
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-b-pass0.sc160
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-c-pass0.sc133
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-d-pass0.sc163
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-noblend-pass1.sc162
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/fs_xbr-lv2-pass1.sc153
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/varying.def.sc13
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-a-pass0.sc64
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass0.sc63
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-accuracy-pass1.sc59
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-b-pass0.sc64
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-c-pass0.sc64
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-d-pass0.sc64
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-noblend-pass1.sc58
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv2-multipass/vs_xbr-lv2-pass1.sc60
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass0.sc216
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv3-multipass/fs_xbr-lv3-pass1.sc180
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv3-multipass/varying.def.sc13
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass0.sc64
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-lv3-multipass/vs_xbr-lv3-pass1.sc59
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass1.sc208
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass2.sc235
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass3.sc172
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-mlv4-multipass/fs_xbr-mlv4-pass4.sc164
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-mlv4-multipass/varying.def.sc13
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass1.sc56
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass2.sc63
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass3.sc59
-rw-r--r--src/osd/modules/render/bgfx/shaders/chains/xbr/xbr-mlv4-multipass/vs_xbr-mlv4-pass4.sc57
-rw-r--r--src/osd/modules/render/bgfx/shaders/fs_gui.sc14
-rw-r--r--src/osd/modules/render/bgfx/shaders/fs_screen.sc14
-rw-r--r--src/osd/modules/render/bgfx/shaders/makefile39
-rw-r--r--src/osd/modules/render/bgfx/shaders/shader.mk183
-rw-r--r--src/osd/modules/render/bgfx/shaders/varying.def.sc6
-rw-r--r--src/osd/modules/render/bgfx/shaders/vs_gui.sc19
-rw-r--r--src/osd/modules/render/bgfx/shaders/vs_screen.sc19
-rw-r--r--src/osd/modules/render/bgfx/slider.cpp121
-rw-r--r--src/osd/modules/render/bgfx/slider.h89
-rw-r--r--src/osd/modules/render/bgfx/sliderreader.cpp166
-rw-r--r--src/osd/modules/render/bgfx/sliderreader.h36
-rw-r--r--src/osd/modules/render/bgfx/slideruniform.cpp32
-rw-r--r--src/osd/modules/render/bgfx/slideruniform.h34
-rw-r--r--src/osd/modules/render/bgfx/slideruniformreader.cpp46
-rw-r--r--src/osd/modules/render/bgfx/slideruniformreader.h32
-rw-r--r--src/osd/modules/render/bgfx/statereader.cpp163
-rw-r--r--src/osd/modules/render/bgfx/statereader.h68
-rw-r--r--src/osd/modules/render/bgfx/suppressor.cpp59
-rw-r--r--src/osd/modules/render/bgfx/suppressor.h51
-rw-r--r--src/osd/modules/render/bgfx/suppressorreader.cpp94
-rw-r--r--src/osd/modules/render/bgfx/suppressorreader.h37
-rw-r--r--src/osd/modules/render/bgfx/target.cpp138
-rw-r--r--src/osd/modules/render/bgfx/target.h86
-rw-r--r--src/osd/modules/render/bgfx/targetmanager.cpp200
-rw-r--r--src/osd/modules/render/bgfx/targetmanager.h64
-rw-r--r--src/osd/modules/render/bgfx/targetreader.cpp104
-rw-r--r--src/osd/modules/render/bgfx/targetreader.h33
-rw-r--r--src/osd/modules/render/bgfx/texture.cpp65
-rw-r--r--src/osd/modules/render/bgfx/texture.h55
-rw-r--r--src/osd/modules/render/bgfx/texturehandleprovider.h33
-rw-r--r--src/osd/modules/render/bgfx/texturemanager.cpp228
-rw-r--r--src/osd/modules/render/bgfx/texturemanager.h64
-rw-r--r--src/osd/modules/render/bgfx/timeparameter.cpp35
-rw-r--r--src/osd/modules/render/bgfx/timeparameter.h31
-rw-r--r--src/osd/modules/render/bgfx/uniform.cpp94
-rw-r--r--src/osd/modules/render/bgfx/uniform.h50
-rw-r--r--src/osd/modules/render/bgfx/uniformreader.cpp61
-rw-r--r--src/osd/modules/render/bgfx/uniformreader.h34
-rw-r--r--src/osd/modules/render/bgfx/valueuniform.cpp29
-rw-r--r--src/osd/modules/render/bgfx/valueuniform.h31
-rw-r--r--src/osd/modules/render/bgfx/valueuniformreader.cpp44
-rw-r--r--src/osd/modules/render/bgfx/valueuniformreader.h30
-rw-r--r--src/osd/modules/render/bgfx/vertex.h37
-rw-r--r--src/osd/modules/render/bgfx/view.cpp67
-rw-r--r--src/osd/modules/render/bgfx/view.h71
-rw-r--r--src/osd/modules/render/bgfx/windowparameter.h31
-rw-r--r--src/osd/modules/render/bgfx/writereader.cpp18
-rw-r--r--src/osd/modules/render/bgfx/writereader.h21
-rw-r--r--src/osd/modules/render/bgfxutil.cpp132
-rw-r--r--src/osd/modules/render/bgfxutil.h24
-rw-r--r--src/osd/modules/render/binpacker.cpp197
-rw-r--r--src/osd/modules/render/binpacker.h186
-rw-r--r--src/osd/modules/render/blit13.ipp256
-rw-r--r--src/osd/modules/render/copyutil.h268
-rw-r--r--src/osd/modules/render/d3d/d3dcomm.h283
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.cpp2815
-rw-r--r--src/osd/modules/render/d3d/d3dhlsl.h466
-rw-r--r--src/osd/modules/render/draw13.cpp1190
-rw-r--r--src/osd/modules/render/drawbgfx.cpp1772
-rw-r--r--src/osd/modules/render/drawbgfx.h164
-rw-r--r--src/osd/modules/render/drawd3d.cpp2642
-rw-r--r--src/osd/modules/render/drawd3d.h178
-rw-r--r--src/osd/modules/render/drawgdi.cpp167
-rw-r--r--src/osd/modules/render/drawnone.cpp81
-rw-r--r--src/osd/modules/render/drawogl.cpp3038
-rw-r--r--src/osd/modules/render/drawsdl.cpp786
-rw-r--r--src/osd/modules/render/drawsdl3accel.cpp1165
-rw-r--r--src/osd/modules/render/drawsdl3soft.cpp713
-rw-r--r--src/osd/modules/render/render_module.h38
-rw-r--r--src/osd/modules/render/sdlglcontext.h93
-rw-r--r--src/osd/modules/render/sliderdirtynotifier.h22
-rw-r--r--src/osd/modules/render/winglcontext.h213
-rw-r--r--src/osd/modules/sound/coreaudio_sound.cpp1808
-rw-r--r--src/osd/modules/sound/js_sound.cpp126
-rw-r--r--src/osd/modules/sound/js_sound.js196
-rw-r--r--src/osd/modules/sound/mmdevice_helpers.cpp355
-rw-r--r--src/osd/modules/sound/mmdevice_helpers.h149
-rw-r--r--src/osd/modules/sound/none.cpp50
-rw-r--r--src/osd/modules/sound/pa_sound.cpp344
-rw-r--r--src/osd/modules/sound/pipewire_sound.cpp837
-rw-r--r--src/osd/modules/sound/pulse_sound.cpp544
-rw-r--r--src/osd/modules/sound/sdl3_sound.cpp381
-rw-r--r--src/osd/modules/sound/sdl_sound.cpp260
-rw-r--r--src/osd/modules/sound/sound_module.cpp204
-rw-r--r--src/osd/modules/sound/sound_module.h84
-rw-r--r--src/osd/modules/sound/wasapi_sound.cpp1670
-rw-r--r--src/osd/modules/sound/xaudio2_sound.cpp1688
-rw-r--r--src/osd/osdcomm.h223
-rw-r--r--src/osd/osdcore.cpp219
-rw-r--r--src/osd/osdcore.h801
-rw-r--r--src/osd/osdepend.h255
-rw-r--r--src/osd/osdfile.h303
-rw-r--r--src/osd/osdmini/minidir.c45
-rw-r--r--src/osd/osdmini/minifile.c125
-rw-r--r--src/osd/osdmini/minimisc.c53
-rw-r--r--src/osd/osdmini/minisync.c67
-rw-r--r--src/osd/osdmini/minitime.c57
-rw-r--r--src/osd/osdmini/miniwork.c115
-rw-r--r--src/osd/osdmini/osd_cpu.h68
-rw-r--r--src/osd/osdmini/osdmini.mak23
-rw-r--r--src/osd/osdsync.cpp817
-rw-r--r--src/osd/osdsync.h169
-rw-r--r--src/osd/sdl/android_main.cpp11
-rw-r--r--src/osd/sdl/osdsdl.cpp852
-rw-r--r--src/osd/sdl/osdsdl.h216
-rw-r--r--src/osd/sdl/sdlmain.cpp113
-rw-r--r--src/osd/sdl/sdlopts.cpp127
-rw-r--r--src/osd/sdl/sdlopts.h100
-rw-r--r--src/osd/sdl/sdlprefix.h65
-rwxr-xr-xsrc/osd/sdl/taputil.sh43
-rw-r--r--src/osd/sdl/video.cpp192
-rw-r--r--src/osd/sdl/window.cpp1374
-rw-r--r--src/osd/sdl/window.h134
-rw-r--r--src/osd/sdl3/android_main.cpp11
-rw-r--r--src/osd/sdl3/osdsdl.cpp893
-rw-r--r--src/osd/sdl3/osdsdl.h216
-rw-r--r--src/osd/sdl3/sdlmain.cpp118
-rw-r--r--src/osd/sdl3/sdlopts.cpp127
-rw-r--r--src/osd/sdl3/sdlopts.h104
-rw-r--r--src/osd/sdl3/sdlprefix.h65
-rwxr-xr-xsrc/osd/sdl3/taputil.sh43
-rw-r--r--src/osd/sdl3/video.cpp192
-rw-r--r--src/osd/sdl3/window.cpp1404
-rw-r--r--src/osd/sdl3/window.h133
-rw-r--r--src/osd/strconv.cpp320
-rw-r--r--src/osd/strconv.h61
-rw-r--r--src/osd/watchdog.cpp67
-rw-r--r--src/osd/watchdog.h46
-rw-r--r--src/osd/windows/d3d8intf.c557
-rw-r--r--src/osd/windows/d3d9intf.c590
-rw-r--r--src/osd/windows/d3dintf.h243
-rw-r--r--src/osd/windows/debugwin.c2837
-rw-r--r--src/osd/windows/debugwin.h31
-rw-r--r--src/osd/windows/drawd3d.c2523
-rw-r--r--src/osd/windows/drawdd.c1440
-rw-r--r--src/osd/windows/drawgdi.c215
-rw-r--r--src/osd/windows/drawnone.c104
-rw-r--r--src/osd/windows/eivc.h169
-rw-r--r--src/osd/windows/eivcx86.h463
-rw-r--r--src/osd/windows/input.c2166
-rw-r--r--src/osd/windows/input.h29
-rw-r--r--src/osd/windows/ledutil.c742
-rw-r--r--src/osd/windows/ledutil.cpp708
-rw-r--r--src/osd/windows/main.c89
-rw-r--r--src/osd/windows/mame.man10
-rw-r--r--src/osd/windows/mame.rc13
-rw-r--r--src/osd/windows/multidef.h38
-rw-r--r--src/osd/windows/osd_cpu.h60
-rw-r--r--src/osd/windows/osinline.h52
-rw-r--r--src/osd/windows/output.c318
-rw-r--r--src/osd/windows/output.h97
-rw-r--r--src/osd/windows/sound.c413
-rw-r--r--src/osd/windows/sound.h20
-rw-r--r--src/osd/windows/strconv.c108
-rw-r--r--src/osd/windows/strconv.h37
-rw-r--r--src/osd/windows/vconv.c461
-rw-r--r--src/osd/windows/video.c510
-rw-r--r--src/osd/windows/video.cpp206
-rw-r--r--src/osd/windows/video.h103
-rw-r--r--src/osd/windows/winalloc.c591
-rw-r--r--src/osd/windows/windir.c155
-rw-r--r--src/osd/windows/window.c1838
-rw-r--r--src/osd/windows/window.cpp2412
-rw-r--r--src/osd/windows/window.h258
-rw-r--r--src/osd/windows/windows.mak337
-rw-r--r--src/osd/windows/winfile.c342
-rw-r--r--src/osd/windows/winmain.c896
-rw-r--r--src/osd/windows/winmain.cpp446
-rw-r--r--src/osd/windows/winmain.h198
-rw-r--r--src/osd/windows/winmisc.c64
-rw-r--r--src/osd/windows/winopts.cpp157
-rw-r--r--src/osd/windows/winopts.h232
-rw-r--r--src/osd/windows/winprefix.h54
-rw-r--r--src/osd/windows/winsync.c172
-rw-r--r--src/osd/windows/wintime.c159
-rw-r--r--src/osd/windows/winutf8.c259
-rw-r--r--src/osd/windows/winutf8.cpp116
-rw-r--r--src/osd/windows/winutf8.h34
-rw-r--r--src/osd/windows/winutil.c124
-rw-r--r--src/osd/windows/winutil.cpp199
-rw-r--r--src/osd/windows/winutil.h30
-rw-r--r--src/osd/windows/winwork.c795
-rw-r--r--src/tools/castool.cpp225
-rw-r--r--src/tools/chdcd.c397
-rw-r--r--src/tools/chdcd.h28
-rw-r--r--src/tools/chdman.c3185
-rw-r--r--src/tools/chdman.cpp3542
-rwxr-xr-xsrc/tools/discrepancy-fixer.py82
-rwxr-xr-xsrc/tools/discrepancy-spotter.py51
-rw-r--r--src/tools/floptool.cpp1495
-rw-r--r--src/tools/image_handler.cpp409
-rw-r--r--src/tools/image_handler.h119
-rw-r--r--src/tools/imgtool/charconv.cpp107
-rw-r--r--src/tools/imgtool/charconv.h82
-rw-r--r--src/tools/imgtool/filtbas.cpp3122
-rw-r--r--src/tools/imgtool/filteoln.cpp108
-rw-r--r--src/tools/imgtool/filter.cpp79
-rw-r--r--src/tools/imgtool/filter.h65
-rw-r--r--src/tools/imgtool/formats/coco_dsk.cpp1187
-rw-r--r--src/tools/imgtool/formats/coco_dsk.h24
-rw-r--r--src/tools/imgtool/formats/pc_dsk_legacy.cpp140
-rw-r--r--src/tools/imgtool/formats/pc_dsk_legacy.h21
-rw-r--r--src/tools/imgtool/formats/vt_dsk_legacy.cpp58
-rw-r--r--src/tools/imgtool/formats/vt_dsk_legacy.h18
-rw-r--r--src/tools/imgtool/iflopimg.cpp324
-rw-r--r--src/tools/imgtool/iflopimg.h44
-rw-r--r--src/tools/imgtool/imghd.cpp248
-rw-r--r--src/tools/imgtool/imghd.h51
-rw-r--r--src/tools/imgtool/imgterrs.cpp56
-rw-r--r--src/tools/imgtool/imgterrs.h70
-rw-r--r--src/tools/imgtool/imgtool.cpp2267
-rw-r--r--src/tools/imgtool/imgtool.h264
-rw-r--r--src/tools/imgtool/library.cpp314
-rw-r--r--src/tools/imgtool/library.h552
-rw-r--r--src/tools/imgtool/main.cpp963
-rw-r--r--src/tools/imgtool/main.h20
-rw-r--r--src/tools/imgtool/modules.cpp100
-rw-r--r--src/tools/imgtool/modules.h18
-rw-r--r--src/tools/imgtool/modules/amiga.cpp2419
-rw-r--r--src/tools/imgtool/modules/bml3.cpp935
-rw-r--r--src/tools/imgtool/modules/concept.cpp497
-rw-r--r--src/tools/imgtool/modules/cybiko.cpp560
-rw-r--r--src/tools/imgtool/modules/cybikoxt.cpp507
-rw-r--r--src/tools/imgtool/modules/dgndos.cpp1256
-rw-r--r--src/tools/imgtool/modules/fat.cpp2122
-rw-r--r--src/tools/imgtool/modules/fat.h6
-rw-r--r--src/tools/imgtool/modules/hp48.cpp741
-rw-r--r--src/tools/imgtool/modules/hp85_tape.cpp1165
-rw-r--r--src/tools/imgtool/modules/hp9845_tape.cpp1540
-rw-r--r--src/tools/imgtool/modules/os9.cpp1233
-rw-r--r--src/tools/imgtool/modules/pc_flop.cpp176
-rw-r--r--src/tools/imgtool/modules/pc_hard.cpp463
-rw-r--r--src/tools/imgtool/modules/psion.cpp698
-rw-r--r--src/tools/imgtool/modules/rsdos.cpp666
-rw-r--r--src/tools/imgtool/modules/rt11.cpp691
-rw-r--r--src/tools/imgtool/modules/thomson.cpp2073
-rw-r--r--src/tools/imgtool/modules/ti99.cpp5358
-rw-r--r--src/tools/imgtool/modules/ti990hd.cpp1809
-rw-r--r--src/tools/imgtool/modules/vzdos.cpp951
-rw-r--r--src/tools/imgtool/stream.cpp624
-rw-r--r--src/tools/imgtool/stream.h90
-rw-r--r--src/tools/jedutil.c289
-rw-r--r--src/tools/jedutil.cpp8273
-rw-r--r--src/tools/ldresample.c663
-rw-r--r--src/tools/ldresample.cpp576
-rw-r--r--src/tools/ldverify.c762
-rw-r--r--src/tools/ldverify.cpp795
-rw-r--r--src/tools/pngcmp.cpp200
-rw-r--r--src/tools/regrep.c1169
-rw-r--r--src/tools/regrep.cpp1114
-rw-r--r--src/tools/romcmp.c750
-rw-r--r--src/tools/romcmp.cpp778
-rw-r--r--src/tools/runtest.cmd18
-rw-r--r--src/tools/split.c442
-rw-r--r--src/tools/split.cpp438
-rw-r--r--src/tools/src2html.c938
-rw-r--r--src/tools/srcclean.c182
-rw-r--r--src/tools/srcclean.cpp2395
-rw-r--r--src/tools/testkeys.cpp418
-rw-r--r--src/tools/tools.mak152
-rw-r--r--src/tools/unidasm.cpp1726
-rw-r--r--src/version.c13
-rw-r--r--src/zexall/interface.h15
-rw-r--r--src/zexall/main.cpp123
-rw-r--r--src/zexall/zexall.cpp167
-rw-r--r--src/zexall/zexall.h546
-rw-r--r--src/zexall/zexall.z801545
-rw-r--r--tests/LICENSE29
-rw-r--r--tests/README.md5
-rw-r--r--tests/emu/attotime.cpp11
-rw-r--r--tests/emu/video/rgbutil.cpp1036
-rw-r--r--tests/lib/util/corestr.cpp62
-rw-r--r--tests/lib/util/options.cpp9
-rw-r--r--tests/main.cpp2
-rw-r--r--uismall.bdf15190
-rw-r--r--web/LICENSE29
-rw-r--r--web/README.md5
-rw-r--r--web/esqpanel/vfx/FrontPanel.html25
-rw-r--r--web/esqpanel/vfx/FrontPanel.js1209
-rw-r--r--web/layout.xsl231
34780 files changed, 19841711 insertions, 2275845 deletions
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000000..cad4cf931eb
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,13 @@
+root = true
+
+[*]
+charset = utf-8
+indent_size = 4
+indent_style = tab
+insert_final_newline = true
+tab_width = 4
+trim_trailing_whitespace = true
+
+[*.{py,rst}]
+indent_style = space
+tab_width = 8
diff --git a/.gitattributes b/.gitattributes
index 24a4308d5aa..dd60149c998 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,3688 +1,23 @@
* text=auto !eol
-docs/config.txt svneol=native#text/plain
-docs/license.txt svneol=native#text/plain
-docs/mame.txt svneol=native#text/plain
-docs/newvideo.txt svneol=native#text/plain
-docs/windows.txt svneol=native#text/plain
-/makefile svneol=native#text/plain
-src/build/build.mak svneol=native#text/plain
-src/build/file2str.c svneol=native#text/plain
-src/build/png2bdc.c svneol=native#text/plain
-src/build/verinfo.c svneol=native#text/plain
-src/emu/attotime.c svneol=native#text/plain
-src/emu/attotime.h svneol=native#text/plain
-src/emu/audio/generic.c svneol=native#text/plain
-src/emu/audio/generic.h svneol=native#text/plain
-src/emu/audit.c svneol=native#text/plain
-src/emu/audit.h svneol=native#text/plain
-src/emu/cheat.c svneol=native#text/plain
-src/emu/cheat.h svneol=native#text/plain
-src/emu/clifront.c svneol=native#text/plain
-src/emu/clifront.h svneol=native#text/plain
-src/emu/config.c svneol=native#text/plain
-src/emu/config.h svneol=native#text/plain
-src/emu/cpu/adsp2100/2100dasm.c svneol=native#text/plain
-src/emu/cpu/adsp2100/2100ops.c svneol=native#text/plain
-src/emu/cpu/adsp2100/adsp2100.c svneol=native#text/plain
-src/emu/cpu/adsp2100/adsp2100.h svneol=native#text/plain
-src/emu/cpu/alph8201/8201dasm.c svneol=native#text/plain
-src/emu/cpu/alph8201/alph8201.c svneol=native#text/plain
-src/emu/cpu/alph8201/alph8201.h svneol=native#text/plain
-src/emu/cpu/apexc/apexc.c svneol=native#text/plain
-src/emu/cpu/apexc/apexc.h svneol=native#text/plain
-src/emu/cpu/apexc/apexcdsm.c svneol=native#text/plain
-src/emu/cpu/arm/arm.c svneol=native#text/plain
-src/emu/cpu/arm/arm.h svneol=native#text/plain
-src/emu/cpu/arm/armdasm.c svneol=native#text/plain
-src/emu/cpu/arm7/arm7.c svneol=native#text/plain
-src/emu/cpu/arm7/arm7.h svneol=native#text/plain
-src/emu/cpu/arm7/arm7core.c svneol=native#text/plain
-src/emu/cpu/arm7/arm7core.h svneol=native#text/plain
-src/emu/cpu/arm7/arm7dasm.c svneol=native#text/plain
-src/emu/cpu/arm7/arm7exec.c svneol=native#text/plain
-src/emu/cpu/asap/asap.c svneol=native#text/plain
-src/emu/cpu/asap/asap.h svneol=native#text/plain
-src/emu/cpu/asap/asapdasm.c svneol=native#text/plain
-src/emu/cpu/avr8/avr8.c svneol=native#text/plain
-src/emu/cpu/avr8/avr8.h svneol=native#text/plain
-src/emu/cpu/avr8/avr8dasm.c svneol=native#text/plain
-src/emu/cpu/ccpu/ccpu.c svneol=native#text/plain
-src/emu/cpu/ccpu/ccpu.h svneol=native#text/plain
-src/emu/cpu/ccpu/ccpudasm.c svneol=native#text/plain
-src/emu/cpu/cdp1802/1802dasm.c svneol=native#text/plain
-src/emu/cpu/cdp1802/cdp1802.c svneol=native#text/plain
-src/emu/cpu/cdp1802/cdp1802.h svneol=native#text/plain
-src/emu/cpu/cop400/cop400.c svneol=native#text/plain
-src/emu/cpu/cop400/cop400.h svneol=native#text/plain
-src/emu/cpu/cop400/cop400op.c svneol=native#text/plain
-src/emu/cpu/cop400/cop410ds.c svneol=native#text/plain
-src/emu/cpu/cop400/cop420ds.c svneol=native#text/plain
-src/emu/cpu/cop400/cop440ds.c svneol=native#text/plain
-src/emu/cpu/cp1610/1610dasm.c svneol=native#text/plain
-src/emu/cpu/cp1610/cp1610.c svneol=native#text/plain
-src/emu/cpu/cp1610/cp1610.h svneol=native#text/plain
-src/emu/cpu/cpu.mak svneol=native#text/plain
-src/emu/cpu/cubeqcpu/cubeqcpu.c svneol=native#text/plain
-src/emu/cpu/cubeqcpu/cubeqcpu.h svneol=native#text/plain
-src/emu/cpu/drcbec.c svneol=native#text/plain
-src/emu/cpu/drcbeut.c svneol=native#text/plain
-src/emu/cpu/drcbeut.h svneol=native#text/plain
-src/emu/cpu/drcbex64.c svneol=native#text/plain
-src/emu/cpu/drcbex86.c svneol=native#text/plain
-src/emu/cpu/drccache.c svneol=native#text/plain
-src/emu/cpu/drccache.h svneol=native#text/plain
-src/emu/cpu/drcfe.c svneol=native#text/plain
-src/emu/cpu/drcfe.h svneol=native#text/plain
-src/emu/cpu/drcuml.c svneol=native#text/plain
-src/emu/cpu/drcuml.h svneol=native#text/plain
-src/emu/cpu/drcumlsh.h svneol=native#text/plain
-src/emu/cpu/dsp32/dsp32.c svneol=native#text/plain
-src/emu/cpu/dsp32/dsp32.h svneol=native#text/plain
-src/emu/cpu/dsp32/dsp32dis.c svneol=native#text/plain
-src/emu/cpu/dsp32/dsp32ops.c svneol=native#text/plain
-src/emu/cpu/dsp56k/dsp56def.h svneol=native#text/plain
-src/emu/cpu/dsp56k/dsp56dsm.c svneol=native#text/plain
-src/emu/cpu/dsp56k/dsp56k.c svneol=native#text/plain
-src/emu/cpu/dsp56k/dsp56k.h svneol=native#text/plain
-src/emu/cpu/dsp56k/dsp56mem.c svneol=native#text/plain
-src/emu/cpu/dsp56k/dsp56ops.c svneol=native#text/plain
-src/emu/cpu/dsp56k/dsp56pcu.c svneol=native#text/plain
-src/emu/cpu/e132xs/32xsdasm.c svneol=native#text/plain
-src/emu/cpu/e132xs/e132xs.c svneol=native#text/plain
-src/emu/cpu/e132xs/e132xs.h svneol=native#text/plain
-src/emu/cpu/e132xs/e132xsop.c svneol=native#text/plain
-src/emu/cpu/esrip/esrip.c svneol=native#text/plain
-src/emu/cpu/esrip/esrip.h svneol=native#text/plain
-src/emu/cpu/f8/f8.c svneol=native#text/plain
-src/emu/cpu/f8/f8.h svneol=native#text/plain
-src/emu/cpu/f8/f8dasm.c svneol=native#text/plain
-src/emu/cpu/g65816/g65816.c svneol=native#text/plain
-src/emu/cpu/g65816/g65816.h svneol=native#text/plain
-src/emu/cpu/g65816/g65816cm.h svneol=native#text/plain
-src/emu/cpu/g65816/g65816ds.c svneol=native#text/plain
-src/emu/cpu/g65816/g65816ds.h svneol=native#text/plain
-src/emu/cpu/g65816/g65816o0.c svneol=native#text/plain
-src/emu/cpu/g65816/g65816o1.c svneol=native#text/plain
-src/emu/cpu/g65816/g65816o2.c svneol=native#text/plain
-src/emu/cpu/g65816/g65816o3.c svneol=native#text/plain
-src/emu/cpu/g65816/g65816o4.c svneol=native#text/plain
-src/emu/cpu/g65816/g65816op.h svneol=native#text/plain
-src/emu/cpu/h6280/6280dasm.c svneol=native#text/plain
-src/emu/cpu/h6280/h6280.c svneol=native#text/plain
-src/emu/cpu/h6280/h6280.h svneol=native#text/plain
-src/emu/cpu/h6280/h6280ops.h svneol=native#text/plain
-src/emu/cpu/h6280/tblh6280.c svneol=native#text/plain
-src/emu/cpu/h83002/h8.h svneol=native#text/plain
-src/emu/cpu/h83002/h8_16.c svneol=native#text/plain
-src/emu/cpu/h83002/h8_8.c svneol=native#text/plain
-src/emu/cpu/h83002/h8disasm.c svneol=native#text/plain
-src/emu/cpu/h83002/h8ops.h svneol=native#text/plain
-src/emu/cpu/h83002/h8periph.c svneol=native#text/plain
-src/emu/cpu/h83002/h8priv.h svneol=native#text/plain
-src/emu/cpu/hd6309/6309dasm.c svneol=native#text/plain
-src/emu/cpu/hd6309/6309ops.c svneol=native#text/plain
-src/emu/cpu/hd6309/6309tbl.c svneol=native#text/plain
-src/emu/cpu/hd6309/hd6309.c svneol=native#text/plain
-src/emu/cpu/hd6309/hd6309.h svneol=native#text/plain
-src/emu/cpu/i386/cycles.h svneol=native#text/plain
-src/emu/cpu/i386/i386.c svneol=native#text/plain
-src/emu/cpu/i386/i386.h -text svneol=native#text/plain
-src/emu/cpu/i386/i386dasm.c svneol=native#text/plain
-src/emu/cpu/i386/i386op16.c svneol=native#text/plain
-src/emu/cpu/i386/i386op32.c svneol=native#text/plain
-src/emu/cpu/i386/i386ops.c svneol=native#text/plain
-src/emu/cpu/i386/i386ops.h svneol=native#text/plain
-src/emu/cpu/i386/i386priv.h svneol=native#text/plain
-src/emu/cpu/i386/i486ops.c svneol=native#text/plain
-src/emu/cpu/i386/pentops.c svneol=native#text/plain
-src/emu/cpu/i386/x87ops.c svneol=native#text/plain
-src/emu/cpu/i8085/8085dasm.c svneol=native#text/plain
-src/emu/cpu/i8085/i8085.c svneol=native#text/plain
-src/emu/cpu/i8085/i8085.h svneol=native#text/plain
-src/emu/cpu/i8085/i8085cpu.h svneol=native#text/plain
-src/emu/cpu/i8085/i8085daa.h svneol=native#text/plain
-src/emu/cpu/i86/ea.h svneol=native#text/plain
-src/emu/cpu/i86/host.h svneol=native#text/plain
-src/emu/cpu/i86/i286.c svneol=native#text/plain
-src/emu/cpu/i86/i286.h svneol=native#text/plain
-src/emu/cpu/i86/i86.c svneol=native#text/plain
-src/emu/cpu/i86/i86.h -text svneol=native#text/plain
-src/emu/cpu/i86/i86.txt svneol=native#text/plain
-src/emu/cpu/i86/i86mem.c svneol=native#text/plain
-src/emu/cpu/i86/i86mem.h svneol=native#text/plain
-src/emu/cpu/i86/i86priv.h svneol=native#text/plain
-src/emu/cpu/i86/i86time.c svneol=native#text/plain
-src/emu/cpu/i86/instr186.c svneol=native#text/plain
-src/emu/cpu/i86/instr186.h svneol=native#text/plain
-src/emu/cpu/i86/instr286.c svneol=native#text/plain
-src/emu/cpu/i86/instr286.h svneol=native#text/plain
-src/emu/cpu/i86/instr86.c svneol=native#text/plain
-src/emu/cpu/i86/instr86.h svneol=native#text/plain
-src/emu/cpu/i86/modrm.h svneol=native#text/plain
-src/emu/cpu/i86/table186.h svneol=native#text/plain
-src/emu/cpu/i86/table286.h svneol=native#text/plain
-src/emu/cpu/i86/table86.h svneol=native#text/plain
-src/emu/cpu/i860/i860.c svneol=native#text/plain
-src/emu/cpu/i860/i860.h svneol=native#text/plain
-src/emu/cpu/i860/i860dasm.c svneol=native#text/plain
-src/emu/cpu/i860/i860dec.c svneol=native#text/plain
-src/emu/cpu/i860/i860dis.c svneol=native#text/plain
-src/emu/cpu/i960/i960.c svneol=native#text/plain
-src/emu/cpu/i960/i960.h svneol=native#text/plain
-src/emu/cpu/i960/i960dis.c svneol=native#text/plain
-src/emu/cpu/i960/i960dis.h svneol=native#text/plain
-src/emu/cpu/jaguar/jagdasm.c svneol=native#text/plain
-src/emu/cpu/jaguar/jaguar.c svneol=native#text/plain
-src/emu/cpu/jaguar/jaguar.h svneol=native#text/plain
-src/emu/cpu/konami/knmidasm.c svneol=native#text/plain
-src/emu/cpu/konami/konami.c svneol=native#text/plain
-src/emu/cpu/konami/konami.h svneol=native#text/plain
-src/emu/cpu/konami/konamops.c svneol=native#text/plain
-src/emu/cpu/konami/konamtbl.c svneol=native#text/plain
-src/emu/cpu/lh5801/5801dasm.c svneol=native#text/plain
-src/emu/cpu/lh5801/5801tbl.c svneol=native#text/plain
-src/emu/cpu/lh5801/lh5801.c svneol=native#text/plain
-src/emu/cpu/lh5801/lh5801.h svneol=native#text/plain
-src/emu/cpu/lr35902/lr35902.c svneol=native#text/plain
-src/emu/cpu/lr35902/lr35902.h svneol=native#text/plain
-src/emu/cpu/lr35902/lr35902d.c svneol=native#text/plain
-src/emu/cpu/lr35902/opc_cb.h svneol=native#text/plain
-src/emu/cpu/lr35902/opc_main.h svneol=native#text/plain
-src/emu/cpu/m37710/m37710.c svneol=native#text/plain
-src/emu/cpu/m37710/m37710.h svneol=native#text/plain
-src/emu/cpu/m37710/m37710cm.h svneol=native#text/plain
-src/emu/cpu/m37710/m37710o0.c svneol=native#text/plain
-src/emu/cpu/m37710/m37710o1.c svneol=native#text/plain
-src/emu/cpu/m37710/m37710o2.c svneol=native#text/plain
-src/emu/cpu/m37710/m37710o3.c svneol=native#text/plain
-src/emu/cpu/m37710/m37710op.h svneol=native#text/plain
-src/emu/cpu/m37710/m7700ds.c svneol=native#text/plain
-src/emu/cpu/m37710/m7700ds.h svneol=native#text/plain
-src/emu/cpu/m6502/6502dasm.c svneol=native#text/plain
-src/emu/cpu/m6502/ill02.h svneol=native#text/plain
-src/emu/cpu/m6502/m4510.c svneol=native#text/plain
-src/emu/cpu/m6502/m4510.h svneol=native#text/plain
-src/emu/cpu/m6502/m6502.c svneol=native#text/plain
-src/emu/cpu/m6502/m6502.h svneol=native#text/plain
-src/emu/cpu/m6502/m6502.txt svneol=native#text/plain
-src/emu/cpu/m6502/m6509.c svneol=native#text/plain
-src/emu/cpu/m6502/m6509.h svneol=native#text/plain
-src/emu/cpu/m6502/m65ce02.c svneol=native#text/plain
-src/emu/cpu/m6502/m65ce02.h svneol=native#text/plain
-src/emu/cpu/m6502/minc4510.h svneol=native#text/plain
-src/emu/cpu/m6502/mincce02.h svneol=native#text/plain
-src/emu/cpu/m6502/ops02.h svneol=native#text/plain
-src/emu/cpu/m6502/ops09.h svneol=native#text/plain
-src/emu/cpu/m6502/ops4510.h svneol=native#text/plain
-src/emu/cpu/m6502/opsc02.h svneol=native#text/plain
-src/emu/cpu/m6502/opsce02.h svneol=native#text/plain
-src/emu/cpu/m6502/opsn2a03.h svneol=native#text/plain
-src/emu/cpu/m6502/t6502.c svneol=native#text/plain
-src/emu/cpu/m6502/t6509.c svneol=native#text/plain
-src/emu/cpu/m6502/t6510.c svneol=native#text/plain
-src/emu/cpu/m6502/t65c02.c svneol=native#text/plain
-src/emu/cpu/m6502/t65ce02.c svneol=native#text/plain
-src/emu/cpu/m6502/t65sc02.c svneol=native#text/plain
-src/emu/cpu/m6502/tdeco16.c svneol=native#text/plain
-src/emu/cpu/m6502/tn2a03.c svneol=native#text/plain
-src/emu/cpu/m6800/6800dasm.c svneol=native#text/plain
-src/emu/cpu/m6800/6800ops.c svneol=native#text/plain
-src/emu/cpu/m6800/6800tbl.c svneol=native#text/plain
-src/emu/cpu/m6800/m6800.c svneol=native#text/plain
-src/emu/cpu/m6800/m6800.h svneol=native#text/plain
-src/emu/cpu/m68000/m68000.h svneol=native#text/plain
-src/emu/cpu/m68000/m68k_in.c svneol=native#text/plain
-src/emu/cpu/m68000/m68kcpu.c svneol=native#text/plain
-src/emu/cpu/m68000/m68kcpu.h svneol=native#text/plain
-src/emu/cpu/m68000/m68kdasm.c svneol=native#text/plain
-src/emu/cpu/m68000/m68kfpu.c svneol=native#text/plain
-src/emu/cpu/m68000/m68kmake.c svneol=native#text/plain
-src/emu/cpu/m6805/6805dasm.c svneol=native#text/plain
-src/emu/cpu/m6805/6805ops.c svneol=native#text/plain
-src/emu/cpu/m6805/m6805.c svneol=native#text/plain
-src/emu/cpu/m6805/m6805.h svneol=native#text/plain
-src/emu/cpu/m6809/6809dasm.c svneol=native#text/plain
-src/emu/cpu/m6809/6809ops.c svneol=native#text/plain
-src/emu/cpu/m6809/6809tbl.c svneol=native#text/plain
-src/emu/cpu/m6809/m6809.c svneol=native#text/plain
-src/emu/cpu/m6809/m6809.h svneol=native#text/plain
-src/emu/cpu/mb86233/mb86233.c svneol=native#text/plain
-src/emu/cpu/mb86233/mb86233.h svneol=native#text/plain
-src/emu/cpu/mb86233/mb86233d.c svneol=native#text/plain
-src/emu/cpu/mb88xx/mb88dasm.c svneol=native#text/plain
-src/emu/cpu/mb88xx/mb88xx.c svneol=native#text/plain
-src/emu/cpu/mb88xx/mb88xx.h svneol=native#text/plain
-src/emu/cpu/mc68hc11/hc11dasm.c svneol=native#text/plain
-src/emu/cpu/mc68hc11/hc11ops.c svneol=native#text/plain
-src/emu/cpu/mc68hc11/hc11ops.h svneol=native#text/plain
-src/emu/cpu/mc68hc11/mc68hc11.c svneol=native#text/plain
-src/emu/cpu/mc68hc11/mc68hc11.h svneol=native#text/plain
-src/emu/cpu/mcs48/mcs48.c svneol=native#text/plain
-src/emu/cpu/mcs48/mcs48.h svneol=native#text/plain
-src/emu/cpu/mcs48/mcs48dsm.c svneol=native#text/plain
-src/emu/cpu/mcs51/mcs51.c svneol=native#text/plain
-src/emu/cpu/mcs51/mcs51.h svneol=native#text/plain
-src/emu/cpu/mcs51/mcs51dasm.c svneol=native#text/plain
-src/emu/cpu/mcs51/mcs51ops.c svneol=native#text/plain
-src/emu/cpu/minx/minx.c svneol=native#text/plain
-src/emu/cpu/minx/minx.h svneol=native#text/plain
-src/emu/cpu/minx/minxd.c svneol=native#text/plain
-src/emu/cpu/minx/minxfunc.h svneol=native#text/plain
-src/emu/cpu/minx/minxopce.h svneol=native#text/plain
-src/emu/cpu/minx/minxopcf.h svneol=native#text/plain
-src/emu/cpu/minx/minxops.h svneol=native#text/plain
-src/emu/cpu/mips/dismips.c svneol=native#text/plain
-src/emu/cpu/mips/dismips.mak svneol=native#text/plain
-src/emu/cpu/mips/mips3.c svneol=native#text/plain
-src/emu/cpu/mips/mips3.h svneol=native#text/plain
-src/emu/cpu/mips/mips3com.c svneol=native#text/plain
-src/emu/cpu/mips/mips3com.h svneol=native#text/plain
-src/emu/cpu/mips/mips3drc.c svneol=native#text/plain
-src/emu/cpu/mips/mips3dsm.c svneol=native#text/plain
-src/emu/cpu/mips/mips3fe.c svneol=native#text/plain
-src/emu/cpu/mips/mips3fe.h svneol=native#text/plain
-src/emu/cpu/mips/psx.c svneol=native#text/plain
-src/emu/cpu/mips/psx.h svneol=native#text/plain
-src/emu/cpu/mips/psxdasm.c svneol=native#text/plain
-src/emu/cpu/mips/r3000.c svneol=native#text/plain
-src/emu/cpu/mips/r3000.h svneol=native#text/plain
-src/emu/cpu/mips/r3kdasm.c svneol=native#text/plain
-src/emu/cpu/nec/nec.c svneol=native#text/plain
-src/emu/cpu/nec/nec.h svneol=native#text/plain
-src/emu/cpu/nec/necdasm.c svneol=native#text/plain
-src/emu/cpu/nec/necea.h svneol=native#text/plain
-src/emu/cpu/nec/nechost.h svneol=native#text/plain
-src/emu/cpu/nec/necinstr.h svneol=native#text/plain
-src/emu/cpu/nec/necmodrm.h svneol=native#text/plain
-src/emu/cpu/nec/necpriv.h svneol=native#text/plain
-src/emu/cpu/pdp1/pdp1.c svneol=native#text/plain
-src/emu/cpu/pdp1/pdp1.h svneol=native#text/plain
-src/emu/cpu/pdp1/pdp1dasm.c svneol=native#text/plain
-src/emu/cpu/pdp1/tx0.c svneol=native#text/plain
-src/emu/cpu/pdp1/tx0.h svneol=native#text/plain
-src/emu/cpu/pdp1/tx0dasm.c svneol=native#text/plain
-src/emu/cpu/pic16c5x/16c5xdsm.c svneol=native#text/plain
-src/emu/cpu/pic16c5x/dis16c5x.c svneol=native#text/plain
-src/emu/cpu/pic16c5x/pic16c5x.c svneol=native#text/plain
-src/emu/cpu/pic16c5x/pic16c5x.h svneol=native#text/plain
-src/emu/cpu/powerpc/drc_ops.c svneol=native#text/plain
-src/emu/cpu/powerpc/drc_ops.h svneol=native#text/plain
-src/emu/cpu/powerpc/ppc.c svneol=native#text/plain
-src/emu/cpu/powerpc/ppc.h svneol=native#text/plain
-src/emu/cpu/powerpc/ppc403.c svneol=native#text/plain
-src/emu/cpu/powerpc/ppc602.c svneol=native#text/plain
-src/emu/cpu/powerpc/ppc603.c svneol=native#text/plain
-src/emu/cpu/powerpc/ppc_dasm.c svneol=native#text/plain
-src/emu/cpu/powerpc/ppc_mem.c svneol=native#text/plain
-src/emu/cpu/powerpc/ppc_ops.c svneol=native#text/plain
-src/emu/cpu/powerpc/ppc_ops.h svneol=native#text/plain
-src/emu/cpu/powerpc/ppccom.c svneol=native#text/plain
-src/emu/cpu/powerpc/ppccom.h svneol=native#text/plain
-src/emu/cpu/powerpc/ppcdrc.c svneol=native#text/plain
-src/emu/cpu/powerpc/ppcfe.c svneol=native#text/plain
-src/emu/cpu/powerpc/ppcfe.h svneol=native#text/plain
-src/emu/cpu/rsp/rsp.c svneol=native#text/plain
-src/emu/cpu/rsp/rsp.h svneol=native#text/plain
-src/emu/cpu/rsp/rsp_dasm.c svneol=native#text/plain
-src/emu/cpu/s2650/2650dasm.c svneol=native#text/plain
-src/emu/cpu/s2650/s2650.c svneol=native#text/plain
-src/emu/cpu/s2650/s2650.h svneol=native#text/plain
-src/emu/cpu/s2650/s2650cpu.h svneol=native#text/plain
-src/emu/cpu/saturn/satops.c svneol=native#text/plain
-src/emu/cpu/saturn/sattable.c svneol=native#text/plain
-src/emu/cpu/saturn/saturn.c svneol=native#text/plain
-src/emu/cpu/saturn/saturn.h svneol=native#text/plain
-src/emu/cpu/saturn/saturnds.c svneol=native#text/plain
-src/emu/cpu/sc61860/readpc.c svneol=native#text/plain
-src/emu/cpu/sc61860/sc.h svneol=native#text/plain
-src/emu/cpu/sc61860/sc61860.c svneol=native#text/plain
-src/emu/cpu/sc61860/sc61860.h svneol=native#text/plain
-src/emu/cpu/sc61860/scdasm.c svneol=native#text/plain
-src/emu/cpu/sc61860/scops.c svneol=native#text/plain
-src/emu/cpu/sc61860/sctable.c svneol=native#text/plain
-src/emu/cpu/se3208/se3208.c svneol=native#text/plain
-src/emu/cpu/se3208/se3208.h svneol=native#text/plain
-src/emu/cpu/se3208/se3208dis.c svneol=native#text/plain
-src/emu/cpu/sh2/sh2.c svneol=native#text/plain
-src/emu/cpu/sh2/sh2.h svneol=native#text/plain
-src/emu/cpu/sh2/sh2comn.c svneol=native#text/plain
-src/emu/cpu/sh2/sh2comn.h svneol=native#text/plain
-src/emu/cpu/sh2/sh2dasm.c svneol=native#text/plain
-src/emu/cpu/sh2/sh2drc.c svneol=native#text/plain
-src/emu/cpu/sh2/sh2fe.c svneol=native#text/plain
-src/emu/cpu/sh4/sh4.c svneol=native#text/plain
-src/emu/cpu/sh4/sh4.h svneol=native#text/plain
-src/emu/cpu/sh4/sh4comn.c svneol=native#text/plain
-src/emu/cpu/sh4/sh4comn.h svneol=native#text/plain
-src/emu/cpu/sh4/sh4dasm.c svneol=native#text/plain
-src/emu/cpu/sh4/sh4regs.h svneol=native#text/plain
-src/emu/cpu/sharc/compute.c svneol=native#text/plain
-src/emu/cpu/sharc/sharc.c svneol=native#text/plain
-src/emu/cpu/sharc/sharc.h svneol=native#text/plain
-src/emu/cpu/sharc/sharcdma.c svneol=native#text/plain
-src/emu/cpu/sharc/sharcdsm.c svneol=native#text/plain
-src/emu/cpu/sharc/sharcdsm.h svneol=native#text/plain
-src/emu/cpu/sharc/sharcmem.c svneol=native#text/plain
-src/emu/cpu/sharc/sharcops.c svneol=native#text/plain
-src/emu/cpu/sharc/sharcops.h svneol=native#text/plain
-src/emu/cpu/sm8500/sm8500.c svneol=native#text/plain
-src/emu/cpu/sm8500/sm8500.h svneol=native#text/plain
-src/emu/cpu/sm8500/sm8500d.c svneol=native#text/plain
-src/emu/cpu/sm8500/sm85ops.h svneol=native#text/plain
-src/emu/cpu/spc700/spc700.c svneol=native#text/plain
-src/emu/cpu/spc700/spc700.h svneol=native#text/plain
-src/emu/cpu/spc700/spc700ds.c svneol=native#text/plain
-src/emu/cpu/spc700/spc700ds.h svneol=native#text/plain
-src/emu/cpu/ssem/ssem.c svneol=native#text/plain
-src/emu/cpu/ssem/ssem.h svneol=native#text/plain
-src/emu/cpu/ssem/ssemdasm.c svneol=native#text/plain
-src/emu/cpu/ssp1601/ssp1601.c svneol=native#text/plain
-src/emu/cpu/ssp1601/ssp1601.h svneol=native#text/plain
-src/emu/cpu/ssp1601/ssp1601d.c svneol=native#text/plain
-src/emu/cpu/t11/t11.c svneol=native#text/plain
-src/emu/cpu/t11/t11.h svneol=native#text/plain
-src/emu/cpu/t11/t11dasm.c svneol=native#text/plain
-src/emu/cpu/t11/t11ops.c svneol=native#text/plain
-src/emu/cpu/t11/t11table.c svneol=native#text/plain
-src/emu/cpu/tlcs90/tlcs90.c svneol=native#text/plain
-src/emu/cpu/tlcs90/tlcs90.h svneol=native#text/plain
-src/emu/cpu/tlcs900/900tbl.c svneol=native#text/plain
-src/emu/cpu/tlcs900/dasm900.c svneol=native#text/plain
-src/emu/cpu/tlcs900/tlcs900.c svneol=native#text/plain
-src/emu/cpu/tlcs900/tlcs900.h svneol=native#text/plain
-src/emu/cpu/tms0980/tms0980.c svneol=native#text/plain
-src/emu/cpu/tms0980/tms0980.h svneol=native#text/plain
-src/emu/cpu/tms0980/tms0980d.c svneol=native#text/plain
-src/emu/cpu/tms32010/32010dsm.c svneol=native#text/plain
-src/emu/cpu/tms32010/dis32010.c svneol=native#text/plain
-src/emu/cpu/tms32010/tms32010.c svneol=native#text/plain
-src/emu/cpu/tms32010/tms32010.h svneol=native#text/plain
-src/emu/cpu/tms32025/32025dsm.c svneol=native#text/plain
-src/emu/cpu/tms32025/dis32025.c svneol=native#text/plain
-src/emu/cpu/tms32025/tms32025.c svneol=native#text/plain
-src/emu/cpu/tms32025/tms32025.h svneol=native#text/plain
-src/emu/cpu/tms32031/32031ops.c svneol=native#text/plain
-src/emu/cpu/tms32031/dis32031.c svneol=native#text/plain
-src/emu/cpu/tms32031/tms32031.c svneol=native#text/plain
-src/emu/cpu/tms32031/tms32031.h svneol=native#text/plain
-src/emu/cpu/tms32051/32051ops.c svneol=native#text/plain
-src/emu/cpu/tms32051/32051ops.h svneol=native#text/plain
-src/emu/cpu/tms32051/dis32051.c svneol=native#text/plain
-src/emu/cpu/tms32051/tms32051.c svneol=native#text/plain
-src/emu/cpu/tms32051/tms32051.h svneol=native#text/plain
-src/emu/cpu/tms34010/34010dsm.c svneol=native#text/plain
-src/emu/cpu/tms34010/34010fld.c svneol=native#text/plain
-src/emu/cpu/tms34010/34010gfx.c svneol=native#text/plain
-src/emu/cpu/tms34010/34010ops.c svneol=native#text/plain
-src/emu/cpu/tms34010/34010ops.h svneol=native#text/plain
-src/emu/cpu/tms34010/34010tbl.c svneol=native#text/plain
-src/emu/cpu/tms34010/dis34010.c svneol=native#text/plain
-src/emu/cpu/tms34010/makefile svneol=native#text/plain
-src/emu/cpu/tms34010/tms34010.c svneol=native#text/plain
-src/emu/cpu/tms34010/tms34010.h svneol=native#text/plain
-src/emu/cpu/tms57002/tms57002.c svneol=native#text/plain
-src/emu/cpu/tms57002/tms57002.h svneol=native#text/plain
-src/emu/cpu/tms57002/tmsinstr.lst svneol=native#text/plain
-src/emu/cpu/tms57002/tmsmake.c svneol=native#text/plain
-src/emu/cpu/tms7000/7000dasm.c svneol=native#text/plain
-src/emu/cpu/tms7000/tms7000.c svneol=native#text/plain
-src/emu/cpu/tms7000/tms7000.h svneol=native#text/plain
-src/emu/cpu/tms7000/tms70op.c svneol=native#text/plain
-src/emu/cpu/tms7000/tms70tb.c svneol=native#text/plain
-src/emu/cpu/tms9900/9900dasm.c svneol=native#text/plain
-src/emu/cpu/tms9900/99xxcore.h svneol=native#text/plain
-src/emu/cpu/tms9900/99xxstat.h svneol=native#text/plain
-src/emu/cpu/tms9900/ti990_10.c svneol=native#text/plain
-src/emu/cpu/tms9900/tms9900.c svneol=native#text/plain
-src/emu/cpu/tms9900/tms9900.h svneol=native#text/plain
-src/emu/cpu/tms9900/tms9980a.c svneol=native#text/plain
-src/emu/cpu/tms9900/tms9995.c svneol=native#text/plain
-src/emu/cpu/upd7810/7810dasm.c svneol=native#text/plain
-src/emu/cpu/upd7810/7810ops.c svneol=native#text/plain
-src/emu/cpu/upd7810/7810tbl.c svneol=native#text/plain
-src/emu/cpu/upd7810/upd7810.c svneol=native#text/plain
-src/emu/cpu/upd7810/upd7810.h svneol=native#text/plain
-src/emu/cpu/v30mz/nec.h svneol=native#text/plain
-src/emu/cpu/v30mz/necea.h svneol=native#text/plain
-src/emu/cpu/v30mz/nechost.h svneol=native#text/plain
-src/emu/cpu/v30mz/necinstr.h svneol=native#text/plain
-src/emu/cpu/v30mz/necmodrm.h svneol=native#text/plain
-src/emu/cpu/v30mz/v30mz.c svneol=native#text/plain
-src/emu/cpu/v30mz/v30mz.h svneol=native#text/plain
-src/emu/cpu/v60/am.c svneol=native#text/plain
-src/emu/cpu/v60/am1.c svneol=native#text/plain
-src/emu/cpu/v60/am2.c svneol=native#text/plain
-src/emu/cpu/v60/am3.c svneol=native#text/plain
-src/emu/cpu/v60/op12.c svneol=native#text/plain
-src/emu/cpu/v60/op2.c svneol=native#text/plain
-src/emu/cpu/v60/op3.c svneol=native#text/plain
-src/emu/cpu/v60/op4.c svneol=native#text/plain
-src/emu/cpu/v60/op5.c svneol=native#text/plain
-src/emu/cpu/v60/op6.c svneol=native#text/plain
-src/emu/cpu/v60/op7a.c svneol=native#text/plain
-src/emu/cpu/v60/optable.c svneol=native#text/plain
-src/emu/cpu/v60/v60.c svneol=native#text/plain
-src/emu/cpu/v60/v60.h svneol=native#text/plain
-src/emu/cpu/v60/v60d.c svneol=native#text/plain
-src/emu/cpu/v60/v60mem.c svneol=native#text/plain
-src/emu/cpu/v810/v810.c svneol=native#text/plain
-src/emu/cpu/v810/v810.h svneol=native#text/plain
-src/emu/cpu/v810/v810dasm.c svneol=native#text/plain
-src/emu/cpu/vtlb.c svneol=native#text/plain
-src/emu/cpu/vtlb.h svneol=native#text/plain
-src/emu/cpu/x86emit.h svneol=native#text/plain
-src/emu/cpu/x86log.c svneol=native#text/plain
-src/emu/cpu/x86log.h svneol=native#text/plain
-src/emu/cpu/z180/z180.c svneol=native#text/plain
-src/emu/cpu/z180/z180.h svneol=native#text/plain
-src/emu/cpu/z180/z180cb.c svneol=native#text/plain
-src/emu/cpu/z180/z180daa.h svneol=native#text/plain
-src/emu/cpu/z180/z180dasm.c svneol=native#text/plain
-src/emu/cpu/z180/z180dd.c svneol=native#text/plain
-src/emu/cpu/z180/z180ed.c svneol=native#text/plain
-src/emu/cpu/z180/z180fd.c svneol=native#text/plain
-src/emu/cpu/z180/z180op.c svneol=native#text/plain
-src/emu/cpu/z180/z180ops.h svneol=native#text/plain
-src/emu/cpu/z180/z180tbl.h svneol=native#text/plain
-src/emu/cpu/z180/z180xy.c svneol=native#text/plain
-src/emu/cpu/z80/z80.c svneol=native#text/plain
-src/emu/cpu/z80/z80.h svneol=native#text/plain
-src/emu/cpu/z80/z80daisy.c svneol=native#text/plain
-src/emu/cpu/z80/z80daisy.h svneol=native#text/plain
-src/emu/cpu/z80/z80dasm.c svneol=native#text/plain
-src/emu/cpu/z8000/8000dasm.c svneol=native#text/plain
-src/emu/cpu/z8000/makedab.c svneol=native#text/plain
-src/emu/cpu/z8000/z8000.c svneol=native#text/plain
-src/emu/cpu/z8000/z8000.h svneol=native#text/plain
-src/emu/cpu/z8000/z8000cpu.h svneol=native#text/plain
-src/emu/cpu/z8000/z8000dab.h svneol=native#text/plain
-src/emu/cpu/z8000/z8000ops.c svneol=native#text/plain
-src/emu/cpu/z8000/z8000tbl.c svneol=native#text/plain
-src/emu/cpuexec.c svneol=native#text/plain
-src/emu/cpuexec.h svneol=native#text/plain
-src/emu/cpuintrf.h svneol=native#text/plain
-src/emu/crsshair.c svneol=native#text/plain
-src/emu/crsshair.h svneol=native#text/plain
-src/emu/debug/debugcmd.c svneol=native#text/plain
-src/emu/debug/debugcmd.h svneol=native#text/plain
-src/emu/debug/debugcmt.c svneol=native#text/plain
-src/emu/debug/debugcmt.h svneol=native#text/plain
-src/emu/debug/debugcon.c svneol=native#text/plain
-src/emu/debug/debugcon.h svneol=native#text/plain
-src/emu/debug/debugcpu.c svneol=native#text/plain
-src/emu/debug/debugcpu.h svneol=native#text/plain
-src/emu/debug/debughlp.c svneol=native#text/plain
-src/emu/debug/debughlp.h svneol=native#text/plain
-src/emu/debug/debugvw.c svneol=native#text/plain
-src/emu/debug/debugvw.h svneol=native#text/plain
-src/emu/debug/express.c svneol=native#text/plain
-src/emu/debug/express.h svneol=native#text/plain
-src/emu/debug/textbuf.c svneol=native#text/plain
-src/emu/debug/textbuf.h svneol=native#text/plain
-src/emu/debugger.c svneol=native#text/plain
-src/emu/debugger.h svneol=native#text/plain
-src/emu/deprecat.h svneol=native#text/plain
-src/emu/devcb.c svneol=native#text/plain
-src/emu/devcb.h svneol=native#text/plain
-src/emu/devconv.h svneol=native#text/plain
-src/emu/devintrf.c svneol=native#text/plain
-src/emu/devintrf.h svneol=native#text/plain
-src/emu/devtempl.h svneol=native#text/plain
-src/emu/drawgfx.c svneol=native#text/plain
-src/emu/drawgfx.h svneol=native#text/plain
-src/emu/drawgfxm.h svneol=native#text/plain
-src/emu/driver.c svneol=native#text/plain
-src/emu/driver.h svneol=native#text/plain
-src/emu/drivers/empty.c svneol=native#text/plain
-src/emu/drivers/xtal.h svneol=native#text/plain
-src/emu/eigccppc.h svneol=native#text/plain
-src/emu/eigccx86.h svneol=native#text/plain
-src/emu/eminline.h svneol=native#text/plain
-src/emu/emu.mak svneol=native#text/plain
-src/emu/emuopts.c svneol=native#text/plain
-src/emu/emuopts.h svneol=native#text/plain
-src/emu/emupal.c svneol=native#text/plain
-src/emu/emupal.h svneol=native#text/plain
-src/emu/fileio.c svneol=native#text/plain
-src/emu/fileio.h svneol=native#text/plain
-src/emu/hash.c svneol=native#text/plain
-src/emu/hash.h svneol=native#text/plain
-src/emu/info.c svneol=native#text/plain
-src/emu/info.h svneol=native#text/plain
-src/emu/inptport.c svneol=native#text/plain
-src/emu/inptport.h svneol=native#text/plain
-src/emu/inpttype.h svneol=native#text/plain
-src/emu/input.c svneol=native#text/plain
-src/emu/input.h svneol=native#text/plain
-src/emu/inputseq.c svneol=native#text/plain
-src/emu/inputseq.h svneol=native#text/plain
-src/emu/layout/dualhovu.lay svneol=native#text/plain
-src/emu/layout/dualhsxs.lay svneol=native#text/plain
-src/emu/layout/dualhuov.lay svneol=native#text/plain
-src/emu/layout/ho20ffff.lay svneol=native#text/plain
-src/emu/layout/ho2eff2e.lay svneol=native#text/plain
-src/emu/layout/ho4f893d.lay svneol=native#text/plain
-src/emu/layout/ho88ffff.lay svneol=native#text/plain
-src/emu/layout/hoa0a0ff.lay svneol=native#text/plain
-src/emu/layout/hoffe457.lay svneol=native#text/plain
-src/emu/layout/hoffff20.lay svneol=native#text/plain
-src/emu/layout/horizont.lay svneol=native#text/plain
-src/emu/layout/snap.lay svneol=native#text/plain
-src/emu/layout/triphsxs.lay svneol=native#text/plain
-src/emu/layout/vertical.lay svneol=native#text/plain
-src/emu/layout/voffff20.lay svneol=native#text/plain
-src/emu/machine/53c810.c svneol=native#text/plain
-src/emu/machine/53c810.h svneol=native#text/plain
-src/emu/machine/6522via.c svneol=native#text/plain
-src/emu/machine/6522via.h svneol=native#text/plain
-src/emu/machine/6526cia.c svneol=native#text/plain
-src/emu/machine/6526cia.h svneol=native#text/plain
-src/emu/machine/6532riot.c svneol=native#text/plain
-src/emu/machine/6532riot.h svneol=native#text/plain
-src/emu/machine/6821pia.c svneol=native#text/plain
-src/emu/machine/6821pia.h svneol=native#text/plain
-src/emu/machine/6840ptm.c svneol=native#text/plain
-src/emu/machine/6840ptm.h svneol=native#text/plain
-src/emu/machine/6850acia.c svneol=native#text/plain
-src/emu/machine/6850acia.h svneol=native#text/plain
-src/emu/machine/68681.c svneol=native#text/plain
-src/emu/machine/68681.h svneol=native#text/plain
-src/emu/machine/74123.c svneol=native#text/plain
-src/emu/machine/74123.h svneol=native#text/plain
-src/emu/machine/74148.c svneol=native#text/plain
-src/emu/machine/74148.h svneol=native#text/plain
-src/emu/machine/74153.c svneol=native#text/plain
-src/emu/machine/74153.h svneol=native#text/plain
-src/emu/machine/74181.c svneol=native#text/plain
-src/emu/machine/74181.h svneol=native#text/plain
-src/emu/machine/7474.c svneol=native#text/plain
-src/emu/machine/7474.h svneol=native#text/plain
-src/emu/machine/8042kbdc.c svneol=native#text/plain
-src/emu/machine/8042kbdc.h svneol=native#text/plain
-src/emu/machine/8237dma.c svneol=native#text/plain
-src/emu/machine/8237dma.h svneol=native#text/plain
-src/emu/machine/8255ppi.c svneol=native#text/plain
-src/emu/machine/8255ppi.h svneol=native#text/plain
-src/emu/machine/8257dma.c svneol=native#text/plain
-src/emu/machine/8257dma.h svneol=native#text/plain
-src/emu/machine/adc083x.c svneol=native#text/plain
-src/emu/machine/adc083x.h svneol=native#text/plain
-src/emu/machine/adc1213x.c svneol=native#text/plain
-src/emu/machine/adc1213x.h svneol=native#text/plain
-src/emu/machine/am53cf96.c svneol=native#text/plain
-src/emu/machine/am53cf96.h svneol=native#text/plain
-src/emu/machine/at28c16.c svneol=native#text/plain
-src/emu/machine/at28c16.h svneol=native#text/plain
-src/emu/machine/cdp1852.c svneol=native#text/plain
-src/emu/machine/cdp1852.h svneol=native#text/plain
-src/emu/machine/cr589.c svneol=native#text/plain
-src/emu/machine/cr589.h svneol=native#text/plain
-src/emu/machine/ds1302.c svneol=native#text/plain
-src/emu/machine/ds1302.h svneol=native#text/plain
-src/emu/machine/ds2401.c svneol=native#text/plain
-src/emu/machine/ds2401.h svneol=native#text/plain
-src/emu/machine/ds2404.c svneol=native#text/plain
-src/emu/machine/ds2404.h svneol=native#text/plain
-src/emu/machine/eeprom.c svneol=native#text/plain
-src/emu/machine/eeprom.h svneol=native#text/plain
-src/emu/machine/eepromdev.c svneol=native#text/plain
-src/emu/machine/eepromdev.h svneol=native#text/plain
-src/emu/machine/f3853.c svneol=native#text/plain
-src/emu/machine/f3853.h svneol=native#text/plain
-src/emu/machine/generic.c svneol=native#text/plain
-src/emu/machine/generic.h svneol=native#text/plain
-src/emu/machine/i2cmem.c svneol=native#text/plain
-src/emu/machine/i2cmem.h svneol=native#text/plain
-src/emu/machine/i2cmemdev.c svneol=native#text/plain
-src/emu/machine/i2cmemdev.h svneol=native#text/plain
-src/emu/machine/i8243.c svneol=native#text/plain
-src/emu/machine/i8243.h svneol=native#text/plain
-src/emu/machine/i8255a.c svneol=native#text/plain
-src/emu/machine/i8255a.h svneol=native#text/plain
-src/emu/machine/idectrl.c svneol=native#text/plain
-src/emu/machine/idectrl.h svneol=native#text/plain
-src/emu/machine/intelfsh.c svneol=native#text/plain
-src/emu/machine/intelfsh.h svneol=native#text/plain
-src/emu/machine/laserdsc.h svneol=native#text/plain
-src/emu/machine/latch8.c svneol=native#text/plain
-src/emu/machine/latch8.h svneol=native#text/plain
-src/emu/machine/ldcore.c svneol=native#text/plain
-src/emu/machine/ldcore.h svneol=native#text/plain
-src/emu/machine/ldpr8210.c svneol=native#text/plain
-src/emu/machine/ldv1000.c svneol=native#text/plain
-src/emu/machine/ldvp931.c svneol=native#text/plain
-src/emu/machine/mb3773.c svneol=native#text/plain
-src/emu/machine/mb3773.h svneol=native#text/plain
-src/emu/machine/mb87078.c svneol=native#text/plain
-src/emu/machine/mb87078.h svneol=native#text/plain
-src/emu/machine/mc146818.c svneol=native#text/plain
-src/emu/machine/mc146818.h svneol=native#text/plain
-src/emu/machine/microtch.c svneol=native#text/plain
-src/emu/machine/microtch.h svneol=native#text/plain
-src/emu/machine/msm6242.c svneol=native#text/plain
-src/emu/machine/msm6242.h svneol=native#text/plain
-src/emu/machine/pc16552d.c svneol=native#text/plain
-src/emu/machine/pc16552d.h svneol=native#text/plain
-src/emu/machine/pci.c svneol=native#text/plain
-src/emu/machine/pci.h svneol=native#text/plain
-src/emu/machine/pckeybrd.h svneol=native#text/plain
-src/emu/machine/pcshare.h svneol=native#text/plain
-src/emu/machine/pd4990a.c svneol=native#text/plain
-src/emu/machine/pd4990a.h svneol=native#text/plain
-src/emu/machine/pic8259.c svneol=native#text/plain
-src/emu/machine/pic8259.h svneol=native#text/plain
-src/emu/machine/pit8253.c svneol=native#text/plain
-src/emu/machine/pit8253.h svneol=native#text/plain
-src/emu/machine/rescap.h svneol=native#text/plain
-src/emu/machine/roc10937.c svneol=native#text/plain
-src/emu/machine/roc10937.h svneol=native#text/plain
-src/emu/machine/rp5h01.c svneol=native#text/plain
-src/emu/machine/rp5h01.h svneol=native#text/plain
-src/emu/machine/rtc65271.c svneol=native#text/plain
-src/emu/machine/rtc65271.h svneol=native#text/plain
-src/emu/machine/scsi.c svneol=native#text/plain
-src/emu/machine/scsi.h svneol=native#text/plain
-src/emu/machine/scsicd.c svneol=native#text/plain
-src/emu/machine/scsicd.h svneol=native#text/plain
-src/emu/machine/scsidev.c svneol=native#text/plain
-src/emu/machine/scsidev.h svneol=native#text/plain
-src/emu/machine/scsihd.c svneol=native#text/plain
-src/emu/machine/scsihd.h svneol=native#text/plain
-src/emu/machine/smc91c9x.c svneol=native#text/plain
-src/emu/machine/smc91c9x.h svneol=native#text/plain
-src/emu/machine/timekpr.c svneol=native#text/plain
-src/emu/machine/timekpr.h svneol=native#text/plain
-src/emu/machine/tmp68301.c svneol=native#text/plain
-src/emu/machine/tmp68301.h svneol=native#text/plain
-src/emu/machine/upd4701.c svneol=native#text/plain
-src/emu/machine/upd4701.h svneol=native#text/plain
-src/emu/machine/wd33c93.c svneol=native#text/plain
-src/emu/machine/wd33c93.h svneol=native#text/plain
-src/emu/machine/x2212.c svneol=native#text/plain
-src/emu/machine/x2212.h svneol=native#text/plain
-src/emu/machine/x76f041.c svneol=native#text/plain
-src/emu/machine/x76f041.h svneol=native#text/plain
-src/emu/machine/x76f100.c svneol=native#text/plain
-src/emu/machine/x76f100.h svneol=native#text/plain
-src/emu/machine/z80ctc.c svneol=native#text/plain
-src/emu/machine/z80ctc.h svneol=native#text/plain
-src/emu/machine/z80dma.c svneol=native#text/plain
-src/emu/machine/z80dma.h svneol=native#text/plain
-src/emu/machine/z80pio.c svneol=native#text/plain
-src/emu/machine/z80pio.h svneol=native#text/plain
-src/emu/machine/z80sio.c svneol=native#text/plain
-src/emu/machine/z80sio.h svneol=native#text/plain
-src/emu/mame.c svneol=native#text/plain
-src/emu/mame.h svneol=native#text/plain
-src/emu/mamecore.c svneol=native#text/plain
-src/emu/mamecore.h svneol=native#text/plain
-src/emu/mconfig.c svneol=native#text/plain
-src/emu/mconfig.h svneol=native#text/plain
-src/emu/memconv.h svneol=native#text/plain
-src/emu/memory.c svneol=native#text/plain
-src/emu/memory.h svneol=native#text/plain
-src/emu/output.c svneol=native#text/plain
-src/emu/output.h svneol=native#text/plain
-src/emu/profiler.c svneol=native#text/plain
-src/emu/profiler.h svneol=native#text/plain
-src/emu/render.c svneol=native#text/plain
-src/emu/render.h svneol=native#text/plain
-src/emu/rendersw.c svneol=native#text/plain
-src/emu/rendfont.c svneol=native#text/plain
-src/emu/rendfont.h svneol=native#text/plain
-src/emu/rendlay.c svneol=native#text/plain
-src/emu/rendlay.h svneol=native#text/plain
-src/emu/rendutil.c svneol=native#text/plain
-src/emu/rendutil.h svneol=native#text/plain
-src/emu/restrack.c svneol=native#text/plain
-src/emu/restrack.h svneol=native#text/plain
-src/emu/romload.c svneol=native#text/plain
-src/emu/romload.h svneol=native#text/plain
-src/emu/sndintrf.h svneol=native#text/plain
-src/emu/sound.c svneol=native#text/plain
-src/emu/sound.h svneol=native#text/plain
-src/emu/sound/2151intf.c svneol=native#text/plain
-src/emu/sound/2151intf.h svneol=native#text/plain
-src/emu/sound/2203intf.c svneol=native#text/plain
-src/emu/sound/2203intf.h svneol=native#text/plain
-src/emu/sound/2413intf.c svneol=native#text/plain
-src/emu/sound/2413intf.h svneol=native#text/plain
-src/emu/sound/2608intf.c svneol=native#text/plain
-src/emu/sound/2608intf.h svneol=native#text/plain
-src/emu/sound/2610intf.c svneol=native#text/plain
-src/emu/sound/2610intf.h svneol=native#text/plain
-src/emu/sound/2612intf.c svneol=native#text/plain
-src/emu/sound/2612intf.h svneol=native#text/plain
-src/emu/sound/262intf.c svneol=native#text/plain
-src/emu/sound/262intf.h svneol=native#text/plain
-src/emu/sound/3526intf.c svneol=native#text/plain
-src/emu/sound/3526intf.h svneol=native#text/plain
-src/emu/sound/3812intf.c svneol=native#text/plain
-src/emu/sound/3812intf.h svneol=native#text/plain
-src/emu/sound/5110intf.c svneol=native#text/plain
-src/emu/sound/5110intf.h svneol=native#text/plain
-src/emu/sound/5220intf.c svneol=native#text/plain
-src/emu/sound/5220intf.h svneol=native#text/plain
-src/emu/sound/8950intf.c svneol=native#text/plain
-src/emu/sound/8950intf.h svneol=native#text/plain
-src/emu/sound/aica.c svneol=native#text/plain
-src/emu/sound/aica.h svneol=native#text/plain
-src/emu/sound/aicadsp.c svneol=native#text/plain
-src/emu/sound/aicadsp.h svneol=native#text/plain
-src/emu/sound/aicalfo.c svneol=native#text/plain
-src/emu/sound/astrocde.c svneol=native#text/plain
-src/emu/sound/astrocde.h svneol=native#text/plain
-src/emu/sound/ay8910.c svneol=native#text/plain
-src/emu/sound/ay8910.h svneol=native#text/plain
-src/emu/sound/beep.c svneol=native#text/plain
-src/emu/sound/beep.h svneol=native#text/plain
-src/emu/sound/bsmt2000.c svneol=native#text/plain
-src/emu/sound/bsmt2000.h svneol=native#text/plain
-src/emu/sound/c140.c svneol=native#text/plain
-src/emu/sound/c140.h svneol=native#text/plain
-src/emu/sound/c352.c svneol=native#text/plain
-src/emu/sound/c352.h svneol=native#text/plain
-src/emu/sound/c6280.c svneol=native#text/plain
-src/emu/sound/c6280.h svneol=native#text/plain
-src/emu/sound/cdda.c svneol=native#text/plain
-src/emu/sound/cdda.h svneol=native#text/plain
-src/emu/sound/cdp1869.c svneol=native#text/plain
-src/emu/sound/cdp1869.h svneol=native#text/plain
-src/emu/sound/cem3394.c svneol=native#text/plain
-src/emu/sound/cem3394.h svneol=native#text/plain
-src/emu/sound/dac.c svneol=native#text/plain
-src/emu/sound/dac.h svneol=native#text/plain
-src/emu/sound/digitalk.c svneol=native#text/plain
-src/emu/sound/digitalk.h svneol=native#text/plain
-src/emu/sound/disc_dev.c svneol=native#text/plain
-src/emu/sound/disc_flt.c svneol=native#text/plain
-src/emu/sound/disc_inp.c svneol=native#text/plain
-src/emu/sound/disc_mth.c svneol=native#text/plain
-src/emu/sound/disc_wav.c svneol=native#text/plain
-src/emu/sound/discrete.c svneol=native#text/plain
-src/emu/sound/discrete.h svneol=native#text/plain
-src/emu/sound/dmadac.c svneol=native#text/plain
-src/emu/sound/dmadac.h svneol=native#text/plain
-src/emu/sound/es5503.c svneol=native#text/plain
-src/emu/sound/es5503.h svneol=native#text/plain
-src/emu/sound/es5506.c svneol=native#text/plain
-src/emu/sound/es5506.h svneol=native#text/plain
-src/emu/sound/es8712.c svneol=native#text/plain
-src/emu/sound/es8712.h svneol=native#text/plain
-src/emu/sound/filter.c svneol=native#text/plain
-src/emu/sound/filter.h svneol=native#text/plain
-src/emu/sound/flt_rc.c svneol=native#text/plain
-src/emu/sound/flt_rc.h svneol=native#text/plain
-src/emu/sound/flt_vol.c svneol=native#text/plain
-src/emu/sound/flt_vol.h svneol=native#text/plain
-src/emu/sound/fm.c svneol=native#text/plain
-src/emu/sound/fm.h svneol=native#text/plain
-src/emu/sound/fmopl.c svneol=native#text/plain
-src/emu/sound/fmopl.h svneol=native#text/plain
-src/emu/sound/gaelco.c svneol=native#text/plain
-src/emu/sound/gaelco.h svneol=native#text/plain
-src/emu/sound/hc55516.c svneol=native#text/plain
-src/emu/sound/hc55516.h svneol=native#text/plain
-src/emu/sound/ics2115.c svneol=native#text/plain
-src/emu/sound/ics2115.h svneol=native#text/plain
-src/emu/sound/iremga20.c svneol=native#text/plain
-src/emu/sound/iremga20.h svneol=native#text/plain
-src/emu/sound/k005289.c svneol=native#text/plain
-src/emu/sound/k005289.h svneol=native#text/plain
-src/emu/sound/k007232.c svneol=native#text/plain
-src/emu/sound/k007232.h svneol=native#text/plain
-src/emu/sound/k051649.c svneol=native#text/plain
-src/emu/sound/k051649.h svneol=native#text/plain
-src/emu/sound/k053260.c svneol=native#text/plain
-src/emu/sound/k053260.h svneol=native#text/plain
-src/emu/sound/k054539.c svneol=native#text/plain
-src/emu/sound/k054539.h svneol=native#text/plain
-src/emu/sound/msm5205.c svneol=native#text/plain
-src/emu/sound/msm5205.h svneol=native#text/plain
-src/emu/sound/msm5232.c svneol=native#text/plain
-src/emu/sound/msm5232.h svneol=native#text/plain
-src/emu/sound/multipcm.c svneol=native#text/plain
-src/emu/sound/multipcm.h svneol=native#text/plain
-src/emu/sound/n63701x.c svneol=native#text/plain
-src/emu/sound/n63701x.h svneol=native#text/plain
-src/emu/sound/namco.c svneol=native#text/plain
-src/emu/sound/namco.h svneol=native#text/plain
-src/emu/sound/nes_apu.c svneol=native#text/plain
-src/emu/sound/nes_apu.h svneol=native#text/plain
-src/emu/sound/nes_defs.h svneol=native#text/plain
-src/emu/sound/nile.c svneol=native#text/plain
-src/emu/sound/nile.h svneol=native#text/plain
-src/emu/sound/okim6258.c svneol=native#text/plain
-src/emu/sound/okim6258.h svneol=native#text/plain
-src/emu/sound/okim6295.c svneol=native#text/plain
-src/emu/sound/okim6295.h svneol=native#text/plain
-src/emu/sound/okim6376.c svneol=native#text/plain
-src/emu/sound/okim6376.h svneol=native#text/plain
-src/emu/sound/pokey.c svneol=native#text/plain
-src/emu/sound/pokey.h svneol=native#text/plain
-src/emu/sound/pokey.txt svneol=native#text/plain
-src/emu/sound/psx.c svneol=native#text/plain
-src/emu/sound/psx.h svneol=native#text/plain
-src/emu/sound/qsound.c svneol=native#text/plain
-src/emu/sound/qsound.h svneol=native#text/plain
-src/emu/sound/rf5c400.c svneol=native#text/plain
-src/emu/sound/rf5c400.h svneol=native#text/plain
-src/emu/sound/rf5c68.c svneol=native#text/plain
-src/emu/sound/rf5c68.h svneol=native#text/plain
-src/emu/sound/s14001a.c svneol=native#text/plain
-src/emu/sound/s14001a.h svneol=native#text/plain
-src/emu/sound/saa1099.c svneol=native#text/plain
-src/emu/sound/saa1099.h svneol=native#text/plain
-src/emu/sound/samples.c svneol=native#text/plain
-src/emu/sound/samples.h svneol=native#text/plain
-src/emu/sound/scsp.c svneol=native#text/plain
-src/emu/sound/scsp.h svneol=native#text/plain
-src/emu/sound/scspdsp.c svneol=native#text/plain
-src/emu/sound/scspdsp.h svneol=native#text/plain
-src/emu/sound/scsplfo.c svneol=native#text/plain
-src/emu/sound/segapcm.c svneol=native#text/plain
-src/emu/sound/segapcm.h svneol=native#text/plain
-src/emu/sound/sid.c svneol=native#text/plain
-src/emu/sound/sid.h svneol=native#text/plain
-src/emu/sound/sid6581.c svneol=native#text/plain
-src/emu/sound/sid6581.h svneol=native#text/plain
-src/emu/sound/side6581.h svneol=native#text/plain
-src/emu/sound/sidenvel.c svneol=native#text/plain
-src/emu/sound/sidenvel.h svneol=native#text/plain
-src/emu/sound/sidvoice.c svneol=native#text/plain
-src/emu/sound/sidvoice.h svneol=native#text/plain
-src/emu/sound/sidw6581.h svneol=native#text/plain
-src/emu/sound/sidw8580.h svneol=native#text/plain
-src/emu/sound/sn76477.c svneol=native#text/plain
-src/emu/sound/sn76477.h svneol=native#text/plain
-src/emu/sound/sn76496.c svneol=native#text/plain
-src/emu/sound/sn76496.h svneol=native#text/plain
-src/emu/sound/snkwave.c svneol=native#text/plain
-src/emu/sound/snkwave.h svneol=native#text/plain
-src/emu/sound/sound.mak svneol=native#text/plain
-src/emu/sound/sp0250.c svneol=native#text/plain
-src/emu/sound/sp0250.h svneol=native#text/plain
-src/emu/sound/sp0256.c svneol=native#text/plain
-src/emu/sound/sp0256.h svneol=native#text/plain
-src/emu/sound/speaker.c svneol=native#text/plain
-src/emu/sound/speaker.h svneol=native#text/plain
-src/emu/sound/st0016.c svneol=native#text/plain
-src/emu/sound/st0016.h svneol=native#text/plain
-src/emu/sound/t6w28.c svneol=native#text/plain
-src/emu/sound/t6w28.h svneol=native#text/plain
-src/emu/sound/tiaintf.c svneol=native#text/plain
-src/emu/sound/tiaintf.h svneol=native#text/plain
-src/emu/sound/tiasound.c svneol=native#text/plain
-src/emu/sound/tiasound.h svneol=native#text/plain
-src/emu/sound/tms3615.c svneol=native#text/plain
-src/emu/sound/tms3615.h svneol=native#text/plain
-src/emu/sound/tms36xx.c svneol=native#text/plain
-src/emu/sound/tms36xx.h svneol=native#text/plain
-src/emu/sound/tms5110.c svneol=native#text/plain
-src/emu/sound/tms5110.h svneol=native#text/plain
-src/emu/sound/tms5110r.c svneol=native#text/plain
-src/emu/sound/tms5220.c svneol=native#text/plain
-src/emu/sound/tms5220.h svneol=native#text/plain
-src/emu/sound/tms5220.txt svneol=native#text/plain
-src/emu/sound/tms5220r.c svneol=native#text/plain
-src/emu/sound/upd7759.c svneol=native#text/plain
-src/emu/sound/upd7759.h svneol=native#text/plain
-src/emu/sound/vlm5030.c svneol=native#text/plain
-src/emu/sound/vlm5030.h svneol=native#text/plain
-src/emu/sound/votrax.c svneol=native#text/plain
-src/emu/sound/votrax.h svneol=native#text/plain
-src/emu/sound/vrender0.c svneol=native#text/plain
-src/emu/sound/vrender0.h svneol=native#text/plain
-src/emu/sound/wave.c svneol=native#text/plain
-src/emu/sound/wave.h svneol=native#text/plain
-src/emu/sound/wavwrite.c svneol=native#text/plain
-src/emu/sound/wavwrite.h svneol=native#text/plain
-src/emu/sound/x1_010.c svneol=native#text/plain
-src/emu/sound/x1_010.h svneol=native#text/plain
-src/emu/sound/ym2151.c svneol=native#text/plain
-src/emu/sound/ym2151.h svneol=native#text/plain
-src/emu/sound/ym2151.txt svneol=native#text/plain
-src/emu/sound/ym2413.c svneol=native#text/plain
-src/emu/sound/ym2413.h svneol=native#text/plain
-src/emu/sound/ymdeltat.c svneol=native#text/plain
-src/emu/sound/ymdeltat.h svneol=native#text/plain
-src/emu/sound/ymf262.c svneol=native#text/plain
-src/emu/sound/ymf262.h svneol=native#text/plain
-src/emu/sound/ymf271.c svneol=native#text/plain
-src/emu/sound/ymf271.h svneol=native#text/plain
-src/emu/sound/ymf278b.c svneol=native#text/plain
-src/emu/sound/ymf278b.h svneol=native#text/plain
-src/emu/sound/ymz280b.c svneol=native#text/plain
-src/emu/sound/ymz280b.h svneol=native#text/plain
-src/emu/state.c svneol=native#text/plain
-src/emu/state.h svneol=native#text/plain
-src/emu/streams.c svneol=native#text/plain
-src/emu/streams.h svneol=native#text/plain
-src/emu/tilemap.c svneol=native#text/plain
-src/emu/tilemap.h svneol=native#text/plain
-src/emu/timer.c svneol=native#text/plain
-src/emu/timer.h svneol=native#text/plain
-src/emu/tokenize.h svneol=native#text/plain
-src/emu/ui.c svneol=native#text/plain
-src/emu/ui.h svneol=native#text/plain
-src/emu/uigfx.c svneol=native#text/plain
-src/emu/uigfx.h svneol=native#text/plain
-src/emu/uiinput.c svneol=native#text/plain
-src/emu/uiinput.h svneol=native#text/plain
-src/emu/uimenu.c svneol=native#text/plain
-src/emu/uimenu.h svneol=native#text/plain
-src/emu/uismall.png -text svneol=unset#image/png
-src/emu/validity.c svneol=native#text/plain
-src/emu/video.c svneol=native#text/plain
-src/emu/video.h svneol=native#text/plain
-src/emu/video/generic.c svneol=native#text/plain
-src/emu/video/generic.h svneol=native#text/plain
-src/emu/video/mc6845.c svneol=native#text/plain
-src/emu/video/mc6845.h svneol=native#text/plain
-src/emu/video/poly.c svneol=native#text/plain
-src/emu/video/poly.h svneol=native#text/plain
-src/emu/video/resnet.c svneol=native#text/plain
-src/emu/video/resnet.h svneol=native#text/plain
-src/emu/video/rgbgen.h svneol=native#text/plain
-src/emu/video/rgbsse.h svneol=native#text/plain
-src/emu/video/rgbutil.c svneol=native#text/plain
-src/emu/video/rgbutil.h svneol=native#text/plain
-src/emu/video/rgbvmx.h svneol=native#text/plain
-src/emu/video/s2636.c svneol=native#text/plain
-src/emu/video/s2636.h svneol=native#text/plain
-src/emu/video/tlc34076.c svneol=native#text/plain
-src/emu/video/tlc34076.h svneol=native#text/plain
-src/emu/video/tms34061.c svneol=native#text/plain
-src/emu/video/tms34061.h svneol=native#text/plain
-src/emu/video/tms9927.c svneol=native#text/plain
-src/emu/video/tms9927.h svneol=native#text/plain
-src/emu/video/tms9928a.c svneol=native#text/plain
-src/emu/video/tms9928a.h svneol=native#text/plain
-src/emu/video/v9938.c svneol=native#text/plain
-src/emu/video/v9938.h svneol=native#text/plain
-src/emu/video/v9938mod.c svneol=native#text/plain
-src/emu/video/vector.c svneol=native#text/plain
-src/emu/video/vector.h svneol=native#text/plain
-src/emu/video/vooddefs.h svneol=native#text/plain
-src/emu/video/voodoo.c svneol=native#text/plain
-src/emu/video/voodoo.h svneol=native#text/plain
-src/emu/watchdog.c svneol=native#text/plain
-src/emu/watchdog.h svneol=native#text/plain
-src/ldplayer/layout/pr8210.lay svneol=native#text/plain
-src/ldplayer/ldpdriv.c svneol=native#text/plain
-src/ldplayer/ldplayer.c svneol=native#text/plain
-src/ldplayer/ldplayer.mak svneol=native#text/plain
-src/lib/expat/ascii.h svneol=native#text/plain
-src/lib/expat/asciitab.h svneol=native#text/plain
-src/lib/expat/expat.h svneol=native#text/plain
-src/lib/expat/expat_external.h svneol=native#text/plain
-src/lib/expat/iasciitab.h svneol=native#text/plain
-src/lib/expat/intconfig.h svneol=native#text/plain
-src/lib/expat/internal.h svneol=native#text/plain
-src/lib/expat/latin1tab.h svneol=native#text/plain
-src/lib/expat/nametab.h svneol=native#text/plain
-src/lib/expat/utf8tab.h svneol=native#text/plain
-src/lib/expat/xmlparse.c svneol=native#text/plain
-src/lib/expat/xmlrole.c svneol=native#text/plain
-src/lib/expat/xmlrole.h svneol=native#text/plain
-src/lib/expat/xmltok.c svneol=native#text/plain
-src/lib/expat/xmltok.h svneol=native#text/plain
-src/lib/expat/xmltok_impl.c svneol=native#text/plain
-src/lib/expat/xmltok_impl.h svneol=native#text/plain
-src/lib/expat/xmltok_ns.c svneol=native#text/plain
-src/lib/lib.mak svneol=native#text/plain
-src/lib/util/astring.c svneol=native#text/plain
-src/lib/util/astring.h svneol=native#text/plain
-src/lib/util/avcomp.c svneol=native#text/plain
-src/lib/util/avcomp.h svneol=native#text/plain
-src/lib/util/aviio.c svneol=native#text/plain
-src/lib/util/aviio.h svneol=native#text/plain
-src/lib/util/bitmap.c svneol=native#text/plain
-src/lib/util/bitmap.h svneol=native#text/plain
-src/lib/util/cdrom.c svneol=native#text/plain
-src/lib/util/cdrom.h svneol=native#text/plain
-src/lib/util/chd.c svneol=native#text/plain
-src/lib/util/chd.h svneol=native#text/plain
-src/lib/util/corefile.c svneol=native#text/plain
-src/lib/util/corefile.h svneol=native#text/plain
-src/lib/util/corestr.c svneol=native#text/plain
-src/lib/util/corestr.h svneol=native#text/plain
-src/lib/util/coreutil.c svneol=native#text/plain
-src/lib/util/coreutil.h svneol=native#text/plain
-src/lib/util/harddisk.c svneol=native#text/plain
-src/lib/util/harddisk.h svneol=native#text/plain
-src/lib/util/huffman.c svneol=native#text/plain
-src/lib/util/huffman.h svneol=native#text/plain
-src/lib/util/jedparse.c svneol=native#text/plain
-src/lib/util/jedparse.h svneol=native#text/plain
-src/lib/util/md5.c svneol=native#text/plain
-src/lib/util/md5.h svneol=native#text/plain
-src/lib/util/options.c svneol=native#text/plain
-src/lib/util/options.h svneol=native#text/plain
-src/lib/util/palette.c svneol=native#text/plain
-src/lib/util/palette.h svneol=native#text/plain
-src/lib/util/png.c svneol=native#text/plain
-src/lib/util/png.h svneol=native#text/plain
-src/lib/util/pool.c svneol=native#text/plain
-src/lib/util/pool.h svneol=native#text/plain
-src/lib/util/sha1.c svneol=native#text/plain
-src/lib/util/sha1.h svneol=native#text/plain
-src/lib/util/unicode.c svneol=native#text/plain
-src/lib/util/unicode.h svneol=native#text/plain
-src/lib/util/unzip.c svneol=native#text/plain
-src/lib/util/unzip.h svneol=native#text/plain
-src/lib/util/vbiparse.c svneol=native#text/plain
-src/lib/util/vbiparse.h svneol=native#text/plain
-src/lib/util/xmlfile.c svneol=native#text/plain
-src/lib/util/xmlfile.h svneol=native#text/plain
-src/lib/zlib/Makefile svneol=native#text/plain
-src/lib/zlib/Makefile.in svneol=native#text/plain
-src/lib/zlib/adler32.c svneol=native#text/plain
-src/lib/zlib/compress.c svneol=native#text/plain
-src/lib/zlib/crc32.c svneol=native#text/plain
-src/lib/zlib/crc32.h svneol=native#text/plain
-src/lib/zlib/deflate.c svneol=native#text/plain
-src/lib/zlib/deflate.h svneol=native#text/plain
-src/lib/zlib/example.c svneol=native#text/plain
-src/lib/zlib/gzio.c svneol=native#text/plain
-src/lib/zlib/infback.c svneol=native#text/plain
-src/lib/zlib/inffast.c svneol=native#text/plain
-src/lib/zlib/inffast.h svneol=native#text/plain
-src/lib/zlib/inffixed.h svneol=native#text/plain
-src/lib/zlib/inflate.c svneol=native#text/plain
-src/lib/zlib/inflate.h svneol=native#text/plain
-src/lib/zlib/inftrees.c svneol=native#text/plain
-src/lib/zlib/inftrees.h svneol=native#text/plain
-src/lib/zlib/minigzip.c svneol=native#text/plain
-src/lib/zlib/readme svneol=native#text/plain
-src/lib/zlib/trees.c svneol=native#text/plain
-src/lib/zlib/trees.h svneol=native#text/plain
-src/lib/zlib/uncompr.c svneol=native#text/plain
-src/lib/zlib/zconf.h svneol=native#text/plain
-src/lib/zlib/zconf.in.h svneol=native#text/plain
-src/lib/zlib/zlib.h svneol=native#text/plain
-src/lib/zlib/zutil.c svneol=native#text/plain
-src/lib/zlib/zutil.h svneol=native#text/plain
-src/mame/audio/8080bw.c svneol=native#text/plain
-src/mame/audio/amiga.c svneol=native#text/plain
-src/mame/audio/asteroid.c svneol=native#text/plain
-src/mame/audio/astrof.c svneol=native#text/plain
-src/mame/audio/atarifb.c svneol=native#text/plain
-src/mame/audio/atarijsa.c svneol=native#text/plain
-src/mame/audio/atarijsa.h svneol=native#text/plain
-src/mame/audio/attckufo.c svneol=native#text/plain
-src/mame/audio/avalnche.c svneol=native#text/plain
-src/mame/audio/aztarac.c svneol=native#text/plain
-src/mame/audio/blockade.c svneol=native#text/plain
-src/mame/audio/bsktball.c svneol=native#text/plain
-src/mame/audio/bzone.c svneol=native#text/plain
-src/mame/audio/cage.c svneol=native#text/plain
-src/mame/audio/cage.h svneol=native#text/plain
-src/mame/audio/canyon.c svneol=native#text/plain
-src/mame/audio/carnival.c svneol=native#text/plain
-src/mame/audio/cchasm.c svneol=native#text/plain
-src/mame/audio/cclimber.c svneol=native#text/plain
-src/mame/audio/cinemat.c svneol=native#text/plain
-src/mame/audio/circus.c svneol=native#text/plain
-src/mame/audio/cliffhgr.c svneol=native#text/plain
-src/mame/audio/cps3.c svneol=native#text/plain
-src/mame/audio/crbaloon.c svneol=native#text/plain
-src/mame/audio/cyberbal.c svneol=native#text/plain
-src/mame/audio/dcs.c svneol=native#text/plain
-src/mame/audio/dcs.h svneol=native#text/plain
-src/mame/audio/depthch.c svneol=native#text/plain
-src/mame/audio/dkong.c svneol=native#text/plain
-src/mame/audio/dragrace.c svneol=native#text/plain
-src/mame/audio/exidy.c svneol=native#text/plain
-src/mame/audio/exidy440.c svneol=native#text/plain
-src/mame/audio/fghtbskt.c svneol=native#text/plain
-src/mame/audio/firetrk.c svneol=native#text/plain
-src/mame/audio/flower.c svneol=native#text/plain
-src/mame/audio/galaga.c svneol=native#text/plain
-src/mame/audio/galaxian.c svneol=native#text/plain
-src/mame/audio/geebee.c svneol=native#text/plain
-src/mame/audio/gomoku.c svneol=native#text/plain
-src/mame/audio/gorf.c svneol=native#text/plain
-src/mame/audio/gottlieb.c svneol=native#text/plain
-src/mame/audio/gotya.c svneol=native#text/plain
-src/mame/audio/grchamp.c svneol=native#text/plain
-src/mame/audio/gridlee.c svneol=native#text/plain
-src/mame/audio/harddriv.c svneol=native#text/plain
-src/mame/audio/hitme.c svneol=native#text/plain
-src/mame/audio/invinco.c svneol=native#text/plain
-src/mame/audio/irem.c svneol=native#text/plain
-src/mame/audio/irem.h svneol=native#text/plain
-src/mame/audio/jaguar.c svneol=native#text/plain
-src/mame/audio/jedi.c svneol=native#text/plain
-src/mame/audio/laserbat.c svneol=native#text/plain
-src/mame/audio/leland.c svneol=native#text/plain
-src/mame/audio/llander.c svneol=native#text/plain
-src/mame/audio/m72.c svneol=native#text/plain
-src/mame/audio/m72.h svneol=native#text/plain
-src/mame/audio/m79amb.c svneol=native#text/plain
-src/mame/audio/madalien.c svneol=native#text/plain
-src/mame/audio/mario.c svneol=native#text/plain
-src/mame/audio/mcr.c svneol=native#text/plain
-src/mame/audio/mcr.h svneol=native#text/plain
-src/mame/audio/meadows.c svneol=native#text/plain
-src/mame/audio/mw8080bw.c svneol=native#text/plain
-src/mame/audio/n8080.c svneol=native#text/plain
-src/mame/audio/namco52.c svneol=native#text/plain
-src/mame/audio/namco52.h svneol=native#text/plain
-src/mame/audio/namco54.c svneol=native#text/plain
-src/mame/audio/namco54.h svneol=native#text/plain
-src/mame/audio/namcoc7x.c svneol=native#text/plain
-src/mame/audio/namcoc7x.h svneol=native#text/plain
-src/mame/audio/nitedrvr.c svneol=native#text/plain
-src/mame/audio/orbit.c svneol=native#text/plain
-src/mame/audio/phoenix.c svneol=native#text/plain
-src/mame/audio/pleiads.c svneol=native#text/plain
-src/mame/audio/polepos.c svneol=native#text/plain
-src/mame/audio/polyplay.c svneol=native#text/plain
-src/mame/audio/poolshrk.c svneol=native#text/plain
-src/mame/audio/pulsar.c svneol=native#text/plain
-src/mame/audio/qix.c svneol=native#text/plain
-src/mame/audio/redalert.c svneol=native#text/plain
-src/mame/audio/redbaron.c svneol=native#text/plain
-src/mame/audio/scramble.c svneol=native#text/plain
-src/mame/audio/segag80r.c svneol=native#text/plain
-src/mame/audio/segag80v.c svneol=native#text/plain
-src/mame/audio/segasnd.c svneol=native#text/plain
-src/mame/audio/segasnd.h svneol=native#text/plain
-src/mame/audio/seibu.c svneol=native#text/plain
-src/mame/audio/seibu.h svneol=native#text/plain
-src/mame/audio/senjyo.c svneol=native#text/plain
-src/mame/audio/skydiver.c svneol=native#text/plain
-src/mame/audio/snes.c svneol=native#text/plain
-src/mame/audio/snk6502.c svneol=native#text/plain
-src/mame/audio/spacefb.c svneol=native#text/plain
-src/mame/audio/spiders.c svneol=native#text/plain
-src/mame/audio/sprint2.c svneol=native#text/plain
-src/mame/audio/sprint4.c svneol=native#text/plain
-src/mame/audio/sprint4.h svneol=native#text/plain
-src/mame/audio/starshp1.c svneol=native#text/plain
-src/mame/audio/starwars.c svneol=native#text/plain
-src/mame/audio/subs.c svneol=native#text/plain
-src/mame/audio/suna8.c svneol=native#text/plain
-src/mame/audio/t5182.c svneol=native#text/plain
-src/mame/audio/t5182.h svneol=native#text/plain
-src/mame/audio/taito_en.c svneol=native#text/plain
-src/mame/audio/taito_en.h svneol=native#text/plain
-src/mame/audio/taitosnd.c svneol=native#text/plain
-src/mame/audio/taitosnd.h svneol=native#text/plain
-src/mame/audio/tank8.c svneol=native#text/plain
-src/mame/audio/targ.c svneol=native#text/plain
-src/mame/audio/tiamc1.c svneol=native#text/plain
-src/mame/audio/timeplt.c svneol=native#text/plain
-src/mame/audio/timeplt.h svneol=native#text/plain
-src/mame/audio/toaplan2.c svneol=native#text/plain
-src/mame/audio/trackfld.c svneol=native#text/plain
-src/mame/audio/triplhnt.c svneol=native#text/plain
-src/mame/audio/turbo.c svneol=native#text/plain
-src/mame/audio/tx1.c svneol=native#text/plain
-src/mame/audio/vicdual.c svneol=native#text/plain
-src/mame/audio/videopin.c svneol=native#text/plain
-src/mame/audio/warpwarp.c svneol=native#text/plain
-src/mame/audio/williams.c svneol=native#text/plain
-src/mame/audio/williams.h svneol=native#text/plain
-src/mame/audio/wiping.c svneol=native#text/plain
-src/mame/audio/wow.c svneol=native#text/plain
-src/mame/audio/zaxxon.c svneol=native#text/plain
-src/mame/drivers/1942.c svneol=native#text/plain
-src/mame/drivers/1943.c svneol=native#text/plain
-src/mame/drivers/1945kiii.c svneol=native#text/plain
-src/mame/drivers/20pacgal.c svneol=native#text/plain
-src/mame/drivers/2mindril.c svneol=native#text/plain
-src/mame/drivers/39in1.c svneol=native#text/plain
-src/mame/drivers/3super8.c svneol=native#text/plain
-src/mame/drivers/40love.c svneol=native#text/plain
-src/mame/drivers/4enraya.c svneol=native#text/plain
-src/mame/drivers/4roses.c svneol=native#text/plain
-src/mame/drivers/8080bw.c svneol=native#text/plain
-src/mame/drivers/86lions.c svneol=native#text/plain
-src/mame/drivers/88games.c svneol=native#text/plain
-src/mame/drivers/ace.c svneol=native#text/plain
-src/mame/drivers/acefruit.c svneol=native#text/plain
-src/mame/drivers/acommand.c svneol=native#text/plain
-src/mame/drivers/actfancr.c svneol=native#text/plain
-src/mame/drivers/adp.c svneol=native#text/plain
-src/mame/drivers/aeroboto.c svneol=native#text/plain
-src/mame/drivers/aerofgt.c svneol=native#text/plain
-src/mame/drivers/airbustr.c svneol=native#text/plain
-src/mame/drivers/ajax.c svneol=native#text/plain
-src/mame/drivers/aladbl.c svneol=native#text/plain
-src/mame/drivers/albazc.c svneol=native#text/plain
-src/mame/drivers/albazg.c svneol=native#text/plain
-src/mame/drivers/aleck64.c svneol=native#text/plain
-src/mame/drivers/alg.c svneol=native#text/plain
-src/mame/drivers/aliens.c svneol=native#text/plain
-src/mame/drivers/alpha68k.c svneol=native#text/plain
-src/mame/drivers/ambush.c svneol=native#text/plain
-src/mame/drivers/ampoker2.c svneol=native#text/plain
-src/mame/drivers/amspdwy.c svneol=native#text/plain
-src/mame/drivers/angelkds.c svneol=native#text/plain
-src/mame/drivers/appoooh.c svneol=native#text/plain
-src/mame/drivers/aquarium.c svneol=native#text/plain
-src/mame/drivers/arabian.c svneol=native#text/plain
-src/mame/drivers/arcadecl.c svneol=native#text/plain
-src/mame/drivers/arcadia.c svneol=native#text/plain
-src/mame/drivers/argus.c svneol=native#text/plain
-src/mame/drivers/aristmk4.c svneol=native#text/plain
-src/mame/drivers/aristmk5.c svneol=native#text/plain
-src/mame/drivers/arkanoid.c svneol=native#text/plain
-src/mame/drivers/armedf.c svneol=native#text/plain
-src/mame/drivers/artmagic.c svneol=native#text/plain
-src/mame/drivers/ashnojoe.c svneol=native#text/plain
-src/mame/drivers/asterix.c svneol=native#text/plain
-src/mame/drivers/asteroid.c svneol=native#text/plain
-src/mame/drivers/astinvad.c svneol=native#text/plain
-src/mame/drivers/astrocde.c svneol=native#text/plain
-src/mame/drivers/astrocorp.c svneol=native#text/plain
-src/mame/drivers/astrof.c svneol=native#text/plain
-src/mame/drivers/asuka.c svneol=native#text/plain
-src/mame/drivers/atarifb.c svneol=native#text/plain
-src/mame/drivers/atarig1.c svneol=native#text/plain
-src/mame/drivers/atarig42.c svneol=native#text/plain
-src/mame/drivers/atarigt.c svneol=native#text/plain
-src/mame/drivers/atarigx2.c svneol=native#text/plain
-src/mame/drivers/atarisy1.c svneol=native#text/plain
-src/mame/drivers/atarisy2.c svneol=native#text/plain
-src/mame/drivers/ataxx.c svneol=native#text/plain
-src/mame/drivers/atetris.c svneol=native#text/plain
-src/mame/drivers/attckufo.c svneol=native#text/plain
-src/mame/drivers/avalnche.c svneol=native#text/plain
-src/mame/drivers/aztarac.c svneol=native#text/plain
-src/mame/drivers/backfire.c svneol=native#text/plain
-src/mame/drivers/badlands.c svneol=native#text/plain
-src/mame/drivers/bagman.c svneol=native#text/plain
-src/mame/drivers/balsente.c svneol=native#text/plain
-src/mame/drivers/bankp.c svneol=native#text/plain
-src/mame/drivers/baraduke.c svneol=native#text/plain
-src/mame/drivers/batman.c svneol=native#text/plain
-src/mame/drivers/battlane.c svneol=native#text/plain
-src/mame/drivers/battlera.c svneol=native#text/plain
-src/mame/drivers/battlex.c svneol=native#text/plain
-src/mame/drivers/battlnts.c svneol=native#text/plain
-src/mame/drivers/bbusters.c svneol=native#text/plain
-src/mame/drivers/beaminv.c svneol=native#text/plain
-src/mame/drivers/beathead.c svneol=native#text/plain
-src/mame/drivers/beezer.c svneol=native#text/plain
-src/mame/drivers/berzerk.c svneol=native#text/plain
-src/mame/drivers/bestleag.c svneol=native#text/plain
-src/mame/drivers/bfcobra.c svneol=native#text/plain
-src/mame/drivers/bfm_sc1.c svneol=native#text/plain
-src/mame/drivers/bfm_sc2.c svneol=native#text/plain
-src/mame/drivers/bfmsys85.c svneol=native#text/plain
-src/mame/drivers/big10.c svneol=native#text/plain
-src/mame/drivers/bigevglf.c svneol=native#text/plain
-src/mame/drivers/bigfghtr.c svneol=native#text/plain
-src/mame/drivers/bigstrkb.c svneol=native#text/plain
-src/mame/drivers/bingoc.c svneol=native#text/plain
-src/mame/drivers/bingor.c svneol=native#text/plain
-src/mame/drivers/bionicc.c svneol=native#text/plain
-src/mame/drivers/bishi.c svneol=native#text/plain
-src/mame/drivers/bishjan.c svneol=native#text/plain
-src/mame/drivers/bking.c svneol=native#text/plain
-src/mame/drivers/blackt96.c svneol=native#text/plain
-src/mame/drivers/bladestl.c svneol=native#text/plain
-src/mame/drivers/blktiger.c svneol=native#text/plain
-src/mame/drivers/blmbycar.c svneol=native#text/plain
-src/mame/drivers/blockade.c svneol=native#text/plain
-src/mame/drivers/blockhl.c svneol=native#text/plain
-src/mame/drivers/blockout.c svneol=native#text/plain
-src/mame/drivers/bloodbro.c svneol=native#text/plain
-src/mame/drivers/blstroid.c svneol=native#text/plain
-src/mame/drivers/blueprnt.c svneol=native#text/plain
-src/mame/drivers/bmcbowl.c svneol=native#text/plain
-src/mame/drivers/bnstars.c svneol=native#text/plain
-src/mame/drivers/bogeyman.c svneol=native#text/plain
-src/mame/drivers/bombjack.c svneol=native#text/plain
-src/mame/drivers/boogwing.c svneol=native#text/plain
-src/mame/drivers/bottom9.c svneol=native#text/plain
-src/mame/drivers/boxer.c svneol=native#text/plain
-src/mame/drivers/brkthru.c svneol=native#text/plain
-src/mame/drivers/bsktball.c svneol=native#text/plain
-src/mame/drivers/btime.c svneol=native#text/plain
-src/mame/drivers/btoads.c svneol=native#text/plain
-src/mame/drivers/bublbobl.c svneol=native#text/plain
-src/mame/drivers/buggychl.c svneol=native#text/plain
-src/mame/drivers/buster.c svneol=native#text/plain
-src/mame/drivers/bwidow.c svneol=native#text/plain
-src/mame/drivers/bwing.c svneol=native#text/plain
-src/mame/drivers/bzone.c svneol=native#text/plain
-src/mame/drivers/cabal.c svneol=native#text/plain
-src/mame/drivers/cabaret.c svneol=native#text/plain
-src/mame/drivers/calchase.c svneol=native#text/plain
-src/mame/drivers/calomega.c svneol=native#text/plain
-src/mame/drivers/calorie.c svneol=native#text/plain
-src/mame/drivers/canyon.c svneol=native#text/plain
-src/mame/drivers/capbowl.c svneol=native#text/plain
-src/mame/drivers/cardline.c svneol=native#text/plain
-src/mame/drivers/carjmbre.c svneol=native#text/plain
-src/mame/drivers/carpolo.c svneol=native#text/plain
-src/mame/drivers/carrera.c svneol=native#text/plain
-src/mame/drivers/caswin.c svneol=native#text/plain
-src/mame/drivers/cave.c svneol=native#text/plain
-src/mame/drivers/cb2001.c svneol=native#text/plain
-src/mame/drivers/cball.c svneol=native#text/plain
-src/mame/drivers/cbasebal.c svneol=native#text/plain
-src/mame/drivers/cbuster.c svneol=native#text/plain
-src/mame/drivers/ccastles.c svneol=native#text/plain
-src/mame/drivers/cchance.c svneol=native#text/plain
-src/mame/drivers/cchasm.c svneol=native#text/plain
-src/mame/drivers/cclimber.c svneol=native#text/plain
-src/mame/drivers/centiped.c svneol=native#text/plain
-src/mame/drivers/chaknpop.c svneol=native#text/plain
-src/mame/drivers/cham24.c svneol=native#text/plain
-src/mame/drivers/champbas.c svneol=native#text/plain
-src/mame/drivers/champbwl.c svneol=native#text/plain
-src/mame/drivers/chanbara.c svneol=native#text/plain
-src/mame/drivers/changela.c svneol=native#text/plain
-src/mame/drivers/cheekyms.c svneol=native#text/plain
-src/mame/drivers/chihiro.c svneol=native#text/plain
-src/mame/drivers/chinagat.c svneol=native#text/plain
-src/mame/drivers/chinsan.c svneol=native#text/plain
-src/mame/drivers/chqflag.c svneol=native#text/plain
-src/mame/drivers/chsuper.c svneol=native#text/plain
-src/mame/drivers/cidelsa.c svneol=native#text/plain
-src/mame/drivers/cinemat.c svneol=native#text/plain
-src/mame/drivers/circus.c svneol=native#text/plain
-src/mame/drivers/circusc.c svneol=native#text/plain
-src/mame/drivers/cischeat.c svneol=native#text/plain
-src/mame/drivers/citycon.c svneol=native#text/plain
-src/mame/drivers/clayshoo.c svneol=native#text/plain
-src/mame/drivers/cliffhgr.c svneol=native#text/plain
-src/mame/drivers/cloak.c svneol=native#text/plain
-src/mame/drivers/cloud9.c svneol=native#text/plain
-src/mame/drivers/clshroad.c svneol=native#text/plain
-src/mame/drivers/cmmb.c svneol=native#text/plain
-src/mame/drivers/cninja.c svneol=native#text/plain
-src/mame/drivers/cntsteer.c svneol=native#text/plain
-src/mame/drivers/coinmstr.c svneol=native#text/plain
-src/mame/drivers/cojag.c svneol=native#text/plain
-src/mame/drivers/combatsc.c svneol=native#text/plain
-src/mame/drivers/comebaby.c svneol=native#text/plain
-src/mame/drivers/commando.c svneol=native#text/plain
-src/mame/drivers/compgolf.c svneol=native#text/plain
-src/mame/drivers/contra.c svneol=native#text/plain
-src/mame/drivers/coolpool.c svneol=native#text/plain
-src/mame/drivers/coolridr.c svneol=native#text/plain
-src/mame/drivers/cop01.c svneol=native#text/plain
-src/mame/drivers/copsnrob.c svneol=native#text/plain
-src/mame/drivers/cosmic.c svneol=native#text/plain
-src/mame/drivers/cowrace.c svneol=native#text/plain
-src/mame/drivers/cps1.c svneol=native#text/plain
-src/mame/drivers/cps2.c svneol=native#text/plain
-src/mame/drivers/cps3.c svneol=native#text/plain
-src/mame/drivers/crbaloon.c svneol=native#text/plain
-src/mame/drivers/crgolf.c svneol=native#text/plain
-src/mame/drivers/crimfght.c svneol=native#text/plain
-src/mame/drivers/crospang.c svneol=native#text/plain
-src/mame/drivers/crshrace.c svneol=native#text/plain
-src/mame/drivers/crystal.c svneol=native#text/plain
-src/mame/drivers/cshooter.c svneol=native#text/plain
-src/mame/drivers/cubeqst.c svneol=native#text/plain
-src/mame/drivers/cubocd32.c svneol=native#text/plain
-src/mame/drivers/cultures.c svneol=native#text/plain
-src/mame/drivers/cvs.c svneol=native#text/plain
-src/mame/drivers/cyberbal.c svneol=native#text/plain
-src/mame/drivers/cybertnk.c svneol=native#text/plain
-src/mame/drivers/dacholer.c svneol=native#text/plain
-src/mame/drivers/dambustr.c svneol=native#text/plain
-src/mame/drivers/darius.c svneol=native#text/plain
-src/mame/drivers/darkhors.c svneol=native#text/plain
-src/mame/drivers/darkmist.c svneol=native#text/plain
-src/mame/drivers/darkseal.c svneol=native#text/plain
-src/mame/drivers/dassault.c svneol=native#text/plain
-src/mame/drivers/dblewing.c svneol=native#text/plain
-src/mame/drivers/dbz.c svneol=native#text/plain
-src/mame/drivers/dcheese.c svneol=native#text/plain
-src/mame/drivers/dcon.c svneol=native#text/plain
-src/mame/drivers/dday.c svneol=native#text/plain
-src/mame/drivers/ddayjlc.c svneol=native#text/plain
-src/mame/drivers/ddealer.c svneol=native#text/plain
-src/mame/drivers/ddenlovr.c svneol=native#text/plain
-src/mame/drivers/ddragon.c svneol=native#text/plain
-src/mame/drivers/ddragon3.c svneol=native#text/plain
-src/mame/drivers/ddrible.c svneol=native#text/plain
-src/mame/drivers/ddz.c svneol=native#text/plain
-src/mame/drivers/deadang.c svneol=native#text/plain
-src/mame/drivers/dec0.c svneol=native#text/plain
-src/mame/drivers/dec8.c svneol=native#text/plain
-src/mame/drivers/deco156.c svneol=native#text/plain
-src/mame/drivers/deco32.c svneol=native#text/plain
-src/mame/drivers/deco_ld.c svneol=native#text/plain
-src/mame/drivers/deco_mlc.c svneol=native#text/plain
-src/mame/drivers/decocass.c svneol=native#text/plain
-src/mame/drivers/deniam.c svneol=native#text/plain
-src/mame/drivers/deshoros.c svneol=native#text/plain
-src/mame/drivers/destroyr.c svneol=native#text/plain
-src/mame/drivers/dgpix.c svneol=native#text/plain
-src/mame/drivers/dietgo.c svneol=native#text/plain
-src/mame/drivers/discoboy.c svneol=native#text/plain
-src/mame/drivers/diverboy.c svneol=native#text/plain
-src/mame/drivers/djboy.c svneol=native#text/plain
-src/mame/drivers/djmain.c svneol=native#text/plain
-src/mame/drivers/dkong.c svneol=native#text/plain
-src/mame/drivers/dlair.c svneol=native#text/plain
-src/mame/drivers/dmndrby.c svneol=native#text/plain
-src/mame/drivers/docastle.c svneol=native#text/plain
-src/mame/drivers/dogfgt.c svneol=native#text/plain
-src/mame/drivers/dominob.c svneol=native#text/plain
-src/mame/drivers/dooyong.c svneol=native#text/plain
-src/mame/drivers/dorachan.c svneol=native#text/plain
-src/mame/drivers/dotrikun.c svneol=native#text/plain
-src/mame/drivers/dragrace.c svneol=native#text/plain
-src/mame/drivers/dreamwld.c svneol=native#text/plain
-src/mame/drivers/drgnmst.c svneol=native#text/plain
-src/mame/drivers/dribling.c svneol=native#text/plain
-src/mame/drivers/drmicro.c svneol=native#text/plain
-src/mame/drivers/drtomy.c svneol=native#text/plain
-src/mame/drivers/drw80pkr.c svneol=native#text/plain
-src/mame/drivers/dunhuang.c svneol=native#text/plain
-src/mame/drivers/dwarfd.c svneol=native#text/plain
-src/mame/drivers/dynadice.c svneol=native#text/plain
-src/mame/drivers/dynax.c svneol=native#text/plain
-src/mame/drivers/dynduke.c svneol=native#text/plain
-src/mame/drivers/egghunt.c svneol=native#text/plain
-src/mame/drivers/embargo.c svneol=native#text/plain
-src/mame/drivers/enigma2.c svneol=native#text/plain
-src/mame/drivers/eolith.c svneol=native#text/plain
-src/mame/drivers/eolith16.c svneol=native#text/plain
-src/mame/drivers/eolithsp.c svneol=native#text/plain
-src/mame/drivers/epos.c svneol=native#text/plain
-src/mame/drivers/eprom.c svneol=native#text/plain
-src/mame/drivers/equites.c svneol=native#text/plain
-src/mame/drivers/ertictac.c svneol=native#text/plain
-src/mame/drivers/esd16.c svneol=native#text/plain
-src/mame/drivers/esh.c svneol=native#text/plain
-src/mame/drivers/espial.c svneol=native#text/plain
-src/mame/drivers/esripsys.c svneol=native#text/plain
-src/mame/drivers/ettrivia.c svneol=native#text/plain
-src/mame/drivers/exedexes.c svneol=native#text/plain
-src/mame/drivers/exerion.c svneol=native#text/plain
-src/mame/drivers/exidy.c svneol=native#text/plain
-src/mame/drivers/exidy440.c svneol=native#text/plain
-src/mame/drivers/expro02.c svneol=native#text/plain
-src/mame/drivers/exprraid.c svneol=native#text/plain
-src/mame/drivers/exterm.c svneol=native#text/plain
-src/mame/drivers/exzisus.c svneol=native#text/plain
-src/mame/drivers/f-32.c svneol=native#text/plain
-src/mame/drivers/f1gp.c svneol=native#text/plain
-src/mame/drivers/fantland.c svneol=native#text/plain
-src/mame/drivers/fastfred.c svneol=native#text/plain
-src/mame/drivers/fastlane.c svneol=native#text/plain
-src/mame/drivers/fcombat.c svneol=native#text/plain
-src/mame/drivers/fcrash.c svneol=native#text/plain
-src/mame/drivers/feversoc.c svneol=native#text/plain
-src/mame/drivers/fgoal.c svneol=native#text/plain
-src/mame/drivers/finalizr.c svneol=native#text/plain
-src/mame/drivers/findout.c svneol=native#text/plain
-src/mame/drivers/firebeat.c svneol=native#text/plain
-src/mame/drivers/firefox.c svneol=native#text/plain
-src/mame/drivers/firetrap.c svneol=native#text/plain
-src/mame/drivers/firetrk.c svneol=native#text/plain
-src/mame/drivers/fitfight.c svneol=native#text/plain
-src/mame/drivers/flkatck.c svneol=native#text/plain
-src/mame/drivers/flower.c svneol=native#text/plain
-src/mame/drivers/flstory.c svneol=native#text/plain
-src/mame/drivers/flyball.c svneol=native#text/plain
-src/mame/drivers/foodf.c svneol=native#text/plain
-src/mame/drivers/forte2.c svneol=native#text/plain
-src/mame/drivers/fortecar.c svneol=native#text/plain
-src/mame/drivers/freekick.c svneol=native#text/plain
-src/mame/drivers/fromanc2.c svneol=native#text/plain
-src/mame/drivers/fromance.c svneol=native#text/plain
-src/mame/drivers/funkybee.c svneol=native#text/plain
-src/mame/drivers/funkyjet.c svneol=native#text/plain
-src/mame/drivers/funworld.c svneol=native#text/plain
-src/mame/drivers/funybubl.c svneol=native#text/plain
-src/mame/drivers/fuukifg2.c svneol=native#text/plain
-src/mame/drivers/fuukifg3.c svneol=native#text/plain
-src/mame/drivers/gaelco.c svneol=native#text/plain
-src/mame/drivers/gaelco2.c svneol=native#text/plain
-src/mame/drivers/gaelco3d.c svneol=native#text/plain
-src/mame/drivers/gaiden.c svneol=native#text/plain
-src/mame/drivers/gal3.c svneol=native#text/plain
-src/mame/drivers/galaga.c svneol=native#text/plain
-src/mame/drivers/galastrm.c svneol=native#text/plain
-src/mame/drivers/galaxi.c svneol=native#text/plain
-src/mame/drivers/galaxia.c svneol=native#text/plain
-src/mame/drivers/galaxian.c svneol=native#text/plain
-src/mame/drivers/galaxold.c svneol=native#text/plain
-src/mame/drivers/galdrvr.c svneol=native#text/plain
-src/mame/drivers/galivan.c svneol=native#text/plain
-src/mame/drivers/galpani2.c svneol=native#text/plain
-src/mame/drivers/galpani3.c svneol=native#text/plain
-src/mame/drivers/galpanic.c svneol=native#text/plain
-src/mame/drivers/galspnbl.c svneol=native#text/plain
-src/mame/drivers/gamecstl.c svneol=native#text/plain
-src/mame/drivers/gameplan.c svneol=native#text/plain
-src/mame/drivers/gaplus.c svneol=native#text/plain
-src/mame/drivers/gatron.c svneol=native#text/plain
-src/mame/drivers/gauntlet.c svneol=native#text/plain
-src/mame/drivers/gberet.c svneol=native#text/plain
-src/mame/drivers/gbusters.c svneol=native#text/plain
-src/mame/drivers/gcpinbal.c svneol=native#text/plain
-src/mame/drivers/genesis.c svneol=native#text/plain
-src/mame/drivers/getrivia.c svneol=native#text/plain
-src/mame/drivers/ghosteo.c svneol=native#text/plain
-src/mame/drivers/gijoe.c svneol=native#text/plain
-src/mame/drivers/ginganin.c svneol=native#text/plain
-src/mame/drivers/gladiatr.c svneol=native#text/plain
-src/mame/drivers/glass.c svneol=native#text/plain
-src/mame/drivers/gng.c svneol=native#text/plain
-src/mame/drivers/go2000.c svneol=native#text/plain
-src/mame/drivers/goal92.c svneol=native#text/plain
-src/mame/drivers/goindol.c svneol=native#text/plain
-src/mame/drivers/goldnpkr.c svneol=native#text/plain
-src/mame/drivers/goldstar.c svneol=native#text/plain
-src/mame/drivers/gomoku.c svneol=native#text/plain
-src/mame/drivers/good.c svneol=native#text/plain
-src/mame/drivers/goodejan.c svneol=native#text/plain
-src/mame/drivers/gotcha.c svneol=native#text/plain
-src/mame/drivers/gottlieb.c svneol=native#text/plain
-src/mame/drivers/gotya.c svneol=native#text/plain
-src/mame/drivers/gpworld.c svneol=native#text/plain
-src/mame/drivers/gradius3.c svneol=native#text/plain
-src/mame/drivers/grchamp.c svneol=native#text/plain
-src/mame/drivers/gridlee.c svneol=native#text/plain
-src/mame/drivers/groundfx.c svneol=native#text/plain
-src/mame/drivers/gstream.c svneol=native#text/plain
-src/mame/drivers/gstriker.c svneol=native#text/plain
-src/mame/drivers/gsword.c svneol=native#text/plain
-src/mame/drivers/gticlub.c svneol=native#text/plain
-src/mame/drivers/guab.c svneol=native#text/plain
-src/mame/drivers/gumbo.c svneol=native#text/plain
-src/mame/drivers/gunbustr.c svneol=native#text/plain
-src/mame/drivers/gundealr.c svneol=native#text/plain
-src/mame/drivers/gunpey.c svneol=native#text/plain
-src/mame/drivers/gunsmoke.c svneol=native#text/plain
-src/mame/drivers/gyruss.c svneol=native#text/plain
-src/mame/drivers/halleys.c svneol=native#text/plain
-src/mame/drivers/hanaawas.c svneol=native#text/plain
-src/mame/drivers/harddriv.c svneol=native#text/plain
-src/mame/drivers/hcastle.c svneol=native#text/plain
-src/mame/drivers/hexa.c svneol=native#text/plain
-src/mame/drivers/hexion.c svneol=native#text/plain
-src/mame/drivers/higemaru.c svneol=native#text/plain
-src/mame/drivers/highvdeo.c svneol=native#text/plain
-src/mame/drivers/hikaru.c svneol=native#text/plain
-src/mame/drivers/himesiki.c svneol=native#text/plain
-src/mame/drivers/hitme.c svneol=native#text/plain
-src/mame/drivers/hitpoker.c svneol=native#text/plain
-src/mame/drivers/hnayayoi.c svneol=native#text/plain
-src/mame/drivers/hng64.c svneol=native#text/plain
-src/mame/drivers/holeland.c svneol=native#text/plain
-src/mame/drivers/homedata.c svneol=native#text/plain
-src/mame/drivers/homerun.c svneol=native#text/plain
-src/mame/drivers/hornet.c svneol=native#text/plain
-src/mame/drivers/hotblock.c svneol=native#text/plain
-src/mame/drivers/hshavoc.c svneol=native#text/plain
-src/mame/drivers/hvyunit.c svneol=native#text/plain
-src/mame/drivers/hyhoo.c svneol=native#text/plain
-src/mame/drivers/hyperspt.c svneol=native#text/plain
-src/mame/drivers/hyprduel.c svneol=native#text/plain
-src/mame/drivers/igs009.c svneol=native#text/plain
-src/mame/drivers/igs017.c svneol=native#text/plain
-src/mame/drivers/igs_blit.c svneol=native#text/plain
-src/mame/drivers/igs_m027.c svneol=native#text/plain
-src/mame/drivers/igs_m68.c svneol=native#text/plain
-src/mame/drivers/igspoker.c svneol=native#text/plain
-src/mame/drivers/ikki.c svneol=native#text/plain
-src/mame/drivers/ilpag.c svneol=native#text/plain
-src/mame/drivers/imolagp.c svneol=native#text/plain
-src/mame/drivers/intrscti.c svneol=native#text/plain
-src/mame/drivers/inufuku.c svneol=native#text/plain
-src/mame/drivers/iqblock.c svneol=native#text/plain
-src/mame/drivers/irobot.c svneol=native#text/plain
-src/mame/drivers/ironhors.c svneol=native#text/plain
-src/mame/drivers/istellar.c svneol=native#text/plain
-src/mame/drivers/itech32.c svneol=native#text/plain
-src/mame/drivers/itech8.c svneol=native#text/plain
-src/mame/drivers/itgambl2.c svneol=native#text/plain
-src/mame/drivers/itgambl3.c svneol=native#text/plain
-src/mame/drivers/itgamble.c svneol=native#text/plain
-src/mame/drivers/jack.c svneol=native#text/plain
-src/mame/drivers/jackal.c svneol=native#text/plain
-src/mame/drivers/jackie.c svneol=native#text/plain
-src/mame/drivers/jackpool.c svneol=native#text/plain
-src/mame/drivers/jailbrek.c svneol=native#text/plain
-src/mame/drivers/jalmah.c svneol=native#text/plain
-src/mame/drivers/jangou.c svneol=native#text/plain
-src/mame/drivers/janshi.c svneol=native#text/plain
-src/mame/drivers/jantotsu.c svneol=native#text/plain
-src/mame/drivers/jchan.c svneol=native#text/plain
-src/mame/drivers/jedi.c svneol=native#text/plain
-src/mame/drivers/jokrwild.c svneol=native#text/plain
-src/mame/drivers/jollyjgr.c svneol=native#text/plain
-src/mame/drivers/jongkyo.c svneol=native#text/plain
-src/mame/drivers/jpmimpct.c svneol=native#text/plain
-src/mame/drivers/jpmsys5.c svneol=native#text/plain
-src/mame/drivers/jrpacman.c svneol=native#text/plain
-src/mame/drivers/junofrst.c svneol=native#text/plain
-src/mame/drivers/kaneko16.c svneol=native#text/plain
-src/mame/drivers/kangaroo.c svneol=native#text/plain
-src/mame/drivers/karnov.c svneol=native#text/plain
-src/mame/drivers/kchamp.c svneol=native#text/plain
-src/mame/drivers/kickgoal.c svneol=native#text/plain
-src/mame/drivers/kingdrby.c svneol=native#text/plain
-src/mame/drivers/kingobox.c svneol=native#text/plain
-src/mame/drivers/kingpin.c svneol=native#text/plain
-src/mame/drivers/kinst.c svneol=native#text/plain
-src/mame/drivers/klax.c svneol=native#text/plain
-src/mame/drivers/kncljoe.c svneol=native#text/plain
-src/mame/drivers/koftball.c svneol=native#text/plain
-src/mame/drivers/koikoi.c svneol=native#text/plain
-src/mame/drivers/konamigq.c svneol=native#text/plain
-src/mame/drivers/konamigv.c svneol=native#text/plain
-src/mame/drivers/konamigx.c svneol=native#text/plain
-src/mame/drivers/konamim2.c svneol=native#text/plain
-src/mame/drivers/kopunch.c svneol=native#text/plain
-src/mame/drivers/ksayakyu.c svneol=native#text/plain
-src/mame/drivers/ksys573.c svneol=native#text/plain
-src/mame/drivers/kungfur.c svneol=native#text/plain
-src/mame/drivers/kyugo.c svneol=native#text/plain
-src/mame/drivers/labyrunr.c svneol=native#text/plain
-src/mame/drivers/ladybug.c svneol=native#text/plain
-src/mame/drivers/ladyfrog.c svneol=native#text/plain
-src/mame/drivers/laserbas.c svneol=native#text/plain
-src/mame/drivers/laserbat.c svneol=native#text/plain
-src/mame/drivers/lasso.c svneol=native#text/plain
-src/mame/drivers/lastduel.c svneol=native#text/plain
-src/mame/drivers/lastfght.c svneol=native#text/plain
-src/mame/drivers/lazercmd.c svneol=native#text/plain
-src/mame/drivers/legionna.c svneol=native#text/plain
-src/mame/drivers/leland.c svneol=native#text/plain
-src/mame/drivers/lemmings.c svneol=native#text/plain
-src/mame/drivers/lethal.c svneol=native#text/plain
-src/mame/drivers/lethalj.c svneol=native#text/plain
-src/mame/drivers/lgp.c svneol=native#text/plain
-src/mame/drivers/liberate.c svneol=native#text/plain
-src/mame/drivers/liberatr.c svneol=native#text/plain
-src/mame/drivers/limenko.c svneol=native#text/plain
-src/mame/drivers/littlerb.c svneol=native#text/plain
-src/mame/drivers/lkage.c svneol=native#text/plain
-src/mame/drivers/lockon.c svneol=native#text/plain
-src/mame/drivers/looping.c svneol=native#text/plain
-src/mame/drivers/lordgun.c svneol=native#text/plain
-src/mame/drivers/lsasquad.c svneol=native#text/plain
-src/mame/drivers/ltcasino.c svneol=native#text/plain
-src/mame/drivers/luckgrln.c svneol=native#text/plain
-src/mame/drivers/lucky74.c svneol=native#text/plain
-src/mame/drivers/lvcards.c svneol=native#text/plain
-src/mame/drivers/lwings.c svneol=native#text/plain
-src/mame/drivers/m10.c svneol=native#text/plain
-src/mame/drivers/m107.c svneol=native#text/plain
-src/mame/drivers/m14.c svneol=native#text/plain
-src/mame/drivers/m52.c svneol=native#text/plain
-src/mame/drivers/m57.c svneol=native#text/plain
-src/mame/drivers/m58.c svneol=native#text/plain
-src/mame/drivers/m62.c svneol=native#text/plain
-src/mame/drivers/m63.c svneol=native#text/plain
-src/mame/drivers/m72.c svneol=native#text/plain
-src/mame/drivers/m79amb.c svneol=native#text/plain
-src/mame/drivers/m90.c svneol=native#text/plain
-src/mame/drivers/m92.c svneol=native#text/plain
-src/mame/drivers/macrossp.c svneol=native#text/plain
-src/mame/drivers/macs.c svneol=native#text/plain
-src/mame/drivers/madalien.c svneol=native#text/plain
-src/mame/drivers/madmotor.c svneol=native#text/plain
-src/mame/drivers/magic10.c svneol=native#text/plain
-src/mame/drivers/magicard.c svneol=native#text/plain
-src/mame/drivers/magicfly.c svneol=native#text/plain
-src/mame/drivers/magictg.c svneol=native#text/plain
-src/mame/drivers/magmax.c svneol=native#text/plain
-src/mame/drivers/mainevt.c svneol=native#text/plain
-src/mame/drivers/mainsnk.c svneol=native#text/plain
-src/mame/drivers/malzak.c svneol=native#text/plain
-src/mame/drivers/mappy.c svneol=native#text/plain
-src/mame/drivers/marineb.c svneol=native#text/plain
-src/mame/drivers/marinedt.c svneol=native#text/plain
-src/mame/drivers/mario.c svneol=native#text/plain
-src/mame/drivers/markham.c svneol=native#text/plain
-src/mame/drivers/mastboy.c svneol=native#text/plain
-src/mame/drivers/matmania.c svneol=native#text/plain
-src/mame/drivers/maxaflex.c svneol=native#text/plain
-src/mame/drivers/maygay1b.c svneol=native#text/plain
-src/mame/drivers/maygayv1.c svneol=native#text/plain
-src/mame/drivers/mayumi.c svneol=native#text/plain
-src/mame/drivers/mazerbla.c svneol=native#text/plain
-src/mame/drivers/mcatadv.c svneol=native#text/plain
-src/mame/drivers/mcr.c svneol=native#text/plain
-src/mame/drivers/mcr3.c svneol=native#text/plain
-src/mame/drivers/mcr68.c svneol=native#text/plain
-src/mame/drivers/meadows.c svneol=native#text/plain
-src/mame/drivers/mediagx.c svneol=native#text/plain
-src/mame/drivers/megadriv.c svneol=native#text/plain
-src/mame/drivers/megadriv.h svneol=native#text/plain
-src/mame/drivers/megaplay.c svneol=native#text/plain
-src/mame/drivers/megasys1.c svneol=native#text/plain
-src/mame/drivers/megatech.c svneol=native#text/plain
-src/mame/drivers/megazone.c svneol=native#text/plain
-src/mame/drivers/meijinsn.c svneol=native#text/plain
-src/mame/drivers/merit.c svneol=native#text/plain
-src/mame/drivers/meritm.c svneol=native#text/plain
-src/mame/drivers/mermaid.c svneol=native#text/plain
-src/mame/drivers/metlclsh.c svneol=native#text/plain
-src/mame/drivers/metro.c svneol=native#text/plain
-src/mame/drivers/mexico86.c svneol=native#text/plain
-src/mame/drivers/mgolf.c svneol=native#text/plain
-src/mame/drivers/mhavoc.c svneol=native#text/plain
-src/mame/drivers/micro3d.c svneol=native#text/plain
-src/mame/drivers/midas.c svneol=native#text/plain
-src/mame/drivers/midtunit.c svneol=native#text/plain
-src/mame/drivers/midvunit.c svneol=native#text/plain
-src/mame/drivers/midwunit.c svneol=native#text/plain
-src/mame/drivers/midxunit.c svneol=native#text/plain
-src/mame/drivers/midyunit.c svneol=native#text/plain
-src/mame/drivers/midzeus.c svneol=native#text/plain
-src/mame/drivers/mikie.c svneol=native#text/plain
-src/mame/drivers/mil4000.c svneol=native#text/plain
-src/mame/drivers/miniboy7.c svneol=native#text/plain
-src/mame/drivers/minivadr.c svneol=native#text/plain
-src/mame/drivers/mirage.c svneol=native#text/plain
-src/mame/drivers/mirax.c svneol=native#text/plain
-src/mame/drivers/missb2.c svneol=native#text/plain
-src/mame/drivers/missile.c svneol=native#text/plain
-src/mame/drivers/mitchell.c svneol=native#text/plain
-src/mame/drivers/mjkjidai.c svneol=native#text/plain
-src/mame/drivers/mjsister.c svneol=native#text/plain
-src/mame/drivers/mlanding.c svneol=native#text/plain
-src/mame/drivers/model1.c svneol=native#text/plain
-src/mame/drivers/model2.c svneol=native#text/plain
-src/mame/drivers/model3.c svneol=native#text/plain
-src/mame/drivers/mogura.c svneol=native#text/plain
-src/mame/drivers/mole.c svneol=native#text/plain
-src/mame/drivers/momoko.c svneol=native#text/plain
-src/mame/drivers/moo.c svneol=native#text/plain
-src/mame/drivers/mosaic.c svneol=native#text/plain
-src/mame/drivers/mouser.c svneol=native#text/plain
-src/mame/drivers/mpoker.c svneol=native#text/plain
-src/mame/drivers/mpu4.c svneol=native#text/plain
-src/mame/drivers/mpu4drvr.c svneol=native#text/plain
-src/mame/drivers/mpu5.c svneol=native#text/plain
-src/mame/drivers/mquake.c svneol=native#text/plain
-src/mame/drivers/mrdo.c svneol=native#text/plain
-src/mame/drivers/mrflea.c svneol=native#text/plain
-src/mame/drivers/mrjong.c svneol=native#text/plain
-src/mame/drivers/ms32.c svneol=native#text/plain
-src/mame/drivers/msisaac.c svneol=native#text/plain
-src/mame/drivers/mugsmash.c svneol=native#text/plain
-src/mame/drivers/multfish.c svneol=native#text/plain
-src/mame/drivers/multigam.c svneol=native#text/plain
-src/mame/drivers/munchmo.c svneol=native#text/plain
-src/mame/drivers/murogem.c svneol=native#text/plain
-src/mame/drivers/murogmbl.c svneol=native#text/plain
-src/mame/drivers/mustache.c svneol=native#text/plain
-src/mame/drivers/mw8080bw.c svneol=native#text/plain
-src/mame/drivers/mwarr.c svneol=native#text/plain
-src/mame/drivers/mystston.c svneol=native#text/plain
-src/mame/drivers/mystwarr.c svneol=native#text/plain
-src/mame/drivers/n8080.c svneol=native#text/plain
-src/mame/drivers/namcofl.c svneol=native#text/plain
-src/mame/drivers/namcoic.c svneol=native#text/plain
-src/mame/drivers/namcona1.c svneol=native#text/plain
-src/mame/drivers/namconb1.c svneol=native#text/plain
-src/mame/drivers/namcond1.c svneol=native#text/plain
-src/mame/drivers/namcos1.c svneol=native#text/plain
-src/mame/drivers/namcos10.c svneol=native#text/plain
-src/mame/drivers/namcos11.c svneol=native#text/plain
-src/mame/drivers/namcos12.c svneol=native#text/plain
-src/mame/drivers/namcos2.c svneol=native#text/plain
-src/mame/drivers/namcos21.c svneol=native#text/plain
-src/mame/drivers/namcos22.c svneol=native#text/plain
-src/mame/drivers/namcos23.c svneol=native#text/plain
-src/mame/drivers/namcos86.c svneol=native#text/plain
-src/mame/drivers/naomi.c svneol=native#text/plain
-src/mame/drivers/naughtyb.c svneol=native#text/plain
-src/mame/drivers/nbmj8688.c svneol=native#text/plain
-src/mame/drivers/nbmj8891.c svneol=native#text/plain
-src/mame/drivers/nbmj8991.c svneol=native#text/plain
-src/mame/drivers/nbmj9195.c svneol=native#text/plain
-src/mame/drivers/nemesis.c svneol=native#text/plain
-src/mame/drivers/neodrvr.c svneol=native#text/plain
-src/mame/drivers/neogeo.c svneol=native#text/plain
-src/mame/drivers/news.c svneol=native#text/plain
-src/mame/drivers/nightgal.c svneol=native#text/plain
-src/mame/drivers/ninjakd2.c svneol=native#text/plain
-src/mame/drivers/ninjaw.c svneol=native#text/plain
-src/mame/drivers/nitedrvr.c svneol=native#text/plain
-src/mame/drivers/niyanpai.c svneol=native#text/plain
-src/mame/drivers/nmg5.c svneol=native#text/plain
-src/mame/drivers/nmk16.c svneol=native#text/plain
-src/mame/drivers/norautp.c svneol=native#text/plain
-src/mame/drivers/nova2001.c svneol=native#text/plain
-src/mame/drivers/nss.c svneol=native#text/plain
-src/mame/drivers/nwk-tr.c svneol=native#text/plain
-src/mame/drivers/nycaptor.c svneol=native#text/plain
-src/mame/drivers/nyny.c svneol=native#text/plain
-src/mame/drivers/offtwall.c svneol=native#text/plain
-src/mame/drivers/ohmygod.c svneol=native#text/plain
-src/mame/drivers/ojankohs.c svneol=native#text/plain
-src/mame/drivers/olibochu.c svneol=native#text/plain
-src/mame/drivers/omegrace.c svneol=native#text/plain
-src/mame/drivers/oneshot.c svneol=native#text/plain
-src/mame/drivers/onetwo.c svneol=native#text/plain
-src/mame/drivers/opwolf.c svneol=native#text/plain
-src/mame/drivers/orbit.c svneol=native#text/plain
-src/mame/drivers/othldrby.c svneol=native#text/plain
-src/mame/drivers/othunder.c svneol=native#text/plain
-src/mame/drivers/overdriv.c svneol=native#text/plain
-src/mame/drivers/pachifev.c svneol=native#text/plain
-src/mame/drivers/pacland.c svneol=native#text/plain
-src/mame/drivers/pacman.c svneol=native#text/plain
-src/mame/drivers/pandoras.c svneol=native#text/plain
-src/mame/drivers/pangofun.c svneol=native#text/plain
-src/mame/drivers/panicr.c svneol=native#text/plain
-src/mame/drivers/paradise.c svneol=native#text/plain
-src/mame/drivers/paranoia.c svneol=native#text/plain
-src/mame/drivers/parodius.c svneol=native#text/plain
-src/mame/drivers/pasha2.c svneol=native#text/plain
-src/mame/drivers/pass.c svneol=native#text/plain
-src/mame/drivers/pastelg.c svneol=native#text/plain
-src/mame/drivers/pbaction.c svneol=native#text/plain
-src/mame/drivers/pcat_nit.c svneol=native#text/plain
-src/mame/drivers/pcktgal.c svneol=native#text/plain
-src/mame/drivers/pcxt.c svneol=native#text/plain
-src/mame/drivers/pengo.c svneol=native#text/plain
-src/mame/drivers/peplus.c svneol=native#text/plain
-src/mame/drivers/pgm.c svneol=native#text/plain
-src/mame/drivers/phoenix.c svneol=native#text/plain
-src/mame/drivers/photon.c svneol=native#text/plain
-src/mame/drivers/photoply.c svneol=native#text/plain
-src/mame/drivers/pingpong.c svneol=native#text/plain
-src/mame/drivers/pipedrm.c svneol=native#text/plain
-src/mame/drivers/pipeline.c svneol=native#text/plain
-src/mame/drivers/pirates.c svneol=native#text/plain
-src/mame/drivers/pitnrun.c svneol=native#text/plain
-src/mame/drivers/pkscram.c svneol=native#text/plain
-src/mame/drivers/pktgaldx.c svneol=native#text/plain
-src/mame/drivers/playch10.c svneol=native#text/plain
-src/mame/drivers/playmark.c svneol=native#text/plain
-src/mame/drivers/plygonet.c svneol=native#text/plain
-src/mame/drivers/pntnpuzl.c svneol=native#text/plain
-src/mame/drivers/pokechmp.c svneol=native#text/plain
-src/mame/drivers/polepos.c svneol=native#text/plain
-src/mame/drivers/policetr.c svneol=native#text/plain
-src/mame/drivers/polyplay.c svneol=native#text/plain
-src/mame/drivers/poolshrk.c svneol=native#text/plain
-src/mame/drivers/pooyan.c svneol=native#text/plain
-src/mame/drivers/popeye.c svneol=native#text/plain
-src/mame/drivers/popper.c svneol=native#text/plain
-src/mame/drivers/portrait.c svneol=native#text/plain
-src/mame/drivers/powerbal.c svneol=native#text/plain
-src/mame/drivers/powerins.c svneol=native#text/plain
-src/mame/drivers/ppmast93.c svneol=native#text/plain
-src/mame/drivers/prehisle.c svneol=native#text/plain
-src/mame/drivers/progolf.c svneol=native#text/plain
-src/mame/drivers/psattack.c svneol=native#text/plain
-src/mame/drivers/psikyo.c svneol=native#text/plain
-src/mame/drivers/psikyo4.c svneol=native#text/plain
-src/mame/drivers/psikyosh.c svneol=native#text/plain
-src/mame/drivers/psychic5.c svneol=native#text/plain
-src/mame/drivers/pturn.c svneol=native#text/plain
-src/mame/drivers/puckpkmn.c svneol=native#text/plain
-src/mame/drivers/punchout.c svneol=native#text/plain
-src/mame/drivers/pushman.c svneol=native#text/plain
-src/mame/drivers/pzletime.c svneol=native#text/plain
-src/mame/drivers/qdrmfgp.c svneol=native#text/plain
-src/mame/drivers/qix.c svneol=native#text/plain
-src/mame/drivers/quakeat.c svneol=native#text/plain
-src/mame/drivers/quantum.c svneol=native#text/plain
-src/mame/drivers/quasar.c svneol=native#text/plain
-src/mame/drivers/queen.c svneol=native#text/plain
-src/mame/drivers/quizdna.c svneol=native#text/plain
-src/mame/drivers/quizo.c svneol=native#text/plain
-src/mame/drivers/quizpani.c svneol=native#text/plain
-src/mame/drivers/quizpun2.c svneol=native#text/plain
-src/mame/drivers/r2dtank.c svneol=native#text/plain
-src/mame/drivers/rabbit.c svneol=native#text/plain
-src/mame/drivers/raiden.c svneol=native#text/plain
-src/mame/drivers/raiden2.c svneol=native#text/plain
-src/mame/drivers/rainbow.c svneol=native#text/plain
-src/mame/drivers/rallyx.c svneol=native#text/plain
-src/mame/drivers/rampart.c svneol=native#text/plain
-src/mame/drivers/rastan.c svneol=native#text/plain
-src/mame/drivers/rbmk.c svneol=native#text/plain
-src/mame/drivers/rcorsair.c svneol=native#text/plain
-src/mame/drivers/re900.c svneol=native#text/plain
-src/mame/drivers/realbrk.c svneol=native#text/plain
-src/mame/drivers/redalert.c svneol=native#text/plain
-src/mame/drivers/redclash.c svneol=native#text/plain
-src/mame/drivers/relief.c svneol=native#text/plain
-src/mame/drivers/renegade.c svneol=native#text/plain
-src/mame/drivers/retofinv.c svneol=native#text/plain
-src/mame/drivers/rmhaihai.c svneol=native#text/plain
-src/mame/drivers/rockrage.c svneol=native#text/plain
-src/mame/drivers/rocnrope.c svneol=native#text/plain
-src/mame/drivers/rohga.c svneol=native#text/plain
-src/mame/drivers/rollerg.c svneol=native#text/plain
-src/mame/drivers/rollrace.c svneol=native#text/plain
-src/mame/drivers/rotaryf.c svneol=native#text/plain
-src/mame/drivers/roul.c svneol=native#text/plain
-src/mame/drivers/route16.c svneol=native#text/plain
-src/mame/drivers/royalmah.c svneol=native#text/plain
-src/mame/drivers/rpunch.c svneol=native#text/plain
-src/mame/drivers/runaway.c svneol=native#text/plain
-src/mame/drivers/rungun.c svneol=native#text/plain
-src/mame/drivers/safarir.c svneol=native#text/plain
-src/mame/drivers/sandscrp.c svneol=native#text/plain
-src/mame/drivers/sangho.c svneol=native#text/plain
-src/mame/drivers/sauro.c svneol=native#text/plain
-src/mame/drivers/sbasketb.c svneol=native#text/plain
-src/mame/drivers/sbowling.c svneol=native#text/plain
-src/mame/drivers/sbrkout.c svneol=native#text/plain
-src/mame/drivers/sbugger.c svneol=native#text/plain
-src/mame/drivers/scobra.c svneol=native#text/plain
-src/mame/drivers/scotrsht.c svneol=native#text/plain
-src/mame/drivers/scramble.c svneol=native#text/plain
-src/mame/drivers/scregg.c svneol=native#text/plain
-src/mame/drivers/sderby.c svneol=native#text/plain
-src/mame/drivers/seattle.c svneol=native#text/plain
-src/mame/drivers/segac2.c svneol=native#text/plain
-src/mame/drivers/segae.c svneol=native#text/plain
-src/mame/drivers/segae.h svneol=native#text/plain
-src/mame/drivers/segag80r.c svneol=native#text/plain
-src/mame/drivers/segag80v.c svneol=native#text/plain
-src/mame/drivers/segahang.c svneol=native#text/plain
-src/mame/drivers/segald.c svneol=native#text/plain
-src/mame/drivers/segaorun.c svneol=native#text/plain
-src/mame/drivers/segas16a.c svneol=native#text/plain
-src/mame/drivers/segas16b.c svneol=native#text/plain
-src/mame/drivers/segas18.c svneol=native#text/plain
-src/mame/drivers/segas24.c svneol=native#text/plain
-src/mame/drivers/segas32.c svneol=native#text/plain
-src/mame/drivers/segaxbd.c svneol=native#text/plain
-src/mame/drivers/segaybd.c svneol=native#text/plain
-src/mame/drivers/seibuspi.c svneol=native#text/plain
-src/mame/drivers/seicross.c svneol=native#text/plain
-src/mame/drivers/sengokmj.c svneol=native#text/plain
-src/mame/drivers/senjyo.c svneol=native#text/plain
-src/mame/drivers/seta.c svneol=native#text/plain
-src/mame/drivers/seta2.c svneol=native#text/plain
-src/mame/drivers/sf.c svneol=native#text/plain
-src/mame/drivers/sfbonus.c svneol=native#text/plain
-src/mame/drivers/sfkick.c svneol=native#text/plain
-src/mame/drivers/sg1000a.c svneol=native#text/plain
-src/mame/drivers/shadfrce.c svneol=native#text/plain
-src/mame/drivers/shangha3.c svneol=native#text/plain
-src/mame/drivers/shanghai.c svneol=native#text/plain
-src/mame/drivers/shangkid.c svneol=native#text/plain
-src/mame/drivers/shaolins.c svneol=native#text/plain
-src/mame/drivers/shisen.c svneol=native#text/plain
-src/mame/drivers/shootout.c svneol=native#text/plain
-src/mame/drivers/shougi.c svneol=native#text/plain
-src/mame/drivers/shuuz.c svneol=native#text/plain
-src/mame/drivers/sidearms.c svneol=native#text/plain
-src/mame/drivers/sidepckt.c svneol=native#text/plain
-src/mame/drivers/silkroad.c svneol=native#text/plain
-src/mame/drivers/simpl156.c svneol=native#text/plain
-src/mame/drivers/simpsons.c svneol=native#text/plain
-src/mame/drivers/skeetsht.c svneol=native#text/plain
-src/mame/drivers/skimaxx.c svneol=native#text/plain
-src/mame/drivers/skullxbo.c svneol=native#text/plain
-src/mame/drivers/skyarmy.c svneol=native#text/plain
-src/mame/drivers/skydiver.c svneol=native#text/plain
-src/mame/drivers/skyfox.c svneol=native#text/plain
-src/mame/drivers/skykid.c svneol=native#text/plain
-src/mame/drivers/skylncr.c svneol=native#text/plain
-src/mame/drivers/skyraid.c svneol=native#text/plain
-src/mame/drivers/slapfght.c svneol=native#text/plain
-src/mame/drivers/slapshot.c svneol=native#text/plain
-src/mame/drivers/sliver.c svneol=native#text/plain
-src/mame/drivers/slotcarn.c svneol=native#text/plain
-src/mame/drivers/sms.c svneol=native#text/plain
-src/mame/drivers/snesb.c svneol=native#text/plain
-src/mame/drivers/snk.c svneol=native#text/plain
-src/mame/drivers/snk6502.c svneol=native#text/plain
-src/mame/drivers/snk68.c svneol=native#text/plain
-src/mame/drivers/snookr10.c svneol=native#text/plain
-src/mame/drivers/snowbros.c svneol=native#text/plain
-src/mame/drivers/solomon.c svneol=native#text/plain
-src/mame/drivers/sonson.c svneol=native#text/plain
-src/mame/drivers/sothello.c svneol=native#text/plain
-src/mame/drivers/spacefb.c svneol=native#text/plain
-src/mame/drivers/spaceg.c svneol=native#text/plain
-src/mame/drivers/spbactn.c svneol=native#text/plain
-src/mame/drivers/spcforce.c svneol=native#text/plain
-src/mame/drivers/spdodgeb.c svneol=native#text/plain
-src/mame/drivers/speedatk.c svneol=native#text/plain
-src/mame/drivers/speedbal.c svneol=native#text/plain
-src/mame/drivers/speedspn.c svneol=native#text/plain
-src/mame/drivers/speglsht.c svneol=native#text/plain
-src/mame/drivers/spiders.c svneol=native#text/plain
-src/mame/drivers/splash.c svneol=native#text/plain
-src/mame/drivers/spoker.c svneol=native#text/plain
-src/mame/drivers/spool99.c svneol=native#text/plain
-src/mame/drivers/sprcros2.c svneol=native#text/plain
-src/mame/drivers/sprint2.c svneol=native#text/plain
-src/mame/drivers/sprint4.c svneol=native#text/plain
-src/mame/drivers/sprint8.c svneol=native#text/plain
-src/mame/drivers/spy.c svneol=native#text/plain
-src/mame/drivers/srmp2.c svneol=native#text/plain
-src/mame/drivers/srmp5.c svneol=native#text/plain
-src/mame/drivers/srmp6.c svneol=native#text/plain
-src/mame/drivers/srumbler.c svneol=native#text/plain
-src/mame/drivers/ssf2md.c svneol=native#text/plain
-src/mame/drivers/ssfindo.c svneol=native#text/plain
-src/mame/drivers/ssgbl.c svneol=native#text/plain
-src/mame/drivers/sshangha.c svneol=native#text/plain
-src/mame/drivers/ssingles.c svneol=native#text/plain
-src/mame/drivers/sslam.c svneol=native#text/plain
-src/mame/drivers/ssozumo.c svneol=native#text/plain
-src/mame/drivers/sspeedr.c svneol=native#text/plain
-src/mame/drivers/ssrj.c svneol=native#text/plain
-src/mame/drivers/sstrangr.c svneol=native#text/plain
-src/mame/drivers/ssv.c svneol=native#text/plain
-src/mame/drivers/st0016.c svneol=native#text/plain
-src/mame/drivers/stactics.c svneol=native#text/plain
-src/mame/drivers/stadhero.c svneol=native#text/plain
-src/mame/drivers/starcrus.c svneol=native#text/plain
-src/mame/drivers/starfire.c svneol=native#text/plain
-src/mame/drivers/starshp1.c svneol=native#text/plain
-src/mame/drivers/starwars.c svneol=native#text/plain
-src/mame/drivers/statriv2.c svneol=native#text/plain
-src/mame/drivers/stepstag.c svneol=native#text/plain
-src/mame/drivers/stfight.c svneol=native#text/plain
-src/mame/drivers/stlforce.c svneol=native#text/plain
-src/mame/drivers/strnskil.c svneol=native#text/plain
-src/mame/drivers/stv.c svneol=native#text/plain
-src/mame/drivers/stvinit.c svneol=native#text/plain
-src/mame/drivers/subs.c svneol=native#text/plain
-src/mame/drivers/subsino.c svneol=native#text/plain
-src/mame/drivers/suna16.c svneol=native#text/plain
-src/mame/drivers/suna8.c svneol=native#text/plain
-src/mame/drivers/supbtime.c svneol=native#text/plain
-src/mame/drivers/supdrapo.c svneol=native#text/plain
-src/mame/drivers/superchs.c svneol=native#text/plain
-src/mame/drivers/superdq.c svneol=native#text/plain
-src/mame/drivers/superqix.c svneol=native#text/plain
-src/mame/drivers/supertnk.c svneol=native#text/plain
-src/mame/drivers/suprgolf.c svneol=native#text/plain
-src/mame/drivers/suprloco.c svneol=native#text/plain
-src/mame/drivers/suprnova.c svneol=native#text/plain
-src/mame/drivers/suprridr.c svneol=native#text/plain
-src/mame/drivers/suprslam.c svneol=native#text/plain
-src/mame/drivers/surpratk.c svneol=native#text/plain
-src/mame/drivers/system1.c svneol=native#text/plain
-src/mame/drivers/system16.c svneol=native#text/plain
-src/mame/drivers/tagteam.c svneol=native#text/plain
-src/mame/drivers/tail2nos.c svneol=native#text/plain
-src/mame/drivers/taito_b.c svneol=native#text/plain
-src/mame/drivers/taito_f2.c svneol=native#text/plain
-src/mame/drivers/taito_f3.c svneol=native#text/plain
-src/mame/drivers/taito_h.c svneol=native#text/plain
-src/mame/drivers/taito_l.c svneol=native#text/plain
-src/mame/drivers/taito_o.c svneol=native#text/plain
-src/mame/drivers/taito_x.c svneol=native#text/plain
-src/mame/drivers/taito_z.c svneol=native#text/plain
-src/mame/drivers/taitoair.c svneol=native#text/plain
-src/mame/drivers/taitogn.c svneol=native#text/plain
-src/mame/drivers/taitojc.c svneol=native#text/plain
-src/mame/drivers/taitopjc.c svneol=native#text/plain
-src/mame/drivers/taitosj.c svneol=native#text/plain
-src/mame/drivers/taitotz.c svneol=native#text/plain
-src/mame/drivers/taitowlf.c svneol=native#text/plain
-src/mame/drivers/tank8.c svneol=native#text/plain
-src/mame/drivers/tankbatt.c svneol=native#text/plain
-src/mame/drivers/tankbust.c svneol=native#text/plain
-src/mame/drivers/taotaido.c svneol=native#text/plain
-src/mame/drivers/targeth.c svneol=native#text/plain
-src/mame/drivers/tarzan.c svneol=native#text/plain
-src/mame/drivers/tatsumi.c svneol=native#text/plain
-src/mame/drivers/tattack.c svneol=native#text/plain
-src/mame/drivers/taxidrvr.c svneol=native#text/plain
-src/mame/drivers/tbowl.c svneol=native#text/plain
-src/mame/drivers/tceptor.c svneol=native#text/plain
-src/mame/drivers/tcl.c svneol=native#text/plain
-src/mame/drivers/tecmo.c svneol=native#text/plain
-src/mame/drivers/tecmo16.c svneol=native#text/plain
-src/mame/drivers/tecmosys.c svneol=native#text/plain
-src/mame/drivers/tehkanwc.c svneol=native#text/plain
-src/mame/drivers/tempest.c svneol=native#text/plain
-src/mame/drivers/terracre.c svneol=native#text/plain
-src/mame/drivers/tetrisp2.c svneol=native#text/plain
-src/mame/drivers/thayers.c svneol=native#text/plain
-src/mame/drivers/thedeep.c svneol=native#text/plain
-src/mame/drivers/thepit.c svneol=native#text/plain
-src/mame/drivers/thief.c svneol=native#text/plain
-src/mame/drivers/thoop2.c svneol=native#text/plain
-src/mame/drivers/thunderj.c svneol=native#text/plain
-src/mame/drivers/thunderx.c svneol=native#text/plain
-src/mame/drivers/tiamc1.c svneol=native#text/plain
-src/mame/drivers/tickee.c svneol=native#text/plain
-src/mame/drivers/tigeroad.c svneol=native#text/plain
-src/mame/drivers/timelimt.c svneol=native#text/plain
-src/mame/drivers/timeplt.c svneol=native#text/plain
-src/mame/drivers/timetrv.c svneol=native#text/plain
-src/mame/drivers/tmaster.c svneol=native#text/plain
-src/mame/drivers/tmmjprd.c svneol=native#text/plain
-src/mame/drivers/tmnt.c svneol=native#text/plain
-src/mame/drivers/tnzs.c svneol=native#text/plain
-src/mame/drivers/toaplan1.c svneol=native#text/plain
-src/mame/drivers/toaplan2.c svneol=native#text/plain
-src/mame/drivers/toki.c svneol=native#text/plain
-src/mame/drivers/tokyocop.c svneol=native#text/plain
-src/mame/drivers/tomcat.c svneol=native#text/plain
-src/mame/drivers/toobin.c svneol=native#text/plain
-src/mame/drivers/topshoot.c svneol=native#text/plain
-src/mame/drivers/topspeed.c svneol=native#text/plain
-src/mame/drivers/toratora.c svneol=native#text/plain
-src/mame/drivers/tourtabl.c svneol=native#text/plain
-src/mame/drivers/toypop.c svneol=native#text/plain
-src/mame/drivers/tp84.c svneol=native#text/plain
-src/mame/drivers/trackfld.c svneol=native#text/plain
-src/mame/drivers/travrusa.c svneol=native#text/plain
-src/mame/drivers/triforce.c svneol=native#text/plain
-src/mame/drivers/triplhnt.c svneol=native#text/plain
-src/mame/drivers/truco.c svneol=native#text/plain
-src/mame/drivers/trucocl.c svneol=native#text/plain
-src/mame/drivers/trvmadns.c svneol=native#text/plain
-src/mame/drivers/trvquest.c svneol=native#text/plain
-src/mame/drivers/tryout.c svneol=native#text/plain
-src/mame/drivers/tsamurai.c svneol=native#text/plain
-src/mame/drivers/ttchamp.c svneol=native#text/plain
-src/mame/drivers/tubep.c svneol=native#text/plain
-src/mame/drivers/tugboat.c svneol=native#text/plain
-src/mame/drivers/tumbleb.c svneol=native#text/plain
-src/mame/drivers/tumblep.c svneol=native#text/plain
-src/mame/drivers/tunhunt.c svneol=native#text/plain
-src/mame/drivers/turbo.c svneol=native#text/plain
-src/mame/drivers/turrett.c svneol=native#text/plain
-src/mame/drivers/tutankhm.c svneol=native#text/plain
-src/mame/drivers/twin16.c svneol=native#text/plain
-src/mame/drivers/twincobr.c svneol=native#text/plain
-src/mame/drivers/twinkle.c svneol=native#text/plain
-src/mame/drivers/twins.c svneol=native#text/plain
-src/mame/drivers/tx1.c svneol=native#text/plain
-src/mame/drivers/uapce.c svneol=native#text/plain
-src/mame/drivers/ultraman.c svneol=native#text/plain
-src/mame/drivers/ultratnk.c svneol=native#text/plain
-src/mame/drivers/ultrsprt.c svneol=native#text/plain
-src/mame/drivers/undrfire.c svneol=native#text/plain
-src/mame/drivers/unico.c svneol=native#text/plain
-src/mame/drivers/upscope.c svneol=native#text/plain
-src/mame/drivers/usgames.c svneol=native#text/plain
-src/mame/drivers/vamphalf.c svneol=native#text/plain
-src/mame/drivers/vaportra.c svneol=native#text/plain
-src/mame/drivers/vastar.c svneol=native#text/plain
-src/mame/drivers/vball.c svneol=native#text/plain
-src/mame/drivers/vcombat.c svneol=native#text/plain
-src/mame/drivers/vegaeo.c svneol=native#text/plain
-src/mame/drivers/vegas.c svneol=native#text/plain
-src/mame/drivers/vendetta.c svneol=native#text/plain
-src/mame/drivers/vertigo.c svneol=native#text/plain
-src/mame/drivers/vicdual.c svneol=native#text/plain
-src/mame/drivers/victory.c svneol=native#text/plain
-src/mame/drivers/videopin.c svneol=native#text/plain
-src/mame/drivers/videopkr.c svneol=native#text/plain
-src/mame/drivers/vigilant.c svneol=native#text/plain
-src/mame/drivers/vindictr.c svneol=native#text/plain
-src/mame/drivers/viper.c svneol=native#text/plain
-src/mame/drivers/vmetal.c svneol=native#text/plain
-src/mame/drivers/volfied.c svneol=native#text/plain
-src/mame/drivers/vp101.c svneol=native#text/plain
-src/mame/drivers/vpoker.c svneol=native#text/plain
-src/mame/drivers/vroulet.c svneol=native#text/plain
-src/mame/drivers/vsnes.c svneol=native#text/plain
-src/mame/drivers/vulgus.c svneol=native#text/plain
-src/mame/drivers/wallc.c svneol=native#text/plain
-src/mame/drivers/wardner.c svneol=native#text/plain
-src/mame/drivers/warpwarp.c svneol=native#text/plain
-src/mame/drivers/warriorb.c svneol=native#text/plain
-src/mame/drivers/wc90.c svneol=native#text/plain
-src/mame/drivers/wc90b.c svneol=native#text/plain
-src/mame/drivers/wecleman.c svneol=native#text/plain
-src/mame/drivers/welltris.c svneol=native#text/plain
-src/mame/drivers/wgp.c svneol=native#text/plain
-src/mame/drivers/wheelfir.c svneol=native#text/plain
-src/mame/drivers/williams.c svneol=native#text/plain
-src/mame/drivers/wink.c svneol=native#text/plain
-src/mame/drivers/wiping.c svneol=native#text/plain
-src/mame/drivers/witch.c svneol=native#text/plain
-src/mame/drivers/wiz.c svneol=native#text/plain
-src/mame/drivers/wldarrow.c svneol=native#text/plain
-src/mame/drivers/wolfpack.c svneol=native#text/plain
-src/mame/drivers/wrally.c svneol=native#text/plain
-src/mame/drivers/wwfsstar.c svneol=native#text/plain
-src/mame/drivers/wwfwfest.c svneol=native#text/plain
-src/mame/drivers/xain.c svneol=native#text/plain
-src/mame/drivers/xexex.c svneol=native#text/plain
-src/mame/drivers/xmen.c svneol=native#text/plain
-src/mame/drivers/xorworld.c svneol=native#text/plain
-src/mame/drivers/xtheball.c svneol=native#text/plain
-src/mame/drivers/xxmissio.c svneol=native#text/plain
-src/mame/drivers/xybots.c svneol=native#text/plain
-src/mame/drivers/xyonix.c svneol=native#text/plain
-src/mame/drivers/yiear.c svneol=native#text/plain
-src/mame/drivers/yunsun16.c svneol=native#text/plain
-src/mame/drivers/yunsung8.c svneol=native#text/plain
-src/mame/drivers/zac2650.c svneol=native#text/plain
-src/mame/drivers/zaccaria.c svneol=native#text/plain
-src/mame/drivers/zaxxon.c svneol=native#text/plain
-src/mame/drivers/zerozone.c svneol=native#text/plain
-src/mame/drivers/zn.c svneol=native#text/plain
-src/mame/drivers/zodiack.c svneol=native#text/plain
-src/mame/drivers/zr107.c svneol=native#text/plain
-src/mame/etc/fd1094dp.c svneol=native#text/plain
-src/mame/etc/jrcrypt.c svneol=native#text/plain
-src/mame/includes/20pacgal.h svneol=native#text/plain
-src/mame/includes/8080bw.h svneol=native#text/plain
-src/mame/includes/aerofgt.h svneol=native#text/plain
-src/mame/includes/ajax.h svneol=native#text/plain
-src/mame/includes/amiga.h svneol=native#text/plain
-src/mame/includes/appoooh.h svneol=native#text/plain
-src/mame/includes/aquarium.h svneol=native#text/plain
-src/mame/includes/arabian.h svneol=native#text/plain
-src/mame/includes/arcadecl.h svneol=native#text/plain
-src/mame/includes/archimds.h svneol=native#text/plain
-src/mame/includes/argus.h svneol=native#text/plain
-src/mame/includes/arkanoid.h svneol=native#text/plain
-src/mame/includes/armedf.h svneol=native#text/plain
-src/mame/includes/artmagic.h svneol=native#text/plain
-src/mame/includes/asteroid.h svneol=native#text/plain
-src/mame/includes/astrocde.h svneol=native#text/plain
-src/mame/includes/astrof.h svneol=native#text/plain
-src/mame/includes/atari.h svneol=native#text/plain
-src/mame/includes/atarifb.h svneol=native#text/plain
-src/mame/includes/atarig1.h svneol=native#text/plain
-src/mame/includes/atarig42.h svneol=native#text/plain
-src/mame/includes/atarigt.h svneol=native#text/plain
-src/mame/includes/atarigx2.h svneol=native#text/plain
-src/mame/includes/atarisy1.h svneol=native#text/plain
-src/mame/includes/atarisy2.h svneol=native#text/plain
-src/mame/includes/atetris.h svneol=native#text/plain
-src/mame/includes/attckufo.h svneol=native#text/plain
-src/mame/includes/avalnche.h svneol=native#text/plain
-src/mame/includes/aztarac.h svneol=native#text/plain
-src/mame/includes/badlands.h svneol=native#text/plain
-src/mame/includes/bagman.h svneol=native#text/plain
-src/mame/includes/balsente.h svneol=native#text/plain
-src/mame/includes/batman.h svneol=native#text/plain
-src/mame/includes/beathead.h svneol=native#text/plain
-src/mame/includes/beezer.h svneol=native#text/plain
-src/mame/includes/bigevglf.h svneol=native#text/plain
-src/mame/includes/blockade.h svneol=native#text/plain
-src/mame/includes/blstroid.h svneol=native#text/plain
-src/mame/includes/bsktball.h svneol=native#text/plain
-src/mame/includes/btime.h svneol=native#text/plain
-src/mame/includes/btoads.h svneol=native#text/plain
-src/mame/includes/bublbobl.h svneol=native#text/plain
-src/mame/includes/buggychl.h svneol=native#text/plain
-src/mame/includes/bzone.h svneol=native#text/plain
-src/mame/includes/canyon.h svneol=native#text/plain
-src/mame/includes/capbowl.h svneol=native#text/plain
-src/mame/includes/carpolo.h svneol=native#text/plain
-src/mame/includes/cave.h svneol=native#text/plain
-src/mame/includes/ccastles.h svneol=native#text/plain
-src/mame/includes/cchasm.h svneol=native#text/plain
-src/mame/includes/cchip.h svneol=native#text/plain
-src/mame/includes/cclimber.h svneol=native#text/plain
-src/mame/includes/centiped.h svneol=native#text/plain
-src/mame/includes/chaknpop.h svneol=native#text/plain
-src/mame/includes/changela.h svneol=native#text/plain
-src/mame/includes/cidelsa.h svneol=native#text/plain
-src/mame/includes/cinemat.h svneol=native#text/plain
-src/mame/includes/circus.h svneol=native#text/plain
-src/mame/includes/cloak.h svneol=native#text/plain
-src/mame/includes/cloud9.h svneol=native#text/plain
-src/mame/includes/cninja.h svneol=native#text/plain
-src/mame/includes/copsnrob.h svneol=native#text/plain
-src/mame/includes/cps1.h svneol=native#text/plain
-src/mame/includes/cps3.h svneol=native#text/plain
-src/mame/includes/crbaloon.h svneol=native#text/plain
-src/mame/includes/crgolf.h svneol=native#text/plain
-src/mame/includes/crshrace.h svneol=native#text/plain
-src/mame/includes/cubocd32.h svneol=native#text/plain
-src/mame/includes/cvs.h svneol=native#text/plain
-src/mame/includes/cyberbal.h svneol=native#text/plain
-src/mame/includes/dc.h svneol=native#text/plain
-src/mame/includes/dcheese.h svneol=native#text/plain
-src/mame/includes/dec0.h svneol=native#text/plain
-src/mame/includes/dec8.h svneol=native#text/plain
-src/mame/includes/deco16ic.h svneol=native#text/plain
-src/mame/includes/deco32.h svneol=native#text/plain
-src/mame/includes/decocrpt.h svneol=native#text/plain
-src/mame/includes/decoprot.h svneol=native#text/plain
-src/mame/includes/dkong.h svneol=native#text/plain
-src/mame/includes/docastle.h svneol=native#text/plain
-src/mame/includes/dogfgt.h svneol=native#text/plain
-src/mame/includes/dooyong.h svneol=native#text/plain
-src/mame/includes/dragrace.h svneol=native#text/plain
-src/mame/includes/drgnmst.h svneol=native#text/plain
-src/mame/includes/dribling.h svneol=native#text/plain
-src/mame/includes/dynax.h svneol=native#text/plain
-src/mame/includes/eolithsp.h svneol=native#text/plain
-src/mame/includes/epos.h svneol=native#text/plain
-src/mame/includes/eprom.h svneol=native#text/plain
-src/mame/includes/equites.h svneol=native#text/plain
-src/mame/includes/espial.h svneol=native#text/plain
-src/mame/includes/esripsys.h svneol=native#text/plain
-src/mame/includes/exerion.h svneol=native#text/plain
-src/mame/includes/exidy.h svneol=native#text/plain
-src/mame/includes/exidy440.h svneol=native#text/plain
-src/mame/includes/exterm.h svneol=native#text/plain
-src/mame/includes/f1gp.h svneol=native#text/plain
-src/mame/includes/fastfred.h svneol=native#text/plain
-src/mame/includes/fgoal.h svneol=native#text/plain
-src/mame/includes/firetrk.h svneol=native#text/plain
-src/mame/includes/fitfight.h svneol=native#text/plain
-src/mame/includes/flower.h svneol=native#text/plain
-src/mame/includes/flstory.h svneol=native#text/plain
-src/mame/includes/foodf.h svneol=native#text/plain
-src/mame/includes/fromanc2.h svneol=native#text/plain
-src/mame/includes/fromance.h svneol=native#text/plain
-src/mame/includes/gaelco2.h svneol=native#text/plain
-src/mame/includes/gaelco3d.h svneol=native#text/plain
-src/mame/includes/gaelcrpt.h svneol=native#text/plain
-src/mame/includes/galaga.h svneol=native#text/plain
-src/mame/includes/galaxian.h svneol=native#text/plain
-src/mame/includes/galaxold.h svneol=native#text/plain
-src/mame/includes/gameplan.h svneol=native#text/plain
-src/mame/includes/gaplus.h svneol=native#text/plain
-src/mame/includes/gauntlet.h svneol=native#text/plain
-src/mame/includes/gcpinbal.h svneol=native#text/plain
-src/mame/includes/genesis.h svneol=native#text/plain
-src/mame/includes/gomoku.h svneol=native#text/plain
-src/mame/includes/gottlieb.h svneol=native#text/plain
-src/mame/includes/gotya.h svneol=native#text/plain
-src/mame/includes/grchamp.h svneol=native#text/plain
-src/mame/includes/gridlee.h svneol=native#text/plain
-src/mame/includes/gstriker.h svneol=native#text/plain
-src/mame/includes/harddriv.h svneol=native#text/plain
-src/mame/includes/hitme.h svneol=native#text/plain
-src/mame/includes/homedata.h svneol=native#text/plain
-src/mame/includes/hyprduel.h svneol=native#text/plain
-src/mame/includes/inufuku.h svneol=native#text/plain
-src/mame/includes/iqblock.h svneol=native#text/plain
-src/mame/includes/iremipt.h svneol=native#text/plain
-src/mame/includes/irobot.h svneol=native#text/plain
-src/mame/includes/itech32.h svneol=native#text/plain
-src/mame/includes/itech8.h svneol=native#text/plain
-src/mame/includes/jackal.h svneol=native#text/plain
-src/mame/includes/jaguar.h svneol=native#text/plain
-src/mame/includes/jedi.h svneol=native#text/plain
-src/mame/includes/jpmimpct.h svneol=native#text/plain
-src/mame/includes/kaneko16.h svneol=native#text/plain
-src/mame/includes/kangaroo.h svneol=native#text/plain
-src/mame/includes/klax.h svneol=native#text/plain
-src/mame/includes/konamipt.h svneol=native#text/plain
-src/mame/includes/kyugo.h svneol=native#text/plain
-src/mame/includes/lasso.h svneol=native#text/plain
-src/mame/includes/lazercmd.h svneol=native#text/plain
-src/mame/includes/legionna.h svneol=native#text/plain
-src/mame/includes/leland.h svneol=native#text/plain
-src/mame/includes/lemmings.h svneol=native#text/plain
-src/mame/includes/lethalj.h svneol=native#text/plain
-src/mame/includes/liberatr.h svneol=native#text/plain
-src/mame/includes/lkage.h svneol=native#text/plain
-src/mame/includes/lockon.h svneol=native#text/plain
-src/mame/includes/lordgun.h svneol=native#text/plain
-src/mame/includes/lsasquad.h svneol=native#text/plain
-src/mame/includes/lwings.h svneol=native#text/plain
-src/mame/includes/m10.h svneol=native#text/plain
-src/mame/includes/m107.h svneol=native#text/plain
-src/mame/includes/m52.h svneol=native#text/plain
-src/mame/includes/m57.h svneol=native#text/plain
-src/mame/includes/m58.h svneol=native#text/plain
-src/mame/includes/m62.h svneol=native#text/plain
-src/mame/includes/m72.h svneol=native#text/plain
-src/mame/includes/m79amb.h svneol=native#text/plain
-src/mame/includes/m92.h svneol=native#text/plain
-src/mame/includes/madalien.h svneol=native#text/plain
-src/mame/includes/mario.h svneol=native#text/plain
-src/mame/includes/matmania.h svneol=native#text/plain
-src/mame/includes/mcatadv.h svneol=native#text/plain
-src/mame/includes/mcr.h svneol=native#text/plain
-src/mame/includes/meadows.h svneol=native#text/plain
-src/mame/includes/megasys1.h svneol=native#text/plain
-src/mame/includes/mexico86.h svneol=native#text/plain
-src/mame/includes/mhavoc.h svneol=native#text/plain
-src/mame/includes/midtunit.h svneol=native#text/plain
-src/mame/includes/midvunit.h svneol=native#text/plain
-src/mame/includes/midwunit.h svneol=native#text/plain
-src/mame/includes/midyunit.h svneol=native#text/plain
-src/mame/includes/midzeus.h svneol=native#text/plain
-src/mame/includes/model1.h svneol=native#text/plain
-src/mame/includes/model2.h svneol=native#text/plain
-src/mame/includes/model3.h svneol=native#text/plain
-src/mame/includes/ms32.h svneol=native#text/plain
-src/mame/includes/mw8080bw.h svneol=native#text/plain
-src/mame/includes/mystston.h svneol=native#text/plain
-src/mame/includes/n64.h svneol=native#text/plain
-src/mame/includes/n8080.h svneol=native#text/plain
-src/mame/includes/namcoic.h svneol=native#text/plain
-src/mame/includes/namcona1.h svneol=native#text/plain
-src/mame/includes/namconb1.h svneol=native#text/plain
-src/mame/includes/namcond1.h svneol=native#text/plain
-src/mame/includes/namcos1.h svneol=native#text/plain
-src/mame/includes/namcos2.h svneol=native#text/plain
-src/mame/includes/namcos21.h svneol=native#text/plain
-src/mame/includes/namcos22.h svneol=native#text/plain
-src/mame/includes/naomi.h svneol=native#text/plain
-src/mame/includes/naomibd.h svneol=native#text/plain
-src/mame/includes/nb1413m3.h svneol=native#text/plain
-src/mame/includes/nbmj8688.h svneol=native#text/plain
-src/mame/includes/nbmj8891.h svneol=native#text/plain
-src/mame/includes/nbmj8991.h svneol=native#text/plain
-src/mame/includes/nbmj9195.h svneol=native#text/plain
-src/mame/includes/nemesis.h svneol=native#text/plain
-src/mame/includes/neogeo.h svneol=native#text/plain
-src/mame/includes/news.h svneol=native#text/plain
-src/mame/includes/ninjakd2.h svneol=native#text/plain
-src/mame/includes/nitedrvr.h svneol=native#text/plain
-src/mame/includes/niyanpai.h svneol=native#text/plain
-src/mame/includes/nmk16.h svneol=native#text/plain
-src/mame/includes/nova2001.h svneol=native#text/plain
-src/mame/includes/nycaptor.h svneol=native#text/plain
-src/mame/includes/offtwall.h svneol=native#text/plain
-src/mame/includes/oneshot.h svneol=native#text/plain
-src/mame/includes/orbit.h svneol=native#text/plain
-src/mame/includes/pacman.h svneol=native#text/plain
-src/mame/includes/paradise.h svneol=native#text/plain
-src/mame/includes/pgm.h svneol=native#text/plain
-src/mame/includes/phoenix.h svneol=native#text/plain
-src/mame/includes/pitnrun.h svneol=native#text/plain
-src/mame/includes/pk8000.h svneol=native#text/plain
-src/mame/includes/playch10.h svneol=native#text/plain
-src/mame/includes/playmark.h svneol=native#text/plain
-src/mame/includes/polepos.h svneol=native#text/plain
-src/mame/includes/policetr.h svneol=native#text/plain
-src/mame/includes/polyplay.h svneol=native#text/plain
-src/mame/includes/poolshrk.h svneol=native#text/plain
-src/mame/includes/pooyan.h svneol=native#text/plain
-src/mame/includes/psikyosh.h svneol=native#text/plain
-src/mame/includes/psx.h svneol=native#text/plain
-src/mame/includes/qix.h svneol=native#text/plain
-src/mame/includes/raiden2.h svneol=native#text/plain
-src/mame/includes/rampart.h svneol=native#text/plain
-src/mame/includes/realbrk.h svneol=native#text/plain
-src/mame/includes/redalert.h svneol=native#text/plain
-src/mame/includes/relief.h svneol=native#text/plain
-src/mame/includes/retofinv.h svneol=native#text/plain
-src/mame/includes/segag80r.h svneol=native#text/plain
-src/mame/includes/segag80v.h svneol=native#text/plain
-src/mame/includes/segas24.h svneol=native#text/plain
-src/mame/includes/segas32.h svneol=native#text/plain
-src/mame/includes/sei_crtc.h svneol=native#text/plain
-src/mame/includes/seibuspi.h svneol=native#text/plain
-src/mame/includes/senjyo.h svneol=native#text/plain
-src/mame/includes/seta.h svneol=native#text/plain
-src/mame/includes/shuuz.h svneol=native#text/plain
-src/mame/includes/simpsons.h svneol=native#text/plain
-src/mame/includes/skullxbo.h svneol=native#text/plain
-src/mame/includes/skydiver.h svneol=native#text/plain
-src/mame/includes/slapfght.h svneol=native#text/plain
-src/mame/includes/slapstic.h svneol=native#text/plain
-src/mame/includes/snes.h svneol=native#text/plain
-src/mame/includes/snk.h svneol=native#text/plain
-src/mame/includes/snk6502.h svneol=native#text/plain
-src/mame/includes/spacefb.h svneol=native#text/plain
-src/mame/includes/spiders.h svneol=native#text/plain
-src/mame/includes/sprint2.h svneol=native#text/plain
-src/mame/includes/sprint8.h svneol=native#text/plain
-src/mame/includes/sspeedr.h svneol=native#text/plain
-src/mame/includes/st0016.h svneol=native#text/plain
-src/mame/includes/stactics.h svneol=native#text/plain
-src/mame/includes/starfire.h svneol=native#text/plain
-src/mame/includes/starshp1.h svneol=native#text/plain
-src/mame/includes/starwars.h svneol=native#text/plain
-src/mame/includes/stfight.h svneol=native#text/plain
-src/mame/includes/stv.h svneol=native#text/plain
-src/mame/includes/subs.h svneol=native#text/plain
-src/mame/includes/suna8.h svneol=native#text/plain
-src/mame/includes/suprnova.h svneol=native#text/plain
-src/mame/includes/suprridr.h svneol=native#text/plain
-src/mame/includes/system16.h svneol=native#text/plain
-src/mame/includes/taito_b.h svneol=native#text/plain
-src/mame/includes/taito_f2.h svneol=native#text/plain
-src/mame/includes/taito_f3.h svneol=native#text/plain
-src/mame/includes/taito_l.h svneol=native#text/plain
-src/mame/includes/taitoipt.h svneol=native#text/plain
-src/mame/includes/taitosj.h svneol=native#text/plain
-src/mame/includes/tank8.h svneol=native#text/plain
-src/mame/includes/taotaido.h svneol=native#text/plain
-src/mame/includes/targ.h svneol=native#text/plain
-src/mame/includes/tatsumi.h svneol=native#text/plain
-src/mame/includes/taxidrvr.h svneol=native#text/plain
-src/mame/includes/tecmosys.h svneol=native#text/plain
-src/mame/includes/tetrisp2.h svneol=native#text/plain
-src/mame/includes/thedeep.h svneol=native#text/plain
-src/mame/includes/thunderj.h svneol=native#text/plain
-src/mame/includes/tiamc1.h svneol=native#text/plain
-src/mame/includes/timeplt.h svneol=native#text/plain
-src/mame/includes/tmnt.h svneol=native#text/plain
-src/mame/includes/tnzs.h svneol=native#text/plain
-src/mame/includes/toaplan1.h svneol=native#text/plain
-src/mame/includes/toaplan2.h svneol=native#text/plain
-src/mame/includes/toobin.h svneol=native#text/plain
-src/mame/includes/trackfld.h svneol=native#text/plain
-src/mame/includes/triplhnt.h svneol=native#text/plain
-src/mame/includes/tubep.h svneol=native#text/plain
-src/mame/includes/tumbleb.h svneol=native#text/plain
-src/mame/includes/turbo.h svneol=native#text/plain
-src/mame/includes/tutankhm.h svneol=native#text/plain
-src/mame/includes/twin16.h svneol=native#text/plain
-src/mame/includes/twincobr.h svneol=native#text/plain
-src/mame/includes/tx1.h svneol=native#text/plain
-src/mame/includes/ultratnk.h svneol=native#text/plain
-src/mame/includes/unico.h svneol=native#text/plain
-src/mame/includes/vball.h svneol=native#text/plain
-src/mame/includes/vertigo.h svneol=native#text/plain
-src/mame/includes/vicdual.h svneol=native#text/plain
-src/mame/includes/victory.h svneol=native#text/plain
-src/mame/includes/videopin.h svneol=native#text/plain
-src/mame/includes/vindictr.h svneol=native#text/plain
-src/mame/includes/vsnes.h svneol=native#text/plain
-src/mame/includes/warpwarp.h svneol=native#text/plain
-src/mame/includes/wc90.h svneol=native#text/plain
-src/mame/includes/williams.h svneol=native#text/plain
-src/mame/includes/wiping.h svneol=native#text/plain
-src/mame/includes/wrally.h svneol=native#text/plain
-src/mame/includes/wwfwfest.h svneol=native#text/plain
-src/mame/includes/xmen.h svneol=native#text/plain
-src/mame/includes/xybots.h svneol=native#text/plain
-src/mame/includes/zaxxon.h svneol=native#text/plain
-src/mame/layout/280zzzap.lay svneol=native#text/plain
-src/mame/layout/abaseb.lay svneol=native#text/plain
-src/mame/layout/ampoker2.lay svneol=native#text/plain
-src/mame/layout/armora.lay svneol=native#text/plain
-src/mame/layout/atarifb.lay svneol=native#text/plain
-src/mame/layout/atarifb4.lay svneol=native#text/plain
-src/mame/layout/avalnche.lay svneol=native#text/plain
-src/mame/layout/awpdmd.lay svneol=native#text/plain
-src/mame/layout/awpvid14.lay svneol=native#text/plain
-src/mame/layout/awpvid16.lay svneol=native#text/plain
-src/mame/layout/babydad.lay svneol=native#text/plain
-src/mame/layout/babypkr.lay svneol=native#text/plain
-src/mame/layout/bfm_sc1.lay svneol=native#text/plain
-src/mame/layout/bfm_sc2.lay svneol=native#text/plain
-src/mame/layout/blckjack.lay svneol=native#text/plain
-src/mame/layout/buckrog.lay svneol=native#text/plain
-src/mame/layout/buggybjr.lay svneol=native#text/plain
-src/mame/layout/buggyboy.lay svneol=native#text/plain
-src/mame/layout/buggychl.lay svneol=native#text/plain
-src/mame/layout/bzone.lay svneol=native#text/plain
-src/mame/layout/cardline.lay svneol=native#text/plain
-src/mame/layout/cbombers.lay svneol=native#text/plain
-src/mame/layout/changela.lay svneol=native#text/plain
-src/mame/layout/chqflag.lay svneol=native#text/plain
-src/mame/layout/circus.lay svneol=native#text/plain
-src/mame/layout/clowns.lay svneol=native#text/plain
-src/mame/layout/connect4.lay svneol=native#text/plain
-src/mame/layout/contcirc.lay svneol=native#text/plain
-src/mame/layout/copsnrob.lay svneol=native#text/plain
-src/mame/layout/crash.lay svneol=native#text/plain
-src/mame/layout/crusnexo.lay svneol=native#text/plain
-src/mame/layout/darius.lay svneol=native#text/plain
-src/mame/layout/dblaxle.lay svneol=native#text/plain
-src/mame/layout/deadeye.lay svneol=native#text/plain
-src/mame/layout/dlair.lay svneol=native#text/plain
-src/mame/layout/drwho.lay svneol=native#text/plain
-src/mame/layout/elecyoyo.lay svneol=native#text/plain
-src/mame/layout/fashion.lay svneol=native#text/plain
-src/mame/layout/finallap.lay svneol=native#text/plain
-src/mame/layout/firebeat.lay svneol=native#text/plain
-src/mame/layout/funworld.lay svneol=native#text/plain
-src/mame/layout/galaxi.lay -text svneol=native#plain/text
-src/mame/layout/gamball.lay svneol=native#text/plain
-src/mame/layout/geebee.lay svneol=native#text/plain
-src/mame/layout/gldncrwn.lay svneol=native#text/plain
-src/mame/layout/goldnpkr.lay svneol=native#text/plain
-src/mame/layout/gorf.lay svneol=native#text/plain
-src/mame/layout/grchamp.lay svneol=native#text/plain
-src/mame/layout/gridiron.lay svneol=native#text/plain
-src/mame/layout/gypsyjug.lay svneol=native#text/plain
-src/mame/layout/igspoker.lay svneol=native#text/plain
-src/mame/layout/invad2ct.lay svneol=native#text/plain
-src/mame/layout/invaders.lay svneol=native#text/plain
-src/mame/layout/invrvnge.lay svneol=native#text/plain
-src/mame/layout/lagunar.lay svneol=native#text/plain
-src/mame/layout/lazercmd.lay svneol=native#text/plain
-src/mame/layout/lucky74.lay svneol=native#text/plain
-src/mame/layout/maxaflex.lay svneol=native#text/plain
-src/mame/layout/mil4000.lay svneol=native#text/plain
-src/mame/layout/mpoker.lay svneol=native#text/plain
-src/mame/layout/mpu4.lay svneol=native#text/plain
-src/mame/layout/nbmj8688.lay svneol=native#text/plain
-src/mame/layout/neogeo.lay svneol=native#text/plain
-src/mame/layout/outrun.lay svneol=native#text/plain
-src/mame/layout/overdriv.lay svneol=native#text/plain
-src/mame/layout/paradice.lay svneol=native#text/plain
-src/mame/layout/pdrift.lay svneol=native#text/plain
-src/mame/layout/pe_bjack.lay svneol=native#text/plain
-src/mame/layout/pe_keno.lay svneol=native#text/plain
-src/mame/layout/pe_poker.lay svneol=native#text/plain
-src/mame/layout/pe_schip.lay svneol=native#text/plain
-src/mame/layout/pe_slots.lay svneol=native#text/plain
-src/mame/layout/peplus.lay svneol=native#text/plain
-src/mame/layout/pirpok2.lay svneol=native#text/plain
-src/mame/layout/pmpoker.lay svneol=native#text/plain
-src/mame/layout/pmroulet.lay -text svneol=native#plain/text
-src/mame/layout/poker41.lay svneol=native#text/plain
-src/mame/layout/pokio.lay svneol=native#text/plain
-src/mame/layout/polepos.lay svneol=native#text/plain
-src/mame/layout/pulltabs.lay svneol=native#text/plain
-src/mame/layout/pyramid.lay svneol=native#text/plain
-src/mame/layout/quintoon.lay svneol=native#text/plain
-src/mame/layout/radr.lay svneol=native#text/plain
-src/mame/layout/re900.lay svneol=native#text/plain
-src/mame/layout/rocknms.lay svneol=native#text/plain
-src/mame/layout/roul.lay svneol=native#text/plain
-src/mame/layout/roundup5.lay svneol=native#text/plain
-src/mame/layout/sbrkout.lay svneol=native#text/plain
-src/mame/layout/sderby.lay svneol=native#text/plain
-src/mame/layout/sgsafari.lay svneol=native#text/plain
-src/mame/layout/shuttlei.lay svneol=native#text/plain
-src/mame/layout/sidewndr.lay svneol=native#text/plain
-src/mame/layout/sigmapkr.lay svneol=native#text/plain
-src/mame/layout/slots.lay svneol=native#text/plain
-src/mame/layout/sltblgpo.lay svneol=native#text/plain
-src/mame/layout/sltblgtk.lay svneol=native#text/plain
-src/mame/layout/snookr10.lay svneol=native#text/plain
-src/mame/layout/solarq.lay svneol=native#text/plain
-src/mame/layout/sos.lay svneol=native#text/plain
-src/mame/layout/spacewin.lay -text svneol=native#plain/text
-src/mame/layout/sspeedr.lay svneol=native#text/plain
-src/mame/layout/stactics.lay svneol=native#text/plain
-src/mame/layout/starcas.lay svneol=native#text/plain
-src/mame/layout/stepstag.lay svneol=native#text/plain
-src/mame/layout/stocker.lay svneol=native#text/plain
-src/mame/layout/subroc3d.lay svneol=native#text/plain
-src/mame/layout/superchs.lay svneol=native#text/plain
-src/mame/layout/tceptor2.lay svneol=native#text/plain
-src/mame/layout/tenpindx.lay svneol=native#text/plain
-src/mame/layout/tinv2650.lay svneol=native#text/plain
-src/mame/layout/topspeed.lay svneol=native#text/plain
-src/mame/layout/turbo.lay svneol=native#text/plain
-src/mame/layout/turbotag.lay svneol=native#text/plain
-src/mame/layout/tx1.lay svneol=native#text/plain
-src/mame/layout/videocba.lay svneol=native#text/plain
-src/mame/layout/videodad.lay svneol=native#text/plain
-src/mame/layout/videopin.lay svneol=native#text/plain
-src/mame/layout/videopkr.lay svneol=native#text/plain
-src/mame/layout/wecleman.lay svneol=native#text/plain
-src/mame/machine/acitya.c svneol=native#text/plain
-src/mame/machine/ajax.c svneol=native#text/plain
-src/mame/machine/amiga.c svneol=native#text/plain
-src/mame/machine/archimds.c svneol=native#text/plain
-src/mame/machine/arkanoid.c svneol=native#text/plain
-src/mame/machine/asic65.c svneol=native#text/plain
-src/mame/machine/asic65.h svneol=native#text/plain
-src/mame/machine/asteroid.c svneol=native#text/plain
-src/mame/machine/atari.c svneol=native#text/plain
-src/mame/machine/atari_vg.c svneol=native#text/plain
-src/mame/machine/atari_vg.h svneol=native#text/plain
-src/mame/machine/atarifb.c svneol=native#text/plain
-src/mame/machine/atarigen.c svneol=native#text/plain
-src/mame/machine/atarigen.h svneol=native#text/plain
-src/mame/machine/bagman.c svneol=native#text/plain
-src/mame/machine/balsente.c svneol=native#text/plain
-src/mame/machine/beezer.c svneol=native#text/plain
-src/mame/machine/bfm_bd1.c svneol=native#text/plain
-src/mame/machine/bfm_bd1.h svneol=native#text/plain
-src/mame/machine/bigevglf.c svneol=native#text/plain
-src/mame/machine/bonzeadv.c svneol=native#text/plain
-src/mame/machine/bsktball.c svneol=native#text/plain
-src/mame/machine/btime.c svneol=native#text/plain
-src/mame/machine/bublbobl.c svneol=native#text/plain
-src/mame/machine/buggychl.c svneol=native#text/plain
-src/mame/machine/carpolo.c svneol=native#text/plain
-src/mame/machine/cchasm.c svneol=native#text/plain
-src/mame/machine/cchip.c svneol=native#text/plain
-src/mame/machine/cclimber.c svneol=native#text/plain
-src/mame/machine/chaknpop.c svneol=native#text/plain
-src/mame/machine/copsnrob.c svneol=native#text/plain
-src/mame/machine/cps2crpt.c svneol=native#text/plain
-src/mame/machine/cubocd32.c svneol=native#text/plain
-src/mame/machine/daikaiju.c svneol=native#text/plain
-src/mame/machine/dc.c svneol=native#text/plain
-src/mame/machine/dec0.c svneol=native#text/plain
-src/mame/machine/deco102.c svneol=native#text/plain
-src/mame/machine/deco156.c svneol=native#text/plain
-src/mame/machine/decocass.c svneol=native#text/plain
-src/mame/machine/decocass.h svneol=native#text/plain
-src/mame/machine/decocrpt.c svneol=native#text/plain
-src/mame/machine/decoprot.c svneol=native#text/plain
-src/mame/machine/docastle.c svneol=native#text/plain
-src/mame/machine/fd1089.c svneol=native#text/plain
-src/mame/machine/fd1089.h svneol=native#text/plain
-src/mame/machine/fd1094.c svneol=native#text/plain
-src/mame/machine/fd1094.h svneol=native#text/plain
-src/mame/machine/fddebug.c svneol=native#text/plain
-src/mame/machine/fddebug.h svneol=native#text/plain
-src/mame/machine/flstory.c svneol=native#text/plain
-src/mame/machine/gaelco2.c svneol=native#text/plain
-src/mame/machine/gaelcrpt.c svneol=native#text/plain
-src/mame/machine/galaxold.c svneol=native#text/plain
-src/mame/machine/gaplus.c svneol=native#text/plain
-src/mame/machine/gdcrypt.c svneol=native#text/plain
-src/mame/machine/harddriv.c svneol=native#text/plain
-src/mame/machine/irem_cpu.c svneol=native#text/plain
-src/mame/machine/irem_cpu.h svneol=native#text/plain
-src/mame/machine/irobot.c svneol=native#text/plain
-src/mame/machine/jackal.c svneol=native#text/plain
-src/mame/machine/jumpshot.c svneol=native#text/plain
-src/mame/machine/kabuki.c svneol=native#text/plain
-src/mame/machine/kaneko16.c svneol=native#text/plain
-src/mame/machine/kanekotb.h svneol=native#text/plain
-src/mame/machine/konami1.c svneol=native#text/plain
-src/mame/machine/konami1.h svneol=native#text/plain
-src/mame/machine/konamigx.c svneol=native#text/plain
-src/mame/machine/konamigx.h svneol=native#text/plain
-src/mame/machine/konamiic.c svneol=native#text/plain
-src/mame/machine/konamiic.h svneol=native#text/plain
-src/mame/machine/konppc.c svneol=native#text/plain
-src/mame/machine/konppc.h svneol=native#text/plain
-src/mame/machine/leland.c svneol=native#text/plain
-src/mame/machine/lkage.c svneol=native#text/plain
-src/mame/machine/lsasquad.c svneol=native#text/plain
-src/mame/machine/m68kfmly.c svneol=native#text/plain
-src/mame/machine/m68kfmly.h svneol=native#text/plain
-src/mame/machine/maniach.c svneol=native#text/plain
-src/mame/machine/mathbox.c svneol=native#text/plain
-src/mame/machine/mathbox.h svneol=native#text/plain
-src/mame/machine/mb14241.c svneol=native#text/plain
-src/mame/machine/mb14241.h svneol=native#text/plain
-src/mame/machine/mc8123.c svneol=native#text/plain
-src/mame/machine/mc8123.h svneol=native#text/plain
-src/mame/machine/mcr.c svneol=native#text/plain
-src/mame/machine/meters.c svneol=native#text/plain
-src/mame/machine/meters.h svneol=native#text/plain
-src/mame/machine/mexico86.c svneol=native#text/plain
-src/mame/machine/mhavoc.c svneol=native#text/plain
-src/mame/machine/midtunit.c svneol=native#text/plain
-src/mame/machine/midwayic.c svneol=native#text/plain
-src/mame/machine/midwayic.h svneol=native#text/plain
-src/mame/machine/midwunit.c svneol=native#text/plain
-src/mame/machine/midyunit.c svneol=native#text/plain
-src/mame/machine/model1.c svneol=native#text/plain
-src/mame/machine/model3.c svneol=native#text/plain
-src/mame/machine/mw8080bw.c svneol=native#text/plain
-src/mame/machine/n64.c svneol=native#text/plain
-src/mame/machine/namco06.c svneol=native#text/plain
-src/mame/machine/namco06.h svneol=native#text/plain
-src/mame/machine/namco50.c svneol=native#text/plain
-src/mame/machine/namco50.h svneol=native#text/plain
-src/mame/machine/namco51.c svneol=native#text/plain
-src/mame/machine/namco51.h svneol=native#text/plain
-src/mame/machine/namco53.c svneol=native#text/plain
-src/mame/machine/namco53.h svneol=native#text/plain
-src/mame/machine/namcoio.c svneol=native#text/plain
-src/mame/machine/namcoio.h svneol=native#text/plain
-src/mame/machine/namcond1.c svneol=native#text/plain
-src/mame/machine/namcos1.c svneol=native#text/plain
-src/mame/machine/namcos2.c svneol=native#text/plain
-src/mame/machine/naomi.c svneol=native#text/plain
-src/mame/machine/naomibd.c svneol=native#text/plain
-src/mame/machine/nb1413m3.c svneol=native#text/plain
-src/mame/machine/neoboot.c svneol=native#text/plain
-src/mame/machine/neocrypt.c svneol=native#text/plain
-src/mame/machine/neoprot.c svneol=native#text/plain
-src/mame/machine/nitedrvr.c svneol=native#text/plain
-src/mame/machine/nmk004.c svneol=native#text/plain
-src/mame/machine/nmk004.h svneol=native#text/plain
-src/mame/machine/nmk112.c svneol=native#text/plain
-src/mame/machine/nmk112.h svneol=native#text/plain
-src/mame/machine/nycaptor.c svneol=native#text/plain
-src/mame/machine/opwolf.c svneol=native#text/plain
-src/mame/machine/pacplus.c svneol=native#text/plain
-src/mame/machine/pcecommn.c svneol=native#text/plain
-src/mame/machine/pcecommn.h svneol=native#text/plain
-src/mame/machine/pckeybrd.c svneol=native#text/plain
-src/mame/machine/pcshare.c svneol=native#text/plain
-src/mame/machine/pgmcrypt.c svneol=native#text/plain
-src/mame/machine/pgmprot.c svneol=native#text/plain
-src/mame/machine/pitnrun.c svneol=native#text/plain
-src/mame/machine/playch10.c svneol=native#text/plain
-src/mame/machine/psx.c svneol=native#text/plain
-src/mame/machine/pxa255.h svneol=native#text/plain
-src/mame/machine/qix.c svneol=native#text/plain
-src/mame/machine/r2crypt.c svneol=native#text/plain
-src/mame/machine/rainbow.c svneol=native#text/plain
-src/mame/machine/retofinv.c svneol=native#text/plain
-src/mame/machine/s16fd.c svneol=native#text/plain
-src/mame/machine/s24fd.c svneol=native#text/plain
-src/mame/machine/scramble.c svneol=native#text/plain
-src/mame/machine/scudsp.c svneol=native#text/plain
-src/mame/machine/scudsp.h svneol=native#text/plain
-src/mame/machine/segacrpt.c svneol=native#text/plain
-src/mame/machine/segacrpt.h svneol=native#text/plain
-src/mame/machine/segag80.c svneol=native#text/plain
-src/mame/machine/segaic16.c svneol=native#text/plain
-src/mame/machine/segaic16.h svneol=native#text/plain
-src/mame/machine/segas24.c svneol=native#text/plain
-src/mame/machine/segas32.c svneol=native#text/plain
-src/mame/machine/seibuspi.c svneol=native#text/plain
-src/mame/machine/seicop.c svneol=native#text/plain
-src/mame/machine/seicop.h svneol=native#text/plain
-src/mame/machine/simpsons.c svneol=native#text/plain
-src/mame/machine/slapfght.c svneol=native#text/plain
-src/mame/machine/slapstic.c svneol=native#text/plain
-src/mame/machine/slikshot.c svneol=native#text/plain
-src/mame/machine/snes.c svneol=native#text/plain
-src/mame/machine/snesdsp1.c svneol=native#text/plain
-src/mame/machine/snesdsp2.c svneol=native#text/plain
-src/mame/machine/snesobc1.c svneol=native#text/plain
-src/mame/machine/spisprit.c svneol=native#text/plain
-src/mame/machine/starwars.c svneol=native#text/plain
-src/mame/machine/steppers.c svneol=native#text/plain
-src/mame/machine/steppers.h svneol=native#text/plain
-src/mame/machine/stfight.c svneol=native#text/plain
-src/mame/machine/stvcd.c svneol=native#text/plain
-src/mame/machine/stvcd.h svneol=native#text/plain
-src/mame/machine/stvprot.c svneol=native#text/plain
-src/mame/machine/stvprot.h svneol=native#text/plain
-src/mame/machine/subs.c svneol=native#text/plain
-src/mame/machine/system16.c svneol=native#text/plain
-src/mame/machine/tait8741.c svneol=native#text/plain
-src/mame/machine/tait8741.h svneol=native#text/plain
-src/mame/machine/taitosj.c svneol=native#text/plain
-src/mame/machine/tatsumi.c svneol=native#text/plain
-src/mame/machine/tecmosys.c svneol=native#text/plain
-src/mame/machine/theglobp.c svneol=native#text/plain
-src/mame/machine/ticket.c svneol=native#text/plain
-src/mame/machine/ticket.h svneol=native#text/plain
-src/mame/machine/tnzs.c svneol=native#text/plain
-src/mame/machine/toaplan1.c svneol=native#text/plain
-src/mame/machine/twincobr.c svneol=native#text/plain
-src/mame/machine/tx1.c svneol=native#text/plain
-src/mame/machine/vertigo.c svneol=native#text/plain
-src/mame/machine/volfied.c svneol=native#text/plain
-src/mame/machine/vsnes.c svneol=native#text/plain
-src/mame/machine/williams.c svneol=native#text/plain
-src/mame/machine/wrally.c svneol=native#text/plain
-src/mame/machine/xevious.c svneol=native#text/plain
-src/mame/machine/znsec.c svneol=native#text/plain
-src/mame/machine/znsec.h svneol=native#text/plain
-src/mame/machine/zs01.c svneol=native#text/plain
-src/mame/machine/zs01.h svneol=native#text/plain
-src/mame/mame.mak svneol=native#text/plain
-src/mame/mamedriv.c svneol=native#text/plain
-src/mame/tiny.c svneol=native#text/plain
-src/mame/tiny.mak svneol=native#text/plain
-src/mame/video/1942.c svneol=native#text/plain
-src/mame/video/1943.c svneol=native#text/plain
-src/mame/video/20pacgal.c svneol=native#text/plain
-src/mame/video/40love.c svneol=native#text/plain
-src/mame/video/4enraya.c svneol=native#text/plain
-src/mame/video/8080bw.c svneol=native#text/plain
-src/mame/video/88games.c svneol=native#text/plain
-src/mame/video/actfancr.c svneol=native#text/plain
-src/mame/video/aeroboto.c svneol=native#text/plain
-src/mame/video/aerofgt.c svneol=native#text/plain
-src/mame/video/airbustr.c svneol=native#text/plain
-src/mame/video/ajax.c svneol=native#text/plain
-src/mame/video/aliens.c svneol=native#text/plain
-src/mame/video/alpha68k.c svneol=native#text/plain
-src/mame/video/ambush.c svneol=native#text/plain
-src/mame/video/amiga.c svneol=native#text/plain
-src/mame/video/amigaaga.c svneol=native#text/plain
-src/mame/video/ampoker2.c svneol=native#text/plain
-src/mame/video/amspdwy.c svneol=native#text/plain
-src/mame/video/angelkds.c svneol=native#text/plain
-src/mame/video/antic.c svneol=native#text/plain
-src/mame/video/appoooh.c svneol=native#text/plain
-src/mame/video/aquarium.c svneol=native#text/plain
-src/mame/video/arabian.c svneol=native#text/plain
-src/mame/video/arcadecl.c svneol=native#text/plain
-src/mame/video/argus.c svneol=native#text/plain
-src/mame/video/arkanoid.c svneol=native#text/plain
-src/mame/video/armedf.c svneol=native#text/plain
-src/mame/video/artmagic.c svneol=native#text/plain
-src/mame/video/ashnojoe.c svneol=native#text/plain
-src/mame/video/asterix.c svneol=native#text/plain
-src/mame/video/astrocde.c svneol=native#text/plain
-src/mame/video/asuka.c svneol=native#text/plain
-src/mame/video/atari.c svneol=native#text/plain
-src/mame/video/atarifb.c svneol=native#text/plain
-src/mame/video/atarig1.c svneol=native#text/plain
-src/mame/video/atarig42.c svneol=native#text/plain
-src/mame/video/atarigt.c svneol=native#text/plain
-src/mame/video/atarigx2.c svneol=native#text/plain
-src/mame/video/atarimo.c svneol=native#text/plain
-src/mame/video/atarimo.h svneol=native#text/plain
-src/mame/video/atarirle.c svneol=native#text/plain
-src/mame/video/atarirle.h svneol=native#text/plain
-src/mame/video/atarisy1.c svneol=native#text/plain
-src/mame/video/atarisy2.c svneol=native#text/plain
-src/mame/video/atetris.c svneol=native#text/plain
-src/mame/video/attckufo.c svneol=native#text/plain
-src/mame/video/avgdvg.c svneol=native#text/plain
-src/mame/video/avgdvg.h svneol=native#text/plain
-src/mame/video/awpvid.c svneol=native#text/plain
-src/mame/video/awpvid.h svneol=native#text/plain
-src/mame/video/aztarac.c svneol=native#text/plain
-src/mame/video/badlands.c svneol=native#text/plain
-src/mame/video/bagman.c svneol=native#text/plain
-src/mame/video/balsente.c svneol=native#text/plain
-src/mame/video/bankp.c svneol=native#text/plain
-src/mame/video/baraduke.c svneol=native#text/plain
-src/mame/video/batman.c svneol=native#text/plain
-src/mame/video/battlane.c svneol=native#text/plain
-src/mame/video/battlera.c svneol=native#text/plain
-src/mame/video/battlex.c svneol=native#text/plain
-src/mame/video/battlnts.c svneol=native#text/plain
-src/mame/video/bbusters.c svneol=native#text/plain
-src/mame/video/beathead.c svneol=native#text/plain
-src/mame/video/beezer.c svneol=native#text/plain
-src/mame/video/bfm_adr2.c svneol=native#text/plain
-src/mame/video/bfm_adr2.h svneol=native#text/plain
-src/mame/video/bfm_dm01.c svneol=native#text/plain
-src/mame/video/bfm_dm01.h svneol=native#text/plain
-src/mame/video/bigevglf.c svneol=native#text/plain
-src/mame/video/bigstrkb.c svneol=native#text/plain
-src/mame/video/bionicc.c svneol=native#text/plain
-src/mame/video/bishi.c svneol=native#text/plain
-src/mame/video/bking.c svneol=native#text/plain
-src/mame/video/bladestl.c svneol=native#text/plain
-src/mame/video/blktiger.c svneol=native#text/plain
-src/mame/video/blmbycar.c svneol=native#text/plain
-src/mame/video/blockade.c svneol=native#text/plain
-src/mame/video/blockhl.c svneol=native#text/plain
-src/mame/video/blockout.c svneol=native#text/plain
-src/mame/video/bloodbro.c svneol=native#text/plain
-src/mame/video/blstroid.c svneol=native#text/plain
-src/mame/video/blueprnt.c svneol=native#text/plain
-src/mame/video/bogeyman.c svneol=native#text/plain
-src/mame/video/bombjack.c svneol=native#text/plain
-src/mame/video/boogwing.c svneol=native#text/plain
-src/mame/video/bosco.c svneol=native#text/plain
-src/mame/video/bottom9.c svneol=native#text/plain
-src/mame/video/boxer.c svneol=native#text/plain
-src/mame/video/brkthru.c svneol=native#text/plain
-src/mame/video/bsktball.c svneol=native#text/plain
-src/mame/video/btime.c svneol=native#text/plain
-src/mame/video/btoads.c svneol=native#text/plain
-src/mame/video/bublbobl.c svneol=native#text/plain
-src/mame/video/buggychl.c svneol=native#text/plain
-src/mame/video/bwing.c svneol=native#text/plain
-src/mame/video/cabal.c svneol=native#text/plain
-src/mame/video/calomega.c svneol=native#text/plain
-src/mame/video/canyon.c svneol=native#text/plain
-src/mame/video/capbowl.c svneol=native#text/plain
-src/mame/video/carjmbre.c svneol=native#text/plain
-src/mame/video/carpolo.c svneol=native#text/plain
-src/mame/video/cave.c svneol=native#text/plain
-src/mame/video/cbasebal.c svneol=native#text/plain
-src/mame/video/cbuster.c svneol=native#text/plain
-src/mame/video/ccastles.c svneol=native#text/plain
-src/mame/video/cchasm.c svneol=native#text/plain
-src/mame/video/cclimber.c svneol=native#text/plain
-src/mame/video/centiped.c svneol=native#text/plain
-src/mame/video/chaknpop.c svneol=native#text/plain
-src/mame/video/champbas.c svneol=native#text/plain
-src/mame/video/changela.c svneol=native#text/plain
-src/mame/video/cheekyms.c svneol=native#text/plain
-src/mame/video/chqflag.c svneol=native#text/plain
-src/mame/video/cidelsa.c svneol=native#text/plain
-src/mame/video/cinemat.c svneol=native#text/plain
-src/mame/video/circus.c svneol=native#text/plain
-src/mame/video/circusc.c svneol=native#text/plain
-src/mame/video/cischeat.c svneol=native#text/plain
-src/mame/video/citycon.c svneol=native#text/plain
-src/mame/video/cloak.c svneol=native#text/plain
-src/mame/video/cloud9.c svneol=native#text/plain
-src/mame/video/clshroad.c svneol=native#text/plain
-src/mame/video/cninja.c svneol=native#text/plain
-src/mame/video/combatsc.c svneol=native#text/plain
-src/mame/video/commando.c svneol=native#text/plain
-src/mame/video/compgolf.c svneol=native#text/plain
-src/mame/video/contra.c svneol=native#text/plain
-src/mame/video/cop01.c svneol=native#text/plain
-src/mame/video/copsnrob.c svneol=native#text/plain
-src/mame/video/cosmic.c svneol=native#text/plain
-src/mame/video/cps1.c svneol=native#text/plain
-src/mame/video/crbaloon.c svneol=native#text/plain
-src/mame/video/crgolf.c svneol=native#text/plain
-src/mame/video/crimfght.c svneol=native#text/plain
-src/mame/video/crospang.c svneol=native#text/plain
-src/mame/video/crshrace.c svneol=native#text/plain
-src/mame/video/cvs.c svneol=native#text/plain
-src/mame/video/cyberbal.c svneol=native#text/plain
-src/mame/video/darius.c svneol=native#text/plain
-src/mame/video/darkmist.c svneol=native#text/plain
-src/mame/video/darkseal.c svneol=native#text/plain
-src/mame/video/dassault.c svneol=native#text/plain
-src/mame/video/dbz.c svneol=native#text/plain
-src/mame/video/dc.c svneol=native#text/plain
-src/mame/video/dcheese.c svneol=native#text/plain
-src/mame/video/dcon.c svneol=native#text/plain
-src/mame/video/dday.c svneol=native#text/plain
-src/mame/video/ddragon.c svneol=native#text/plain
-src/mame/video/ddragon3.c svneol=native#text/plain
-src/mame/video/ddrible.c svneol=native#text/plain
-src/mame/video/deadang.c svneol=native#text/plain
-src/mame/video/dec0.c svneol=native#text/plain
-src/mame/video/dec8.c svneol=native#text/plain
-src/mame/video/deco16ic.c svneol=native#text/plain
-src/mame/video/deco32.c svneol=native#text/plain
-src/mame/video/deco_mlc.c svneol=native#text/plain
-src/mame/video/decocass.c svneol=native#text/plain
-src/mame/video/deniam.c svneol=native#text/plain
-src/mame/video/destroyr.c svneol=native#text/plain
-src/mame/video/dietgo.c svneol=native#text/plain
-src/mame/video/digdug.c svneol=native#text/plain
-src/mame/video/diverboy.c svneol=native#text/plain
-src/mame/video/djboy.c svneol=native#text/plain
-src/mame/video/djmain.c svneol=native#text/plain
-src/mame/video/dkong.c svneol=native#text/plain
-src/mame/video/docastle.c svneol=native#text/plain
-src/mame/video/dogfgt.c svneol=native#text/plain
-src/mame/video/dooyong.c svneol=native#text/plain
-src/mame/video/dotrikun.c svneol=native#text/plain
-src/mame/video/dragrace.c svneol=native#text/plain
-src/mame/video/drgnmst.c svneol=native#text/plain
-src/mame/video/dribling.c svneol=native#text/plain
-src/mame/video/drmicro.c svneol=native#text/plain
-src/mame/video/dynax.c svneol=native#text/plain
-src/mame/video/dynduke.c svneol=native#text/plain
-src/mame/video/eolith.c svneol=native#text/plain
-src/mame/video/epos.c svneol=native#text/plain
-src/mame/video/eprom.c svneol=native#text/plain
-src/mame/video/equites.c svneol=native#text/plain
-src/mame/video/esd16.c svneol=native#text/plain
-src/mame/video/espial.c svneol=native#text/plain
-src/mame/video/esripsys.c svneol=native#text/plain
-src/mame/video/exedexes.c svneol=native#text/plain
-src/mame/video/exerion.c svneol=native#text/plain
-src/mame/video/exidy.c svneol=native#text/plain
-src/mame/video/exidy440.c svneol=native#text/plain
-src/mame/video/exprraid.c svneol=native#text/plain
-src/mame/video/exterm.c svneol=native#text/plain
-src/mame/video/exzisus.c svneol=native#text/plain
-src/mame/video/f1gp.c svneol=native#text/plain
-src/mame/video/fantland.c svneol=native#text/plain
-src/mame/video/fastfred.c svneol=native#text/plain
-src/mame/video/fastlane.c svneol=native#text/plain
-src/mame/video/fcombat.c svneol=native#text/plain
-src/mame/video/fgoal.c svneol=native#text/plain
-src/mame/video/finalizr.c svneol=native#text/plain
-src/mame/video/firetrap.c svneol=native#text/plain
-src/mame/video/firetrk.c svneol=native#text/plain
-src/mame/video/fitfight.c svneol=native#text/plain
-src/mame/video/flkatck.c svneol=native#text/plain
-src/mame/video/flower.c svneol=native#text/plain
-src/mame/video/flstory.c svneol=native#text/plain
-src/mame/video/flyball.c svneol=native#text/plain
-src/mame/video/foodf.c svneol=native#text/plain
-src/mame/video/freekick.c svneol=native#text/plain
-src/mame/video/fromanc2.c svneol=native#text/plain
-src/mame/video/fromance.c svneol=native#text/plain
-src/mame/video/funkybee.c svneol=native#text/plain
-src/mame/video/funkyjet.c svneol=native#text/plain
-src/mame/video/funworld.c svneol=native#text/plain
-src/mame/video/funybubl.c svneol=native#text/plain
-src/mame/video/fuukifg2.c svneol=native#text/plain
-src/mame/video/fuukifg3.c svneol=native#text/plain
-src/mame/video/gaelco.c svneol=native#text/plain
-src/mame/video/gaelco2.c svneol=native#text/plain
-src/mame/video/gaelco3d.c svneol=native#text/plain
-src/mame/video/gaiden.c svneol=native#text/plain
-src/mame/video/galaga.c svneol=native#text/plain
-src/mame/video/galastrm.c svneol=native#text/plain
-src/mame/video/galaxian.c svneol=native#text/plain
-src/mame/video/galaxold.c svneol=native#text/plain
-src/mame/video/galivan.c svneol=native#text/plain
-src/mame/video/galpani2.c svneol=native#text/plain
-src/mame/video/galpanic.c svneol=native#text/plain
-src/mame/video/galspnbl.c svneol=native#text/plain
-src/mame/video/gameplan.c svneol=native#text/plain
-src/mame/video/gaplus.c svneol=native#text/plain
-src/mame/video/gatron.c svneol=native#text/plain
-src/mame/video/gauntlet.c svneol=native#text/plain
-src/mame/video/gberet.c svneol=native#text/plain
-src/mame/video/gbusters.c svneol=native#text/plain
-src/mame/video/gcpinbal.c svneol=native#text/plain
-src/mame/video/genesis.c svneol=native#text/plain
-src/mame/video/gijoe.c svneol=native#text/plain
-src/mame/video/ginganin.c svneol=native#text/plain
-src/mame/video/gladiatr.c svneol=native#text/plain
-src/mame/video/glass.c svneol=native#text/plain
-src/mame/video/gng.c svneol=native#text/plain
-src/mame/video/goal92.c svneol=native#text/plain
-src/mame/video/goindol.c svneol=native#text/plain
-src/mame/video/goldstar.c svneol=native#text/plain
-src/mame/video/gomoku.c svneol=native#text/plain
-src/mame/video/gotcha.c svneol=native#text/plain
-src/mame/video/gottlieb.c svneol=native#text/plain
-src/mame/video/gotya.c svneol=native#text/plain
-src/mame/video/gradius3.c svneol=native#text/plain
-src/mame/video/grchamp.c svneol=native#text/plain
-src/mame/video/gridlee.c svneol=native#text/plain
-src/mame/video/groundfx.c svneol=native#text/plain
-src/mame/video/gstriker.c svneol=native#text/plain
-src/mame/video/gsword.c svneol=native#text/plain
-src/mame/video/gtia.c svneol=native#text/plain
-src/mame/video/gtia.h svneol=native#text/plain
-src/mame/video/gticlub.c svneol=native#text/plain
-src/mame/video/gticlub.h svneol=native#text/plain
-src/mame/video/gumbo.c svneol=native#text/plain
-src/mame/video/gunbustr.c svneol=native#text/plain
-src/mame/video/gundealr.c svneol=native#text/plain
-src/mame/video/gunsmoke.c svneol=native#text/plain
-src/mame/video/gyruss.c svneol=native#text/plain
-src/mame/video/hanaawas.c svneol=native#text/plain
-src/mame/video/harddriv.c svneol=native#text/plain
-src/mame/video/hcastle.c svneol=native#text/plain
-src/mame/video/hd63484.c svneol=native#text/plain
-src/mame/video/hd63484.h svneol=native#text/plain
-src/mame/video/hexa.c svneol=native#text/plain
-src/mame/video/hexion.c svneol=native#text/plain
-src/mame/video/higemaru.c svneol=native#text/plain
-src/mame/video/himesiki.c svneol=native#text/plain
-src/mame/video/hnayayoi.c svneol=native#text/plain
-src/mame/video/hng64.c svneol=native#text/plain
-src/mame/video/holeland.c svneol=native#text/plain
-src/mame/video/homedata.c svneol=native#text/plain
-src/mame/video/homerun.c svneol=native#text/plain
-src/mame/video/hyhoo.c svneol=native#text/plain
-src/mame/video/hyperspt.c svneol=native#text/plain
-src/mame/video/hyprduel.c svneol=native#text/plain
-src/mame/video/ikki.c svneol=native#text/plain
-src/mame/video/inufuku.c svneol=native#text/plain
-src/mame/video/iqblock.c svneol=native#text/plain
-src/mame/video/irobot.c svneol=native#text/plain
-src/mame/video/ironhors.c svneol=native#text/plain
-src/mame/video/itech32.c svneol=native#text/plain
-src/mame/video/itech8.c svneol=native#text/plain
-src/mame/video/jack.c svneol=native#text/plain
-src/mame/video/jackal.c svneol=native#text/plain
-src/mame/video/jagblit.c svneol=native#text/plain
-src/mame/video/jagblit.h svneol=native#text/plain
-src/mame/video/jagobj.c svneol=native#text/plain
-src/mame/video/jaguar.c svneol=native#text/plain
-src/mame/video/jailbrek.c svneol=native#text/plain
-src/mame/video/jalblend.c svneol=native#text/plain
-src/mame/video/jalblend.h svneol=native#text/plain
-src/mame/video/jedi.c svneol=native#text/plain
-src/mame/video/jpmimpct.c svneol=native#text/plain
-src/mame/video/kan_panb.c svneol=native#text/plain
-src/mame/video/kan_panb.h svneol=native#text/plain
-src/mame/video/kan_pand.c svneol=native#text/plain
-src/mame/video/kan_pand.h svneol=native#text/plain
-src/mame/video/kaneko16.c svneol=native#text/plain
-src/mame/video/kangaroo.c svneol=native#text/plain
-src/mame/video/karnov.c svneol=native#text/plain
-src/mame/video/kchamp.c svneol=native#text/plain
-src/mame/video/kickgoal.c svneol=native#text/plain
-src/mame/video/kingobox.c svneol=native#text/plain
-src/mame/video/klax.c svneol=native#text/plain
-src/mame/video/kncljoe.c svneol=native#text/plain
-src/mame/video/konamigx.c svneol=native#text/plain
-src/mame/video/konamiic.c svneol=native#text/plain
-src/mame/video/konamiic.h svneol=native#text/plain
-src/mame/video/kopunch.c svneol=native#text/plain
-src/mame/video/ksayakyu.c svneol=native#text/plain
-src/mame/video/kyugo.c svneol=native#text/plain
-src/mame/video/labyrunr.c svneol=native#text/plain
-src/mame/video/ladybug.c svneol=native#text/plain
-src/mame/video/ladyfrog.c svneol=native#text/plain
-src/mame/video/lasso.c svneol=native#text/plain
-src/mame/video/lastduel.c svneol=native#text/plain
-src/mame/video/lazercmd.c svneol=native#text/plain
-src/mame/video/legionna.c svneol=native#text/plain
-src/mame/video/leland.c svneol=native#text/plain
-src/mame/video/lemmings.c svneol=native#text/plain
-src/mame/video/lethal.c svneol=native#text/plain
-src/mame/video/lethalj.c svneol=native#text/plain
-src/mame/video/liberate.c svneol=native#text/plain
-src/mame/video/liberatr.c svneol=native#text/plain
-src/mame/video/lkage.c svneol=native#text/plain
-src/mame/video/lockon.c svneol=native#text/plain
-src/mame/video/lordgun.c svneol=native#text/plain
-src/mame/video/lsasquad.c svneol=native#text/plain
-src/mame/video/lucky74.c svneol=native#text/plain
-src/mame/video/lvcards.c svneol=native#text/plain
-src/mame/video/lwings.c svneol=native#text/plain
-src/mame/video/m10.c svneol=native#text/plain
-src/mame/video/m107.c svneol=native#text/plain
-src/mame/video/m3raster.c svneol=native#text/plain
-src/mame/video/m52.c svneol=native#text/plain
-src/mame/video/m57.c svneol=native#text/plain
-src/mame/video/m58.c svneol=native#text/plain
-src/mame/video/m62.c svneol=native#text/plain
-src/mame/video/m72.c svneol=native#text/plain
-src/mame/video/m90.c svneol=native#text/plain
-src/mame/video/m92.c svneol=native#text/plain
-src/mame/video/macrossp.c svneol=native#text/plain
-src/mame/video/madalien.c svneol=native#text/plain
-src/mame/video/madmotor.c svneol=native#text/plain
-src/mame/video/magmax.c svneol=native#text/plain
-src/mame/video/mainevt.c svneol=native#text/plain
-src/mame/video/mainsnk.c svneol=native#text/plain
-src/mame/video/malzak.c svneol=native#text/plain
-src/mame/video/mappy.c svneol=native#text/plain
-src/mame/video/marineb.c svneol=native#text/plain
-src/mame/video/mario.c svneol=native#text/plain
-src/mame/video/markham.c svneol=native#text/plain
-src/mame/video/matmania.c svneol=native#text/plain
-src/mame/video/mayumi.c svneol=native#text/plain
-src/mame/video/mcatadv.c svneol=native#text/plain
-src/mame/video/mcr.c svneol=native#text/plain
-src/mame/video/mcr3.c svneol=native#text/plain
-src/mame/video/mcr68.c svneol=native#text/plain
-src/mame/video/meadows.c svneol=native#text/plain
-src/mame/video/megasys1.c svneol=native#text/plain
-src/mame/video/megazone.c svneol=native#text/plain
-src/mame/video/mermaid.c svneol=native#text/plain
-src/mame/video/metlclsh.c svneol=native#text/plain
-src/mame/video/metro.c svneol=native#text/plain
-src/mame/video/mexico86.c svneol=native#text/plain
-src/mame/video/midtunit.c svneol=native#text/plain
-src/mame/video/midvunit.c svneol=native#text/plain
-src/mame/video/midyunit.c svneol=native#text/plain
-src/mame/video/midzeus.c svneol=native#text/plain
-src/mame/video/midzeus2.c svneol=native#text/plain
-src/mame/video/mikie.c svneol=native#text/plain
-src/mame/video/mitchell.c svneol=native#text/plain
-src/mame/video/mjkjidai.c svneol=native#text/plain
-src/mame/video/mjsister.c svneol=native#text/plain
-src/mame/video/model1.c svneol=native#text/plain
-src/mame/video/model2.c svneol=native#text/plain
-src/mame/video/model2rd.c svneol=native#text/plain
-src/mame/video/model3.c svneol=native#text/plain
-src/mame/video/mole.c svneol=native#text/plain
-src/mame/video/momoko.c svneol=native#text/plain
-src/mame/video/moo.c svneol=native#text/plain
-src/mame/video/mosaic.c svneol=native#text/plain
-src/mame/video/mouser.c svneol=native#text/plain
-src/mame/video/mrdo.c svneol=native#text/plain
-src/mame/video/mrflea.c svneol=native#text/plain
-src/mame/video/mrjong.c svneol=native#text/plain
-src/mame/video/ms32.c svneol=native#text/plain
-src/mame/video/msisaac.c svneol=native#text/plain
-src/mame/video/mugsmash.c svneol=native#text/plain
-src/mame/video/munchmo.c svneol=native#text/plain
-src/mame/video/mustache.c svneol=native#text/plain
-src/mame/video/mw8080bw.c svneol=native#text/plain
-src/mame/video/mystston.c svneol=native#text/plain
-src/mame/video/mystwarr.c svneol=native#text/plain
-src/mame/video/n64.c svneol=native#text/plain
-src/mame/video/n8080.c svneol=native#text/plain
-src/mame/video/namcofl.c svneol=native#text/plain
-src/mame/video/namcona1.c svneol=native#text/plain
-src/mame/video/namconb1.c svneol=native#text/plain
-src/mame/video/namcos1.c svneol=native#text/plain
-src/mame/video/namcos2.c svneol=native#text/plain
-src/mame/video/namcos21.c svneol=native#text/plain
-src/mame/video/namcos22.c svneol=native#text/plain
-src/mame/video/namcos86.c svneol=native#text/plain
-src/mame/video/naughtyb.c svneol=native#text/plain
-src/mame/video/nbmj8688.c svneol=native#text/plain
-src/mame/video/nbmj8891.c svneol=native#text/plain
-src/mame/video/nbmj8991.c svneol=native#text/plain
-src/mame/video/nbmj9195.c svneol=native#text/plain
-src/mame/video/nemesis.c svneol=native#text/plain
-src/mame/video/neogeo.c svneol=native#text/plain
-src/mame/video/news.c svneol=native#text/plain
-src/mame/video/ninjakd2.c svneol=native#text/plain
-src/mame/video/ninjaw.c svneol=native#text/plain
-src/mame/video/nitedrvr.c svneol=native#text/plain
-src/mame/video/niyanpai.c svneol=native#text/plain
-src/mame/video/nmk16.c svneol=native#text/plain
-src/mame/video/nova2001.c svneol=native#text/plain
-src/mame/video/nycaptor.c svneol=native#text/plain
-src/mame/video/offtwall.c svneol=native#text/plain
-src/mame/video/ohmygod.c svneol=native#text/plain
-src/mame/video/ojankohs.c svneol=native#text/plain
-src/mame/video/oneshot.c svneol=native#text/plain
-src/mame/video/orbit.c svneol=native#text/plain
-src/mame/video/othldrby.c svneol=native#text/plain
-src/mame/video/othunder.c svneol=native#text/plain
-src/mame/video/overdriv.c svneol=native#text/plain
-src/mame/video/pacland.c svneol=native#text/plain
-src/mame/video/pacman.c svneol=native#text/plain
-src/mame/video/pandoras.c svneol=native#text/plain
-src/mame/video/paradise.c svneol=native#text/plain
-src/mame/video/parodius.c svneol=native#text/plain
-src/mame/video/pass.c svneol=native#text/plain
-src/mame/video/pastelg.c svneol=native#text/plain
-src/mame/video/pbaction.c svneol=native#text/plain
-src/mame/video/pcktgal.c svneol=native#text/plain
-src/mame/video/pgm.c svneol=native#text/plain
-src/mame/video/phoenix.c svneol=native#text/plain
-src/mame/video/pingpong.c svneol=native#text/plain
-src/mame/video/pirates.c svneol=native#text/plain
-src/mame/video/pitnrun.c svneol=native#text/plain
-src/mame/video/pk8000.c svneol=native#text/plain
-src/mame/video/pktgaldx.c svneol=native#text/plain
-src/mame/video/playch10.c svneol=native#text/plain
-src/mame/video/playmark.c svneol=native#text/plain
-src/mame/video/plygonet.c svneol=native#text/plain
-src/mame/video/pokechmp.c svneol=native#text/plain
-src/mame/video/polepos.c svneol=native#text/plain
-src/mame/video/policetr.c svneol=native#text/plain
-src/mame/video/polyplay.c svneol=native#text/plain
-src/mame/video/poolshrk.c svneol=native#text/plain
-src/mame/video/pooyan.c svneol=native#text/plain
-src/mame/video/popeye.c svneol=native#text/plain
-src/mame/video/popper.c svneol=native#text/plain
-src/mame/video/portrait.c svneol=native#text/plain
-src/mame/video/powerins.c svneol=native#text/plain
-src/mame/video/ppu2c0x.c svneol=native#text/plain
-src/mame/video/ppu2c0x.h svneol=native#text/plain
-src/mame/video/prehisle.c svneol=native#text/plain
-src/mame/video/psikyo.c svneol=native#text/plain
-src/mame/video/psikyo4.c svneol=native#text/plain
-src/mame/video/psikyosh.c svneol=native#text/plain
-src/mame/video/psx.c svneol=native#text/plain
-src/mame/video/psychic5.c svneol=native#text/plain
-src/mame/video/punchout.c svneol=native#text/plain
-src/mame/video/pushman.c svneol=native#text/plain
-src/mame/video/qdrmfgp.c svneol=native#text/plain
-src/mame/video/qix.c svneol=native#text/plain
-src/mame/video/quasar.c svneol=native#text/plain
-src/mame/video/quizdna.c svneol=native#text/plain
-src/mame/video/quizpani.c svneol=native#text/plain
-src/mame/video/raiden.c svneol=native#text/plain
-src/mame/video/rallyx.c svneol=native#text/plain
-src/mame/video/rampart.c svneol=native#text/plain
-src/mame/video/rastan.c svneol=native#text/plain
-src/mame/video/realbrk.c svneol=native#text/plain
-src/mame/video/redalert.c svneol=native#text/plain
-src/mame/video/redclash.c svneol=native#text/plain
-src/mame/video/relief.c svneol=native#text/plain
-src/mame/video/renegade.c svneol=native#text/plain
-src/mame/video/retofinv.c svneol=native#text/plain
-src/mame/video/rockrage.c svneol=native#text/plain
-src/mame/video/rocnrope.c svneol=native#text/plain
-src/mame/video/rohga.c svneol=native#text/plain
-src/mame/video/rollerg.c svneol=native#text/plain
-src/mame/video/rollrace.c svneol=native#text/plain
-src/mame/video/route16.c svneol=native#text/plain
-src/mame/video/rpunch.c svneol=native#text/plain
-src/mame/video/runaway.c svneol=native#text/plain
-src/mame/video/rungun.c svneol=native#text/plain
-src/mame/video/sauro.c svneol=native#text/plain
-src/mame/video/sbasketb.c svneol=native#text/plain
-src/mame/video/sbugger.c svneol=native#text/plain
-src/mame/video/scotrsht.c svneol=native#text/plain
-src/mame/video/sderby.c svneol=native#text/plain
-src/mame/video/segag80r.c svneol=native#text/plain
-src/mame/video/segag80v.c svneol=native#text/plain
-src/mame/video/segahang.c svneol=native#text/plain
-src/mame/video/segaic16.c svneol=native#text/plain
-src/mame/video/segaic16.h svneol=native#text/plain
-src/mame/video/segaic24.c svneol=native#text/plain
-src/mame/video/segaic24.h svneol=native#text/plain
-src/mame/video/segaorun.c svneol=native#text/plain
-src/mame/video/segas16a.c svneol=native#text/plain
-src/mame/video/segas16b.c svneol=native#text/plain
-src/mame/video/segas18.c svneol=native#text/plain
-src/mame/video/segas24.c svneol=native#text/plain
-src/mame/video/segas32.c svneol=native#text/plain
-src/mame/video/segasyse.c svneol=native#text/plain
-src/mame/video/segaxbd.c svneol=native#text/plain
-src/mame/video/segaybd.c svneol=native#text/plain
-src/mame/video/sei_crtc.c svneol=native#text/plain
-src/mame/video/seibuspi.c svneol=native#text/plain
-src/mame/video/seicross.c svneol=native#text/plain
-src/mame/video/senjyo.c svneol=native#text/plain
-src/mame/video/seta.c svneol=native#text/plain
-src/mame/video/seta2.c svneol=native#text/plain
-src/mame/video/sf.c svneol=native#text/plain
-src/mame/video/shadfrce.c svneol=native#text/plain
-src/mame/video/shangha3.c svneol=native#text/plain
-src/mame/video/shangkid.c svneol=native#text/plain
-src/mame/video/shaolins.c svneol=native#text/plain
-src/mame/video/shisen.c svneol=native#text/plain
-src/mame/video/shootout.c svneol=native#text/plain
-src/mame/video/shuuz.c svneol=native#text/plain
-src/mame/video/sidearms.c svneol=native#text/plain
-src/mame/video/sidepckt.c svneol=native#text/plain
-src/mame/video/silkroad.c svneol=native#text/plain
-src/mame/video/simpl156.c svneol=native#text/plain
-src/mame/video/simpsons.c svneol=native#text/plain
-src/mame/video/skullxbo.c svneol=native#text/plain
-src/mame/video/skydiver.c svneol=native#text/plain
-src/mame/video/skyfox.c svneol=native#text/plain
-src/mame/video/skykid.c svneol=native#text/plain
-src/mame/video/skyraid.c svneol=native#text/plain
-src/mame/video/slapfght.c svneol=native#text/plain
-src/mame/video/slapshot.c svneol=native#text/plain
-src/mame/video/snes.c svneol=native#text/plain
-src/mame/video/snk.c svneol=native#text/plain
-src/mame/video/snk6502.c svneol=native#text/plain
-src/mame/video/snk68.c svneol=native#text/plain
-src/mame/video/snookr10.c svneol=native#text/plain
-src/mame/video/solomon.c svneol=native#text/plain
-src/mame/video/sonson.c svneol=native#text/plain
-src/mame/video/spacefb.c svneol=native#text/plain
-src/mame/video/spbactn.c svneol=native#text/plain
-src/mame/video/spcforce.c svneol=native#text/plain
-src/mame/video/spdodgeb.c svneol=native#text/plain
-src/mame/video/speedatk.c svneol=native#text/plain
-src/mame/video/speedbal.c svneol=native#text/plain
-src/mame/video/speedspn.c svneol=native#text/plain
-src/mame/video/splash.c svneol=native#text/plain
-src/mame/video/sprcros2.c svneol=native#text/plain
-src/mame/video/sprint2.c svneol=native#text/plain
-src/mame/video/sprint4.c svneol=native#text/plain
-src/mame/video/sprint8.c svneol=native#text/plain
-src/mame/video/spy.c svneol=native#text/plain
-src/mame/video/srmp2.c svneol=native#text/plain
-src/mame/video/srumbler.c svneol=native#text/plain
-src/mame/video/sshangha.c svneol=native#text/plain
-src/mame/video/sslam.c svneol=native#text/plain
-src/mame/video/ssozumo.c svneol=native#text/plain
-src/mame/video/sspeedr.c svneol=native#text/plain
-src/mame/video/ssrj.c svneol=native#text/plain
-src/mame/video/ssv.c svneol=native#text/plain
-src/mame/video/st0016.c svneol=native#text/plain
-src/mame/video/stactics.c svneol=native#text/plain
-src/mame/video/stadhero.c svneol=native#text/plain
-src/mame/video/starcrus.c svneol=native#text/plain
-src/mame/video/starfire.c svneol=native#text/plain
-src/mame/video/starshp1.c svneol=native#text/plain
-src/mame/video/stfight.c svneol=native#text/plain
-src/mame/video/stlforce.c svneol=native#text/plain
-src/mame/video/strnskil.c svneol=native#text/plain
-src/mame/video/stvvdp1.c svneol=native#text/plain
-src/mame/video/stvvdp2.c svneol=native#text/plain
-src/mame/video/subs.c svneol=native#text/plain
-src/mame/video/suna16.c svneol=native#text/plain
-src/mame/video/suna8.c svneol=native#text/plain
-src/mame/video/supbtime.c svneol=native#text/plain
-src/mame/video/superchs.c svneol=native#text/plain
-src/mame/video/superqix.c svneol=native#text/plain
-src/mame/video/suprloco.c svneol=native#text/plain
-src/mame/video/suprnova.c svneol=native#text/plain
-src/mame/video/suprridr.c svneol=native#text/plain
-src/mame/video/suprslam.c svneol=native#text/plain
-src/mame/video/surpratk.c svneol=native#text/plain
-src/mame/video/sys16spr.c svneol=native#text/plain
-src/mame/video/system1.c svneol=native#text/plain
-src/mame/video/system1.h svneol=native#text/plain
-src/mame/video/system16.c svneol=native#text/plain
-src/mame/video/tagteam.c svneol=native#text/plain
-src/mame/video/tail2nos.c svneol=native#text/plain
-src/mame/video/taito_b.c svneol=native#text/plain
-src/mame/video/taito_f2.c svneol=native#text/plain
-src/mame/video/taito_f3.c svneol=native#text/plain
-src/mame/video/taito_h.c svneol=native#text/plain
-src/mame/video/taito_l.c svneol=native#text/plain
-src/mame/video/taito_o.c svneol=native#text/plain
-src/mame/video/taito_z.c svneol=native#text/plain
-src/mame/video/taitoair.c svneol=native#text/plain
-src/mame/video/taitoic.c svneol=native#text/plain
-src/mame/video/taitoic.h svneol=native#text/plain
-src/mame/video/taitojc.c svneol=native#text/plain
-src/mame/video/taitosj.c svneol=native#text/plain
-src/mame/video/tank8.c svneol=native#text/plain
-src/mame/video/tankbatt.c svneol=native#text/plain
-src/mame/video/tankbust.c svneol=native#text/plain
-src/mame/video/taotaido.c svneol=native#text/plain
-src/mame/video/targeth.c svneol=native#text/plain
-src/mame/video/tatsumi.c svneol=native#text/plain
-src/mame/video/taxidrvr.c svneol=native#text/plain
-src/mame/video/tbowl.c svneol=native#text/plain
-src/mame/video/tceptor.c svneol=native#text/plain
-src/mame/video/tecmo.c svneol=native#text/plain
-src/mame/video/tecmo16.c svneol=native#text/plain
-src/mame/video/tehkanwc.c svneol=native#text/plain
-src/mame/video/terracre.c svneol=native#text/plain
-src/mame/video/tetrisp2.c svneol=native#text/plain
-src/mame/video/thedeep.c svneol=native#text/plain
-src/mame/video/thepit.c svneol=native#text/plain
-src/mame/video/thief.c svneol=native#text/plain
-src/mame/video/thoop2.c svneol=native#text/plain
-src/mame/video/thunderj.c svneol=native#text/plain
-src/mame/video/thunderx.c svneol=native#text/plain
-src/mame/video/tia.c svneol=native#text/plain
-src/mame/video/tia.h svneol=native#text/plain
-src/mame/video/tiamc1.c svneol=native#text/plain
-src/mame/video/tigeroad.c svneol=native#text/plain
-src/mame/video/timelimt.c svneol=native#text/plain
-src/mame/video/timeplt.c svneol=native#text/plain
-src/mame/video/tmnt.c svneol=native#text/plain
-src/mame/video/tnzs.c svneol=native#text/plain
-src/mame/video/toaplan1.c svneol=native#text/plain
-src/mame/video/toaplan2.c svneol=native#text/plain
-src/mame/video/toki.c svneol=native#text/plain
-src/mame/video/toobin.c svneol=native#text/plain
-src/mame/video/topspeed.c svneol=native#text/plain
-src/mame/video/toypop.c svneol=native#text/plain
-src/mame/video/tp84.c svneol=native#text/plain
-src/mame/video/trackfld.c svneol=native#text/plain
-src/mame/video/travrusa.c svneol=native#text/plain
-src/mame/video/triplhnt.c svneol=native#text/plain
-src/mame/video/truco.c svneol=native#text/plain
-src/mame/video/trucocl.c svneol=native#text/plain
-src/mame/video/tryout.c svneol=native#text/plain
-src/mame/video/tsamurai.c svneol=native#text/plain
-src/mame/video/tubep.c svneol=native#text/plain
-src/mame/video/tumbleb.c svneol=native#text/plain
-src/mame/video/tumblep.c svneol=native#text/plain
-src/mame/video/tunhunt.c svneol=native#text/plain
-src/mame/video/turbo.c svneol=native#text/plain
-src/mame/video/tutankhm.c svneol=native#text/plain
-src/mame/video/twin16.c svneol=native#text/plain
-src/mame/video/twincobr.c svneol=native#text/plain
-src/mame/video/tx1.c svneol=native#text/plain
-src/mame/video/ultraman.c svneol=native#text/plain
-src/mame/video/ultratnk.c svneol=native#text/plain
-src/mame/video/undrfire.c svneol=native#text/plain
-src/mame/video/unico.c svneol=native#text/plain
-src/mame/video/usgames.c svneol=native#text/plain
-src/mame/video/vaportra.c svneol=native#text/plain
-src/mame/video/vastar.c svneol=native#text/plain
-src/mame/video/vball.c svneol=native#text/plain
-src/mame/video/vdc.c svneol=native#text/plain
-src/mame/video/vdc.h svneol=native#text/plain
-src/mame/video/vendetta.c svneol=native#text/plain
-src/mame/video/vertigo.c svneol=native#text/plain
-src/mame/video/vicdual.c svneol=native#text/plain
-src/mame/video/victory.c svneol=native#text/plain
-src/mame/video/videopin.c svneol=native#text/plain
-src/mame/video/vigilant.c svneol=native#text/plain
-src/mame/video/vindictr.c svneol=native#text/plain
-src/mame/video/volfied.c svneol=native#text/plain
-src/mame/video/vrender0.c svneol=native#text/plain
-src/mame/video/vrender0.h svneol=native#text/plain
-src/mame/video/vsnes.c svneol=native#text/plain
-src/mame/video/vulgus.c svneol=native#text/plain
-src/mame/video/warpwarp.c svneol=native#text/plain
-src/mame/video/warriorb.c svneol=native#text/plain
-src/mame/video/wc90.c svneol=native#text/plain
-src/mame/video/wc90b.c svneol=native#text/plain
-src/mame/video/wecleman.c svneol=native#text/plain
-src/mame/video/welltris.c svneol=native#text/plain
-src/mame/video/wgp.c svneol=native#text/plain
-src/mame/video/williams.c svneol=native#text/plain
-src/mame/video/wiping.c svneol=native#text/plain
-src/mame/video/wiz.c svneol=native#text/plain
-src/mame/video/wolfpack.c svneol=native#text/plain
-src/mame/video/wrally.c svneol=native#text/plain
-src/mame/video/wwfsstar.c svneol=native#text/plain
-src/mame/video/wwfwfest.c svneol=native#text/plain
-src/mame/video/xain.c svneol=native#text/plain
-src/mame/video/xevious.c svneol=native#text/plain
-src/mame/video/xexex.c svneol=native#text/plain
-src/mame/video/xmen.c svneol=native#text/plain
-src/mame/video/xorworld.c svneol=native#text/plain
-src/mame/video/xxmissio.c svneol=native#text/plain
-src/mame/video/xybots.c svneol=native#text/plain
-src/mame/video/xyonix.c svneol=native#text/plain
-src/mame/video/ygv608.c svneol=native#text/plain
-src/mame/video/ygv608.h svneol=native#text/plain
-src/mame/video/yiear.c svneol=native#text/plain
-src/mame/video/yunsun16.c svneol=native#text/plain
-src/mame/video/yunsung8.c svneol=native#text/plain
-src/mame/video/zac2650.c svneol=native#text/plain
-src/mame/video/zaccaria.c svneol=native#text/plain
-src/mame/video/zaxxon.c svneol=native#text/plain
-src/mame/video/zerozone.c svneol=native#text/plain
-src/mame/video/zodiack.c svneol=native#text/plain
-src/osd/osdcomm.h svneol=native#text/plain
-src/osd/osdcore.h svneol=native#text/plain
-src/osd/osdepend.h svneol=native#text/plain
-src/osd/osdmini/minidir.c svneol=native#text/plain
-src/osd/osdmini/minifile.c svneol=native#text/plain
-src/osd/osdmini/minimisc.c svneol=native#text/plain
-src/osd/osdmini/minisync.c svneol=native#text/plain
-src/osd/osdmini/minitime.c svneol=native#text/plain
-src/osd/osdmini/miniwork.c svneol=native#text/plain
-src/osd/osdmini/osd_cpu.h svneol=native#text/plain
-src/osd/osdmini/osdmini.mak svneol=native#text/plain
-src/osd/windows/d3d8intf.c svneol=native#text/plain
-src/osd/windows/d3d9intf.c svneol=native#text/plain
-src/osd/windows/d3dintf.h svneol=native#text/plain
-src/osd/windows/debugwin.c svneol=native#text/plain
-src/osd/windows/debugwin.h svneol=native#text/plain
-src/osd/windows/drawd3d.c svneol=native#text/plain
-src/osd/windows/drawdd.c svneol=native#text/plain
-src/osd/windows/drawgdi.c svneol=native#text/plain
-src/osd/windows/drawnone.c svneol=native#text/plain
-src/osd/windows/eivc.h svneol=native#text/plain
-src/osd/windows/eivcx86.h svneol=native#text/plain
-src/osd/windows/input.c svneol=native#text/plain
-src/osd/windows/input.h svneol=native#text/plain
-src/osd/windows/ledutil.c svneol=native#text/plain
-src/osd/windows/main.c svneol=native#text/plain
-src/osd/windows/mame.man svneol=CRLF#text/plain eol=crlf
-src/osd/windows/mame.rc svneol=CRLF#text/plain eol=crlf
-src/osd/windows/multidef.h svneol=native#text/plain
-src/osd/windows/osd_cpu.h svneol=native#text/plain
-src/osd/windows/osinline.h svneol=native#text/plain
-src/osd/windows/output.c svneol=native#text/plain
-src/osd/windows/output.h svneol=native#text/plain
-src/osd/windows/sound.c svneol=native#text/plain
-src/osd/windows/sound.h svneol=native#text/plain
-src/osd/windows/strconv.c svneol=native#text/plain
-src/osd/windows/strconv.h svneol=native#text/plain
-src/osd/windows/vconv.c svneol=native#text/plain
-src/osd/windows/video.c svneol=native#text/plain
-src/osd/windows/video.h svneol=native#text/plain
-src/osd/windows/winalloc.c svneol=native#text/plain
-src/osd/windows/windir.c svneol=native#text/plain
-src/osd/windows/window.c svneol=native#text/plain
-src/osd/windows/window.h svneol=native#text/plain
-src/osd/windows/windows.mak svneol=native#text/plain
-src/osd/windows/winfile.c svneol=native#text/plain
-src/osd/windows/winmain.c svneol=native#text/plain
-src/osd/windows/winmain.h svneol=native#text/plain
-src/osd/windows/winmisc.c svneol=native#text/plain
-src/osd/windows/winprefix.h svneol=native#text/plain
-src/osd/windows/winsync.c svneol=native#text/plain
-src/osd/windows/wintime.c svneol=native#text/plain
-src/osd/windows/winutf8.c svneol=native#text/plain
-src/osd/windows/winutf8.h svneol=native#text/plain
-src/osd/windows/winutil.c svneol=native#text/plain
-src/osd/windows/winutil.h svneol=native#text/plain
-src/osd/windows/winwork.c svneol=native#text/plain
-src/tools/chdcd.c svneol=native#text/plain
-src/tools/chdcd.h svneol=native#text/plain
-src/tools/chdman.c svneol=native#text/plain
-src/tools/jedutil.c svneol=native#text/plain
-src/tools/ldresample.c svneol=native#text/plain
-src/tools/ldverify.c svneol=native#text/plain
-src/tools/regrep.c svneol=native#text/plain
-src/tools/romcmp.c svneol=native#text/plain
-src/tools/runtest.cmd svneol=CRLF#text/plain eol=crlf
-src/tools/split.c svneol=native#text/plain
-src/tools/src2html.c svneol=native#text/plain
-src/tools/srcclean.c svneol=native#text/plain
-src/tools/tools.mak svneol=native#text/plain
-src/version.c svneol=native#text/plain
+
+*.bat eol=crlf
+*.cmd eol=crlf
+*.jed binary
+*.man eol=crlf
+*.po eol=lf
+*.rc eol=crlf
+*.sh eol=lf
+
+*.gif -text
+*.ico -text
+*.jpg -text
+*.png -text
+*.ppm -text
+
+*.bdf eol=crlf
+
+*.zip -text
+
+3rdparty/flac/test/cuesheets/*.cue -text
+3rdparty/flac/test/flac-to-flac-metadata-test-files/*.meta -text
+3rdparty/flac/test/metaflac-test-files/*.meta -text
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
new file mode 100644
index 00000000000..116c4dd8652
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -0,0 +1,91 @@
+name: "Bug report"
+description: Report incorrect or unexpected behaviour.
+body:
+- type: markdown
+ attributes:
+ value: |
+ ## Important: Read First
+
+ Issues are not to be used for support requests or discussion. They are only to be used for reporting reproducible issues.
+
+ Before reporting an issue:
+ * Please ensure you have read the [guidelines for contributors](https://docs.mamedev.org/contributing/).
+ * We only accept bug reports against the latest version of MAME. Older versions are not supported.
+ * Only official versions of MAME are supported. Derivative versions (e.g. MAMEUI, NegaMAME or RetroArch cores) are not supported.
+ * User-facing bugs in released versions of MAME should generally be reported at [MAME Testers](https://mametesters.org/).
+ * Please search for existing [issues on GitHub](https://github.com/mamedev/mame/issues) and [bug reports at MAME Testers](https://mametesters.org/view_all_bug_page.php) before opening a new issue!
+
+- type: input
+ attributes:
+ label: MAME version
+ description: |
+ You can obtain the version from MAME itself, either by running `mame -version` at the command line or from the main menu. Include the git commit hash if not a tagged release.
+ placeholder: "0.xxx (mame0xxx-nn-gxxxxxxxxxxx)"
+ validations:
+ required: true
+
+- type: textarea
+ attributes:
+ label: System information
+ description: Provide environment details, including your operating system, CPU architecture, system locale and display language, if applicable. For video output bugs, include your video hardware (GPU), driver version, and the MAME video output module you’re using (e.g. opengl or bgfx). For input handling bugs, include the input peripherals and MAME input modules you’re using.
+ placeholder: |
+ Windows 11, 64-bit, version 22H2, USA, US English
+ x86-64, 32GB system RAM, GeForce RTX 4090 driver version 516.54
+ Using a Hori RAP4 Kai arcade stick in XInput mode connected via USB
+ bgfx video output (vulkan backend), winhybrid joystick module
+ validations:
+ required: true
+
+- type: textarea
+ attributes:
+ label: INI configuration details
+ description: Copy your mame.ini here.
+ placeholder: |
+ #
+ # CORE CONFIGURATION OPTIONS
+ #
+ readconfig 1
+ writeconfig 0
+ render: INI
+
+- type: input
+ attributes:
+ label: Emulated system/software
+ description: |
+ The exact emulated system and software affected. Please include short names for systems and software list items. Include version and media type. May not be applicable for issues with parts of MAME’s UI, like the system selection menu.
+ placeholder: PC Engine (pce), CD-ROM² Super System Card (v3.0) (pce:scdsys), Forgotten Worlds (Japan) (pcecd:forgottnj)
+
+- type: textarea
+ attributes:
+ label: Incorrect behaviour
+ description: |
+ A concise description of the undesirable behaviour you're experiencing. Be specific – just saying it “doesn’t work†isn’t enough detail.
+ validations:
+ required: true
+
+- type: textarea
+ attributes:
+ label: Expected behaviour
+ description: |
+ A concise description of what you expect should happen. For emulation issues, include an original reference for the correct behaviour if possible. If you have access to the original hardware for the emulated system, it helps to make a recording of the correct behaviour for comparison.
+ validations:
+ required: true
+
+- type: textarea
+ attributes:
+ label: Steps to reproduce
+ description: |
+ Steps to reproduce the issue. Assume the person reading is familiar with MAME itself, but not necessarily familiar with the emulated system and software in question. For emulation issues, input recordings and/or saved state files for reproducing the issue can be invaluable.
+ placeholder: |
+ 1. I started MAME with the following command line (where applicable):
+ 2. I did the following steps..
+ 3.
+ 4. I received this error or undesired result.
+
+- type: textarea
+ attributes:
+ label: Additional details
+ description: |
+ Any additional relevant details. Include things like the selected BIOS version, and emulated peripheral (slot device) configuration.
+ placeholder: |
+ SuperMac Spectrum/8 Series III card with firmware version 1.2 in NuBus slot 9.
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 00000000000..e0f8b8250a3
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,14 @@
+blank_issues_enabled: true
+contact_links:
+ - name: MAME Testers
+ url: https://mametesters.org/
+ about: For reporting user-facing bugs in released versions of MAME.
+ - name: MAMEdev Discussions on GitHub
+ url: https://github.com/orgs/mamedev/discussions
+ about: For questions and discussion.
+ - name: MAMEdev Forum
+ url: https://forum.mamedev.org/
+ about: Official MAMEdev forums.
+ - name: r/MAME
+ url: https://www.reddit.com/r/MAME/
+ about: Community forum for discussion and support.
diff --git a/.github/workflows/bgfxshaders.yml b/.github/workflows/bgfxshaders.yml
new file mode 100644
index 00000000000..bff5085e509
--- /dev/null
+++ b/.github/workflows/bgfxshaders.yml
@@ -0,0 +1,44 @@
+name: Rebuild BGFX shaders
+
+on:
+ push:
+ paths:
+ - '.github/workflows/**'
+ - 'src/osd/modules/render/bgfx/shaders/**'
+ pull_request:
+ paths:
+ - '.github/workflows/**'
+ - 'src/osd/modules/render/bgfx/shaders/**'
+
+permissions:
+ contents: read
+
+jobs:
+ rebuild:
+ runs-on: windows-latest
+ defaults:
+ run:
+ shell: msys2 {0}
+ steps:
+ - uses: msys2/setup-msys2@v2
+ with:
+ install: git make mingw-w64-x86_64-gcc mingw-w64-x86_64-python mingw-w64-x86_64-libc++
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
+ - name: Prevent make from rebuilding GLSL parser source
+ run: |
+ touch 3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-lex.c
+ touch 3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.c
+ touch 3rdparty/bgfx/3rdparty/glsl-optimizer/src/glsl/glcpp/glcpp-parse.h
+ touch 3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/glslang_tab.cpp
+ touch 3rdparty/bgfx/3rdparty/glslang/glslang/MachineIndependent/glslang_tab.cpp.h
+ - name: Build
+ env:
+ MINGW64: "/mingw64"
+ run: make shaders
+ - uses: actions/upload-artifact@main
+ with:
+ name: mame-bgfx-${{ github.sha }}
+ path: bgfx/shaders
+ if-no-files-found: error
diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml
new file mode 100644
index 00000000000..03e263bff80
--- /dev/null
+++ b/.github/workflows/ci-linux.yml
@@ -0,0 +1,76 @@
+name: CI (Linux)
+
+on:
+ push:
+ paths:
+ - '.github/workflows/**'
+ - '3rdparty/**'
+ - 'hash/**'
+ - 'scripts/**'
+ - 'src/**'
+ - 'COPYING'
+ - 'makefile'
+ pull_request:
+ paths:
+ - '.github/workflows/**'
+ - '3rdparty/**'
+ - 'hash/**'
+ - 'scripts/**'
+ - 'src/**'
+ - 'COPYING'
+ - 'makefile'
+
+permissions:
+ contents: read
+
+jobs:
+ build-linux:
+ strategy:
+ matrix:
+ compiler: [gcc, clang]
+ include:
+ - compiler: gcc
+ cc: gcc
+ cxx: g++
+ archopts: -U_FORTIFY_SOURCE
+ subtarget: tiny
+ executable: mametiny
+ - compiler: clang
+ cc: clang
+ cxx: clang++
+ subtarget: mame
+ executable: mame
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y libsdl2-dev libsdl2-ttf-dev libfontconfig-dev libasound2-dev libxinerama-dev libxi-dev qt6-base-dev qt6-base-dev-tools
+ - name: Install clang
+ if: matrix.compiler == 'clang'
+ run: sudo apt-get install -y clang
+ - name: Build
+ env:
+ OVERRIDE_CC: ${{ matrix.cc }}
+ OVERRIDE_CXX: ${{ matrix.cxx }}
+ ARCHOPTS: ${{ matrix.archopts }}
+ SUBTARGET: ${{ matrix.subtarget }}
+ TOOLS: 1
+ run: make -j3
+ - name: Validate
+ run: ./${{ matrix.executable }} -validate
+ - name: Reconcile driver list
+ run: ./${{ matrix.executable }} -listxml | python scripts/build/makedep.py reconcilelist -l src/mame/${{ matrix.subtarget }}.lst -
+ - name: ORM check
+ run: python scripts/minimaws/minimaws.py load --executable ./${{ matrix.executable }} --softwarepath hash
+ - uses: actions/upload-artifact@main
+ with:
+ name: ${{ matrix.executable }}-linux-${{ matrix.compiler }}-${{ github.sha }}
+ path: |
+ ${{ matrix.executable }}
+ chdman
+ unidasm
+ if-no-files-found: error
diff --git a/.github/workflows/ci-macos.yml b/.github/workflows/ci-macos.yml
new file mode 100644
index 00000000000..ae8c0abcdc7
--- /dev/null
+++ b/.github/workflows/ci-macos.yml
@@ -0,0 +1,47 @@
+name: CI (macOS)
+
+on:
+ push:
+ paths:
+ - '.github/workflows/**'
+ - '3rdparty/**'
+ - 'scripts/**'
+ - 'src/**'
+ - 'COPYING'
+ - 'makefile'
+ pull_request:
+ paths:
+ - '.github/workflows/**'
+ - '3rdparty/**'
+ - 'scripts/**'
+ - 'src/**'
+ - 'COPYING'
+ - 'makefile'
+
+permissions:
+ contents: read
+
+jobs:
+ build-macos:
+ runs-on: macOS-latest
+ steps:
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
+ - name: Install dependencies
+ run: brew install python3 sdl3
+ - name: Build
+ env:
+ USE_LIBSDL: 1
+ TOOLS: 1
+ run: make -j2
+ - name: Validate
+ run: ./mame -validate
+ - uses: actions/upload-artifact@main
+ with:
+ name: mame-macos-${{ github.sha }}
+ path: |
+ mame
+ chdman
+ unidasm
+ if-no-files-found: error
diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml
new file mode 100644
index 00000000000..8d3801a921a
--- /dev/null
+++ b/.github/workflows/ci-windows.yml
@@ -0,0 +1,86 @@
+name: CI (Windows)
+
+on:
+ push:
+ paths:
+ - '.github/workflows/**'
+ - '3rdparty/**'
+ - 'scripts/**'
+ - 'src/**'
+ - 'COPYING'
+ - 'makefile'
+ pull_request:
+ paths:
+ - '.github/workflows/**'
+ - '3rdparty/**'
+ - 'scripts/**'
+ - 'src/**'
+ - 'COPYING'
+ - 'makefile'
+
+permissions:
+ contents: read
+
+jobs:
+ build-windows:
+ strategy:
+ matrix:
+ compiler: [gcc-x64, clang-x64, clang-arm64]
+ include:
+ - compiler: gcc-x64
+ os: windows-latest
+ msys: UCRT64
+ slug: mingw-w64-ucrt-x86_64
+ cc: gcc
+ cxx: g++
+ subtarget: mame
+ executable: mame
+ - compiler: clang-x64
+ os: windows-latest
+ msys: CLANG64
+ slug: mingw-w64-clang-x86_64
+ extrapkg: mingw-w64-clang-x86_64-gcc-compat
+ cc: clang
+ cxx: clang++
+ subtarget: tiny
+ executable: mametiny
+ - compiler: clang-arm64
+ os: windows-11-arm
+ msys: CLANGARM64
+ slug: mingw-w64-clang-aarch64
+ extrapkg: mingw-w64-clang-aarch64-gcc-compat
+ cc: clang
+ cxx: clang++
+ subtarget: mame
+ executable: mame
+ runs-on: ${{ matrix.os }}
+ defaults:
+ run:
+ shell: msys2 {0}
+ steps:
+ - uses: msys2/setup-msys2@e9898307ac31d1a803454791be09ab9973336e1c # v2.31.1
+ with:
+ msystem: ${{ matrix.msys }}
+ install: git make ${{ matrix.slug }}-${{ matrix.cc }} ${{ matrix.slug }}-python ${{ matrix.slug }}-lld ${{ matrix.slug }}-llvm ${{ matrix.slug }}-libc++ ${{ matrix.extrapkg }}
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
+ - name: Build
+ env:
+ OVERRIDE_AR: "llvm-ar"
+ OVERRIDE_CC: ${{ matrix.cc }}
+ OVERRIDE_CXX: ${{ matrix.cxx }}
+ ARCHOPTS: "-fuse-ld=lld"
+ SUBTARGET: ${{ matrix.subtarget }}
+ TOOLS: 1
+ run: make -j3
+ - name: Validate
+ run: ./${{ matrix.executable }}.exe -validate
+ - uses: actions/upload-artifact@main
+ with:
+ name: ${{ matrix.executable }}-windows-${{ matrix.compiler }}-${{ github.sha }}
+ path: |
+ ${{ matrix.executable }}.exe
+ chdman.exe
+ unidasm.exe
+ if-no-files-found: error
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 00000000000..2c3bf612028
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,38 @@
+name: Build documentation
+
+on:
+ push:
+ paths:
+ - '.github/workflows/**'
+ - 'docs/**'
+ pull_request:
+ paths:
+ - '.github/workflows/**'
+ - 'docs/**'
+
+permissions:
+ contents: read
+
+jobs:
+ build-docs:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y librsvg2-bin latexmk python3-pip python3-sphinx texlive texlive-formats-extra texlive-science
+ pip3 install sphinxcontrib-svg2pdfconverter
+ - name: Build HTML
+ run: make -C docs html
+ - name: Build PDF
+ run: make -C docs PAPER=a4 latexpdf
+ - uses: actions/upload-artifact@main
+ with:
+ name: mame-docs-${{ github.sha }}
+ path: |
+ docs/build/html
+ docs/build/latex/MAME.pdf
+ if-no-files-found: error
diff --git a/.github/workflows/hash.yml b/.github/workflows/hash.yml
new file mode 100644
index 00000000000..5e55145422e
--- /dev/null
+++ b/.github/workflows/hash.yml
@@ -0,0 +1,38 @@
+name: XML/JSON validation
+
+on:
+ push:
+ paths:
+ - '.github/workflows/**'
+ - 'ctrlr/*'
+ - 'hash/*'
+ - 'plugins/**'
+ pull_request:
+ paths:
+ - '.github/workflows/**'
+ - 'ctrlr/*'
+ - 'hash/*'
+ - 'plugins/**'
+
+permissions:
+ contents: read
+
+jobs:
+ validate:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y libxml2-utils python3-jsonschema
+ - name: Validate (controller configuration)
+ run: for x in ctrlr/*.cfg ; do xmllint --noout "$x" ; done
+ - name: Validate (HSI)
+ run: for x in hash/*.hsi ; do xmllint --noout "$x" ; done
+ - name: Validate (software list)
+ run: for x in hash/*.xml ; do xmllint --noout --valid "$x" ; done
+ - name: Validate (plugin properties)
+ run: for x in plugins/*/plugin.json ; do jsonschema -i "$x" plugins/plugin.schema ; done
diff --git a/.github/workflows/includeguards.yml b/.github/workflows/includeguards.yml
new file mode 100644
index 00000000000..6d17fe5f5ba
--- /dev/null
+++ b/.github/workflows/includeguards.yml
@@ -0,0 +1,26 @@
+name: 'Check #include guards'
+
+on:
+ push:
+ paths:
+ - '.github/workflows/**'
+ - 'src/devices/**.h'
+ - 'src/mame/**.h'
+ pull_request:
+ paths:
+ - '.github/workflows/**'
+ - 'src/devices/**.h'
+ - 'src/mame/**.h'
+
+permissions:
+ contents: read
+
+jobs:
+ validate:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
+ - name: Validate
+ run: python3 scripts/build/check_include_guards.py src/devices src/mame
diff --git a/.github/workflows/language.yml b/.github/workflows/language.yml
new file mode 100644
index 00000000000..a5c6eaf358f
--- /dev/null
+++ b/.github/workflows/language.yml
@@ -0,0 +1,29 @@
+name: Compile UI translations
+
+on:
+ push:
+ paths:
+ - '.github/workflows/**'
+ - 'language/**'
+ pull_request:
+ paths:
+ - '.github/workflows/**'
+ - 'language/**'
+
+permissions:
+ contents: read
+
+jobs:
+ build-language:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@main
+ with:
+ fetch-depth: 0
+ - name: Compile message catalogs
+ run: for x in language/*/*.po ; do python scripts/build/msgfmt.py --output-file "`dirname "$x"`/`basename "$x" .po`.mo" "$x" ; done
+ - uses: actions/upload-artifact@main
+ with:
+ name: mame-language-${{ github.sha }}
+ path: language/*/*.mo
+ if-no-files-found: error
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000000..f5231d17f98
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,51 @@
+*~
+.*.sw?
+*.mo
+*.orig
+*.pyc
+*.pyo
+*.rej
+*.L68
+*.S68
+.DS_Store
+
+/*
+/*/
+!/.github/
+!/3rdparty/
+!/android-project/
+!/benchmarks/
+!/artwork/
+!/bgfx/
+!/docs/
+!/hash/
+!/hlsl/
+!/keymaps/
+!/language/
+!/nl_examples/
+!/plugins/
+!/projects/
+!/regtests/
+!/samples/
+!/scripts/
+!/src/
+!/shaders/
+!/tests/
+!/doxygen/
+!/web/
+!/.gitattributes
+!/.gitignore
+!/.travis.yml
+!/makefile
+!/mame.doxygen
+!/*.md
+!/*.bdf
+!/LICENSE
+/.idea
+.vscode
+docs/build
+docs/source/_build
+regtests/chdman/temp
+regtests/jedutil/output
+/CMakeLists.txt
+/samples
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 00000000000..7e730d917ac
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,44 @@
+language: cpp
+dist: focal
+addons:
+ apt:
+ sources:
+ - ubuntu-toolchain-r-test
+ packages:
+ - gcc-10
+ - g++-10
+ - libsdl2-dev
+ - libsdl2-ttf-dev
+ - libasound2-dev
+ - libxinerama-dev
+ - libxi-dev
+ - qtbase5-dev
+ - qtbase5-dev-tools
+ update: true
+jobs:
+ include:
+ - os: linux
+ arch: arm64
+ compiler: gcc
+ env: SUBTARGET=ci MAME=mameci
+ - os: linux
+ arch: s390x
+ compiler: gcc
+ env: SUBTARGET=ci MAME=mameci64
+ - os: linux
+ arch: ppc64le
+ compiler: gcc
+ env: SUBTARGET=ci MAME=mameci64
+ allow_failures:
+ - arch: ppc64le
+ fast_finish: true
+script:
+ - if [ $CC == 'clang' ]; then
+ make -j2 IGNORE_GIT=1 OVERRIDE_CXX="clang++-3.6" OVERRIDE_CC="clang-3.6" TOOLS=1 && ./$MAME -validate;
+ else make -j4 IGNORE_GIT=1 OPTIMIZE=0 OVERRIDE_CC="gcc-10" OVERRIDE_CXX="g++-10" TOOLS=1 && ./$MAME -validate;
+ fi
+branches:
+ only:
+ - master
+notifications:
+ email: false
diff --git a/3rdparty/README.md b/3rdparty/README.md
new file mode 100644
index 00000000000..25c4fc0b9f9
--- /dev/null
+++ b/3rdparty/README.md
@@ -0,0 +1,75 @@
+# **3rdparty** #
+
+aescbc - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+asio - [Boost Software License](http://www.boost.org/LICENSE_1_0.txt)
+
+asmjit - [zlib license](http://opensource.org/licenses/Zlib)
+
+benchmark - [Apache License, Version 2.0](http://opensource.org/licenses/Apache-2.0) (used only for testing, not part of distribution)
+
+bgfx - [The BSD 2-Clause License](http://opensource.org/licenses/BSD-2-Clause)
+
+bimg - [The BSD 2-Clause License](http://opensource.org/licenses/BSD-2-Clause)
+
+bx - [The BSD 2-Clause License](http://opensource.org/licenses/BSD-2-Clause)
+
+catch - [Boost Software License](http://www.boost.org/LICENSE_1_0.txt)
+
+compat - Wine headers missing in MinGW [The GNU Lesser General Public License, version 2.1 (LGPL-2.1)](http://opensource.org/licenses/LGPL-2.1)
+
+**note that this one contain headers only and that real library/dll is dynamically loaded so use in commercial project is allowed, will be removed when becomes part of MinGW distribution**
+
+dxsdk - [DirectX SDK EULA](https://github.com/mamedev/mame/blob/master/3rdparty/dxsdk/Documentation/License%20Agreements/DirectX%20SDK%20EULA.txt)
+
+expat - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+flac - [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause) (codecs), [The GNU General Public License, version 2](https://opensource.org/licenses/GPL-2.0)
+
+genie - [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause)
+
+glm - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+libjpeg - [Custom BSD-like](https://github.com/numenta/nupic/blob/master/external/licenses/LICENSE.libjpeg-6b.txt)
+
+linenoise - [The BSD 2-Clause License](http://opensource.org/licenses/BSD-2-Clause)
+
+lsqlite3 - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+lua - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+lua-linenoise - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+lua-zlib - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+luafilesystem - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+lzma - Custom public domain license
+
+minimp3 - [Creative Commons Zero v1.0 Universal](https://creativecommons.org/publicdomain/zero/1.0/)
+
+nanosvg - [zlib license](http://opensource.org/licenses/Zlib)
+
+portaudio - [The MIT License (MIT)](http://opensource.org/licenses/MIT) explanation at [their site](http://www.portaudio.com/license.html)
+
+portmidi - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+pugixml - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+rapidjson - [The MIT License (MIT)](http://opensource.org/licenses/MIT), [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause) (msinttypes), JSON license (JSON_checker)
+
+softfloat3 - [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause)
+
+sol2 - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+sqlite3 - Custom public domain license
+
+tap-windows6.h - Dual-licensed [The GNU General Public License, version 2](https://opensource.org/licenses/GPL-2.0) and [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+utf8proc - [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+wdlfft - [zlib license](http://opensource.org/licenses/Zlib)
+
+zlib - [zlib license](http://opensource.org/licenses/Zlib)
+
+zstd - Dual-licensed [The BSD 3-Clause License](http://opensource.org/licenses/BSD-3-Clause) and [The GNU General Public License, version 2](https://opensource.org/licenses/GPL-2.0)
diff --git a/3rdparty/aes256cbc/AES_256_CBC.h b/3rdparty/aes256cbc/AES_256_CBC.h
new file mode 100644
index 00000000000..c2cf4a42021
--- /dev/null
+++ b/3rdparty/aes256cbc/AES_256_CBC.h
@@ -0,0 +1,993 @@
+#ifndef __AES_256_CBC_H__
+#define __AES_256_CBC_H__
+
+#define AES_BLOCK_SIZE 16
+#define AES_KEY_SIZE 32
+
+#define GETU32(in_data) (((unsigned int)(in_data)[0] << 24) ^ \
+ ((unsigned int)(in_data)[1] << 16) ^ \
+ ((unsigned int)(in_data)[2] << 8) ^ \
+ ((unsigned int)(in_data)[3] << 0))
+
+#define PUTU32(out_data, st) { (out_data)[0] = (unsigned char)((st) >> 24); \
+ (out_data)[1] = (unsigned char)((st) >> 16); \
+ (out_data)[2] = (unsigned char)((st) >> 8); \
+ (out_data)[3] = (unsigned char)((st) >> 0); }
+
+static const unsigned int Te0[256] =
+{
+ 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
+ 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
+ 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
+ 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
+ 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
+ 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
+ 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
+ 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
+ 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
+ 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
+ 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
+ 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
+ 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
+ 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
+ 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
+ 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
+ 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
+ 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
+ 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
+ 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
+ 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
+ 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
+ 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
+ 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
+ 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
+ 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
+ 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
+ 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
+ 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
+ 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
+ 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
+ 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
+ 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
+ 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
+ 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
+ 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
+ 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
+ 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
+ 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
+ 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
+ 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
+ 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
+ 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
+ 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
+ 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
+ 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
+ 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
+ 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
+ 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
+ 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
+ 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
+ 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
+ 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
+ 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
+ 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
+ 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
+ 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
+ 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
+ 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
+ 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
+ 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
+ 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
+ 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
+ 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
+};
+
+static const unsigned int Te1[256] =
+{
+ 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
+ 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
+ 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
+ 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
+ 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
+ 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
+ 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
+ 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
+ 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
+ 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
+ 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
+ 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
+ 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
+ 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
+ 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
+ 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
+ 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
+ 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
+ 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
+ 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
+ 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
+ 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
+ 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
+ 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
+ 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
+ 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
+ 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
+ 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
+ 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
+ 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
+ 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
+ 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
+ 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
+ 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
+ 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
+ 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
+ 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
+ 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
+ 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
+ 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
+ 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
+ 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
+ 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
+ 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
+ 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
+ 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
+ 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
+ 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
+ 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
+ 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
+ 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
+ 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
+ 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
+ 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
+ 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
+ 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
+ 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
+ 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
+ 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
+ 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
+ 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
+ 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
+ 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
+ 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
+};
+
+static const unsigned int Te2[256] =
+{
+ 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
+ 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
+ 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
+ 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
+ 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
+ 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
+ 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
+ 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
+ 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
+ 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
+ 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
+ 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
+ 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
+ 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
+ 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
+ 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
+ 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
+ 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
+ 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
+ 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
+ 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
+ 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
+ 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
+ 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
+ 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
+ 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
+ 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
+ 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
+ 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
+ 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
+ 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
+ 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
+ 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
+ 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
+ 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
+ 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
+ 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
+ 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
+ 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
+ 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
+ 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
+ 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
+ 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
+ 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
+ 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
+ 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
+ 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
+ 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
+ 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
+ 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
+ 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
+ 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
+ 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
+ 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
+ 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
+ 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
+ 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
+ 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
+ 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
+ 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
+ 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
+ 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
+ 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
+ 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
+};
+
+static const unsigned int Te3[256] =
+{
+ 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
+ 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
+ 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
+ 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
+ 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
+ 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
+ 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
+ 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
+ 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
+ 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
+ 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
+ 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
+ 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
+ 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
+ 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
+ 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
+ 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
+ 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
+ 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
+ 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
+ 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
+ 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
+ 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
+ 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
+ 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
+ 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
+ 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
+ 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
+ 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
+ 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
+ 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
+ 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
+ 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
+ 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
+ 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
+ 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
+ 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
+ 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
+ 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
+ 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
+ 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
+ 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
+ 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
+ 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
+ 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
+ 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
+ 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
+ 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
+ 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
+ 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
+ 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
+ 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
+ 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
+ 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
+ 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
+ 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
+ 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
+ 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
+ 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
+ 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
+ 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
+ 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
+ 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
+ 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
+};
+
+static const unsigned int Te4[256] =
+{
+ 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
+ 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
+ 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
+ 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
+ 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
+ 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
+ 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
+ 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
+ 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
+ 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
+ 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
+ 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
+ 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
+ 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
+ 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
+ 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
+ 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
+ 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
+ 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
+ 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
+ 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
+ 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
+ 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
+ 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
+ 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
+ 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
+ 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
+ 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
+ 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
+ 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
+ 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
+ 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
+ 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
+ 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
+ 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
+ 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
+ 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
+ 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
+ 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
+ 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
+ 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
+ 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
+ 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
+ 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
+ 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
+ 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
+ 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
+ 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
+ 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
+ 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
+ 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
+ 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
+ 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
+ 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
+ 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
+ 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
+ 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
+ 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
+ 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
+ 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
+ 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
+ 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
+ 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
+ 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
+};
+
+static const unsigned int Td0[256] =
+{
+ 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
+ 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
+ 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
+ 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
+ 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
+ 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
+ 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
+ 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
+ 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
+ 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
+ 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
+ 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
+ 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
+ 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
+ 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
+ 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
+ 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
+ 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
+ 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
+ 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
+ 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
+ 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
+ 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
+ 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
+ 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
+ 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
+ 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
+ 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
+ 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
+ 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
+ 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
+ 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
+ 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
+ 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
+ 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
+ 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
+ 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
+ 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
+ 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
+ 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
+ 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
+ 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
+ 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
+ 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
+ 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
+ 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
+ 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
+ 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
+ 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
+ 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
+ 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
+ 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
+ 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
+ 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
+ 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
+ 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
+ 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
+ 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
+ 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
+ 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
+ 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
+ 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
+ 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
+ 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
+};
+
+static const unsigned int Td1[256] =
+{
+ 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
+ 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
+ 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
+ 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
+ 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
+ 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
+ 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
+ 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
+ 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
+ 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
+ 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
+ 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
+ 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
+ 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
+ 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
+ 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
+ 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
+ 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
+ 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
+ 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
+ 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
+ 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
+ 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
+ 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
+ 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
+ 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
+ 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
+ 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
+ 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
+ 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
+ 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
+ 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
+ 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
+ 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
+ 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
+ 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
+ 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
+ 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
+ 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
+ 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
+ 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
+ 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
+ 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
+ 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
+ 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
+ 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
+ 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
+ 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
+ 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
+ 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
+ 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
+ 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
+ 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
+ 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
+ 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
+ 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
+ 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
+ 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
+ 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
+ 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
+ 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
+ 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
+ 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
+ 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
+};
+
+static const unsigned int Td2[256] =
+{
+ 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
+ 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
+ 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
+ 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
+ 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
+ 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
+ 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
+ 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
+ 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
+ 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
+ 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
+ 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
+ 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
+ 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
+ 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
+ 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
+ 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
+ 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
+ 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
+ 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
+ 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
+ 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
+ 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
+ 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
+ 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
+ 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
+ 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
+ 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
+ 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
+ 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
+ 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
+ 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
+ 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
+ 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
+ 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
+ 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
+ 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
+ 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
+ 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
+ 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
+ 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
+ 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
+ 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
+ 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
+ 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
+ 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
+ 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
+ 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
+ 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
+ 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
+ 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
+ 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
+ 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
+ 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
+ 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
+ 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
+ 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
+ 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
+ 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
+ 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
+ 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
+ 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
+ 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
+ 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
+};
+
+static const unsigned int Td3[256] =
+{
+ 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
+ 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
+ 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
+ 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
+ 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
+ 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
+ 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
+ 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
+ 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
+ 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
+ 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
+ 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
+ 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
+ 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
+ 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
+ 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
+ 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
+ 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
+ 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
+ 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
+ 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
+ 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
+ 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
+ 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
+ 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
+ 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
+ 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
+ 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
+ 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
+ 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
+ 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
+ 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
+ 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
+ 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
+ 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
+ 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
+ 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
+ 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
+ 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
+ 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
+ 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
+ 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
+ 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
+ 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
+ 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
+ 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
+ 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
+ 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
+ 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
+ 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
+ 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
+ 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
+ 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
+ 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
+ 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
+ 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
+ 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
+ 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
+ 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
+ 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
+ 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
+ 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
+ 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
+ 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
+};
+
+static const unsigned int Td4[256] =
+{
+ 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
+ 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
+ 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
+ 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
+ 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
+ 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
+ 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
+ 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
+ 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
+ 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
+ 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
+ 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
+ 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
+ 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
+ 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
+ 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
+ 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
+ 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
+ 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
+ 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
+ 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
+ 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
+ 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
+ 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
+ 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
+ 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
+ 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
+ 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
+ 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
+ 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
+ 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
+ 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
+ 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
+ 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
+ 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
+ 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
+ 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
+ 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
+ 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
+ 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
+ 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
+ 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
+ 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
+ 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
+ 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
+ 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
+ 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
+ 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
+ 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
+ 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
+ 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
+ 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
+ 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
+ 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
+ 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
+ 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
+ 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
+ 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
+ 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
+ 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
+ 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
+ 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
+ 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
+ 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
+};
+
+static const unsigned int rcon[10] = {
+ 0x01000000, 0x02000000, 0x04000000, 0x08000000,
+ 0x10000000, 0x20000000, 0x40000000, 0x80000000,
+ 0x1B000000, 0x36000000
+};
+
+typedef struct {
+ unsigned int roundkey[60];
+ unsigned int iv[4];
+} AES_CTX;
+
+void AES_EncryptInit(AES_CTX *ctx, const unsigned char *key, const unsigned char *iv) {
+ ctx->roundkey[0] = GETU32(key + 0);
+ ctx->roundkey[1] = GETU32(key + 4);
+ ctx->roundkey[2] = GETU32(key + 8);
+ ctx->roundkey[3] = GETU32(key + 12);
+ ctx->roundkey[4] = GETU32(key + 16);
+ ctx->roundkey[5] = GETU32(key + 20);
+ ctx->roundkey[6] = GETU32(key + 24);
+ ctx->roundkey[7] = GETU32(key + 28);
+
+ ctx->iv[0] = GETU32(iv + 0);
+ ctx->iv[1] = GETU32(iv + 4);
+ ctx->iv[2] = GETU32(iv + 8);
+ ctx->iv[3] = GETU32(iv + 12);
+
+ for (unsigned char index = 8; index < 60; index += 8) {
+ ctx->roundkey[index] = ctx->roundkey[index - 8] ^
+ (Te4[(ctx->roundkey[index - 1] >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(ctx->roundkey[index - 1] >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(ctx->roundkey[index - 1] >> 0) & 0xff] & 0x0000ff00) ^
+ (Te4[(ctx->roundkey[index - 1] >> 24) & 0xff] & 0x000000ff) ^ rcon[index / 8 -1];
+ ctx->roundkey[index + 1] = ctx->roundkey[index - 7] ^ ctx->roundkey[index];
+ ctx->roundkey[index + 2] = ctx->roundkey[index - 6] ^ ctx->roundkey[index + 1];
+ ctx->roundkey[index + 3] = ctx->roundkey[index - 5] ^ ctx->roundkey[index + 2];
+
+ if (index == 56) {
+ break;
+ }
+
+ ctx->roundkey[index + 4] = ctx->roundkey[index - 4] ^
+ (Te4[(ctx->roundkey[index + 3] >> 24)] & 0xff000000) ^
+ (Te4[(ctx->roundkey[index + 3] >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(ctx->roundkey[index + 3] >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(ctx->roundkey[index + 3] >> 0) & 0xff] & 0x000000ff);
+ ctx->roundkey[index + 5] = ctx->roundkey[index - 3] ^ ctx->roundkey[index + 4];
+ ctx->roundkey[index + 6] = ctx->roundkey[index - 2] ^ ctx->roundkey[index + 5];
+ ctx->roundkey[index + 7] = ctx->roundkey[index - 1] ^ ctx->roundkey[index + 6];
+ }
+}
+
+void AES_DecryptInit(AES_CTX *ctx, const unsigned char *key, const unsigned char *iv) {
+ AES_EncryptInit(ctx, key, iv);
+
+ unsigned int temp;
+
+ // Next, invert the order of the round keys.
+ for (unsigned char i = 0, j = 56; i < j; i += 4, j -= 4) {
+ temp = ctx->roundkey[i + 0];
+ ctx->roundkey[i + 0] = ctx->roundkey[j + 0];
+ ctx->roundkey[j + 0] = temp;
+
+ temp = ctx->roundkey[i + 1];
+ ctx->roundkey[i + 1] = ctx->roundkey[j + 1];
+ ctx->roundkey[j + 1] = temp;
+
+ temp = ctx->roundkey[i + 2];
+ ctx->roundkey[i + 2] = ctx->roundkey[j + 2];
+ ctx->roundkey[j + 2] = temp;
+
+ temp = ctx->roundkey[i + 3];
+ ctx->roundkey[i + 3] = ctx->roundkey[j + 3];
+ ctx->roundkey[j + 3] = temp;
+ }
+
+ // Finally, apply the inverse MixColumn transform to all round keys except the first and last.
+ for (unsigned char index = 4; index < 56; index += 4) {
+ ctx->roundkey[index] =
+ Td0[Te4[(ctx->roundkey[index] >> 24) & 0xff] & 0xff] ^
+ Td1[Te4[(ctx->roundkey[index] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(ctx->roundkey[index] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(ctx->roundkey[index] >> 0) & 0xff] & 0xff];
+ ctx->roundkey[index + 1] =
+ Td0[Te4[(ctx->roundkey[index + 1] >> 24) & 0xff] & 0xff] ^
+ Td1[Te4[(ctx->roundkey[index + 1] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(ctx->roundkey[index + 1] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(ctx->roundkey[index + 1] >> 0) & 0xff] & 0xff];
+ ctx->roundkey[index + 2] =
+ Td0[Te4[(ctx->roundkey[index + 2] >> 24) & 0xff] & 0xff] ^
+ Td1[Te4[(ctx->roundkey[index + 2] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(ctx->roundkey[index + 2] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(ctx->roundkey[index + 2] >> 0) & 0xff] & 0xff];
+ ctx->roundkey[index + 3] =
+ Td0[Te4[(ctx->roundkey[index + 3] >> 24) & 0xff] & 0xff] ^
+ Td1[Te4[(ctx->roundkey[index + 3] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(ctx->roundkey[index + 3] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(ctx->roundkey[index + 3] >> 0) & 0xff] & 0xff];
+ }
+}
+
+void AES_Encrypt(AES_CTX *ctx, const unsigned char in_data[AES_BLOCK_SIZE], unsigned char out_data[AES_BLOCK_SIZE]) {
+ unsigned int s0, s1, s2, s3, t0, t1, t2, t3;
+
+ s0 = GETU32(in_data + 0) ^ ctx->iv[0] ^ ctx->roundkey[0];
+ s1 = GETU32(in_data + 4) ^ ctx->iv[1] ^ ctx->roundkey[1];
+ s2 = GETU32(in_data + 8) ^ ctx->iv[2] ^ ctx->roundkey[2];
+ s3 = GETU32(in_data + 12) ^ ctx->iv[3] ^ ctx->roundkey[3];
+
+ // round 1
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[ 4];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[ 5];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[ 6];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[ 7];
+ // round 2
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[ 8];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[ 9];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[10];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[11];
+ // round 3
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[12];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[13];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[14];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[15];
+ // round 4
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[16];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[17];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[18];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[19];
+ // round 5
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[20];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[21];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[22];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[23];
+ // round 6
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[24];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[25];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[26];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[27];
+ // round 7
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[28];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[29];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[30];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[31];
+ // round 8
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[32];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[33];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[34];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[35];
+ // round 9
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[36];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[37];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[38];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[39];
+ // round 10
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[40];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[41];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[42];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[43];
+ // round 11
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[44];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[45];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[46];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[47];
+ // round 12
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ ctx->roundkey[48];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ ctx->roundkey[49];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ ctx->roundkey[50];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ ctx->roundkey[51];
+ // round 13
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ ctx->roundkey[52];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ ctx->roundkey[53];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ ctx->roundkey[54];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ ctx->roundkey[55];
+
+ // Apply the final round and map the cipher state to a byte array block
+ s0 = (Te4[(t0 >> 24) & 0xff] & 0xff000000) ^ (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t3 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[56];
+ s1 = (Te4[(t1 >> 24) & 0xff] & 0xff000000) ^ (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t0 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[57];
+ s2 = (Te4[(t2 >> 24) & 0xff] & 0xff000000) ^ (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t1 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[58];
+ s3 = (Te4[(t3 >> 24) & 0xff] & 0xff000000) ^ (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Te4[(t2 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[59];
+
+ PUTU32(out_data + 0, s0);
+ PUTU32(out_data + 4, s1);
+ PUTU32(out_data + 8, s2);
+ PUTU32(out_data + 12, s3);
+
+ ctx->iv[0] = s0;
+ ctx->iv[1] = s1;
+ ctx->iv[2] = s2;
+ ctx->iv[3] = s3;
+}
+
+void AES_Decrypt(AES_CTX *ctx, const unsigned char in_data[AES_BLOCK_SIZE], unsigned char out_data[AES_BLOCK_SIZE]) {
+ unsigned int s0, s1, s2, s3, t0, t1, t2, t3, temp[4];
+
+ s0 = GETU32(in_data + 0) ^ ctx->roundkey[0];
+ s1 = GETU32(in_data + 4) ^ ctx->roundkey[1];
+ s2 = GETU32(in_data + 8) ^ ctx->roundkey[2];
+ s3 = GETU32(in_data + 12) ^ ctx->roundkey[3];
+
+ temp[0] = GETU32(in_data + 0);
+ temp[1] = GETU32(in_data + 4);
+ temp[2] = GETU32(in_data + 8);
+ temp[3] = GETU32(in_data + 12);
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[ 4];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[ 5];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[ 6];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[ 7];
+
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[ 8];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[ 9];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[10];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[11];
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[12];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[13];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[14];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[15];
+
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[16];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[17];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[18];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[19];
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[20];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[21];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[22];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[23];
+
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[24];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[25];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[26];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[27];
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[28];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[29];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[30];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[31];
+
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[32];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[33];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[34];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[35];
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[36];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[37];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[38];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[39];
+
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[40];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[41];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[42];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[43];
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[44];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[45];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[46];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[47];
+
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ ctx->roundkey[48];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ ctx->roundkey[49];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ ctx->roundkey[50];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ ctx->roundkey[51];
+
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ ctx->roundkey[52];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ ctx->roundkey[53];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ ctx->roundkey[54];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ ctx->roundkey[55];
+
+ s0 = (Td4[(t0 >> 24) & 0xff] & 0xff000000) ^ (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t1 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[56];
+ s1 = (Td4[(t1 >> 24) & 0xff] & 0xff000000) ^ (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t2 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[57];
+ s2 = (Td4[(t2 >> 24) & 0xff] & 0xff000000) ^ (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t3 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[58];
+ s3 = (Td4[(t3 >> 24) & 0xff] & 0xff000000) ^ (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Td4[(t0 >> 0) & 0xff] & 0x000000ff) ^ ctx->roundkey[59];
+
+ PUTU32(out_data + 0, s0 ^ ctx->iv[0]);
+ PUTU32(out_data + 4, s1 ^ ctx->iv[1]);
+ PUTU32(out_data + 8, s2 ^ ctx->iv[2]);
+ PUTU32(out_data + 12, s3 ^ ctx->iv[3]);
+
+ ctx->iv[0] = temp[0];
+ ctx->iv[1] = temp[1];
+ ctx->iv[2] = temp[2];
+ ctx->iv[3] = temp[3];
+}
+
+void AES_CTX_Free(AES_CTX *ctx) {
+ for (int index = 0; index < 60; index++) {
+ ctx->roundkey[index] = 0x00;
+ }
+
+ ctx->iv[0] = 0x00;
+ ctx->iv[1] = 0x00;
+ ctx->iv[2] = 0x00;
+ ctx->iv[3] = 0x00;
+}
+
+#endif
diff --git a/3rdparty/aes256cbc/LICENSE b/3rdparty/aes256cbc/LICENSE
new file mode 100644
index 00000000000..348d370b85b
--- /dev/null
+++ b/3rdparty/aes256cbc/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Hallo Weeks
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/3rdparty/aes256cbc/README.md b/3rdparty/aes256cbc/README.md
new file mode 100644
index 00000000000..d3825e64a99
--- /dev/null
+++ b/3rdparty/aes256cbc/README.md
@@ -0,0 +1,231 @@
+## Overview
+This GitHub repository contains a standard implementation of the Advanced Encryption Standard (AES) with a focus on AES-256 CBC (Cipher Block Chaining) encryption. AES-256 is a highly secure encryption standard due to its 256-bit key size, providing robust protection for sensitive data. CBC mode ensures increased security by chaining each plaintext block to the previous ciphertext block before encryption, making it resistant to certain cryptographic attacks.
+
+## Features
+- **Header-only:** No need for external dependencies, simplifying integration into existing projects.
+- **AES-256-CBC support:** Enables robust encryption and decryption using the Advanced Encryption Standard with a 256-bit key size and Cipher Block Chaining mode.
+- **Seamless integration:** Provides straightforward usage examples for effortless incorporation into applications.
+- **Compatibility:** Data encrypted using this standard AES-256 CBC algorithm can be decrypted using any compliant AES-256 CBC decryption implementation.
+
+## Usage
+
+To utilize this standard AES-256 CBC implementation, follow the instructions provided below:
+
+### Including "AES_256_CBC.h" Header
+
+Before utilizing the AES encryption and decryption functions, ensure that you've included the "AES_256_CBC.h" header in your code. This header provides access to the AES functionality.
+
+```c
+#include "AES_256_CBC.h"
+```
+
+
+### AES Context Initialization
+
+To perform AES encryption and decryption, you must initialize an AES context. This context serves as a container for maintaining the encryption and decryption state.
+
+```c
+AES_CTX ctx;
+```
+
+### Initialize Encryption
+
+To perform encryption, initialize the AES context and provide the encryption key and iv.
+
+```c
+AES_EncryptInit(&ctx, key, iv);
+```
+
+
+
+### Encryption Function
+
+The AES encryption function allows you to encrypt a single blocks of data, and this implementation does not support padding. Ensure that you provide data blocks of precisely 16 bytes.
+
+```c
+AES_Encrypt(&ctx, plaintext, ciphertext);
+```
+
+
+### Initialize Decryption
+
+To perform decryption, initialize the AES context with the same key used for encryption.
+
+```c
+AES_DecryptInit(&ctx, key, iv);
+```
+
+### Decryption Function
+
+The AES decryption function allows you to decrypt a single blocks of data, and this implementation does not support padding. Ensure that you provide ciphertext blocks of precisely 16 bytes.
+
+```c
+AES_Decrypt(&ctx, ciphertext, plaintext);
+```
+
+### Encryption and Decryption Function Completion
+
+After you have finished using the AES encryption and decryption functions and no longer require the AES context, it's essential to clear sensitive information from memory. Use the following function to achieve this:
+
+```c
+AES_CTX_Free(&ctx);
+```
+
+### Example Code (main.c)
+
+Here's an example code snippet in C for using this standard AES-256 CBC implementation:
+
+```c
+#include <stdio.h>
+#include "AES_256_CBC.h"
+
+// Function to print the title and hexadecimal representation of data
+void output(const char *title, const unsigned char *data, unsigned int size) {
+ printf("%s", title);
+ for (unsigned int index = 0; index < size; index++) {
+ printf("%02X", data[index]);
+ }
+ printf("\n");
+}
+
+int main(int argc, const char *argv[]) {
+ // AES-256 key (32 bytes)
+ unsigned char key[AES_KEY_SIZE] = {
+ 0x49, 0x2F, 0xA8, 0x1E, 0xD7, 0x82, 0x4C, 0x93,
+ 0x36, 0x7B, 0xC1, 0xF8, 0xA0, 0xE5, 0x1A, 0x5D,
+ 0x98, 0xA1, 0x01, 0x11, 0x32, 0xE3, 0xC6, 0xC1,
+ 0xF3, 0x5C, 0x3A, 0xD6, 0x1E, 0x64, 0x12, 0xD6
+ };
+
+ // AES-256 iv (16 bytes)
+ unsigned char iv[AES_BLOCK_SIZE] = {
+ 0x3A, 0x04, 0x2F, 0x3D, 0x37, 0x61, 0x34, 0x3D,
+ 0x49, 0x60, 0x33, 0x63, 0x4A, 0x3D, 0x36, 0x63
+ };
+
+
+ // Data block to be encrypted (16 bytes)
+ unsigned char data[AES_BLOCK_SIZE] = {
+ 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20,
+ 0x61, 0x6E, 0x20, 0x64, 0x61, 0x74, 0x61, 0x21
+ };
+
+ // Print original data
+ output("ori: 0x", data, 16);
+
+ // Initialize AES context
+ AES_CTX ctx;
+
+ // Initialize encryption with the provided key and iv
+ AES_EncryptInit(&ctx, key, iv);
+
+ // Perform encryption
+ AES_Encrypt(&ctx, data, data);
+
+ // Print encrypted data
+ output("enc: 0x", data, 16);
+
+ // Initialize decryption with the same key and iv
+ AES_DecryptInit(&ctx, key, iv);
+
+ // Perform decryption
+ AES_Decrypt(&ctx, data, data);
+
+ // Print decrypted data
+ output("dec: 0x", data, 16);
+
+ // Clean up: zero out the round key array for security purposes
+ AES_CTX_Free(&ctx);
+
+ return 0;
+}
+```
+
+### Example Code (main.c)
+
+Here's an example code snippet in C demonstrating AES-256 CBC encryption and decryption with PKCS#7 padding support:
+
+```c
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdint.h>
+#include "AES_256_CBC.h"
+
+// Encryption data with padding PKCS7
+uint32_t EncryptData(uint8_t *data, uint32_t size, const uint8_t *key, const uint8_t *iv) {
+ uint8_t padding_size = AES_BLOCK_SIZE - (size % AES_BLOCK_SIZE);
+ uint32_t data_size = size + padding_size;
+
+ // adding padding value
+ for (uint8_t index = 0; index < padding_size; index++) {
+ data[size + index] = padding_size;
+ }
+
+ AES_CTX ctx;
+ AES_EncryptInit(&ctx, key, iv);
+
+ for (uint32_t offset = 0; offset < data_size; offset += AES_BLOCK_SIZE) {
+ AES_Encrypt(&ctx, data + offset, data + offset);
+ }
+
+ AES_CTX_Free(&ctx);
+
+ return data_size;
+}
+
+// Decryption data with padding PKCS7
+uint32_t DecryptData(uint8_t *data, uint32_t size, const uint8_t *key, const uint8_t *iv) {
+ AES_CTX ctx;
+ AES_DecryptInit(&ctx, key, iv);
+
+ for (uint32_t offset = 0; offset < size; offset += AES_BLOCK_SIZE) {
+ AES_Decrypt(&ctx, data + offset, data + offset);
+ }
+
+ AES_CTX_Free(&ctx);
+
+ return size - data[size - 1];
+}
+
+
+void output(const char *title, const uint8_t *data, unsigned int size) {
+ printf("%s", title);
+ for (unsigned int index = 0; index < size; index++) {
+ printf("%02X", data[index]);
+ }
+ printf("\n");
+}
+
+int main(int argc, const char *argv[]) {
+ uint8_t data[32];
+ uint8_t key[AES_KEY_SIZE];
+ uint8_t iv[AES_BLOCK_SIZE];
+ int data_len = 0;
+
+ memcpy(data, "halloweeks", 10);
+ memset(key, 0x69, 32);
+ memset(iv, 0x78, 16);
+ data_len = 10; // original data length
+
+ output("ori: 0x", data, data_len);
+
+ data_len = EncryptData(data, data_len, key, iv);
+
+ output("enc: 0x", data, data_len);
+
+ data_len = DecryptData(data, data_len, key, iv);
+
+ output("dec: 0x", data, data_len);
+ return 0;
+}
+```
+
+## Contributions
+
+Contributions and feedback are welcome! If you find issues or have ideas for improvements, please open an issue or submit a pull request.
+
+## License
+
+This standard AES-256 CBC implementation is provided under the [MIT License](./LICENSE).
diff --git a/3rdparty/asio/COPYING b/3rdparty/asio/COPYING
new file mode 100644
index 00000000000..da1a2db4d7b
--- /dev/null
+++ b/3rdparty/asio/COPYING
@@ -0,0 +1,4 @@
+Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+
+Distributed under the Boost Software License, Version 1.0. (See accompanying
+file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
diff --git a/3rdparty/asio/INSTALL b/3rdparty/asio/INSTALL
new file mode 100644
index 00000000000..1dd78db1878
--- /dev/null
+++ b/3rdparty/asio/INSTALL
@@ -0,0 +1,5 @@
+See doc/index.html for information on:
+ - External dependencies
+ - Using, building, and configuring Asio
+ - Supported platforms
+ - How to build the tests and examples
diff --git a/3rdparty/asio/LICENSE_1_0.txt b/3rdparty/asio/LICENSE_1_0.txt
new file mode 100644
index 00000000000..36b7cd93cdf
--- /dev/null
+++ b/3rdparty/asio/LICENSE_1_0.txt
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/3rdparty/asio/Makefile.am b/3rdparty/asio/Makefile.am
new file mode 100644
index 00000000000..bc4f75b3553
--- /dev/null
+++ b/3rdparty/asio/Makefile.am
@@ -0,0 +1,22 @@
+AUTOMAKE_OPTIONS = foreign dist-bzip2 dist-zip
+
+pkgconfig_DATA = asio.pc
+pkgconfigdir = $(libdir)/pkgconfig
+
+SUBDIRS = include src
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/aclocal.m4 \
+ $(srcdir)/configure \
+ $(srcdir)/config.guess \
+ $(srcdir)/config.sub \
+ $(srcdir)/depcomp \
+ $(srcdir)/install-sh \
+ $(srcdir)/missing \
+ $(srcdir)/mkinstalldirs \
+ $(srcdir)/Makefile.in \
+ asio-*.tar.gz
+
+EXTRA_DIST = \
+ LICENSE_1_0.txt \
+ doc
diff --git a/3rdparty/asio/Makefile.in b/3rdparty/asio/Makefile.in
new file mode 100644
index 00000000000..e3f325123c4
--- /dev/null
+++ b/3rdparty/asio/Makefile.in
@@ -0,0 +1,845 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+ $(am__configure_deps) $(am__DIST_COMMON)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES = asio.pc
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(pkgconfigdir)"
+DATA = $(pkgconfig_DATA)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ cscope distdir distdir-am dist dist-all distcheck
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/asio.pc.in COPYING \
+ INSTALL README compile config.guess config.sub depcomp \
+ install-sh missing
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ if test -d "$(distdir)"; then \
+ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -rf "$(distdir)" \
+ || { sleep 5 && rm -rf "$(distdir)"; }; \
+ else :; fi
+am__post_remove_distdir = $(am__remove_distdir)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip
+GZIP_ENV = --best
+DIST_TARGETS = dist-bzip2 dist-gzip dist-zip
+# Exists only to be overridden by the user if desired.
+AM_DISTCHECK_DVI_TARGET = dvi
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = $(libdir)/pkgconfig
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = foreign dist-bzip2 dist-zip
+pkgconfig_DATA = asio.pc
+SUBDIRS = include src
+MAINTAINERCLEANFILES = \
+ $(srcdir)/aclocal.m4 \
+ $(srcdir)/configure \
+ $(srcdir)/config.guess \
+ $(srcdir)/config.sub \
+ $(srcdir)/depcomp \
+ $(srcdir)/install-sh \
+ $(srcdir)/missing \
+ $(srcdir)/mkinstalldirs \
+ $(srcdir)/Makefile.in \
+ asio-*.tar.gz
+
+EXTRA_DIST = \
+ LICENSE_1_0.txt \
+ doc
+
+all: all-recursive
+
+.SUFFIXES:
+am--refresh: Makefile
+ @:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ echo ' $(SHELL) ./config.status'; \
+ $(SHELL) ./config.status;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ $(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+asio.pc: $(top_builddir)/config.status $(srcdir)/asio.pc.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+install-pkgconfigDATA: $(pkgconfig_DATA)
+ @$(NORMAL_INSTALL)
+ @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \
+ fi; \
+ for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ echo "$$d$$p"; \
+ done | $(am__base_list) | \
+ while read files; do \
+ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \
+ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \
+ done
+
+uninstall-pkgconfigDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
+ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscope: cscope.files
+ test ! -s cscope.files \
+ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)
+clean-cscope:
+ -rm -f cscope.files
+cscope.files: clean-cscope cscopelist
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ -rm -f cscope.out cscope.in.out cscope.po.out cscope.files
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ $(am__remove_distdir)
+ test -d "$(distdir)" || mkdir "$(distdir)"
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -test -n "$(am__skip_mode_fix)" \
+ || find "$(distdir)" -type d ! -perm -755 \
+ -exec chmod u+rwx,go+rx {} \; -o \
+ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
+ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
+ || chmod -R a+r "$(distdir)"
+dist-gzip: distdir
+ tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+ $(am__post_remove_distdir)
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+ $(am__post_remove_distdir)
+
+dist-lzip: distdir
+ tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+ $(am__post_remove_distdir)
+
+dist-xz: distdir
+ tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+ $(am__post_remove_distdir)
+
+dist-zstd: distdir
+ tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
+ $(am__post_remove_distdir)
+
+dist-tarZ: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__post_remove_distdir)
+
+dist-shar: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
+ shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+ $(am__post_remove_distdir)
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__post_remove_distdir)
+
+dist dist-all:
+ $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'
+ $(am__post_remove_distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ case '$(DIST_ARCHIVES)' in \
+ *.tar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.lz*) \
+ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+ *.tar.xz*) \
+ xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ *.tar.zst*) \
+ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\
+ esac
+ chmod -R a-w $(distdir)
+ chmod u+w $(distdir)
+ mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
+ chmod a-w $(distdir)
+ test -d $(distdir)/_build || exit 0; \
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && am__cwd=`pwd` \
+ && $(am__cd) $(distdir)/_build/sub \
+ && ../../configure \
+ $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+ $(DISTCHECK_CONFIGURE_FLAGS) \
+ --srcdir=../.. --prefix="$$dc_install_base" \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
+ distuninstallcheck \
+ && chmod -R a-w "$$dc_install_base" \
+ && ({ \
+ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
+ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
+ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
+ } || { rm -rf "$$dc_destdir"; exit 1; }) \
+ && rm -rf "$$dc_destdir" \
+ && $(MAKE) $(AM_MAKEFLAGS) dist \
+ && rm -rf $(DIST_ARCHIVES) \
+ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \
+ && cd "$$am__cwd" \
+ || exit 1
+ $(am__post_remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+ @test -n '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: trying to run $@ with an empty' \
+ '$$(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ $(am__cd) '$(distuninstallcheck_dir)' || { \
+ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+ exit 1; \
+ }; \
+ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left after uninstall:" ; \
+ if test -n "$(DESTDIR)"; then \
+ echo " (check DESTDIR support)"; \
+ fi ; \
+ $(distuninstallcheck_listfiles) ; \
+ exit 1; } >&2
+distcleancheck: distclean
+ @if test '$(srcdir)' = . ; then \
+ echo "ERROR: distcleancheck can only run from a VPATH build" ; \
+ exit 1 ; \
+ fi
+ @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
+ || { echo "ERROR: files left in build directory after distclean:" ; \
+ $(distcleancheck_listfiles) ; \
+ exit 1; } >&2
+check-am: all-am
+check: check-recursive
+all-am: Makefile $(DATA)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(pkgconfigdir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am: install-pkgconfigDATA
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f $(am__CONFIG_DISTCLEAN_FILES)
+ -rm -rf $(top_srcdir)/autom4te.cache
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am: uninstall-pkgconfigDATA
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+ am--refresh check check-am clean clean-cscope clean-generic \
+ cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \
+ dist-zstd distcheck distclean distclean-generic distclean-tags \
+ distcleancheck distdir distuninstallcheck dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-pkgconfigDATA install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am uninstall-pkgconfigDATA
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/3rdparty/asio/README b/3rdparty/asio/README
new file mode 100644
index 00000000000..7c7d49dd49e
--- /dev/null
+++ b/3rdparty/asio/README
@@ -0,0 +1,4 @@
+asio version 1.30.2
+Released Tuesday, 16 April 2024.
+
+See doc/index.html for API documentation and a tutorial.
diff --git a/3rdparty/asio/aclocal.m4 b/3rdparty/asio/aclocal.m4
new file mode 100644
index 00000000000..00ffbd53c14
--- /dev/null
+++ b/3rdparty/asio/aclocal.m4
@@ -0,0 +1,1462 @@
+# generated automatically by aclocal 1.16.5 -*- Autoconf -*-
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],,
+[m4_warning([this file was generated for autoconf 2.71.
+You have another version of autoconf. It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically 'autoreconf'.])])
+
+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
+# serial 12 (pkg-config-0.29.2)
+
+dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
+dnl
+dnl This program is free software; you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful, but
+dnl WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program; if not, write to the Free Software
+dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+dnl 02111-1307, USA.
+dnl
+dnl As a special exception to the GNU General Public License, if you
+dnl distribute this file as part of a program that contains a
+dnl configuration script generated by Autoconf, you may include it under
+dnl the same distribution terms that you use for the rest of that
+dnl program.
+
+dnl PKG_PREREQ(MIN-VERSION)
+dnl -----------------------
+dnl Since: 0.29
+dnl
+dnl Verify that the version of the pkg-config macros are at least
+dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
+dnl installed version of pkg-config, this checks the developer's version
+dnl of pkg.m4 when generating configure.
+dnl
+dnl To ensure that this macro is defined, also add:
+dnl m4_ifndef([PKG_PREREQ],
+dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
+dnl
+dnl See the "Since" comment for each macro you use to see what version
+dnl of the macros you require.
+m4_defun([PKG_PREREQ],
+[m4_define([PKG_MACROS_VERSION], [0.29.2])
+m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
+ [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
+])dnl PKG_PREREQ
+
+dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
+dnl ----------------------------------
+dnl Since: 0.16
+dnl
+dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
+dnl first found in the path. Checks that the version of pkg-config found
+dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
+dnl used since that's the first version where most current features of
+dnl pkg-config existed.
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])
+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])
+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])
+
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+ AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test -n "$PKG_CONFIG"; then
+ _pkg_min_version=m4_default([$1], [0.9.0])
+ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ PKG_CONFIG=""
+ fi
+fi[]dnl
+])dnl PKG_PROG_PKG_CONFIG
+
+dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------------------------------
+dnl Since: 0.18
+dnl
+dnl Check to see whether a particular set of modules exists. Similar to
+dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
+dnl
+dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+dnl only at the first occurence in configure.ac, so if the first place
+dnl it's called might be skipped (such as if it is within an "if", you
+dnl have to call PKG_CHECK_EXISTS manually
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test -n "$PKG_CONFIG" && \
+ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+ m4_default([$2], [:])
+m4_ifvaln([$3], [else
+ $3])dnl
+fi])
+
+dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+dnl ---------------------------------------------
+dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
+dnl pkg_failed based on the result.
+m4_define([_PKG_CONFIG],
+[if test -n "$$1"; then
+ pkg_cv_[]$1="$$1"
+ elif test -n "$PKG_CONFIG"; then
+ PKG_CHECK_EXISTS([$3],
+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes ],
+ [pkg_failed=yes])
+ else
+ pkg_failed=untried
+fi[]dnl
+])dnl _PKG_CONFIG
+
+dnl _PKG_SHORT_ERRORS_SUPPORTED
+dnl ---------------------------
+dnl Internal check to see if pkg-config supports short errors.
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi[]dnl
+])dnl _PKG_SHORT_ERRORS_SUPPORTED
+
+
+dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl [ACTION-IF-NOT-FOUND])
+dnl --------------------------------------------------------------
+dnl Since: 0.4.0
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
+dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $2])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test $pkg_failed = yes; then
+ AC_MSG_RESULT([no])
+ _PKG_SHORT_ERRORS_SUPPORTED
+ if test $_pkg_short_errors_supported = yes; then
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
+ else
+ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+ m4_default([$4], [AC_MSG_ERROR(
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT])[]dnl
+ ])
+elif test $pkg_failed = untried; then
+ AC_MSG_RESULT([no])
+ m4_default([$4], [AC_MSG_FAILURE(
+[The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl
+ ])
+else
+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS
+ AC_MSG_RESULT([yes])
+ $3
+fi[]dnl
+])dnl PKG_CHECK_MODULES
+
+
+dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+dnl [ACTION-IF-NOT-FOUND])
+dnl ---------------------------------------------------------------------
+dnl Since: 0.29
+dnl
+dnl Checks for existence of MODULES and gathers its build flags with
+dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
+dnl and VARIABLE-PREFIX_LIBS from --libs.
+dnl
+dnl Note that if there is a possibility the first call to
+dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
+dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
+dnl configure.ac.
+AC_DEFUN([PKG_CHECK_MODULES_STATIC],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+_save_PKG_CONFIG=$PKG_CONFIG
+PKG_CONFIG="$PKG_CONFIG --static"
+PKG_CHECK_MODULES($@)
+PKG_CONFIG=$_save_PKG_CONFIG[]dnl
+])dnl PKG_CHECK_MODULES_STATIC
+
+
+dnl PKG_INSTALLDIR([DIRECTORY])
+dnl -------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable pkgconfigdir as the location where a module
+dnl should install pkg-config .pc files. By default the directory is
+dnl $libdir/pkgconfig, but the default can be changed by passing
+dnl DIRECTORY. The user can override through the --with-pkgconfigdir
+dnl parameter.
+AC_DEFUN([PKG_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+ [pkg-config installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([pkgconfigdir],
+ [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,
+ [with_pkgconfigdir=]pkg_default)
+AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_INSTALLDIR
+
+
+dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
+dnl --------------------------------
+dnl Since: 0.27
+dnl
+dnl Substitutes the variable noarch_pkgconfigdir as the location where a
+dnl module should install arch-independent pkg-config .pc files. By
+dnl default the directory is $datadir/pkgconfig, but the default can be
+dnl changed by passing DIRECTORY. The user can override through the
+dnl --with-noarch-pkgconfigdir parameter.
+AC_DEFUN([PKG_NOARCH_INSTALLDIR],
+[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
+m4_pushdef([pkg_description],
+ [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])
+AC_ARG_WITH([noarch-pkgconfigdir],
+ [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,
+ [with_noarch_pkgconfigdir=]pkg_default)
+AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
+m4_popdef([pkg_default])
+m4_popdef([pkg_description])
+])dnl PKG_NOARCH_INSTALLDIR
+
+
+dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
+dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+dnl -------------------------------------------
+dnl Since: 0.28
+dnl
+dnl Retrieves the value of the pkg-config variable for the given module.
+AC_DEFUN([PKG_CHECK_VAR],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
+
+_PKG_CONFIG([$1], [variable="][$3]["], [$2])
+AS_VAR_COPY([$1], [pkg_cv_][$1])
+
+AS_VAR_IF([$1], [""], [$5], [$4])dnl
+])dnl PKG_CHECK_VAR
+
+# Copyright (C) 2002-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.16'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version. Point them to the right macro.
+m4_if([$1], [1.16.5], [],
+ [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too. Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.16.5])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to
+# '$srcdir', '$srcdir/..', or '$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is '.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ([2.52])dnl
+ m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+
+# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+m4_if([$1], [CC], [depcc="$CC" am_compiler_list=],
+ [$1], [CXX], [depcc="$CXX" am_compiler_list=],
+ [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'],
+ [$1], [UPC], [depcc="$UPC" am_compiler_list=],
+ [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ am__universal=false
+ m4_case([$1], [CC],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac],
+ [CXX],
+ [case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac])
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES.
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE([dependency-tracking], [dnl
+AS_HELP_STRING(
+ [--enable-dependency-tracking],
+ [do not reject slow dependency extractors])
+AS_HELP_STRING(
+ [--disable-dependency-tracking],
+ [speeds up one-time build])])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ AS_CASE([$CONFIG_FILES],
+ [*\'*], [eval set x "$CONFIG_FILES"],
+ [*], [set x $CONFIG_FILES])
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`AS_DIRNAME(["$am_mf"])`
+ am_filepart=`AS_BASENAME(["$am_mf"])`
+ AM_RUN_LOG([cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles]) || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE="gmake" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).])
+ fi
+ AS_UNSET([am_dirpart])
+ AS_UNSET([am_filepart])
+ AS_UNSET([am_mf])
+ AS_UNSET([am_rc])
+ rm -f conftest-deps.mk
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking is enabled.
+# This creates each '.Po' and '.Plo' makefile fragment that we'll need in
+# order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"])])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.65])dnl
+m4_ifdef([_$0_ALREADY_INIT],
+ [m4_fatal([$0 expanded multiple times
+]m4_defn([_$0_ALREADY_INIT]))],
+ [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[AC_DIAGNOSE([obsolete],
+ [$0: two- and three-arguments forms are deprecated.])
+m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(
+ m4_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]),
+ [ok:ok],,
+ [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package])
+ AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])
+AM_MISSING_PROG([AUTOCONF], [autoconf])
+AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])
+AM_MISSING_PROG([AUTOHEADER], [autoheader])
+AM_MISSING_PROG([MAKEINFO], [makeinfo])
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES([CC])],
+ [m4_define([AC_PROG_CC],
+ m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES([CXX])],
+ [m4_define([AC_PROG_CXX],
+ m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+ [_AM_DEPENDENCIES([OBJC])],
+ [m4_define([AC_PROG_OBJC],
+ m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJCXX],
+ [_AM_DEPENDENCIES([OBJCXX])],
+ [m4_define([AC_PROG_OBJCXX],
+ m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl
+])
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+AC_SUBST([CTAGS])
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+AC_SUBST([ETAGS])
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+AC_SUBST([CSCOPE])
+
+AC_REQUIRE([AM_SILENT_RULES])dnl
+dnl The testsuite driver may need to know about EXEEXT, so add the
+dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This
+dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+ [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
+])
+
+dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $_am_arg | $_am_arg:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+AC_SUBST([install_sh])])
+
+# Copyright (C) 2003-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAINTAINER_MODE([DEFAULT-MODE])
+# ----------------------------------
+# Control maintainer-specific portions of Makefiles.
+# Default is to disable them, unless 'enable' is passed literally.
+# For symmetry, 'disable' may be passed as well. Anyway, the user
+# can override the default with the --enable/--disable switch.
+AC_DEFUN([AM_MAINTAINER_MODE],
+[m4_case(m4_default([$1], [disable]),
+ [enable], [m4_define([am_maintainer_other], [disable])],
+ [disable], [m4_define([am_maintainer_other], [enable])],
+ [m4_define([am_maintainer_other], [enable])
+ m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])
+AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode's default is 'disable' unless 'enable' is passed
+ AC_ARG_ENABLE([maintainer-mode],
+ [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],
+ am_maintainer_other[ make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer])],
+ [USE_MAINTAINER_MODE=$enableval],
+ [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST([MAINT])dnl
+]
+)
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check whether make has an 'include' directive that can support all
+# the idioms we need for our automatic dependency tracking code.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive])
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out])
+ AS_CASE([$?:`cat confinc.out 2>/dev/null`],
+ ['0:this is the am__doit target'],
+ [AS_CASE([$s],
+ [BSD], [am__include='.include' am__quote='"'],
+ [am__include='include' am__quote=''])])
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+AC_MSG_RESULT([${_am_result}])
+AC_SUBST([am__include])])
+AC_SUBST([am__quote])])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it is modern enough.
+# If it is, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ AC_MSG_WARN(['missing' script is too old or missing])
+fi
+])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), [1])])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[[\\\"\#\$\&\'\`$am_lf]]*)
+ AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+ *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*)
+ AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+ alias in your environment])
+ fi
+ if test "$[2]" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT([yes])
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+AC_CONFIG_COMMANDS_PRE(
+ [AC_MSG_CHECKING([that generated files are newer than configure])
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ AC_MSG_RESULT([done])])
+rm -f conftest.file
+])
+
+# Copyright (C) 2009-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_SILENT_RULES([DEFAULT])
+# --------------------------
+# Enable less verbose build rules; with the default set to DEFAULT
+# ("yes" being less verbose, "no" or empty being verbose).
+AC_DEFUN([AM_SILENT_RULES],
+[AC_ARG_ENABLE([silent-rules], [dnl
+AS_HELP_STRING(
+ [--enable-silent-rules],
+ [less verbose build output (undo: "make V=1")])
+AS_HELP_STRING(
+ [--disable-silent-rules],
+ [verbose build output (undo: "make V=0")])dnl
+])
+case $enable_silent_rules in @%:@ (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;
+esac
+dnl
+dnl A few 'make' implementations (e.g., NonStop OS and NextStep)
+dnl do not support nested variable expansions.
+dnl See automake bug#9928 and bug#10237.
+am_make=${MAKE-make}
+AC_CACHE_CHECK([whether $am_make supports nested variables],
+ [am_cv_make_support_nested_variables],
+ [if AS_ECHO([['TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi])
+if test $am_cv_make_support_nested_variables = yes; then
+ dnl Using '$V' instead of '$(V)' breaks IRIX make.
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AC_SUBST([AM_V])dnl
+AM_SUBST_NOTMAKE([AM_V])dnl
+AC_SUBST([AM_DEFAULT_V])dnl
+AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl
+AC_SUBST([AM_DEFAULT_VERBOSITY])dnl
+AM_BACKSLASH='\'
+AC_SUBST([AM_BACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
+])
+
+# Copyright (C) 2001-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor 'install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in "make install-strip", and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be 'maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004-2021 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of 'v7', 'ustar', or 'pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+#
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+
+m4_if([$1], [v7],
+ [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+
+ [m4_case([$1],
+ [ustar],
+ [# The POSIX 1988 'ustar' format is defined with fixed-size fields.
+ # There is notably a 21 bits limit for the UID and the GID. In fact,
+ # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
+ # and bug#13588).
+ am_max_uid=2097151 # 2^21 - 1
+ am_max_gid=$am_max_uid
+ # The $UID and $GID variables are not portable, so we need to resort
+ # to the POSIX-mandated id(1) utility. Errors in the 'id' calls
+ # below are definitely unexpected, so allow the users to see them
+ # (that is, avoid stderr redirection).
+ am_uid=`id -u || echo unknown`
+ am_gid=`id -g || echo unknown`
+ AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])
+ if test $am_uid -le $am_max_uid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi
+ AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])
+ if test $am_gid -le $am_max_gid; then
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+ _am_tools=none
+ fi],
+
+ [pax],
+ [],
+
+ [m4_fatal([Unknown tar format])])
+
+ AC_MSG_CHECKING([how to create a $1 tar archive])
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_$1-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ AM_RUN_LOG([cat conftest.dir/file])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+ AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
diff --git a/3rdparty/asio/asio.pc.in b/3rdparty/asio/asio.pc.in
new file mode 100644
index 00000000000..b93eb673dac
--- /dev/null
+++ b/3rdparty/asio/asio.pc.in
@@ -0,0 +1,11 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+includedir=@includedir@
+
+Name: @PACKAGE_NAME@
+Description: A cross-platform C++ library for network and low-level I/O programming that provides developers with a consistent asynchronous model using a modern C++ approach.
+Version: @PACKAGE_VERSION@
+Cflags: -I${includedir}
+Lflags:
+Requires:
+Requires.private:
diff --git a/3rdparty/asio/compile b/3rdparty/asio/compile
new file mode 100755
index 00000000000..df363c8fbfb
--- /dev/null
+++ b/3rdparty/asio/compile
@@ -0,0 +1,348 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand '-c -o'.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+# Written by Tom Tromey <tromey@cygnus.com>.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+nl='
+'
+
+# We need space, tab and new line, in precisely that order. Quoting is
+# there to prevent tools from complaining about whitespace usage.
+IFS=" "" $nl"
+
+file_conv=
+
+# func_file_conv build_file lazy
+# Convert a $build file to $host form and store it in $file
+# Currently only supports Windows hosts. If the determined conversion
+# type is listed in (the comma separated) LAZY, no conversion will
+# take place.
+func_file_conv ()
+{
+ file=$1
+ case $file in
+ / | /[!/]*) # absolute file, and not a UNC file
+ if test -z "$file_conv"; then
+ # lazily determine how to convert abs files
+ case `uname -s` in
+ MINGW*)
+ file_conv=mingw
+ ;;
+ CYGWIN* | MSYS*)
+ file_conv=cygwin
+ ;;
+ *)
+ file_conv=wine
+ ;;
+ esac
+ fi
+ case $file_conv/,$2, in
+ *,$file_conv,*)
+ ;;
+ mingw/*)
+ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
+ ;;
+ cygwin/* | msys/*)
+ file=`cygpath -m "$file" || echo "$file"`
+ ;;
+ wine/*)
+ file=`winepath -w "$file" || echo "$file"`
+ ;;
+ esac
+ ;;
+ esac
+}
+
+# func_cl_dashL linkdir
+# Make cl look for libraries in LINKDIR
+func_cl_dashL ()
+{
+ func_file_conv "$1"
+ if test -z "$lib_path"; then
+ lib_path=$file
+ else
+ lib_path="$lib_path;$file"
+ fi
+ linker_opts="$linker_opts -LIBPATH:$file"
+}
+
+# func_cl_dashl library
+# Do a library search-path lookup for cl
+func_cl_dashl ()
+{
+ lib=$1
+ found=no
+ save_IFS=$IFS
+ IFS=';'
+ for dir in $lib_path $LIB
+ do
+ IFS=$save_IFS
+ if $shared && test -f "$dir/$lib.dll.lib"; then
+ found=yes
+ lib=$dir/$lib.dll.lib
+ break
+ fi
+ if test -f "$dir/$lib.lib"; then
+ found=yes
+ lib=$dir/$lib.lib
+ break
+ fi
+ if test -f "$dir/lib$lib.a"; then
+ found=yes
+ lib=$dir/lib$lib.a
+ break
+ fi
+ done
+ IFS=$save_IFS
+
+ if test "$found" != yes; then
+ lib=$lib.lib
+ fi
+}
+
+# func_cl_wrapper cl arg...
+# Adjust compile command to suit cl
+func_cl_wrapper ()
+{
+ # Assume a capable shell
+ lib_path=
+ shared=:
+ linker_opts=
+ for arg
+ do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ eat=1
+ case $2 in
+ *.o | *.[oO][bB][jJ])
+ func_file_conv "$2"
+ set x "$@" -Fo"$file"
+ shift
+ ;;
+ *)
+ func_file_conv "$2"
+ set x "$@" -Fe"$file"
+ shift
+ ;;
+ esac
+ ;;
+ -I)
+ eat=1
+ func_file_conv "$2" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -I*)
+ func_file_conv "${1#-I}" mingw
+ set x "$@" -I"$file"
+ shift
+ ;;
+ -l)
+ eat=1
+ func_cl_dashl "$2"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -l*)
+ func_cl_dashl "${1#-l}"
+ set x "$@" "$lib"
+ shift
+ ;;
+ -L)
+ eat=1
+ func_cl_dashL "$2"
+ ;;
+ -L*)
+ func_cl_dashL "${1#-L}"
+ ;;
+ -static)
+ shared=false
+ ;;
+ -Wl,*)
+ arg=${1#-Wl,}
+ save_ifs="$IFS"; IFS=','
+ for flag in $arg; do
+ IFS="$save_ifs"
+ linker_opts="$linker_opts $flag"
+ done
+ IFS="$save_ifs"
+ ;;
+ -Xlinker)
+ eat=1
+ linker_opts="$linker_opts $2"
+ ;;
+ -*)
+ set x "$@" "$1"
+ shift
+ ;;
+ *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
+ func_file_conv "$1"
+ set x "$@" -Tp"$file"
+ shift
+ ;;
+ *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
+ func_file_conv "$1" mingw
+ set x "$@" "$file"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+ done
+ if test -n "$linker_opts"; then
+ linker_opts="-link$linker_opts"
+ fi
+ exec "$@" $linker_opts
+ exit 1
+}
+
+eat=
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: compile [--help] [--version] PROGRAM [ARGS]
+
+Wrapper for compilers which do not understand '-c -o'.
+Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
+arguments, and rename the output as expected.
+
+If you are trying to build a whole package this is not the
+right script to run: please start by reading the file 'INSTALL'.
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "compile $scriptversion"
+ exit $?
+ ;;
+ cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
+ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
+ func_cl_wrapper "$@" # Doesn't return...
+ ;;
+esac
+
+ofile=
+cfile=
+
+for arg
+do
+ if test -n "$eat"; then
+ eat=
+ else
+ case $1 in
+ -o)
+ # configure might choose to run compile as 'compile cc -o foo foo.c'.
+ # So we strip '-o arg' only if arg is an object.
+ eat=1
+ case $2 in
+ *.o | *.obj)
+ ofile=$2
+ ;;
+ *)
+ set x "$@" -o "$2"
+ shift
+ ;;
+ esac
+ ;;
+ *.c)
+ cfile=$1
+ set x "$@" "$1"
+ shift
+ ;;
+ *)
+ set x "$@" "$1"
+ shift
+ ;;
+ esac
+ fi
+ shift
+done
+
+if test -z "$ofile" || test -z "$cfile"; then
+ # If no '-o' option was seen then we might have been invoked from a
+ # pattern rule where we don't need one. That is ok -- this is a
+ # normal compilation that the losing compiler can handle. If no
+ # '.c' file was seen then we are probably linking. That is also
+ # ok.
+ exec "$@"
+fi
+
+# Name of file we expect compiler to create.
+cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
+
+# Create the lock directory.
+# Note: use '[/\\:.-]' here to ensure that we don't use the same name
+# that we are using for the .o file. Also, base the name on the expected
+# object file name, since that is what matters with a parallel build.
+lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
+while true; do
+ if mkdir "$lockdir" >/dev/null 2>&1; then
+ break
+ fi
+ sleep 1
+done
+# FIXME: race condition here if user kills between mkdir and trap.
+trap "rmdir '$lockdir'; exit 1" 1 2 15
+
+# Run the compile.
+"$@"
+ret=$?
+
+if test -f "$cofile"; then
+ test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
+fi
+
+rmdir "$lockdir"
+exit $ret
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/3rdparty/asio/config.guess b/3rdparty/asio/config.guess
new file mode 100755
index 00000000000..e81d3ae7c21
--- /dev/null
+++ b/3rdparty/asio/config.guess
@@ -0,0 +1,1748 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright 1992-2021 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2021-06-03'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+#
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
+#
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+#
+# Please send patches to <config-patches@gnu.org>.
+
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright 1992-2021 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+ * )
+ break ;;
+ esac
+done
+
+if test $# != 0; then
+ echo "$me: too many arguments$help" >&2
+ exit 1
+fi
+
+# Just in case it came from the environment.
+GUESS=
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+ # prevent multiple calls if $tmp is already set
+ test "$tmp" && return 0
+ : "${TMPDIR=/tmp}"
+ # shellcheck disable=SC2039,SC3028
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+ dummy=$tmp/dummy
+ case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+ ,,) echo "int x;" > "$dummy.c"
+ for driver in cc gcc c89 c99 ; do
+ if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+ CC_FOR_BUILD=$driver
+ break
+ fi
+ done
+ if test x"$CC_FOR_BUILD" = x ; then
+ CC_FOR_BUILD=no_compiler_found
+ fi
+ ;;
+ ,,*) CC_FOR_BUILD=$CC ;;
+ ,*,*) CC_FOR_BUILD=$HOST_CC ;;
+ esac
+}
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+if test -f /.attbin/uname ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+case $UNAME_SYSTEM in
+Linux|GNU|GNU/*)
+ LIBC=unknown
+
+ set_cc_for_build
+ cat <<-EOF > "$dummy.c"
+ #include <features.h>
+ #if defined(__UCLIBC__)
+ LIBC=uclibc
+ #elif defined(__dietlibc__)
+ LIBC=dietlibc
+ #elif defined(__GLIBC__)
+ LIBC=gnu
+ #else
+ #include <stdarg.h>
+ /* First heuristic to detect musl libc. */
+ #ifdef __DEFINED_va_list
+ LIBC=musl
+ #endif
+ #endif
+ EOF
+ cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+ eval "$cc_set_libc"
+
+ # Second heuristic to detect musl libc.
+ if [ "$LIBC" = unknown ] &&
+ command -v ldd >/dev/null &&
+ ldd --version 2>&1 | grep -q ^musl; then
+ LIBC=musl
+ fi
+
+ # If the system lacks a compiler, then just pick glibc.
+ # We could probably try harder.
+ if [ "$LIBC" = unknown ]; then
+ LIBC=gnu
+ fi
+ ;;
+esac
+
+# Note: order is significant - the case branches are not exclusive.
+
+case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
+ *:NetBSD:*:*)
+ # NetBSD (nbsd) targets should (where applicable) match one or
+ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
+ # switched to ELF, *-*-netbsd* would select the old
+ # object file format. This provides both forward
+ # compatibility and a consistent mechanism for selecting the
+ # object file format.
+ #
+ # Note: NetBSD doesn't particularly care about the vendor
+ # portion of the name. We always set it to "unknown".
+ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+ echo unknown)`
+ case $UNAME_MACHINE_ARCH in
+ aarch64eb) machine=aarch64_be-unknown ;;
+ armeb) machine=armeb-unknown ;;
+ arm*) machine=arm-unknown ;;
+ sh3el) machine=shl-unknown ;;
+ sh3eb) machine=sh-unknown ;;
+ sh5el) machine=sh5le-unknown ;;
+ earmv*)
+ arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+ endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
+ machine=${arch}${endian}-unknown
+ ;;
+ *) machine=$UNAME_MACHINE_ARCH-unknown ;;
+ esac
+ # The Operating System including object format, if it has switched
+ # to ELF recently (or will in the future) and ABI.
+ case $UNAME_MACHINE_ARCH in
+ earm*)
+ os=netbsdelf
+ ;;
+ arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ set_cc_for_build
+ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ELF__
+ then
+ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+ # Return netbsd for either. FIX?
+ os=netbsd
+ else
+ os=netbsdelf
+ fi
+ ;;
+ *)
+ os=netbsd
+ ;;
+ esac
+ # Determine ABI tags.
+ case $UNAME_MACHINE_ARCH in
+ earm*)
+ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+ abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
+ ;;
+ esac
+ # The OS release
+ # Debian GNU/NetBSD machines have a different userland, and
+ # thus, need a distinct triplet. However, they do not need
+ # kernel version information, so it can be replaced with a
+ # suitable tag, in the style of linux-gnu.
+ case $UNAME_VERSION in
+ Debian*)
+ release='-gnu'
+ ;;
+ *)
+ release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
+ ;;
+ esac
+ # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+ # contains redundant information, the shorter form:
+ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+ GUESS=$machine-${os}${release}${abi-}
+ ;;
+ *:Bitrig:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE
+ ;;
+ *:OpenBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE
+ ;;
+ *:SecBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE
+ ;;
+ *:LibertyBSD:*:*)
+ UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+ GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE
+ ;;
+ *:MidnightBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE
+ ;;
+ *:ekkoBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE
+ ;;
+ *:SolidBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE
+ ;;
+ *:OS108:*:*)
+ GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE
+ ;;
+ macppc:MirBSD:*:*)
+ GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE
+ ;;
+ *:MirBSD:*:*)
+ GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE
+ ;;
+ *:Sortix:*:*)
+ GUESS=$UNAME_MACHINE-unknown-sortix
+ ;;
+ *:Twizzler:*:*)
+ GUESS=$UNAME_MACHINE-unknown-twizzler
+ ;;
+ *:Redox:*:*)
+ GUESS=$UNAME_MACHINE-unknown-redox
+ ;;
+ mips:OSF1:*.*)
+ GUESS=mips-dec-osf1
+ ;;
+ alpha:OSF1:*:*)
+ # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+ trap '' 0
+ case $UNAME_RELEASE in
+ *4.0)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ ;;
+ *5.*)
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+ ;;
+ esac
+ # According to Compaq, /usr/sbin/psrinfo has been available on
+ # OSF/1 and Tru64 systems produced since 1995. I hope that
+ # covers most systems running today. This code pipes the CPU
+ # types through head -n 1, so we only detect the type of CPU 0.
+ ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+ case $ALPHA_CPU_TYPE in
+ "EV4 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "EV4.5 (21064)")
+ UNAME_MACHINE=alpha ;;
+ "LCA4 (21066/21068)")
+ UNAME_MACHINE=alpha ;;
+ "EV5 (21164)")
+ UNAME_MACHINE=alphaev5 ;;
+ "EV5.6 (21164A)")
+ UNAME_MACHINE=alphaev56 ;;
+ "EV5.6 (21164PC)")
+ UNAME_MACHINE=alphapca56 ;;
+ "EV5.7 (21164PC)")
+ UNAME_MACHINE=alphapca57 ;;
+ "EV6 (21264)")
+ UNAME_MACHINE=alphaev6 ;;
+ "EV6.7 (21264A)")
+ UNAME_MACHINE=alphaev67 ;;
+ "EV6.8CB (21264C)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8AL (21264B)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.8CX (21264D)")
+ UNAME_MACHINE=alphaev68 ;;
+ "EV6.9A (21264/EV69A)")
+ UNAME_MACHINE=alphaev69 ;;
+ "EV7 (21364)")
+ UNAME_MACHINE=alphaev7 ;;
+ "EV7.9 (21364A)")
+ UNAME_MACHINE=alphaev79 ;;
+ esac
+ # A Pn.n version is a patched version.
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ GUESS=$UNAME_MACHINE-dec-osf$OSF_REL
+ ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ GUESS=m68k-unknown-sysv4
+ ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ GUESS=$UNAME_MACHINE-unknown-amigaos
+ ;;
+ *:[Mm]orph[Oo][Ss]:*:*)
+ GUESS=$UNAME_MACHINE-unknown-morphos
+ ;;
+ *:OS/390:*:*)
+ GUESS=i370-ibm-openedition
+ ;;
+ *:z/VM:*:*)
+ GUESS=s390-ibm-zvmoe
+ ;;
+ *:OS400:*:*)
+ GUESS=powerpc-ibm-os400
+ ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ GUESS=arm-acorn-riscix$UNAME_RELEASE
+ ;;
+ arm*:riscos:*:*|arm*:RISCOS:*:*)
+ GUESS=arm-unknown-riscos
+ ;;
+ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+ GUESS=hppa1.1-hitachi-hiuxmpp
+ ;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ case `(/bin/universe) 2>/dev/null` in
+ att) GUESS=pyramid-pyramid-sysv3 ;;
+ *) GUESS=pyramid-pyramid-bsd ;;
+ esac
+ ;;
+ NILE*:*:*:dcosx)
+ GUESS=pyramid-pyramid-svr4
+ ;;
+ DRS?6000:unix:4.0:6*)
+ GUESS=sparc-icl-nx6
+ ;;
+ DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+ case `/usr/bin/uname -p` in
+ sparc) GUESS=sparc-icl-nx7 ;;
+ esac
+ ;;
+ s390x:SunOS:*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL
+ ;;
+ sun4H:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-hal-solaris2$SUN_REL
+ ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris2$SUN_REL
+ ;;
+ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+ GUESS=i386-pc-auroraux$UNAME_RELEASE
+ ;;
+ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+ set_cc_for_build
+ SUN_ARCH=i386
+ # If there is a compiler, see if it is configured for 64-bit objects.
+ # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+ # This test works for both compilers.
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ SUN_ARCH=x86_64
+ fi
+ fi
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=$SUN_ARCH-pc-solaris2$SUN_REL
+ ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=sparc-sun-solaris3$SUN_REL
+ ;;
+ sun4*:SunOS:*:*)
+ case `/usr/bin/arch -k` in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
+ GUESS=sparc-sun-sunos$SUN_REL
+ ;;
+ sun3*:SunOS:*:*)
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+ case `/bin/arch` in
+ sun3)
+ GUESS=m68k-sun-sunos$UNAME_RELEASE
+ ;;
+ sun4)
+ GUESS=sparc-sun-sunos$UNAME_RELEASE
+ ;;
+ esac
+ ;;
+ aushp:SunOS:*:*)
+ GUESS=sparc-auspex-sunos$UNAME_RELEASE
+ ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ GUESS=m68k-atari-mint$UNAME_RELEASE
+ ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ GUESS=m68k-milan-mint$UNAME_RELEASE
+ ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ GUESS=m68k-hades-mint$UNAME_RELEASE
+ ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ GUESS=m68k-unknown-mint$UNAME_RELEASE
+ ;;
+ m68k:machten:*:*)
+ GUESS=m68k-apple-machten$UNAME_RELEASE
+ ;;
+ powerpc:machten:*:*)
+ GUESS=powerpc-apple-machten$UNAME_RELEASE
+ ;;
+ RISC*:Mach:*:*)
+ GUESS=mips-dec-mach_bsd4.3
+ ;;
+ RISC*:ULTRIX:*:*)
+ GUESS=mips-dec-ultrix$UNAME_RELEASE
+ ;;
+ VAX*:ULTRIX*:*:*)
+ GUESS=vax-dec-ultrix$UNAME_RELEASE
+ ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ GUESS=clipper-intergraph-clix$UNAME_RELEASE
+ ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+#ifdef __cplusplus
+#include <stdio.h> /* for printf() prototype */
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+ dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+ SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ GUESS=mips-mips-riscos$UNAME_RELEASE
+ ;;
+ Motorola:PowerMAX_OS:*:*)
+ GUESS=powerpc-motorola-powermax
+ ;;
+ Motorola:*:4.3:PL8-*)
+ GUESS=powerpc-harris-powermax
+ ;;
+ Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+ GUESS=powerpc-harris-powermax
+ ;;
+ Night_Hawk:Power_UNIX:*:*)
+ GUESS=powerpc-harris-powerunix
+ ;;
+ m88k:CX/UX:7*:*)
+ GUESS=m88k-harris-cxux7
+ ;;
+ m88k:*:4*:R4*)
+ GUESS=m88k-motorola-sysv4
+ ;;
+ m88k:*:3*:R3*)
+ GUESS=m88k-motorola-sysv3
+ ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
+ then
+ if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+ test "$TARGET_BINARY_INTERFACE"x = x
+ then
+ GUESS=m88k-dg-dgux$UNAME_RELEASE
+ else
+ GUESS=m88k-dg-dguxbcs$UNAME_RELEASE
+ fi
+ else
+ GUESS=i586-dg-dgux$UNAME_RELEASE
+ fi
+ ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ GUESS=m88k-dolphin-sysv3
+ ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ GUESS=m88k-motorola-sysv3
+ ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ GUESS=m88k-tektronix-sysv3
+ ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ GUESS=m68k-tektronix-bsd
+ ;;
+ *:IRIX*:*:*)
+ IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'`
+ GUESS=mips-sgi-irix$IRIX_REL
+ ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i*86:AIX:*:*)
+ GUESS=i386-ibm-aix
+ ;;
+ ia64:AIX:*:*)
+ if test -x /usr/bin/oslevel ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+ fi
+ GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV
+ ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
+ then
+ GUESS=$SYSTEM_NAME
+ else
+ GUESS=rs6000-ibm-aix3.2.5
+ fi
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ GUESS=rs6000-ibm-aix3.2.4
+ else
+ GUESS=rs6000-ibm-aix3.2
+ fi
+ ;;
+ *:AIX:*:[4567])
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if test -x /usr/bin/lslpp ; then
+ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
+ else
+ IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
+ fi
+ GUESS=$IBM_ARCH-ibm-aix$IBM_REV
+ ;;
+ *:AIX:*:*)
+ GUESS=rs6000-ibm-aix
+ ;;
+ ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+ GUESS=romp-ibm-bsd4.4
+ ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
+ GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to
+ ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ GUESS=rs6000-bull-bosx
+ ;;
+ DPX/2?00:B.O.S.:*:*)
+ GUESS=m68k-bull-sysv3
+ ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ GUESS=m68k-hp-bsd
+ ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ GUESS=m68k-hp-bsd4.4
+ ;;
+ 9000/[34678]??:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ case $UNAME_MACHINE in
+ 9000/31?) HP_ARCH=m68000 ;;
+ 9000/[34]??) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ if test -x /usr/bin/getconf; then
+ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+ case $sc_cpu_version in
+ 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+ 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
+ 532) # CPU_PA_RISC2_0
+ case $sc_kernel_bits in
+ 32) HP_ARCH=hppa2.0n ;;
+ 64) HP_ARCH=hppa2.0w ;;
+ '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
+ esac ;;
+ esac
+ fi
+ if test "$HP_ARCH" = ""; then
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+
+ #define _HPUX_SOURCE
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
+ test -z "$HP_ARCH" && HP_ARCH=hppa
+ fi ;;
+ esac
+ if test "$HP_ARCH" = hppa2.0w
+ then
+ set_cc_for_build
+
+ # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+ # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
+ # generating 64-bit code. GNU and HP use different nomenclature:
+ #
+ # $ CC_FOR_BUILD=cc ./config.guess
+ # => hppa2.0w-hp-hpux11.23
+ # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+ # => hppa64-hp-hpux11.23
+
+ if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
+ grep -q __LP64__
+ then
+ HP_ARCH=hppa2.0w
+ else
+ HP_ARCH=hppa64
+ fi
+ fi
+ GUESS=$HP_ARCH-hp-hpux$HPUX_REV
+ ;;
+ ia64:HP-UX:*:*)
+ HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+ GUESS=ia64-hp-hpux$HPUX_REV
+ ;;
+ 3050*:HI-UX:*:*)
+ set_cc_for_build
+ sed 's/^ //' << EOF > "$dummy.c"
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+ GUESS=unknown-hitachi-hiuxwe2
+ ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+ GUESS=hppa1.1-hp-bsd
+ ;;
+ 9000/8??:4.3bsd:*:*)
+ GUESS=hppa1.0-hp-bsd
+ ;;
+ *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+ GUESS=hppa1.0-hp-mpeix
+ ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+ GUESS=hppa1.1-hp-osf
+ ;;
+ hp8??:OSF1:*:*)
+ GUESS=hppa1.0-hp-osf
+ ;;
+ i*86:OSF1:*:*)
+ if test -x /usr/sbin/sysversion ; then
+ GUESS=$UNAME_MACHINE-unknown-osf1mk
+ else
+ GUESS=$UNAME_MACHINE-unknown-osf1
+ fi
+ ;;
+ parisc*:Lites*:*:*)
+ GUESS=hppa1.1-hp-lites
+ ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ GUESS=c1-convex-bsd
+ ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ GUESS=c34-convex-bsd
+ ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ GUESS=c38-convex-bsd
+ ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ GUESS=c4-convex-bsd
+ ;;
+ CRAY*Y-MP:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=ymp-cray-unicos$CRAY_REL
+ ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+ -e 's/\.[^.]*$/.X/'
+ exit ;;
+ CRAY*TS:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=t90-cray-unicos$CRAY_REL
+ ;;
+ CRAY*T3E:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=alphaev5-cray-unicosmk$CRAY_REL
+ ;;
+ CRAY*SV1:*:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=sv1-cray-unicos$CRAY_REL
+ ;;
+ *:UNICOS/mp:*:*)
+ CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+ GUESS=craynv-cray-unicosmp$CRAY_REL
+ ;;
+ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+ FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+ GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
+ 5000:UNIX_System_V:4.*:*)
+ FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+ FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+ GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+ ;;
+ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+ GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE
+ ;;
+ sparc*:BSD/OS:*:*)
+ GUESS=sparc-unknown-bsdi$UNAME_RELEASE
+ ;;
+ *:BSD/OS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE
+ ;;
+ arm:FreeBSD:*:*)
+ UNAME_PROCESSOR=`uname -p`
+ set_cc_for_build
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi
+ else
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf
+ fi
+ ;;
+ *:FreeBSD:*:*)
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ case $UNAME_PROCESSOR in
+ amd64)
+ UNAME_PROCESSOR=x86_64 ;;
+ i386)
+ UNAME_PROCESSOR=i586 ;;
+ esac
+ FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL
+ ;;
+ i*:CYGWIN*:*)
+ GUESS=$UNAME_MACHINE-pc-cygwin
+ ;;
+ *:MINGW64*:*)
+ GUESS=$UNAME_MACHINE-pc-mingw64
+ ;;
+ *:MINGW*:*)
+ GUESS=$UNAME_MACHINE-pc-mingw32
+ ;;
+ *:MSYS*:*)
+ GUESS=$UNAME_MACHINE-pc-msys
+ ;;
+ i*:PW*:*)
+ GUESS=$UNAME_MACHINE-pc-pw32
+ ;;
+ *:Interix*:*)
+ case $UNAME_MACHINE in
+ x86)
+ GUESS=i586-pc-interix$UNAME_RELEASE
+ ;;
+ authenticamd | genuineintel | EM64T)
+ GUESS=x86_64-unknown-interix$UNAME_RELEASE
+ ;;
+ IA64)
+ GUESS=ia64-unknown-interix$UNAME_RELEASE
+ ;;
+ esac ;;
+ i*:UWIN*:*)
+ GUESS=$UNAME_MACHINE-pc-uwin
+ ;;
+ amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+ GUESS=x86_64-pc-cygwin
+ ;;
+ prep*:SunOS:5.*:*)
+ SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+ GUESS=powerpcle-unknown-solaris2$SUN_REL
+ ;;
+ *:GNU:*:*)
+ # the GNU system
+ GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'`
+ GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL
+ ;;
+ *:GNU/*:*:*)
+ # other systems with GNU libc and userland
+ GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"`
+ GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
+ ;;
+ *:Minix:*:*)
+ GUESS=$UNAME_MACHINE-unknown-minix
+ ;;
+ aarch64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ aarch64_be:Linux:*:*)
+ UNAME_MACHINE=aarch64_be
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ alpha:Linux:*:*)
+ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
+ EV5) UNAME_MACHINE=alphaev5 ;;
+ EV56) UNAME_MACHINE=alphaev56 ;;
+ PCA56) UNAME_MACHINE=alphapca56 ;;
+ PCA57) UNAME_MACHINE=alphapca56 ;;
+ EV6) UNAME_MACHINE=alphaev6 ;;
+ EV67) UNAME_MACHINE=alphaev67 ;;
+ EV68*) UNAME_MACHINE=alphaev68 ;;
+ esac
+ objdump --private-headers /bin/sh | grep -q ld.so.1
+ if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ arm*:Linux:*:*)
+ set_cc_for_build
+ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_EABI__
+ then
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ else
+ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+ | grep -q __ARM_PCS_VFP
+ then
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi
+ else
+ GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf
+ fi
+ fi
+ ;;
+ avr32*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ cris:Linux:*:*)
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
+ crisv32:Linux:*:*)
+ GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+ ;;
+ e2k:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ frv:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ hexagon:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ i*86:Linux:*:*)
+ GUESS=$UNAME_MACHINE-pc-linux-$LIBC
+ ;;
+ ia64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ k1om:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ m32r*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ m68*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ mips:Linux:*:* | mips64:Linux:*:*)
+ set_cc_for_build
+ IS_GLIBC=0
+ test x"${LIBC}" = xgnu && IS_GLIBC=1
+ sed 's/^ //' << EOF > "$dummy.c"
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #undef mips64
+ #undef mips64el
+ #if ${IS_GLIBC} && defined(_ABI64)
+ LIBCABI=gnuabi64
+ #else
+ #if ${IS_GLIBC} && defined(_ABIN32)
+ LIBCABI=gnuabin32
+ #else
+ LIBCABI=${LIBC}
+ #endif
+ #endif
+
+ #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa64r6
+ #else
+ #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+ CPU=mipsisa32r6
+ #else
+ #if defined(__mips64)
+ CPU=mips64
+ #else
+ CPU=mips
+ #endif
+ #endif
+ #endif
+
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ MIPS_ENDIAN=el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ MIPS_ENDIAN=
+ #else
+ MIPS_ENDIAN=
+ #endif
+ #endif
+EOF
+ cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`
+ eval "$cc_set_vars"
+ test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+ ;;
+ mips64el:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ openrisc*:Linux:*:*)
+ GUESS=or1k-unknown-linux-$LIBC
+ ;;
+ or32:Linux:*:* | or1k*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ padre:Linux:*:*)
+ GUESS=sparc-unknown-linux-$LIBC
+ ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ GUESS=hppa64-unknown-linux-$LIBC
+ ;;
+ parisc:Linux:*:* | hppa:Linux:*:*)
+ # Look for CPU level
+ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+ PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;
+ PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;
+ *) GUESS=hppa-unknown-linux-$LIBC ;;
+ esac
+ ;;
+ ppc64:Linux:*:*)
+ GUESS=powerpc64-unknown-linux-$LIBC
+ ;;
+ ppc:Linux:*:*)
+ GUESS=powerpc-unknown-linux-$LIBC
+ ;;
+ ppc64le:Linux:*:*)
+ GUESS=powerpc64le-unknown-linux-$LIBC
+ ;;
+ ppcle:Linux:*:*)
+ GUESS=powerpcle-unknown-linux-$LIBC
+ ;;
+ riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ GUESS=$UNAME_MACHINE-ibm-linux-$LIBC
+ ;;
+ sh64*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ sh*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ tile*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ vax:Linux:*:*)
+ GUESS=$UNAME_MACHINE-dec-linux-$LIBC
+ ;;
+ x86_64:Linux:*:*)
+ set_cc_for_build
+ LIBCABI=$LIBC
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_X32 >/dev/null
+ then
+ LIBCABI=${LIBC}x32
+ fi
+ fi
+ GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI
+ ;;
+ xtensa*:Linux:*:*)
+ GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+ ;;
+ i*86:DYNIX/ptx:4*:*)
+ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+ # earlier versions are messed up and put the nodename in both
+ # sysname and nodename.
+ GUESS=i386-sequent-sysv4
+ ;;
+ i*86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
+ ;;
+ i*86:OS/2:*:*)
+ # If we were able to find `uname', then EMX Unix compatibility
+ # is probably installed.
+ GUESS=$UNAME_MACHINE-pc-os2-emx
+ ;;
+ i*86:XTS-300:*:STOP)
+ GUESS=$UNAME_MACHINE-unknown-stop
+ ;;
+ i*86:atheos:*:*)
+ GUESS=$UNAME_MACHINE-unknown-atheos
+ ;;
+ i*86:syllable:*:*)
+ GUESS=$UNAME_MACHINE-pc-syllable
+ ;;
+ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+ GUESS=i386-unknown-lynxos$UNAME_RELEASE
+ ;;
+ i*86:*DOS:*:*)
+ GUESS=$UNAME_MACHINE-pc-msdosdjgpp
+ ;;
+ i*86:*:4.*:*)
+ UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL
+ else
+ GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL
+ fi
+ ;;
+ i*86:*:5:[678]*)
+ # UnixWare 7.x, OpenUNIX and OpenServer 6.
+ case `/bin/uname -X | grep "^Machine"` in
+ *486*) UNAME_MACHINE=i486 ;;
+ *Pentium) UNAME_MACHINE=i586 ;;
+ *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+ esac
+ GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+ ;;
+ i*86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ GUESS=$UNAME_MACHINE-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL
+ else
+ GUESS=$UNAME_MACHINE-pc-sysv32
+ fi
+ ;;
+ pc:*:*:*)
+ # Left here for compatibility:
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i586.
+ # Note: whatever this is, it MUST be the same as what config.sub
+ # prints for the "djgpp" host, or else GDB configure will decide that
+ # this is a cross-build.
+ GUESS=i586-pc-msdosdjgpp
+ ;;
+ Intel:Mach:3*:*)
+ GUESS=i386-pc-mach3
+ ;;
+ paragon:*:*:*)
+ GUESS=i860-intel-osf1
+ ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4
+ fi
+ ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ GUESS=m68010-convergent-sysv
+ ;;
+ mc68k:UNIX:SYSTEM5:3.51m)
+ GUESS=m68k-convergent-sysv
+ ;;
+ M680?0:D-NIX:5.3:*)
+ GUESS=m68k-diab-dnix
+ ;;
+ M68*:*:R3V[5678]*:*)
+ test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+ 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4; exit; } ;;
+ NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+ OS_REL='.3'
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
+ /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
+ m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+ GUESS=m68k-unknown-lynxos$UNAME_RELEASE
+ ;;
+ mc68030:UNIX_System_V:4.*:*)
+ GUESS=m68k-atari-sysv4
+ ;;
+ TSUNAMI:LynxOS:2.*:*)
+ GUESS=sparc-unknown-lynxos$UNAME_RELEASE
+ ;;
+ rs6000:LynxOS:2.*:*)
+ GUESS=rs6000-unknown-lynxos$UNAME_RELEASE
+ ;;
+ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+ GUESS=powerpc-unknown-lynxos$UNAME_RELEASE
+ ;;
+ SM[BE]S:UNIX_SV:*:*)
+ GUESS=mips-dde-sysv$UNAME_RELEASE
+ ;;
+ RM*:ReliantUNIX-*:*:*)
+ GUESS=mips-sni-sysv4
+ ;;
+ RM*:SINIX-*:*:*)
+ GUESS=mips-sni-sysv4
+ ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ GUESS=$UNAME_MACHINE-sni-sysv4
+ else
+ GUESS=ns32k-sni-sysv
+ fi
+ ;;
+ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ GUESS=i586-unisys-sysv4
+ ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ GUESS=hppa1.1-stratus-sysv4
+ ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ GUESS=i860-stratus-sysv4
+ ;;
+ i*86:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ GUESS=$UNAME_MACHINE-stratus-vos
+ ;;
+ *:VOS:*:*)
+ # From Paul.Green@stratus.com.
+ GUESS=hppa1.1-stratus-vos
+ ;;
+ mc68*:A/UX:*:*)
+ GUESS=m68k-apple-aux$UNAME_RELEASE
+ ;;
+ news*:NEWS-OS:6*:*)
+ GUESS=mips-sony-newsos6
+ ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if test -d /usr/nec; then
+ GUESS=mips-nec-sysv$UNAME_RELEASE
+ else
+ GUESS=mips-unknown-sysv$UNAME_RELEASE
+ fi
+ ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ GUESS=powerpc-be-beos
+ ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ GUESS=powerpc-apple-beos
+ ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ GUESS=i586-pc-beos
+ ;;
+ BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
+ GUESS=i586-pc-haiku
+ ;;
+ x86_64:Haiku:*:*)
+ GUESS=x86_64-unknown-haiku
+ ;;
+ SX-4:SUPER-UX:*:*)
+ GUESS=sx4-nec-superux$UNAME_RELEASE
+ ;;
+ SX-5:SUPER-UX:*:*)
+ GUESS=sx5-nec-superux$UNAME_RELEASE
+ ;;
+ SX-6:SUPER-UX:*:*)
+ GUESS=sx6-nec-superux$UNAME_RELEASE
+ ;;
+ SX-7:SUPER-UX:*:*)
+ GUESS=sx7-nec-superux$UNAME_RELEASE
+ ;;
+ SX-8:SUPER-UX:*:*)
+ GUESS=sx8-nec-superux$UNAME_RELEASE
+ ;;
+ SX-8R:SUPER-UX:*:*)
+ GUESS=sx8r-nec-superux$UNAME_RELEASE
+ ;;
+ SX-ACE:SUPER-UX:*:*)
+ GUESS=sxace-nec-superux$UNAME_RELEASE
+ ;;
+ Power*:Rhapsody:*:*)
+ GUESS=powerpc-apple-rhapsody$UNAME_RELEASE
+ ;;
+ *:Rhapsody:*:*)
+ GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE
+ ;;
+ arm64:Darwin:*:*)
+ GUESS=aarch64-apple-darwin$UNAME_RELEASE
+ ;;
+ *:Darwin:*:*)
+ UNAME_PROCESSOR=`uname -p`
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ if command -v xcode-select > /dev/null 2> /dev/null && \
+ ! xcode-select --print-path > /dev/null 2> /dev/null ; then
+ # Avoid executing cc if there is no toolchain installed as
+ # cc will be a stub that puts up a graphical alert
+ # prompting the user to install developer tools.
+ CC_FOR_BUILD=no_compiler_found
+ else
+ set_cc_for_build
+ fi
+ if test "$CC_FOR_BUILD" != no_compiler_found; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
+ # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+ if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_PPC >/dev/null
+ then
+ UNAME_PROCESSOR=powerpc
+ fi
+ elif test "$UNAME_PROCESSOR" = i386 ; then
+ # uname -m returns i386 or x86_64
+ UNAME_PROCESSOR=$UNAME_MACHINE
+ fi
+ GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE
+ ;;
+ *:procnto*:*:* | *:QNX:[0123456789]*:*)
+ UNAME_PROCESSOR=`uname -p`
+ if test "$UNAME_PROCESSOR" = x86; then
+ UNAME_PROCESSOR=i386
+ UNAME_MACHINE=pc
+ fi
+ GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE
+ ;;
+ *:QNX:*:4*)
+ GUESS=i386-pc-qnx
+ ;;
+ NEO-*:NONSTOP_KERNEL:*:*)
+ GUESS=neo-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSE-*:NONSTOP_KERNEL:*:*)
+ GUESS=nse-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSR-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsr-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSV-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsv-tandem-nsk$UNAME_RELEASE
+ ;;
+ NSX-*:NONSTOP_KERNEL:*:*)
+ GUESS=nsx-tandem-nsk$UNAME_RELEASE
+ ;;
+ *:NonStop-UX:*:*)
+ GUESS=mips-compaq-nonstopux
+ ;;
+ BS2000:POSIX*:*:*)
+ GUESS=bs2000-siemens-sysv
+ ;;
+ DS/*:UNIX_System_V:*:*)
+ GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE
+ ;;
+ *:Plan9:*:*)
+ # "uname -m" is not consistent, so use $cputype instead. 386
+ # is converted to i386 for consistency with other x86
+ # operating systems.
+ if test "${cputype-}" = 386; then
+ UNAME_MACHINE=i386
+ elif test "x${cputype-}" != x; then
+ UNAME_MACHINE=$cputype
+ fi
+ GUESS=$UNAME_MACHINE-unknown-plan9
+ ;;
+ *:TOPS-10:*:*)
+ GUESS=pdp10-unknown-tops10
+ ;;
+ *:TENEX:*:*)
+ GUESS=pdp10-unknown-tenex
+ ;;
+ KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+ GUESS=pdp10-dec-tops20
+ ;;
+ XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+ GUESS=pdp10-xkl-tops20
+ ;;
+ *:TOPS-20:*:*)
+ GUESS=pdp10-unknown-tops20
+ ;;
+ *:ITS:*:*)
+ GUESS=pdp10-unknown-its
+ ;;
+ SEI:*:*:SEIUX)
+ GUESS=mips-sei-seiux$UNAME_RELEASE
+ ;;
+ *:DragonFly:*:*)
+ DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+ GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL
+ ;;
+ *:*VMS:*:*)
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ case $UNAME_MACHINE in
+ A*) GUESS=alpha-dec-vms ;;
+ I*) GUESS=ia64-dec-vms ;;
+ V*) GUESS=vax-dec-vms ;;
+ esac ;;
+ *:XENIX:*:SysV)
+ GUESS=i386-pc-xenix
+ ;;
+ i*86:skyos:*:*)
+ SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`
+ GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL
+ ;;
+ i*86:rdos:*:*)
+ GUESS=$UNAME_MACHINE-pc-rdos
+ ;;
+ *:AROS:*:*)
+ GUESS=$UNAME_MACHINE-unknown-aros
+ ;;
+ x86_64:VMkernel:*:*)
+ GUESS=$UNAME_MACHINE-unknown-esx
+ ;;
+ amd64:Isilon\ OneFS:*:*)
+ GUESS=x86_64-unknown-onefs
+ ;;
+ *:Unleashed:*:*)
+ GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
+ ;;
+esac
+
+# Do we have a guess based on uname results?
+if test "x$GUESS" != x; then
+ echo "$GUESS"
+ exit
+fi
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+ printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+ printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+ printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+ printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname un;
+ uname (&un);
+ printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+ struct utsname *un;
+ uname (&un);
+ printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+ printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` &&
+ { echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
+echo "$0: unable to guess system type" >&2
+
+case $UNAME_MACHINE:$UNAME_SYSTEM in
+ mips:Linux | mips64:Linux)
+ # If we got here on MIPS GNU/Linux, output extra information.
+ cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+ ;;
+esac
+
+cat >&2 <<EOF
+
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
+
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
+and
+ https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
+
+our_year=`echo $timestamp | sed 's,-.*,,'`
+thisyear=`date +%Y`
+# shellcheck disable=SC2003
+script_age=`expr "$thisyear" - "$our_year"`
+if test "$script_age" -lt 3 ; then
+ cat >&2 <<EOF
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo = `(hostinfo) 2>/dev/null`
+/bin/universe = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
+EOF
+fi
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/3rdparty/asio/config.sub b/3rdparty/asio/config.sub
new file mode 100755
index 00000000000..d74fb6deac9
--- /dev/null
+++ b/3rdparty/asio/config.sub
@@ -0,0 +1,1884 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright 1992-2021 Free Software Foundation, Inc.
+
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2021-08-14'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that
+# program. This Exception is an additional permission under section 7
+# of the GNU General Public License, version 3 ("GPLv3").
+
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX. However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
+
+Canonicalize a configuration name.
+
+Options:
+ -h, --help print this help, then exit
+ -t, --time-stamp print date of last modification, then exit
+ -v, --version print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright 1992-2021 Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+ case $1 in
+ --time-stamp | --time* | -t )
+ echo "$timestamp" ; exit ;;
+ --version | -v )
+ echo "$version" ; exit ;;
+ --help | --h* | -h )
+ echo "$usage"; exit ;;
+ -- ) # Stop option processing
+ shift; break ;;
+ - ) # Use stdin as input.
+ break ;;
+ -* )
+ echo "$me: invalid option $1$help" >&2
+ exit 1 ;;
+
+ *local*)
+ # First pass through any local machine types.
+ echo "$1"
+ exit ;;
+
+ * )
+ break ;;
+ esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+ exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+ exit 1;;
+esac
+
+# Split fields of configuration type
+# shellcheck disable=SC2162
+saved_IFS=$IFS
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+IFS=$saved_IFS
+
+# Separate into logical components for further validation
+case $1 in
+ *-*-*-*-*)
+ echo Invalid configuration \`"$1"\': more than four components >&2
+ exit 1
+ ;;
+ *-*-*-*)
+ basic_machine=$field1-$field2
+ basic_os=$field3-$field4
+ ;;
+ *-*-*)
+ # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+ # parts
+ maybe_os=$field2-$field3
+ case $maybe_os in
+ nto-qnx* | linux-* | uclinux-uclibc* \
+ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+ | storm-chaos* | os2-emx* | rtmk-nova*)
+ basic_machine=$field1
+ basic_os=$maybe_os
+ ;;
+ android-linux)
+ basic_machine=$field1-unknown
+ basic_os=linux-android
+ ;;
+ *)
+ basic_machine=$field1-$field2
+ basic_os=$field3
+ ;;
+ esac
+ ;;
+ *-*)
+ # A lone config we happen to match not fitting any pattern
+ case $field1-$field2 in
+ decstation-3100)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ *-*)
+ # Second component is usually, but not always the OS
+ case $field2 in
+ # Prevent following clause from handling this valid os
+ sun*os*)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ zephyr*)
+ basic_machine=$field1-unknown
+ basic_os=$field2
+ ;;
+ # Manufacturers
+ dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+ | unicom* | ibm* | next | hp | isi* | apollo | altos* \
+ | convergent* | ncr* | news | 32* | 3600* | 3100* \
+ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+ | ultra | tti* | harris | dolphin | highlevel | gould \
+ | cbm | ns | masscomp | apple | axis | knuth | cray \
+ | microblaze* | sim | cisco \
+ | oki | wec | wrs | winbond)
+ basic_machine=$field1-$field2
+ basic_os=
+ ;;
+ *)
+ basic_machine=$field1
+ basic_os=$field2
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ *)
+ # Convert single-component short-hands not valid as part of
+ # multi-component configurations.
+ case $field1 in
+ 386bsd)
+ basic_machine=i386-pc
+ basic_os=bsd
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ basic_os=scout
+ ;;
+ alliant)
+ basic_machine=fx80-alliant
+ basic_os=
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ basic_os=
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ basic_os=bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ basic_os=sysv
+ ;;
+ amiga)
+ basic_machine=m68k-unknown
+ basic_os=
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-unknown
+ basic_os=amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-unknown
+ basic_os=sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ basic_os=sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ basic_os=bsd
+ ;;
+ aros)
+ basic_machine=i386-pc
+ basic_os=aros
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ basic_os=aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ basic_os=dynix
+ ;;
+ blackfin)
+ basic_machine=bfin-unknown
+ basic_os=linux
+ ;;
+ cegcc)
+ basic_machine=arm-unknown
+ basic_os=cegcc
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ basic_os=bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ basic_os=bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ basic_os=bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ basic_os=bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ basic_os=bsd
+ ;;
+ cray)
+ basic_machine=j90-cray
+ basic_os=unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ basic_os=
+ ;;
+ da30)
+ basic_machine=m68k-da30
+ basic_os=
+ ;;
+ decstation | pmax | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ basic_os=
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ basic_os=sysv3
+ ;;
+ dicos)
+ basic_machine=i686-pc
+ basic_os=dicos
+ ;;
+ djgpp)
+ basic_machine=i586-pc
+ basic_os=msdosdjgpp
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ basic_os=ebmon
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ basic_os=ose
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ basic_os=sysv
+ ;;
+ go32)
+ basic_machine=i386-pc
+ basic_os=go32
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ basic_os=hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ basic_os=xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ basic_os=hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ basic_os=sysv3
+ ;;
+ hp300 | hp300hpux)
+ basic_machine=m68k-hp
+ basic_os=hpux
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ basic_os=bsd
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ basic_os=osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ basic_os=proelf
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ basic_os=mach
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ basic_os=sysv
+ ;;
+ m68knommu)
+ basic_machine=m68k-unknown
+ basic_os=linux
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ basic_os=sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ basic_os=sysv
+ ;;
+ mingw64)
+ basic_machine=x86_64-pc
+ basic_os=mingw64
+ ;;
+ mingw32)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ mingw32ce)
+ basic_machine=arm-unknown
+ basic_os=mingw32ce
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ morphos)
+ basic_machine=powerpc-unknown
+ basic_os=morphos
+ ;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ basic_os=moxiebox
+ ;;
+ msdos)
+ basic_machine=i386-pc
+ basic_os=msdos
+ ;;
+ msys)
+ basic_machine=i686-pc
+ basic_os=msys
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ basic_os=mvs
+ ;;
+ nacl)
+ basic_machine=le32-unknown
+ basic_os=nacl
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ basic_os=sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-pc
+ basic_os=netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ basic_os=linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ basic_os=newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ basic_os=newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ basic_os=sysv
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ basic_os=cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ basic_os=cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ basic_os=nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ basic_os=mon960
+ ;;
+ nonstopux)
+ basic_machine=mips-compaq
+ basic_os=nonstopux
+ ;;
+ os400)
+ basic_machine=powerpc-ibm
+ basic_os=os400
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ basic_os=ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ basic_os=os68k
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ basic_os=osf
+ ;;
+ parisc)
+ basic_machine=hppa-unknown
+ basic_os=linux
+ ;;
+ psp)
+ basic_machine=mipsallegrexel-sony
+ basic_os=psp
+ ;;
+ pw32)
+ basic_machine=i586-unknown
+ basic_os=pw32
+ ;;
+ rdos | rdos64)
+ basic_machine=x86_64-pc
+ basic_os=rdos
+ ;;
+ rdos32)
+ basic_machine=i386-pc
+ basic_os=rdos
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ basic_os=coff
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ sei)
+ basic_machine=mips-sei
+ basic_os=seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ basic_os=
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ basic_os=sysv2
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ basic_os=
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ basic_os=sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ basic_os=
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ basic_os=sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ basic_os=sunos4
+ ;;
+ sun3)
+ basic_machine=m68k-sun
+ basic_os=
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ basic_os=sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ basic_os=sunos4
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ basic_os=
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ basic_os=sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ basic_os=sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ basic_os=solaris2
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ basic_os=
+ ;;
+ sv1)
+ basic_machine=sv1-cray
+ basic_os=unicos
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ basic_os=dynix
+ ;;
+ t3e)
+ basic_machine=alphaev5-cray
+ basic_os=unicos
+ ;;
+ t90)
+ basic_machine=t90-cray
+ basic_os=unicos
+ ;;
+ toad1)
+ basic_machine=pdp10-xkl
+ basic_os=tops20
+ ;;
+ tpf)
+ basic_machine=s390x-ibm
+ basic_os=tpf
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ basic_os=udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ basic_os=sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ basic_os=none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ basic_os=sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ basic_os=vms
+ ;;
+ vsta)
+ basic_machine=i386-pc
+ basic_os=vsta
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ basic_os=vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ basic_os=vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ basic_os=vxworks
+ ;;
+ xbox)
+ basic_machine=i686-pc
+ basic_os=mingw32
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ basic_os=unicos
+ ;;
+ *)
+ basic_machine=$1
+ basic_os=
+ ;;
+ esac
+ ;;
+esac
+
+# Decode 1-component or ad-hoc basic machines
+case $basic_machine in
+ # Here we handle the default manufacturer of certain CPU types. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ cpu=hppa1.1
+ vendor=winbond
+ ;;
+ op50n)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ op60c)
+ cpu=hppa1.1
+ vendor=oki
+ ;;
+ ibm*)
+ cpu=i370
+ vendor=ibm
+ ;;
+ orion105)
+ cpu=clipper
+ vendor=highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ cpu=m68k
+ vendor=apple
+ ;;
+ pmac | pmac-mpw)
+ cpu=powerpc
+ vendor=apple
+ ;;
+
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ cpu=m68000
+ vendor=att
+ ;;
+ 3b*)
+ cpu=we32k
+ vendor=att
+ ;;
+ bluegene*)
+ cpu=powerpc
+ vendor=ibm
+ basic_os=cnk
+ ;;
+ decsystem10* | dec10*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops10
+ ;;
+ decsystem20* | dec20*)
+ cpu=pdp10
+ vendor=dec
+ basic_os=tops20
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ cpu=m68k
+ vendor=motorola
+ ;;
+ dpx2*)
+ cpu=m68k
+ vendor=bull
+ basic_os=sysv3
+ ;;
+ encore | umax | mmax)
+ cpu=ns32k
+ vendor=encore
+ ;;
+ elxsi)
+ cpu=elxsi
+ vendor=elxsi
+ basic_os=${basic_os:-bsd}
+ ;;
+ fx2800)
+ cpu=i860
+ vendor=alliant
+ ;;
+ genix)
+ cpu=ns32k
+ vendor=ns
+ ;;
+ h3050r* | hiux*)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ cpu=m68000
+ vendor=hp
+ ;;
+ hp9k3[2-9][0-9])
+ cpu=m68k
+ vendor=hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ cpu=hppa1.1
+ vendor=hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ cpu=hppa1.0
+ vendor=hp
+ ;;
+ i*86v32)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv32
+ ;;
+ i*86v4*)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv4
+ ;;
+ i*86v)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=sysv
+ ;;
+ i*86sol2)
+ cpu=`echo "$1" | sed -e 's/86.*/86/'`
+ vendor=pc
+ basic_os=solaris2
+ ;;
+ j90 | j90-cray)
+ cpu=j90
+ vendor=cray
+ basic_os=${basic_os:-unicos}
+ ;;
+ iris | iris4d)
+ cpu=mips
+ vendor=sgi
+ case $basic_os in
+ irix*)
+ ;;
+ *)
+ basic_os=irix4
+ ;;
+ esac
+ ;;
+ miniframe)
+ cpu=m68000
+ vendor=convergent
+ ;;
+ *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ cpu=m68k
+ vendor=atari
+ basic_os=mint
+ ;;
+ news-3600 | risc-news)
+ cpu=mips
+ vendor=sony
+ basic_os=newsos
+ ;;
+ next | m*-next)
+ cpu=m68k
+ vendor=next
+ case $basic_os in
+ openstep*)
+ ;;
+ nextstep*)
+ ;;
+ ns2*)
+ basic_os=nextstep2
+ ;;
+ *)
+ basic_os=nextstep3
+ ;;
+ esac
+ ;;
+ np1)
+ cpu=np1
+ vendor=gould
+ ;;
+ op50n-* | op60c-*)
+ cpu=hppa1.1
+ vendor=oki
+ basic_os=proelf
+ ;;
+ pa-hitachi)
+ cpu=hppa1.1
+ vendor=hitachi
+ basic_os=hiuxwe2
+ ;;
+ pbd)
+ cpu=sparc
+ vendor=tti
+ ;;
+ pbb)
+ cpu=m68k
+ vendor=tti
+ ;;
+ pc532)
+ cpu=ns32k
+ vendor=pc532
+ ;;
+ pn)
+ cpu=pn
+ vendor=gould
+ ;;
+ power)
+ cpu=power
+ vendor=ibm
+ ;;
+ ps2)
+ cpu=i386
+ vendor=ibm
+ ;;
+ rm[46]00)
+ cpu=mips
+ vendor=siemens
+ ;;
+ rtpc | rtpc-*)
+ cpu=romp
+ vendor=ibm
+ ;;
+ sde)
+ cpu=mipsisa32
+ vendor=sde
+ basic_os=${basic_os:-elf}
+ ;;
+ simso-wrs)
+ cpu=sparclite
+ vendor=wrs
+ basic_os=vxworks
+ ;;
+ tower | tower-32)
+ cpu=m68k
+ vendor=ncr
+ ;;
+ vpp*|vx|vx-*)
+ cpu=f301
+ vendor=fujitsu
+ ;;
+ w65)
+ cpu=w65
+ vendor=wdc
+ ;;
+ w89k-*)
+ cpu=hppa1.1
+ vendor=winbond
+ basic_os=proelf
+ ;;
+ none)
+ cpu=none
+ vendor=none
+ ;;
+ leon|leon[3-9])
+ cpu=sparc
+ vendor=$basic_machine
+ ;;
+ leon-*|leon[3-9]-*)
+ cpu=sparc
+ vendor=`echo "$basic_machine" | sed 's/-.*//'`
+ ;;
+
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+ IFS=$saved_IFS
+ ;;
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i*86 | x86_64)
+ cpu=$basic_machine
+ vendor=pc
+ ;;
+ # These rules are duplicated from below for sake of the special case above;
+ # i.e. things that normalized to x86 arches should also default to "pc"
+ pc98)
+ cpu=i386
+ vendor=pc
+ ;;
+ x64 | amd64)
+ cpu=x86_64
+ vendor=pc
+ ;;
+ # Recognize the basic CPU types without company name.
+ *)
+ cpu=$basic_machine
+ vendor=unknown
+ ;;
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+ # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+ # some cases the only manufacturer, in others, it is the most popular.
+ craynv-unknown)
+ vendor=cray
+ basic_os=${basic_os:-unicosmp}
+ ;;
+ c90-unknown | c90-cray)
+ vendor=cray
+ basic_os=${Basic_os:-unicos}
+ ;;
+ fx80-unknown)
+ vendor=alliant
+ ;;
+ romp-unknown)
+ vendor=ibm
+ ;;
+ mmix-unknown)
+ vendor=knuth
+ ;;
+ microblaze-unknown | microblazeel-unknown)
+ vendor=xilinx
+ ;;
+ rs6000-unknown)
+ vendor=ibm
+ ;;
+ vax-unknown)
+ vendor=dec
+ ;;
+ pdp11-unknown)
+ vendor=dec
+ ;;
+ we32k-unknown)
+ vendor=att
+ ;;
+ cydra-unknown)
+ vendor=cydrome
+ ;;
+ i370-ibm*)
+ vendor=ibm
+ ;;
+ orion-unknown)
+ vendor=highlevel
+ ;;
+ xps-unknown | xps100-unknown)
+ cpu=xps100
+ vendor=honeywell
+ ;;
+
+ # Here we normalize CPU types with a missing or matching vendor
+ dpx20-unknown | dpx20-bull)
+ cpu=rs6000
+ vendor=bull
+ basic_os=${basic_os:-bosx}
+ ;;
+
+ # Here we normalize CPU types irrespective of the vendor
+ amd64-*)
+ cpu=x86_64
+ ;;
+ blackfin-*)
+ cpu=bfin
+ basic_os=linux
+ ;;
+ c54x-*)
+ cpu=tic54x
+ ;;
+ c55x-*)
+ cpu=tic55x
+ ;;
+ c6x-*)
+ cpu=tic6x
+ ;;
+ e500v[12]-*)
+ cpu=powerpc
+ basic_os=${basic_os}"spe"
+ ;;
+ mips3*-*)
+ cpu=mips64
+ ;;
+ ms1-*)
+ cpu=mt
+ ;;
+ m68knommu-*)
+ cpu=m68k
+ basic_os=linux
+ ;;
+ m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+ cpu=s12z
+ ;;
+ openrisc-*)
+ cpu=or32
+ ;;
+ parisc-*)
+ cpu=hppa
+ basic_os=linux
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+ cpu=i586
+ ;;
+ pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+ cpu=i686
+ ;;
+ pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+ cpu=i686
+ ;;
+ pentium4-*)
+ cpu=i786
+ ;;
+ pc98-*)
+ cpu=i386
+ ;;
+ ppc-* | ppcbe-*)
+ cpu=powerpc
+ ;;
+ ppcle-* | powerpclittle-*)
+ cpu=powerpcle
+ ;;
+ ppc64-*)
+ cpu=powerpc64
+ ;;
+ ppc64le-* | powerpc64little-*)
+ cpu=powerpc64le
+ ;;
+ sb1-*)
+ cpu=mipsisa64sb1
+ ;;
+ sb1el-*)
+ cpu=mipsisa64sb1el
+ ;;
+ sh5e[lb]-*)
+ cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
+ ;;
+ spur-*)
+ cpu=spur
+ ;;
+ strongarm-* | thumb-*)
+ cpu=arm
+ ;;
+ tx39-*)
+ cpu=mipstx39
+ ;;
+ tx39el-*)
+ cpu=mipstx39el
+ ;;
+ x64-*)
+ cpu=x86_64
+ ;;
+ xscale-* | xscalee[bl]-*)
+ cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
+ ;;
+ arm64-*)
+ cpu=aarch64
+ ;;
+
+ # Recognize the canonical CPU Types that limit and/or modify the
+ # company names they are paired with.
+ cr16-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ crisv32-* | etraxfs*-*)
+ cpu=crisv32
+ vendor=axis
+ ;;
+ cris-* | etrax*-*)
+ cpu=cris
+ vendor=axis
+ ;;
+ crx-*)
+ basic_os=${basic_os:-elf}
+ ;;
+ neo-tandem)
+ cpu=neo
+ vendor=tandem
+ ;;
+ nse-tandem)
+ cpu=nse
+ vendor=tandem
+ ;;
+ nsr-tandem)
+ cpu=nsr
+ vendor=tandem
+ ;;
+ nsv-tandem)
+ cpu=nsv
+ vendor=tandem
+ ;;
+ nsx-tandem)
+ cpu=nsx
+ vendor=tandem
+ ;;
+ mipsallegrexel-sony)
+ cpu=mipsallegrexel
+ vendor=sony
+ ;;
+ tile*-*)
+ basic_os=${basic_os:-linux-gnu}
+ ;;
+
+ *)
+ # Recognize the canonical CPU types that are allowed with any
+ # company name.
+ case $cpu in
+ 1750a | 580 \
+ | a29k \
+ | aarch64 | aarch64_be \
+ | abacus \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+ | alphapca5[67] | alpha64pca5[67] \
+ | am33_2.0 \
+ | amdgcn \
+ | arc | arceb | arc32 | arc64 \
+ | arm | arm[lb]e | arme[lb] | armv* \
+ | avr | avr32 \
+ | asmjs \
+ | ba \
+ | be32 | be64 \
+ | bfin | bpf | bs2000 \
+ | c[123]* | c30 | [cjt]90 | c4x \
+ | c8051 | clipper | craynv | csky | cydra \
+ | d10v | d30v | dlx | dsp16xx \
+ | e2k | elxsi | epiphany \
+ | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+ | h8300 | h8500 \
+ | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | hexagon \
+ | i370 | i*86 | i860 | i960 | ia16 | ia64 \
+ | ip2k | iq2000 \
+ | k1om \
+ | le32 | le64 \
+ | lm32 \
+ | loongarch32 | loongarch64 | loongarchx32 \
+ | m32c | m32r | m32rle \
+ | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+ | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+ | m88110 | m88k | maxq | mb | mcore | mep | metag \
+ | microblaze | microblazeel \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64eb | mips64el \
+ | mips64octeon | mips64octeonel \
+ | mips64orion | mips64orionel \
+ | mips64r5900 | mips64r5900el \
+ | mips64vr | mips64vrel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r3 | mipsisa32r3el \
+ | mipsisa32r5 | mipsisa32r5el \
+ | mipsisa32r6 | mipsisa32r6el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r3 | mipsisa64r3el \
+ | mipsisa64r5 | mipsisa64r5el \
+ | mipsisa64r6 | mipsisa64r6el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipsr5900 | mipsr5900el \
+ | mipstx39 | mipstx39el \
+ | mmix \
+ | mn10200 | mn10300 \
+ | moxie \
+ | mt \
+ | msp430 \
+ | nds32 | nds32le | nds32be \
+ | nfp \
+ | nios | nios2 | nios2eb | nios2el \
+ | none | np1 | ns16k | ns32k | nvptx \
+ | open8 \
+ | or1k* \
+ | or32 \
+ | orion \
+ | picochip \
+ | pdp10 | pdp11 | pj | pjl | pn | power \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+ | pru \
+ | pyramid \
+ | riscv | riscv32 | riscv32be | riscv64 | riscv64be \
+ | rl78 | romp | rs6000 | rx \
+ | s390 | s390x \
+ | score \
+ | sh | shl \
+ | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+ | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+ | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+ | spu \
+ | tahoe \
+ | thumbv7* \
+ | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+ | tron \
+ | ubicom32 \
+ | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+ | vax \
+ | visium \
+ | w65 \
+ | wasm32 | wasm64 \
+ | we32k \
+ | x86 | x86_64 | xc16x | xgate | xps100 \
+ | xstormy16 | xtensa* \
+ | ymp \
+ | z8k | z80)
+ ;;
+
+ *)
+ echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+ exit 1
+ ;;
+ esac
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $vendor in
+ digital*)
+ vendor=dec
+ ;;
+ commodore*)
+ vendor=cbm
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if test x$basic_os != x
+then
+
+# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+ gnu/linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`
+ ;;
+ os2-emx)
+ kernel=os2
+ os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`
+ ;;
+ nto-qnx*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
+ ;;
+ *-*)
+ # shellcheck disable=SC2162
+ saved_IFS=$IFS
+ IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+ IFS=$saved_IFS
+ ;;
+ # Default OS when just kernel was specified
+ nto*)
+ kernel=nto
+ os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
+ ;;
+ linux*)
+ kernel=linux
+ os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+ ;;
+ *)
+ kernel=
+ os=$basic_os
+ ;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
+case $os in
+ # First match some system type aliases that might get confused
+ # with valid system types.
+ # solaris* is a basic system type, with this one exception.
+ auroraux)
+ os=auroraux
+ ;;
+ bluegene*)
+ os=cnk
+ ;;
+ solaris1 | solaris1.*)
+ os=`echo "$os" | sed -e 's|solaris1|sunos4|'`
+ ;;
+ solaris)
+ os=solaris2
+ ;;
+ unixware*)
+ os=sysv4.2uw
+ ;;
+ # es1800 is here to avoid being matched by es* (a different OS)
+ es1800*)
+ os=ose
+ ;;
+ # Some version numbers need modification
+ chorusos*)
+ os=chorusos
+ ;;
+ isc)
+ os=isc2.2
+ ;;
+ sco6)
+ os=sco5v6
+ ;;
+ sco5)
+ os=sco3.2v5
+ ;;
+ sco4)
+ os=sco3.2v4
+ ;;
+ sco3.2.[4-9]*)
+ os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`
+ ;;
+ sco*v* | scout)
+ # Don't match below
+ ;;
+ sco*)
+ os=sco3.2v2
+ ;;
+ psos*)
+ os=psos
+ ;;
+ qnx*)
+ os=qnx
+ ;;
+ hiux*)
+ os=hiuxwe2
+ ;;
+ lynx*178)
+ os=lynxos178
+ ;;
+ lynx*5)
+ os=lynxos5
+ ;;
+ lynxos*)
+ # don't get caught up in next wildcard
+ ;;
+ lynx*)
+ os=lynxos
+ ;;
+ mac[0-9]*)
+ os=`echo "$os" | sed -e 's|mac|macos|'`
+ ;;
+ opened*)
+ os=openedition
+ ;;
+ os400*)
+ os=os400
+ ;;
+ sunos5*)
+ os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
+ ;;
+ sunos6*)
+ os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
+ ;;
+ wince*)
+ os=wince
+ ;;
+ utek*)
+ os=bsd
+ ;;
+ dynix*)
+ os=bsd
+ ;;
+ acis*)
+ os=aos
+ ;;
+ atheos*)
+ os=atheos
+ ;;
+ syllable*)
+ os=syllable
+ ;;
+ 386bsd)
+ os=bsd
+ ;;
+ ctix* | uts*)
+ os=sysv
+ ;;
+ nova*)
+ os=rtmk-nova
+ ;;
+ ns2)
+ os=nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ sinix5.*)
+ os=`echo "$os" | sed -e 's|sinix|sysv|'`
+ ;;
+ sinix*)
+ os=sysv4
+ ;;
+ tpf*)
+ os=tpf
+ ;;
+ triton*)
+ os=sysv3
+ ;;
+ oss*)
+ os=sysv3
+ ;;
+ svr4*)
+ os=sysv4
+ ;;
+ svr3)
+ os=sysv3
+ ;;
+ sysvr4)
+ os=sysv4
+ ;;
+ ose*)
+ os=ose
+ ;;
+ *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+ os=mint
+ ;;
+ dicos*)
+ os=dicos
+ ;;
+ pikeos*)
+ # Until real need of OS specific support for
+ # particular features comes up, bare metal
+ # configurations are quite functional.
+ case $cpu in
+ arm*)
+ os=eabi
+ ;;
+ *)
+ os=elf
+ ;;
+ esac
+ ;;
+ *)
+ # No normalization, but not necessarily accepted, that comes below.
+ ;;
+esac
+
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+kernel=
+case $cpu-$vendor in
+ score-*)
+ os=elf
+ ;;
+ spu-*)
+ os=elf
+ ;;
+ *-acorn)
+ os=riscix1.2
+ ;;
+ arm*-rebel)
+ kernel=linux
+ os=gnu
+ ;;
+ arm*-semi)
+ os=aout
+ ;;
+ c4x-* | tic4x-*)
+ os=coff
+ ;;
+ c8051-*)
+ os=elf
+ ;;
+ clipper-intergraph)
+ os=clix
+ ;;
+ hexagon-*)
+ os=elf
+ ;;
+ tic54x-*)
+ os=coff
+ ;;
+ tic55x-*)
+ os=coff
+ ;;
+ tic6x-*)
+ os=coff
+ ;;
+ # This must come before the *-dec entry.
+ pdp10-*)
+ os=tops20
+ ;;
+ pdp11-*)
+ os=none
+ ;;
+ *-dec | vax-*)
+ os=ultrix4.2
+ ;;
+ m68*-apollo)
+ os=domain
+ ;;
+ i386-sun)
+ os=sunos4.0.2
+ ;;
+ m68000-sun)
+ os=sunos3
+ ;;
+ m68*-cisco)
+ os=aout
+ ;;
+ mep-*)
+ os=elf
+ ;;
+ mips*-cisco)
+ os=elf
+ ;;
+ mips*-*)
+ os=elf
+ ;;
+ or32-*)
+ os=coff
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=sysv3
+ ;;
+ sparc-* | *-sun)
+ os=sunos4.1.1
+ ;;
+ pru-*)
+ os=elf
+ ;;
+ *-be)
+ os=beos
+ ;;
+ *-ibm)
+ os=aix
+ ;;
+ *-knuth)
+ os=mmixware
+ ;;
+ *-wec)
+ os=proelf
+ ;;
+ *-winbond)
+ os=proelf
+ ;;
+ *-oki)
+ os=proelf
+ ;;
+ *-hp)
+ os=hpux
+ ;;
+ *-hitachi)
+ os=hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=sysv
+ ;;
+ *-cbm)
+ os=amigaos
+ ;;
+ *-dg)
+ os=dgux
+ ;;
+ *-dolphin)
+ os=sysv3
+ ;;
+ m68k-ccur)
+ os=rtu
+ ;;
+ m88k-omron*)
+ os=luna
+ ;;
+ *-next)
+ os=nextstep
+ ;;
+ *-sequent)
+ os=ptx
+ ;;
+ *-crds)
+ os=unos
+ ;;
+ *-ns)
+ os=genix
+ ;;
+ i370-*)
+ os=mvs
+ ;;
+ *-gould)
+ os=sysv
+ ;;
+ *-highlevel)
+ os=bsd
+ ;;
+ *-encore)
+ os=bsd
+ ;;
+ *-sgi)
+ os=irix
+ ;;
+ *-siemens)
+ os=sysv4
+ ;;
+ *-masscomp)
+ os=rtu
+ ;;
+ f30[01]-fujitsu | f700-fujitsu)
+ os=uxpv
+ ;;
+ *-rom68k)
+ os=coff
+ ;;
+ *-*bug)
+ os=coff
+ ;;
+ *-apple)
+ os=macos
+ ;;
+ *-atari*)
+ os=mint
+ ;;
+ *-wrs)
+ os=vxworks
+ ;;
+ *)
+ os=none
+ ;;
+esac
+
+fi
+
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+ # Sometimes we do "kernel-libc", so those need to count as OSes.
+ musl* | newlib* | relibc* | uclibc*)
+ ;;
+ # Likewise for "kernel-abi"
+ eabi* | gnueabi*)
+ ;;
+ # VxWorks passes extra cpu info in the 4th filed.
+ simlinux | simwindows | spe)
+ ;;
+ # Now accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST end in a * to match a version number.
+ gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+ | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+ | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+ | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
+ | hiux* | abug | nacl* | netware* | windows* \
+ | os9* | macos* | osx* | ios* \
+ | mpw* | magic* | mmixware* | mon960* | lnews* \
+ | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+ | aos* | aros* | cloudabi* | sortix* | twizzler* \
+ | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+ | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+ | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+ | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
+ | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+ | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+ | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+ | udi* | lites* | ieee* | go32* | aux* | hcos* \
+ | chorusrdb* | cegcc* | glidix* | serenity* \
+ | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+ | midipix* | mingw32* | mingw64* | mint* \
+ | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+ | interix* | uwin* | mks* | rhapsody* | darwin* \
+ | openstep* | oskit* | conix* | pw32* | nonstopux* \
+ | storm-chaos* | tops10* | tenex* | tops20* | its* \
+ | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+ | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+ | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+ | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+ | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+ | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+ | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr*)
+ ;;
+ # This one is extra strict with allowed versions
+ sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+ # Don't forget version if it is 3.2v4 or newer.
+ ;;
+ none)
+ ;;
+ *)
+ echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+ linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
+ | linux-musl* | linux-relibc* | linux-uclibc* )
+ ;;
+ uclinux-uclibc* )
+ ;;
+ -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )
+ # These are just libc implementations, not actual OSes, and thus
+ # require a kernel.
+ echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+ exit 1
+ ;;
+ kfreebsd*-gnu* | kopensolaris*-gnu*)
+ ;;
+ vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+ ;;
+ nto-qnx*)
+ ;;
+ os2-emx)
+ ;;
+ *-eabi* | *-gnueabi*)
+ ;;
+ -*)
+ # Blank kernel with real OS is always fine.
+ ;;
+ *-*)
+ echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+case $vendor in
+ unknown)
+ case $cpu-$os in
+ *-riscix*)
+ vendor=acorn
+ ;;
+ *-sunos*)
+ vendor=sun
+ ;;
+ *-cnk* | *-aix*)
+ vendor=ibm
+ ;;
+ *-beos*)
+ vendor=be
+ ;;
+ *-hpux*)
+ vendor=hp
+ ;;
+ *-mpeix*)
+ vendor=hp
+ ;;
+ *-hiux*)
+ vendor=hitachi
+ ;;
+ *-unos*)
+ vendor=crds
+ ;;
+ *-dgux*)
+ vendor=dg
+ ;;
+ *-luna*)
+ vendor=omron
+ ;;
+ *-genix*)
+ vendor=ns
+ ;;
+ *-clix*)
+ vendor=intergraph
+ ;;
+ *-mvs* | *-opened*)
+ vendor=ibm
+ ;;
+ *-os400*)
+ vendor=ibm
+ ;;
+ s390-* | s390x-*)
+ vendor=ibm
+ ;;
+ *-ptx*)
+ vendor=sequent
+ ;;
+ *-tpf*)
+ vendor=ibm
+ ;;
+ *-vxsim* | *-vxworks* | *-windiss*)
+ vendor=wrs
+ ;;
+ *-aux*)
+ vendor=apple
+ ;;
+ *-hms*)
+ vendor=hitachi
+ ;;
+ *-mpw* | *-macos*)
+ vendor=apple
+ ;;
+ *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
+ vendor=atari
+ ;;
+ *-vos*)
+ vendor=stratus
+ ;;
+ esac
+ ;;
+esac
+
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
+exit
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/3rdparty/asio/configure b/3rdparty/asio/configure
new file mode 100755
index 00000000000..3f97eb5ce3f
--- /dev/null
+++ b/3rdparty/asio/configure
@@ -0,0 +1,7133 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.71 for asio 1.30.2.
+#
+#
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+# Use a proper internal environment variable to ensure we don't fall
+ # into an infinite loop, continuously re-executing ourselves.
+ if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
+ _as_can_reexec=no; export _as_can_reexec;
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+ fi
+ # We don't want this to propagate to other subprocesses.
+ { _as_can_reexec=; unset _as_can_reexec;}
+if test "x$CONFIG_SHELL" = x; then
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '\${1+\"\$@\"}'='\"\$@\"'
+ setopt NO_GLOB_SUBST
+else \$as_nop
+ case \`(set -o) 2>/dev/null\` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+"
+ as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
+
+else \$as_nop
+ exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
+test -x / || exit 1"
+ as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+ as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+ eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+ if (eval "$as_required") 2>/dev/null
+then :
+ as_have_required=yes
+else $as_nop
+ as_have_required=no
+fi
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
+
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+ case $as_dir in #(
+ /*)
+ for as_base in sh bash ksh sh5; do
+ # Try only shells that exist, to save several forks.
+ as_shell=$as_dir$as_base
+ if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$as_shell as_have_required=yes
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
+ break 2
+fi
+fi
+ done;;
+ esac
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
+
+
+ if test "x$CONFIG_SHELL" != x
+then :
+ export CONFIG_SHELL
+ # We cannot yet assume a decent shell, so we have to provide a
+# neutralization value for shells without unset; and this also
+# works around shells that cannot unset nonexistent variables.
+# Preserve -v and -x to the replacement shell.
+BASH_ENV=/dev/null
+ENV=/dev/null
+(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+case $- in # ((((
+ *v*x* | *x*v* ) as_opts=-vx ;;
+ *v* ) as_opts=-v ;;
+ *x* ) as_opts=-x ;;
+ * ) as_opts= ;;
+esac
+exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
+# Admittedly, this is quite paranoid, since all the known shells bail
+# out after a failed `exec'.
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
+fi
+
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
+ else
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+ fi
+ exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
+ # already done that, so ensure we don't try to do so again and fall
+ # in an infinite loop. This has already happened in practice.
+ _as_can_reexec=no; export _as_can_reexec
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='asio'
+PACKAGE_TARNAME='asio'
+PACKAGE_VERSION='1.30.2'
+PACKAGE_STRING='asio 1.30.2'
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
+
+ac_unique_file="include/asio.hpp"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
+#endif
+#ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_header_cxx_list=
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+HAVE_COROUTINES_FALSE
+HAVE_COROUTINES_TRUE
+HAVE_CXX20_FALSE
+HAVE_CXX20_TRUE
+HAVE_CXX17_FALSE
+HAVE_CXX17_TRUE
+HAVE_CXX14_FALSE
+HAVE_CXX14_TRUE
+HAVE_CXX11_FALSE
+HAVE_CXX11_TRUE
+WINDOWS_TARGET_FALSE
+WINDOWS_TARGET_TRUE
+HAVE_BOOST_COROUTINE_FALSE
+HAVE_BOOST_COROUTINE_TRUE
+SEPARATE_COMPILATION_FALSE
+SEPARATE_COMPILATION_TRUE
+STANDALONE_FALSE
+STANDALONE_TRUE
+HAVE_OPENSSL_FALSE
+HAVE_OPENSSL_TRUE
+pkgconfigdir
+RANLIB
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+AM_BACKSLASH
+AM_DEFAULT_VERBOSITY
+AM_DEFAULT_V
+AM_V
+CSCOPE
+ETAGS
+CTAGS
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+MAINT
+MAINTAINER_MODE_FALSE
+MAINTAINER_MODE_TRUE
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+runstatedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL
+am__quote'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_maintainer_mode
+enable_silent_rules
+enable_dependency_tracking
+with_pkgconfigdir
+with_boost
+enable_separate_compilation
+enable_boost_coroutine
+with_openssl
+'
+ ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval $ac_prev=\$ac_option
+ ac_prev=
+ continue
+ fi
+
+ case $ac_option in
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+ *=) ac_optarg= ;;
+ *) ac_optarg=yes ;;
+ esac
+
+ case $ac_dashdash$ac_option in
+ --)
+ ac_dashdash=yes ;;
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=*)
+ datadir=$ac_optarg ;;
+
+ -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+ | --dataroo | --dataro | --datar)
+ ac_prev=datarootdir ;;
+ -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+ datarootdir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=no ;;
+
+ -docdir | --docdir | --docdi | --doc | --do)
+ ac_prev=docdir ;;
+ -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+ docdir=$ac_optarg ;;
+
+ -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+ ac_prev=dvidir ;;
+ -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+ dvidir=$ac_optarg ;;
+
+ -enable-* | --enable-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"enable_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval enable_$ac_useropt=\$ac_optarg ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+ ac_prev=htmldir ;;
+ -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+ | --ht=*)
+ htmldir=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localedir | --localedir | --localedi | --localed | --locale)
+ ac_prev=localedir ;;
+ -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+ localedir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst | --locals)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+ ac_prev=pdfdir ;;
+ -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+ pdfdir=$ac_optarg ;;
+
+ -psdir | --psdir | --psdi | --psd | --ps)
+ ac_prev=psdir ;;
+ -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+ psdir=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -runstatedir | --runstatedir | --runstatedi | --runstated \
+ | --runstate | --runstat | --runsta | --runst | --runs \
+ | --run | --ru | --r)
+ ac_prev=runstatedir ;;
+ -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+ | --run=* | --ru=* | --r=*)
+ runstatedir=$ac_optarg ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=\$ac_optarg ;;
+
+ -without-* | --without-*)
+ ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
+ ac_useropt_orig=$ac_useropt
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
+ case $ac_user_opts in
+ *"
+"with_$ac_useropt"
+"*) ;;
+ *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+ ac_unrecognized_sep=', ';;
+ esac
+ eval with_$ac_useropt=no ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ case $ac_envvar in #(
+ '' | [0-9]* | *[!_$as_cr_alnum]* )
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+ esac
+ eval $ac_envvar=\$ac_optarg
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+ case $enable_option_checking in
+ no) ;;
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
+ datadir sysconfdir sharedstatedir localstatedir includedir \
+ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+ libdir localedir mandir runstatedir
+do
+ eval ac_val=\$$ac_var
+ # Remove trailing slashes.
+ case $ac_val in
+ */ )
+ ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+ eval $ac_var=\$ac_val;;
+ esac
+ # Be sure to have absolute directory names.
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) continue;;
+ NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+ esac
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+ as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+ as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then the parent directory.
+ ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_myself" : 'X\(//\)[^/]' \| \
+ X"$as_myself" : 'X\(//\)$' \| \
+ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_myself" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r "$srcdir/$ac_unique_file"; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+ test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+ pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+ srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+ eval ac_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_env_${ac_var}_value=\$${ac_var}
+ eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+ eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures asio 1.30.2 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking ...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --datarootdir=DIR read-only arch.-independent data root [PREFIX/share]
+ --datadir=DIR read-only architecture-independent data [DATAROOTDIR]
+ --infodir=DIR info documentation [DATAROOTDIR/info]
+ --localedir=DIR locale-dependent data [DATAROOTDIR/locale]
+ --mandir=DIR man documentation [DATAROOTDIR/man]
+ --docdir=DIR documentation root [DATAROOTDIR/doc/asio]
+ --htmldir=DIR html documentation [DOCDIR]
+ --dvidir=DIR dvi documentation [DOCDIR]
+ --pdfdir=DIR pdf documentation [DOCDIR]
+ --psdir=DIR ps documentation [DOCDIR]
+_ACEOF
+
+ cat <<\_ACEOF
+
+Program names:
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM run sed PROGRAM on installed program names
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+ case $ac_init_help in
+ short | recursive ) echo "Configuration of asio 1.30.2:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-option-checking ignore unrecognized --enable/--with options
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-maintainer-mode
+ enable make rules and dependencies not useful (and
+ sometimes confusing) to the casual installer
+ --enable-silent-rules less verbose build output (undo: "make V=1")
+ --disable-silent-rules verbose build output (undo: "make V=0")
+ --enable-dependency-tracking
+ do not reject slow dependency extractors
+ --disable-dependency-tracking
+ speeds up one-time build
+ --enable-separate-compilation separate compilation of asio source
+ --enable-boost-coroutine use Boost.Coroutine to implement stackful coroutines
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-pkgconfigdir pkg-config installation directory
+ ['${libdir}/pkgconfig']
+ --with-boost=DIR location of boost distribution
+ --with-openssl=DIR location of openssl
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ LIBS libraries to pass to the linker, e.g. -l<library>
+ CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+ you have headers in a nonstandard directory <include dir>
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to the package provider.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d "$ac_dir" ||
+ { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+ continue
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+ cd "$ac_dir" || { ac_status=$?; continue; }
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
+ if test -f "$ac_srcdir/configure.gnu"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+ elif test -f "$ac_srcdir/configure"; then
+ echo &&
+ $SHELL "$ac_srcdir/configure" --help=recursive
+ else
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi || ac_status=$?
+ cd "$ac_pwd" || { ac_status=$?; break; }
+ done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+ cat <<\_ACEOF
+asio configure 1.30.2
+generated by GNU Autoconf 2.71
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext conftest.beam
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_cxx_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES
+# ---------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_cxx_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_header_compile
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by asio $as_me 1.30.2, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ $ $0$ac_configure_args_raw
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
+ done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+ 2)
+ as_fn_append ac_configure_args1 " '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ as_fn_append ac_configure_args " '$ac_arg'"
+ ;;
+ esac
+ done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ printf "%s\n" "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+(
+ for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+ (set) 2>&1 |
+ case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ sed -n \
+ "s/'\''/'\''\\\\'\'''\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+ ;; #(
+ *)
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+)
+ echo
+
+ printf "%s\n" "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ printf "%s\n" "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=\$$ac_var
+ case $ac_val in
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ esac
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ printf "%s\n" "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+ echo
+ cat confdefs.h
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core core.conftest.* &&
+ rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+printf "%s\n" "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
+
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+if test -n "$CONFIG_SITE"; then
+ ac_site_files="$CONFIG_SITE"
+elif test "x$prefix" != xNONE; then
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
+else
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+fi
+
+for ac_site_file in $ac_site_files
+do
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file" \
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special files
+ # actually), so we avoid doing that. DJGPP emulates it as a regular file.
+ if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . "$cache_file";;
+ *) . "./$cache_file";;
+ esac
+ fi
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+# Test code for whether the C++ compiler supports C++98 (global declarations)
+ac_cxx_conftest_cxx98_globals='
+// Does the compiler advertise C++98 conformance?
+#if !defined __cplusplus || __cplusplus < 199711L
+# error "Compiler does not advertise C++98 conformance"
+#endif
+
+// These inclusions are to reject old compilers that
+// lack the unsuffixed header files.
+#include <cstdlib>
+#include <exception>
+
+// <cassert> and <cstring> are *not* freestanding headers in C++98.
+extern void assert (int);
+namespace std {
+ extern int strcmp (const char *, const char *);
+}
+
+// Namespaces, exceptions, and templates were all added after "C++ 2.0".
+using std::exception;
+using std::strcmp;
+
+namespace {
+
+void test_exception_syntax()
+{
+ try {
+ throw "test";
+ } catch (const char *s) {
+ // Extra parentheses suppress a warning when building autoconf itself,
+ // due to lint rules shared with more typical C programs.
+ assert (!(strcmp) (s, "test"));
+ }
+}
+
+template <typename T> struct test_template
+{
+ T const val;
+ explicit test_template(T t) : val(t) {}
+ template <typename U> T add(U u) { return static_cast<T>(u) + val; }
+};
+
+} // anonymous namespace
+'
+
+# Test code for whether the C++ compiler supports C++98 (body of main)
+ac_cxx_conftest_cxx98_main='
+ assert (argc);
+ assert (! argv[0]);
+{
+ test_exception_syntax ();
+ test_template<double> tt (2.0);
+ assert (tt.add (4) == 6.0);
+ assert (true && !false);
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (global declarations)
+ac_cxx_conftest_cxx11_globals='
+// Does the compiler advertise C++ 2011 conformance?
+#if !defined __cplusplus || __cplusplus < 201103L
+# error "Compiler does not advertise C++11 conformance"
+#endif
+
+namespace cxx11test
+{
+ constexpr int get_val() { return 20; }
+
+ struct testinit
+ {
+ int i;
+ double d;
+ };
+
+ class delegate
+ {
+ public:
+ delegate(int n) : n(n) {}
+ delegate(): delegate(2354) {}
+
+ virtual int getval() { return this->n; };
+ protected:
+ int n;
+ };
+
+ class overridden : public delegate
+ {
+ public:
+ overridden(int n): delegate(n) {}
+ virtual int getval() override final { return this->n * 2; }
+ };
+
+ class nocopy
+ {
+ public:
+ nocopy(int i): i(i) {}
+ nocopy() = default;
+ nocopy(const nocopy&) = delete;
+ nocopy & operator=(const nocopy&) = delete;
+ private:
+ int i;
+ };
+
+ // for testing lambda expressions
+ template <typename Ret, typename Fn> Ret eval(Fn f, Ret v)
+ {
+ return f(v);
+ }
+
+ // for testing variadic templates and trailing return types
+ template <typename V> auto sum(V first) -> V
+ {
+ return first;
+ }
+ template <typename V, typename... Args> auto sum(V first, Args... rest) -> V
+ {
+ return first + sum(rest...);
+ }
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (body of main)
+ac_cxx_conftest_cxx11_main='
+{
+ // Test auto and decltype
+ auto a1 = 6538;
+ auto a2 = 48573953.4;
+ auto a3 = "String literal";
+
+ int total = 0;
+ for (auto i = a3; *i; ++i) { total += *i; }
+
+ decltype(a2) a4 = 34895.034;
+}
+{
+ // Test constexpr
+ short sa[cxx11test::get_val()] = { 0 };
+}
+{
+ // Test initializer lists
+ cxx11test::testinit il = { 4323, 435234.23544 };
+}
+{
+ // Test range-based for
+ int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3,
+ 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
+ for (auto &x : array) { x += 23; }
+}
+{
+ // Test lambda expressions
+ using cxx11test::eval;
+ assert (eval ([](int x) { return x*2; }, 21) == 42);
+ double d = 2.0;
+ assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0);
+ assert (d == 5.0);
+ assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0);
+ assert (d == 5.0);
+}
+{
+ // Test use of variadic templates
+ using cxx11test::sum;
+ auto a = sum(1);
+ auto b = sum(1, 2);
+ auto c = sum(1.0, 2.0, 3.0);
+}
+{
+ // Test constructor delegation
+ cxx11test::delegate d1;
+ cxx11test::delegate d2();
+ cxx11test::delegate d3(45);
+}
+{
+ // Test override and final
+ cxx11test::overridden o1(55464);
+}
+{
+ // Test nullptr
+ char *c = nullptr;
+}
+{
+ // Test template brackets
+ test_template<::test_template<int>> v(test_template<int>(12));
+}
+{
+ // Unicode literals
+ char const *utf8 = u8"UTF-8 string \u2500";
+ char16_t const *utf16 = u"UTF-8 string \u2500";
+ char32_t const *utf32 = U"UTF-32 string \u2500";
+}
+'
+
+# Test code for whether the C compiler supports C++11 (complete).
+ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals}
+${ac_cxx_conftest_cxx11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ ${ac_cxx_conftest_cxx11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C++98 (complete).
+ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals}
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_cxx_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_cxx_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_cxx_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_cxx_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_cxx_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_cxx_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_cxx_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_cxx_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_cxx_list " unistd.h unistd_h HAVE_UNISTD_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="compile config.guess config.sub missing install-sh"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.."
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val=\$ac_cv_env_${ac_var}_value
+ eval ac_new_val=\$ac_env_${ac_var}_value
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ # differences in whitespace do not lead to failure.
+ ac_old_val_w=`echo x $ac_old_val`
+ ac_new_val_w=`echo x $ac_new_val`
+ if test "$ac_old_val_w" != "$ac_new_val_w"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ ac_cache_corrupted=:
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ eval $ac_var=\$ac_old_val
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
+printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
+ # Check whether --enable-maintainer-mode was given.
+if test ${enable_maintainer_mode+y}
+then :
+ enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
+else $as_nop
+ USE_MAINTAINER_MODE=no
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
+printf "%s\n" "$USE_MAINTAINER_MODE" >&6; }
+ if test $USE_MAINTAINER_MODE = yes; then
+ MAINTAINER_MODE_TRUE=
+ MAINTAINER_MODE_FALSE='#'
+else
+ MAINTAINER_MODE_TRUE='#'
+ MAINTAINER_MODE_FALSE=
+fi
+
+ MAINT=$MAINTAINER_MODE_TRUE
+
+
+am__api_version='1.16'
+
+
+
+ # Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in #((
+ ./ | /[cC]/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ rm -rf conftest.one conftest.two conftest.dir
+ echo one > conftest.one
+ echo two > conftest.two
+ mkdir conftest.dir
+ if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
+ test -s conftest.one && test -s conftest.two &&
+ test -s conftest.dir/conftest.one &&
+ test -s conftest.dir/conftest.two
+ then
+ ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+
+ done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+ if test ${ac_cv_path_install+y}; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ INSTALL=$ac_install_sh
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+printf %s "checking whether build environment is sane... " >&6; }
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name. Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+ *[\\\"\#\$\&\'\`$am_lf]*)
+ as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+ *[\\\"\#\$\&\'\`$am_lf\ \ ]*)
+ as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
+esac
+
+# Do 'set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ am_has_slept=no
+ for am_try in 1 2; do
+ echo "timestamp, slept: $am_has_slept" > conftest.file
+ set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t "$srcdir/configure" conftest.file`
+ fi
+ if test "$*" != "X $srcdir/configure conftest.file" \
+ && test "$*" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken
+ alias in your environment" "$LINENO" 5
+ fi
+ if test "$2" = conftest.file || test $am_try -eq 2; then
+ break
+ fi
+ # Just in case.
+ sleep 1
+ am_has_slept=yes
+ done
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+# If we didn't sleep, we still need to ensure time stamps of config.status and
+# generated files are strictly newer.
+am_sleep_pid=
+if grep 'slept: no' conftest.file >/dev/null 2>&1; then
+ ( sleep 1 ) &
+ am_sleep_pid=$!
+fi
+
+rm -f conftest.file
+
+test "$program_prefix" != NONE &&
+ program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"`
+
+
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
+
+
+ if test x"${MISSING+set}" != xset; then
+ MISSING="\${SHELL} '$am_aux_dir/missing'"
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --is-lightweight"; then
+ am_missing_run="$MISSING "
+else
+ am_missing_run=
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
+printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh+set}" != xset; then
+ case $am_aux_dir in
+ *\ * | *\ *)
+ install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+ *)
+ install_sh="\${SHELL} $am_aux_dir/install-sh"
+ esac
+fi
+
+# Installed binaries are usually stripped using 'strip' when the user
+# run "make install-strip". However 'strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the 'STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$STRIP"; then
+ ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+printf "%s\n" "$STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+ ac_ct_STRIP=$STRIP
+ # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_STRIP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_STRIP"; then
+ ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+printf "%s\n" "$ac_ct_STRIP" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_STRIP" = x; then
+ STRIP=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ STRIP=$ac_ct_STRIP
+ fi
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5
+printf %s "checking for a race-free mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+ if test ${ac_cv_path_mkdir+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in mkdir gmkdir; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue
+ case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #(
+ 'mkdir ('*'coreutils) '* | \
+ 'BusyBox '* | \
+ 'mkdir (fileutils) '4.1*)
+ ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext
+ break 3;;
+ esac
+ done
+ done
+ done
+IFS=$as_save_IFS
+
+fi
+
+ test -d ./--version && rmdir ./--version
+ if test ${ac_cv_path_mkdir+y}; then
+ MKDIR_P="$ac_cv_path_mkdir -p"
+ else
+ # As a last resort, use the slow shell script. Don't cache a
+ # value for MKDIR_P within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the value is a relative name.
+ MKDIR_P="$ac_install_sh -d"
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+printf "%s\n" "$MKDIR_P" >&6; }
+
+for ac_prog in gawk mawk nawk awk
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AWK+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$AWK"; then
+ ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+printf "%s\n" "$AWK" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$AWK" && break
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+ @echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+ *@@@%%%=?*=@@@%%%*)
+ eval ac_cv_prog_make_${ac_make}_set=yes;;
+ *)
+ eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ SET_MAKE=
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+# Check whether --enable-silent-rules was given.
+if test ${enable_silent_rules+y}
+then :
+ enableval=$enable_silent_rules;
+fi
+
+case $enable_silent_rules in # (((
+ yes) AM_DEFAULT_VERBOSITY=0;;
+ no) AM_DEFAULT_VERBOSITY=1;;
+ *) AM_DEFAULT_VERBOSITY=1;;
+esac
+am_make=${MAKE-make}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
+printf %s "checking whether $am_make supports nested variables... " >&6; }
+if test ${am_cv_make_support_nested_variables+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if printf "%s\n" 'TRUE=$(BAR$(V))
+BAR0=false
+BAR1=true
+V=1
+am__doit:
+ @$(TRUE)
+.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
+ am_cv_make_support_nested_variables=yes
+else
+ am_cv_make_support_nested_variables=no
+fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
+printf "%s\n" "$am_cv_make_support_nested_variables" >&6; }
+if test $am_cv_make_support_nested_variables = yes; then
+ AM_V='$(V)'
+ AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
+else
+ AM_V=$AM_DEFAULT_VERBOSITY
+ AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
+fi
+AM_BACKSLASH='\'
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+ # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+ # is not polluted with repeated "-I."
+ am__isrc=' -I$(srcdir)'
+ # test to see if srcdir already configured
+ if test -f $srcdir/config.status; then
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+ fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='asio'
+ VERSION='1.30.2'
+
+
+printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
+
+
+printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# For better backward compatibility. To be removed once Automake 1.9.x
+# dies out for good. For more background, see:
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
+# <https://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
+mkdir_p='$(MKDIR_P)'
+
+# We need awk for the "check" target (and possibly the TAP driver). The
+# system "awk" is bad on some platforms.
+# Always define AMTAR for backward compatibility. Yes, it's still used
+# in the wild :-( We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+
+# We'll loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar pax cpio none'
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to create a pax tar archive" >&5
+printf %s "checking how to create a pax tar archive... " >&6; }
+
+ # Go ahead even if we have the value already cached. We do so because we
+ # need to set the values for the 'am__tar' and 'am__untar' variables.
+ _am_tools=${am_cv_prog_tar_pax-$_am_tools}
+
+ for _am_tool in $_am_tools; do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar; do
+ { echo "$as_me:$LINENO: $_am_tar --version" >&5
+ ($_am_tar --version) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && break
+ done
+ am__tar="$_am_tar --format=posix -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=posix -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x pax -w "$$tardir"'
+ am__tar_='pax -L -x pax -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H pax -L'
+ am__tar_='find "$tardir" -print | cpio -o -H pax -L'
+ am__untar='cpio -i -H pax -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_pax}" && break
+
+ # tar/untar a dummy directory, and stop if the command works.
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5
+ (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ { echo "$as_me:$LINENO: $am__untar <conftest.tar" >&5
+ ($am__untar <conftest.tar) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ { echo "$as_me:$LINENO: cat conftest.dir/file" >&5
+ (cat conftest.dir/file) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+ done
+ rm -rf conftest.dir
+
+ if test ${am_cv_prog_tar_pax+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ am_cv_prog_tar_pax=$_am_tool
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_pax" >&5
+printf "%s\n" "$am_cv_prog_tar_pax" >&6; }
+
+
+
+
+
+# Variables for tags utilities; see am/tags.am
+if test -z "$CTAGS"; then
+ CTAGS=ctags
+fi
+
+if test -z "$ETAGS"; then
+ ETAGS=etags
+fi
+
+if test -z "$CSCOPE"; then
+ CSCOPE=cscope
+fi
+
+
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <https://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
+test "x$ac_build_alias" = x &&
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$host_alias" = x; then
+ ac_cv_host=$ac_cv_build
+else
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+
+
+
+
+
+
+
+
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5
+printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; }
+cat > confinc.mk << 'END'
+am__doit:
+ @echo this is the am__doit target >confinc.out
+.PHONY: am__doit
+END
+am__include="#"
+am__quote=
+# BSD make does it like this.
+echo '.include "confinc.mk" # ignored' > confmf.BSD
+# Other make implementations (GNU, Solaris 10, AIX) do it like this.
+echo 'include confinc.mk # ignored' > confmf.GNU
+_am_result=no
+for s in GNU BSD; do
+ { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5
+ (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ case $?:`cat confinc.out 2>/dev/null` in #(
+ '0:this is the am__doit target') :
+ case $s in #(
+ BSD) :
+ am__include='.include' am__quote='"' ;; #(
+ *) :
+ am__include='include' am__quote='' ;;
+esac ;; #(
+ *) :
+ ;;
+esac
+ if test "$am__include" != "#"; then
+ _am_result="yes ($s style)"
+ break
+ fi
+done
+rm -f confinc.* confmf.*
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5
+printf "%s\n" "${_am_result}" >&6; }
+
+# Check whether --enable-dependency-tracking was given.
+if test ${enable_dependency_tracking+y}
+then :
+ enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+ am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ fi
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl.exe
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl.exe
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CC" && break
+done
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion -version; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+ esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link_default") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile. We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
+ then :; else
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ fi
+ # We set ac_cv_exeext here because the later test for it is not
+ # safe: cross compilers may not add the suffix if given an `-o'
+ # argument, so we may need to know it at that point already.
+ # Even if this section looks crufty: it has the advantage of
+ # actually working.
+ break;;
+ * )
+ break;;
+ esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else $as_nop
+ ac_file=''
+fi
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ break;;
+ * ) break;;
+ esac
+done
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <stdio.h>
+int
+main (void)
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+ { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+ if { ac_try='./conftest$ac_cv_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
+ for ac_file in conftest.o conftest.obj conftest.*; do
+ test -f "$ac_file" || continue;
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+y}
+ac_save_CFLAGS=$CFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_c_werror_flag=$ac_c_werror_flag
+ ac_c_werror_flag=yes
+ ac_cv_prog_cc_g=no
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+else $as_nop
+ CFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_c_werror_flag=$ac_save_c_werror_flag
+ CFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
+
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+printf %s "checking whether $CC understands -c and -o together... " >&6; }
+if test ${am_cv_prog_cc_c_o+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+printf "%s\n" "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+depcc="$CC" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CC_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CC_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CC_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+ am__fastdepCC_TRUE=
+ am__fastdepCC_FALSE='#'
+else
+ am__fastdepCC_TRUE='#'
+ am__fastdepCC_FALSE=
+fi
+
+
+
+
+
+
+
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+ if test -n "$CCC"; then
+ CXX=$CCC
+ else
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+ test -n "$ac_ct_CXX" && break
+done
+
+ if test "x$ac_ct_CXX" = x; then
+ CXX="g++"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CXX=$ac_ct_CXX
+ fi
+fi
+
+ fi
+fi
+# Provide some information about the compiler.
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+ { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ sed '10a\
+... rest of stderr output deleted ...
+ 10q' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ fi
+ rm -f conftest.er1 conftest.err
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+done
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_compiler_gnu=yes
+else $as_nop
+ ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+if test $ac_compiler_gnu = yes; then
+ GXX=yes
+else
+ GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+y}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+ ac_cxx_werror_flag=yes
+ ac_cv_prog_cxx_g=no
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+else $as_nop
+ CXXFLAGS=""
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+
+else $as_nop
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="-g"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_11=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx11_program
+_ACEOF
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
+ ac_prog_cxx_stdcxx=cxx11
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_98+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_98=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx98_program
+_ACEOF
+for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx98=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
+ ac_prog_cxx_stdcxx=cxx98
+fi
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+printf %s "checking dependency style of $depcc... " >&6; }
+if test ${am_cv_CXX_dependencies_compiler_type+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+ ac_ct_RANLIB=$RANLIB
+ # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_RANLIB"; then
+ ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_RANLIB" = x; then
+ RANLIB=":"
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ RANLIB=$ac_ct_RANLIB
+ fi
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+
+
+
+# Check whether --with-pkgconfigdir was given.
+if test ${with_pkgconfigdir+y}
+then :
+ withval=$with_pkgconfigdir;
+else $as_nop
+ with_pkgconfigdir='${libdir}/pkgconfig'
+fi
+
+pkgconfigdir=$with_pkgconfigdir
+
+
+
+
+
+
+printf "%s\n" "#define _REENTRANT 1" >>confdefs.h
+
+
+
+# Check whether --with-boost was given.
+if test ${with_boost+y}
+then :
+ withval=$with_boost;
+ if test "${withval}" = no; then
+ STANDALONE="yes"
+ else
+ if test "${withval}" != system; then
+ CPPFLAGS="$CPPFLAGS -I${withval}"
+ LIBS="$LIBS -L${withval}/stage/lib"
+ fi
+ CPPFLAGS="$CPPFLAGS -DASIO_ENABLE_BOOST -DBOOST_CHRONO_HEADER_ONLY -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING"
+ fi
+
+else $as_nop
+
+ STANDALONE="yes"
+
+fi
+
+
+# Check whether --enable-separate-compilation was given.
+if test ${enable_separate_compilation+y}
+then :
+ enableval=$enable_separate_compilation;
+ SEPARATE_COMPILATION=yes
+
+fi
+
+
+# Check whether --enable-boost-coroutine was given.
+if test ${enable_boost_coroutine+y}
+then :
+ enableval=$enable_boost_coroutine;
+ HAVE_BOOST_COROUTINE=yes
+
+fi
+
+
+if test "$STANDALONE" != yes; then
+
+ac_header= ac_cache=
+for ac_item in $ac_header_cxx_list
+do
+ if test $ac_cache; then
+ ac_fn_cxx_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
+ fi
+done
+
+
+
+
+
+
+
+
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
+
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+ac_fn_cxx_check_header_compile "$LINENO" "boost/noncopyable.hpp" "ac_cv_header_boost_noncopyable_hpp" "$ac_includes_default"
+if test "x$ac_cv_header_boost_noncopyable_hpp" = xyes
+then :
+
+else $as_nop
+
+ echo "Can't find boost headers. Please check the location of the boost"
+ echo "distribution and rerun configure using the --with-boost=DIR option."
+ echo "Alternatively, run with --without-boost to enable standalone build."
+ exit 1
+
+fi
+
+fi
+
+
+# Check whether --with-openssl was given.
+if test ${with_openssl+y}
+then :
+ withval=$with_openssl;
+ CPPFLAGS="$CPPFLAGS -I${withval}/include"
+ LIBS="$LIBS -L${withval}/lib"
+
+fi
+
+
+ac_fn_cxx_check_header_compile "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default"
+if test "x$ac_cv_header_openssl_ssl_h" = xyes
+then :
+
+else $as_nop
+
+ OPENSSL_FOUND=no
+
+fi
+
+
+if test x$OPENSSL_FOUND != xno; then
+ LIBS="$LIBS -lssl -lcrypto"
+fi
+
+ if test x$OPENSSL_FOUND != xno; then
+ HAVE_OPENSSL_TRUE=
+ HAVE_OPENSSL_FALSE='#'
+else
+ HAVE_OPENSSL_TRUE='#'
+ HAVE_OPENSSL_FALSE=
+fi
+
+
+WINDOWS=no
+case $host in
+ *-*-linux*)
+ CXXFLAGS="$CXXFLAGS -pthread"
+ LDFLAGS="$LDFLAGS -pthread"
+ LIBS="$LIBS -lrt"
+ ;;
+ *-*-solaris*)
+ if test "$GXX" = yes; then
+ CXXFLAGS="$CXXFLAGS -D_PTHREADS"
+ else
+ # We'll assume Sun's CC.
+ CXXFLAGS="$CXXFLAGS -mt"
+ fi
+ LIBS="$LIBS -lsocket -lnsl -lpthread"
+ ;;
+ *-*-mingw32*)
+ CXXFLAGS="$CXXFLAGS -mthreads"
+ LDFLAGS="$LDFLAGS -mthreads"
+ LIBS="$LIBS -lws2_32 -lmswsock"
+ WINDOWS=yes
+ ;;
+ *-*-mingw64*)
+ CXXFLAGS="$CXXFLAGS -mthreads"
+ LDFLAGS="$LDFLAGS -mthreads"
+ LIBS="$LIBS -lws2_32 -lmswsock"
+ WINDOWS=yes
+ ;;
+ *-pc-cygwin*)
+ CXXFLAGS="$CXXFLAGS -D__USE_W32_SOCKETS -D_WIN32_WINNT=0x0601"
+ LIBS="$LIBS -lws2_32 -lmswsock"
+ WINDOWS=yes
+ ;;
+ *-apple-darwin*)
+ CXXFLAGS="$CXXFLAGS"
+ LDFLAGS="$LDFLAGS"
+ ;;
+ *-*-freebsd*)
+ CXXFLAGS="$CXXFLAGS -pthread"
+ LDFLAGS="$LDFLAGS -pthread"
+ ;;
+ *-*-netbsd*)
+ CXXFLAGS="$CXXFLAGS -pthread"
+ LDFLAGS="$LDFLAGS -pthread"
+ ;;
+ *-*-haiku*)
+ CXXFLAGS="$CXXFLAGS -lnetwork"
+ LDFLAGS="$LDFLAGS -lnetwork"
+
+esac
+
+if test "$GXX" = yes; then
+ CXXFLAGS="$CXXFLAGS -ftemplate-depth-256"
+fi
+
+if test "$STANDALONE" = yes; then
+ CPPFLAGS="$CPPFLAGS -DASIO_STANDALONE"
+fi
+
+if test "$SEPARATE_COMPILATION" = yes; then
+ CPPFLAGS="$CPPFLAGS -DASIO_SEPARATE_COMPILATION"
+fi
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++11 is enabled" >&5
+printf %s "checking whether C++11 is enabled... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if __cplusplus < 201103L
+ #error C++11 not available
+ #endif
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ HAVE_CXX11=yes;
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ HAVE_CXX11=no;
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++14 is enabled" >&5
+printf %s "checking whether C++14 is enabled... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined(__GNUC__) && !defined(__clang__)
+ # if (__GNUC__ <= 6)
+ # error C++14 support on this compiler not sufficiently compliant
+ # endif
+ #endif
+ #if __cplusplus < 201402L
+ #error C++14 not available
+ #endif
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ HAVE_CXX14=yes;
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ HAVE_CXX14=no;
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++17 is enabled" >&5
+printf %s "checking whether C++17 is enabled... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if __cplusplus < 201703L
+ #error C++17 not available
+ #endif
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ HAVE_CXX17=yes;
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ HAVE_CXX17=no;
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++20 is enabled" >&5
+printf %s "checking whether C++20 is enabled... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if __cplusplus < 202002L
+ #error C++20 not available
+ #endif
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ HAVE_CXX20=yes;
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ HAVE_CXX20=no;
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether coroutines are enabled" >&5
+printf %s "checking whether coroutines are enabled... " >&6; }
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#if defined(__clang__)
+ # if (__clang_major__ >= 14)
+ # if (__cplusplus >= 202002) && (__cpp_impl_coroutine >= 201902)
+ # if __has_include(<coroutine>)
+ # define ASIO_HAS_CO_AWAIT 1
+ # endif
+ # elif (__cplusplus >= 201703) && (__cpp_coroutines >= 201703)
+ # if __has_include(<experimental/coroutine>)
+ # define ASIO_HAS_CO_AWAIT 1
+ # endif
+ # endif
+ # else
+ # if (__cplusplus >= 201703) && (__cpp_coroutines >= 201703)
+ # if __has_include(<experimental/coroutine>)
+ # define ASIO_HAS_CO_AWAIT 1
+ # endif
+ # endif
+ # endif
+ #elif defined(__GNUC__)
+ # if (__cplusplus >= 201709) && (__cpp_impl_coroutine >= 201902)
+ # if __has_include(<coroutine>)
+ # define ASIO_HAS_CO_AWAIT 1
+ # endif
+ # endif
+ #endif
+ #ifndef ASIO_HAS_CO_AWAIT
+ # error coroutines not available
+ #endif
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ HAVE_COROUTINES=yes;
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ HAVE_COROUTINES=no;
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+if test "$GXX" = yes; then
+ if test "$STANDALONE" = yes; then
+ if test "$HAVE_CXX11" = no; then
+ HAVE_CXX11=yes
+ CPPFLAGS="-std=c++0x $CPPFLAGS"
+ fi
+ fi
+fi
+
+ if test x$STANDALONE = xyes; then
+ STANDALONE_TRUE=
+ STANDALONE_FALSE='#'
+else
+ STANDALONE_TRUE='#'
+ STANDALONE_FALSE=
+fi
+
+
+ if test x$SEPARATE_COMPILATION = xyes; then
+ SEPARATE_COMPILATION_TRUE=
+ SEPARATE_COMPILATION_FALSE='#'
+else
+ SEPARATE_COMPILATION_TRUE='#'
+ SEPARATE_COMPILATION_FALSE=
+fi
+
+
+ if test x$HAVE_BOOST_COROUTINE = xyes; then
+ HAVE_BOOST_COROUTINE_TRUE=
+ HAVE_BOOST_COROUTINE_FALSE='#'
+else
+ HAVE_BOOST_COROUTINE_TRUE='#'
+ HAVE_BOOST_COROUTINE_FALSE=
+fi
+
+
+ if test x$WINDOWS != xno; then
+ WINDOWS_TARGET_TRUE=
+ WINDOWS_TARGET_FALSE='#'
+else
+ WINDOWS_TARGET_TRUE='#'
+ WINDOWS_TARGET_FALSE=
+fi
+
+
+ if test x$HAVE_CXX11 = xyes; then
+ HAVE_CXX11_TRUE=
+ HAVE_CXX11_FALSE='#'
+else
+ HAVE_CXX11_TRUE='#'
+ HAVE_CXX11_FALSE=
+fi
+
+
+ if test x$HAVE_CXX14 = xyes; then
+ HAVE_CXX14_TRUE=
+ HAVE_CXX14_FALSE='#'
+else
+ HAVE_CXX14_TRUE='#'
+ HAVE_CXX14_FALSE=
+fi
+
+
+ if test x$HAVE_CXX17 = xyes; then
+ HAVE_CXX17_TRUE=
+ HAVE_CXX17_FALSE='#'
+else
+ HAVE_CXX17_TRUE='#'
+ HAVE_CXX17_FALSE=
+fi
+
+
+ if test x$HAVE_CXX20 = xyes; then
+ HAVE_CXX20_TRUE=
+ HAVE_CXX20_FALSE='#'
+else
+ HAVE_CXX20_TRUE='#'
+ HAVE_CXX20_FALSE=
+fi
+
+
+ if test x$HAVE_COROUTINES = xyes; then
+ HAVE_COROUTINES_TRUE=
+ HAVE_COROUTINES_FALSE='#'
+else
+ HAVE_COROUTINES_TRUE='#'
+ HAVE_COROUTINES_FALSE=
+fi
+
+
+ac_config_files="$ac_config_files asio.pc"
+
+
+ac_config_files="$ac_config_files Makefile include/Makefile src/Makefile src/tests/Makefile src/tests/properties/Makefile src/examples/cpp11/Makefile src/examples/cpp14/Makefile src/examples/cpp17/Makefile src/examples/cpp20/Makefile"
+
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+ for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+ eval ac_val=\$$ac_var
+ case $ac_val in #(
+ *${as_nl}*)
+ case $ac_var in #(
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ esac
+ case $ac_var in #(
+ _ | IFS | as_nl) ;; #(
+ BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+ *) { eval $ac_var=; unset $ac_var;} ;;
+ esac ;;
+ esac
+ done
+
+ (set) 2>&1 |
+ case $as_nl`(ac_space=' '; set) 2>&1` in #(
+ *${as_nl}ac_space=\ *)
+ # `set' does not quote correctly, so add quotes: double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \.
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;; #(
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+ ;;
+ esac |
+ sort
+) |
+ sed '
+ /^ac_cv_env_/b end
+ t clear
+ :clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
+ t end
+ s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+ if test -w "$cache_file"; then
+ if test "x$cache_file" != "x/dev/null"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
+ if test ! -f "$cache_file" || test -h "$cache_file"; then
+ cat confcache >"$cache_file"
+ else
+ case $cache_file in #(
+ */* | ?:*)
+ mv -f confcache "$cache_file"$$ &&
+ mv -f "$cache_file"$$ "$cache_file" ;; #(
+ *)
+ mv -f confcache "$cache_file" ;;
+ esac
+ fi
+ fi
+ else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then branch to the quote section. Otherwise,
+# look for a macro that doesn't take arguments.
+ac_script='
+:mline
+/\\$/{
+ N
+ s,\\\n,,
+ b mline
+}
+t clear
+:clear
+s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g
+t quote
+b any
+:quote
+s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g
+s/\[/\\&/g
+s/\]/\\&/g
+s/\$/$$/g
+H
+:any
+${
+ g
+ s/^\n//
+ s/\n/ /g
+ p
+}
+'
+DEFS=`sed -n "$ac_script" confdefs.h`
+
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
+ # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
+ # will be set to the directory where LIBOBJS objects are built.
+ as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+ as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
+ as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
+printf %s "checking that generated files are newer than configure... " >&6; }
+ if test -n "$am_sleep_pid"; then
+ # Hide warnings about reused PIDs.
+ wait $am_sleep_pid 2>/dev/null
+ fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5
+printf "%s\n" "done" >&6; }
+ if test -n "$EXEEXT"; then
+ am__EXEEXT_TRUE=
+ am__EXEEXT_FALSE='#'
+else
+ am__EXEEXT_TRUE='#'
+ am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_OPENSSL_TRUE}" && test -z "${HAVE_OPENSSL_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_OPENSSL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${STANDALONE_TRUE}" && test -z "${STANDALONE_FALSE}"; then
+ as_fn_error $? "conditional \"STANDALONE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${SEPARATE_COMPILATION_TRUE}" && test -z "${SEPARATE_COMPILATION_FALSE}"; then
+ as_fn_error $? "conditional \"SEPARATE_COMPILATION\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_BOOST_COROUTINE_TRUE}" && test -z "${HAVE_BOOST_COROUTINE_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_BOOST_COROUTINE\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WINDOWS_TARGET_TRUE}" && test -z "${WINDOWS_TARGET_FALSE}"; then
+ as_fn_error $? "conditional \"WINDOWS_TARGET\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_CXX11_TRUE}" && test -z "${HAVE_CXX11_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_CXX11\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_CXX14_TRUE}" && test -z "${HAVE_CXX14_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_CXX14\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_CXX17_TRUE}" && test -z "${HAVE_CXX17_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_CXX17\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_CXX20_TRUE}" && test -z "${HAVE_CXX20_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_CXX20\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_COROUTINES_TRUE}" && test -z "${HAVE_COROUTINES_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_COROUTINES\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
+ emulate sh
+ NULLCMD=:
+ # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+ setopt NO_GLOB_SUBST
+else $as_nop
+ case `(set -o) 2>/dev/null` in #(
+ *posix*) :
+ set -o posix ;; #(
+ *) :
+ ;;
+esac
+fi
+
+
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
+as_nl='
+'
+export as_nl
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
+
+# The user is always right.
+if ${PATH_SEPARATOR+false} :; then
+ PATH_SEPARATOR=:
+ (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+ (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+ PATH_SEPARATOR=';'
+ }
+fi
+
+
+# Find who we are. Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
+ done
+IFS=$as_save_IFS
+
+ ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+ as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ exit 1
+fi
+
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+ as_status=$1; test $as_status -eq 0 && as_status=1
+ if test "$4"; then
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ fi
+ printf "%s\n" "$as_me: error: $2" >&2
+ as_fn_exit $as_status
+} # as_fn_error
+
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+ { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
+ eval 'as_fn_append ()
+ {
+ eval $1+=\$2
+ }'
+else $as_nop
+ as_fn_append ()
+ {
+ eval $1=\$$1\$2
+ }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
+ eval 'as_fn_arith ()
+ {
+ as_val=$(( $* ))
+ }'
+else $as_nop
+ as_fn_arith ()
+ {
+ as_val=`expr "$@" || test $? -eq 1`
+ }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+ as_dirname=dirname
+else
+ as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+ case `echo 'xy\c'` in
+ *c*) ECHO_T=' ';; # ECHO_T is single tab character.
+ xy) ECHO_C='\c';;
+ *) echo `echo ksh88 bug on AIX 6.1` > /dev/null
+ ECHO_T=' ';;
+ esac;;
+*)
+ ECHO_N='-n';;
+esac
+
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+ rm -f conf$$.dir/conf$$.file
+else
+ rm -f conf$$.dir
+ mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+ if ln -s conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s='ln -s'
+ # ... but there are two gotchas:
+ # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+ # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+ # In both cases, we have to default to `cp -pR'.
+ ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+ as_ln_s='cp -pR'
+ elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+ else
+ as_ln_s='cp -pR'
+ fi
+else
+ as_ln_s='cp -pR'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+ case $as_dir in #(
+ -*) as_dir=./$as_dir;;
+ esac
+ test -d "$as_dir" || eval $as_mkdir_p || {
+ as_dirs=
+ while :; do
+ case $as_dir in #(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *) as_qdir=$as_dir;;
+ esac
+ as_dirs="'$as_qdir' $as_dirs"
+ as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ test -d "$as_dir" && break
+ done
+ test -z "$as_dirs" || eval "mkdir $as_dirs"
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p='mkdir -p "$as_dir"'
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+
+# as_fn_executable_p FILE
+# -----------------------
+# Test if FILE is an executable regular file.
+as_fn_executable_p ()
+{
+ test -f "$1" && test -x "$1"
+} # as_fn_executable_p
+as_test_x='test -x'
+as_executable_p=as_fn_executable_p
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by asio $as_me 1.30.2, which was
+generated by GNU Autoconf 2.71. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration. Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number and configuration settings, then exit
+ --config print configuration, then exit
+ -q, --quiet, --silent
+ do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Configuration commands:
+$config_commands
+
+Report bugs to the package provider."
+
+_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config='$ac_cs_config_escaped'
+ac_cs_version="\\
+asio config.status 1.30.2
+configured by $0, generated by GNU Autoconf 2.71,
+ with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2021 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=?*)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ --*=)
+ ac_option=`expr "X$1" : 'X\([^=]*\)='`
+ ac_optarg=
+ ac_shift=:
+ ;;
+ *)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+ printf "%s\n" "$ac_cs_version"; exit ;;
+ --config | --confi | --conf | --con | --co | --c )
+ printf "%s\n" "$ac_cs_config"; exit ;;
+ --debug | --debu | --deb | --de | --d | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ case $ac_optarg in
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ '') as_fn_error $? "missing file argument" ;;
+ esac
+ as_fn_append CONFIG_FILES " '$ac_optarg'"
+ ac_need_defaults=false;;
+ --he | --h | --help | --hel | -h )
+ printf "%s\n" "$ac_cs_usage"; exit ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+ *) as_fn_append ac_config_targets " $1"
+ ac_need_defaults=false ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+ set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+ shift
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
+ CONFIG_SHELL='$SHELL'
+ export CONFIG_SHELL
+ exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+ printf "%s\n" "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+ case $ac_config_target in
+ "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "asio.pc") CONFIG_FILES="$CONFIG_FILES asio.pc" ;;
+ "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;;
+ "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+ "src/tests/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/Makefile" ;;
+ "src/tests/properties/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/properties/Makefile" ;;
+ "src/examples/cpp11/Makefile") CONFIG_FILES="$CONFIG_FILES src/examples/cpp11/Makefile" ;;
+ "src/examples/cpp14/Makefile") CONFIG_FILES="$CONFIG_FILES src/examples/cpp14/Makefile" ;;
+ "src/examples/cpp17/Makefile") CONFIG_FILES="$CONFIG_FILES src/examples/cpp17/Makefile" ;;
+ "src/examples/cpp20/Makefile") CONFIG_FILES="$CONFIG_FILES src/examples/cpp20/Makefile" ;;
+
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+ esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+ tmp= ac_tmp=
+ trap 'exit_status=$?
+ : "${ac_tmp:=$tmp}"
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+ trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+ test -d "$tmp"
+} ||
+{
+ tmp=./conf$$-$RANDOM
+ (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+ eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+ ac_cs_awk_cr='\\r'
+else
+ ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+ echo "cat >conf$$subs.awk <<_ACEOF" &&
+ echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+ echo "_ACEOF"
+} >conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+ . ./conf$$subs.sh ||
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+ ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+ if test $ac_delim_n = $ac_delim_num; then
+ break
+ elif $ac_last_try; then
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ else
+ ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+ fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+ N
+ s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+ for (key in S) S_is_set[key] = 1
+ FS = ""
+
+}
+{
+ line = $ 0
+ nfields = split(line, field, "@")
+ substed = 0
+ len = length(field[1])
+ for (i = 2; i < nfields; i++) {
+ key = field[i]
+ keylen = length(key)
+ if (S_is_set[key]) {
+ value = S[key]
+ line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+ len += length(value) + length(field[++i])
+ substed = 1
+ } else
+ len += 1 + keylen
+ }
+
+ print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+ sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+ cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{
+h
+s///
+s/^/:/
+s/[ ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[ ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[ ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+
+eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+ case $ac_tag in
+ :[FHLC]) ac_mode=$ac_tag; continue;;
+ esac
+ case $ac_mode$ac_tag in
+ :[FHL]*:*);;
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+ :[FH]-) ac_tag=-:-;;
+ :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+ esac
+ ac_save_IFS=$IFS
+ IFS=:
+ set x $ac_tag
+ IFS=$ac_save_IFS
+ shift
+ ac_file=$1
+ shift
+
+ case $ac_mode in
+ :L) ac_source=$1;;
+ :[FH])
+ ac_file_inputs=
+ for ac_f
+ do
+ case $ac_f in
+ -) ac_f="$ac_tmp/stdin";;
+ *) # Look for the file first in the build tree, then in the source tree
+ # (if the path is not absolute). The absolute path cannot be DOS-style,
+ # because $ac_f cannot contain `:'.
+ test -f "$ac_f" ||
+ case $ac_f in
+ [\\/$]*) false;;
+ *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+ esac ||
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+ esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ as_fn_append ac_file_inputs " '$ac_f'"
+ done
+
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ configure_input='Generated from '`
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ `' by configure.'
+ if test x"$ac_file" != x-; then
+ configure_input="$ac_file. $configure_input"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
+ fi
+ # Neutralize special characters interpreted by sed in replacement strings.
+ case $configure_input in #(
+ *\&* | *\|* | *\\* )
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
+ sed 's/[\\\\&|]/\\\\&/g'`;; #(
+ *) ac_sed_conf_input=$configure_input;;
+ esac
+
+ case $ac_tag in
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+ esac
+ ;;
+ esac
+
+ ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ as_dir="$ac_dir"; as_fn_mkdir_p
+ ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
+ # A ".." for each directory in $ac_dir_suffix.
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ case $ac_top_builddir_sub in
+ "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+ *) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+ esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+ .) # We are building in place.
+ ac_srcdir=.
+ ac_top_srcdir=$ac_top_builddir_sub
+ ac_abs_top_srcdir=$ac_pwd ;;
+ [\\/]* | ?:[\\/]* ) # Absolute name.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir
+ ac_abs_top_srcdir=$srcdir ;;
+ *) # Relative name.
+ ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_build_prefix$srcdir
+ ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+ case $ac_mode in
+ :F)
+ #
+ # CONFIG_FILE
+ #
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+ esac
+ ac_MKDIR_P=$MKDIR_P
+ case $MKDIR_P in
+ [\\/$]* | ?:[\\/]* ) ;;
+ */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+ esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+ p
+ q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ ac_datarootdir_hack='
+ s&@datadir@&$datadir&g
+ s&@docdir@&$docdir&g
+ s&@infodir@&$infodir&g
+ s&@localedir@&$localedir&g
+ s&@mandir@&$mandir&g
+ s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
+ "$ac_tmp/out"`; test -z "$ac_out"; } &&
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined. Please make sure it is defined" >&2;}
+
+ rm -f "$ac_tmp/stdin"
+ case $ac_file in
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+ esac \
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+
+
+ :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+printf "%s\n" "$as_me: executing $ac_file commands" >&6;}
+ ;;
+ esac
+
+
+ case $ac_file$ac_mode in
+ "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+ # Older Autoconf quotes --file arguments for eval, but not when files
+ # are listed without --file. Let's play safe and only enable the eval
+ # if we detect the quoting.
+ # TODO: see whether this extra hack can be removed once we start
+ # requiring Autoconf 2.70 or later.
+ case $CONFIG_FILES in #(
+ *\'*) :
+ eval set x "$CONFIG_FILES" ;; #(
+ *) :
+ set x $CONFIG_FILES ;; #(
+ *) :
+ ;;
+esac
+ shift
+ # Used to flag and report bootstrapping failures.
+ am_rc=0
+ for am_mf
+ do
+ # Strip MF so we end up with the name of the file.
+ am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile which includes
+ # dependency-tracking related rules and includes.
+ # Grep'ing the whole file directly is not great: AIX grep has a line
+ # limit of 2048, but all sed's we know have understand at least 4000.
+ sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \
+ || continue
+ am_dirpart=`$as_dirname -- "$am_mf" ||
+$as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$am_mf" : 'X\(//\)[^/]' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X"$am_mf" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ am_filepart=`$as_basename -- "$am_mf" ||
+$as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$am_mf" : 'X\(//\)$' \| \
+ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null ||
+printf "%s\n" X/"$am_mf" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+ { echo "$as_me:$LINENO: cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles" >&5
+ (cd "$am_dirpart" \
+ && sed -e '/# am--include-marker/d' "$am_filepart" \
+ | $MAKE -f - am--depfiles) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } || am_rc=$?
+ done
+ if test $am_rc -ne 0; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "Something went wrong bootstrapping makefile fragments
+ for automatic dependency tracking. If GNU make was not used, consider
+ re-running the configure script with MAKE=\"gmake\" (or whatever is
+ necessary). You can also try re-running configure with the
+ '--disable-dependency-tracking' option to at least be able to build
+ the package (albeit without support for automatic dependency tracking).
+See \`config.log' for more details" "$LINENO" 5; }
+ fi
+ { am_dirpart=; unset am_dirpart;}
+ { am_filepart=; unset am_filepart;}
+ { am_mf=; unset am_mf;}
+ { am_rc=; unset am_rc;}
+ rm -f conftest-deps.mk
+}
+ ;;
+
+ esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
+
diff --git a/3rdparty/asio/configure.ac b/3rdparty/asio/configure.ac
new file mode 100644
index 00000000000..15e470fd1a4
--- /dev/null
+++ b/3rdparty/asio/configure.ac
@@ -0,0 +1,258 @@
+AC_INIT(asio, [1.30.2])
+AC_CONFIG_SRCDIR(include/asio.hpp)
+AM_MAINTAINER_MODE
+AM_INIT_AUTOMAKE([tar-pax])
+
+AC_CANONICAL_HOST
+AM_PROG_CC_C_O
+AC_PROG_CXX
+AC_LANG(C++)
+AC_PROG_RANLIB
+PKG_INSTALLDIR
+
+AC_DEFINE(_REENTRANT, [1], [Define this])
+
+AC_ARG_WITH(boost,
+ AC_HELP_STRING([--with-boost=DIR],[location of boost distribution]),
+[
+ if test "${withval}" = no; then
+ STANDALONE="yes"
+ else
+ if test "${withval}" != system; then
+ CPPFLAGS="$CPPFLAGS -I${withval}"
+ LIBS="$LIBS -L${withval}/stage/lib"
+ fi
+ CPPFLAGS="$CPPFLAGS -DASIO_ENABLE_BOOST -DBOOST_CHRONO_HEADER_ONLY -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING"
+ fi
+],
+[
+ STANDALONE="yes"
+])
+
+AC_ARG_ENABLE(separate-compilation,
+[ --enable-separate-compilation separate compilation of asio source],
+[
+ SEPARATE_COMPILATION=yes
+])
+
+AC_ARG_ENABLE(boost-coroutine,
+[ --enable-boost-coroutine use Boost.Coroutine to implement stackful coroutines],
+[
+ HAVE_BOOST_COROUTINE=yes
+])
+
+if test "$STANDALONE" != yes; then
+ AC_CHECK_HEADER([boost/noncopyable.hpp],,
+ [
+ echo "Can't find boost headers. Please check the location of the boost"
+ echo "distribution and rerun configure using the --with-boost=DIR option."
+ echo "Alternatively, run with --without-boost to enable standalone build."
+ exit 1
+ ],[])
+fi
+
+AC_ARG_WITH(openssl,
+ AC_HELP_STRING([--with-openssl=DIR],[location of openssl]),
+[
+ CPPFLAGS="$CPPFLAGS -I${withval}/include"
+ LIBS="$LIBS -L${withval}/lib"
+],[])
+
+AC_CHECK_HEADER([openssl/ssl.h],,
+[
+ OPENSSL_FOUND=no
+],[])
+
+if test x$OPENSSL_FOUND != xno; then
+ LIBS="$LIBS -lssl -lcrypto"
+fi
+
+AM_CONDITIONAL(HAVE_OPENSSL,test x$OPENSSL_FOUND != xno)
+
+WINDOWS=no
+case $host in
+ *-*-linux*)
+ CXXFLAGS="$CXXFLAGS -pthread"
+ LDFLAGS="$LDFLAGS -pthread"
+ LIBS="$LIBS -lrt"
+ ;;
+ *-*-solaris*)
+ if test "$GXX" = yes; then
+ CXXFLAGS="$CXXFLAGS -D_PTHREADS"
+ else
+ # We'll assume Sun's CC.
+ CXXFLAGS="$CXXFLAGS -mt"
+ fi
+ LIBS="$LIBS -lsocket -lnsl -lpthread"
+ ;;
+ *-*-mingw32*)
+ CXXFLAGS="$CXXFLAGS -mthreads"
+ LDFLAGS="$LDFLAGS -mthreads"
+ LIBS="$LIBS -lws2_32 -lmswsock"
+ WINDOWS=yes
+ ;;
+ *-*-mingw64*)
+ CXXFLAGS="$CXXFLAGS -mthreads"
+ LDFLAGS="$LDFLAGS -mthreads"
+ LIBS="$LIBS -lws2_32 -lmswsock"
+ WINDOWS=yes
+ ;;
+ *-pc-cygwin*)
+ CXXFLAGS="$CXXFLAGS -D__USE_W32_SOCKETS -D_WIN32_WINNT=0x0601"
+ LIBS="$LIBS -lws2_32 -lmswsock"
+ WINDOWS=yes
+ ;;
+ *-apple-darwin*)
+ CXXFLAGS="$CXXFLAGS"
+ LDFLAGS="$LDFLAGS"
+ ;;
+ *-*-freebsd*)
+ CXXFLAGS="$CXXFLAGS -pthread"
+ LDFLAGS="$LDFLAGS -pthread"
+ ;;
+ *-*-netbsd*)
+ CXXFLAGS="$CXXFLAGS -pthread"
+ LDFLAGS="$LDFLAGS -pthread"
+ ;;
+ *-*-haiku*)
+ CXXFLAGS="$CXXFLAGS -lnetwork"
+ LDFLAGS="$LDFLAGS -lnetwork"
+
+esac
+
+if test "$GXX" = yes; then
+ CXXFLAGS="$CXXFLAGS -ftemplate-depth-256"
+fi
+
+if test "$STANDALONE" = yes; then
+ CPPFLAGS="$CPPFLAGS -DASIO_STANDALONE"
+fi
+
+if test "$SEPARATE_COMPILATION" = yes; then
+ CPPFLAGS="$CPPFLAGS -DASIO_SEPARATE_COMPILATION"
+fi
+
+AC_MSG_CHECKING([whether C++11 is enabled])
+AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if __cplusplus < 201103L]]
+ [[#error C++11 not available]]
+ [[#endif]])],
+ [AC_MSG_RESULT([yes])
+ HAVE_CXX11=yes;],
+ [AC_MSG_RESULT([no])
+ HAVE_CXX11=no;])
+
+AC_MSG_CHECKING([whether C++14 is enabled])
+AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if defined(__GNUC__) && !defined(__clang__)]]
+ [[# if (__GNUC__ <= 6)]]
+ [[# error C++14 support on this compiler not sufficiently compliant]]
+ [[# endif]]
+ [[#endif]]
+ [[#if __cplusplus < 201402L]]
+ [[#error C++14 not available]]
+ [[#endif]])],
+ [AC_MSG_RESULT([yes])
+ HAVE_CXX14=yes;],
+ [AC_MSG_RESULT([no])
+ HAVE_CXX14=no;])
+
+AC_MSG_CHECKING([whether C++17 is enabled])
+AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if __cplusplus < 201703L]]
+ [[#error C++17 not available]]
+ [[#endif]])],
+ [AC_MSG_RESULT([yes])
+ HAVE_CXX17=yes;],
+ [AC_MSG_RESULT([no])
+ HAVE_CXX17=no;])
+
+AC_MSG_CHECKING([whether C++20 is enabled])
+AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if __cplusplus < 202002L]]
+ [[#error C++20 not available]]
+ [[#endif]])],
+ [AC_MSG_RESULT([yes])
+ HAVE_CXX20=yes;],
+ [AC_MSG_RESULT([no])
+ HAVE_CXX20=no;])
+
+AC_MSG_CHECKING([whether coroutines are enabled])
+AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[#if defined(__clang__)]]
+ [[# if (__clang_major__ >= 14)]]
+ [[# if (__cplusplus >= 202002) && (__cpp_impl_coroutine >= 201902)]]
+ [[# if __has_include(<coroutine>)]]
+ [[# define ASIO_HAS_CO_AWAIT 1]]
+ [[# endif]]
+ [[# elif (__cplusplus >= 201703) && (__cpp_coroutines >= 201703)]]
+ [[# if __has_include(<experimental/coroutine>)]]
+ [[# define ASIO_HAS_CO_AWAIT 1]]
+ [[# endif]]
+ [[# endif]]
+ [[# else]]
+ [[# if (__cplusplus >= 201703) && (__cpp_coroutines >= 201703)]]
+ [[# if __has_include(<experimental/coroutine>)]]
+ [[# define ASIO_HAS_CO_AWAIT 1]]
+ [[# endif]]
+ [[# endif]]
+ [[# endif]]
+ [[#elif defined(__GNUC__)]]
+ [[# if (__cplusplus >= 201709) && (__cpp_impl_coroutine >= 201902)]]
+ [[# if __has_include(<coroutine>)]]
+ [[# define ASIO_HAS_CO_AWAIT 1]]
+ [[# endif]]
+ [[# endif]]
+ [[#endif]]
+ [[#ifndef ASIO_HAS_CO_AWAIT]]
+ [[# error coroutines not available]]
+ [[#endif]])],
+ [AC_MSG_RESULT([yes])
+ HAVE_COROUTINES=yes;],
+ [AC_MSG_RESULT([no])
+ HAVE_COROUTINES=no;])
+
+if test "$GXX" = yes; then
+ if test "$STANDALONE" = yes; then
+ if test "$HAVE_CXX11" = no; then
+ HAVE_CXX11=yes
+ CPPFLAGS="-std=c++0x $CPPFLAGS"
+ fi
+ fi
+fi
+
+AM_CONDITIONAL(STANDALONE,test x$STANDALONE = xyes)
+
+AM_CONDITIONAL(SEPARATE_COMPILATION,test x$SEPARATE_COMPILATION = xyes)
+
+AM_CONDITIONAL(HAVE_BOOST_COROUTINE,test x$HAVE_BOOST_COROUTINE = xyes)
+
+AM_CONDITIONAL(WINDOWS_TARGET,test x$WINDOWS != xno)
+
+AM_CONDITIONAL(HAVE_CXX11,test x$HAVE_CXX11 = xyes)
+
+AM_CONDITIONAL(HAVE_CXX14,test x$HAVE_CXX14 = xyes)
+
+AM_CONDITIONAL(HAVE_CXX17,test x$HAVE_CXX17 = xyes)
+
+AM_CONDITIONAL(HAVE_CXX20,test x$HAVE_CXX20 = xyes)
+
+AM_CONDITIONAL(HAVE_COROUTINES,test x$HAVE_COROUTINES = xyes)
+
+AC_CONFIG_FILES([asio.pc])
+
+AC_OUTPUT([
+ Makefile
+ include/Makefile
+ src/Makefile
+ src/tests/Makefile
+ src/tests/properties/Makefile
+ src/examples/cpp11/Makefile
+ src/examples/cpp14/Makefile
+ src/examples/cpp17/Makefile
+ src/examples/cpp20/Makefile])
diff --git a/3rdparty/asio/depcomp b/3rdparty/asio/depcomp
new file mode 100644
index 00000000000..715e34311ed
--- /dev/null
+++ b/3rdparty/asio/depcomp
@@ -0,0 +1,791 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1999-2021 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
+
+case $1 in
+ '')
+ echo "$0: No command. Try '$0 --help' for more information." 1>&2
+ exit 1;
+ ;;
+ -h | --h*)
+ cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+ depmode Dependency tracking mode.
+ source Source file read by 'PROGRAMS ARGS'.
+ object Object file output by 'PROGRAMS ARGS'.
+ DEPDIR directory where to store dependencies.
+ depfile Dependency file to output.
+ tmpdepfile Temporary file to use when outputting dependencies.
+ libtool Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+ exit $?
+ ;;
+ -v | --v*)
+ echo "depcomp $scriptversion"
+ exit $?
+ ;;
+esac
+
+# Get the directory component of the given path, and save it in the
+# global variables '$dir'. Note that this directory component will
+# be either empty or ending with a '/' character. This is deliberate.
+set_dir_from ()
+{
+ case $1 in
+ */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
+ *) dir=;;
+ esac
+}
+
+# Get the suffix-stripped basename of the given path, and save it the
+# global variable '$base'.
+set_base_from ()
+{
+ base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
+}
+
+# If no dependency file was actually created by the compiler invocation,
+# we still have to create a dummy depfile, to avoid errors with the
+# Makefile "include basename.Plo" scheme.
+make_dummy_depfile ()
+{
+ echo "#dummy" > "$depfile"
+}
+
+# Factor out some common post-processing of the generated depfile.
+# Requires the auxiliary global variable '$tmpdepfile' to be set.
+aix_post_process_depfile ()
+{
+ # If the compiler actually managed to produce a dependency file,
+ # post-process it.
+ if test -f "$tmpdepfile"; then
+ # Each line is of the form 'foo.o: dependency.h'.
+ # Do two passes, one to just change these to
+ # $object: dependency.h
+ # and one to simply output
+ # dependency.h:
+ # which is needed to avoid the deleted-header problem.
+ { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
+ sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
+ } > "$depfile"
+ rm -f "$tmpdepfile"
+ else
+ make_dummy_depfile
+ fi
+}
+
+# A tabulation character.
+tab=' '
+# A newline character.
+nl='
+'
+# Character ranges might be problematic outside the C locale.
+# These definitions help.
+upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
+lower=abcdefghijklmnopqrstuvwxyz
+digits=0123456789
+alpha=${upper}${lower}
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+ echo "depcomp: Variables source, object and depmode must be set" 1>&2
+ exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+ sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Avoid interferences from the environment.
+gccflag= dashmflag=
+
+# Some modes work just like other modes, but use different flags. We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write. Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+ # HP compiler uses -M and no extra arg.
+ gccflag=-M
+ depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+ # This is just like dashmstdout with a different argument.
+ dashmflag=-xM
+ depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+ # This is just like msvisualcpp but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+ # This is just like msvc7 but w/o cygpath translation.
+ # Just convert the backslash-escaped backslashes to single forward
+ # slashes to satisfy depend.m4
+ cygpath_u='sed s,\\\\,/,g'
+ depmode=msvc7
+fi
+
+if test "$depmode" = xlc; then
+ # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
+ gccflag=-qmakedep=gcc,-MF
+ depmode=gcc
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want. Yay! Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff. Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am. Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+ for arg
+ do
+ case $arg in
+ -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+ *) set fnord "$@" "$arg" ;;
+ esac
+ shift # fnord
+ shift # $arg
+ done
+ "$@"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
+## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
+## (see the conditional assignment to $gccflag above).
+## There are various ways to get dependency output from gcc. Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+## up in a subdir. Having to rename by hand is ugly.
+## (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+## -MM, not -M (despite what the docs say). Also, it might not be
+## supported by the other compilers which use the 'gcc' depmode.
+## - Using -M directly means running the compiler twice (even worse
+## than renaming).
+ if test -z "$gccflag"; then
+ gccflag=-MD,
+ fi
+ "$@" -Wp,"$gccflag$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # The second -e expression handles DOS-style file names with drive
+ # letters.
+ sed -e 's/^[^:]*: / /' \
+ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the "deleted header file" problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header). We avoid this by adding
+## dummy dependencies for each header file. Too bad gcc doesn't do
+## this for us directly.
+## Some versions of gcc put a space before the ':'. On the theory
+## that the space means something, we add a space to the output as
+## well. hp depmode also adds that space, but also prefixes the VPATH
+## to the object. Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+sgi)
+ if test "$libtool" = yes; then
+ "$@" "-Wp,-MDupdate,$tmpdepfile"
+ else
+ "$@" -MDupdate "$tmpdepfile"
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+
+ if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
+ echo "$object : \\" > "$depfile"
+ # Clip off the initial element (the dependent). Don't try to be
+ # clever and replace this with sed code, as IRIX sed won't handle
+ # lines with more than a fixed number of characters (4096 in
+ # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
+ # the IRIX cc adds comments like '#:fec' to the end of the
+ # dependency line.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
+ | tr "$nl" ' ' >> "$depfile"
+ echo >> "$depfile"
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> "$depfile"
+ else
+ make_dummy_depfile
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+xlc)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+aix)
+ # The C for AIX Compiler uses -M and outputs the dependencies
+ # in a .u file. In older versions, this file always lives in the
+ # current directory. Also, the AIX compiler puts '$object:' at the
+ # start of each line; $object doesn't have directory information.
+ # Version 6 uses the directory in both cases.
+ set_dir_from "$object"
+ set_base_from "$object"
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$base.u
+ tmpdepfile3=$dir.libs/$base.u
+ "$@" -Wc,-M
+ else
+ tmpdepfile1=$dir$base.u
+ tmpdepfile2=$dir$base.u
+ tmpdepfile3=$dir$base.u
+ "$@" -M
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ aix_post_process_depfile
+ ;;
+
+tcc)
+ # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
+ # FIXME: That version still under development at the moment of writing.
+ # Make that this statement remains true also for stable, released
+ # versions.
+ # It will wrap lines (doesn't matter whether long or short) with a
+ # trailing '\', as in:
+ #
+ # foo.o : \
+ # foo.c \
+ # foo.h \
+ #
+ # It will put a trailing '\' even on the last line, and will use leading
+ # spaces rather than leading tabs (at least since its commit 0394caf7
+ # "Emit spaces for -MD").
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
+ # We have to change lines of the first kind to '$object: \'.
+ sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
+ # And for each line of the second kind, we have to emit a 'dep.h:'
+ # dummy dependency, to avoid the deleted-header problem.
+ sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+## The order of this option in the case statement is important, since the
+## shell code in configure will try each of these formats in the order
+## listed in this file. A plain '-MD' option would be understood by many
+## compilers, so we must ensure this comes after the gcc and icc options.
+pgcc)
+ # Portland's C compiler understands '-MD'.
+ # Will always output deps to 'file.d' where file is the root name of the
+ # source file under compilation, even if file resides in a subdirectory.
+ # The object file name does not affect the name of the '.d' file.
+ # pgcc 10.2 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using '\' :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+ set_dir_from "$object"
+ # Use the source, not the object, to determine the base name, since
+ # that's sadly what pgcc will do too.
+ set_base_from "$source"
+ tmpdepfile=$base.d
+
+ # For projects that build the same source file twice into different object
+ # files, the pgcc approach of using the *source* file root name can cause
+ # problems in parallel builds. Use a locking strategy to avoid stomping on
+ # the same $tmpdepfile.
+ lockdir=$base.d-lock
+ trap "
+ echo '$0: caught signal, cleaning up...' >&2
+ rmdir '$lockdir'
+ exit 1
+ " 1 2 13 15
+ numtries=100
+ i=$numtries
+ while test $i -gt 0; do
+ # mkdir is a portable test-and-set.
+ if mkdir "$lockdir" 2>/dev/null; then
+ # This process acquired the lock.
+ "$@" -MD
+ stat=$?
+ # Release the lock.
+ rmdir "$lockdir"
+ break
+ else
+ # If the lock is being held by a different process, wait
+ # until the winning process is done or we timeout.
+ while test -d "$lockdir" && test $i -gt 0; do
+ sleep 1
+ i=`expr $i - 1`
+ done
+ fi
+ i=`expr $i - 1`
+ done
+ trap - 1 2 13 15
+ if test $i -le 0; then
+ echo "$0: failed to acquire lock after $numtries attempts" >&2
+ echo "$0: check lockdir '$lockdir'" >&2
+ exit 1
+ fi
+
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ # Each line is of the form `foo.o: dependent.h',
+ # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+hp2)
+ # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+ # compilers, which have integrated preprocessors. The correct option
+ # to use with these is +Maked; it writes dependencies to a file named
+ # 'foo.d', which lands next to the object file, wherever that
+ # happens to be.
+ # Much of this is similar to the tru64 case; see comments there.
+ set_dir_from "$object"
+ set_base_from "$object"
+ if test "$libtool" = yes; then
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir.libs/$base.d
+ "$@" -Wc,+Maked
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ "$@" +Maked
+ fi
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
+ # Add 'dependent.h:' lines.
+ sed -ne '2,${
+ s/^ *//
+ s/ \\*$//
+ s/$/:/
+ p
+ }' "$tmpdepfile" >> "$depfile"
+ else
+ make_dummy_depfile
+ fi
+ rm -f "$tmpdepfile" "$tmpdepfile2"
+ ;;
+
+tru64)
+ # The Tru64 compiler uses -MD to generate dependencies as a side
+ # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
+ # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+ # dependencies in 'foo.d' instead, so we check for that too.
+ # Subdirectories are respected.
+ set_dir_from "$object"
+ set_base_from "$object"
+
+ if test "$libtool" = yes; then
+ # Libtool generates 2 separate objects for the 2 libraries. These
+ # two compilations output dependencies in $dir.libs/$base.o.d and
+ # in $dir$base.o.d. We have to check for both files, because
+ # one of the two compilations can be disabled. We should prefer
+ # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+ # automatically cleaned when .libs/ is deleted, while ignoring
+ # the former would cause a distcleancheck panic.
+ tmpdepfile1=$dir$base.o.d # libtool 1.5
+ tmpdepfile2=$dir.libs/$base.o.d # Likewise.
+ tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ # Same post-processing that is required for AIX mode.
+ aix_post_process_depfile
+ ;;
+
+msvc7)
+ if test "$libtool" = yes; then
+ showIncludes=-Wc,-showIncludes
+ else
+ showIncludes=-showIncludes
+ fi
+ "$@" $showIncludes > "$tmpdepfile"
+ stat=$?
+ grep -v '^Note: including file: ' "$tmpdepfile"
+ if test $stat -ne 0; then
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ # The first sed program below extracts the file names and escapes
+ # backslashes for cygpath. The second sed program outputs the file
+ # name when reading, but also accumulates all include files in the
+ # hold buffer in order to output them again at the end. This only
+ # works with sed implementations that can handle large buffers.
+ sed < "$tmpdepfile" -n '
+/^Note: including file: *\(.*\)/ {
+ s//\1/
+ s/\\/\\\\/g
+ p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/'"$tab"'\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+ s/.*/'"$tab"'/
+ G
+ p
+}' >> "$depfile"
+ echo >> "$depfile" # make sure the fragment doesn't end with a backslash
+ rm -f "$tmpdepfile"
+ ;;
+
+msvc7msys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+#nosideeffect)
+ # This comment above is used by automake to tell side-effect
+ # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout, regardless of -o.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove '-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ test -z "$dashmflag" && dashmflag=-M
+ # Require at least two characters before searching for ':'
+ # in the target name. This is to cope with DOS-style filenames:
+ # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
+ "$@" $dashmflag |
+ sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process this sed invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ tr ' ' "$nl" < "$tmpdepfile" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+dashXmstdout)
+ # This case only exists to satisfy depend.m4. It is never actually
+ # run, as this mode is specially recognized in the preamble.
+ exit 1
+ ;;
+
+makedepend)
+ "$@" || exit $?
+ # Remove any Libtool call
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no eat=no
+ for arg
+ do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ if test $eat = yes; then
+ eat=no
+ continue
+ fi
+ case "$arg" in
+ -D*|-I*)
+ set fnord "$@" "$arg"; shift ;;
+ # Strip any option that makedepend may not understand. Remove
+ # the object too, otherwise makedepend will parse it as a source file.
+ -arch)
+ eat=yes ;;
+ -*|$object)
+ ;;
+ *)
+ set fnord "$@" "$arg"; shift ;;
+ esac
+ done
+ obj_suffix=`echo "$object" | sed 's/^.*\././'`
+ touch "$tmpdepfile"
+ ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+ rm -f "$depfile"
+ # makedepend may prepend the VPATH from the source file name to the object.
+ # No need to regex-escape $object, excess matching of '.' is harmless.
+ sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+ # Some versions of the HPUX 10.20 sed can't process the last invocation
+ # correctly. Breaking it into two sed invocations is a workaround.
+ sed '1,2d' "$tmpdepfile" \
+ | tr ' ' "$nl" \
+ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
+ | sed -e 's/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile" "$tmpdepfile".bak
+ ;;
+
+cpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ # Remove '-o $object'.
+ IFS=" "
+ for arg
+ do
+ case $arg in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift # fnord
+ shift # $arg
+ ;;
+ esac
+ done
+
+ "$@" -E \
+ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+ | sed '$ s: \\$::' > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ cat < "$tmpdepfile" >> "$depfile"
+ sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvisualcpp)
+ # Important note: in order to support this mode, a compiler *must*
+ # always write the preprocessed file to stdout.
+ "$@" || exit $?
+
+ # Remove the call to Libtool.
+ if test "$libtool" = yes; then
+ while test "X$1" != 'X--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ -o)
+ shift
+ ;;
+ $object)
+ shift
+ ;;
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E 2>/dev/null |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
+ echo "$tab" >> "$depfile"
+ sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+msvcmsys)
+ # This case exists only to let depend.m4 do its work. It works by
+ # looking at the text of this script. This case will never be run,
+ # since it is checked for above.
+ exit 1
+ ;;
+
+none)
+ exec "$@"
+ ;;
+
+*)
+ echo "Unknown depmode $depmode" 1>&2
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/3rdparty/asio/include/Makefile.am b/3rdparty/asio/include/Makefile.am
new file mode 100644
index 00000000000..8f43766563e
--- /dev/null
+++ b/3rdparty/asio/include/Makefile.am
@@ -0,0 +1,626 @@
+# find . -name "*.*pp" | sed -e 's/^\.\///' | sed -e 's/^.*$/ & \\/' | sort
+nobase_include_HEADERS = \
+ asio/any_completion_executor.hpp \
+ asio/any_completion_handler.hpp \
+ asio/any_io_executor.hpp \
+ asio/append.hpp \
+ asio/as_tuple.hpp \
+ asio/associated_allocator.hpp \
+ asio/associated_cancellation_slot.hpp \
+ asio/associated_executor.hpp \
+ asio/associated_immediate_executor.hpp \
+ asio/associator.hpp \
+ asio/async_result.hpp \
+ asio/awaitable.hpp \
+ asio/basic_datagram_socket.hpp \
+ asio/basic_deadline_timer.hpp \
+ asio/basic_file.hpp \
+ asio/basic_io_object.hpp \
+ asio/basic_random_access_file.hpp \
+ asio/basic_raw_socket.hpp \
+ asio/basic_readable_pipe.hpp \
+ asio/basic_seq_packet_socket.hpp \
+ asio/basic_serial_port.hpp \
+ asio/basic_signal_set.hpp \
+ asio/basic_socket_acceptor.hpp \
+ asio/basic_socket.hpp \
+ asio/basic_socket_iostream.hpp \
+ asio/basic_socket_streambuf.hpp \
+ asio/basic_streambuf_fwd.hpp \
+ asio/basic_streambuf.hpp \
+ asio/basic_stream_file.hpp \
+ asio/basic_stream_socket.hpp \
+ asio/basic_waitable_timer.hpp \
+ asio/basic_writable_pipe.hpp \
+ asio/bind_allocator.hpp \
+ asio/bind_cancellation_slot.hpp \
+ asio/bind_executor.hpp \
+ asio/bind_immediate_executor.hpp \
+ asio/buffered_read_stream_fwd.hpp \
+ asio/buffered_read_stream.hpp \
+ asio/buffered_stream_fwd.hpp \
+ asio/buffered_stream.hpp \
+ asio/buffered_write_stream_fwd.hpp \
+ asio/buffered_write_stream.hpp \
+ asio/buffer.hpp \
+ asio/buffer_registration.hpp \
+ asio/buffers_iterator.hpp \
+ asio/cancellation_signal.hpp \
+ asio/cancellation_state.hpp \
+ asio/cancellation_type.hpp \
+ asio/co_spawn.hpp \
+ asio/completion_condition.hpp \
+ asio/compose.hpp \
+ asio/connect.hpp \
+ asio/connect_pipe.hpp \
+ asio/consign.hpp \
+ asio/coroutine.hpp \
+ asio/deadline_timer.hpp \
+ asio/defer.hpp \
+ asio/deferred.hpp \
+ asio/detached.hpp \
+ asio/detail/array_fwd.hpp \
+ asio/detail/array.hpp \
+ asio/detail/assert.hpp \
+ asio/detail/atomic_count.hpp \
+ asio/detail/base_from_cancellation_state.hpp \
+ asio/detail/base_from_completion_cond.hpp \
+ asio/detail/bind_handler.hpp \
+ asio/detail/blocking_executor_op.hpp \
+ asio/detail/buffered_stream_storage.hpp \
+ asio/detail/buffer_resize_guard.hpp \
+ asio/detail/buffer_sequence_adapter.hpp \
+ asio/detail/call_stack.hpp \
+ asio/detail/chrono.hpp \
+ asio/detail/chrono_time_traits.hpp \
+ asio/detail/completion_handler.hpp \
+ asio/detail/composed_work.hpp \
+ asio/detail/concurrency_hint.hpp \
+ asio/detail/conditionally_enabled_event.hpp \
+ asio/detail/conditionally_enabled_mutex.hpp \
+ asio/detail/config.hpp \
+ asio/detail/consuming_buffers.hpp \
+ asio/detail/cstddef.hpp \
+ asio/detail/cstdint.hpp \
+ asio/detail/date_time_fwd.hpp \
+ asio/detail/deadline_timer_service.hpp \
+ asio/detail/dependent_type.hpp \
+ asio/detail/descriptor_ops.hpp \
+ asio/detail/descriptor_read_op.hpp \
+ asio/detail/descriptor_write_op.hpp \
+ asio/detail/dev_poll_reactor.hpp \
+ asio/detail/epoll_reactor.hpp \
+ asio/detail/eventfd_select_interrupter.hpp \
+ asio/detail/event.hpp \
+ asio/detail/exception.hpp \
+ asio/detail/executor_function.hpp \
+ asio/detail/executor_op.hpp \
+ asio/detail/fd_set_adapter.hpp \
+ asio/detail/fenced_block.hpp \
+ asio/detail/functional.hpp \
+ asio/detail/future.hpp \
+ asio/detail/global.hpp \
+ asio/detail/handler_alloc_helpers.hpp \
+ asio/detail/handler_cont_helpers.hpp \
+ asio/detail/handler_tracking.hpp \
+ asio/detail/handler_type_requirements.hpp \
+ asio/detail/handler_work.hpp \
+ asio/detail/hash_map.hpp \
+ asio/detail/impl/buffer_sequence_adapter.ipp \
+ asio/detail/impl/descriptor_ops.ipp \
+ asio/detail/impl/dev_poll_reactor.hpp \
+ asio/detail/impl/dev_poll_reactor.ipp \
+ asio/detail/impl/epoll_reactor.hpp \
+ asio/detail/impl/epoll_reactor.ipp \
+ asio/detail/impl/eventfd_select_interrupter.ipp \
+ asio/detail/impl/handler_tracking.ipp \
+ asio/detail/impl/io_uring_descriptor_service.ipp \
+ asio/detail/impl/io_uring_file_service.ipp \
+ asio/detail/impl/io_uring_service.hpp \
+ asio/detail/impl/io_uring_service.ipp \
+ asio/detail/impl/io_uring_socket_service_base.ipp \
+ asio/detail/impl/kqueue_reactor.hpp \
+ asio/detail/impl/kqueue_reactor.ipp \
+ asio/detail/impl/null_event.ipp \
+ asio/detail/impl/pipe_select_interrupter.ipp \
+ asio/detail/impl/posix_event.ipp \
+ asio/detail/impl/posix_mutex.ipp \
+ asio/detail/impl/posix_serial_port_service.ipp \
+ asio/detail/impl/posix_thread.ipp \
+ asio/detail/impl/posix_tss_ptr.ipp \
+ asio/detail/impl/reactive_descriptor_service.ipp \
+ asio/detail/impl/reactive_socket_service_base.ipp \
+ asio/detail/impl/resolver_service_base.ipp \
+ asio/detail/impl/scheduler.ipp \
+ asio/detail/impl/select_reactor.hpp \
+ asio/detail/impl/select_reactor.ipp \
+ asio/detail/impl/service_registry.hpp \
+ asio/detail/impl/service_registry.ipp \
+ asio/detail/impl/signal_set_service.ipp \
+ asio/detail/impl/socket_ops.ipp \
+ asio/detail/impl/socket_select_interrupter.ipp \
+ asio/detail/impl/strand_executor_service.hpp \
+ asio/detail/impl/strand_executor_service.ipp \
+ asio/detail/impl/strand_service.hpp \
+ asio/detail/impl/strand_service.ipp \
+ asio/detail/impl/thread_context.ipp \
+ asio/detail/impl/throw_error.ipp \
+ asio/detail/impl/timer_queue_ptime.ipp \
+ asio/detail/impl/timer_queue_set.ipp \
+ asio/detail/impl/win_event.ipp \
+ asio/detail/impl/win_iocp_file_service.ipp \
+ asio/detail/impl/win_iocp_handle_service.ipp \
+ asio/detail/impl/win_iocp_io_context.hpp \
+ asio/detail/impl/win_iocp_io_context.ipp \
+ asio/detail/impl/win_iocp_serial_port_service.ipp \
+ asio/detail/impl/win_iocp_socket_service_base.ipp \
+ asio/detail/impl/win_mutex.ipp \
+ asio/detail/impl/win_object_handle_service.ipp \
+ asio/detail/impl/winrt_ssocket_service_base.ipp \
+ asio/detail/impl/winrt_timer_scheduler.hpp \
+ asio/detail/impl/winrt_timer_scheduler.ipp \
+ asio/detail/impl/winsock_init.ipp \
+ asio/detail/impl/win_static_mutex.ipp \
+ asio/detail/impl/win_thread.ipp \
+ asio/detail/impl/win_tss_ptr.ipp \
+ asio/detail/initiate_defer.hpp \
+ asio/detail/initiate_dispatch.hpp \
+ asio/detail/initiate_post.hpp \
+ asio/detail/io_control.hpp \
+ asio/detail/io_object_impl.hpp \
+ asio/detail/io_uring_descriptor_read_at_op.hpp \
+ asio/detail/io_uring_descriptor_read_op.hpp \
+ asio/detail/io_uring_descriptor_service.hpp \
+ asio/detail/io_uring_descriptor_write_at_op.hpp \
+ asio/detail/io_uring_descriptor_write_op.hpp \
+ asio/detail/io_uring_file_service.hpp \
+ asio/detail/io_uring_null_buffers_op.hpp \
+ asio/detail/io_uring_operation.hpp \
+ asio/detail/io_uring_service.hpp \
+ asio/detail/io_uring_socket_accept_op.hpp \
+ asio/detail/io_uring_socket_connect_op.hpp \
+ asio/detail/io_uring_socket_recvfrom_op.hpp \
+ asio/detail/io_uring_socket_recvmsg_op.hpp \
+ asio/detail/io_uring_socket_recv_op.hpp \
+ asio/detail/io_uring_socket_send_op.hpp \
+ asio/detail/io_uring_socket_sendto_op.hpp \
+ asio/detail/io_uring_socket_service_base.hpp \
+ asio/detail/io_uring_socket_service.hpp \
+ asio/detail/io_uring_wait_op.hpp \
+ asio/detail/is_buffer_sequence.hpp \
+ asio/detail/is_executor.hpp \
+ asio/detail/keyword_tss_ptr.hpp \
+ asio/detail/kqueue_reactor.hpp \
+ asio/detail/limits.hpp \
+ asio/detail/local_free_on_block_exit.hpp \
+ asio/detail/memory.hpp \
+ asio/detail/mutex.hpp \
+ asio/detail/non_const_lvalue.hpp \
+ asio/detail/noncopyable.hpp \
+ asio/detail/null_event.hpp \
+ asio/detail/null_fenced_block.hpp \
+ asio/detail/null_global.hpp \
+ asio/detail/null_mutex.hpp \
+ asio/detail/null_reactor.hpp \
+ asio/detail/null_signal_blocker.hpp \
+ asio/detail/null_socket_service.hpp \
+ asio/detail/null_static_mutex.hpp \
+ asio/detail/null_thread.hpp \
+ asio/detail/null_tss_ptr.hpp \
+ asio/detail/object_pool.hpp \
+ asio/detail/old_win_sdk_compat.hpp \
+ asio/detail/operation.hpp \
+ asio/detail/op_queue.hpp \
+ asio/detail/pipe_select_interrupter.hpp \
+ asio/detail/pop_options.hpp \
+ asio/detail/posix_event.hpp \
+ asio/detail/posix_fd_set_adapter.hpp \
+ asio/detail/posix_global.hpp \
+ asio/detail/posix_mutex.hpp \
+ asio/detail/posix_serial_port_service.hpp \
+ asio/detail/posix_signal_blocker.hpp \
+ asio/detail/posix_static_mutex.hpp \
+ asio/detail/posix_thread.hpp \
+ asio/detail/posix_tss_ptr.hpp \
+ asio/detail/push_options.hpp \
+ asio/detail/reactive_descriptor_service.hpp \
+ asio/detail/reactive_null_buffers_op.hpp \
+ asio/detail/reactive_socket_accept_op.hpp \
+ asio/detail/reactive_socket_connect_op.hpp \
+ asio/detail/reactive_socket_recvfrom_op.hpp \
+ asio/detail/reactive_socket_recvmsg_op.hpp \
+ asio/detail/reactive_socket_recv_op.hpp \
+ asio/detail/reactive_socket_send_op.hpp \
+ asio/detail/reactive_socket_sendto_op.hpp \
+ asio/detail/reactive_socket_service_base.hpp \
+ asio/detail/reactive_socket_service.hpp \
+ asio/detail/reactive_wait_op.hpp \
+ asio/detail/reactor.hpp \
+ asio/detail/reactor_op.hpp \
+ asio/detail/reactor_op_queue.hpp \
+ asio/detail/recycling_allocator.hpp \
+ asio/detail/regex_fwd.hpp \
+ asio/detail/resolve_endpoint_op.hpp \
+ asio/detail/resolve_op.hpp \
+ asio/detail/resolve_query_op.hpp \
+ asio/detail/resolver_service_base.hpp \
+ asio/detail/resolver_service.hpp \
+ asio/detail/scheduler.hpp \
+ asio/detail/scheduler_operation.hpp \
+ asio/detail/scheduler_task.hpp \
+ asio/detail/scheduler_thread_info.hpp \
+ asio/detail/scoped_lock.hpp \
+ asio/detail/scoped_ptr.hpp \
+ asio/detail/select_interrupter.hpp \
+ asio/detail/select_reactor.hpp \
+ asio/detail/service_registry.hpp \
+ asio/detail/signal_blocker.hpp \
+ asio/detail/signal_handler.hpp \
+ asio/detail/signal_init.hpp \
+ asio/detail/signal_op.hpp \
+ asio/detail/signal_set_service.hpp \
+ asio/detail/socket_holder.hpp \
+ asio/detail/socket_ops.hpp \
+ asio/detail/socket_option.hpp \
+ asio/detail/socket_select_interrupter.hpp \
+ asio/detail/socket_types.hpp \
+ asio/detail/source_location.hpp \
+ asio/detail/static_mutex.hpp \
+ asio/detail/std_event.hpp \
+ asio/detail/std_fenced_block.hpp \
+ asio/detail/std_global.hpp \
+ asio/detail/std_mutex.hpp \
+ asio/detail/std_static_mutex.hpp \
+ asio/detail/std_thread.hpp \
+ asio/detail/strand_executor_service.hpp \
+ asio/detail/strand_service.hpp \
+ asio/detail/string_view.hpp \
+ asio/detail/thread_context.hpp \
+ asio/detail/thread_group.hpp \
+ asio/detail/thread.hpp \
+ asio/detail/thread_info_base.hpp \
+ asio/detail/throw_error.hpp \
+ asio/detail/throw_exception.hpp \
+ asio/detail/timer_queue_base.hpp \
+ asio/detail/timer_queue.hpp \
+ asio/detail/timer_queue_ptime.hpp \
+ asio/detail/timer_queue_set.hpp \
+ asio/detail/timer_scheduler_fwd.hpp \
+ asio/detail/timer_scheduler.hpp \
+ asio/detail/tss_ptr.hpp \
+ asio/detail/type_traits.hpp \
+ asio/detail/utility.hpp \
+ asio/detail/wait_handler.hpp \
+ asio/detail/wait_op.hpp \
+ asio/detail/winapp_thread.hpp \
+ asio/detail/wince_thread.hpp \
+ asio/detail/win_event.hpp \
+ asio/detail/win_fd_set_adapter.hpp \
+ asio/detail/win_global.hpp \
+ asio/detail/win_iocp_file_service.hpp \
+ asio/detail/win_iocp_handle_read_op.hpp \
+ asio/detail/win_iocp_handle_service.hpp \
+ asio/detail/win_iocp_handle_write_op.hpp \
+ asio/detail/win_iocp_io_context.hpp \
+ asio/detail/win_iocp_null_buffers_op.hpp \
+ asio/detail/win_iocp_operation.hpp \
+ asio/detail/win_iocp_overlapped_op.hpp \
+ asio/detail/win_iocp_overlapped_ptr.hpp \
+ asio/detail/win_iocp_serial_port_service.hpp \
+ asio/detail/win_iocp_socket_accept_op.hpp \
+ asio/detail/win_iocp_socket_connect_op.hpp \
+ asio/detail/win_iocp_socket_recvfrom_op.hpp \
+ asio/detail/win_iocp_socket_recvmsg_op.hpp \
+ asio/detail/win_iocp_socket_recv_op.hpp \
+ asio/detail/win_iocp_socket_send_op.hpp \
+ asio/detail/win_iocp_socket_service_base.hpp \
+ asio/detail/win_iocp_socket_service.hpp \
+ asio/detail/win_iocp_thread_info.hpp \
+ asio/detail/win_iocp_wait_op.hpp \
+ asio/detail/win_mutex.hpp \
+ asio/detail/win_object_handle_service.hpp \
+ asio/detail/winrt_async_manager.hpp \
+ asio/detail/winrt_async_op.hpp \
+ asio/detail/winrt_resolve_op.hpp \
+ asio/detail/winrt_resolver_service.hpp \
+ asio/detail/winrt_socket_connect_op.hpp \
+ asio/detail/winrt_socket_recv_op.hpp \
+ asio/detail/winrt_socket_send_op.hpp \
+ asio/detail/winrt_ssocket_service_base.hpp \
+ asio/detail/winrt_ssocket_service.hpp \
+ asio/detail/winrt_timer_scheduler.hpp \
+ asio/detail/winrt_utils.hpp \
+ asio/detail/winsock_init.hpp \
+ asio/detail/win_static_mutex.hpp \
+ asio/detail/win_thread.hpp \
+ asio/detail/win_tss_ptr.hpp \
+ asio/detail/work_dispatcher.hpp \
+ asio/detail/wrapped_handler.hpp \
+ asio/dispatch.hpp \
+ asio/error_code.hpp \
+ asio/error.hpp \
+ asio/execution.hpp \
+ asio/execution_context.hpp \
+ asio/execution/allocator.hpp \
+ asio/execution/any_executor.hpp \
+ asio/execution/bad_executor.hpp \
+ asio/execution/blocking.hpp \
+ asio/execution/blocking_adaptation.hpp \
+ asio/execution/context.hpp \
+ asio/execution/context_as.hpp \
+ asio/execution/executor.hpp \
+ asio/execution/impl/bad_executor.ipp \
+ asio/execution/invocable_archetype.hpp \
+ asio/execution/mapping.hpp \
+ asio/execution/occupancy.hpp \
+ asio/execution/outstanding_work.hpp \
+ asio/execution/prefer_only.hpp \
+ asio/execution/relationship.hpp \
+ asio/executor.hpp \
+ asio/executor_work_guard.hpp \
+ asio/experimental/append.hpp \
+ asio/experimental/as_single.hpp \
+ asio/experimental/as_tuple.hpp \
+ asio/experimental/awaitable_operators.hpp \
+ asio/experimental/basic_channel.hpp \
+ asio/experimental/basic_concurrent_channel.hpp \
+ asio/experimental/cancellation_condition.hpp \
+ asio/experimental/channel.hpp \
+ asio/experimental/channel_error.hpp \
+ asio/experimental/channel_traits.hpp \
+ asio/experimental/co_composed.hpp \
+ asio/experimental/co_spawn.hpp \
+ asio/experimental/concurrent_channel.hpp \
+ asio/experimental/coro.hpp \
+ asio/experimental/coro_traits.hpp \
+ asio/experimental/deferred.hpp \
+ asio/experimental/detail/channel_handler.hpp \
+ asio/experimental/detail/channel_message.hpp \
+ asio/experimental/detail/channel_operation.hpp \
+ asio/experimental/detail/channel_payload.hpp \
+ asio/experimental/detail/channel_receive_op.hpp \
+ asio/experimental/detail/channel_send_functions.hpp \
+ asio/experimental/detail/channel_send_op.hpp \
+ asio/experimental/detail/channel_service.hpp \
+ asio/experimental/detail/coro_completion_handler.hpp \
+ asio/experimental/detail/coro_promise_allocator.hpp \
+ asio/experimental/detail/has_signature.hpp \
+ asio/experimental/detail/impl/channel_service.hpp \
+ asio/experimental/detail/partial_promise.hpp \
+ asio/experimental/impl/as_single.hpp \
+ asio/experimental/impl/channel_error.ipp \
+ asio/experimental/impl/co_composed.hpp \
+ asio/experimental/impl/coro.hpp \
+ asio/experimental/impl/parallel_group.hpp \
+ asio/experimental/impl/promise.hpp \
+ asio/experimental/impl/use_coro.hpp \
+ asio/experimental/impl/use_promise.hpp \
+ asio/experimental/parallel_group.hpp \
+ asio/experimental/prepend.hpp \
+ asio/experimental/promise.hpp \
+ asio/experimental/use_coro.hpp \
+ asio/experimental/use_promise.hpp \
+ asio/file_base.hpp \
+ asio/generic/basic_endpoint.hpp \
+ asio/generic/datagram_protocol.hpp \
+ asio/generic/detail/endpoint.hpp \
+ asio/generic/detail/impl/endpoint.ipp \
+ asio/generic/raw_protocol.hpp \
+ asio/generic/seq_packet_protocol.hpp \
+ asio/generic/stream_protocol.hpp \
+ asio/handler_continuation_hook.hpp \
+ asio/high_resolution_timer.hpp \
+ asio.hpp \
+ asio/impl/any_completion_executor.ipp \
+ asio/impl/any_io_executor.ipp \
+ asio/impl/append.hpp \
+ asio/impl/as_tuple.hpp \
+ asio/impl/awaitable.hpp \
+ asio/impl/buffered_read_stream.hpp \
+ asio/impl/buffered_write_stream.hpp \
+ asio/impl/cancellation_signal.ipp \
+ asio/impl/co_spawn.hpp \
+ asio/impl/connect.hpp \
+ asio/impl/connect_pipe.hpp \
+ asio/impl/connect_pipe.ipp \
+ asio/impl/consign.hpp \
+ asio/impl/deferred.hpp \
+ asio/impl/detached.hpp \
+ asio/impl/error_code.ipp \
+ asio/impl/error.ipp \
+ asio/impl/execution_context.hpp \
+ asio/impl/execution_context.ipp \
+ asio/impl/executor.hpp \
+ asio/impl/executor.ipp \
+ asio/impl/io_context.hpp \
+ asio/impl/io_context.ipp \
+ asio/impl/multiple_exceptions.ipp \
+ asio/impl/prepend.hpp \
+ asio/impl/read_at.hpp \
+ asio/impl/read.hpp \
+ asio/impl/read_until.hpp \
+ asio/impl/redirect_error.hpp \
+ asio/impl/serial_port_base.hpp \
+ asio/impl/serial_port_base.ipp \
+ asio/impl/spawn.hpp \
+ asio/impl/src.hpp \
+ asio/impl/system_context.hpp \
+ asio/impl/system_context.ipp \
+ asio/impl/system_executor.hpp \
+ asio/impl/thread_pool.hpp \
+ asio/impl/thread_pool.ipp \
+ asio/impl/use_awaitable.hpp \
+ asio/impl/use_future.hpp \
+ asio/impl/write_at.hpp \
+ asio/impl/write.hpp \
+ asio/io_context.hpp \
+ asio/io_context_strand.hpp \
+ asio/io_service.hpp \
+ asio/io_service_strand.hpp \
+ asio/ip/address.hpp \
+ asio/ip/address_v4.hpp \
+ asio/ip/address_v4_iterator.hpp \
+ asio/ip/address_v4_range.hpp \
+ asio/ip/address_v6.hpp \
+ asio/ip/address_v6_iterator.hpp \
+ asio/ip/address_v6_range.hpp \
+ asio/ip/bad_address_cast.hpp \
+ asio/ip/basic_endpoint.hpp \
+ asio/ip/basic_resolver_entry.hpp \
+ asio/ip/basic_resolver.hpp \
+ asio/ip/basic_resolver_iterator.hpp \
+ asio/ip/basic_resolver_query.hpp \
+ asio/ip/basic_resolver_results.hpp \
+ asio/ip/detail/endpoint.hpp \
+ asio/ip/detail/impl/endpoint.ipp \
+ asio/ip/detail/socket_option.hpp \
+ asio/ip/host_name.hpp \
+ asio/ip/icmp.hpp \
+ asio/ip/impl/address.hpp \
+ asio/ip/impl/address.ipp \
+ asio/ip/impl/address_v4.hpp \
+ asio/ip/impl/address_v4.ipp \
+ asio/ip/impl/address_v6.hpp \
+ asio/ip/impl/address_v6.ipp \
+ asio/ip/impl/basic_endpoint.hpp \
+ asio/ip/impl/host_name.ipp \
+ asio/ip/impl/network_v4.hpp \
+ asio/ip/impl/network_v4.ipp \
+ asio/ip/impl/network_v6.hpp \
+ asio/ip/impl/network_v6.ipp \
+ asio/ip/multicast.hpp \
+ asio/ip/network_v4.hpp \
+ asio/ip/network_v6.hpp \
+ asio/ip/resolver_base.hpp \
+ asio/ip/resolver_query_base.hpp \
+ asio/ip/tcp.hpp \
+ asio/ip/udp.hpp \
+ asio/ip/unicast.hpp \
+ asio/ip/v6_only.hpp \
+ asio/is_applicable_property.hpp \
+ asio/is_contiguous_iterator.hpp \
+ asio/is_executor.hpp \
+ asio/is_read_buffered.hpp \
+ asio/is_write_buffered.hpp \
+ asio/local/basic_endpoint.hpp \
+ asio/local/connect_pair.hpp \
+ asio/local/datagram_protocol.hpp \
+ asio/local/detail/endpoint.hpp \
+ asio/local/detail/impl/endpoint.ipp \
+ asio/local/seq_packet_protocol.hpp \
+ asio/local/stream_protocol.hpp \
+ asio/multiple_exceptions.hpp \
+ asio/packaged_task.hpp \
+ asio/placeholders.hpp \
+ asio/posix/basic_descriptor.hpp \
+ asio/posix/basic_stream_descriptor.hpp \
+ asio/posix/descriptor_base.hpp \
+ asio/posix/descriptor.hpp \
+ asio/posix/stream_descriptor.hpp \
+ asio/post.hpp \
+ asio/prefer.hpp \
+ asio/prepend.hpp \
+ asio/query.hpp \
+ asio/random_access_file.hpp \
+ asio/read_at.hpp \
+ asio/read.hpp \
+ asio/read_until.hpp \
+ asio/readable_pipe.hpp \
+ asio/recycling_allocator.hpp \
+ asio/redirect_error.hpp \
+ asio/registered_buffer.hpp \
+ asio/require.hpp \
+ asio/require_concept.hpp \
+ asio/serial_port_base.hpp \
+ asio/serial_port.hpp \
+ asio/signal_set_base.hpp \
+ asio/signal_set.hpp \
+ asio/socket_base.hpp \
+ asio/spawn.hpp \
+ asio/ssl/context_base.hpp \
+ asio/ssl/context.hpp \
+ asio/ssl/detail/buffered_handshake_op.hpp \
+ asio/ssl/detail/engine.hpp \
+ asio/ssl/detail/handshake_op.hpp \
+ asio/ssl/detail/impl/engine.ipp \
+ asio/ssl/detail/impl/openssl_init.ipp \
+ asio/ssl/detail/io.hpp \
+ asio/ssl/detail/openssl_init.hpp \
+ asio/ssl/detail/openssl_types.hpp \
+ asio/ssl/detail/password_callback.hpp \
+ asio/ssl/detail/read_op.hpp \
+ asio/ssl/detail/shutdown_op.hpp \
+ asio/ssl/detail/stream_core.hpp \
+ asio/ssl/detail/verify_callback.hpp \
+ asio/ssl/detail/write_op.hpp \
+ asio/ssl/error.hpp \
+ asio/ssl.hpp \
+ asio/ssl/host_name_verification.hpp \
+ asio/ssl/impl/context.hpp \
+ asio/ssl/impl/context.ipp \
+ asio/ssl/impl/error.ipp \
+ asio/ssl/impl/host_name_verification.ipp \
+ asio/ssl/impl/rfc2818_verification.ipp \
+ asio/ssl/impl/src.hpp \
+ asio/ssl/rfc2818_verification.hpp \
+ asio/ssl/stream_base.hpp \
+ asio/ssl/stream.hpp \
+ asio/ssl/verify_context.hpp \
+ asio/ssl/verify_mode.hpp \
+ asio/static_thread_pool.hpp \
+ asio/steady_timer.hpp \
+ asio/strand.hpp \
+ asio/streambuf.hpp \
+ asio/stream_file.hpp \
+ asio/system_context.hpp \
+ asio/system_error.hpp \
+ asio/system_executor.hpp \
+ asio/system_timer.hpp \
+ asio/this_coro.hpp \
+ asio/thread.hpp \
+ asio/thread_pool.hpp \
+ asio/time_traits.hpp \
+ asio/traits/equality_comparable.hpp \
+ asio/traits/execute_member.hpp \
+ asio/traits/prefer_free.hpp \
+ asio/traits/prefer_member.hpp \
+ asio/traits/query_free.hpp \
+ asio/traits/query_member.hpp \
+ asio/traits/query_static_constexpr_member.hpp \
+ asio/traits/require_concept_free.hpp \
+ asio/traits/require_concept_member.hpp \
+ asio/traits/require_free.hpp \
+ asio/traits/require_member.hpp \
+ asio/traits/static_query.hpp \
+ asio/traits/static_require.hpp \
+ asio/traits/static_require_concept.hpp \
+ asio/ts/buffer.hpp \
+ asio/ts/executor.hpp \
+ asio/ts/internet.hpp \
+ asio/ts/io_context.hpp \
+ asio/ts/netfwd.hpp \
+ asio/ts/net.hpp \
+ asio/ts/socket.hpp \
+ asio/ts/timer.hpp \
+ asio/unyield.hpp \
+ asio/use_awaitable.hpp \
+ asio/use_future.hpp \
+ asio/uses_executor.hpp \
+ asio/version.hpp \
+ asio/wait_traits.hpp \
+ asio/windows/basic_object_handle.hpp \
+ asio/windows/basic_overlapped_handle.hpp \
+ asio/windows/basic_random_access_handle.hpp \
+ asio/windows/basic_stream_handle.hpp \
+ asio/windows/object_handle.hpp \
+ asio/windows/overlapped_handle.hpp \
+ asio/windows/overlapped_ptr.hpp \
+ asio/windows/random_access_handle.hpp \
+ asio/windows/stream_handle.hpp \
+ asio/writable_pipe.hpp \
+ asio/write_at.hpp \
+ asio/write.hpp \
+ asio/yield.hpp
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
diff --git a/3rdparty/asio/include/Makefile.in b/3rdparty/asio/include/Makefile.in
new file mode 100644
index 00000000000..e71be1bf590
--- /dev/null
+++ b/3rdparty/asio/include/Makefile.in
@@ -0,0 +1,1164 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = include
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(nobase_include_HEADERS) \
+ $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__installdirs = "$(DESTDIR)$(includedir)"
+HEADERS = $(nobase_include_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+
+# find . -name "*.*pp" | sed -e 's/^\.\///' | sed -e 's/^.*$/ & \\/' | sort
+nobase_include_HEADERS = \
+ asio/any_completion_executor.hpp \
+ asio/any_completion_handler.hpp \
+ asio/any_io_executor.hpp \
+ asio/append.hpp \
+ asio/as_tuple.hpp \
+ asio/associated_allocator.hpp \
+ asio/associated_cancellation_slot.hpp \
+ asio/associated_executor.hpp \
+ asio/associated_immediate_executor.hpp \
+ asio/associator.hpp \
+ asio/async_result.hpp \
+ asio/awaitable.hpp \
+ asio/basic_datagram_socket.hpp \
+ asio/basic_deadline_timer.hpp \
+ asio/basic_file.hpp \
+ asio/basic_io_object.hpp \
+ asio/basic_random_access_file.hpp \
+ asio/basic_raw_socket.hpp \
+ asio/basic_readable_pipe.hpp \
+ asio/basic_seq_packet_socket.hpp \
+ asio/basic_serial_port.hpp \
+ asio/basic_signal_set.hpp \
+ asio/basic_socket_acceptor.hpp \
+ asio/basic_socket.hpp \
+ asio/basic_socket_iostream.hpp \
+ asio/basic_socket_streambuf.hpp \
+ asio/basic_streambuf_fwd.hpp \
+ asio/basic_streambuf.hpp \
+ asio/basic_stream_file.hpp \
+ asio/basic_stream_socket.hpp \
+ asio/basic_waitable_timer.hpp \
+ asio/basic_writable_pipe.hpp \
+ asio/bind_allocator.hpp \
+ asio/bind_cancellation_slot.hpp \
+ asio/bind_executor.hpp \
+ asio/bind_immediate_executor.hpp \
+ asio/buffered_read_stream_fwd.hpp \
+ asio/buffered_read_stream.hpp \
+ asio/buffered_stream_fwd.hpp \
+ asio/buffered_stream.hpp \
+ asio/buffered_write_stream_fwd.hpp \
+ asio/buffered_write_stream.hpp \
+ asio/buffer.hpp \
+ asio/buffer_registration.hpp \
+ asio/buffers_iterator.hpp \
+ asio/cancellation_signal.hpp \
+ asio/cancellation_state.hpp \
+ asio/cancellation_type.hpp \
+ asio/co_spawn.hpp \
+ asio/completion_condition.hpp \
+ asio/compose.hpp \
+ asio/connect.hpp \
+ asio/connect_pipe.hpp \
+ asio/consign.hpp \
+ asio/coroutine.hpp \
+ asio/deadline_timer.hpp \
+ asio/defer.hpp \
+ asio/deferred.hpp \
+ asio/detached.hpp \
+ asio/detail/array_fwd.hpp \
+ asio/detail/array.hpp \
+ asio/detail/assert.hpp \
+ asio/detail/atomic_count.hpp \
+ asio/detail/base_from_cancellation_state.hpp \
+ asio/detail/base_from_completion_cond.hpp \
+ asio/detail/bind_handler.hpp \
+ asio/detail/blocking_executor_op.hpp \
+ asio/detail/buffered_stream_storage.hpp \
+ asio/detail/buffer_resize_guard.hpp \
+ asio/detail/buffer_sequence_adapter.hpp \
+ asio/detail/call_stack.hpp \
+ asio/detail/chrono.hpp \
+ asio/detail/chrono_time_traits.hpp \
+ asio/detail/completion_handler.hpp \
+ asio/detail/composed_work.hpp \
+ asio/detail/concurrency_hint.hpp \
+ asio/detail/conditionally_enabled_event.hpp \
+ asio/detail/conditionally_enabled_mutex.hpp \
+ asio/detail/config.hpp \
+ asio/detail/consuming_buffers.hpp \
+ asio/detail/cstddef.hpp \
+ asio/detail/cstdint.hpp \
+ asio/detail/date_time_fwd.hpp \
+ asio/detail/deadline_timer_service.hpp \
+ asio/detail/dependent_type.hpp \
+ asio/detail/descriptor_ops.hpp \
+ asio/detail/descriptor_read_op.hpp \
+ asio/detail/descriptor_write_op.hpp \
+ asio/detail/dev_poll_reactor.hpp \
+ asio/detail/epoll_reactor.hpp \
+ asio/detail/eventfd_select_interrupter.hpp \
+ asio/detail/event.hpp \
+ asio/detail/exception.hpp \
+ asio/detail/executor_function.hpp \
+ asio/detail/executor_op.hpp \
+ asio/detail/fd_set_adapter.hpp \
+ asio/detail/fenced_block.hpp \
+ asio/detail/functional.hpp \
+ asio/detail/future.hpp \
+ asio/detail/global.hpp \
+ asio/detail/handler_alloc_helpers.hpp \
+ asio/detail/handler_cont_helpers.hpp \
+ asio/detail/handler_tracking.hpp \
+ asio/detail/handler_type_requirements.hpp \
+ asio/detail/handler_work.hpp \
+ asio/detail/hash_map.hpp \
+ asio/detail/impl/buffer_sequence_adapter.ipp \
+ asio/detail/impl/descriptor_ops.ipp \
+ asio/detail/impl/dev_poll_reactor.hpp \
+ asio/detail/impl/dev_poll_reactor.ipp \
+ asio/detail/impl/epoll_reactor.hpp \
+ asio/detail/impl/epoll_reactor.ipp \
+ asio/detail/impl/eventfd_select_interrupter.ipp \
+ asio/detail/impl/handler_tracking.ipp \
+ asio/detail/impl/io_uring_descriptor_service.ipp \
+ asio/detail/impl/io_uring_file_service.ipp \
+ asio/detail/impl/io_uring_service.hpp \
+ asio/detail/impl/io_uring_service.ipp \
+ asio/detail/impl/io_uring_socket_service_base.ipp \
+ asio/detail/impl/kqueue_reactor.hpp \
+ asio/detail/impl/kqueue_reactor.ipp \
+ asio/detail/impl/null_event.ipp \
+ asio/detail/impl/pipe_select_interrupter.ipp \
+ asio/detail/impl/posix_event.ipp \
+ asio/detail/impl/posix_mutex.ipp \
+ asio/detail/impl/posix_serial_port_service.ipp \
+ asio/detail/impl/posix_thread.ipp \
+ asio/detail/impl/posix_tss_ptr.ipp \
+ asio/detail/impl/reactive_descriptor_service.ipp \
+ asio/detail/impl/reactive_socket_service_base.ipp \
+ asio/detail/impl/resolver_service_base.ipp \
+ asio/detail/impl/scheduler.ipp \
+ asio/detail/impl/select_reactor.hpp \
+ asio/detail/impl/select_reactor.ipp \
+ asio/detail/impl/service_registry.hpp \
+ asio/detail/impl/service_registry.ipp \
+ asio/detail/impl/signal_set_service.ipp \
+ asio/detail/impl/socket_ops.ipp \
+ asio/detail/impl/socket_select_interrupter.ipp \
+ asio/detail/impl/strand_executor_service.hpp \
+ asio/detail/impl/strand_executor_service.ipp \
+ asio/detail/impl/strand_service.hpp \
+ asio/detail/impl/strand_service.ipp \
+ asio/detail/impl/thread_context.ipp \
+ asio/detail/impl/throw_error.ipp \
+ asio/detail/impl/timer_queue_ptime.ipp \
+ asio/detail/impl/timer_queue_set.ipp \
+ asio/detail/impl/win_event.ipp \
+ asio/detail/impl/win_iocp_file_service.ipp \
+ asio/detail/impl/win_iocp_handle_service.ipp \
+ asio/detail/impl/win_iocp_io_context.hpp \
+ asio/detail/impl/win_iocp_io_context.ipp \
+ asio/detail/impl/win_iocp_serial_port_service.ipp \
+ asio/detail/impl/win_iocp_socket_service_base.ipp \
+ asio/detail/impl/win_mutex.ipp \
+ asio/detail/impl/win_object_handle_service.ipp \
+ asio/detail/impl/winrt_ssocket_service_base.ipp \
+ asio/detail/impl/winrt_timer_scheduler.hpp \
+ asio/detail/impl/winrt_timer_scheduler.ipp \
+ asio/detail/impl/winsock_init.ipp \
+ asio/detail/impl/win_static_mutex.ipp \
+ asio/detail/impl/win_thread.ipp \
+ asio/detail/impl/win_tss_ptr.ipp \
+ asio/detail/initiate_defer.hpp \
+ asio/detail/initiate_dispatch.hpp \
+ asio/detail/initiate_post.hpp \
+ asio/detail/io_control.hpp \
+ asio/detail/io_object_impl.hpp \
+ asio/detail/io_uring_descriptor_read_at_op.hpp \
+ asio/detail/io_uring_descriptor_read_op.hpp \
+ asio/detail/io_uring_descriptor_service.hpp \
+ asio/detail/io_uring_descriptor_write_at_op.hpp \
+ asio/detail/io_uring_descriptor_write_op.hpp \
+ asio/detail/io_uring_file_service.hpp \
+ asio/detail/io_uring_null_buffers_op.hpp \
+ asio/detail/io_uring_operation.hpp \
+ asio/detail/io_uring_service.hpp \
+ asio/detail/io_uring_socket_accept_op.hpp \
+ asio/detail/io_uring_socket_connect_op.hpp \
+ asio/detail/io_uring_socket_recvfrom_op.hpp \
+ asio/detail/io_uring_socket_recvmsg_op.hpp \
+ asio/detail/io_uring_socket_recv_op.hpp \
+ asio/detail/io_uring_socket_send_op.hpp \
+ asio/detail/io_uring_socket_sendto_op.hpp \
+ asio/detail/io_uring_socket_service_base.hpp \
+ asio/detail/io_uring_socket_service.hpp \
+ asio/detail/io_uring_wait_op.hpp \
+ asio/detail/is_buffer_sequence.hpp \
+ asio/detail/is_executor.hpp \
+ asio/detail/keyword_tss_ptr.hpp \
+ asio/detail/kqueue_reactor.hpp \
+ asio/detail/limits.hpp \
+ asio/detail/local_free_on_block_exit.hpp \
+ asio/detail/memory.hpp \
+ asio/detail/mutex.hpp \
+ asio/detail/non_const_lvalue.hpp \
+ asio/detail/noncopyable.hpp \
+ asio/detail/null_event.hpp \
+ asio/detail/null_fenced_block.hpp \
+ asio/detail/null_global.hpp \
+ asio/detail/null_mutex.hpp \
+ asio/detail/null_reactor.hpp \
+ asio/detail/null_signal_blocker.hpp \
+ asio/detail/null_socket_service.hpp \
+ asio/detail/null_static_mutex.hpp \
+ asio/detail/null_thread.hpp \
+ asio/detail/null_tss_ptr.hpp \
+ asio/detail/object_pool.hpp \
+ asio/detail/old_win_sdk_compat.hpp \
+ asio/detail/operation.hpp \
+ asio/detail/op_queue.hpp \
+ asio/detail/pipe_select_interrupter.hpp \
+ asio/detail/pop_options.hpp \
+ asio/detail/posix_event.hpp \
+ asio/detail/posix_fd_set_adapter.hpp \
+ asio/detail/posix_global.hpp \
+ asio/detail/posix_mutex.hpp \
+ asio/detail/posix_serial_port_service.hpp \
+ asio/detail/posix_signal_blocker.hpp \
+ asio/detail/posix_static_mutex.hpp \
+ asio/detail/posix_thread.hpp \
+ asio/detail/posix_tss_ptr.hpp \
+ asio/detail/push_options.hpp \
+ asio/detail/reactive_descriptor_service.hpp \
+ asio/detail/reactive_null_buffers_op.hpp \
+ asio/detail/reactive_socket_accept_op.hpp \
+ asio/detail/reactive_socket_connect_op.hpp \
+ asio/detail/reactive_socket_recvfrom_op.hpp \
+ asio/detail/reactive_socket_recvmsg_op.hpp \
+ asio/detail/reactive_socket_recv_op.hpp \
+ asio/detail/reactive_socket_send_op.hpp \
+ asio/detail/reactive_socket_sendto_op.hpp \
+ asio/detail/reactive_socket_service_base.hpp \
+ asio/detail/reactive_socket_service.hpp \
+ asio/detail/reactive_wait_op.hpp \
+ asio/detail/reactor.hpp \
+ asio/detail/reactor_op.hpp \
+ asio/detail/reactor_op_queue.hpp \
+ asio/detail/recycling_allocator.hpp \
+ asio/detail/regex_fwd.hpp \
+ asio/detail/resolve_endpoint_op.hpp \
+ asio/detail/resolve_op.hpp \
+ asio/detail/resolve_query_op.hpp \
+ asio/detail/resolver_service_base.hpp \
+ asio/detail/resolver_service.hpp \
+ asio/detail/scheduler.hpp \
+ asio/detail/scheduler_operation.hpp \
+ asio/detail/scheduler_task.hpp \
+ asio/detail/scheduler_thread_info.hpp \
+ asio/detail/scoped_lock.hpp \
+ asio/detail/scoped_ptr.hpp \
+ asio/detail/select_interrupter.hpp \
+ asio/detail/select_reactor.hpp \
+ asio/detail/service_registry.hpp \
+ asio/detail/signal_blocker.hpp \
+ asio/detail/signal_handler.hpp \
+ asio/detail/signal_init.hpp \
+ asio/detail/signal_op.hpp \
+ asio/detail/signal_set_service.hpp \
+ asio/detail/socket_holder.hpp \
+ asio/detail/socket_ops.hpp \
+ asio/detail/socket_option.hpp \
+ asio/detail/socket_select_interrupter.hpp \
+ asio/detail/socket_types.hpp \
+ asio/detail/source_location.hpp \
+ asio/detail/static_mutex.hpp \
+ asio/detail/std_event.hpp \
+ asio/detail/std_fenced_block.hpp \
+ asio/detail/std_global.hpp \
+ asio/detail/std_mutex.hpp \
+ asio/detail/std_static_mutex.hpp \
+ asio/detail/std_thread.hpp \
+ asio/detail/strand_executor_service.hpp \
+ asio/detail/strand_service.hpp \
+ asio/detail/string_view.hpp \
+ asio/detail/thread_context.hpp \
+ asio/detail/thread_group.hpp \
+ asio/detail/thread.hpp \
+ asio/detail/thread_info_base.hpp \
+ asio/detail/throw_error.hpp \
+ asio/detail/throw_exception.hpp \
+ asio/detail/timer_queue_base.hpp \
+ asio/detail/timer_queue.hpp \
+ asio/detail/timer_queue_ptime.hpp \
+ asio/detail/timer_queue_set.hpp \
+ asio/detail/timer_scheduler_fwd.hpp \
+ asio/detail/timer_scheduler.hpp \
+ asio/detail/tss_ptr.hpp \
+ asio/detail/type_traits.hpp \
+ asio/detail/utility.hpp \
+ asio/detail/wait_handler.hpp \
+ asio/detail/wait_op.hpp \
+ asio/detail/winapp_thread.hpp \
+ asio/detail/wince_thread.hpp \
+ asio/detail/win_event.hpp \
+ asio/detail/win_fd_set_adapter.hpp \
+ asio/detail/win_global.hpp \
+ asio/detail/win_iocp_file_service.hpp \
+ asio/detail/win_iocp_handle_read_op.hpp \
+ asio/detail/win_iocp_handle_service.hpp \
+ asio/detail/win_iocp_handle_write_op.hpp \
+ asio/detail/win_iocp_io_context.hpp \
+ asio/detail/win_iocp_null_buffers_op.hpp \
+ asio/detail/win_iocp_operation.hpp \
+ asio/detail/win_iocp_overlapped_op.hpp \
+ asio/detail/win_iocp_overlapped_ptr.hpp \
+ asio/detail/win_iocp_serial_port_service.hpp \
+ asio/detail/win_iocp_socket_accept_op.hpp \
+ asio/detail/win_iocp_socket_connect_op.hpp \
+ asio/detail/win_iocp_socket_recvfrom_op.hpp \
+ asio/detail/win_iocp_socket_recvmsg_op.hpp \
+ asio/detail/win_iocp_socket_recv_op.hpp \
+ asio/detail/win_iocp_socket_send_op.hpp \
+ asio/detail/win_iocp_socket_service_base.hpp \
+ asio/detail/win_iocp_socket_service.hpp \
+ asio/detail/win_iocp_thread_info.hpp \
+ asio/detail/win_iocp_wait_op.hpp \
+ asio/detail/win_mutex.hpp \
+ asio/detail/win_object_handle_service.hpp \
+ asio/detail/winrt_async_manager.hpp \
+ asio/detail/winrt_async_op.hpp \
+ asio/detail/winrt_resolve_op.hpp \
+ asio/detail/winrt_resolver_service.hpp \
+ asio/detail/winrt_socket_connect_op.hpp \
+ asio/detail/winrt_socket_recv_op.hpp \
+ asio/detail/winrt_socket_send_op.hpp \
+ asio/detail/winrt_ssocket_service_base.hpp \
+ asio/detail/winrt_ssocket_service.hpp \
+ asio/detail/winrt_timer_scheduler.hpp \
+ asio/detail/winrt_utils.hpp \
+ asio/detail/winsock_init.hpp \
+ asio/detail/win_static_mutex.hpp \
+ asio/detail/win_thread.hpp \
+ asio/detail/win_tss_ptr.hpp \
+ asio/detail/work_dispatcher.hpp \
+ asio/detail/wrapped_handler.hpp \
+ asio/dispatch.hpp \
+ asio/error_code.hpp \
+ asio/error.hpp \
+ asio/execution.hpp \
+ asio/execution_context.hpp \
+ asio/execution/allocator.hpp \
+ asio/execution/any_executor.hpp \
+ asio/execution/bad_executor.hpp \
+ asio/execution/blocking.hpp \
+ asio/execution/blocking_adaptation.hpp \
+ asio/execution/context.hpp \
+ asio/execution/context_as.hpp \
+ asio/execution/executor.hpp \
+ asio/execution/impl/bad_executor.ipp \
+ asio/execution/invocable_archetype.hpp \
+ asio/execution/mapping.hpp \
+ asio/execution/occupancy.hpp \
+ asio/execution/outstanding_work.hpp \
+ asio/execution/prefer_only.hpp \
+ asio/execution/relationship.hpp \
+ asio/executor.hpp \
+ asio/executor_work_guard.hpp \
+ asio/experimental/append.hpp \
+ asio/experimental/as_single.hpp \
+ asio/experimental/as_tuple.hpp \
+ asio/experimental/awaitable_operators.hpp \
+ asio/experimental/basic_channel.hpp \
+ asio/experimental/basic_concurrent_channel.hpp \
+ asio/experimental/cancellation_condition.hpp \
+ asio/experimental/channel.hpp \
+ asio/experimental/channel_error.hpp \
+ asio/experimental/channel_traits.hpp \
+ asio/experimental/co_composed.hpp \
+ asio/experimental/co_spawn.hpp \
+ asio/experimental/concurrent_channel.hpp \
+ asio/experimental/coro.hpp \
+ asio/experimental/coro_traits.hpp \
+ asio/experimental/deferred.hpp \
+ asio/experimental/detail/channel_handler.hpp \
+ asio/experimental/detail/channel_message.hpp \
+ asio/experimental/detail/channel_operation.hpp \
+ asio/experimental/detail/channel_payload.hpp \
+ asio/experimental/detail/channel_receive_op.hpp \
+ asio/experimental/detail/channel_send_functions.hpp \
+ asio/experimental/detail/channel_send_op.hpp \
+ asio/experimental/detail/channel_service.hpp \
+ asio/experimental/detail/coro_completion_handler.hpp \
+ asio/experimental/detail/coro_promise_allocator.hpp \
+ asio/experimental/detail/has_signature.hpp \
+ asio/experimental/detail/impl/channel_service.hpp \
+ asio/experimental/detail/partial_promise.hpp \
+ asio/experimental/impl/as_single.hpp \
+ asio/experimental/impl/channel_error.ipp \
+ asio/experimental/impl/co_composed.hpp \
+ asio/experimental/impl/coro.hpp \
+ asio/experimental/impl/parallel_group.hpp \
+ asio/experimental/impl/promise.hpp \
+ asio/experimental/impl/use_coro.hpp \
+ asio/experimental/impl/use_promise.hpp \
+ asio/experimental/parallel_group.hpp \
+ asio/experimental/prepend.hpp \
+ asio/experimental/promise.hpp \
+ asio/experimental/use_coro.hpp \
+ asio/experimental/use_promise.hpp \
+ asio/file_base.hpp \
+ asio/generic/basic_endpoint.hpp \
+ asio/generic/datagram_protocol.hpp \
+ asio/generic/detail/endpoint.hpp \
+ asio/generic/detail/impl/endpoint.ipp \
+ asio/generic/raw_protocol.hpp \
+ asio/generic/seq_packet_protocol.hpp \
+ asio/generic/stream_protocol.hpp \
+ asio/handler_continuation_hook.hpp \
+ asio/high_resolution_timer.hpp \
+ asio.hpp \
+ asio/impl/any_completion_executor.ipp \
+ asio/impl/any_io_executor.ipp \
+ asio/impl/append.hpp \
+ asio/impl/as_tuple.hpp \
+ asio/impl/awaitable.hpp \
+ asio/impl/buffered_read_stream.hpp \
+ asio/impl/buffered_write_stream.hpp \
+ asio/impl/cancellation_signal.ipp \
+ asio/impl/co_spawn.hpp \
+ asio/impl/connect.hpp \
+ asio/impl/connect_pipe.hpp \
+ asio/impl/connect_pipe.ipp \
+ asio/impl/consign.hpp \
+ asio/impl/deferred.hpp \
+ asio/impl/detached.hpp \
+ asio/impl/error_code.ipp \
+ asio/impl/error.ipp \
+ asio/impl/execution_context.hpp \
+ asio/impl/execution_context.ipp \
+ asio/impl/executor.hpp \
+ asio/impl/executor.ipp \
+ asio/impl/io_context.hpp \
+ asio/impl/io_context.ipp \
+ asio/impl/multiple_exceptions.ipp \
+ asio/impl/prepend.hpp \
+ asio/impl/read_at.hpp \
+ asio/impl/read.hpp \
+ asio/impl/read_until.hpp \
+ asio/impl/redirect_error.hpp \
+ asio/impl/serial_port_base.hpp \
+ asio/impl/serial_port_base.ipp \
+ asio/impl/spawn.hpp \
+ asio/impl/src.hpp \
+ asio/impl/system_context.hpp \
+ asio/impl/system_context.ipp \
+ asio/impl/system_executor.hpp \
+ asio/impl/thread_pool.hpp \
+ asio/impl/thread_pool.ipp \
+ asio/impl/use_awaitable.hpp \
+ asio/impl/use_future.hpp \
+ asio/impl/write_at.hpp \
+ asio/impl/write.hpp \
+ asio/io_context.hpp \
+ asio/io_context_strand.hpp \
+ asio/io_service.hpp \
+ asio/io_service_strand.hpp \
+ asio/ip/address.hpp \
+ asio/ip/address_v4.hpp \
+ asio/ip/address_v4_iterator.hpp \
+ asio/ip/address_v4_range.hpp \
+ asio/ip/address_v6.hpp \
+ asio/ip/address_v6_iterator.hpp \
+ asio/ip/address_v6_range.hpp \
+ asio/ip/bad_address_cast.hpp \
+ asio/ip/basic_endpoint.hpp \
+ asio/ip/basic_resolver_entry.hpp \
+ asio/ip/basic_resolver.hpp \
+ asio/ip/basic_resolver_iterator.hpp \
+ asio/ip/basic_resolver_query.hpp \
+ asio/ip/basic_resolver_results.hpp \
+ asio/ip/detail/endpoint.hpp \
+ asio/ip/detail/impl/endpoint.ipp \
+ asio/ip/detail/socket_option.hpp \
+ asio/ip/host_name.hpp \
+ asio/ip/icmp.hpp \
+ asio/ip/impl/address.hpp \
+ asio/ip/impl/address.ipp \
+ asio/ip/impl/address_v4.hpp \
+ asio/ip/impl/address_v4.ipp \
+ asio/ip/impl/address_v6.hpp \
+ asio/ip/impl/address_v6.ipp \
+ asio/ip/impl/basic_endpoint.hpp \
+ asio/ip/impl/host_name.ipp \
+ asio/ip/impl/network_v4.hpp \
+ asio/ip/impl/network_v4.ipp \
+ asio/ip/impl/network_v6.hpp \
+ asio/ip/impl/network_v6.ipp \
+ asio/ip/multicast.hpp \
+ asio/ip/network_v4.hpp \
+ asio/ip/network_v6.hpp \
+ asio/ip/resolver_base.hpp \
+ asio/ip/resolver_query_base.hpp \
+ asio/ip/tcp.hpp \
+ asio/ip/udp.hpp \
+ asio/ip/unicast.hpp \
+ asio/ip/v6_only.hpp \
+ asio/is_applicable_property.hpp \
+ asio/is_contiguous_iterator.hpp \
+ asio/is_executor.hpp \
+ asio/is_read_buffered.hpp \
+ asio/is_write_buffered.hpp \
+ asio/local/basic_endpoint.hpp \
+ asio/local/connect_pair.hpp \
+ asio/local/datagram_protocol.hpp \
+ asio/local/detail/endpoint.hpp \
+ asio/local/detail/impl/endpoint.ipp \
+ asio/local/seq_packet_protocol.hpp \
+ asio/local/stream_protocol.hpp \
+ asio/multiple_exceptions.hpp \
+ asio/packaged_task.hpp \
+ asio/placeholders.hpp \
+ asio/posix/basic_descriptor.hpp \
+ asio/posix/basic_stream_descriptor.hpp \
+ asio/posix/descriptor_base.hpp \
+ asio/posix/descriptor.hpp \
+ asio/posix/stream_descriptor.hpp \
+ asio/post.hpp \
+ asio/prefer.hpp \
+ asio/prepend.hpp \
+ asio/query.hpp \
+ asio/random_access_file.hpp \
+ asio/read_at.hpp \
+ asio/read.hpp \
+ asio/read_until.hpp \
+ asio/readable_pipe.hpp \
+ asio/recycling_allocator.hpp \
+ asio/redirect_error.hpp \
+ asio/registered_buffer.hpp \
+ asio/require.hpp \
+ asio/require_concept.hpp \
+ asio/serial_port_base.hpp \
+ asio/serial_port.hpp \
+ asio/signal_set_base.hpp \
+ asio/signal_set.hpp \
+ asio/socket_base.hpp \
+ asio/spawn.hpp \
+ asio/ssl/context_base.hpp \
+ asio/ssl/context.hpp \
+ asio/ssl/detail/buffered_handshake_op.hpp \
+ asio/ssl/detail/engine.hpp \
+ asio/ssl/detail/handshake_op.hpp \
+ asio/ssl/detail/impl/engine.ipp \
+ asio/ssl/detail/impl/openssl_init.ipp \
+ asio/ssl/detail/io.hpp \
+ asio/ssl/detail/openssl_init.hpp \
+ asio/ssl/detail/openssl_types.hpp \
+ asio/ssl/detail/password_callback.hpp \
+ asio/ssl/detail/read_op.hpp \
+ asio/ssl/detail/shutdown_op.hpp \
+ asio/ssl/detail/stream_core.hpp \
+ asio/ssl/detail/verify_callback.hpp \
+ asio/ssl/detail/write_op.hpp \
+ asio/ssl/error.hpp \
+ asio/ssl.hpp \
+ asio/ssl/host_name_verification.hpp \
+ asio/ssl/impl/context.hpp \
+ asio/ssl/impl/context.ipp \
+ asio/ssl/impl/error.ipp \
+ asio/ssl/impl/host_name_verification.ipp \
+ asio/ssl/impl/rfc2818_verification.ipp \
+ asio/ssl/impl/src.hpp \
+ asio/ssl/rfc2818_verification.hpp \
+ asio/ssl/stream_base.hpp \
+ asio/ssl/stream.hpp \
+ asio/ssl/verify_context.hpp \
+ asio/ssl/verify_mode.hpp \
+ asio/static_thread_pool.hpp \
+ asio/steady_timer.hpp \
+ asio/strand.hpp \
+ asio/streambuf.hpp \
+ asio/stream_file.hpp \
+ asio/system_context.hpp \
+ asio/system_error.hpp \
+ asio/system_executor.hpp \
+ asio/system_timer.hpp \
+ asio/this_coro.hpp \
+ asio/thread.hpp \
+ asio/thread_pool.hpp \
+ asio/time_traits.hpp \
+ asio/traits/equality_comparable.hpp \
+ asio/traits/execute_member.hpp \
+ asio/traits/prefer_free.hpp \
+ asio/traits/prefer_member.hpp \
+ asio/traits/query_free.hpp \
+ asio/traits/query_member.hpp \
+ asio/traits/query_static_constexpr_member.hpp \
+ asio/traits/require_concept_free.hpp \
+ asio/traits/require_concept_member.hpp \
+ asio/traits/require_free.hpp \
+ asio/traits/require_member.hpp \
+ asio/traits/static_query.hpp \
+ asio/traits/static_require.hpp \
+ asio/traits/static_require_concept.hpp \
+ asio/ts/buffer.hpp \
+ asio/ts/executor.hpp \
+ asio/ts/internet.hpp \
+ asio/ts/io_context.hpp \
+ asio/ts/netfwd.hpp \
+ asio/ts/net.hpp \
+ asio/ts/socket.hpp \
+ asio/ts/timer.hpp \
+ asio/unyield.hpp \
+ asio/use_awaitable.hpp \
+ asio/use_future.hpp \
+ asio/uses_executor.hpp \
+ asio/version.hpp \
+ asio/wait_traits.hpp \
+ asio/windows/basic_object_handle.hpp \
+ asio/windows/basic_overlapped_handle.hpp \
+ asio/windows/basic_random_access_handle.hpp \
+ asio/windows/basic_stream_handle.hpp \
+ asio/windows/object_handle.hpp \
+ asio/windows/overlapped_handle.hpp \
+ asio/windows/overlapped_ptr.hpp \
+ asio/windows/random_access_handle.hpp \
+ asio/windows/stream_handle.hpp \
+ asio/writable_pipe.hpp \
+ asio/write_at.hpp \
+ asio/write.hpp \
+ asio/yield.hpp
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
+
+all: all-am
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign include/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign include/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+install-nobase_includeHEADERS: $(nobase_include_HEADERS)
+ @$(NORMAL_INSTALL)
+ @list='$(nobase_include_HEADERS)'; test -n "$(includedir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \
+ fi; \
+ $(am__nobase_list) | while read dir files; do \
+ xfiles=; for file in $$files; do \
+ if test -f "$$file"; then xfiles="$$xfiles $$file"; \
+ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \
+ test -z "$$xfiles" || { \
+ test "x$$dir" = x. || { \
+ echo " $(MKDIR_P) '$(DESTDIR)$(includedir)/$$dir'"; \
+ $(MKDIR_P) "$(DESTDIR)$(includedir)/$$dir"; }; \
+ echo " $(INSTALL_HEADER) $$xfiles '$(DESTDIR)$(includedir)/$$dir'"; \
+ $(INSTALL_HEADER) $$xfiles "$(DESTDIR)$(includedir)/$$dir" || exit $$?; }; \
+ done
+
+uninstall-nobase_includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(nobase_include_HEADERS)'; test -n "$(includedir)" || list=; \
+ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \
+ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(includedir)"; do \
+ test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+ done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-nobase_includeHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-nobase_includeHEADERS
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+ cscopelist-am ctags ctags-am distclean distclean-generic \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-nobase_includeHEADERS install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+ pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+ uninstall-nobase_includeHEADERS
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/3rdparty/asio/include/asio.hpp b/3rdparty/asio/include/asio.hpp
new file mode 100644
index 00000000000..3421b58bdae
--- /dev/null
+++ b/3rdparty/asio/include/asio.hpp
@@ -0,0 +1,199 @@
+//
+// asio.hpp
+// ~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/any_completion_executor.hpp"
+#include "asio/any_completion_handler.hpp"
+#include "asio/any_io_executor.hpp"
+#include "asio/append.hpp"
+#include "asio/as_tuple.hpp"
+#include "asio/associated_allocator.hpp"
+#include "asio/associated_cancellation_slot.hpp"
+#include "asio/associated_executor.hpp"
+#include "asio/associated_immediate_executor.hpp"
+#include "asio/associator.hpp"
+#include "asio/async_result.hpp"
+#include "asio/awaitable.hpp"
+#include "asio/basic_datagram_socket.hpp"
+#include "asio/basic_deadline_timer.hpp"
+#include "asio/basic_file.hpp"
+#include "asio/basic_io_object.hpp"
+#include "asio/basic_random_access_file.hpp"
+#include "asio/basic_raw_socket.hpp"
+#include "asio/basic_readable_pipe.hpp"
+#include "asio/basic_seq_packet_socket.hpp"
+#include "asio/basic_serial_port.hpp"
+#include "asio/basic_signal_set.hpp"
+#include "asio/basic_socket.hpp"
+#include "asio/basic_socket_acceptor.hpp"
+#include "asio/basic_socket_iostream.hpp"
+#include "asio/basic_socket_streambuf.hpp"
+#include "asio/basic_stream_file.hpp"
+#include "asio/basic_stream_socket.hpp"
+#include "asio/basic_streambuf.hpp"
+#include "asio/basic_waitable_timer.hpp"
+#include "asio/basic_writable_pipe.hpp"
+#include "asio/bind_allocator.hpp"
+#include "asio/bind_cancellation_slot.hpp"
+#include "asio/bind_executor.hpp"
+#include "asio/bind_immediate_executor.hpp"
+#include "asio/buffer.hpp"
+#include "asio/buffer_registration.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/cancellation_signal.hpp"
+#include "asio/cancellation_state.hpp"
+#include "asio/cancellation_type.hpp"
+#include "asio/co_spawn.hpp"
+#include "asio/completion_condition.hpp"
+#include "asio/compose.hpp"
+#include "asio/connect.hpp"
+#include "asio/connect_pipe.hpp"
+#include "asio/consign.hpp"
+#include "asio/coroutine.hpp"
+#include "asio/deadline_timer.hpp"
+#include "asio/defer.hpp"
+#include "asio/deferred.hpp"
+#include "asio/detached.hpp"
+#include "asio/dispatch.hpp"
+#include "asio/error.hpp"
+#include "asio/error_code.hpp"
+#include "asio/execution.hpp"
+#include "asio/execution/allocator.hpp"
+#include "asio/execution/any_executor.hpp"
+#include "asio/execution/blocking.hpp"
+#include "asio/execution/blocking_adaptation.hpp"
+#include "asio/execution/context.hpp"
+#include "asio/execution/context_as.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/execution/invocable_archetype.hpp"
+#include "asio/execution/mapping.hpp"
+#include "asio/execution/occupancy.hpp"
+#include "asio/execution/outstanding_work.hpp"
+#include "asio/execution/prefer_only.hpp"
+#include "asio/execution/relationship.hpp"
+#include "asio/executor.hpp"
+#include "asio/executor_work_guard.hpp"
+#include "asio/file_base.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_continuation_hook.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/network_v4.hpp"
+#include "asio/ip/network_v6.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/tcp.hpp"
+#include "asio/ip/udp.hpp"
+#include "asio/ip/unicast.hpp"
+#include "asio/ip/v6_only.hpp"
+#include "asio/is_applicable_property.hpp"
+#include "asio/is_contiguous_iterator.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/seq_packet_protocol.hpp"
+#include "asio/local/stream_protocol.hpp"
+#include "asio/multiple_exceptions.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/post.hpp"
+#include "asio/prefer.hpp"
+#include "asio/prepend.hpp"
+#include "asio/query.hpp"
+#include "asio/random_access_file.hpp"
+#include "asio/read.hpp"
+#include "asio/read_at.hpp"
+#include "asio/read_until.hpp"
+#include "asio/readable_pipe.hpp"
+#include "asio/recycling_allocator.hpp"
+#include "asio/redirect_error.hpp"
+#include "asio/registered_buffer.hpp"
+#include "asio/require.hpp"
+#include "asio/require_concept.hpp"
+#include "asio/serial_port.hpp"
+#include "asio/serial_port_base.hpp"
+#include "asio/signal_set.hpp"
+#include "asio/signal_set_base.hpp"
+#include "asio/socket_base.hpp"
+#include "asio/static_thread_pool.hpp"
+#include "asio/steady_timer.hpp"
+#include "asio/strand.hpp"
+#include "asio/stream_file.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/this_coro.hpp"
+#include "asio/thread.hpp"
+#include "asio/thread_pool.hpp"
+#include "asio/time_traits.hpp"
+#include "asio/use_awaitable.hpp"
+#include "asio/use_future.hpp"
+#include "asio/uses_executor.hpp"
+#include "asio/version.hpp"
+#include "asio/wait_traits.hpp"
+#include "asio/windows/basic_object_handle.hpp"
+#include "asio/windows/basic_overlapped_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/overlapped_handle.hpp"
+#include "asio/windows/overlapped_ptr.hpp"
+#include "asio/windows/random_access_handle.hpp"
+#include "asio/windows/stream_handle.hpp"
+#include "asio/writable_pipe.hpp"
+#include "asio/write.hpp"
+#include "asio/write_at.hpp"
+
+#endif // ASIO_HPP
diff --git a/3rdparty/asio/include/asio/any_completion_executor.hpp b/3rdparty/asio/include/asio/any_completion_executor.hpp
new file mode 100644
index 00000000000..650ff7bafdd
--- /dev/null
+++ b/3rdparty/asio/include/asio/any_completion_executor.hpp
@@ -0,0 +1,336 @@
+//
+// any_completion_executor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_ANY_COMPLETION_EXECUTOR_HPP
+#define ASIO_ANY_COMPLETION_EXECUTOR_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_USE_TS_EXECUTOR_AS_DEFAULT)
+# include "asio/executor.hpp"
+#else // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+# include "asio/execution.hpp"
+#endif // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+typedef executor any_completion_executor;
+
+#else // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+/// Polymorphic executor type for use with I/O objects.
+/**
+ * The @c any_completion_executor type is a polymorphic executor that supports
+ * the set of properties required for the execution of completion handlers. It
+ * is defined as the execution::any_executor class template parameterised as
+ * follows:
+ * @code execution::any_executor<
+ * execution::prefer_only<execution::outstanding_work_t::tracked_t>,
+ * execution::prefer_only<execution::outstanding_work_t::untracked_t>
+ * execution::prefer_only<execution::relationship_t::fork_t>,
+ * execution::prefer_only<execution::relationship_t::continuation_t>
+ * > @endcode
+ */
+class any_completion_executor :
+#if defined(GENERATING_DOCUMENTATION)
+ public execution::any_executor<...>
+#else // defined(GENERATING_DOCUMENTATION)
+ public execution::any_executor<
+ execution::prefer_only<execution::outstanding_work_t::tracked_t>,
+ execution::prefer_only<execution::outstanding_work_t::untracked_t>,
+ execution::prefer_only<execution::relationship_t::fork_t>,
+ execution::prefer_only<execution::relationship_t::continuation_t>
+ >
+#endif // defined(GENERATING_DOCUMENTATION)
+{
+public:
+#if !defined(GENERATING_DOCUMENTATION)
+ typedef execution::any_executor<
+ execution::prefer_only<execution::outstanding_work_t::tracked_t>,
+ execution::prefer_only<execution::outstanding_work_t::untracked_t>,
+ execution::prefer_only<execution::relationship_t::fork_t>,
+ execution::prefer_only<execution::relationship_t::continuation_t>
+ > base_type;
+
+ typedef void supportable_properties_type(
+ execution::prefer_only<execution::outstanding_work_t::tracked_t>,
+ execution::prefer_only<execution::outstanding_work_t::untracked_t>,
+ execution::prefer_only<execution::relationship_t::fork_t>,
+ execution::prefer_only<execution::relationship_t::continuation_t>
+ );
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ /// Default constructor.
+ ASIO_DECL any_completion_executor() noexcept;
+
+ /// Construct in an empty state. Equivalent effects to default constructor.
+ ASIO_DECL any_completion_executor(nullptr_t) noexcept;
+
+ /// Copy constructor.
+ ASIO_DECL any_completion_executor(
+ const any_completion_executor& e) noexcept;
+
+ /// Move constructor.
+ ASIO_DECL any_completion_executor(
+ any_completion_executor&& e) noexcept;
+
+ /// Construct to point to the same target as another any_executor.
+#if defined(GENERATING_DOCUMENTATION)
+ template <class... OtherSupportableProperties>
+ any_completion_executor(
+ execution::any_executor<OtherSupportableProperties...> e);
+#else // defined(GENERATING_DOCUMENTATION)
+ template <typename OtherAnyExecutor>
+ any_completion_executor(OtherAnyExecutor e,
+ constraint_t<
+ conditional<
+ !is_same<OtherAnyExecutor, any_completion_executor>::value
+ && is_base_of<execution::detail::any_executor_base,
+ OtherAnyExecutor>::value,
+ typename execution::detail::supportable_properties<
+ 0, supportable_properties_type>::template
+ is_valid_target<OtherAnyExecutor>,
+ false_type
+ >::type::value
+ > = 0)
+ : base_type(static_cast<OtherAnyExecutor&&>(e))
+ {
+ }
+#endif // defined(GENERATING_DOCUMENTATION)
+
+ /// Construct to point to the same target as another any_executor.
+#if defined(GENERATING_DOCUMENTATION)
+ template <class... OtherSupportableProperties>
+ any_completion_executor(std::nothrow_t,
+ execution::any_executor<OtherSupportableProperties...> e);
+#else // defined(GENERATING_DOCUMENTATION)
+ template <typename OtherAnyExecutor>
+ any_completion_executor(std::nothrow_t, OtherAnyExecutor e,
+ constraint_t<
+ conditional<
+ !is_same<OtherAnyExecutor, any_completion_executor>::value
+ && is_base_of<execution::detail::any_executor_base,
+ OtherAnyExecutor>::value,
+ typename execution::detail::supportable_properties<
+ 0, supportable_properties_type>::template
+ is_valid_target<OtherAnyExecutor>,
+ false_type
+ >::type::value
+ > = 0) noexcept
+ : base_type(std::nothrow, static_cast<OtherAnyExecutor&&>(e))
+ {
+ }
+#endif // defined(GENERATING_DOCUMENTATION)
+
+ /// Construct to point to the same target as another any_executor.
+ ASIO_DECL any_completion_executor(std::nothrow_t,
+ const any_completion_executor& e) noexcept;
+
+ /// Construct to point to the same target as another any_executor.
+ ASIO_DECL any_completion_executor(std::nothrow_t,
+ any_completion_executor&& e) noexcept;
+
+ /// Construct a polymorphic wrapper for the specified executor.
+#if defined(GENERATING_DOCUMENTATION)
+ template <ASIO_EXECUTION_EXECUTOR Executor>
+ any_completion_executor(Executor e);
+#else // defined(GENERATING_DOCUMENTATION)
+ template <ASIO_EXECUTION_EXECUTOR Executor>
+ any_completion_executor(Executor e,
+ constraint_t<
+ conditional<
+ !is_same<Executor, any_completion_executor>::value
+ && !is_base_of<execution::detail::any_executor_base,
+ Executor>::value,
+ execution::detail::is_valid_target_executor<
+ Executor, supportable_properties_type>,
+ false_type
+ >::type::value
+ > = 0)
+ : base_type(static_cast<Executor&&>(e))
+ {
+ }
+#endif // defined(GENERATING_DOCUMENTATION)
+
+ /// Construct a polymorphic wrapper for the specified executor.
+#if defined(GENERATING_DOCUMENTATION)
+ template <ASIO_EXECUTION_EXECUTOR Executor>
+ any_completion_executor(std::nothrow_t, Executor e);
+#else // defined(GENERATING_DOCUMENTATION)
+ template <ASIO_EXECUTION_EXECUTOR Executor>
+ any_completion_executor(std::nothrow_t, Executor e,
+ constraint_t<
+ conditional<
+ !is_same<Executor, any_completion_executor>::value
+ && !is_base_of<execution::detail::any_executor_base,
+ Executor>::value,
+ execution::detail::is_valid_target_executor<
+ Executor, supportable_properties_type>,
+ false_type
+ >::type::value
+ > = 0) noexcept
+ : base_type(std::nothrow, static_cast<Executor&&>(e))
+ {
+ }
+#endif // defined(GENERATING_DOCUMENTATION)
+
+ /// Assignment operator.
+ ASIO_DECL any_completion_executor& operator=(
+ const any_completion_executor& e) noexcept;
+
+ /// Move assignment operator.
+ ASIO_DECL any_completion_executor& operator=(
+ any_completion_executor&& e) noexcept;
+
+ /// Assignment operator that sets the polymorphic wrapper to the empty state.
+ ASIO_DECL any_completion_executor& operator=(nullptr_t);
+
+ /// Destructor.
+ ASIO_DECL ~any_completion_executor();
+
+ /// Swap targets with another polymorphic wrapper.
+ ASIO_DECL void swap(any_completion_executor& other) noexcept;
+
+ /// Obtain a polymorphic wrapper with the specified property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require and asio::prefer customisation points.
+ *
+ * For example:
+ * @code any_completion_executor ex = ...;
+ * auto ex2 = asio::require(ex, execution::relationship.fork); @endcode
+ */
+ template <typename Property>
+ any_completion_executor require(const Property& p,
+ constraint_t<
+ traits::require_member<const base_type&, const Property&>::is_valid
+ > = 0) const
+ {
+ return static_cast<const base_type&>(*this).require(p);
+ }
+
+ /// Obtain a polymorphic wrapper with the specified property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::prefer customisation point.
+ *
+ * For example:
+ * @code any_completion_executor ex = ...;
+ * auto ex2 = asio::prefer(ex, execution::relationship.fork); @endcode
+ */
+ template <typename Property>
+ any_completion_executor prefer(const Property& p,
+ constraint_t<
+ traits::prefer_member<const base_type&, const Property&>::is_valid
+ > = 0) const
+ {
+ return static_cast<const base_type&>(*this).prefer(p);
+ }
+};
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <>
+ASIO_DECL any_completion_executor any_completion_executor::prefer(
+ const execution::outstanding_work_t::tracked_t&, int) const;
+
+template <>
+ASIO_DECL any_completion_executor any_completion_executor::prefer(
+ const execution::outstanding_work_t::untracked_t&, int) const;
+
+template <>
+ASIO_DECL any_completion_executor any_completion_executor::prefer(
+ const execution::relationship_t::fork_t&, int) const;
+
+template <>
+ASIO_DECL any_completion_executor any_completion_executor::prefer(
+ const execution::relationship_t::continuation_t&, int) const;
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <>
+struct equality_comparable<any_completion_executor>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename F>
+struct execute_member<any_completion_executor, F>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = false;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename Prop>
+struct query_member<any_completion_executor, Prop> :
+ query_member<any_completion_executor::base_type, Prop>
+{
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename Prop>
+struct require_member<any_completion_executor, Prop> :
+ require_member<any_completion_executor::base_type, Prop>
+{
+ typedef any_completion_executor result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+template <typename Prop>
+struct prefer_member<any_completion_executor, Prop> :
+ prefer_member<any_completion_executor::base_type, Prop>
+{
+ typedef any_completion_executor result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+} // namespace traits
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+#endif // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#if defined(ASIO_HEADER_ONLY) \
+ && !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+# include "asio/impl/any_completion_executor.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+ // && !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+#endif // ASIO_ANY_COMPLETION_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/any_completion_handler.hpp b/3rdparty/asio/include/asio/any_completion_handler.hpp
new file mode 100644
index 00000000000..45b3e75fec7
--- /dev/null
+++ b/3rdparty/asio/include/asio/any_completion_handler.hpp
@@ -0,0 +1,822 @@
+//
+// any_completion_handler.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_ANY_COMPLETION_HANDLER_HPP
+#define ASIO_ANY_COMPLETION_HANDLER_HPP
+
+#include "asio/detail/config.hpp"
+#include <cstring>
+#include <functional>
+#include <memory>
+#include <utility>
+#include "asio/any_completion_executor.hpp"
+#include "asio/any_io_executor.hpp"
+#include "asio/associated_allocator.hpp"
+#include "asio/associated_cancellation_slot.hpp"
+#include "asio/associated_executor.hpp"
+#include "asio/associated_immediate_executor.hpp"
+#include "asio/cancellation_state.hpp"
+#include "asio/recycling_allocator.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class any_completion_handler_impl_base
+{
+public:
+ template <typename S>
+ explicit any_completion_handler_impl_base(S&& slot)
+ : cancel_state_(static_cast<S&&>(slot), enable_total_cancellation())
+ {
+ }
+
+ cancellation_slot get_cancellation_slot() const noexcept
+ {
+ return cancel_state_.slot();
+ }
+
+private:
+ cancellation_state cancel_state_;
+};
+
+template <typename Handler>
+class any_completion_handler_impl :
+ public any_completion_handler_impl_base
+{
+public:
+ template <typename S, typename H>
+ any_completion_handler_impl(S&& slot, H&& h)
+ : any_completion_handler_impl_base(static_cast<S&&>(slot)),
+ handler_(static_cast<H&&>(h))
+ {
+ }
+
+ struct uninit_deleter
+ {
+ typename std::allocator_traits<
+ associated_allocator_t<Handler,
+ asio::recycling_allocator<void>>>::template
+ rebind_alloc<any_completion_handler_impl> alloc;
+
+ void operator()(any_completion_handler_impl* ptr)
+ {
+ std::allocator_traits<decltype(alloc)>::deallocate(alloc, ptr, 1);
+ }
+ };
+
+ struct deleter
+ {
+ typename std::allocator_traits<
+ associated_allocator_t<Handler,
+ asio::recycling_allocator<void>>>::template
+ rebind_alloc<any_completion_handler_impl> alloc;
+
+ void operator()(any_completion_handler_impl* ptr)
+ {
+ std::allocator_traits<decltype(alloc)>::destroy(alloc, ptr);
+ std::allocator_traits<decltype(alloc)>::deallocate(alloc, ptr, 1);
+ }
+ };
+
+ template <typename S, typename H>
+ static any_completion_handler_impl* create(S&& slot, H&& h)
+ {
+ uninit_deleter d{
+ (get_associated_allocator)(h,
+ asio::recycling_allocator<void>())};
+
+ std::unique_ptr<any_completion_handler_impl, uninit_deleter> uninit_ptr(
+ std::allocator_traits<decltype(d.alloc)>::allocate(d.alloc, 1), d);
+
+ any_completion_handler_impl* ptr =
+ new (uninit_ptr.get()) any_completion_handler_impl(
+ static_cast<S&&>(slot), static_cast<H&&>(h));
+
+ uninit_ptr.release();
+ return ptr;
+ }
+
+ void destroy()
+ {
+ deleter d{
+ (get_associated_allocator)(handler_,
+ asio::recycling_allocator<void>())};
+
+ d(this);
+ }
+
+ any_completion_executor executor(
+ const any_completion_executor& candidate) const noexcept
+ {
+ return any_completion_executor(std::nothrow,
+ (get_associated_executor)(handler_, candidate));
+ }
+
+ any_completion_executor immediate_executor(
+ const any_io_executor& candidate) const noexcept
+ {
+ return any_completion_executor(std::nothrow,
+ (get_associated_immediate_executor)(handler_, candidate));
+ }
+
+ void* allocate(std::size_t size, std::size_t align) const
+ {
+ typename std::allocator_traits<
+ associated_allocator_t<Handler,
+ asio::recycling_allocator<void>>>::template
+ rebind_alloc<unsigned char> alloc(
+ (get_associated_allocator)(handler_,
+ asio::recycling_allocator<void>()));
+
+ std::size_t space = size + align - 1;
+ unsigned char* base =
+ std::allocator_traits<decltype(alloc)>::allocate(
+ alloc, space + sizeof(std::ptrdiff_t));
+
+ void* p = base;
+ if (detail::align(align, size, p, space))
+ {
+ std::ptrdiff_t off = static_cast<unsigned char*>(p) - base;
+ std::memcpy(static_cast<unsigned char*>(p) + size, &off, sizeof(off));
+ return p;
+ }
+
+ std::bad_alloc ex;
+ asio::detail::throw_exception(ex);
+ return nullptr;
+ }
+
+ void deallocate(void* p, std::size_t size, std::size_t align) const
+ {
+ if (p)
+ {
+ typename std::allocator_traits<
+ associated_allocator_t<Handler,
+ asio::recycling_allocator<void>>>::template
+ rebind_alloc<unsigned char> alloc(
+ (get_associated_allocator)(handler_,
+ asio::recycling_allocator<void>()));
+
+ std::ptrdiff_t off;
+ std::memcpy(&off, static_cast<unsigned char*>(p) + size, sizeof(off));
+ unsigned char* base = static_cast<unsigned char*>(p) - off;
+
+ std::allocator_traits<decltype(alloc)>::deallocate(
+ alloc, base, size + align -1 + sizeof(std::ptrdiff_t));
+ }
+ }
+
+ template <typename... Args>
+ void call(Args&&... args)
+ {
+ deleter d{
+ (get_associated_allocator)(handler_,
+ asio::recycling_allocator<void>())};
+
+ std::unique_ptr<any_completion_handler_impl, deleter> ptr(this, d);
+ Handler handler(static_cast<Handler&&>(handler_));
+ ptr.reset();
+
+ static_cast<Handler&&>(handler)(
+ static_cast<Args&&>(args)...);
+ }
+
+private:
+ Handler handler_;
+};
+
+template <typename Signature>
+class any_completion_handler_call_fn;
+
+template <typename R, typename... Args>
+class any_completion_handler_call_fn<R(Args...)>
+{
+public:
+ using type = void(*)(any_completion_handler_impl_base*, Args...);
+
+ constexpr any_completion_handler_call_fn(type fn)
+ : call_fn_(fn)
+ {
+ }
+
+ void call(any_completion_handler_impl_base* impl, Args... args) const
+ {
+ call_fn_(impl, static_cast<Args&&>(args)...);
+ }
+
+ template <typename Handler>
+ static void impl(any_completion_handler_impl_base* impl, Args... args)
+ {
+ static_cast<any_completion_handler_impl<Handler>*>(impl)->call(
+ static_cast<Args&&>(args)...);
+ }
+
+private:
+ type call_fn_;
+};
+
+template <typename... Signatures>
+class any_completion_handler_call_fns;
+
+template <typename Signature>
+class any_completion_handler_call_fns<Signature> :
+ public any_completion_handler_call_fn<Signature>
+{
+public:
+ using any_completion_handler_call_fn<
+ Signature>::any_completion_handler_call_fn;
+ using any_completion_handler_call_fn<Signature>::call;
+};
+
+template <typename Signature, typename... Signatures>
+class any_completion_handler_call_fns<Signature, Signatures...> :
+ public any_completion_handler_call_fn<Signature>,
+ public any_completion_handler_call_fns<Signatures...>
+{
+public:
+ template <typename CallFn, typename... CallFns>
+ constexpr any_completion_handler_call_fns(CallFn fn, CallFns... fns)
+ : any_completion_handler_call_fn<Signature>(fn),
+ any_completion_handler_call_fns<Signatures...>(fns...)
+ {
+ }
+
+ using any_completion_handler_call_fn<Signature>::call;
+ using any_completion_handler_call_fns<Signatures...>::call;
+};
+
+class any_completion_handler_destroy_fn
+{
+public:
+ using type = void(*)(any_completion_handler_impl_base*);
+
+ constexpr any_completion_handler_destroy_fn(type fn)
+ : destroy_fn_(fn)
+ {
+ }
+
+ void destroy(any_completion_handler_impl_base* impl) const
+ {
+ destroy_fn_(impl);
+ }
+
+ template <typename Handler>
+ static void impl(any_completion_handler_impl_base* impl)
+ {
+ static_cast<any_completion_handler_impl<Handler>*>(impl)->destroy();
+ }
+
+private:
+ type destroy_fn_;
+};
+
+class any_completion_handler_executor_fn
+{
+public:
+ using type = any_completion_executor(*)(
+ any_completion_handler_impl_base*, const any_completion_executor&);
+
+ constexpr any_completion_handler_executor_fn(type fn)
+ : executor_fn_(fn)
+ {
+ }
+
+ any_completion_executor executor(any_completion_handler_impl_base* impl,
+ const any_completion_executor& candidate) const
+ {
+ return executor_fn_(impl, candidate);
+ }
+
+ template <typename Handler>
+ static any_completion_executor impl(any_completion_handler_impl_base* impl,
+ const any_completion_executor& candidate)
+ {
+ return static_cast<any_completion_handler_impl<Handler>*>(impl)->executor(
+ candidate);
+ }
+
+private:
+ type executor_fn_;
+};
+
+class any_completion_handler_immediate_executor_fn
+{
+public:
+ using type = any_completion_executor(*)(
+ any_completion_handler_impl_base*, const any_io_executor&);
+
+ constexpr any_completion_handler_immediate_executor_fn(type fn)
+ : immediate_executor_fn_(fn)
+ {
+ }
+
+ any_completion_executor immediate_executor(
+ any_completion_handler_impl_base* impl,
+ const any_io_executor& candidate) const
+ {
+ return immediate_executor_fn_(impl, candidate);
+ }
+
+ template <typename Handler>
+ static any_completion_executor impl(any_completion_handler_impl_base* impl,
+ const any_io_executor& candidate)
+ {
+ return static_cast<any_completion_handler_impl<Handler>*>(
+ impl)->immediate_executor(candidate);
+ }
+
+private:
+ type immediate_executor_fn_;
+};
+
+class any_completion_handler_allocate_fn
+{
+public:
+ using type = void*(*)(any_completion_handler_impl_base*,
+ std::size_t, std::size_t);
+
+ constexpr any_completion_handler_allocate_fn(type fn)
+ : allocate_fn_(fn)
+ {
+ }
+
+ void* allocate(any_completion_handler_impl_base* impl,
+ std::size_t size, std::size_t align) const
+ {
+ return allocate_fn_(impl, size, align);
+ }
+
+ template <typename Handler>
+ static void* impl(any_completion_handler_impl_base* impl,
+ std::size_t size, std::size_t align)
+ {
+ return static_cast<any_completion_handler_impl<Handler>*>(impl)->allocate(
+ size, align);
+ }
+
+private:
+ type allocate_fn_;
+};
+
+class any_completion_handler_deallocate_fn
+{
+public:
+ using type = void(*)(any_completion_handler_impl_base*,
+ void*, std::size_t, std::size_t);
+
+ constexpr any_completion_handler_deallocate_fn(type fn)
+ : deallocate_fn_(fn)
+ {
+ }
+
+ void deallocate(any_completion_handler_impl_base* impl,
+ void* p, std::size_t size, std::size_t align) const
+ {
+ deallocate_fn_(impl, p, size, align);
+ }
+
+ template <typename Handler>
+ static void impl(any_completion_handler_impl_base* impl,
+ void* p, std::size_t size, std::size_t align)
+ {
+ static_cast<any_completion_handler_impl<Handler>*>(impl)->deallocate(
+ p, size, align);
+ }
+
+private:
+ type deallocate_fn_;
+};
+
+template <typename... Signatures>
+class any_completion_handler_fn_table
+ : private any_completion_handler_destroy_fn,
+ private any_completion_handler_executor_fn,
+ private any_completion_handler_immediate_executor_fn,
+ private any_completion_handler_allocate_fn,
+ private any_completion_handler_deallocate_fn,
+ private any_completion_handler_call_fns<Signatures...>
+{
+public:
+ template <typename... CallFns>
+ constexpr any_completion_handler_fn_table(
+ any_completion_handler_destroy_fn::type destroy_fn,
+ any_completion_handler_executor_fn::type executor_fn,
+ any_completion_handler_immediate_executor_fn::type immediate_executor_fn,
+ any_completion_handler_allocate_fn::type allocate_fn,
+ any_completion_handler_deallocate_fn::type deallocate_fn,
+ CallFns... call_fns)
+ : any_completion_handler_destroy_fn(destroy_fn),
+ any_completion_handler_executor_fn(executor_fn),
+ any_completion_handler_immediate_executor_fn(immediate_executor_fn),
+ any_completion_handler_allocate_fn(allocate_fn),
+ any_completion_handler_deallocate_fn(deallocate_fn),
+ any_completion_handler_call_fns<Signatures...>(call_fns...)
+ {
+ }
+
+ using any_completion_handler_destroy_fn::destroy;
+ using any_completion_handler_executor_fn::executor;
+ using any_completion_handler_immediate_executor_fn::immediate_executor;
+ using any_completion_handler_allocate_fn::allocate;
+ using any_completion_handler_deallocate_fn::deallocate;
+ using any_completion_handler_call_fns<Signatures...>::call;
+};
+
+template <typename Handler, typename... Signatures>
+struct any_completion_handler_fn_table_instance
+{
+ static constexpr any_completion_handler_fn_table<Signatures...>
+ value = any_completion_handler_fn_table<Signatures...>(
+ &any_completion_handler_destroy_fn::impl<Handler>,
+ &any_completion_handler_executor_fn::impl<Handler>,
+ &any_completion_handler_immediate_executor_fn::impl<Handler>,
+ &any_completion_handler_allocate_fn::impl<Handler>,
+ &any_completion_handler_deallocate_fn::impl<Handler>,
+ &any_completion_handler_call_fn<Signatures>::template impl<Handler>...);
+};
+
+template <typename Handler, typename... Signatures>
+constexpr any_completion_handler_fn_table<Signatures...>
+any_completion_handler_fn_table_instance<Handler, Signatures...>::value;
+
+} // namespace detail
+
+template <typename... Signatures>
+class any_completion_handler;
+
+/// An allocator type that forwards memory allocation operations through an
+/// instance of @c any_completion_handler.
+template <typename T, typename... Signatures>
+class any_completion_handler_allocator
+{
+private:
+ template <typename...>
+ friend class any_completion_handler;
+
+ template <typename, typename...>
+ friend class any_completion_handler_allocator;
+
+ const detail::any_completion_handler_fn_table<Signatures...>* fn_table_;
+ detail::any_completion_handler_impl_base* impl_;
+
+ constexpr any_completion_handler_allocator(int,
+ const any_completion_handler<Signatures...>& h) noexcept
+ : fn_table_(h.fn_table_),
+ impl_(h.impl_)
+ {
+ }
+
+public:
+ /// The type of objects that may be allocated by the allocator.
+ typedef T value_type;
+
+ /// Rebinds an allocator to another value type.
+ template <typename U>
+ struct rebind
+ {
+ /// Specifies the type of the rebound allocator.
+ typedef any_completion_handler_allocator<U, Signatures...> other;
+ };
+
+ /// Construct from another @c any_completion_handler_allocator.
+ template <typename U>
+ constexpr any_completion_handler_allocator(
+ const any_completion_handler_allocator<U, Signatures...>& a)
+ noexcept
+ : fn_table_(a.fn_table_),
+ impl_(a.impl_)
+ {
+ }
+
+ /// Equality operator.
+ constexpr bool operator==(
+ const any_completion_handler_allocator& other) const noexcept
+ {
+ return fn_table_ == other.fn_table_ && impl_ == other.impl_;
+ }
+
+ /// Inequality operator.
+ constexpr bool operator!=(
+ const any_completion_handler_allocator& other) const noexcept
+ {
+ return fn_table_ != other.fn_table_ || impl_ != other.impl_;
+ }
+
+ /// Allocate space for @c n objects of the allocator's value type.
+ T* allocate(std::size_t n) const
+ {
+ if (fn_table_)
+ {
+ return static_cast<T*>(
+ fn_table_->allocate(
+ impl_, sizeof(T) * n, alignof(T)));
+ }
+ std::bad_alloc ex;
+ asio::detail::throw_exception(ex);
+ return nullptr;
+ }
+
+ /// Deallocate space for @c n objects of the allocator's value type.
+ void deallocate(T* p, std::size_t n) const
+ {
+ fn_table_->deallocate(impl_, p, sizeof(T) * n, alignof(T));
+ }
+};
+
+/// A protoco-allocator type that may be rebound to obtain an allocator that
+/// forwards memory allocation operations through an instance of
+/// @c any_completion_handler.
+template <typename... Signatures>
+class any_completion_handler_allocator<void, Signatures...>
+{
+private:
+ template <typename...>
+ friend class any_completion_handler;
+
+ template <typename, typename...>
+ friend class any_completion_handler_allocator;
+
+ const detail::any_completion_handler_fn_table<Signatures...>* fn_table_;
+ detail::any_completion_handler_impl_base* impl_;
+
+ constexpr any_completion_handler_allocator(int,
+ const any_completion_handler<Signatures...>& h) noexcept
+ : fn_table_(h.fn_table_),
+ impl_(h.impl_)
+ {
+ }
+
+public:
+ /// @c void as no objects can be allocated through a proto-allocator.
+ typedef void value_type;
+
+ /// Rebinds an allocator to another value type.
+ template <typename U>
+ struct rebind
+ {
+ /// Specifies the type of the rebound allocator.
+ typedef any_completion_handler_allocator<U, Signatures...> other;
+ };
+
+ /// Construct from another @c any_completion_handler_allocator.
+ template <typename U>
+ constexpr any_completion_handler_allocator(
+ const any_completion_handler_allocator<U, Signatures...>& a)
+ noexcept
+ : fn_table_(a.fn_table_),
+ impl_(a.impl_)
+ {
+ }
+
+ /// Equality operator.
+ constexpr bool operator==(
+ const any_completion_handler_allocator& other) const noexcept
+ {
+ return fn_table_ == other.fn_table_ && impl_ == other.impl_;
+ }
+
+ /// Inequality operator.
+ constexpr bool operator!=(
+ const any_completion_handler_allocator& other) const noexcept
+ {
+ return fn_table_ != other.fn_table_ || impl_ != other.impl_;
+ }
+};
+
+/// Polymorphic wrapper for completion handlers.
+/**
+ * The @c any_completion_handler class template is a polymorphic wrapper for
+ * completion handlers that propagates the associated executor, associated
+ * allocator, and associated cancellation slot through a type-erasing interface.
+ *
+ * When using @c any_completion_handler, specify one or more completion
+ * signatures as template parameters. These will dictate the arguments that may
+ * be passed to the handler through the polymorphic interface.
+ *
+ * Typical uses for @c any_completion_handler include:
+ *
+ * @li Separate compilation of asynchronous operation implementations.
+ *
+ * @li Enabling interoperability between asynchronous operations and virtual
+ * functions.
+ */
+template <typename... Signatures>
+class any_completion_handler
+{
+#if !defined(GENERATING_DOCUMENTATION)
+private:
+ template <typename, typename...>
+ friend class any_completion_handler_allocator;
+
+ template <typename, typename>
+ friend struct associated_executor;
+
+ template <typename, typename>
+ friend struct associated_immediate_executor;
+
+ const detail::any_completion_handler_fn_table<Signatures...>* fn_table_;
+ detail::any_completion_handler_impl_base* impl_;
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+public:
+ /// The associated allocator type.
+ using allocator_type = any_completion_handler_allocator<void, Signatures...>;
+
+ /// The associated cancellation slot type.
+ using cancellation_slot_type = cancellation_slot;
+
+ /// Construct an @c any_completion_handler in an empty state, without a target
+ /// object.
+ constexpr any_completion_handler()
+ : fn_table_(nullptr),
+ impl_(nullptr)
+ {
+ }
+
+ /// Construct an @c any_completion_handler in an empty state, without a target
+ /// object.
+ constexpr any_completion_handler(nullptr_t)
+ : fn_table_(nullptr),
+ impl_(nullptr)
+ {
+ }
+
+ /// Construct an @c any_completion_handler to contain the specified target.
+ template <typename H, typename Handler = decay_t<H>>
+ any_completion_handler(H&& h,
+ constraint_t<
+ !is_same<decay_t<H>, any_completion_handler>::value
+ > = 0)
+ : fn_table_(
+ &detail::any_completion_handler_fn_table_instance<
+ Handler, Signatures...>::value),
+ impl_(detail::any_completion_handler_impl<Handler>::create(
+ (get_associated_cancellation_slot)(h), static_cast<H&&>(h)))
+ {
+ }
+
+ /// Move-construct an @c any_completion_handler from another.
+ /**
+ * After the operation, the moved-from object @c other has no target.
+ */
+ any_completion_handler(any_completion_handler&& other) noexcept
+ : fn_table_(other.fn_table_),
+ impl_(other.impl_)
+ {
+ other.fn_table_ = nullptr;
+ other.impl_ = nullptr;
+ }
+
+ /// Move-assign an @c any_completion_handler from another.
+ /**
+ * After the operation, the moved-from object @c other has no target.
+ */
+ any_completion_handler& operator=(
+ any_completion_handler&& other) noexcept
+ {
+ any_completion_handler(
+ static_cast<any_completion_handler&&>(other)).swap(*this);
+ return *this;
+ }
+
+ /// Assignment operator that sets the polymorphic wrapper to the empty state.
+ any_completion_handler& operator=(nullptr_t) noexcept
+ {
+ any_completion_handler().swap(*this);
+ return *this;
+ }
+
+ /// Destructor.
+ ~any_completion_handler()
+ {
+ if (impl_)
+ fn_table_->destroy(impl_);
+ }
+
+ /// Test if the polymorphic wrapper is empty.
+ constexpr explicit operator bool() const noexcept
+ {
+ return impl_ != nullptr;
+ }
+
+ /// Test if the polymorphic wrapper is non-empty.
+ constexpr bool operator!() const noexcept
+ {
+ return impl_ == nullptr;
+ }
+
+ /// Swap the content of an @c any_completion_handler with another.
+ void swap(any_completion_handler& other) noexcept
+ {
+ std::swap(fn_table_, other.fn_table_);
+ std::swap(impl_, other.impl_);
+ }
+
+ /// Get the associated allocator.
+ allocator_type get_allocator() const noexcept
+ {
+ return allocator_type(0, *this);
+ }
+
+ /// Get the associated cancellation slot.
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return impl_ ? impl_->get_cancellation_slot() : cancellation_slot_type();
+ }
+
+ /// Function call operator.
+ /**
+ * Invokes target completion handler with the supplied arguments.
+ *
+ * This function may only be called once, as the target handler is moved from.
+ * The polymorphic wrapper is left in an empty state.
+ *
+ * Throws @c std::bad_function_call if the polymorphic wrapper is empty.
+ */
+ template <typename... Args>
+ auto operator()(Args&&... args)
+ -> decltype(fn_table_->call(impl_, static_cast<Args&&>(args)...))
+ {
+ if (detail::any_completion_handler_impl_base* impl = impl_)
+ {
+ impl_ = nullptr;
+ return fn_table_->call(impl, static_cast<Args&&>(args)...);
+ }
+ std::bad_function_call ex;
+ asio::detail::throw_exception(ex);
+ }
+
+ /// Equality operator.
+ friend constexpr bool operator==(
+ const any_completion_handler& a, nullptr_t) noexcept
+ {
+ return a.impl_ == nullptr;
+ }
+
+ /// Equality operator.
+ friend constexpr bool operator==(
+ nullptr_t, const any_completion_handler& b) noexcept
+ {
+ return nullptr == b.impl_;
+ }
+
+ /// Inequality operator.
+ friend constexpr bool operator!=(
+ const any_completion_handler& a, nullptr_t) noexcept
+ {
+ return a.impl_ != nullptr;
+ }
+
+ /// Inequality operator.
+ friend constexpr bool operator!=(
+ nullptr_t, const any_completion_handler& b) noexcept
+ {
+ return nullptr != b.impl_;
+ }
+};
+
+template <typename... Signatures, typename Candidate>
+struct associated_executor<any_completion_handler<Signatures...>, Candidate>
+{
+ using type = any_completion_executor;
+
+ static type get(const any_completion_handler<Signatures...>& handler,
+ const Candidate& candidate = Candidate()) noexcept
+ {
+ any_completion_executor any_candidate(std::nothrow, candidate);
+ return handler.fn_table_
+ ? handler.fn_table_->executor(handler.impl_, any_candidate)
+ : any_candidate;
+ }
+};
+
+template <typename... Signatures, typename Candidate>
+struct associated_immediate_executor<
+ any_completion_handler<Signatures...>, Candidate>
+{
+ using type = any_completion_executor;
+
+ static type get(const any_completion_handler<Signatures...>& handler,
+ const Candidate& candidate = Candidate()) noexcept
+ {
+ any_io_executor any_candidate(std::nothrow, candidate);
+ return handler.fn_table_
+ ? handler.fn_table_->immediate_executor(handler.impl_, any_candidate)
+ : any_candidate;
+ }
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_ANY_COMPLETION_HANDLER_HPP
diff --git a/3rdparty/asio/include/asio/any_io_executor.hpp b/3rdparty/asio/include/asio/any_io_executor.hpp
new file mode 100644
index 00000000000..d35acf44ae3
--- /dev/null
+++ b/3rdparty/asio/include/asio/any_io_executor.hpp
@@ -0,0 +1,351 @@
+//
+// any_io_executor.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_ANY_IO_EXECUTOR_HPP
+#define ASIO_ANY_IO_EXECUTOR_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_USE_TS_EXECUTOR_AS_DEFAULT)
+# include "asio/executor.hpp"
+#else // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+# include "asio/execution.hpp"
+# include "asio/execution_context.hpp"
+#endif // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+typedef executor any_io_executor;
+
+#else // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+/// Polymorphic executor type for use with I/O objects.
+/**
+ * The @c any_io_executor type is a polymorphic executor that supports the set
+ * of properties required by I/O objects. It is defined as the
+ * execution::any_executor class template parameterised as follows:
+ * @code execution::any_executor<
+ * execution::context_as_t<execution_context&>,
+ * execution::blocking_t::never_t,
+ * execution::prefer_only<execution::blocking_t::possibly_t>,
+ * execution::prefer_only<execution::outstanding_work_t::tracked_t>,
+ * execution::prefer_only<execution::outstanding_work_t::untracked_t>,
+ * execution::prefer_only<execution::relationship_t::fork_t>,
+ * execution::prefer_only<execution::relationship_t::continuation_t>
+ * > @endcode
+ */
+class any_io_executor :
+#if defined(GENERATING_DOCUMENTATION)
+ public execution::any_executor<...>
+#else // defined(GENERATING_DOCUMENTATION)
+ public execution::any_executor<
+ execution::context_as_t<execution_context&>,
+ execution::blocking_t::never_t,
+ execution::prefer_only<execution::blocking_t::possibly_t>,
+ execution::prefer_only<execution::outstanding_work_t::tracked_t>,
+ execution::prefer_only<execution::outstanding_work_t::untracked_t>,
+ execution::prefer_only<execution::relationship_t::fork_t>,
+ execution::prefer_only<execution::relationship_t::continuation_t>
+ >
+#endif // defined(GENERATING_DOCUMENTATION)
+{
+public:
+#if !defined(GENERATING_DOCUMENTATION)
+ typedef execution::any_executor<
+ execution::context_as_t<execution_context&>,
+ execution::blocking_t::never_t,
+ execution::prefer_only<execution::blocking_t::possibly_t>,
+ execution::prefer_only<execution::outstanding_work_t::tracked_t>,
+ execution::prefer_only<execution::outstanding_work_t::untracked_t>,
+ execution::prefer_only<execution::relationship_t::fork_t>,
+ execution::prefer_only<execution::relationship_t::continuation_t>
+ > base_type;
+
+ typedef void supportable_properties_type(
+ execution::context_as_t<execution_context&>,
+ execution::blocking_t::never_t,
+ execution::prefer_only<execution::blocking_t::possibly_t>,
+ execution::prefer_only<execution::outstanding_work_t::tracked_t>,
+ execution::prefer_only<execution::outstanding_work_t::untracked_t>,
+ execution::prefer_only<execution::relationship_t::fork_t>,
+ execution::prefer_only<execution::relationship_t::continuation_t>
+ );
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ /// Default constructor.
+ ASIO_DECL any_io_executor() noexcept;
+
+ /// Construct in an empty state. Equivalent effects to default constructor.
+ ASIO_DECL any_io_executor(nullptr_t) noexcept;
+
+ /// Copy constructor.
+ ASIO_DECL any_io_executor(const any_io_executor& e) noexcept;
+
+ /// Move constructor.
+ ASIO_DECL any_io_executor(any_io_executor&& e) noexcept;
+
+ /// Construct to point to the same target as another any_executor.
+#if defined(GENERATING_DOCUMENTATION)
+ template <class... OtherSupportableProperties>
+ any_io_executor(execution::any_executor<OtherSupportableProperties...> e);
+#else // defined(GENERATING_DOCUMENTATION)
+ template <typename OtherAnyExecutor>
+ any_io_executor(OtherAnyExecutor e,
+ constraint_t<
+ conditional_t<
+ !is_same<OtherAnyExecutor, any_io_executor>::value
+ && is_base_of<execution::detail::any_executor_base,
+ OtherAnyExecutor>::value,
+ typename execution::detail::supportable_properties<
+ 0, supportable_properties_type>::template
+ is_valid_target<OtherAnyExecutor>,
+ false_type
+ >::value
+ > = 0)
+ : base_type(static_cast<OtherAnyExecutor&&>(e))
+ {
+ }
+#endif // defined(GENERATING_DOCUMENTATION)
+
+ /// Construct to point to the same target as another any_executor.
+#if defined(GENERATING_DOCUMENTATION)
+ template <class... OtherSupportableProperties>
+ any_io_executor(std::nothrow_t,
+ execution::any_executor<OtherSupportableProperties...> e);
+#else // defined(GENERATING_DOCUMENTATION)
+ template <typename OtherAnyExecutor>
+ any_io_executor(std::nothrow_t, OtherAnyExecutor e,
+ constraint_t<
+ conditional_t<
+ !is_same<OtherAnyExecutor, any_io_executor>::value
+ && is_base_of<execution::detail::any_executor_base,
+ OtherAnyExecutor>::value,
+ typename execution::detail::supportable_properties<
+ 0, supportable_properties_type>::template
+ is_valid_target<OtherAnyExecutor>,
+ false_type
+ >::value
+ > = 0) noexcept
+ : base_type(std::nothrow, static_cast<OtherAnyExecutor&&>(e))
+ {
+ }
+#endif // defined(GENERATING_DOCUMENTATION)
+
+ /// Construct to point to the same target as another any_executor.
+ ASIO_DECL any_io_executor(std::nothrow_t,
+ const any_io_executor& e) noexcept;
+
+ /// Construct to point to the same target as another any_executor.
+ ASIO_DECL any_io_executor(std::nothrow_t, any_io_executor&& e) noexcept;
+
+ /// Construct a polymorphic wrapper for the specified executor.
+#if defined(GENERATING_DOCUMENTATION)
+ template <ASIO_EXECUTION_EXECUTOR Executor>
+ any_io_executor(Executor e);
+#else // defined(GENERATING_DOCUMENTATION)
+ template <ASIO_EXECUTION_EXECUTOR Executor>
+ any_io_executor(Executor e,
+ constraint_t<
+ conditional_t<
+ !is_same<Executor, any_io_executor>::value
+ && !is_base_of<execution::detail::any_executor_base,
+ Executor>::value,
+ execution::detail::is_valid_target_executor<
+ Executor, supportable_properties_type>,
+ false_type
+ >::value
+ > = 0)
+ : base_type(static_cast<Executor&&>(e))
+ {
+ }
+#endif // defined(GENERATING_DOCUMENTATION)
+
+ /// Construct a polymorphic wrapper for the specified executor.
+#if defined(GENERATING_DOCUMENTATION)
+ template <ASIO_EXECUTION_EXECUTOR Executor>
+ any_io_executor(std::nothrow_t, Executor e);
+#else // defined(GENERATING_DOCUMENTATION)
+ template <ASIO_EXECUTION_EXECUTOR Executor>
+ any_io_executor(std::nothrow_t, Executor e,
+ constraint_t<
+ conditional_t<
+ !is_same<Executor, any_io_executor>::value
+ && !is_base_of<execution::detail::any_executor_base,
+ Executor>::value,
+ execution::detail::is_valid_target_executor<
+ Executor, supportable_properties_type>,
+ false_type
+ >::value
+ > = 0) noexcept
+ : base_type(std::nothrow, static_cast<Executor&&>(e))
+ {
+ }
+#endif // defined(GENERATING_DOCUMENTATION)
+
+ /// Assignment operator.
+ ASIO_DECL any_io_executor& operator=(
+ const any_io_executor& e) noexcept;
+
+ /// Move assignment operator.
+ ASIO_DECL any_io_executor& operator=(any_io_executor&& e) noexcept;
+
+ /// Assignment operator that sets the polymorphic wrapper to the empty state.
+ ASIO_DECL any_io_executor& operator=(nullptr_t);
+
+ /// Destructor.
+ ASIO_DECL ~any_io_executor();
+
+ /// Swap targets with another polymorphic wrapper.
+ ASIO_DECL void swap(any_io_executor& other) noexcept;
+
+ /// Obtain a polymorphic wrapper with the specified property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require and asio::prefer customisation points.
+ *
+ * For example:
+ * @code any_io_executor ex = ...;
+ * auto ex2 = asio::require(ex, execution::blocking.possibly); @endcode
+ */
+ template <typename Property>
+ any_io_executor require(const Property& p,
+ constraint_t<
+ traits::require_member<const base_type&, const Property&>::is_valid
+ > = 0) const
+ {
+ return static_cast<const base_type&>(*this).require(p);
+ }
+
+ /// Obtain a polymorphic wrapper with the specified property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::prefer customisation point.
+ *
+ * For example:
+ * @code any_io_executor ex = ...;
+ * auto ex2 = asio::prefer(ex, execution::blocking.possibly); @endcode
+ */
+ template <typename Property>
+ any_io_executor prefer(const Property& p,
+ constraint_t<
+ traits::prefer_member<const base_type&, const Property&>::is_valid
+ > = 0) const
+ {
+ return static_cast<const base_type&>(*this).prefer(p);
+ }
+};
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <>
+ASIO_DECL any_io_executor any_io_executor::require(
+ const execution::blocking_t::never_t&, int) const;
+
+template <>
+ASIO_DECL any_io_executor any_io_executor::prefer(
+ const execution::blocking_t::possibly_t&, int) const;
+
+template <>
+ASIO_DECL any_io_executor any_io_executor::prefer(
+ const execution::outstanding_work_t::tracked_t&, int) const;
+
+template <>
+ASIO_DECL any_io_executor any_io_executor::prefer(
+ const execution::outstanding_work_t::untracked_t&, int) const;
+
+template <>
+ASIO_DECL any_io_executor any_io_executor::prefer(
+ const execution::relationship_t::fork_t&, int) const;
+
+template <>
+ASIO_DECL any_io_executor any_io_executor::prefer(
+ const execution::relationship_t::continuation_t&, int) const;
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <>
+struct equality_comparable<any_io_executor>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename F>
+struct execute_member<any_io_executor, F>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = false;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename Prop>
+struct query_member<any_io_executor, Prop> :
+ query_member<any_io_executor::base_type, Prop>
+{
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename Prop>
+struct require_member<any_io_executor, Prop> :
+ require_member<any_io_executor::base_type, Prop>
+{
+ typedef any_io_executor result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+template <typename Prop>
+struct prefer_member<any_io_executor, Prop> :
+ prefer_member<any_io_executor::base_type, Prop>
+{
+ typedef any_io_executor result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+} // namespace traits
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+#endif // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#if defined(ASIO_HEADER_ONLY) \
+ && !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+# include "asio/impl/any_io_executor.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+ // && !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+#endif // ASIO_ANY_IO_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/append.hpp b/3rdparty/asio/include/asio/append.hpp
new file mode 100644
index 00000000000..04608924280
--- /dev/null
+++ b/3rdparty/asio/include/asio/append.hpp
@@ -0,0 +1,65 @@
+//
+// append.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_APPEND_HPP
+#define ASIO_APPEND_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <tuple>
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Completion token type used to specify that the completion handler
+/// arguments should be passed additional values after the results of the
+/// operation.
+template <typename CompletionToken, typename... Values>
+class append_t
+{
+public:
+ /// Constructor.
+ template <typename T, typename... V>
+ constexpr explicit append_t(T&& completion_token, V&&... values)
+ : token_(static_cast<T&&>(completion_token)),
+ values_(static_cast<V&&>(values)...)
+ {
+ }
+
+//private:
+ CompletionToken token_;
+ std::tuple<Values...> values_;
+};
+
+/// Completion token type used to specify that the completion handler
+/// arguments should be passed additional values after the results of the
+/// operation.
+template <typename CompletionToken, typename... Values>
+ASIO_NODISCARD inline constexpr
+append_t<decay_t<CompletionToken>, decay_t<Values>...>
+append(CompletionToken&& completion_token, Values&&... values)
+{
+ return append_t<decay_t<CompletionToken>, decay_t<Values>...>(
+ static_cast<CompletionToken&&>(completion_token),
+ static_cast<Values&&>(values)...);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/append.hpp"
+
+#endif // ASIO_APPEND_HPP
diff --git a/3rdparty/asio/include/asio/as_tuple.hpp b/3rdparty/asio/include/asio/as_tuple.hpp
new file mode 100644
index 00000000000..60008bda5c2
--- /dev/null
+++ b/3rdparty/asio/include/asio/as_tuple.hpp
@@ -0,0 +1,126 @@
+//
+// as_tuple.hpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_AS_TUPLE_HPP
+#define ASIO_AS_TUPLE_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 @ref completion_token adapter used to specify that the completion handler
+/// arguments should be combined into a single tuple argument.
+/**
+ * The as_tuple_t class is used to indicate that any arguments to the
+ * completion handler should be combined and passed as a single tuple argument.
+ * The arguments are first moved into a @c std::tuple and that tuple is then
+ * passed to the completion handler.
+ */
+template <typename CompletionToken>
+class as_tuple_t
+{
+public:
+ /// Tag type used to prevent the "default" constructor from being used for
+ /// conversions.
+ struct default_constructor_tag {};
+
+ /// Default constructor.
+ /**
+ * This constructor is only valid if the underlying completion token is
+ * default constructible and move constructible. The underlying completion
+ * token is itself defaulted as an argument to allow it to capture a source
+ * location.
+ */
+ constexpr as_tuple_t(
+ default_constructor_tag = default_constructor_tag(),
+ CompletionToken token = CompletionToken())
+ : token_(static_cast<CompletionToken&&>(token))
+ {
+ }
+
+ /// Constructor.
+ template <typename T>
+ constexpr explicit as_tuple_t(
+ T&& completion_token)
+ : token_(static_cast<T&&>(completion_token))
+ {
+ }
+
+ /// Adapts an executor to add the @c as_tuple_t completion token as the
+ /// default.
+ template <typename InnerExecutor>
+ struct executor_with_default : InnerExecutor
+ {
+ /// Specify @c as_tuple_t as the default completion token type.
+ typedef as_tuple_t default_completion_token_type;
+
+ /// Construct the adapted executor from the inner executor type.
+ template <typename InnerExecutor1>
+ executor_with_default(const InnerExecutor1& ex,
+ constraint_t<
+ conditional_t<
+ !is_same<InnerExecutor1, executor_with_default>::value,
+ is_convertible<InnerExecutor1, InnerExecutor>,
+ false_type
+ >::value
+ > = 0) noexcept
+ : InnerExecutor(ex)
+ {
+ }
+ };
+
+ /// Type alias to adapt an I/O object to use @c as_tuple_t as its
+ /// default completion token type.
+ template <typename T>
+ using as_default_on_t = typename T::template rebind_executor<
+ executor_with_default<typename T::executor_type>>::other;
+
+ /// Function helper to adapt an I/O object to use @c as_tuple_t as its
+ /// default completion token type.
+ template <typename T>
+ static typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other
+ as_default_on(T&& object)
+ {
+ return typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other(static_cast<T&&>(object));
+ }
+
+//private:
+ CompletionToken token_;
+};
+
+/// Adapt a @ref completion_token to specify that the completion handler
+/// arguments should be combined into a single tuple argument.
+template <typename CompletionToken>
+ASIO_NODISCARD inline
+constexpr as_tuple_t<decay_t<CompletionToken>>
+as_tuple(CompletionToken&& completion_token)
+{
+ return as_tuple_t<decay_t<CompletionToken>>(
+ static_cast<CompletionToken&&>(completion_token));
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/as_tuple.hpp"
+
+#endif // ASIO_AS_TUPLE_HPP
diff --git a/3rdparty/asio/include/asio/associated_allocator.hpp b/3rdparty/asio/include/asio/associated_allocator.hpp
new file mode 100644
index 00000000000..f21ea250efb
--- /dev/null
+++ b/3rdparty/asio/include/asio/associated_allocator.hpp
@@ -0,0 +1,214 @@
+//
+// associated_allocator.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <memory>
+#include "asio/associator.hpp"
+#include "asio/detail/functional.hpp"
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+template <typename T, typename Allocator>
+struct associated_allocator;
+
+namespace detail {
+
+template <typename T, typename = void>
+struct has_allocator_type : false_type
+{
+};
+
+template <typename T>
+struct has_allocator_type<T, void_t<typename T::allocator_type>> : true_type
+{
+};
+
+template <typename T, typename A, typename = void, typename = void>
+struct associated_allocator_impl
+{
+ typedef void asio_associated_allocator_is_unspecialised;
+
+ typedef A type;
+
+ static type get(const T&) noexcept
+ {
+ return type();
+ }
+
+ static const type& get(const T&, const A& a) noexcept
+ {
+ return a;
+ }
+};
+
+template <typename T, typename A>
+struct associated_allocator_impl<T, A, void_t<typename T::allocator_type>>
+{
+ typedef typename T::allocator_type type;
+
+ static auto get(const T& t) noexcept
+ -> decltype(t.get_allocator())
+ {
+ return t.get_allocator();
+ }
+
+ static auto get(const T& t, const A&) noexcept
+ -> decltype(t.get_allocator())
+ {
+ return t.get_allocator();
+ }
+};
+
+template <typename T, typename A>
+struct associated_allocator_impl<T, A,
+ enable_if_t<
+ !has_allocator_type<T>::value
+ >,
+ void_t<
+ typename associator<associated_allocator, T, A>::type
+ >> : associator<associated_allocator, T, A>
+{
+};
+
+} // 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 or a (possibly const) reference to @c
+ * type.
+ *
+ * @li Provide a noexcept static member function named @c get, callable as @c
+ * get(t,a) and with return type @c type or a (possibly const) reference to @c
+ * type.
+ */
+template <typename T, typename Allocator = std::allocator<void>>
+struct associated_allocator
+#if !defined(GENERATING_DOCUMENTATION)
+ : detail::associated_allocator_impl<T, Allocator>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+#if defined(GENERATING_DOCUMENTATION)
+ /// If @c T has a nested type @c allocator_type, <tt>T::allocator_type</tt>.
+ /// Otherwise @c Allocator.
+ typedef see_below type;
+
+ /// If @c T has a nested type @c allocator_type, returns
+ /// <tt>t.get_allocator()</tt>. Otherwise returns @c type().
+ static decltype(auto) get(const T& t) noexcept;
+
+ /// If @c T has a nested type @c allocator_type, returns
+ /// <tt>t.get_allocator()</tt>. Otherwise returns @c a.
+ static decltype(auto) get(const T& t, const Allocator& a) noexcept;
+#endif // defined(GENERATING_DOCUMENTATION)
+};
+
+/// Helper function to obtain an object's associated allocator.
+/**
+ * @returns <tt>associated_allocator<T>::get(t)</tt>
+ */
+template <typename T>
+ASIO_NODISCARD inline typename associated_allocator<T>::type
+get_associated_allocator(const T& t) noexcept
+{
+ return associated_allocator<T>::get(t);
+}
+
+/// Helper function to obtain an object's associated allocator.
+/**
+ * @returns <tt>associated_allocator<T, Allocator>::get(t, a)</tt>
+ */
+template <typename T, typename Allocator>
+ASIO_NODISCARD inline auto get_associated_allocator(
+ const T& t, const Allocator& a) noexcept
+ -> decltype(associated_allocator<T, Allocator>::get(t, a))
+{
+ return associated_allocator<T, Allocator>::get(t, a);
+}
+
+template <typename T, typename Allocator = std::allocator<void>>
+using associated_allocator_t
+ = typename associated_allocator<T, Allocator>::type;
+
+namespace detail {
+
+template <typename T, typename A, typename = void>
+struct associated_allocator_forwarding_base
+{
+};
+
+template <typename T, typename A>
+struct associated_allocator_forwarding_base<T, A,
+ enable_if_t<
+ is_same<
+ typename associated_allocator<T,
+ A>::asio_associated_allocator_is_unspecialised,
+ void
+ >::value
+ >>
+{
+ typedef void asio_associated_allocator_is_unspecialised;
+};
+
+} // namespace detail
+
+/// Specialisation of associated_allocator for @c std::reference_wrapper.
+template <typename T, typename Allocator>
+struct associated_allocator<reference_wrapper<T>, Allocator>
+#if !defined(GENERATING_DOCUMENTATION)
+ : detail::associated_allocator_forwarding_base<T, Allocator>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+ /// Forwards @c type to the associator specialisation for the unwrapped type
+ /// @c T.
+ typedef typename associated_allocator<T, Allocator>::type type;
+
+ /// Forwards the request to get the allocator to the associator specialisation
+ /// for the unwrapped type @c T.
+ static type get(reference_wrapper<T> t) noexcept
+ {
+ return associated_allocator<T, Allocator>::get(t.get());
+ }
+
+ /// Forwards the request to get the allocator to the associator specialisation
+ /// for the unwrapped type @c T.
+ static auto get(reference_wrapper<T> t, const Allocator& a) noexcept
+ -> decltype(associated_allocator<T, Allocator>::get(t.get(), a))
+ {
+ return associated_allocator<T, Allocator>::get(t.get(), a);
+ }
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_ASSOCIATED_ALLOCATOR_HPP
diff --git a/3rdparty/asio/include/asio/associated_cancellation_slot.hpp b/3rdparty/asio/include/asio/associated_cancellation_slot.hpp
new file mode 100644
index 00000000000..518bd881eaf
--- /dev/null
+++ b/3rdparty/asio/include/asio/associated_cancellation_slot.hpp
@@ -0,0 +1,221 @@
+//
+// associated_cancellation_slot.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CANCELLATION_SLOT_HPP
+#define ASIO_ASSOCIATED_CANCELLATION_SLOT_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/associator.hpp"
+#include "asio/cancellation_signal.hpp"
+#include "asio/detail/functional.hpp"
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+template <typename T, typename CancellationSlot>
+struct associated_cancellation_slot;
+
+namespace detail {
+
+template <typename T, typename = void>
+struct has_cancellation_slot_type : false_type
+{
+};
+
+template <typename T>
+struct has_cancellation_slot_type<T, void_t<typename T::cancellation_slot_type>>
+ : true_type
+{
+};
+
+template <typename T, typename S, typename = void, typename = void>
+struct associated_cancellation_slot_impl
+{
+ typedef void asio_associated_cancellation_slot_is_unspecialised;
+
+ typedef S type;
+
+ static type get(const T&) noexcept
+ {
+ return type();
+ }
+
+ static const type& get(const T&, const S& s) noexcept
+ {
+ return s;
+ }
+};
+
+template <typename T, typename S>
+struct associated_cancellation_slot_impl<T, S,
+ void_t<typename T::cancellation_slot_type>>
+{
+ typedef typename T::cancellation_slot_type type;
+
+ static auto get(const T& t) noexcept
+ -> decltype(t.get_cancellation_slot())
+ {
+ return t.get_cancellation_slot();
+ }
+
+ static auto get(const T& t, const S&) noexcept
+ -> decltype(t.get_cancellation_slot())
+ {
+ return t.get_cancellation_slot();
+ }
+};
+
+template <typename T, typename S>
+struct associated_cancellation_slot_impl<T, S,
+ enable_if_t<
+ !has_cancellation_slot_type<T>::value
+ >,
+ void_t<
+ typename associator<associated_cancellation_slot, T, S>::type
+ >> : associator<associated_cancellation_slot, T, S>
+{
+};
+
+} // namespace detail
+
+/// Traits type used to obtain the cancellation_slot 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
+ * CancellationSlot shall be a type meeting the CancellationSlot requirements.
+ *
+ * Specialisations shall meet the following requirements, where @c t is a const
+ * reference to an object of type @c T, and @c s is an object of type @c
+ * CancellationSlot.
+ *
+ * @li Provide a nested typedef @c type that identifies a type meeting the
+ * CancellationSlot requirements.
+ *
+ * @li Provide a noexcept static member function named @c get, callable as @c
+ * get(t) and with return type @c type or a (possibly const) reference to @c
+ * type.
+ *
+ * @li Provide a noexcept static member function named @c get, callable as @c
+ * get(t,s) and with return type @c type or a (possibly const) reference to @c
+ * type.
+ */
+template <typename T, typename CancellationSlot = cancellation_slot>
+struct associated_cancellation_slot
+#if !defined(GENERATING_DOCUMENTATION)
+ : detail::associated_cancellation_slot_impl<T, CancellationSlot>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+#if defined(GENERATING_DOCUMENTATION)
+ /// If @c T has a nested type @c cancellation_slot_type,
+ /// <tt>T::cancellation_slot_type</tt>. Otherwise
+ /// @c CancellationSlot.
+ typedef see_below type;
+
+ /// If @c T has a nested type @c cancellation_slot_type, returns
+ /// <tt>t.get_cancellation_slot()</tt>. Otherwise returns @c type().
+ static decltype(auto) get(const T& t) noexcept;
+
+ /// If @c T has a nested type @c cancellation_slot_type, returns
+ /// <tt>t.get_cancellation_slot()</tt>. Otherwise returns @c s.
+ static decltype(auto) get(const T& t,
+ const CancellationSlot& s) noexcept;
+#endif // defined(GENERATING_DOCUMENTATION)
+};
+
+/// Helper function to obtain an object's associated cancellation_slot.
+/**
+ * @returns <tt>associated_cancellation_slot<T>::get(t)</tt>
+ */
+template <typename T>
+ASIO_NODISCARD inline typename associated_cancellation_slot<T>::type
+get_associated_cancellation_slot(const T& t) noexcept
+{
+ return associated_cancellation_slot<T>::get(t);
+}
+
+/// Helper function to obtain an object's associated cancellation_slot.
+/**
+ * @returns <tt>associated_cancellation_slot<T,
+ * CancellationSlot>::get(t, st)</tt>
+ */
+template <typename T, typename CancellationSlot>
+ASIO_NODISCARD inline auto get_associated_cancellation_slot(
+ const T& t, const CancellationSlot& st) noexcept
+ -> decltype(associated_cancellation_slot<T, CancellationSlot>::get(t, st))
+{
+ return associated_cancellation_slot<T, CancellationSlot>::get(t, st);
+}
+
+template <typename T, typename CancellationSlot = cancellation_slot>
+using associated_cancellation_slot_t =
+ typename associated_cancellation_slot<T, CancellationSlot>::type;
+
+namespace detail {
+
+template <typename T, typename S, typename = void>
+struct associated_cancellation_slot_forwarding_base
+{
+};
+
+template <typename T, typename S>
+struct associated_cancellation_slot_forwarding_base<T, S,
+ enable_if_t<
+ is_same<
+ typename associated_cancellation_slot<T,
+ S>::asio_associated_cancellation_slot_is_unspecialised,
+ void
+ >::value
+ >>
+{
+ typedef void asio_associated_cancellation_slot_is_unspecialised;
+};
+
+} // namespace detail
+
+/// Specialisation of associated_cancellation_slot for @c
+/// std::reference_wrapper.
+template <typename T, typename CancellationSlot>
+struct associated_cancellation_slot<reference_wrapper<T>, CancellationSlot>
+#if !defined(GENERATING_DOCUMENTATION)
+ : detail::associated_cancellation_slot_forwarding_base<T, CancellationSlot>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+ /// Forwards @c type to the associator specialisation for the unwrapped type
+ /// @c T.
+ typedef typename associated_cancellation_slot<T, CancellationSlot>::type type;
+
+ /// Forwards the request to get the cancellation slot to the associator
+ /// specialisation for the unwrapped type @c T.
+ static type get(reference_wrapper<T> t) noexcept
+ {
+ return associated_cancellation_slot<T, CancellationSlot>::get(t.get());
+ }
+
+ /// Forwards the request to get the cancellation slot to the associator
+ /// specialisation for the unwrapped type @c T.
+ static auto get(reference_wrapper<T> t, const CancellationSlot& s) noexcept
+ -> decltype(
+ associated_cancellation_slot<T, CancellationSlot>::get(t.get(), s))
+ {
+ return associated_cancellation_slot<T, CancellationSlot>::get(t.get(), s);
+ }
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_ASSOCIATED_CANCELLATION_SLOT_HPP
diff --git a/3rdparty/asio/include/asio/associated_executor.hpp b/3rdparty/asio/include/asio/associated_executor.hpp
new file mode 100644
index 00000000000..4ca7ba149e9
--- /dev/null
+++ b/3rdparty/asio/include/asio/associated_executor.hpp
@@ -0,0 +1,235 @@
+//
+// associated_executor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/associator.hpp"
+#include "asio/detail/functional.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/is_executor.hpp"
+#include "asio/system_executor.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+template <typename T, typename Executor>
+struct associated_executor;
+
+namespace detail {
+
+template <typename T, typename = void>
+struct has_executor_type : false_type
+{
+};
+
+template <typename T>
+struct has_executor_type<T, void_t<typename T::executor_type>>
+ : true_type
+{
+};
+
+template <typename T, typename E, typename = void, typename = void>
+struct associated_executor_impl
+{
+ typedef void asio_associated_executor_is_unspecialised;
+
+ typedef E type;
+
+ static type get(const T&) noexcept
+ {
+ return type();
+ }
+
+ static const type& get(const T&, const E& e) noexcept
+ {
+ return e;
+ }
+};
+
+template <typename T, typename E>
+struct associated_executor_impl<T, E, void_t<typename T::executor_type>>
+{
+ typedef typename T::executor_type type;
+
+ static auto get(const T& t) noexcept
+ -> decltype(t.get_executor())
+ {
+ return t.get_executor();
+ }
+
+ static auto get(const T& t, const E&) noexcept
+ -> decltype(t.get_executor())
+ {
+ return t.get_executor();
+ }
+};
+
+template <typename T, typename E>
+struct associated_executor_impl<T, E,
+ enable_if_t<
+ !has_executor_type<T>::value
+ >,
+ void_t<
+ typename associator<associated_executor, T, E>::type
+ >> : associator<associated_executor, T, E>
+{
+};
+
+} // 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 or a (possibly const) reference to @c
+ * type.
+ *
+ * @li Provide a noexcept static member function named @c get, callable as @c
+ * get(t,e) and with return type @c type or a (possibly const) reference to @c
+ * type.
+ */
+template <typename T, typename Executor = system_executor>
+struct associated_executor
+#if !defined(GENERATING_DOCUMENTATION)
+ : detail::associated_executor_impl<T, Executor>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+#if defined(GENERATING_DOCUMENTATION)
+ /// If @c T has a nested type @c executor_type, <tt>T::executor_type</tt>.
+ /// Otherwise @c Executor.
+ typedef see_below type;
+
+ /// If @c T has a nested type @c executor_type, returns
+ /// <tt>t.get_executor()</tt>. Otherwise returns @c type().
+ static decltype(auto) get(const T& t) noexcept;
+
+ /// If @c T has a nested type @c executor_type, returns
+ /// <tt>t.get_executor()</tt>. Otherwise returns @c ex.
+ static decltype(auto) get(const T& t, const Executor& ex) noexcept;
+#endif // defined(GENERATING_DOCUMENTATION)
+};
+
+/// Helper function to obtain an object's associated executor.
+/**
+ * @returns <tt>associated_executor<T>::get(t)</tt>
+ */
+template <typename T>
+ASIO_NODISCARD inline typename associated_executor<T>::type
+get_associated_executor(const T& t) noexcept
+{
+ return associated_executor<T>::get(t);
+}
+
+/// Helper function to obtain an object's associated executor.
+/**
+ * @returns <tt>associated_executor<T, Executor>::get(t, ex)</tt>
+ */
+template <typename T, typename Executor>
+ASIO_NODISCARD inline auto get_associated_executor(
+ const T& t, const Executor& ex,
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0) noexcept
+ -> decltype(associated_executor<T, Executor>::get(t, ex))
+{
+ return associated_executor<T, Executor>::get(t, ex);
+}
+
+/// Helper function to obtain an object's associated executor.
+/**
+ * @returns <tt>associated_executor<T, typename
+ * ExecutionContext::executor_type>::get(t, ctx.get_executor())</tt>
+ */
+template <typename T, typename ExecutionContext>
+ASIO_NODISCARD inline typename associated_executor<T,
+ typename ExecutionContext::executor_type>::type
+get_associated_executor(const T& t, ExecutionContext& ctx,
+ constraint_t<is_convertible<ExecutionContext&,
+ execution_context&>::value> = 0) noexcept
+{
+ return associated_executor<T,
+ typename ExecutionContext::executor_type>::get(t, ctx.get_executor());
+}
+
+template <typename T, typename Executor = system_executor>
+using associated_executor_t = typename associated_executor<T, Executor>::type;
+
+namespace detail {
+
+template <typename T, typename E, typename = void>
+struct associated_executor_forwarding_base
+{
+};
+
+template <typename T, typename E>
+struct associated_executor_forwarding_base<T, E,
+ enable_if_t<
+ is_same<
+ typename associated_executor<T,
+ E>::asio_associated_executor_is_unspecialised,
+ void
+ >::value
+ >>
+{
+ typedef void asio_associated_executor_is_unspecialised;
+};
+
+} // namespace detail
+
+/// Specialisation of associated_executor for @c std::reference_wrapper.
+template <typename T, typename Executor>
+struct associated_executor<reference_wrapper<T>, Executor>
+#if !defined(GENERATING_DOCUMENTATION)
+ : detail::associated_executor_forwarding_base<T, Executor>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+ /// Forwards @c type to the associator specialisation for the unwrapped type
+ /// @c T.
+ typedef typename associated_executor<T, Executor>::type type;
+
+ /// Forwards the request to get the executor to the associator specialisation
+ /// for the unwrapped type @c T.
+ static type get(reference_wrapper<T> t) noexcept
+ {
+ return associated_executor<T, Executor>::get(t.get());
+ }
+
+ /// Forwards the request to get the executor to the associator specialisation
+ /// for the unwrapped type @c T.
+ static auto get(reference_wrapper<T> t, const Executor& ex) noexcept
+ -> decltype(associated_executor<T, Executor>::get(t.get(), ex))
+ {
+ return associated_executor<T, Executor>::get(t.get(), ex);
+ }
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_ASSOCIATED_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/associated_immediate_executor.hpp b/3rdparty/asio/include/asio/associated_immediate_executor.hpp
new file mode 100644
index 00000000000..aa6e0fcfee7
--- /dev/null
+++ b/3rdparty/asio/include/asio/associated_immediate_executor.hpp
@@ -0,0 +1,280 @@
+//
+// associated_immediate_executor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_IMMEDIATE_EXECUTOR_HPP
+#define ASIO_ASSOCIATED_IMMEDIATE_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/associator.hpp"
+#include "asio/detail/functional.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/execution/blocking.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/is_executor.hpp"
+#include "asio/require.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+template <typename T, typename Executor>
+struct associated_immediate_executor;
+
+namespace detail {
+
+template <typename T, typename = void>
+struct has_immediate_executor_type : false_type
+{
+};
+
+template <typename T>
+struct has_immediate_executor_type<T,
+ void_t<typename T::immediate_executor_type>>
+ : true_type
+{
+};
+
+template <typename E, typename = void, typename = void>
+struct default_immediate_executor
+{
+ typedef require_result_t<E, execution::blocking_t::never_t> type;
+
+ static type get(const E& e) noexcept
+ {
+ return asio::require(e, execution::blocking.never);
+ }
+};
+
+template <typename E>
+struct default_immediate_executor<E,
+ enable_if_t<
+ !execution::is_executor<E>::value
+ >,
+ enable_if_t<
+ is_executor<E>::value
+ >>
+{
+ class type : public E
+ {
+ public:
+ template <typename Executor1>
+ explicit type(const Executor1& e,
+ constraint_t<
+ conditional_t<
+ !is_same<Executor1, type>::value,
+ is_convertible<Executor1, E>,
+ false_type
+ >::value
+ > = 0) noexcept
+ : E(e)
+ {
+ }
+
+ type(const type& other) noexcept
+ : E(static_cast<const E&>(other))
+ {
+ }
+
+ type(type&& other) noexcept
+ : E(static_cast<E&&>(other))
+ {
+ }
+
+ template <typename Function, typename Allocator>
+ void dispatch(Function&& f, const Allocator& a) const
+ {
+ this->post(static_cast<Function&&>(f), a);
+ }
+
+ friend bool operator==(const type& a, const type& b) noexcept
+ {
+ return static_cast<const E&>(a) == static_cast<const E&>(b);
+ }
+
+ friend bool operator!=(const type& a, const type& b) noexcept
+ {
+ return static_cast<const E&>(a) != static_cast<const E&>(b);
+ }
+ };
+
+ static type get(const E& e) noexcept
+ {
+ return type(e);
+ }
+};
+
+template <typename T, typename E, typename = void, typename = void>
+struct associated_immediate_executor_impl
+{
+ typedef void asio_associated_immediate_executor_is_unspecialised;
+
+ typedef typename default_immediate_executor<E>::type type;
+
+ static auto get(const T&, const E& e) noexcept
+ -> decltype(default_immediate_executor<E>::get(e))
+ {
+ return default_immediate_executor<E>::get(e);
+ }
+};
+
+template <typename T, typename E>
+struct associated_immediate_executor_impl<T, E,
+ void_t<typename T::immediate_executor_type>>
+{
+ typedef typename T::immediate_executor_type type;
+
+ static auto get(const T& t, const E&) noexcept
+ -> decltype(t.get_immediate_executor())
+ {
+ return t.get_immediate_executor();
+ }
+};
+
+template <typename T, typename E>
+struct associated_immediate_executor_impl<T, E,
+ enable_if_t<
+ !has_immediate_executor_type<T>::value
+ >,
+ void_t<
+ typename associator<associated_immediate_executor, T, E>::type
+ >> : associator<associated_immediate_executor, T, E>
+{
+};
+
+} // namespace detail
+
+/// Traits type used to obtain the immediate 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 or a (possibly const) reference to @c
+ * type.
+ *
+ * @li Provide a noexcept static member function named @c get, callable as @c
+ * get(t,e) and with return type @c type or a (possibly const) reference to @c
+ * type.
+ */
+template <typename T, typename Executor>
+struct associated_immediate_executor
+#if !defined(GENERATING_DOCUMENTATION)
+ : detail::associated_immediate_executor_impl<T, Executor>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+#if defined(GENERATING_DOCUMENTATION)
+ /// If @c T has a nested type @c immediate_executor_type,
+ // <tt>T::immediate_executor_type</tt>. Otherwise @c Executor.
+ typedef see_below type;
+
+ /// If @c T has a nested type @c immediate_executor_type, returns
+ /// <tt>t.get_immediate_executor()</tt>. Otherwise returns
+ /// <tt>asio::require(ex, asio::execution::blocking.never)</tt>.
+ static decltype(auto) get(const T& t, const Executor& ex) noexcept;
+#endif // defined(GENERATING_DOCUMENTATION)
+};
+
+/// Helper function to obtain an object's associated executor.
+/**
+ * @returns <tt>associated_immediate_executor<T, Executor>::get(t, ex)</tt>
+ */
+template <typename T, typename Executor>
+ASIO_NODISCARD inline auto get_associated_immediate_executor(
+ const T& t, const Executor& ex,
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0) noexcept
+ -> decltype(associated_immediate_executor<T, Executor>::get(t, ex))
+{
+ return associated_immediate_executor<T, Executor>::get(t, ex);
+}
+
+/// Helper function to obtain an object's associated executor.
+/**
+ * @returns <tt>associated_immediate_executor<T, typename
+ * ExecutionContext::executor_type>::get(t, ctx.get_executor())</tt>
+ */
+template <typename T, typename ExecutionContext>
+ASIO_NODISCARD inline typename associated_immediate_executor<T,
+ typename ExecutionContext::executor_type>::type
+get_associated_immediate_executor(const T& t, ExecutionContext& ctx,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0) noexcept
+{
+ return associated_immediate_executor<T,
+ typename ExecutionContext::executor_type>::get(t, ctx.get_executor());
+}
+
+template <typename T, typename Executor>
+using associated_immediate_executor_t =
+ typename associated_immediate_executor<T, Executor>::type;
+
+namespace detail {
+
+template <typename T, typename E, typename = void>
+struct associated_immediate_executor_forwarding_base
+{
+};
+
+template <typename T, typename E>
+struct associated_immediate_executor_forwarding_base<T, E,
+ enable_if_t<
+ is_same<
+ typename associated_immediate_executor<T,
+ E>::asio_associated_immediate_executor_is_unspecialised,
+ void
+ >::value
+ >>
+{
+ typedef void asio_associated_immediate_executor_is_unspecialised;
+};
+
+} // namespace detail
+
+/// Specialisation of associated_immediate_executor for
+/// @c std::reference_wrapper.
+template <typename T, typename Executor>
+struct associated_immediate_executor<reference_wrapper<T>, Executor>
+#if !defined(GENERATING_DOCUMENTATION)
+ : detail::associated_immediate_executor_forwarding_base<T, Executor>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+ /// Forwards @c type to the associator specialisation for the unwrapped type
+ /// @c T.
+ typedef typename associated_immediate_executor<T, Executor>::type type;
+
+ /// Forwards the request to get the executor to the associator specialisation
+ /// for the unwrapped type @c T.
+ static auto get(reference_wrapper<T> t, const Executor& ex) noexcept
+ -> decltype(associated_immediate_executor<T, Executor>::get(t.get(), ex))
+ {
+ return associated_immediate_executor<T, Executor>::get(t.get(), ex);
+ }
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_ASSOCIATED_IMMEDIATE_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/associator.hpp b/3rdparty/asio/include/asio/associator.hpp
new file mode 100644
index 00000000000..7952fcc51ba
--- /dev/null
+++ b/3rdparty/asio/include/asio/associator.hpp
@@ -0,0 +1,35 @@
+//
+// associator.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_ASSOCIATOR_HPP
+#define ASIO_ASSOCIATOR_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 {
+
+/// Used to generically specialise associators for a type.
+template <template <typename, typename> class Associator,
+ typename T, typename DefaultCandidate>
+struct associator
+{
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_ASSOCIATOR_HPP
diff --git a/3rdparty/asio/include/asio/async_result.hpp b/3rdparty/asio/include/asio/async_result.hpp
new file mode 100644
index 00000000000..cdae9ede687
--- /dev/null
+++ b/3rdparty/asio/include/asio/async_result.hpp
@@ -0,0 +1,942 @@
+//
+// async_result.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(ASIO_HAS_CONCEPTS)
+
+namespace detail {
+
+template <typename T>
+struct is_completion_signature : false_type
+{
+};
+
+template <typename R, typename... Args>
+struct is_completion_signature<R(Args...)> : true_type
+{
+};
+
+template <typename R, typename... Args>
+struct is_completion_signature<R(Args...) &> : true_type
+{
+};
+
+template <typename R, typename... Args>
+struct is_completion_signature<R(Args...) &&> : true_type
+{
+};
+
+# if defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+template <typename R, typename... Args>
+struct is_completion_signature<R(Args...) noexcept> : true_type
+{
+};
+
+template <typename R, typename... Args>
+struct is_completion_signature<R(Args...) & noexcept> : true_type
+{
+};
+
+template <typename R, typename... Args>
+struct is_completion_signature<R(Args...) && noexcept> : true_type
+{
+};
+
+# endif // defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+template <typename... T>
+struct are_completion_signatures : false_type
+{
+};
+
+template <typename T0>
+struct are_completion_signatures<T0>
+ : is_completion_signature<T0>
+{
+};
+
+template <typename T0, typename... TN>
+struct are_completion_signatures<T0, TN...>
+ : integral_constant<bool, (
+ is_completion_signature<T0>::value
+ && are_completion_signatures<TN...>::value)>
+{
+};
+
+template <typename T, typename... Args>
+ASIO_CONCEPT callable_with = requires(T&& t, Args&&... args)
+{
+ static_cast<T&&>(t)(static_cast<Args&&>(args)...);
+};
+
+template <typename T, typename... Signatures>
+struct is_completion_handler_for : false_type
+{
+};
+
+template <typename T, typename R, typename... Args>
+struct is_completion_handler_for<T, R(Args...)>
+ : integral_constant<bool, (callable_with<decay_t<T>, Args...>)>
+{
+};
+
+template <typename T, typename R, typename... Args>
+struct is_completion_handler_for<T, R(Args...) &>
+ : integral_constant<bool, (callable_with<decay_t<T>&, Args...>)>
+{
+};
+
+template <typename T, typename R, typename... Args>
+struct is_completion_handler_for<T, R(Args...) &&>
+ : integral_constant<bool, (callable_with<decay_t<T>&&, Args...>)>
+{
+};
+
+# if defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+template <typename T, typename R, typename... Args>
+struct is_completion_handler_for<T, R(Args...) noexcept>
+ : integral_constant<bool, (callable_with<decay_t<T>, Args...>)>
+{
+};
+
+template <typename T, typename R, typename... Args>
+struct is_completion_handler_for<T, R(Args...) & noexcept>
+ : integral_constant<bool, (callable_with<decay_t<T>&, Args...>)>
+{
+};
+
+template <typename T, typename R, typename... Args>
+struct is_completion_handler_for<T, R(Args...) && noexcept>
+ : integral_constant<bool, (callable_with<decay_t<T>&&, Args...>)>
+{
+};
+
+# endif // defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+template <typename T, typename Signature0, typename... SignatureN>
+struct is_completion_handler_for<T, Signature0, SignatureN...>
+ : integral_constant<bool, (
+ is_completion_handler_for<T, Signature0>::value
+ && is_completion_handler_for<T, SignatureN...>::value)>
+{
+};
+
+} // namespace detail
+
+template <typename T>
+ASIO_CONCEPT completion_signature =
+ detail::is_completion_signature<T>::value;
+
+#define ASIO_COMPLETION_SIGNATURE \
+ ::asio::completion_signature
+
+template <typename T, typename... Signatures>
+ASIO_CONCEPT completion_handler_for =
+ detail::are_completion_signatures<Signatures...>::value
+ && detail::is_completion_handler_for<T, Signatures...>::value;
+
+#define ASIO_COMPLETION_HANDLER_FOR(sig) \
+ ::asio::completion_handler_for<sig>
+#define ASIO_COMPLETION_HANDLER_FOR2(sig0, sig1) \
+ ::asio::completion_handler_for<sig0, sig1>
+#define ASIO_COMPLETION_HANDLER_FOR3(sig0, sig1, sig2) \
+ ::asio::completion_handler_for<sig0, sig1, sig2>
+
+#else // defined(ASIO_HAS_CONCEPTS)
+
+#define ASIO_COMPLETION_SIGNATURE typename
+#define ASIO_COMPLETION_HANDLER_FOR(sig) typename
+#define ASIO_COMPLETION_HANDLER_FOR2(sig0, sig1) typename
+#define ASIO_COMPLETION_HANDLER_FOR3(sig0, sig1, sig2) typename
+
+#endif // defined(ASIO_HAS_CONCEPTS)
+
+namespace detail {
+
+template <typename T>
+struct is_lvalue_completion_signature : false_type
+{
+};
+
+template <typename R, typename... Args>
+struct is_lvalue_completion_signature<R(Args...) &> : true_type
+{
+};
+
+# if defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+template <typename R, typename... Args>
+struct is_lvalue_completion_signature<R(Args...) & noexcept> : true_type
+{
+};
+
+# endif // defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+template <typename... Signatures>
+struct are_any_lvalue_completion_signatures : false_type
+{
+};
+
+template <typename Sig0>
+struct are_any_lvalue_completion_signatures<Sig0>
+ : is_lvalue_completion_signature<Sig0>
+{
+};
+
+template <typename Sig0, typename... SigN>
+struct are_any_lvalue_completion_signatures<Sig0, SigN...>
+ : integral_constant<bool, (
+ is_lvalue_completion_signature<Sig0>::value
+ || are_any_lvalue_completion_signatures<SigN...>::value)>
+{
+};
+
+template <typename T>
+struct is_rvalue_completion_signature : false_type
+{
+};
+
+template <typename R, typename... Args>
+struct is_rvalue_completion_signature<R(Args...) &&> : true_type
+{
+};
+
+# if defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+template <typename R, typename... Args>
+struct is_rvalue_completion_signature<R(Args...) && noexcept> : true_type
+{
+};
+
+# endif // defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+template <typename... Signatures>
+struct are_any_rvalue_completion_signatures : false_type
+{
+};
+
+template <typename Sig0>
+struct are_any_rvalue_completion_signatures<Sig0>
+ : is_rvalue_completion_signature<Sig0>
+{
+};
+
+template <typename Sig0, typename... SigN>
+struct are_any_rvalue_completion_signatures<Sig0, SigN...>
+ : integral_constant<bool, (
+ is_rvalue_completion_signature<Sig0>::value
+ || are_any_rvalue_completion_signatures<SigN...>::value)>
+{
+};
+
+template <typename T>
+struct simple_completion_signature;
+
+template <typename R, typename... Args>
+struct simple_completion_signature<R(Args...)>
+{
+ typedef R type(Args...);
+};
+
+template <typename R, typename... Args>
+struct simple_completion_signature<R(Args...) &>
+{
+ typedef R type(Args...);
+};
+
+template <typename R, typename... Args>
+struct simple_completion_signature<R(Args...) &&>
+{
+ typedef R type(Args...);
+};
+
+# if defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+template <typename R, typename... Args>
+struct simple_completion_signature<R(Args...) noexcept>
+{
+ typedef R type(Args...);
+};
+
+template <typename R, typename... Args>
+struct simple_completion_signature<R(Args...) & noexcept>
+{
+ typedef R type(Args...);
+};
+
+template <typename R, typename... Args>
+struct simple_completion_signature<R(Args...) && noexcept>
+{
+ typedef R type(Args...);
+};
+
+# endif // defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+template <typename CompletionToken,
+ ASIO_COMPLETION_SIGNATURE... Signatures>
+class completion_handler_async_result
+{
+public:
+ typedef CompletionToken completion_handler_type;
+ typedef void return_type;
+
+ explicit completion_handler_async_result(completion_handler_type&)
+ {
+ }
+
+ return_type get()
+ {
+ }
+
+ template <typename Initiation,
+ ASIO_COMPLETION_HANDLER_FOR(Signatures...) RawCompletionToken,
+ typename... Args>
+ static return_type initiate(Initiation&& initiation,
+ RawCompletionToken&& token, Args&&... args)
+ {
+ static_cast<Initiation&&>(initiation)(
+ static_cast<RawCompletionToken&&>(token),
+ static_cast<Args&&>(args)...);
+ }
+
+private:
+ completion_handler_async_result(
+ const completion_handler_async_result&) = delete;
+ completion_handler_async_result& operator=(
+ const completion_handler_async_result&) = delete;
+};
+
+} // namespace detail
+
+#if defined(GENERATING_DOCUMENTATION)
+
+/// 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.
+ */
+template <typename CompletionToken,
+ ASIO_COMPLETION_SIGNATURE... Signatures>
+class async_result
+{
+public:
+ /// 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;
+
+ /// 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);
+
+ /// Obtain the value to be returned from the initiating function.
+ return_type get();
+
+ /// Initiate the asynchronous operation that will produce the result, and
+ /// obtain the value to be returned from the initiating function.
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static return_type initiate(
+ Initiation&& initiation,
+ RawCompletionToken&& token,
+ Args&&... args);
+
+private:
+ async_result(const async_result&) = delete;
+ async_result& operator=(const async_result&) = delete;
+};
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+template <typename CompletionToken,
+ ASIO_COMPLETION_SIGNATURE... Signatures>
+class async_result :
+ public conditional_t<
+ detail::are_any_lvalue_completion_signatures<Signatures...>::value
+ || !detail::are_any_rvalue_completion_signatures<Signatures...>::value,
+ detail::completion_handler_async_result<CompletionToken, Signatures...>,
+ async_result<CompletionToken,
+ typename detail::simple_completion_signature<Signatures>::type...>
+ >
+{
+public:
+ typedef conditional_t<
+ detail::are_any_lvalue_completion_signatures<Signatures...>::value
+ || !detail::are_any_rvalue_completion_signatures<Signatures...>::value,
+ detail::completion_handler_async_result<CompletionToken, Signatures...>,
+ async_result<CompletionToken,
+ typename detail::simple_completion_signature<Signatures>::type...>
+ > base_type;
+
+ using base_type::base_type;
+
+private:
+ async_result(const async_result&) = delete;
+ async_result& operator=(const async_result&) = delete;
+};
+
+template <ASIO_COMPLETION_SIGNATURE... Signatures>
+class async_result<void, Signatures...>
+{
+ // Empty.
+};
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+/// 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 <typename CompletionToken,
+ ASIO_COMPLETION_SIGNATURE... Signatures>
+struct async_completion
+{
+ /// The real handler type to be used for the asynchronous operation.
+ typedef typename asio::async_result<
+ decay_t<CompletionToken>, Signatures...>::completion_handler_type
+ completion_handler_type;
+
+ /// 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<conditional_t<
+ is_same<CompletionToken, completion_handler_type>::value,
+ completion_handler_type&, CompletionToken&&>>(token)),
+ result(completion_handler)
+ {
+ }
+
+ /// A copy of, or reference to, a real handler object.
+ conditional_t<
+ is_same<CompletionToken, completion_handler_type>::value,
+ completion_handler_type&, completion_handler_type> completion_handler;
+
+ /// The result of the asynchronous operation's initiating function.
+ async_result<decay_t<CompletionToken>, Signatures...> result;
+};
+
+namespace detail {
+
+struct async_result_memfns_base
+{
+ void initiate();
+};
+
+template <typename T>
+struct async_result_memfns_derived
+ : T, async_result_memfns_base
+{
+};
+
+template <typename T, T>
+struct async_result_memfns_check
+{
+};
+
+template <typename>
+char (&async_result_initiate_memfn_helper(...))[2];
+
+template <typename T>
+char async_result_initiate_memfn_helper(
+ async_result_memfns_check<
+ void (async_result_memfns_base::*)(),
+ &async_result_memfns_derived<T>::initiate>*);
+
+template <typename CompletionToken,
+ ASIO_COMPLETION_SIGNATURE... Signatures>
+struct async_result_has_initiate_memfn
+ : integral_constant<bool, sizeof(async_result_initiate_memfn_helper<
+ async_result<decay_t<CompletionToken>, Signatures...>
+ >(0)) != 1>
+{
+};
+
+} // namespace detail
+
+#if defined(GENERATING_DOCUMENTATION)
+# define ASIO_INITFN_RESULT_TYPE(ct, sig) \
+ void_or_deduced
+# define ASIO_INITFN_RESULT_TYPE2(ct, sig0, sig1) \
+ void_or_deduced
+# define ASIO_INITFN_RESULT_TYPE3(ct, sig0, sig1, sig2) \
+ void_or_deduced
+#else
+# define ASIO_INITFN_RESULT_TYPE(ct, sig) \
+ typename ::asio::async_result< \
+ typename ::asio::decay<ct>::type, sig>::return_type
+# define ASIO_INITFN_RESULT_TYPE2(ct, sig0, sig1) \
+ typename ::asio::async_result< \
+ typename ::asio::decay<ct>::type, sig0, sig1>::return_type
+# define ASIO_INITFN_RESULT_TYPE3(ct, sig0, sig1, sig2) \
+ typename ::asio::async_result< \
+ typename ::asio::decay<ct>::type, sig0, sig1, sig2>::return_type
+#define ASIO_HANDLER_TYPE(ct, sig) \
+ typename ::asio::async_result< \
+ typename ::asio::decay<ct>::type, sig>::completion_handler_type
+#define ASIO_HANDLER_TYPE2(ct, sig0, sig1) \
+ typename ::asio::async_result< \
+ typename ::asio::decay<ct>::type, \
+ sig0, sig1>::completion_handler_type
+#define ASIO_HANDLER_TYPE3(ct, sig0, sig1, sig2) \
+ typename ::asio::async_result< \
+ typename ::asio::decay<ct>::type, \
+ sig0, sig1, sig2>::completion_handler_type
+#endif
+
+#if defined(GENERATING_DOCUMENTATION)
+# define ASIO_INITFN_AUTO_RESULT_TYPE(ct, sig) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE2(ct, sig0, sig1) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE3(ct, sig0, sig1, sig2) \
+ auto
+#elif defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+# define ASIO_INITFN_AUTO_RESULT_TYPE(ct, sig) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE2(ct, sig0, sig1) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE3(ct, sig0, sig1, sig2) \
+ auto
+#else
+# define ASIO_INITFN_AUTO_RESULT_TYPE(ct, sig) \
+ ASIO_INITFN_RESULT_TYPE(ct, sig)
+# define ASIO_INITFN_AUTO_RESULT_TYPE2(ct, sig0, sig1) \
+ ASIO_INITFN_RESULT_TYPE2(ct, sig0, sig1)
+# define ASIO_INITFN_AUTO_RESULT_TYPE3(ct, sig0, sig1, sig2) \
+ ASIO_INITFN_RESULT_TYPE3(ct, sig0, sig1, sig2)
+#endif
+
+#if defined(GENERATING_DOCUMENTATION)
+# define ASIO_INITFN_AUTO_RESULT_TYPE_PREFIX(ct, sig) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE_PREFIX2(ct, sig0, sig1) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE_PREFIX3(ct, sig0, sig1, sig2) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE_SUFFIX(expr)
+#elif defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+# define ASIO_INITFN_AUTO_RESULT_TYPE_PREFIX(ct, sig) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE_PREFIX2(ct, sig0, sig1) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE_PREFIX3(ct, sig0, sig1, sig2) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE_SUFFIX(expr)
+#else
+# define ASIO_INITFN_AUTO_RESULT_TYPE_PREFIX(ct, sig) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE_PREFIX2(ct, sig0, sig1) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE_PREFIX3(ct, sig0, sig1, sig2) \
+ auto
+# define ASIO_INITFN_AUTO_RESULT_TYPE_SUFFIX(expr) -> decltype expr
+#endif
+
+#if defined(GENERATING_DOCUMENTATION)
+# define ASIO_INITFN_DEDUCED_RESULT_TYPE(ct, sig, expr) \
+ void_or_deduced
+# define ASIO_INITFN_DEDUCED_RESULT_TYPE2(ct, sig0, sig1, expr) \
+ void_or_deduced
+# define ASIO_INITFN_DEDUCED_RESULT_TYPE3(ct, sig0, sig1, sig2, expr) \
+ void_or_deduced
+#else
+# define ASIO_INITFN_DEDUCED_RESULT_TYPE(ct, sig, expr) \
+ decltype expr
+# define ASIO_INITFN_DEDUCED_RESULT_TYPE2(ct, sig0, sig1, expr) \
+ decltype expr
+# define ASIO_INITFN_DEDUCED_RESULT_TYPE3(ct, sig0, sig1, sig2, expr) \
+ decltype expr
+#endif
+
+#if defined(GENERATING_DOCUMENTATION)
+
+template <typename CompletionToken,
+ completion_signature... Signatures,
+ typename Initiation, typename... Args>
+void_or_deduced async_initiate(
+ Initiation&& initiation,
+ type_identity_t<CompletionToken>& token,
+ Args&&... args);
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+template <typename CompletionToken,
+ ASIO_COMPLETION_SIGNATURE... Signatures,
+ typename Initiation, typename... Args>
+inline auto async_initiate(Initiation&& initiation,
+ type_identity_t<CompletionToken>& token, Args&&... args)
+ -> constraint_t<
+ detail::async_result_has_initiate_memfn<
+ CompletionToken, Signatures...>::value,
+ decltype(
+ async_result<decay_t<CompletionToken>, Signatures...>::initiate(
+ static_cast<Initiation&&>(initiation),
+ static_cast<CompletionToken&&>(token),
+ static_cast<Args&&>(args)...))>
+{
+ return async_result<decay_t<CompletionToken>, Signatures...>::initiate(
+ static_cast<Initiation&&>(initiation),
+ static_cast<CompletionToken&&>(token),
+ static_cast<Args&&>(args)...);
+}
+
+template <typename CompletionToken,
+ ASIO_COMPLETION_SIGNATURE... Signatures,
+ typename Initiation, typename... Args>
+inline constraint_t<
+ !detail::async_result_has_initiate_memfn<
+ CompletionToken, Signatures...>::value,
+ typename async_result<decay_t<CompletionToken>, Signatures...>::return_type>
+async_initiate(Initiation&& initiation,
+ type_identity_t<CompletionToken>& token, Args&&... args)
+{
+ async_completion<CompletionToken, Signatures...> completion(token);
+
+ static_cast<Initiation&&>(initiation)(
+ static_cast<
+ typename async_result<decay_t<CompletionToken>,
+ Signatures...>::completion_handler_type&&>(
+ completion.completion_handler),
+ static_cast<Args&&>(args)...);
+
+ return completion.result.get();
+}
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+#if defined(ASIO_HAS_CONCEPTS)
+
+namespace detail {
+
+template <typename... Signatures>
+struct initiation_archetype
+{
+ template <completion_handler_for<Signatures...> CompletionHandler>
+ void operator()(CompletionHandler&&) const
+ {
+ }
+};
+
+} // namespace detail
+
+template <typename T, typename... Signatures>
+ASIO_CONCEPT completion_token_for =
+ detail::are_completion_signatures<Signatures...>::value
+ &&
+ requires(T&& t)
+ {
+ async_initiate<T, Signatures...>(
+ detail::initiation_archetype<Signatures...>{}, t);
+ };
+
+#define ASIO_COMPLETION_TOKEN_FOR(sig) \
+ ::asio::completion_token_for<sig>
+#define ASIO_COMPLETION_TOKEN_FOR2(sig0, sig1) \
+ ::asio::completion_token_for<sig0, sig1>
+#define ASIO_COMPLETION_TOKEN_FOR3(sig0, sig1, sig2) \
+ ::asio::completion_token_for<sig0, sig1, sig2>
+
+#else // defined(ASIO_HAS_CONCEPTS)
+
+#define ASIO_COMPLETION_TOKEN_FOR(sig) typename
+#define ASIO_COMPLETION_TOKEN_FOR2(sig0, sig1) typename
+#define ASIO_COMPLETION_TOKEN_FOR3(sig0, sig1, sig2) typename
+
+#endif // defined(ASIO_HAS_CONCEPTS)
+
+namespace detail {
+
+struct async_operation_probe {};
+struct async_operation_probe_result {};
+
+template <typename Call, typename = void>
+struct is_async_operation_call : false_type
+{
+};
+
+template <typename Call>
+struct is_async_operation_call<Call,
+ void_t<
+ enable_if_t<
+ is_same<
+ result_of_t<Call>,
+ async_operation_probe_result
+ >::value
+ >
+ >
+ > : true_type
+{
+};
+
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename... Signatures>
+class async_result<detail::async_operation_probe, Signatures...>
+{
+public:
+ typedef detail::async_operation_probe_result return_type;
+
+ template <typename Initiation, typename... InitArgs>
+ static return_type initiate(Initiation&&,
+ detail::async_operation_probe, InitArgs&&...)
+ {
+ return return_type();
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+#if defined(GENERATING_DOCUMENTATION)
+
+/// The is_async_operation trait detects whether a type @c T and arguments
+/// @c Args... may be used to initiate an asynchronous operation.
+/**
+ * Class template @c is_async_operation is a trait is derived from @c true_type
+ * if the expression <tt>T(Args..., token)</tt> initiates an asynchronous
+ * operation, where @c token is an unspecified completion token type. Otherwise,
+ * @c is_async_operation is derived from @c false_type.
+ */
+template <typename T, typename... Args>
+struct is_async_operation : integral_constant<bool, automatically_determined>
+{
+};
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+template <typename T, typename... Args>
+struct is_async_operation :
+ detail::is_async_operation_call<
+ T(Args..., detail::async_operation_probe)>
+{
+};
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+#if defined(ASIO_HAS_CONCEPTS)
+
+template <typename T, typename... Args>
+ASIO_CONCEPT async_operation = is_async_operation<T, Args...>::value;
+
+#define ASIO_ASYNC_OPERATION(t) \
+ ::asio::async_operation<t>
+#define ASIO_ASYNC_OPERATION1(t, a0) \
+ ::asio::async_operation<t, a0>
+#define ASIO_ASYNC_OPERATION2(t, a0, a1) \
+ ::asio::async_operation<t, a0, a1>
+#define ASIO_ASYNC_OPERATION3(t, a0, a1, a2) \
+ ::asio::async_operation<t, a0, a1, a2>
+
+#else // defined(ASIO_HAS_CONCEPTS)
+
+#define ASIO_ASYNC_OPERATION(t) typename
+#define ASIO_ASYNC_OPERATION1(t, a0) typename
+#define ASIO_ASYNC_OPERATION2(t, a0, a1) typename
+#define ASIO_ASYNC_OPERATION3(t, a0, a1, a2) typename
+
+#endif // defined(ASIO_HAS_CONCEPTS)
+
+namespace detail {
+
+struct completion_signature_probe {};
+
+template <typename... T>
+struct completion_signature_probe_result
+{
+ template <template <typename...> class Op>
+ struct apply
+ {
+ typedef Op<T...> type;
+ };
+};
+
+template <typename T>
+struct completion_signature_probe_result<T>
+{
+ typedef T type;
+
+ template <template <typename...> class Op>
+ struct apply
+ {
+ typedef Op<T> type;
+ };
+};
+
+template <>
+struct completion_signature_probe_result<void>
+{
+ template <template <typename...> class Op>
+ struct apply
+ {
+ typedef Op<> type;
+ };
+};
+
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename... Signatures>
+class async_result<detail::completion_signature_probe, Signatures...>
+{
+public:
+ typedef detail::completion_signature_probe_result<Signatures...> return_type;
+
+ template <typename Initiation, typename... InitArgs>
+ static return_type initiate(Initiation&&,
+ detail::completion_signature_probe, InitArgs&&...)
+ {
+ return return_type();
+ }
+};
+
+template <typename Signature>
+class async_result<detail::completion_signature_probe, Signature>
+{
+public:
+ typedef detail::completion_signature_probe_result<Signature> return_type;
+
+ template <typename Initiation, typename... InitArgs>
+ static return_type initiate(Initiation&&,
+ detail::completion_signature_probe, InitArgs&&...)
+ {
+ return return_type();
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+#if defined(GENERATING_DOCUMENTATION)
+
+/// The completion_signature_of trait determines the completion signature
+/// of an asynchronous operation.
+/**
+ * Class template @c completion_signature_of is a trait with a member type
+ * alias @c type that denotes the completion signature of the asynchronous
+ * operation initiated by the expression <tt>T(Args..., token)</tt> operation,
+ * where @c token is an unspecified completion token type. If the asynchronous
+ * operation does not have exactly one completion signature, the instantion of
+ * the trait is well-formed but the member type alias @c type is omitted. If
+ * the expression <tt>T(Args..., token)</tt> is not an asynchronous operation
+ * then use of the trait is ill-formed.
+ */
+template <typename T, typename... Args>
+struct completion_signature_of
+{
+ typedef automatically_determined type;
+};
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+template <typename T, typename... Args>
+struct completion_signature_of :
+ result_of_t<T(Args..., detail::completion_signature_probe)>
+{
+};
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+template <typename T, typename... Args>
+using completion_signature_of_t =
+ typename completion_signature_of<T, Args...>::type;
+
+namespace detail {
+
+template <typename T, typename = void>
+struct default_completion_token_impl
+{
+ typedef void type;
+};
+
+template <typename T>
+struct default_completion_token_impl<T,
+ void_t<typename T::default_completion_token_type>
+ >
+{
+ typedef typename T::default_completion_token_type type;
+};
+
+} // namespace detail
+
+#if defined(GENERATING_DOCUMENTATION)
+
+/// Traits type used to determine the default completion token type associated
+/// with a type (such as an executor).
+/**
+ * A program may specialise this traits type if the @c T template parameter in
+ * the specialisation is a user-defined type.
+ *
+ * Specialisations of this trait may provide a nested typedef @c type, which is
+ * a default-constructible completion token type.
+ */
+template <typename T>
+struct default_completion_token
+{
+ /// If @c T has a nested type @c default_completion_token_type,
+ /// <tt>T::default_completion_token_type</tt>. Otherwise the typedef @c type
+ /// is not defined.
+ typedef see_below type;
+};
+#else
+template <typename T>
+struct default_completion_token
+ : detail::default_completion_token_impl<T>
+{
+};
+#endif
+
+template <typename T>
+using default_completion_token_t = typename default_completion_token<T>::type;
+
+#define ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(e) \
+ = typename ::asio::default_completion_token<e>::type
+#define ASIO_DEFAULT_COMPLETION_TOKEN(e) \
+ = typename ::asio::default_completion_token<e>::type()
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_ASYNC_RESULT_HPP
diff --git a/3rdparty/asio/include/asio/awaitable.hpp b/3rdparty/asio/include/asio/awaitable.hpp
new file mode 100644
index 00000000000..7e4ee7a2f22
--- /dev/null
+++ b/3rdparty/asio/include/asio/awaitable.hpp
@@ -0,0 +1,142 @@
+//
+// awaitable.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_AWAITABLE_HPP
+#define ASIO_AWAITABLE_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)
+
+#if defined(ASIO_HAS_STD_COROUTINE)
+# include <coroutine>
+#else // defined(ASIO_HAS_STD_COROUTINE)
+# include <experimental/coroutine>
+#endif // defined(ASIO_HAS_STD_COROUTINE)
+
+#include <utility>
+#include "asio/any_io_executor.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+#if defined(ASIO_HAS_STD_COROUTINE)
+using std::coroutine_handle;
+using std::suspend_always;
+#else // defined(ASIO_HAS_STD_COROUTINE)
+using std::experimental::coroutine_handle;
+using std::experimental::suspend_always;
+#endif // defined(ASIO_HAS_STD_COROUTINE)
+
+template <typename> class awaitable_thread;
+template <typename, typename> class awaitable_frame;
+
+} // namespace detail
+
+/// The return type of a coroutine or asynchronous operation.
+template <typename T, typename Executor = any_io_executor>
+class ASIO_NODISCARD 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;
+
+ /// Default constructor.
+ constexpr awaitable() noexcept
+ : frame_(nullptr)
+ {
+ }
+
+ /// Move constructor.
+ awaitable(awaitable&& other) noexcept
+ : frame_(std::exchange(other.frame_, nullptr))
+ {
+ }
+
+ /// Destructor
+ ~awaitable()
+ {
+ if (frame_)
+ frame_->destroy();
+ }
+
+ /// Move assignment.
+ awaitable& operator=(awaitable&& other) noexcept
+ {
+ if (this != &other)
+ frame_ = std::exchange(other.frame_, nullptr);
+ return *this;
+ }
+
+ /// Checks if the awaitable refers to a future result.
+ bool valid() const noexcept
+ {
+ return !!frame_;
+ }
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+ // Support for co_await keyword.
+ bool await_ready() const noexcept
+ {
+ return false;
+ }
+
+ // Support for co_await keyword.
+ template <class U>
+ void await_suspend(
+ detail::coroutine_handle<detail::awaitable_frame<U, Executor>> h)
+ {
+ frame_->push_frame(&h.promise());
+ }
+
+ // Support for co_await keyword.
+ T await_resume()
+ {
+ return awaitable(static_cast<awaitable&&>(*this)).frame_->get();
+ }
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+private:
+ template <typename> friend class detail::awaitable_thread;
+ template <typename, typename> friend class detail::awaitable_frame;
+
+ // Not copy constructible or copy assignable.
+ awaitable(const awaitable&) = delete;
+ awaitable& operator=(const awaitable&) = delete;
+
+ // Construct the awaitable from a coroutine's frame object.
+ explicit awaitable(detail::awaitable_frame<T, Executor>* a)
+ : frame_(a)
+ {
+ }
+
+ detail::awaitable_frame<T, Executor>* frame_;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/awaitable.hpp"
+
+#endif // defined(ASIO_HAS_CO_AWAIT) || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_AWAITABLE_HPP
diff --git a/3rdparty/asio/include/asio/basic_datagram_socket.hpp b/3rdparty/asio/include/asio/basic_datagram_socket.hpp
new file mode 100644
index 00000000000..3d72a38475a
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_datagram_socket.hpp
@@ -0,0 +1,1362 @@
+//
+// basic_datagram_socket.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include "asio/basic_socket.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if !defined(ASIO_BASIC_DATAGRAM_SOCKET_FWD_DECL)
+#define ASIO_BASIC_DATAGRAM_SOCKET_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Protocol, typename Executor = any_io_executor>
+class basic_datagram_socket;
+
+#endif // !defined(ASIO_BASIC_DATAGRAM_SOCKET_FWD_DECL)
+
+/// 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.
+ *
+ * Synchronous @c send, @c send_to, @c receive, @c receive_from, @c connect,
+ * and @c shutdown operations are thread safe with respect to each other, if
+ * the underlying operating system calls are also thread safe. This means that
+ * it is permitted to perform concurrent calls to these synchronous operations
+ * on a single socket object. Other synchronous operations, such as @c open or
+ * @c close, are not thread safe.
+ */
+template <typename Protocol, typename Executor>
+class basic_datagram_socket
+ : public basic_socket<Protocol, Executor>
+{
+private:
+ class initiate_async_send;
+ class initiate_async_send_to;
+ class initiate_async_receive;
+ class initiate_async_receive_from;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the socket type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The socket type when rebound to the specified executor.
+ typedef basic_datagram_socket<Protocol, Executor1> other;
+ };
+
+ /// The native representation of a socket.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#else
+ typedef typename basic_socket<Protocol,
+ Executor>::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 ex The I/O executor that the socket will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the socket.
+ */
+ explicit basic_datagram_socket(const executor_type& ex)
+ : basic_socket<Protocol, Executor>(ex)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the socket will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the socket.
+ */
+ template <typename ExecutionContext>
+ explicit basic_datagram_socket(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(context)
+ {
+ }
+
+ /// Construct and open a basic_datagram_socket.
+ /**
+ * This constructor creates and opens a datagram socket.
+ *
+ * @param ex The I/O executor that the socket will use, by default, 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(const executor_type& ex, const protocol_type& protocol)
+ : basic_socket<Protocol, Executor>(ex, protocol)
+ {
+ }
+
+ /// Construct and open a basic_datagram_socket.
+ /**
+ * This constructor creates and opens a datagram socket.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_datagram_socket(ExecutionContext& context,
+ const protocol_type& protocol,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_socket<Protocol, Executor>(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 ex The I/O executor that the socket will use, by default, 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(const executor_type& ex, const endpoint_type& endpoint)
+ : basic_socket<Protocol, Executor>(ex, endpoint)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_datagram_socket(ExecutionContext& context,
+ const endpoint_type& endpoint,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(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 ex The I/O executor that the socket will use, by default, 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(const executor_type& ex,
+ const protocol_type& protocol, const native_handle_type& native_socket)
+ : basic_socket<Protocol, Executor>(ex, protocol, native_socket)
+ {
+ }
+
+ /// Construct a basic_datagram_socket on an existing native socket.
+ /**
+ * This constructor creates a datagram socket object to hold an existing
+ * native socket.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_datagram_socket(ExecutionContext& context,
+ const protocol_type& protocol, const native_handle_type& native_socket,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(context, protocol, native_socket)
+ {
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_datagram_socket(basic_datagram_socket&& other) noexcept
+ : basic_socket<Protocol, Executor>(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(const executor_type&)
+ * constructor.
+ */
+ basic_datagram_socket& operator=(basic_datagram_socket&& other)
+ {
+ basic_socket<Protocol, Executor>::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(const executor_type&)
+ * constructor.
+ */
+ template <typename Protocol1, typename Executor1>
+ basic_datagram_socket(basic_datagram_socket<Protocol1, Executor1>&& other,
+ constraint_t<
+ is_convertible<Protocol1, Protocol>::value
+ && is_convertible<Executor1, Executor>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(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(const executor_type&)
+ * constructor.
+ */
+ template <typename Protocol1, typename Executor1>
+ constraint_t<
+ is_convertible<Protocol1, Protocol>::value
+ && is_convertible<Executor1, Executor>::value,
+ basic_datagram_socket&
+ > operator=(basic_datagram_socket<Protocol1, Executor1>&& other)
+ {
+ basic_socket<Protocol, Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// 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 <typename ConstBufferSequence>
+ std::size_t send(const ConstBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().send(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t send(const ConstBufferSequence& buffers,
+ socket_base::message_flags flags)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().send(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t send(const ConstBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ return this->impl_.get_service().send(
+ this->impl_.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.
+ * It is an initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the send completes. Potential
+ * completion tokens include @ref use_future, @ref use_awaitable, @ref
+ * yield_context, or a function object with the correct completion signature.
+ * The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_send(const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_send>(), token,
+ buffers, socket_base::message_flags(0)))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_send(this), token,
+ buffers, socket_base::message_flags(0));
+ }
+
+ /// Start an asynchronous send on a connected socket.
+ /**
+ * This function is used to asynchronously send data on the datagram socket.
+ * It is an initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param flags Flags specifying how the send call is to be made.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the send completes. Potential
+ * completion tokens include @ref use_future, @ref use_awaitable, @ref
+ * yield_context, or a function object with the correct completion signature.
+ * The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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 Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_send(const ConstBufferSequence& buffers,
+ socket_base::message_flags flags,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_send>(), token, buffers, flags))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_send(this), token, buffers, flags);
+ }
+
+ /// 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 <typename ConstBufferSequence>
+ std::size_t send_to(const ConstBufferSequence& buffers,
+ const endpoint_type& destination)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().send_to(
+ this->impl_.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 <typename ConstBufferSequence>
+ 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->impl_.get_service().send_to(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t send_to(const ConstBufferSequence& buffers,
+ const endpoint_type& destination, socket_base::message_flags flags,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().send_to(this->impl_.get_implementation(),
+ buffers, destination, flags, ec);
+ }
+
+ /// Start an asynchronous send.
+ /**
+ * This function is used to asynchronously send a datagram to the specified
+ * remote endpoint. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the send completes. Potential
+ * completion tokens include @ref use_future, @ref use_awaitable, @ref
+ * yield_context, or a function object with the correct completion signature.
+ * The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_send_to(const ConstBufferSequence& buffers,
+ const endpoint_type& destination,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_send_to>(), token, buffers,
+ destination, socket_base::message_flags(0)))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_send_to(this), token, buffers,
+ destination, socket_base::message_flags(0));
+ }
+
+ /// Start an asynchronous send.
+ /**
+ * This function is used to asynchronously send a datagram to the specified
+ * remote endpoint. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the send completes. Potential
+ * completion tokens include @ref use_future, @ref use_awaitable, @ref
+ * yield_context, or a function object with the correct completion signature.
+ * The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_send_to(const ConstBufferSequence& buffers,
+ const endpoint_type& destination, socket_base::message_flags flags,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_send_to>(), token,
+ buffers, destination, flags))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_send_to(this), token,
+ buffers, destination, flags);
+ }
+
+ /// 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 <typename MutableBufferSequence>
+ std::size_t receive(const MutableBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().receive(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags flags)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().receive(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ return this->impl_.get_service().receive(
+ this->impl_.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. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the receive completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_receive(const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive>(), token,
+ buffers, socket_base::message_flags(0)))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive(this), token,
+ buffers, socket_base::message_flags(0));
+ }
+
+ /// Start an asynchronous receive on a connected socket.
+ /**
+ * This function is used to asynchronously receive data from the datagram
+ * socket. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param flags Flags specifying how the receive call is to be made.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the receive completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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 Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags flags,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive>(), token, buffers, flags))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive(this), token, buffers, flags);
+ }
+
+ /// 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 <typename MutableBufferSequence>
+ std::size_t receive_from(const MutableBufferSequence& buffers,
+ endpoint_type& sender_endpoint)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().receive_from(
+ this->impl_.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 <typename MutableBufferSequence>
+ 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->impl_.get_service().receive_from(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t receive_from(const MutableBufferSequence& buffers,
+ endpoint_type& sender_endpoint, socket_base::message_flags flags,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().receive_from(
+ this->impl_.get_implementation(), buffers, sender_endpoint, flags, ec);
+ }
+
+ /// Start an asynchronous receive.
+ /**
+ * This function is used to asynchronously receive a datagram. It is an
+ * initiating function for an @ref asynchronous_operation, and 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 completion 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
+ * completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the receive completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_receive_from(const MutableBufferSequence& buffers,
+ endpoint_type& sender_endpoint,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive_from>(), token, buffers,
+ &sender_endpoint, socket_base::message_flags(0)))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive_from(this), token, buffers,
+ &sender_endpoint, socket_base::message_flags(0));
+ }
+
+ /// Start an asynchronous receive.
+ /**
+ * This function is used to asynchronously receive a datagram. It is an
+ * initiating function for an @ref asynchronous_operation, and 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 completion 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
+ * completion handler is called.
+ *
+ * @param flags Flags specifying how the receive call is to be made.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the receive completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_receive_from(const MutableBufferSequence& buffers,
+ endpoint_type& sender_endpoint, socket_base::message_flags flags,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive_from>(), token,
+ buffers, &sender_endpoint, flags))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive_from(this), token,
+ buffers, &sender_endpoint, flags);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_datagram_socket(const basic_datagram_socket&) = delete;
+ basic_datagram_socket& operator=(
+ const basic_datagram_socket&) = delete;
+
+ class initiate_async_send
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_send(basic_datagram_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers,
+ socket_base::message_flags flags) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_send(
+ self_->impl_.get_implementation(), buffers, flags,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_datagram_socket* self_;
+ };
+
+ class initiate_async_send_to
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_send_to(basic_datagram_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers, const endpoint_type& destination,
+ socket_base::message_flags flags) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_send_to(
+ self_->impl_.get_implementation(), buffers, destination,
+ flags, handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_datagram_socket* self_;
+ };
+
+ class initiate_async_receive
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_receive(basic_datagram_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers,
+ socket_base::message_flags flags) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_receive(
+ self_->impl_.get_implementation(), buffers, flags,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_datagram_socket* self_;
+ };
+
+ class initiate_async_receive_from
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_receive_from(basic_datagram_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers, endpoint_type* sender_endpoint,
+ socket_base::message_flags flags) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_receive_from(
+ self_->impl_.get_implementation(), buffers, *sender_endpoint,
+ flags, handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_datagram_socket* self_;
+ };
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BASIC_DATAGRAM_SOCKET_HPP
diff --git a/3rdparty/asio/include/asio/basic_deadline_timer.hpp b/3rdparty/asio/include/asio/basic_deadline_timer.hpp
new file mode 100644
index 00000000000..9343591bf8b
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_deadline_timer.hpp
@@ -0,0 +1,710 @@
+//
+// basic_deadline_timer.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include "asio/any_io_executor.hpp"
+#include "asio/detail/deadline_timer_service.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/time_traits.hpp"
+
+#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(my_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(my_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 <typename Time,
+ typename TimeTraits = asio::time_traits<Time>,
+ typename Executor = any_io_executor>
+class basic_deadline_timer
+{
+private:
+ class initiate_async_wait;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the timer type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The timer type when rebound to the specified executor.
+ typedef basic_deadline_timer<Time, TimeTraits, Executor1> other;
+ };
+
+ /// 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 ex The I/O executor that the timer will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the timer.
+ */
+ explicit basic_deadline_timer(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the timer will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the timer.
+ */
+ template <typename ExecutionContext>
+ explicit basic_deadline_timer(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// Constructor to set a particular expiry time as an absolute time.
+ /**
+ * This constructor creates a timer and sets the expiry time.
+ *
+ * @param ex The I/O executor that the timer will use, by default, 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(const executor_type& ex, const time_type& expiry_time)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().expires_at(impl_.get_implementation(), expiry_time, ec);
+ asio::detail::throw_error(ec, "expires_at");
+ }
+
+ /// Constructor to set a particular expiry time as an absolute time.
+ /**
+ * This constructor creates a timer and sets the expiry time.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the timer will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_deadline_timer(ExecutionContext& context, const time_type& expiry_time,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().expires_at(impl_.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 ex The I/O executor that the timer will use, by default, 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(const executor_type& ex,
+ const duration_type& expiry_time)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().expires_from_now(
+ impl_.get_implementation(), expiry_time, ec);
+ asio::detail::throw_error(ec, "expires_from_now");
+ }
+
+ /// Constructor to set a particular expiry time relative to now.
+ /**
+ * This constructor creates a timer and sets the expiry time.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the timer will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_deadline_timer(ExecutionContext& context,
+ const duration_type& expiry_time,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().expires_from_now(
+ impl_.get_implementation(), expiry_time, ec);
+ asio::detail::throw_error(ec, "expires_from_now");
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_deadline_timer(basic_deadline_timer&& other)
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_deadline_timer& operator=(basic_deadline_timer&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ /// 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()
+ {
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return impl_.get_executor();
+ }
+
+ /// 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 = impl_.get_service().cancel(impl_.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 impl_.get_service().cancel(impl_.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 = impl_.get_service().cancel_one(
+ impl_.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 impl_.get_service().cancel_one(impl_.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 impl_.get_service().expires_at(impl_.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 = impl_.get_service().expires_at(
+ impl_.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 impl_.get_service().expires_at(
+ impl_.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 impl_.get_service().expires_from_now(impl_.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 = impl_.get_service().expires_from_now(
+ impl_.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 impl_.get_service().expires_from_now(
+ impl_.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;
+ impl_.get_service().wait(impl_.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)
+ {
+ impl_.get_service().wait(impl_.get_implementation(), ec);
+ }
+
+ /// Start an asynchronous wait on the timer.
+ /**
+ * This function may be used to initiate an asynchronous wait against the
+ * timer. It is an initiating function for an @ref asynchronous_operation,
+ * and always returns immediately.
+ *
+ * For each call to async_wait(), the completion handler will be called
+ * exactly once. The completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the timer expires. Potential
+ * completion tokens include @ref use_future, @ref use_awaitable, @ref
+ * yield_context, or a function object with the correct completion signature.
+ * The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ WaitToken = default_completion_token_t<executor_type>>
+ auto async_wait(
+ WaitToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WaitToken, void (asio::error_code)>(
+ declval<initiate_async_wait>(), token))
+ {
+ return async_initiate<WaitToken, void (asio::error_code)>(
+ initiate_async_wait(this), token);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_deadline_timer(const basic_deadline_timer&) = delete;
+ basic_deadline_timer& operator=(
+ const basic_deadline_timer&) = delete;
+
+ class initiate_async_wait
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_wait(basic_deadline_timer* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WaitHandler>
+ void operator()(WaitHandler&& handler) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WaitHandler> handler2(handler);
+ self_->impl_.get_service().async_wait(
+ self_->impl_.get_implementation(),
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_deadline_timer* self_;
+ };
+
+ detail::io_object_impl<
+ detail::deadline_timer_service<TimeTraits>, Executor> impl_;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_BASIC_DEADLINE_TIMER_HPP
diff --git a/3rdparty/asio/include/asio/basic_file.hpp b/3rdparty/asio/include/asio/basic_file.hpp
new file mode 100644
index 00000000000..dbdb6d843d0
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_file.hpp
@@ -0,0 +1,824 @@
+//
+// basic_file.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_FILE_HPP
+#define ASIO_BASIC_FILE_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_FILE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include <string>
+#include <utility>
+#include "asio/any_io_executor.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/cstdint.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/post.hpp"
+#include "asio/file_base.hpp"
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_file_service.hpp"
+#elif defined(ASIO_HAS_IO_URING)
+# include "asio/detail/io_uring_file_service.hpp"
+#endif
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if !defined(ASIO_BASIC_FILE_FWD_DECL)
+#define ASIO_BASIC_FILE_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Executor = any_io_executor>
+class basic_file;
+
+#endif // !defined(ASIO_BASIC_FILE_FWD_DECL)
+
+/// Provides file functionality.
+/**
+ * The basic_file class template provides functionality that is common to both
+ * stream-oriented and random-access files.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ */
+template <typename Executor>
+class basic_file
+ : public file_base
+{
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the file type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The file type when rebound to the specified executor.
+ typedef basic_file<Executor1> other;
+ };
+
+ /// The native representation of a file.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#elif defined(ASIO_HAS_IOCP)
+ typedef detail::win_iocp_file_service::native_handle_type native_handle_type;
+#elif defined(ASIO_HAS_IO_URING)
+ typedef detail::io_uring_file_service::native_handle_type native_handle_type;
+#endif
+
+ /// Construct a basic_file without opening it.
+ /**
+ * This constructor initialises a file without opening it.
+ *
+ * @param ex The I/O executor that the file will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the file.
+ */
+ explicit basic_file(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// Construct a basic_file without opening it.
+ /**
+ * This constructor initialises a file without opening it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the file will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the file.
+ */
+ template <typename ExecutionContext>
+ explicit basic_file(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// Construct and open a basic_file.
+ /**
+ * This constructor initialises a file and opens it.
+ *
+ * @param ex The I/O executor that the file will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the file.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ */
+ explicit basic_file(const executor_type& ex,
+ const char* path, file_base::flags open_flags)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.get_implementation(), path, open_flags, ec);
+ asio::detail::throw_error(ec, "open");
+ }
+
+ /// Construct a basic_file without opening it.
+ /**
+ * This constructor initialises a file and opens it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the file will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the file.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ */
+ template <typename ExecutionContext>
+ explicit basic_file(ExecutionContext& context,
+ const char* path, file_base::flags open_flags,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.get_implementation(), path, open_flags, ec);
+ asio::detail::throw_error(ec, "open");
+ }
+
+ /// Construct and open a basic_file.
+ /**
+ * This constructor initialises a file and opens it.
+ *
+ * @param ex The I/O executor that the file will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the file.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ */
+ explicit basic_file(const executor_type& ex,
+ const std::string& path, file_base::flags open_flags)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.get_implementation(),
+ path.c_str(), open_flags, ec);
+ asio::detail::throw_error(ec, "open");
+ }
+
+ /// Construct a basic_file without opening it.
+ /**
+ * This constructor initialises a file and opens it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the file will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the file.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ */
+ template <typename ExecutionContext>
+ explicit basic_file(ExecutionContext& context,
+ const std::string& path, file_base::flags open_flags,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.get_implementation(),
+ path.c_str(), open_flags, ec);
+ asio::detail::throw_error(ec, "open");
+ }
+
+ /// Construct a basic_file on an existing native file handle.
+ /**
+ * This constructor initialises a file object to hold an existing native file.
+ *
+ * @param ex The I/O executor that the file will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the file.
+ *
+ * @param native_file A native file handle.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_file(const executor_type& ex, const native_handle_type& native_file)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(
+ impl_.get_implementation(), native_file, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Construct a basic_file on an existing native file.
+ /**
+ * This constructor initialises a file object to hold an existing native file.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the file will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the file.
+ *
+ * @param native_file A native file.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_file(ExecutionContext& context, const native_handle_type& native_file,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(
+ impl_.get_implementation(), native_file, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Move-construct a basic_file from another.
+ /**
+ * This constructor moves a file from one object to another.
+ *
+ * @param other The other basic_file 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_file(const executor_type&) constructor.
+ */
+ basic_file(basic_file&& other) noexcept
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// Move-assign a basic_file from another.
+ /**
+ * This assignment operator moves a file from one object to another.
+ *
+ * @param other The other basic_file 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_file(const executor_type&) constructor.
+ */
+ basic_file& operator=(basic_file&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ // All files have access to each other's implementations.
+ template <typename Executor1>
+ friend class basic_file;
+
+ /// Move-construct a basic_file from a file of another executor type.
+ /**
+ * This constructor moves a file from one object to another.
+ *
+ * @param other The other basic_file 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_file(const executor_type&) constructor.
+ */
+ template <typename Executor1>
+ basic_file(basic_file<Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// Move-assign a basic_file from a file of another executor type.
+ /**
+ * This assignment operator moves a file from one object to another.
+ *
+ * @param other The other basic_file 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_file(const executor_type&) constructor.
+ */
+ template <typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_file&
+ > operator=(basic_file<Executor1>&& other)
+ {
+ basic_file tmp(std::move(other));
+ impl_ = std::move(tmp.impl_);
+ return *this;
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return impl_.get_executor();
+ }
+
+ /// Open the file using the specified path.
+ /**
+ * This function opens the file so that it will use the specified path.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ *
+ * @throws asio::system_error Thrown on failure.
+ *
+ * @par Example
+ * @code
+ * asio::stream_file file(my_context);
+ * file.open("/path/to/my/file", asio::stream_file::read_only);
+ * @endcode
+ */
+ void open(const char* path, file_base::flags open_flags)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.get_implementation(), path, open_flags, ec);
+ asio::detail::throw_error(ec, "open");
+ }
+
+ /// Open the file using the specified path.
+ /**
+ * This function opens the file so that it will use the specified path.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ *
+ * @par Example
+ * @code
+ * asio::stream_file file(my_context);
+ * asio::error_code ec;
+ * file.open("/path/to/my/file", asio::stream_file::read_only, ec);
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ ASIO_SYNC_OP_VOID open(const char* path,
+ file_base::flags open_flags, asio::error_code& ec)
+ {
+ impl_.get_service().open(impl_.get_implementation(), path, open_flags, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Open the file using the specified path.
+ /**
+ * This function opens the file so that it will use the specified path.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ *
+ * @throws asio::system_error Thrown on failure.
+ *
+ * @par Example
+ * @code
+ * asio::stream_file file(my_context);
+ * file.open("/path/to/my/file", asio::stream_file::read_only);
+ * @endcode
+ */
+ void open(const std::string& path, file_base::flags open_flags)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.get_implementation(),
+ path.c_str(), open_flags, ec);
+ asio::detail::throw_error(ec, "open");
+ }
+
+ /// Open the file using the specified path.
+ /**
+ * This function opens the file so that it will use the specified path.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ *
+ * @par Example
+ * @code
+ * asio::stream_file file(my_context);
+ * asio::error_code ec;
+ * file.open("/path/to/my/file", asio::stream_file::read_only, ec);
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ ASIO_SYNC_OP_VOID open(const std::string& path,
+ file_base::flags open_flags, asio::error_code& ec)
+ {
+ impl_.get_service().open(impl_.get_implementation(),
+ path.c_str(), open_flags, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Assign an existing native file to the file.
+ /*
+ * This function opens the file to hold an existing native file.
+ *
+ * @param native_file A native file.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ void assign(const native_handle_type& native_file)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(
+ impl_.get_implementation(), native_file, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Assign an existing native file to the file.
+ /*
+ * This function opens the file to hold an existing native file.
+ *
+ * @param native_file A native file.
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ */
+ ASIO_SYNC_OP_VOID assign(const native_handle_type& native_file,
+ asio::error_code& ec)
+ {
+ impl_.get_service().assign(
+ impl_.get_implementation(), native_file, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Determine whether the file is open.
+ bool is_open() const
+ {
+ return impl_.get_service().is_open(impl_.get_implementation());
+ }
+
+ /// Close the file.
+ /**
+ * This function is used to close the file. 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;
+ impl_.get_service().close(impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "close");
+ }
+
+ /// Close the file.
+ /**
+ * This function is used to close the file. 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.
+ *
+ * @par Example
+ * @code
+ * asio::stream_file file(my_context);
+ * ...
+ * asio::error_code ec;
+ * file.close(ec);
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ ASIO_SYNC_OP_VOID close(asio::error_code& ec)
+ {
+ impl_.get_service().close(impl_.get_implementation(), ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Release ownership of the underlying native file.
+ /**
+ * This function causes all outstanding asynchronous read and write
+ * operations to finish immediately, and the handlers for cancelled
+ * operations will be passed the asio::error::operation_aborted error.
+ * Ownership of the native file 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 = impl_.get_service().release(
+ impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "release");
+ return s;
+ }
+
+ /// Release ownership of the underlying native file.
+ /**
+ * This function causes all outstanding asynchronous read and write
+ * operations to finish immediately, and the handlers for cancelled
+ * operations will be passed the asio::error::operation_aborted error.
+ * Ownership of the native file 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 impl_.get_service().release(impl_.get_implementation(), ec);
+ }
+
+ /// Get the native file representation.
+ /**
+ * This function may be used to obtain the underlying representation of the
+ * file. This is intended to allow access to native file functionality
+ * that is not otherwise provided.
+ */
+ native_handle_type native_handle()
+ {
+ return impl_.get_service().native_handle(impl_.get_implementation());
+ }
+
+ /// Cancel all asynchronous operations associated with the file.
+ /**
+ * This function causes all outstanding asynchronous read and 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.
+ *
+ * @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 the close() function to
+ * simultaneously cancel the outstanding operations and close the file.
+ *
+ * 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;
+ impl_.get_service().cancel(impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "cancel");
+ }
+
+ /// Cancel all asynchronous operations associated with the file.
+ /**
+ * This function causes all outstanding asynchronous read and 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.
+ *
+ * @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 the close() function to
+ * simultaneously cancel the outstanding operations and close the file.
+ *
+ * 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)
+ {
+ impl_.get_service().cancel(impl_.get_implementation(), ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Get the size of the file.
+ /**
+ * This function determines the size of the file, in bytes.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ uint64_t size() const
+ {
+ asio::error_code ec;
+ uint64_t s = impl_.get_service().size(impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "size");
+ return s;
+ }
+
+ /// Get the size of the file.
+ /**
+ * This function determines the size of the file, in bytes.
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ */
+ uint64_t size(asio::error_code& ec) const
+ {
+ return impl_.get_service().size(impl_.get_implementation(), ec);
+ }
+
+ /// Alter the size of the file.
+ /**
+ * This function resizes the file to the specified size, in bytes. If the
+ * current file size exceeds @c n then any extra data is discarded. If the
+ * current size is less than @c n then the file is extended and filled with
+ * zeroes.
+ *
+ * @param n The new size for the file.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ void resize(uint64_t n)
+ {
+ asio::error_code ec;
+ impl_.get_service().resize(impl_.get_implementation(), n, ec);
+ asio::detail::throw_error(ec, "resize");
+ }
+
+ /// Alter the size of the file.
+ /**
+ * This function resizes the file to the specified size, in bytes. If the
+ * current file size exceeds @c n then any extra data is discarded. If the
+ * current size is less than @c n then the file is extended and filled with
+ * zeroes.
+ *
+ * @param n The new size for the file.
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ */
+ ASIO_SYNC_OP_VOID resize(uint64_t n, asio::error_code& ec)
+ {
+ impl_.get_service().resize(impl_.get_implementation(), n, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Synchronise the file to disk.
+ /**
+ * This function synchronises the file data and metadata to disk. Note that
+ * the semantics of this synchronisation vary between operation systems.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ void sync_all()
+ {
+ asio::error_code ec;
+ impl_.get_service().sync_all(impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "sync_all");
+ }
+
+ /// Synchronise the file to disk.
+ /**
+ * This function synchronises the file data and metadata to disk. Note that
+ * the semantics of this synchronisation vary between operation systems.
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ */
+ ASIO_SYNC_OP_VOID sync_all(asio::error_code& ec)
+ {
+ impl_.get_service().sync_all(impl_.get_implementation(), ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Synchronise the file data to disk.
+ /**
+ * This function synchronises the file data to disk. Note that the semantics
+ * of this synchronisation vary between operation systems.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ void sync_data()
+ {
+ asio::error_code ec;
+ impl_.get_service().sync_data(impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "sync_data");
+ }
+
+ /// Synchronise the file data to disk.
+ /**
+ * This function synchronises the file data to disk. Note that the semantics
+ * of this synchronisation vary between operation systems.
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ */
+ ASIO_SYNC_OP_VOID sync_data(asio::error_code& ec)
+ {
+ impl_.get_service().sync_data(impl_.get_implementation(), ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+protected:
+ /// Protected destructor to prevent deletion through this type.
+ /**
+ * This function destroys the file, cancelling any outstanding asynchronous
+ * operations associated with the file as if by calling @c cancel.
+ */
+ ~basic_file()
+ {
+ }
+
+#if defined(ASIO_HAS_IOCP)
+ detail::io_object_impl<detail::win_iocp_file_service, Executor> impl_;
+#elif defined(ASIO_HAS_IO_URING)
+ detail::io_object_impl<detail::io_uring_file_service, Executor> impl_;
+#endif
+
+private:
+ // Disallow copying and assignment.
+ basic_file(const basic_file&) = delete;
+ basic_file& operator=(const basic_file&) = delete;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_FILE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_BASIC_FILE_HPP
diff --git a/3rdparty/asio/include/asio/basic_io_object.hpp b/3rdparty/asio/include/asio/basic_io_object.hpp
new file mode 100644
index 00000000000..7e502206ff8
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_io_object.hpp
@@ -0,0 +1,286 @@
+//
+// basic_io_object.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 {
+
+namespace detail
+{
+ // Type trait used to determine whether a service supports move.
+ template <typename IoObjectService>
+ class service_has_move
+ {
+ private:
+ typedef IoObjectService service_type;
+ typedef typename service_type::implementation_type implementation_type;
+
+ template <typename T, typename U>
+ 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<service_type*>(0),
+ static_cast<implementation_type*>(0))) == 1;
+ };
+}
+
+/// 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(GENERATING_DOCUMENTATION)
+template <typename IoObjectService>
+#else
+template <typename IoObjectService,
+ bool Movable = detail::service_has_move<IoObjectService>::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() 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<IoObjectService>(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 <typename IoObjectService1>
+ 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_;
+};
+
+// Specialisation for movable objects.
+template <typename IoObjectService>
+class basic_io_object<IoObjectService, true>
+{
+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() noexcept
+ {
+ return service_->get_io_context().get_executor();
+ }
+
+protected:
+ explicit basic_io_object(asio::io_context& io_context)
+ : service_(&asio::use_service<IoObjectService>(io_context))
+ {
+ service_->construct(implementation_);
+ }
+
+ basic_io_object(basic_io_object&& other)
+ : service_(&other.get_service())
+ {
+ service_->move_construct(implementation_, other.implementation_);
+ }
+
+ template <typename IoObjectService1>
+ basic_io_object(IoObjectService1& other_service,
+ typename IoObjectService1::implementation_type& other_implementation)
+ : service_(&asio::use_service<IoObjectService>(
+ 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_;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BASIC_IO_OBJECT_HPP
diff --git a/3rdparty/asio/include/asio/basic_random_access_file.hpp b/3rdparty/asio/include/asio/basic_random_access_file.hpp
new file mode 100644
index 00000000000..fe88f420560
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_random_access_file.hpp
@@ -0,0 +1,689 @@
+//
+// basic_random_access_file.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_RANDOM_ACCESS_FILE_HPP
+#define ASIO_BASIC_RANDOM_ACCESS_FILE_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_FILE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include <cstddef>
+#include "asio/async_result.hpp"
+#include "asio/basic_file.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if !defined(ASIO_BASIC_RANDOM_ACCESS_FILE_FWD_DECL)
+#define ASIO_BASIC_RANDOM_ACCESS_FILE_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Executor = any_io_executor>
+class basic_random_access_file;
+
+#endif // !defined(ASIO_BASIC_RANDOM_ACCESS_FILE_FWD_DECL)
+
+/// Provides random-access file functionality.
+/**
+ * The basic_random_access_file class template provides asynchronous and
+ * blocking random-access file functionality.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ *
+ * Synchronous @c read_some_at and @c write_some_at operations are thread safe
+ * with respect to each other, if the underlying operating system calls are
+ * also thread safe. This means that it is permitted to perform concurrent
+ * calls to these synchronous operations on a single file object. Other
+ * synchronous operations, such as @c open or @c close, are not thread safe.
+ */
+template <typename Executor>
+class basic_random_access_file
+ : public basic_file<Executor>
+{
+private:
+ class initiate_async_write_some_at;
+ class initiate_async_read_some_at;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the file type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The file type when rebound to the specified executor.
+ typedef basic_random_access_file<Executor1> other;
+ };
+
+ /// The native representation of a file.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#else
+ typedef typename basic_file<Executor>::native_handle_type native_handle_type;
+#endif
+
+ /// Construct a basic_random_access_file without opening it.
+ /**
+ * This constructor initialises a file without opening it. The file needs to
+ * be opened before data can be read from or or written to it.
+ *
+ * @param ex The I/O executor that the file will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the file.
+ */
+ explicit basic_random_access_file(const executor_type& ex)
+ : basic_file<Executor>(ex)
+ {
+ }
+
+ /// Construct a basic_random_access_file without opening it.
+ /**
+ * This constructor initialises a file without opening it. The file needs to
+ * be opened before data can be read from or or written to it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the file will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the file.
+ */
+ template <typename ExecutionContext>
+ explicit basic_random_access_file(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_file<Executor>(context)
+ {
+ }
+
+ /// Construct and open a basic_random_access_file.
+ /**
+ * This constructor initialises and opens a file.
+ *
+ * @param ex The I/O executor that the file will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the file.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_random_access_file(const executor_type& ex,
+ const char* path, file_base::flags open_flags)
+ : basic_file<Executor>(ex, path, open_flags)
+ {
+ }
+
+ /// Construct and open a basic_random_access_file.
+ /**
+ * This constructor initialises and opens a file.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the file will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the file.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_random_access_file(ExecutionContext& context,
+ const char* path, file_base::flags open_flags,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_file<Executor>(context, path, open_flags)
+ {
+ }
+
+ /// Construct and open a basic_random_access_file.
+ /**
+ * This constructor initialises and opens a file.
+ *
+ * @param ex The I/O executor that the file will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the file.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_random_access_file(const executor_type& ex,
+ const std::string& path, file_base::flags open_flags)
+ : basic_file<Executor>(ex, path, open_flags)
+ {
+ }
+
+ /// Construct and open a basic_random_access_file.
+ /**
+ * This constructor initialises and opens a file.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the file will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the file.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_random_access_file(ExecutionContext& context,
+ const std::string& path, file_base::flags open_flags,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_file<Executor>(context, path, open_flags)
+ {
+ }
+
+ /// Construct a basic_random_access_file on an existing native file.
+ /**
+ * This constructor initialises a random-access file object to hold an
+ * existing native file.
+ *
+ * @param ex The I/O executor that the file will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the file.
+ *
+ * @param native_file The new underlying file implementation.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_random_access_file(const executor_type& ex,
+ const native_handle_type& native_file)
+ : basic_file<Executor>(ex, native_file)
+ {
+ }
+
+ /// Construct a basic_random_access_file on an existing native file.
+ /**
+ * This constructor initialises a random-access file object to hold an
+ * existing native file.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the file will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the file.
+ *
+ * @param native_file The new underlying file implementation.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_random_access_file(ExecutionContext& context,
+ const native_handle_type& native_file,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_file<Executor>(context, native_file)
+ {
+ }
+
+ /// Move-construct a basic_random_access_file from another.
+ /**
+ * This constructor moves a random-access file from one object to another.
+ *
+ * @param other The other basic_random_access_file 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_file(const executor_type&)
+ * constructor.
+ */
+ basic_random_access_file(basic_random_access_file&& other) noexcept
+ : basic_file<Executor>(std::move(other))
+ {
+ }
+
+ /// Move-assign a basic_random_access_file from another.
+ /**
+ * This assignment operator moves a random-access file from one object to
+ * another.
+ *
+ * @param other The other basic_random_access_file 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_file(const executor_type&)
+ * constructor.
+ */
+ basic_random_access_file& operator=(basic_random_access_file&& other)
+ {
+ basic_file<Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// Move-construct a basic_random_access_file from a file of another executor
+ /// type.
+ /**
+ * This constructor moves a random-access file from one object to another.
+ *
+ * @param other The other basic_random_access_file 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_file(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ basic_random_access_file(basic_random_access_file<Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_file<Executor>(std::move(other))
+ {
+ }
+
+ /// Move-assign a basic_random_access_file from a file of another executor
+ /// type.
+ /**
+ * This assignment operator moves a random-access file from one object to
+ * another.
+ *
+ * @param other The other basic_random_access_file 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_file(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_random_access_file&
+ > operator=(basic_random_access_file<Executor1>&& other)
+ {
+ basic_file<Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// Destroys the file.
+ /**
+ * This function destroys the file, cancelling any outstanding asynchronous
+ * operations associated with the file as if by calling @c cancel.
+ */
+ ~basic_random_access_file()
+ {
+ }
+
+ /// 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 end of the file was reached.
+ *
+ * @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 <typename ConstBufferSequence>
+ std::size_t write_some_at(uint64_t offset,
+ const ConstBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().write_some_at(
+ this->impl_.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 write all of the data to the
+ * file. Consider using the @ref write_at function if you need to ensure that
+ * all data is written before the blocking operation completes.
+ */
+ template <typename ConstBufferSequence>
+ std::size_t write_some_at(uint64_t offset,
+ const ConstBufferSequence& buffers, asio::error_code& ec)
+ {
+ return this->impl_.get_service().write_some_at(
+ this->impl_.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. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @note The write operation may not write all of the data to the file.
+ * 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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_write_some_at(uint64_t offset, const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_write_some_at>(), token, offset, buffers))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_write_some_at(this), token, offset, buffers);
+ }
+
+ /// 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 end of the file was reached.
+ *
+ * @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 <typename MutableBufferSequence>
+ std::size_t read_some_at(uint64_t offset,
+ const MutableBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().read_some_at(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t read_some_at(uint64_t offset,
+ const MutableBufferSequence& buffers, asio::error_code& ec)
+ {
+ return this->impl_.get_service().read_some_at(
+ this->impl_.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. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_read_some_at(uint64_t offset, const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_read_some_at>(), token, offset, buffers))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_read_some_at(this), token, offset, buffers);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_random_access_file(const basic_random_access_file&) = delete;
+ basic_random_access_file& operator=(
+ const basic_random_access_file&) = delete;
+
+ class initiate_async_write_some_at
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_write_some_at(basic_random_access_file* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ uint64_t offset, const ConstBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_write_some_at(
+ self_->impl_.get_implementation(), offset, buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_random_access_file* self_;
+ };
+
+ class initiate_async_read_some_at
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_read_some_at(basic_random_access_file* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ uint64_t offset, const MutableBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_read_some_at(
+ self_->impl_.get_implementation(), offset, buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_random_access_file* self_;
+ };
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_FILE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_BASIC_RANDOM_ACCESS_FILE_HPP
diff --git a/3rdparty/asio/include/asio/basic_raw_socket.hpp b/3rdparty/asio/include/asio/basic_raw_socket.hpp
new file mode 100644
index 00000000000..112090900ce
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_raw_socket.hpp
@@ -0,0 +1,1356 @@
+//
+// basic_raw_socket.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include "asio/basic_socket.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if !defined(ASIO_BASIC_RAW_SOCKET_FWD_DECL)
+#define ASIO_BASIC_RAW_SOCKET_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Protocol, typename Executor = any_io_executor>
+class basic_raw_socket;
+
+#endif // !defined(ASIO_BASIC_RAW_SOCKET_FWD_DECL)
+
+/// 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.
+ *
+ * Synchronous @c send, @c send_to, @c receive, @c receive_from, @c connect,
+ * and @c shutdown operations are thread safe with respect to each other, if
+ * the underlying operating system calls are also thread safe. This means that
+ * it is permitted to perform concurrent calls to these synchronous operations
+ * on a single socket object. Other synchronous operations, such as @c open or
+ * @c close, are not thread safe.
+ */
+template <typename Protocol, typename Executor>
+class basic_raw_socket
+ : public basic_socket<Protocol, Executor>
+{
+private:
+ class initiate_async_send;
+ class initiate_async_send_to;
+ class initiate_async_receive;
+ class initiate_async_receive_from;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the socket type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The socket type when rebound to the specified executor.
+ typedef basic_raw_socket<Protocol, Executor1> other;
+ };
+
+ /// The native representation of a socket.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#else
+ typedef typename basic_socket<Protocol,
+ Executor>::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 ex The I/O executor that the socket will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the socket.
+ */
+ explicit basic_raw_socket(const executor_type& ex)
+ : basic_socket<Protocol, Executor>(ex)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the socket will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the socket.
+ */
+ template <typename ExecutionContext>
+ explicit basic_raw_socket(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(context)
+ {
+ }
+
+ /// Construct and open a basic_raw_socket.
+ /**
+ * This constructor creates and opens a raw socket.
+ *
+ * @param ex The I/O executor that the socket will use, by default, 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(const executor_type& ex, const protocol_type& protocol)
+ : basic_socket<Protocol, Executor>(ex, protocol)
+ {
+ }
+
+ /// Construct and open a basic_raw_socket.
+ /**
+ * This constructor creates and opens a raw socket.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_raw_socket(ExecutionContext& context, const protocol_type& protocol,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_socket<Protocol, Executor>(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 ex The I/O executor that the socket will use, by default, 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(const executor_type& ex, const endpoint_type& endpoint)
+ : basic_socket<Protocol, Executor>(ex, endpoint)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_raw_socket(ExecutionContext& context, const endpoint_type& endpoint,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(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 ex The I/O executor that the socket will use, by default, 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(const executor_type& ex,
+ const protocol_type& protocol, const native_handle_type& native_socket)
+ : basic_socket<Protocol, Executor>(ex, protocol, native_socket)
+ {
+ }
+
+ /// Construct a basic_raw_socket on an existing native socket.
+ /**
+ * This constructor creates a raw socket object to hold an existing
+ * native socket.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_raw_socket(ExecutionContext& context,
+ const protocol_type& protocol, const native_handle_type& native_socket,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(context, protocol, native_socket)
+ {
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_raw_socket(basic_raw_socket&& other) noexcept
+ : basic_socket<Protocol, Executor>(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(const executor_type&)
+ * constructor.
+ */
+ basic_raw_socket& operator=(basic_raw_socket&& other)
+ {
+ basic_socket<Protocol, Executor>::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(const executor_type&)
+ * constructor.
+ */
+ template <typename Protocol1, typename Executor1>
+ basic_raw_socket(basic_raw_socket<Protocol1, Executor1>&& other,
+ constraint_t<
+ is_convertible<Protocol1, Protocol>::value
+ && is_convertible<Executor1, Executor>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(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(const executor_type&)
+ * constructor.
+ */
+ template <typename Protocol1, typename Executor1>
+ constraint_t<
+ is_convertible<Protocol1, Protocol>::value
+ && is_convertible<Executor1, Executor>::value,
+ basic_raw_socket&
+ > operator=(basic_raw_socket<Protocol1, Executor1>&& other)
+ {
+ basic_socket<Protocol, Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// 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 <typename ConstBufferSequence>
+ std::size_t send(const ConstBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().send(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t send(const ConstBufferSequence& buffers,
+ socket_base::message_flags flags)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().send(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t send(const ConstBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ return this->impl_.get_service().send(
+ this->impl_.get_implementation(), buffers, flags, ec);
+ }
+
+ /// Start an asynchronous send on a connected socket.
+ /**
+ * This function is used to asynchronously send data on the raw socket. It is
+ * an initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the send completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_send(const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_send>(), token,
+ buffers, socket_base::message_flags(0)))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_send(this), token,
+ buffers, socket_base::message_flags(0));
+ }
+
+ /// Start an asynchronous send on a connected socket.
+ /**
+ * This function is used to asynchronously send data on the raw socket. It is
+ * an initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param flags Flags specifying how the send call is to be made.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the send completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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 Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_send(const ConstBufferSequence& buffers,
+ socket_base::message_flags flags,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_send>(), token, buffers, flags))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_send(this), token, buffers, flags);
+ }
+
+ /// 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 <typename ConstBufferSequence>
+ std::size_t send_to(const ConstBufferSequence& buffers,
+ const endpoint_type& destination)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().send_to(
+ this->impl_.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 <typename ConstBufferSequence>
+ 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->impl_.get_service().send_to(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t send_to(const ConstBufferSequence& buffers,
+ const endpoint_type& destination, socket_base::message_flags flags,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().send_to(this->impl_.get_implementation(),
+ buffers, destination, flags, ec);
+ }
+
+ /// Start an asynchronous send.
+ /**
+ * This function is used to asynchronously send raw data to the specified
+ * remote endpoint. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the send completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_send_to(const ConstBufferSequence& buffers,
+ const endpoint_type& destination,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_send_to>(), token, buffers,
+ destination, socket_base::message_flags(0)))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_send_to(this), token, buffers,
+ destination, socket_base::message_flags(0));
+ }
+
+ /// Start an asynchronous send.
+ /**
+ * This function is used to asynchronously send raw data to the specified
+ * remote endpoint. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the send completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_send_to(const ConstBufferSequence& buffers,
+ const endpoint_type& destination, socket_base::message_flags flags,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_send_to>(), token,
+ buffers, destination, flags))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_send_to(this), token,
+ buffers, destination, flags);
+ }
+
+ /// 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 <typename MutableBufferSequence>
+ std::size_t receive(const MutableBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().receive(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags flags)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().receive(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ return this->impl_.get_service().receive(
+ this->impl_.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. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the receive completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_receive(const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive>(), token,
+ buffers, socket_base::message_flags(0)))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive(this), token,
+ buffers, socket_base::message_flags(0));
+ }
+
+ /// Start an asynchronous receive on a connected socket.
+ /**
+ * This function is used to asynchronously receive data from the raw
+ * socket. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param flags Flags specifying how the receive call is to be made.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the receive completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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 Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken
+ = default_completion_token_t<executor_type>>
+ auto async_receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags flags,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive>(), token, buffers, flags))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive(this), token, buffers, flags);
+ }
+
+ /// 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 <typename MutableBufferSequence>
+ std::size_t receive_from(const MutableBufferSequence& buffers,
+ endpoint_type& sender_endpoint)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().receive_from(
+ this->impl_.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 <typename MutableBufferSequence>
+ 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->impl_.get_service().receive_from(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t receive_from(const MutableBufferSequence& buffers,
+ endpoint_type& sender_endpoint, socket_base::message_flags flags,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().receive_from(
+ this->impl_.get_implementation(), buffers, sender_endpoint, flags, ec);
+ }
+
+ /// Start an asynchronous receive.
+ /**
+ * This function is used to asynchronously receive raw data. It is an
+ * initiating function for an @ref asynchronous_operation, and 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 completion 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
+ * completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the receive completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_receive_from(const MutableBufferSequence& buffers,
+ endpoint_type& sender_endpoint,
+ ReadToken&& token
+ = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive_from>(), token, buffers,
+ &sender_endpoint, socket_base::message_flags(0)))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive_from(this), token, buffers,
+ &sender_endpoint, socket_base::message_flags(0));
+ }
+
+ /// Start an asynchronous receive.
+ /**
+ * This function is used to asynchronously receive raw data. It is an
+ * initiating function for an @ref asynchronous_operation, and 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 completion 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
+ * completion handler is called.
+ *
+ * @param flags Flags specifying how the receive call is to be made.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the receive completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken
+ = default_completion_token_t<executor_type>>
+ auto async_receive_from(const MutableBufferSequence& buffers,
+ endpoint_type& sender_endpoint, socket_base::message_flags flags,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive_from>(), token,
+ buffers, &sender_endpoint, flags))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive_from(this), token,
+ buffers, &sender_endpoint, flags);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_raw_socket(const basic_raw_socket&) = delete;
+ basic_raw_socket& operator=(const basic_raw_socket&) = delete;
+
+ class initiate_async_send
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_send(basic_raw_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers,
+ socket_base::message_flags flags) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_send(
+ self_->impl_.get_implementation(), buffers, flags,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_raw_socket* self_;
+ };
+
+ class initiate_async_send_to
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_send_to(basic_raw_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers, const endpoint_type& destination,
+ socket_base::message_flags flags) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_send_to(
+ self_->impl_.get_implementation(), buffers, destination,
+ flags, handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_raw_socket* self_;
+ };
+
+ class initiate_async_receive
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_receive(basic_raw_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers,
+ socket_base::message_flags flags) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_receive(
+ self_->impl_.get_implementation(), buffers, flags,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_raw_socket* self_;
+ };
+
+ class initiate_async_receive_from
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_receive_from(basic_raw_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers, endpoint_type* sender_endpoint,
+ socket_base::message_flags flags) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_receive_from(
+ self_->impl_.get_implementation(), buffers, *sender_endpoint,
+ flags, handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_raw_socket* self_;
+ };
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BASIC_RAW_SOCKET_HPP
diff --git a/3rdparty/asio/include/asio/basic_readable_pipe.hpp b/3rdparty/asio/include/asio/basic_readable_pipe.hpp
new file mode 100644
index 00000000000..9a5a0653f6b
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_readable_pipe.hpp
@@ -0,0 +1,626 @@
+//
+// basic_readable_pipe.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_READABLE_PIPE_HPP
+#define ASIO_BASIC_READABLE_PIPE_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_PIPE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include <string>
+#include <utility>
+#include "asio/any_io_executor.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_handle_service.hpp"
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/io_uring_descriptor_service.hpp"
+#else
+# include "asio/detail/reactive_descriptor_service.hpp"
+#endif
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Provides pipe functionality.
+/**
+ * The basic_readable_pipe class provides a wrapper over pipe
+ * functionality.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ */
+template <typename Executor = any_io_executor>
+class basic_readable_pipe
+{
+private:
+ class initiate_async_read_some;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the pipe type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The pipe type when rebound to the specified executor.
+ typedef basic_readable_pipe<Executor1> other;
+ };
+
+ /// The native representation of a pipe.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#elif defined(ASIO_HAS_IOCP)
+ typedef detail::win_iocp_handle_service::native_handle_type
+ native_handle_type;
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ typedef detail::io_uring_descriptor_service::native_handle_type
+ native_handle_type;
+#else
+ typedef detail::reactive_descriptor_service::native_handle_type
+ native_handle_type;
+#endif
+
+ /// A basic_readable_pipe is always the lowest layer.
+ typedef basic_readable_pipe lowest_layer_type;
+
+ /// Construct a basic_readable_pipe without opening it.
+ /**
+ * This constructor creates a pipe without opening it.
+ *
+ * @param ex The I/O executor that the pipe will use, by default, to dispatch
+ * handlers for any asynchronous operations performed on the pipe.
+ */
+ explicit basic_readable_pipe(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// Construct a basic_readable_pipe without opening it.
+ /**
+ * This constructor creates a pipe without opening it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the pipe will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the pipe.
+ */
+ template <typename ExecutionContext>
+ explicit basic_readable_pipe(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// Construct a basic_readable_pipe on an existing native pipe.
+ /**
+ * This constructor creates a pipe object to hold an existing native
+ * pipe.
+ *
+ * @param ex The I/O executor that the pipe will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * pipe.
+ *
+ * @param native_pipe A native pipe.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_readable_pipe(const executor_type& ex,
+ const native_handle_type& native_pipe)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(),
+ native_pipe, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Construct a basic_readable_pipe on an existing native pipe.
+ /**
+ * This constructor creates a pipe object to hold an existing native
+ * pipe.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the pipe will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the pipe.
+ *
+ * @param native_pipe A native pipe.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_readable_pipe(ExecutionContext& context,
+ const native_handle_type& native_pipe,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(),
+ native_pipe, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Move-construct a basic_readable_pipe from another.
+ /**
+ * This constructor moves a pipe from one object to another.
+ *
+ * @param other The other basic_readable_pipe 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_readable_pipe(const executor_type&)
+ * constructor.
+ */
+ basic_readable_pipe(basic_readable_pipe&& other)
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// Move-assign a basic_readable_pipe from another.
+ /**
+ * This assignment operator moves a pipe from one object to another.
+ *
+ * @param other The other basic_readable_pipe 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_readable_pipe(const executor_type&)
+ * constructor.
+ */
+ basic_readable_pipe& operator=(basic_readable_pipe&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ // All pipes have access to each other's implementations.
+ template <typename Executor1>
+ friend class basic_readable_pipe;
+
+ /// Move-construct a basic_readable_pipe from a pipe of another executor type.
+ /**
+ * This constructor moves a pipe from one object to another.
+ *
+ * @param other The other basic_readable_pipe 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_readable_pipe(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ basic_readable_pipe(basic_readable_pipe<Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// Move-assign a basic_readable_pipe from a pipe of another executor type.
+ /**
+ * This assignment operator moves a pipe from one object to another.
+ *
+ * @param other The other basic_readable_pipe 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_readable_pipe(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_readable_pipe&
+ > operator=(basic_readable_pipe<Executor1>&& other)
+ {
+ basic_readable_pipe tmp(std::move(other));
+ impl_ = std::move(tmp.impl_);
+ return *this;
+ }
+
+ /// Destroys the pipe.
+ /**
+ * This function destroys the pipe, cancelling any outstanding
+ * asynchronous wait operations associated with the pipe as if by
+ * calling @c cancel.
+ */
+ ~basic_readable_pipe()
+ {
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return impl_.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 basic_readable_pipe 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_readable_pipe 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 pipe to the pipe.
+ /*
+ * This function opens the pipe to hold an existing native pipe.
+ *
+ * @param native_pipe A native pipe.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ void assign(const native_handle_type& native_pipe)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(), native_pipe, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Assign an existing native pipe to the pipe.
+ /*
+ * This function opens the pipe to hold an existing native pipe.
+ *
+ * @param native_pipe A native pipe.
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ */
+ ASIO_SYNC_OP_VOID assign(const native_handle_type& native_pipe,
+ asio::error_code& ec)
+ {
+ impl_.get_service().assign(impl_.get_implementation(), native_pipe, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Determine whether the pipe is open.
+ bool is_open() const
+ {
+ return impl_.get_service().is_open(impl_.get_implementation());
+ }
+
+ /// Close the pipe.
+ /**
+ * This function is used to close the pipe. Any asynchronous read 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;
+ impl_.get_service().close(impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "close");
+ }
+
+ /// Close the pipe.
+ /**
+ * This function is used to close the pipe. Any asynchronous read 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)
+ {
+ impl_.get_service().close(impl_.get_implementation(), ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Release ownership of the underlying native pipe.
+ /**
+ * This function causes all outstanding asynchronous read operations to
+ * finish immediately, and the handlers for cancelled operations will be
+ * passed the asio::error::operation_aborted error. Ownership of the
+ * native pipe 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 = impl_.get_service().release(
+ impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "release");
+ return s;
+ }
+
+ /// Release ownership of the underlying native pipe.
+ /**
+ * This function causes all outstanding asynchronous read operations to
+ * finish immediately, and the handlers for cancelled operations will be
+ * passed the asio::error::operation_aborted error. Ownership of the
+ * native pipe 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 impl_.get_service().release(impl_.get_implementation(), ec);
+ }
+
+ /// Get the native pipe representation.
+ /**
+ * This function may be used to obtain the underlying representation of the
+ * pipe. This is intended to allow access to native pipe
+ * functionality that is not otherwise provided.
+ */
+ native_handle_type native_handle()
+ {
+ return impl_.get_service().native_handle(impl_.get_implementation());
+ }
+
+ /// Cancel all asynchronous operations associated with the pipe.
+ /**
+ * This function causes all outstanding asynchronous read 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;
+ impl_.get_service().cancel(impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "cancel");
+ }
+
+ /// Cancel all asynchronous operations associated with the pipe.
+ /**
+ * This function causes all outstanding asynchronous read 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)
+ {
+ impl_.get_service().cancel(impl_.get_implementation(), ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Read some data from the pipe.
+ /**
+ * This function is used to read data from the pipe. 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
+ * basic_readable_pipe.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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = impl_.get_service().read_some(
+ impl_.get_implementation(), buffers, ec);
+ asio::detail::throw_error(ec, "read_some");
+ return s;
+ }
+
+ /// Read some data from the pipe.
+ /**
+ * This function is used to read data from the pipe. 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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return impl_.get_service().read_some(
+ impl_.get_implementation(), buffers, ec);
+ }
+
+ /// Start an asynchronous read.
+ /**
+ * This function is used to asynchronously read data from the pipe. It is an
+ * initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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
+ * basic_readable_pipe.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 <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_read_some(const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_read_some>(), token, buffers))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_read_some(this), token, buffers);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_readable_pipe(const basic_readable_pipe&) = delete;
+ basic_readable_pipe& operator=(const basic_readable_pipe&) = delete;
+
+ class initiate_async_read_some
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_read_some(basic_readable_pipe* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_read_some(
+ self_->impl_.get_implementation(), buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_readable_pipe* self_;
+ };
+
+#if defined(ASIO_HAS_IOCP)
+ detail::io_object_impl<detail::win_iocp_handle_service, Executor> impl_;
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ detail::io_object_impl<detail::io_uring_descriptor_service, Executor> impl_;
+#else
+ detail::io_object_impl<detail::reactive_descriptor_service, Executor> impl_;
+#endif
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_PIPE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_BASIC_READABLE_PIPE_HPP
diff --git a/3rdparty/asio/include/asio/basic_seq_packet_socket.hpp b/3rdparty/asio/include/asio/basic_seq_packet_socket.hpp
new file mode 100644
index 00000000000..cf2a4b6ad71
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_seq_packet_socket.hpp
@@ -0,0 +1,823 @@
+//
+// basic_seq_packet_socket.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include "asio/basic_socket.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 {
+
+#if !defined(ASIO_BASIC_SEQ_PACKET_SOCKET_FWD_DECL)
+#define ASIO_BASIC_SEQ_PACKET_SOCKET_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Protocol, typename Executor = any_io_executor>
+class basic_seq_packet_socket;
+
+#endif // !defined(ASIO_BASIC_SEQ_PACKET_SOCKET_FWD_DECL)
+
+/// 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.
+ *
+ * Synchronous @c send, @c receive, @c connect, and @c shutdown operations are
+ * thread safe with respect to each other, if the underlying operating system
+ * calls are also thread safe. This means that it is permitted to perform
+ * concurrent calls to these synchronous operations on a single socket object.
+ * Other synchronous operations, such as @c open or @c close, are not thread
+ * safe.
+ */
+template <typename Protocol, typename Executor>
+class basic_seq_packet_socket
+ : public basic_socket<Protocol, Executor>
+{
+private:
+ class initiate_async_send;
+ class initiate_async_receive_with_flags;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the socket type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The socket type when rebound to the specified executor.
+ typedef basic_seq_packet_socket<Protocol, Executor1> other;
+ };
+
+ /// The native representation of a socket.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#else
+ typedef typename basic_socket<Protocol,
+ Executor>::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 ex The I/O executor that the socket will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the socket.
+ */
+ explicit basic_seq_packet_socket(const executor_type& ex)
+ : basic_socket<Protocol, Executor>(ex)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the socket will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the socket.
+ */
+ template <typename ExecutionContext>
+ explicit basic_seq_packet_socket(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(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 ex The I/O executor that the socket will use, by default, 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(const executor_type& ex,
+ const protocol_type& protocol)
+ : basic_socket<Protocol, Executor>(ex, protocol)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_seq_packet_socket(ExecutionContext& context,
+ const protocol_type& protocol,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_socket<Protocol, Executor>(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 ex The I/O executor that the socket will use, by default, 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(const executor_type& ex,
+ const endpoint_type& endpoint)
+ : basic_socket<Protocol, Executor>(ex, endpoint)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_seq_packet_socket(ExecutionContext& context,
+ const endpoint_type& endpoint,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(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 ex The I/O executor that the socket will use, by default, 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(const executor_type& ex,
+ const protocol_type& protocol, const native_handle_type& native_socket)
+ : basic_socket<Protocol, Executor>(ex, protocol, native_socket)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_seq_packet_socket(ExecutionContext& context,
+ const protocol_type& protocol, const native_handle_type& native_socket,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(context, protocol, native_socket)
+ {
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_seq_packet_socket(basic_seq_packet_socket&& other) noexcept
+ : basic_socket<Protocol, Executor>(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(const executor_type&)
+ * constructor.
+ */
+ basic_seq_packet_socket& operator=(basic_seq_packet_socket&& other)
+ {
+ basic_socket<Protocol, Executor>::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(const executor_type&)
+ * constructor.
+ */
+ template <typename Protocol1, typename Executor1>
+ basic_seq_packet_socket(basic_seq_packet_socket<Protocol1, Executor1>&& other,
+ constraint_t<
+ is_convertible<Protocol1, Protocol>::value
+ && is_convertible<Executor1, Executor>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(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(const executor_type&)
+ * constructor.
+ */
+ template <typename Protocol1, typename Executor1>
+ constraint_t<
+ is_convertible<Protocol1, Protocol>::value
+ && is_convertible<Executor1, Executor>::value,
+ basic_seq_packet_socket&
+ > operator=(basic_seq_packet_socket<Protocol1, Executor1>&& other)
+ {
+ basic_socket<Protocol, Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// 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 <typename ConstBufferSequence>
+ std::size_t send(const ConstBufferSequence& buffers,
+ socket_base::message_flags flags)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().send(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t send(const ConstBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ return this->impl_.get_service().send(
+ this->impl_.get_implementation(), buffers, flags, ec);
+ }
+
+ /// Start an asynchronous send.
+ /**
+ * This function is used to asynchronously send data on the sequenced packet
+ * socket. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param flags Flags specifying how the send call is to be made.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the send completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken
+ = default_completion_token_t<executor_type>>
+ auto async_send(const ConstBufferSequence& buffers,
+ socket_base::message_flags flags,
+ WriteToken&& token
+ = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_send>(), token, buffers, flags))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_send(this), token, buffers, flags);
+ }
+
+ /// 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 <typename MutableBufferSequence>
+ std::size_t receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags& out_flags)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().receive_with_flags(
+ this->impl_.get_implementation(), buffers, 0, out_flags, ec);
+ 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 <typename MutableBufferSequence>
+ std::size_t receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags in_flags,
+ socket_base::message_flags& out_flags)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().receive_with_flags(
+ this->impl_.get_implementation(), buffers, in_flags, out_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 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 <typename MutableBufferSequence>
+ std::size_t receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags in_flags,
+ socket_base::message_flags& out_flags, asio::error_code& ec)
+ {
+ return this->impl_.get_service().receive_with_flags(
+ this->impl_.get_implementation(), buffers, in_flags, out_flags, ec);
+ }
+
+ /// Start an asynchronous receive.
+ /**
+ * This function is used to asynchronously receive data from the sequenced
+ * packet socket. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 completion 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the receive completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags& out_flags,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive_with_flags>(), token,
+ buffers, socket_base::message_flags(0), &out_flags))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive_with_flags(this), token,
+ buffers, socket_base::message_flags(0), &out_flags);
+ }
+
+ /// Start an asynchronous receive.
+ /**
+ * This function is used to asynchronously receive data from the sequenced
+ * data socket. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 completion 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the receive completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags in_flags,
+ socket_base::message_flags& out_flags,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive_with_flags>(),
+ token, buffers, in_flags, &out_flags))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive_with_flags(this),
+ token, buffers, in_flags, &out_flags);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_seq_packet_socket(const basic_seq_packet_socket&) = delete;
+ basic_seq_packet_socket& operator=(
+ const basic_seq_packet_socket&) = delete;
+
+ class initiate_async_send
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_send(basic_seq_packet_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers,
+ socket_base::message_flags flags) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_send(
+ self_->impl_.get_implementation(), buffers, flags,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_seq_packet_socket* self_;
+ };
+
+ class initiate_async_receive_with_flags
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_receive_with_flags(basic_seq_packet_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers,
+ socket_base::message_flags in_flags,
+ socket_base::message_flags* out_flags) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_receive_with_flags(
+ self_->impl_.get_implementation(), buffers, in_flags,
+ *out_flags, handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_seq_packet_socket* self_;
+ };
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BASIC_SEQ_PACKET_SOCKET_HPP
diff --git a/3rdparty/asio/include/asio/basic_serial_port.hpp b/3rdparty/asio/include/asio/basic_serial_port.hpp
new file mode 100644
index 00000000000..8fa66c0b0d7
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_serial_port.hpp
@@ -0,0 +1,987 @@
+//
+// basic_serial_port.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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_HAS_SERIAL_PORT) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include <string>
+#include <utility>
+#include "asio/any_io_executor.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/serial_port_base.hpp"
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_serial_port_service.hpp"
+#else
+# include "asio/detail/posix_serial_port_service.hpp"
+#endif
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Provides serial port functionality.
+/**
+ * The basic_serial_port class provides a wrapper over serial port
+ * functionality.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ */
+template <typename Executor = any_io_executor>
+class basic_serial_port
+ : public serial_port_base
+{
+private:
+ class initiate_async_write_some;
+ class initiate_async_read_some;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the serial port type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The serial port type when rebound to the specified executor.
+ typedef basic_serial_port<Executor1> other;
+ };
+
+ /// The native representation of a serial port.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#elif defined(ASIO_HAS_IOCP)
+ typedef detail::win_iocp_serial_port_service::native_handle_type
+ native_handle_type;
+#else
+ typedef detail::posix_serial_port_service::native_handle_type
+ native_handle_type;
+#endif
+
+ /// A basic_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 ex The I/O executor that the serial port will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * serial port.
+ */
+ explicit basic_serial_port(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// Construct a basic_serial_port without opening it.
+ /**
+ * This constructor creates a serial port without opening it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the serial port will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the serial port.
+ */
+ template <typename ExecutionContext>
+ explicit basic_serial_port(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// Construct and open a basic_serial_port.
+ /**
+ * This constructor creates and opens a serial port for the specified device
+ * name.
+ *
+ * @param ex The I/O executor that the serial port will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * serial port.
+ *
+ * @param device The platform-specific device name for this serial
+ * port.
+ */
+ basic_serial_port(const executor_type& ex, const char* device)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.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 context An execution context which provides the I/O executor that
+ * the serial port will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the serial port.
+ *
+ * @param device The platform-specific device name for this serial
+ * port.
+ */
+ template <typename ExecutionContext>
+ basic_serial_port(ExecutionContext& context, const char* device,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.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 ex The I/O executor that the serial port will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * serial port.
+ *
+ * @param device The platform-specific device name for this serial
+ * port.
+ */
+ basic_serial_port(const executor_type& ex, const std::string& device)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.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 context An execution context which provides the I/O executor that
+ * the serial port will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the serial port.
+ *
+ * @param device The platform-specific device name for this serial
+ * port.
+ */
+ template <typename ExecutionContext>
+ basic_serial_port(ExecutionContext& context, const std::string& device,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.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 ex The I/O executor that the serial port will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * serial port.
+ *
+ * @param native_serial_port A native serial port.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_serial_port(const executor_type& ex,
+ const native_handle_type& native_serial_port)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(),
+ native_serial_port, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the serial port will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the serial port.
+ *
+ * @param native_serial_port A native serial port.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_serial_port(ExecutionContext& context,
+ const native_handle_type& native_serial_port,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(),
+ native_serial_port, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_serial_port(basic_serial_port&& other)
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_serial_port& operator=(basic_serial_port&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ // All serial ports have access to each other's implementations.
+ template <typename Executor1>
+ friend class basic_serial_port;
+
+ /// Move-construct a basic_serial_port from a serial port of another executor
+ /// type.
+ /**
+ * 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(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ basic_serial_port(basic_serial_port<Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// Move-assign a basic_serial_port from a serial port of another executor
+ /// type.
+ /**
+ * 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(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_serial_port&
+ > operator=(basic_serial_port<Executor1>&& other)
+ {
+ basic_serial_port tmp(std::move(other));
+ impl_ = std::move(tmp.impl_);
+ return *this;
+ }
+
+ /// 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.
+ */
+ ~basic_serial_port()
+ {
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return impl_.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 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;
+ impl_.get_service().open(impl_.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)
+ {
+ impl_.get_service().open(impl_.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;
+ impl_.get_service().assign(impl_.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)
+ {
+ impl_.get_service().assign(impl_.get_implementation(),
+ native_serial_port, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Determine whether the serial port is open.
+ bool is_open() const
+ {
+ return impl_.get_service().is_open(impl_.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;
+ impl_.get_service().close(impl_.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)
+ {
+ impl_.get_service().close(impl_.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 impl_.get_service().native_handle(impl_.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;
+ impl_.get_service().cancel(impl_.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)
+ {
+ impl_.get_service().cancel(impl_.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;
+ impl_.get_service().send_break(impl_.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)
+ {
+ impl_.get_service().send_break(impl_.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 <typename SettableSerialPortOption>
+ void set_option(const SettableSerialPortOption& option)
+ {
+ asio::error_code ec;
+ impl_.get_service().set_option(impl_.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 <typename SettableSerialPortOption>
+ ASIO_SYNC_OP_VOID set_option(const SettableSerialPortOption& option,
+ asio::error_code& ec)
+ {
+ impl_.get_service().set_option(impl_.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 <typename GettableSerialPortOption>
+ void get_option(GettableSerialPortOption& option) const
+ {
+ asio::error_code ec;
+ impl_.get_service().get_option(impl_.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 <typename GettableSerialPortOption>
+ ASIO_SYNC_OP_VOID get_option(GettableSerialPortOption& option,
+ asio::error_code& ec) const
+ {
+ impl_.get_service().get_option(impl_.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
+ * basic_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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = impl_.get_service().write_some(
+ impl_.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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return impl_.get_service().write_some(
+ impl_.get_implementation(), buffers, ec);
+ }
+
+ /// Start an asynchronous write.
+ /**
+ * This function is used to asynchronously write data to the serial port.
+ * It is an initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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
+ * basic_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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_write_some(const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_write_some>(), token, buffers))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_write_some(this), token, buffers);
+ }
+
+ /// 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
+ * basic_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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = impl_.get_service().read_some(
+ impl_.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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return impl_.get_service().read_some(
+ impl_.get_implementation(), buffers, ec);
+ }
+
+ /// Start an asynchronous read.
+ /**
+ * This function is used to asynchronously read data from the serial port.
+ * It is an initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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
+ * basic_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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_read_some(const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_read_some>(), token, buffers))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_read_some(this), token, buffers);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_serial_port(const basic_serial_port&) = delete;
+ basic_serial_port& operator=(const basic_serial_port&) = delete;
+
+ class initiate_async_write_some
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_write_some(basic_serial_port* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_write_some(
+ self_->impl_.get_implementation(), buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_serial_port* self_;
+ };
+
+ class initiate_async_read_some
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_read_some(basic_serial_port* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_read_some(
+ self_->impl_.get_implementation(), buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_serial_port* self_;
+ };
+
+#if defined(ASIO_HAS_IOCP)
+ detail::io_object_impl<detail::win_iocp_serial_port_service, Executor> impl_;
+#else
+ detail::io_object_impl<detail::posix_serial_port_service, Executor> impl_;
+#endif
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_SERIAL_PORT)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_BASIC_SERIAL_PORT_HPP
diff --git a/3rdparty/asio/include/asio/basic_signal_set.hpp b/3rdparty/asio/include/asio/basic_signal_set.hpp
new file mode 100644
index 00000000000..bf74c39b3a8
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_signal_set.hpp
@@ -0,0 +1,648 @@
+//
+// basic_signal_set.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#include "asio/any_io_executor.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/signal_set_service.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/signal_set_base.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Provides signal functionality.
+/**
+ * The basic_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(my_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 <typename Executor = any_io_executor>
+class basic_signal_set : public signal_set_base
+{
+private:
+ class initiate_async_wait;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the signal set type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The signal set type when rebound to the specified executor.
+ typedef basic_signal_set<Executor1> other;
+ };
+
+ /// Construct a signal set without adding any signals.
+ /**
+ * This constructor creates a signal set without registering for any signals.
+ *
+ * @param ex The I/O executor that the signal set will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * signal set.
+ */
+ explicit basic_signal_set(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// Construct a signal set without adding any signals.
+ /**
+ * This constructor creates a signal set without registering for any signals.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the signal set will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the signal set.
+ */
+ template <typename ExecutionContext>
+ explicit basic_signal_set(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// Construct a signal set and add one signal.
+ /**
+ * This constructor creates a signal set and registers for one signal.
+ *
+ * @param ex The I/O executor that the signal set will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * signal set.
+ *
+ * @param signal_number_1 The signal number to be added.
+ *
+ * @note This constructor is equivalent to performing:
+ * @code asio::signal_set signals(ex);
+ * signals.add(signal_number_1); @endcode
+ */
+ basic_signal_set(const executor_type& ex, int signal_number_1)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().add(impl_.get_implementation(), signal_number_1, ec);
+ asio::detail::throw_error(ec, "add");
+ }
+
+ /// Construct a signal set and add one signal.
+ /**
+ * This constructor creates a signal set and registers for one signal.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the signal set will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the signal set.
+ *
+ * @param signal_number_1 The signal number to be added.
+ *
+ * @note This constructor is equivalent to performing:
+ * @code asio::signal_set signals(context);
+ * signals.add(signal_number_1); @endcode
+ */
+ template <typename ExecutionContext>
+ basic_signal_set(ExecutionContext& context, int signal_number_1,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().add(impl_.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 ex The I/O executor that the signal set will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * signal 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(ex);
+ * signals.add(signal_number_1);
+ * signals.add(signal_number_2); @endcode
+ */
+ basic_signal_set(const executor_type& ex, int signal_number_1,
+ int signal_number_2)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().add(impl_.get_implementation(), signal_number_1, ec);
+ asio::detail::throw_error(ec, "add");
+ impl_.get_service().add(impl_.get_implementation(), signal_number_2, 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 context An execution context which provides the I/O executor that
+ * the signal set will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the signal 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(context);
+ * signals.add(signal_number_1);
+ * signals.add(signal_number_2); @endcode
+ */
+ template <typename ExecutionContext>
+ basic_signal_set(ExecutionContext& context, int signal_number_1,
+ int signal_number_2,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().add(impl_.get_implementation(), signal_number_1, ec);
+ asio::detail::throw_error(ec, "add");
+ impl_.get_service().add(impl_.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 ex The I/O executor that the signal set will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * signal 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(ex);
+ * signals.add(signal_number_1);
+ * signals.add(signal_number_2);
+ * signals.add(signal_number_3); @endcode
+ */
+ basic_signal_set(const executor_type& ex, int signal_number_1,
+ int signal_number_2, int signal_number_3)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().add(impl_.get_implementation(), signal_number_1, ec);
+ asio::detail::throw_error(ec, "add");
+ impl_.get_service().add(impl_.get_implementation(), signal_number_2, ec);
+ asio::detail::throw_error(ec, "add");
+ impl_.get_service().add(impl_.get_implementation(), signal_number_3, 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 context An execution context which provides the I/O executor that
+ * the signal set will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the signal 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(context);
+ * signals.add(signal_number_1);
+ * signals.add(signal_number_2);
+ * signals.add(signal_number_3); @endcode
+ */
+ template <typename ExecutionContext>
+ basic_signal_set(ExecutionContext& context, int signal_number_1,
+ int signal_number_2, int signal_number_3,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().add(impl_.get_implementation(), signal_number_1, ec);
+ asio::detail::throw_error(ec, "add");
+ impl_.get_service().add(impl_.get_implementation(), signal_number_2, ec);
+ asio::detail::throw_error(ec, "add");
+ impl_.get_service().add(impl_.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.
+ */
+ ~basic_signal_set()
+ {
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return impl_.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;
+ impl_.get_service().add(impl_.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)
+ {
+ impl_.get_service().add(impl_.get_implementation(), signal_number, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Add a signal to a signal_set with the specified flags.
+ /**
+ * This function adds the specified signal to the set. It has no effect if the
+ * signal is already in the set.
+ *
+ * Flags other than flags::dont_care require OS support for the @c sigaction
+ * call, and this function will fail with @c error::operation_not_supported if
+ * this is unavailable.
+ *
+ * The specified flags will conflict with a prior, active registration of the
+ * same signal, if either specified a flags value other than flags::dont_care.
+ * In this case, the @c add will fail with @c error::invalid_argument.
+ *
+ * @param signal_number The signal to be added to the set.
+ *
+ * @param f Flags to modify the behaviour of the specified signal.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ void add(int signal_number, flags_t f)
+ {
+ asio::error_code ec;
+ impl_.get_service().add(impl_.get_implementation(), signal_number, f, ec);
+ asio::detail::throw_error(ec, "add");
+ }
+
+ /// Add a signal to a signal_set with the specified flags.
+ /**
+ * This function adds the specified signal to the set. It has no effect if the
+ * signal is already in the set.
+ *
+ * Flags other than flags::dont_care require OS support for the @c sigaction
+ * call, and this function will fail with @c error::operation_not_supported if
+ * this is unavailable.
+ *
+ * The specified flags will conflict with a prior, active registration of the
+ * same signal, if either specified a flags value other than flags::dont_care.
+ * In this case, the @c add will fail with @c error::invalid_argument.
+ *
+ * @param signal_number The signal to be added to the set.
+ *
+ * @param f Flags to modify the behaviour of the specified signal.
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ */
+ ASIO_SYNC_OP_VOID add(int signal_number, flags_t f,
+ asio::error_code& ec)
+ {
+ impl_.get_service().add(impl_.get_implementation(), signal_number, f, 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;
+ impl_.get_service().remove(impl_.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)
+ {
+ impl_.get_service().remove(impl_.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;
+ impl_.get_service().clear(impl_.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)
+ {
+ impl_.get_service().clear(impl_.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;
+ impl_.get_service().cancel(impl_.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)
+ {
+ impl_.get_service().cancel(impl_.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 is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * For each call to async_wait(), the completion handler will be called
+ * exactly once. The completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the wait completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, int) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code, int))
+ SignalToken = default_completion_token_t<executor_type>>
+ auto async_wait(
+ SignalToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<SignalToken, void (asio::error_code, int)>(
+ declval<initiate_async_wait>(), token))
+ {
+ return async_initiate<SignalToken, void (asio::error_code, int)>(
+ initiate_async_wait(this), token);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_signal_set(const basic_signal_set&) = delete;
+ basic_signal_set& operator=(const basic_signal_set&) = delete;
+
+ class initiate_async_wait
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_wait(basic_signal_set* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename SignalHandler>
+ void operator()(SignalHandler&& handler) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<SignalHandler> handler2(handler);
+ self_->impl_.get_service().async_wait(
+ self_->impl_.get_implementation(),
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_signal_set* self_;
+ };
+
+ detail::io_object_impl<detail::signal_set_service, Executor> impl_;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BASIC_SIGNAL_SET_HPP
diff --git a/3rdparty/asio/include/asio/basic_socket.hpp b/3rdparty/asio/include/asio/basic_socket.hpp
new file mode 100644
index 00000000000..88c4b03fe18
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_socket.hpp
@@ -0,0 +1,1936 @@
+//
+// basic_socket.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <utility>
+#include "asio/any_io_executor.hpp"
+#include "asio/detail/config.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/post.hpp"
+#include "asio/socket_base.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"
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/io_uring_socket_service.hpp"
+#else
+# include "asio/detail/reactive_socket_service.hpp"
+#endif
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if !defined(ASIO_BASIC_SOCKET_FWD_DECL)
+#define ASIO_BASIC_SOCKET_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Protocol, typename Executor = any_io_executor>
+class basic_socket;
+
+#endif // !defined(ASIO_BASIC_SOCKET_FWD_DECL)
+
+/// 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 <typename Protocol, typename Executor>
+class basic_socket
+ : public socket_base
+{
+private:
+ class initiate_async_connect;
+ class initiate_async_wait;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the socket type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The socket type when rebound to the specified executor.
+ typedef basic_socket<Protocol, Executor1> other;
+ };
+
+ /// The native representation of a socket.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#elif defined(ASIO_WINDOWS_RUNTIME)
+ typedef typename detail::null_socket_service<
+ Protocol>::native_handle_type native_handle_type;
+#elif defined(ASIO_HAS_IOCP)
+ typedef typename detail::win_iocp_socket_service<
+ Protocol>::native_handle_type native_handle_type;
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ typedef typename detail::io_uring_socket_service<
+ Protocol>::native_handle_type native_handle_type;
+#else
+ typedef typename detail::reactive_socket_service<
+ Protocol>::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<Protocol, Executor> lowest_layer_type;
+#endif // !defined(ASIO_NO_EXTENSIONS)
+
+ /// Construct a basic_socket without opening it.
+ /**
+ * This constructor creates a socket without opening it.
+ *
+ * @param ex The I/O executor that the socket will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the socket.
+ */
+ explicit basic_socket(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// Construct a basic_socket without opening it.
+ /**
+ * This constructor creates a socket without opening it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the socket will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the socket.
+ */
+ template <typename ExecutionContext>
+ explicit basic_socket(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// Construct and open a basic_socket.
+ /**
+ * This constructor creates and opens a socket.
+ *
+ * @param ex The I/O executor that the socket will use, by default, 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(const executor_type& ex, const protocol_type& protocol)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.get_implementation(), protocol, ec);
+ asio::detail::throw_error(ec, "open");
+ }
+
+ /// Construct and open a basic_socket.
+ /**
+ * This constructor creates and opens a socket.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_socket(ExecutionContext& context, const protocol_type& protocol,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.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 ex The I/O executor that the socket will use, by default, 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(const executor_type& ex, const endpoint_type& endpoint)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ const protocol_type protocol = endpoint.protocol();
+ impl_.get_service().open(impl_.get_implementation(), protocol, ec);
+ asio::detail::throw_error(ec, "open");
+ impl_.get_service().bind(impl_.get_implementation(), endpoint, ec);
+ asio::detail::throw_error(ec, "bind");
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_socket(ExecutionContext& context, const endpoint_type& endpoint,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ const protocol_type protocol = endpoint.protocol();
+ impl_.get_service().open(impl_.get_implementation(), protocol, ec);
+ asio::detail::throw_error(ec, "open");
+ impl_.get_service().bind(impl_.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 ex The I/O executor that the socket will use, by default, 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(const executor_type& ex, const protocol_type& protocol,
+ const native_handle_type& native_socket)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(),
+ protocol, native_socket, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Construct a basic_socket on an existing native socket.
+ /**
+ * This constructor creates a socket object to hold an existing native socket.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_socket(ExecutionContext& context, const protocol_type& protocol,
+ const native_handle_type& native_socket,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(),
+ protocol, native_socket, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// 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(const executor_type&) constructor.
+ */
+ basic_socket(basic_socket&& other) noexcept
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// 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(const executor_type&) constructor.
+ */
+ basic_socket& operator=(basic_socket&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ // All sockets have access to each other's implementations.
+ template <typename Protocol1, typename Executor1>
+ 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(const executor_type&) constructor.
+ */
+ template <typename Protocol1, typename Executor1>
+ basic_socket(basic_socket<Protocol1, Executor1>&& other,
+ constraint_t<
+ is_convertible<Protocol1, Protocol>::value
+ && is_convertible<Executor1, Executor>::value
+ > = 0)
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// 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(const executor_type&) constructor.
+ */
+ template <typename Protocol1, typename Executor1>
+ constraint_t<
+ is_convertible<Protocol1, Protocol>::value
+ && is_convertible<Executor1, Executor>::value,
+ basic_socket&
+ > operator=(basic_socket<Protocol1, Executor1>&& other)
+ {
+ basic_socket tmp(std::move(other));
+ impl_ = std::move(tmp.impl_);
+ return *this;
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return impl_.get_executor();
+ }
+
+#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(my_context);
+ * socket.open(asio::ip::tcp::v4());
+ * @endcode
+ */
+ void open(const protocol_type& protocol = protocol_type())
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.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(my_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)
+ {
+ impl_.get_service().open(impl_.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;
+ impl_.get_service().assign(impl_.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)
+ {
+ impl_.get_service().assign(impl_.get_implementation(),
+ protocol, native_socket, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Determine whether the socket is open.
+ bool is_open() const
+ {
+ return impl_.get_service().is_open(impl_.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;
+ impl_.get_service().close(impl_.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(my_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)
+ {
+ impl_.get_service().close(impl_.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 = impl_.get_service().release(
+ impl_.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 impl_.get_service().release(impl_.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 impl_.get_service().native_handle(impl_.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;
+ impl_.get_service().cancel(impl_.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)
+ {
+ impl_.get_service().cancel(impl_.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 = impl_.get_service().at_mark(impl_.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 impl_.get_service().at_mark(impl_.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 = impl_.get_service().available(
+ impl_.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 impl_.get_service().available(impl_.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(my_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;
+ impl_.get_service().bind(impl_.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(my_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)
+ {
+ impl_.get_service().bind(impl_.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(my_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())
+ {
+ impl_.get_service().open(impl_.get_implementation(),
+ peer_endpoint.protocol(), ec);
+ asio::detail::throw_error(ec, "connect");
+ }
+ impl_.get_service().connect(impl_.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(my_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())
+ {
+ impl_.get_service().open(impl_.get_implementation(),
+ peer_endpoint.protocol(), ec);
+ if (ec)
+ {
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+ }
+
+ impl_.get_service().connect(impl_.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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the connect completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code) @endcode
+ *
+ * @par Example
+ * @code
+ * void connect_handler(const asio::error_code& error)
+ * {
+ * if (!error)
+ * {
+ * // Connect succeeded.
+ * }
+ * }
+ *
+ * ...
+ *
+ * asio::ip::tcp::socket socket(my_context);
+ * asio::ip::tcp::endpoint endpoint(
+ * asio::ip::address::from_string("1.2.3.4"), 12345);
+ * socket.async_connect(endpoint, connect_handler);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ ConnectToken = default_completion_token_t<executor_type>>
+ auto async_connect(const endpoint_type& peer_endpoint,
+ ConnectToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ConnectToken, void (asio::error_code)>(
+ declval<initiate_async_connect>(), token,
+ peer_endpoint, declval<asio::error_code&>()))
+ {
+ asio::error_code open_ec;
+ if (!is_open())
+ {
+ const protocol_type protocol = peer_endpoint.protocol();
+ impl_.get_service().open(impl_.get_implementation(), protocol, open_ec);
+ }
+
+ return async_initiate<ConnectToken, void (asio::error_code)>(
+ initiate_async_connect(this), token, peer_endpoint, open_ec);
+ }
+
+ /// 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(my_context);
+ * ...
+ * asio::ip::tcp::no_delay option(true);
+ * socket.set_option(option);
+ * @endcode
+ */
+ template <typename SettableSocketOption>
+ void set_option(const SettableSocketOption& option)
+ {
+ asio::error_code ec;
+ impl_.get_service().set_option(impl_.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(my_context);
+ * ...
+ * asio::ip::tcp::no_delay option(true);
+ * asio::error_code ec;
+ * socket.set_option(option, ec);
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ template <typename SettableSocketOption>
+ ASIO_SYNC_OP_VOID set_option(const SettableSocketOption& option,
+ asio::error_code& ec)
+ {
+ impl_.get_service().set_option(impl_.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(my_context);
+ * ...
+ * asio::ip::tcp::socket::keep_alive option;
+ * socket.get_option(option);
+ * bool is_set = option.value();
+ * @endcode
+ */
+ template <typename GettableSocketOption>
+ void get_option(GettableSocketOption& option) const
+ {
+ asio::error_code ec;
+ impl_.get_service().get_option(impl_.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(my_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 <typename GettableSocketOption>
+ ASIO_SYNC_OP_VOID get_option(GettableSocketOption& option,
+ asio::error_code& ec) const
+ {
+ impl_.get_service().get_option(impl_.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(my_context);
+ * ...
+ * asio::ip::tcp::socket::bytes_readable command;
+ * socket.io_control(command);
+ * std::size_t bytes_readable = command.get();
+ * @endcode
+ */
+ template <typename IoControlCommand>
+ void io_control(IoControlCommand& command)
+ {
+ asio::error_code ec;
+ impl_.get_service().io_control(impl_.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(my_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 <typename IoControlCommand>
+ ASIO_SYNC_OP_VOID io_control(IoControlCommand& command,
+ asio::error_code& ec)
+ {
+ impl_.get_service().io_control(impl_.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 impl_.get_service().non_blocking(impl_.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;
+ impl_.get_service().non_blocking(impl_.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)
+ {
+ impl_.get_service().non_blocking(impl_.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 <typename Handler>
+ * 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 <typename Handler>
+ * void async_sendfile(tcp::socket& sock, int fd, Handler h)
+ * {
+ * sendfile_op<Handler> op = { sock, fd, h, 0, 0 };
+ * sock.async_wait(tcp::socket::wait_write, op);
+ * } @endcode
+ */
+ bool native_non_blocking() const
+ {
+ return impl_.get_service().native_non_blocking(impl_.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 <typename Handler>
+ * 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 <typename Handler>
+ * void async_sendfile(tcp::socket& sock, int fd, Handler h)
+ * {
+ * sendfile_op<Handler> 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;
+ impl_.get_service().native_non_blocking(
+ impl_.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 <typename Handler>
+ * 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 <typename Handler>
+ * void async_sendfile(tcp::socket& sock, int fd, Handler h)
+ * {
+ * sendfile_op<Handler> 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)
+ {
+ impl_.get_service().native_non_blocking(
+ impl_.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(my_context);
+ * ...
+ * asio::ip::tcp::endpoint endpoint = socket.local_endpoint();
+ * @endcode
+ */
+ endpoint_type local_endpoint() const
+ {
+ asio::error_code ec;
+ endpoint_type ep = impl_.get_service().local_endpoint(
+ impl_.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(my_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 impl_.get_service().local_endpoint(impl_.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(my_context);
+ * ...
+ * asio::ip::tcp::endpoint endpoint = socket.remote_endpoint();
+ * @endcode
+ */
+ endpoint_type remote_endpoint() const
+ {
+ asio::error_code ec;
+ endpoint_type ep = impl_.get_service().remote_endpoint(
+ impl_.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(my_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 impl_.get_service().remote_endpoint(impl_.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(my_context);
+ * ...
+ * socket.shutdown(asio::ip::tcp::socket::shutdown_send);
+ * @endcode
+ */
+ void shutdown(shutdown_type what)
+ {
+ asio::error_code ec;
+ impl_.get_service().shutdown(impl_.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(my_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)
+ {
+ impl_.get_service().shutdown(impl_.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(my_context);
+ * ...
+ * socket.wait(asio::ip::tcp::socket::wait_read);
+ * @endcode
+ */
+ void wait(wait_type w)
+ {
+ asio::error_code ec;
+ impl_.get_service().wait(impl_.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(my_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)
+ {
+ impl_.get_service().wait(impl_.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. It is an initiating
+ * function for an @ref asynchronous_operation, and always returns
+ * immediately.
+ *
+ * @param w Specifies the desired socket state.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the wait completes. Potential
+ * completion tokens include @ref use_future, @ref use_awaitable, @ref
+ * yield_context, or a function object with the correct completion signature.
+ * The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code) @endcode
+ *
+ * @par Example
+ * @code
+ * void wait_handler(const asio::error_code& error)
+ * {
+ * if (!error)
+ * {
+ * // Wait succeeded.
+ * }
+ * }
+ *
+ * ...
+ *
+ * asio::ip::tcp::socket socket(my_context);
+ * ...
+ * socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ WaitToken = default_completion_token_t<executor_type>>
+ auto async_wait(wait_type w,
+ WaitToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WaitToken, void (asio::error_code)>(
+ declval<initiate_async_wait>(), token, w))
+ {
+ return async_initiate<WaitToken, void (asio::error_code)>(
+ initiate_async_wait(this), token, w);
+ }
+
+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()
+ {
+ }
+
+#if defined(ASIO_WINDOWS_RUNTIME)
+ detail::io_object_impl<
+ detail::null_socket_service<Protocol>, Executor> impl_;
+#elif defined(ASIO_HAS_IOCP)
+ detail::io_object_impl<
+ detail::win_iocp_socket_service<Protocol>, Executor> impl_;
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ detail::io_object_impl<
+ detail::io_uring_socket_service<Protocol>, Executor> impl_;
+#else
+ detail::io_object_impl<
+ detail::reactive_socket_service<Protocol>, Executor> impl_;
+#endif
+
+private:
+ // Disallow copying and assignment.
+ basic_socket(const basic_socket&) = delete;
+ basic_socket& operator=(const basic_socket&) = delete;
+
+ class initiate_async_connect
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_connect(basic_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ConnectHandler>
+ void operator()(ConnectHandler&& handler,
+ const endpoint_type& peer_endpoint,
+ const asio::error_code& open_ec) const
+ {
+ // 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 (open_ec)
+ {
+ asio::post(self_->impl_.get_executor(),
+ asio::detail::bind_handler(
+ static_cast<ConnectHandler&&>(handler), open_ec));
+ }
+ else
+ {
+ detail::non_const_lvalue<ConnectHandler> handler2(handler);
+ self_->impl_.get_service().async_connect(
+ self_->impl_.get_implementation(), peer_endpoint,
+ handler2.value, self_->impl_.get_executor());
+ }
+ }
+
+ private:
+ basic_socket* self_;
+ };
+
+ class initiate_async_wait
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_wait(basic_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WaitHandler>
+ void operator()(WaitHandler&& handler, wait_type w) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WaitHandler> handler2(handler);
+ self_->impl_.get_service().async_wait(
+ self_->impl_.get_implementation(), w,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_socket* self_;
+ };
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BASIC_SOCKET_HPP
diff --git a/3rdparty/asio/include/asio/basic_socket_acceptor.hpp b/3rdparty/asio/include/asio/basic_socket_acceptor.hpp
new file mode 100644
index 00000000000..059d33ead53
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_socket_acceptor.hpp
@@ -0,0 +1,2708 @@
+//
+// basic_socket_acceptor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <utility>
+#include "asio/detail/config.hpp"
+#include "asio/any_io_executor.hpp"
+#include "asio/basic_socket.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/socket_base.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"
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/io_uring_socket_service.hpp"
+#else
+# include "asio/detail/reactive_socket_service.hpp"
+#endif
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if !defined(ASIO_BASIC_SOCKET_ACCEPTOR_FWD_DECL)
+#define ASIO_BASIC_SOCKET_ACCEPTOR_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Protocol, typename Executor = any_io_executor>
+class basic_socket_acceptor;
+
+#endif // !defined(ASIO_BASIC_SOCKET_ACCEPTOR_FWD_DECL)
+
+/// 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.
+ *
+ * Synchronous @c accept operations are thread safe, if the underlying
+ * operating system calls are also thread safe. This means that it is permitted
+ * to perform concurrent calls to synchronous @c accept operations on a single
+ * socket object. Other synchronous operations, such as @c open or @c close, are
+ * not thread safe.
+ *
+ * @par Example
+ * Opening a socket acceptor with the SO_REUSEADDR option enabled:
+ * @code
+ * asio::ip::tcp::acceptor acceptor(my_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 <typename Protocol, typename Executor>
+class basic_socket_acceptor
+ : public socket_base
+{
+private:
+ class initiate_async_wait;
+ class initiate_async_accept;
+ class initiate_async_move_accept;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the acceptor type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The socket type when rebound to the specified executor.
+ typedef basic_socket_acceptor<Protocol, Executor1> other;
+ };
+
+ /// The native representation of an acceptor.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#elif defined(ASIO_WINDOWS_RUNTIME)
+ typedef typename detail::null_socket_service<
+ Protocol>::native_handle_type native_handle_type;
+#elif defined(ASIO_HAS_IOCP)
+ typedef typename detail::win_iocp_socket_service<
+ Protocol>::native_handle_type native_handle_type;
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ typedef typename detail::io_uring_socket_service<
+ Protocol>::native_handle_type native_handle_type;
+#else
+ typedef typename detail::reactive_socket_service<
+ Protocol>::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 ex The I/O executor that the acceptor will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * acceptor.
+ */
+ explicit basic_socket_acceptor(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the acceptor will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the acceptor.
+ */
+ template <typename ExecutionContext>
+ explicit basic_socket_acceptor(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// Construct an open acceptor.
+ /**
+ * This constructor creates an acceptor and automatically opens it.
+ *
+ * @param ex The I/O executor that the acceptor will use, by default, 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(const executor_type& ex, const protocol_type& protocol)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.get_implementation(), protocol, ec);
+ asio::detail::throw_error(ec, "open");
+ }
+
+ /// Construct an open acceptor.
+ /**
+ * This constructor creates an acceptor and automatically opens it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the acceptor will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_socket_acceptor(ExecutionContext& context,
+ const protocol_type& protocol,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.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 ex The I/O executor that the acceptor will use, by default, 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<Protocol> acceptor(my_context);
+ * acceptor.open(endpoint.protocol());
+ * if (reuse_addr)
+ * acceptor.set_option(socket_base::reuse_address(true));
+ * acceptor.bind(endpoint);
+ * acceptor.listen();
+ * @endcode
+ */
+ basic_socket_acceptor(const executor_type& ex,
+ const endpoint_type& endpoint, bool reuse_addr = true)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ const protocol_type protocol = endpoint.protocol();
+ impl_.get_service().open(impl_.get_implementation(), protocol, ec);
+ asio::detail::throw_error(ec, "open");
+ if (reuse_addr)
+ {
+ impl_.get_service().set_option(impl_.get_implementation(),
+ socket_base::reuse_address(true), ec);
+ asio::detail::throw_error(ec, "set_option");
+ }
+ impl_.get_service().bind(impl_.get_implementation(), endpoint, ec);
+ asio::detail::throw_error(ec, "bind");
+ impl_.get_service().listen(impl_.get_implementation(),
+ socket_base::max_listen_connections, ec);
+ asio::detail::throw_error(ec, "listen");
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the acceptor will use, by default, 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<Protocol> acceptor(my_context);
+ * acceptor.open(endpoint.protocol());
+ * if (reuse_addr)
+ * acceptor.set_option(socket_base::reuse_address(true));
+ * acceptor.bind(endpoint);
+ * acceptor.listen();
+ * @endcode
+ */
+ template <typename ExecutionContext>
+ basic_socket_acceptor(ExecutionContext& context,
+ const endpoint_type& endpoint, bool reuse_addr = true,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ const protocol_type protocol = endpoint.protocol();
+ impl_.get_service().open(impl_.get_implementation(), protocol, ec);
+ asio::detail::throw_error(ec, "open");
+ if (reuse_addr)
+ {
+ impl_.get_service().set_option(impl_.get_implementation(),
+ socket_base::reuse_address(true), ec);
+ asio::detail::throw_error(ec, "set_option");
+ }
+ impl_.get_service().bind(impl_.get_implementation(), endpoint, ec);
+ asio::detail::throw_error(ec, "bind");
+ impl_.get_service().listen(impl_.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 ex The I/O executor that the acceptor will use, by default, 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(const executor_type& ex,
+ const protocol_type& protocol, const native_handle_type& native_acceptor)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(),
+ protocol, native_acceptor, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Construct a basic_socket_acceptor on an existing native acceptor.
+ /**
+ * This constructor creates an acceptor object to hold an existing native
+ * acceptor.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the acceptor will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_socket_acceptor(ExecutionContext& context,
+ const protocol_type& protocol, const native_handle_type& native_acceptor,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(),
+ protocol, native_acceptor, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_socket_acceptor(basic_socket_acceptor&& other) noexcept
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_socket_acceptor& operator=(basic_socket_acceptor&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ // All socket acceptors have access to each other's implementations.
+ template <typename Protocol1, typename Executor1>
+ 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_acceptor(const executor_type&)
+ * constructor.
+ */
+ template <typename Protocol1, typename Executor1>
+ basic_socket_acceptor(basic_socket_acceptor<Protocol1, Executor1>&& other,
+ constraint_t<
+ is_convertible<Protocol1, Protocol>::value
+ && is_convertible<Executor1, Executor>::value
+ > = 0)
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// 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_acceptor(const executor_type&)
+ * constructor.
+ */
+ template <typename Protocol1, typename Executor1>
+ constraint_t<
+ is_convertible<Protocol1, Protocol>::value
+ && is_convertible<Executor1, Executor>::value,
+ basic_socket_acceptor&
+ > operator=(basic_socket_acceptor<Protocol1, Executor1>&& other)
+ {
+ basic_socket_acceptor tmp(std::move(other));
+ impl_ = std::move(tmp.impl_);
+ return *this;
+ }
+
+ /// 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()
+ {
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return impl_.get_executor();
+ }
+
+ /// 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(my_context);
+ * acceptor.open(asio::ip::tcp::v4());
+ * @endcode
+ */
+ void open(const protocol_type& protocol = protocol_type())
+ {
+ asio::error_code ec;
+ impl_.get_service().open(impl_.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(my_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)
+ {
+ impl_.get_service().open(impl_.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;
+ impl_.get_service().assign(impl_.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)
+ {
+ impl_.get_service().assign(impl_.get_implementation(),
+ protocol, native_acceptor, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Determine whether the acceptor is open.
+ bool is_open() const
+ {
+ return impl_.get_service().is_open(impl_.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(my_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;
+ impl_.get_service().bind(impl_.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(my_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)
+ {
+ impl_.get_service().bind(impl_.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;
+ impl_.get_service().listen(impl_.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(my_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)
+ {
+ impl_.get_service().listen(impl_.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;
+ impl_.get_service().close(impl_.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(my_context);
+ * ...
+ * asio::error_code ec;
+ * acceptor.close(ec);
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ ASIO_SYNC_OP_VOID close(asio::error_code& ec)
+ {
+ impl_.get_service().close(impl_.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 = impl_.get_service().release(
+ impl_.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 impl_.get_service().release(impl_.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 impl_.get_service().native_handle(impl_.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;
+ impl_.get_service().cancel(impl_.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)
+ {
+ impl_.get_service().cancel(impl_.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(my_context);
+ * ...
+ * asio::ip::tcp::acceptor::reuse_address option(true);
+ * acceptor.set_option(option);
+ * @endcode
+ */
+ template <typename SettableSocketOption>
+ void set_option(const SettableSocketOption& option)
+ {
+ asio::error_code ec;
+ impl_.get_service().set_option(impl_.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(my_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 <typename SettableSocketOption>
+ ASIO_SYNC_OP_VOID set_option(const SettableSocketOption& option,
+ asio::error_code& ec)
+ {
+ impl_.get_service().set_option(impl_.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(my_context);
+ * ...
+ * asio::ip::tcp::acceptor::reuse_address option;
+ * acceptor.get_option(option);
+ * bool is_set = option.get();
+ * @endcode
+ */
+ template <typename GettableSocketOption>
+ void get_option(GettableSocketOption& option) const
+ {
+ asio::error_code ec;
+ impl_.get_service().get_option(impl_.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(my_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 <typename GettableSocketOption>
+ ASIO_SYNC_OP_VOID get_option(GettableSocketOption& option,
+ asio::error_code& ec) const
+ {
+ impl_.get_service().get_option(impl_.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(my_context);
+ * ...
+ * asio::ip::tcp::acceptor::non_blocking_io command(true);
+ * socket.io_control(command);
+ * @endcode
+ */
+ template <typename IoControlCommand>
+ void io_control(IoControlCommand& command)
+ {
+ asio::error_code ec;
+ impl_.get_service().io_control(impl_.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(my_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 <typename IoControlCommand>
+ ASIO_SYNC_OP_VOID io_control(IoControlCommand& command,
+ asio::error_code& ec)
+ {
+ impl_.get_service().io_control(impl_.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 impl_.get_service().non_blocking(impl_.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;
+ impl_.get_service().non_blocking(impl_.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)
+ {
+ impl_.get_service().non_blocking(impl_.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 impl_.get_service().native_non_blocking(impl_.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;
+ impl_.get_service().native_non_blocking(
+ impl_.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)
+ {
+ impl_.get_service().native_non_blocking(
+ impl_.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(my_context);
+ * ...
+ * asio::ip::tcp::endpoint endpoint = acceptor.local_endpoint();
+ * @endcode
+ */
+ endpoint_type local_endpoint() const
+ {
+ asio::error_code ec;
+ endpoint_type ep = impl_.get_service().local_endpoint(
+ impl_.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(my_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 impl_.get_service().local_endpoint(impl_.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(my_context);
+ * ...
+ * acceptor.wait(asio::ip::tcp::acceptor::wait_read);
+ * @endcode
+ */
+ void wait(wait_type w)
+ {
+ asio::error_code ec;
+ impl_.get_service().wait(impl_.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(my_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)
+ {
+ impl_.get_service().wait(impl_.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. It is an initiating
+ * function for an @ref asynchronous_operation, and always returns
+ * immediately.
+ *
+ * @param w Specifies the desired acceptor state.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the wait completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code) @endcode
+ *
+ * @par Example
+ * @code
+ * void wait_handler(const asio::error_code& error)
+ * {
+ * if (!error)
+ * {
+ * // Wait succeeded.
+ * }
+ * }
+ *
+ * ...
+ *
+ * asio::ip::tcp::acceptor acceptor(my_context);
+ * ...
+ * acceptor.async_wait(
+ * asio::ip::tcp::acceptor::wait_read,
+ * wait_handler);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ WaitToken = default_completion_token_t<executor_type>>
+ auto async_wait(wait_type w,
+ WaitToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WaitToken, void (asio::error_code)>(
+ declval<initiate_async_wait>(), token, w))
+ {
+ return async_initiate<WaitToken, void (asio::error_code)>(
+ initiate_async_wait(this), token, w);
+ }
+
+#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(my_context);
+ * ...
+ * asio::ip::tcp::socket socket(my_context);
+ * acceptor.accept(socket);
+ * @endcode
+ */
+ template <typename Protocol1, typename Executor1>
+ void accept(basic_socket<Protocol1, Executor1>& peer,
+ constraint_t<
+ is_convertible<Protocol, Protocol1>::value
+ > = 0)
+ {
+ asio::error_code ec;
+ impl_.get_service().accept(impl_.get_implementation(),
+ peer, static_cast<endpoint_type*>(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(my_context);
+ * ...
+ * asio::ip::tcp::socket socket(my_context);
+ * asio::error_code ec;
+ * acceptor.accept(socket, ec);
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ template <typename Protocol1, typename Executor1>
+ ASIO_SYNC_OP_VOID accept(
+ basic_socket<Protocol1, Executor1>& peer, asio::error_code& ec,
+ constraint_t<
+ is_convertible<Protocol, Protocol1>::value
+ > = 0)
+ {
+ impl_.get_service().accept(impl_.get_implementation(),
+ peer, static_cast<endpoint_type*>(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, and additionally obtain the endpoint of the remote peer. It is an
+ * initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the accept completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code) @endcode
+ *
+ * @par Example
+ * @code
+ * void accept_handler(const asio::error_code& error)
+ * {
+ * if (!error)
+ * {
+ * // Accept succeeded.
+ * }
+ * }
+ *
+ * ...
+ *
+ * asio::ip::tcp::acceptor acceptor(my_context);
+ * ...
+ * asio::ip::tcp::socket socket(my_context);
+ * acceptor.async_accept(socket, accept_handler);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename Protocol1, typename Executor1,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ AcceptToken = default_completion_token_t<executor_type>>
+ auto async_accept(basic_socket<Protocol1, Executor1>& peer,
+ AcceptToken&& token = default_completion_token_t<executor_type>(),
+ constraint_t<
+ is_convertible<Protocol, Protocol1>::value
+ > = 0)
+ -> decltype(
+ async_initiate<AcceptToken, void (asio::error_code)>(
+ declval<initiate_async_accept>(), token,
+ &peer, static_cast<endpoint_type*>(0)))
+ {
+ return async_initiate<AcceptToken, void (asio::error_code)>(
+ initiate_async_accept(this), token,
+ &peer, static_cast<endpoint_type*>(0));
+ }
+
+ /// 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(my_context);
+ * ...
+ * asio::ip::tcp::socket socket(my_context);
+ * asio::ip::tcp::endpoint endpoint;
+ * acceptor.accept(socket, endpoint);
+ * @endcode
+ */
+ template <typename Executor1>
+ void accept(basic_socket<protocol_type, Executor1>& peer,
+ endpoint_type& peer_endpoint)
+ {
+ asio::error_code ec;
+ impl_.get_service().accept(impl_.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(my_context);
+ * ...
+ * asio::ip::tcp::socket socket(my_context);
+ * asio::ip::tcp::endpoint endpoint;
+ * asio::error_code ec;
+ * acceptor.accept(socket, endpoint, ec);
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ template <typename Executor1>
+ ASIO_SYNC_OP_VOID accept(basic_socket<protocol_type, Executor1>& peer,
+ endpoint_type& peer_endpoint, asio::error_code& ec)
+ {
+ impl_.get_service().accept(
+ impl_.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. It is an
+ * initiating function for an @ref asynchronous_operation, and 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the accept completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename Executor1,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ AcceptToken = default_completion_token_t<executor_type>>
+ auto async_accept(basic_socket<protocol_type, Executor1>& peer,
+ endpoint_type& peer_endpoint,
+ AcceptToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<AcceptToken, void (asio::error_code)>(
+ declval<initiate_async_accept>(), token, &peer, &peer_endpoint))
+ {
+ return async_initiate<AcceptToken, void (asio::error_code)>(
+ initiate_async_accept(this), token, &peer, &peer_endpoint);
+ }
+#endif // !defined(ASIO_NO_EXTENSIONS)
+
+ /// 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(my_context);
+ * ...
+ * asio::ip::tcp::socket socket(acceptor.accept());
+ * @endcode
+ */
+ typename Protocol::socket::template rebind_executor<executor_type>::other
+ accept()
+ {
+ asio::error_code ec;
+ typename Protocol::socket::template rebind_executor<
+ executor_type>::other peer(impl_.get_executor());
+ impl_.get_service().accept(impl_.get_implementation(), peer, 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(my_context);
+ * ...
+ * asio::ip::tcp::socket socket(acceptor.accept(ec));
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ typename Protocol::socket::template rebind_executor<executor_type>::other
+ accept(asio::error_code& ec)
+ {
+ typename Protocol::socket::template rebind_executor<
+ executor_type>::other peer(impl_.get_executor());
+ impl_.get_service().accept(impl_.get_implementation(), peer, 0, ec);
+ return peer;
+ }
+
+ /// Start an asynchronous accept.
+ /**
+ * This function is used to asynchronously accept a new connection. It is an
+ * initiating function for an @ref asynchronous_operation, and always returns
+ * immediately.
+ *
+ * This overload requires that the Protocol template parameter satisfy the
+ * AcceptableProtocol type requirements.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the accept completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion handler must be:
+ * @code void handler(
+ * // Result of operation.
+ * const asio::error_code& error,
+ *
+ * // On success, the newly accepted socket.
+ * typename Protocol::socket::template
+ * rebind_executor<executor_type>::other peer
+ * ); @endcode
+ * Regardless of whether the asynchronous operation completes immediately or
+ * not, the completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code,
+ * typename Protocol::socket::template
+ * rebind_executor<executor_type>::other)) @endcode
+ *
+ * @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(my_context);
+ * ...
+ * acceptor.async_accept(accept_handler);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ executor_type>::other)) MoveAcceptToken
+ = default_completion_token_t<executor_type>>
+ auto async_accept(
+ MoveAcceptToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<MoveAcceptToken,
+ void (asio::error_code, typename Protocol::socket::template
+ rebind_executor<executor_type>::other)>(
+ declval<initiate_async_move_accept>(), token,
+ declval<const executor_type&>(), static_cast<endpoint_type*>(0),
+ static_cast<typename Protocol::socket::template
+ rebind_executor<executor_type>::other*>(0)))
+ {
+ return async_initiate<MoveAcceptToken,
+ void (asio::error_code, typename Protocol::socket::template
+ rebind_executor<executor_type>::other)>(
+ initiate_async_move_accept(this), token,
+ impl_.get_executor(), static_cast<endpoint_type*>(0),
+ static_cast<typename Protocol::socket::template
+ rebind_executor<executor_type>::other*>(0));
+ }
+
+ /// 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 ex The I/O executor 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(my_context);
+ * ...
+ * asio::ip::tcp::socket socket(acceptor.accept());
+ * @endcode
+ */
+ template <typename Executor1>
+ typename Protocol::socket::template rebind_executor<Executor1>::other
+ accept(const Executor1& ex,
+ constraint_t<
+ is_executor<Executor1>::value
+ || execution::is_executor<Executor1>::value
+ > = 0)
+ {
+ asio::error_code ec;
+ typename Protocol::socket::template
+ rebind_executor<Executor1>::other peer(ex);
+ impl_.get_service().accept(impl_.get_implementation(), peer, 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 context The I/O execution 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(my_context);
+ * ...
+ * asio::ip::tcp::socket socket(acceptor.accept());
+ * @endcode
+ */
+ template <typename ExecutionContext>
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other
+ accept(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ {
+ asio::error_code ec;
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other peer(context);
+ impl_.get_service().accept(impl_.get_implementation(), peer, 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 ex The I/O executor 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(my_context);
+ * ...
+ * asio::ip::tcp::socket socket(acceptor.accept(my_context2, ec));
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ template <typename Executor1>
+ typename Protocol::socket::template rebind_executor<Executor1>::other
+ accept(const Executor1& ex, asio::error_code& ec,
+ constraint_t<
+ is_executor<Executor1>::value
+ || execution::is_executor<Executor1>::value
+ > = 0)
+ {
+ typename Protocol::socket::template
+ rebind_executor<Executor1>::other peer(ex);
+ impl_.get_service().accept(impl_.get_implementation(), peer, 0, ec);
+ 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 context The I/O execution 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(my_context);
+ * ...
+ * asio::ip::tcp::socket socket(acceptor.accept(my_context2, ec));
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ template <typename ExecutionContext>
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other
+ accept(ExecutionContext& context, asio::error_code& ec,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ {
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other peer(context);
+ impl_.get_service().accept(impl_.get_implementation(), peer, 0, ec);
+ return peer;
+ }
+
+ /// Start an asynchronous accept.
+ /**
+ * This function is used to asynchronously accept a new connection. It is an
+ * initiating function for an @ref asynchronous_operation, and always returns
+ * immediately.
+ *
+ * This overload requires that the Protocol template parameter satisfy the
+ * AcceptableProtocol type requirements.
+ *
+ * @param ex The I/O executor object to be used for the newly accepted
+ * socket.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the accept completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion handler must be:
+ * @code void handler(
+ * // Result of operation.
+ * const asio::error_code& error,
+ *
+ * // On success, the newly accepted socket.
+ * typename Protocol::socket::template rebind_executor<
+ * Executor1>::other peer
+ * ); @endcode
+ * Regardless of whether the asynchronous operation completes immediately or
+ * not, the completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code,
+ * typename Protocol::socket::template rebind_executor<
+ * Executor1>::other)) @endcode
+ *
+ * @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(my_context);
+ * ...
+ * acceptor.async_accept(my_context2, accept_handler);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename Executor1,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ constraint_t<is_executor<Executor1>::value
+ || execution::is_executor<Executor1>::value,
+ Executor1>>::other)) MoveAcceptToken
+ = default_completion_token_t<executor_type>>
+ auto async_accept(const Executor1& ex,
+ MoveAcceptToken&& token = default_completion_token_t<executor_type>(),
+ constraint_t<
+ is_executor<Executor1>::value
+ || execution::is_executor<Executor1>::value
+ > = 0)
+ -> decltype(
+ async_initiate<MoveAcceptToken,
+ void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ Executor1>::other)>(
+ declval<initiate_async_move_accept>(), token,
+ ex, static_cast<endpoint_type*>(0),
+ static_cast<typename Protocol::socket::template
+ rebind_executor<Executor1>::other*>(0)))
+ {
+ return async_initiate<MoveAcceptToken,
+ void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ Executor1>::other)>(
+ initiate_async_move_accept(this), token,
+ ex, static_cast<endpoint_type*>(0),
+ static_cast<typename Protocol::socket::template
+ rebind_executor<Executor1>::other*>(0));
+ }
+
+ /// Start an asynchronous accept.
+ /**
+ * This function is used to asynchronously accept a new connection. It is an
+ * initiating function for an @ref asynchronous_operation, and always returns
+ * immediately.
+ *
+ * This overload requires that the Protocol template parameter satisfy the
+ * AcceptableProtocol type requirements.
+ *
+ * @param context The I/O execution context object to be used for the newly
+ * accepted socket.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the accept completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion handler must be:
+ * @code void handler(
+ * // Result of operation.
+ * const asio::error_code& error,
+ *
+ * // On success, the newly accepted socket.
+ * typename Protocol::socket::template rebind_executor<
+ * typename ExecutionContext::executor_type>::other peer
+ * ); @endcode
+ * Regardless of whether the asynchronous operation completes immediately or
+ * not, the completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code,
+ * typename Protocol::socket::template rebind_executor<
+ * typename ExecutionContext::executor_type>::other)) @endcode
+ *
+ * @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(my_context);
+ * ...
+ * acceptor.async_accept(my_context2, accept_handler);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ExecutionContext,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other)) MoveAcceptToken
+ = default_completion_token_t<executor_type>>
+ auto async_accept(ExecutionContext& context,
+ MoveAcceptToken&& token = default_completion_token_t<executor_type>(),
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ -> decltype(
+ async_initiate<MoveAcceptToken,
+ void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other)>(
+ declval<initiate_async_move_accept>(), token,
+ context.get_executor(), static_cast<endpoint_type*>(0),
+ static_cast<typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other*>(0)))
+ {
+ return async_initiate<MoveAcceptToken,
+ void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other)>(
+ initiate_async_move_accept(this), token,
+ context.get_executor(), static_cast<endpoint_type*>(0),
+ static_cast<typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other*>(0));
+ }
+
+ /// 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(my_context);
+ * ...
+ * asio::ip::tcp::endpoint endpoint;
+ * asio::ip::tcp::socket socket(acceptor.accept(endpoint));
+ * @endcode
+ */
+ typename Protocol::socket::template rebind_executor<executor_type>::other
+ accept(endpoint_type& peer_endpoint)
+ {
+ asio::error_code ec;
+ typename Protocol::socket::template rebind_executor<
+ executor_type>::other peer(impl_.get_executor());
+ impl_.get_service().accept(impl_.get_implementation(),
+ peer, &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(my_context);
+ * ...
+ * asio::ip::tcp::endpoint endpoint;
+ * asio::ip::tcp::socket socket(acceptor.accept(endpoint, ec));
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ typename Protocol::socket::template rebind_executor<executor_type>::other
+ accept(endpoint_type& peer_endpoint, asio::error_code& ec)
+ {
+ typename Protocol::socket::template rebind_executor<
+ executor_type>::other peer(impl_.get_executor());
+ impl_.get_service().accept(impl_.get_implementation(),
+ peer, &peer_endpoint, ec);
+ return peer;
+ }
+
+ /// Start an asynchronous accept.
+ /**
+ * This function is used to asynchronously accept a new connection. It is an
+ * initiating function for an @ref asynchronous_operation, and 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
+ * completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the accept completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion handler must be:
+ * @code void handler(
+ * // Result of operation.
+ * const asio::error_code& error,
+ *
+ * // On success, the newly accepted socket.
+ * typename Protocol::socket::template
+ * rebind_executor<executor_type>::other peer
+ * ); @endcode
+ * Regardless of whether the asynchronous operation completes immediately or
+ * not, the completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code,
+ * typename Protocol::socket::template
+ * rebind_executor<executor_type>::other)) @endcode
+ *
+ * @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(my_context);
+ * ...
+ * asio::ip::tcp::endpoint endpoint;
+ * acceptor.async_accept(endpoint, accept_handler);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ executor_type>::other)) MoveAcceptToken
+ = default_completion_token_t<executor_type>>
+ auto async_accept(endpoint_type& peer_endpoint,
+ MoveAcceptToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<MoveAcceptToken,
+ void (asio::error_code, typename Protocol::socket::template
+ rebind_executor<executor_type>::other)>(
+ declval<initiate_async_move_accept>(), token,
+ declval<const executor_type&>(), &peer_endpoint,
+ static_cast<typename Protocol::socket::template
+ rebind_executor<executor_type>::other*>(0)))
+ {
+ return async_initiate<MoveAcceptToken,
+ void (asio::error_code, typename Protocol::socket::template
+ rebind_executor<executor_type>::other)>(
+ initiate_async_move_accept(this), token,
+ impl_.get_executor(), &peer_endpoint,
+ static_cast<typename Protocol::socket::template
+ rebind_executor<executor_type>::other*>(0));
+ }
+
+ /// 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 ex The I/O executor 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(my_context);
+ * ...
+ * asio::ip::tcp::endpoint endpoint;
+ * asio::ip::tcp::socket socket(
+ * acceptor.accept(my_context2, endpoint));
+ * @endcode
+ */
+ template <typename Executor1>
+ typename Protocol::socket::template rebind_executor<Executor1>::other
+ accept(const Executor1& ex, endpoint_type& peer_endpoint,
+ constraint_t<
+ is_executor<Executor1>::value
+ || execution::is_executor<Executor1>::value
+ > = 0)
+ {
+ asio::error_code ec;
+ typename Protocol::socket::template
+ rebind_executor<Executor1>::other peer(ex);
+ impl_.get_service().accept(impl_.get_implementation(),
+ peer, &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 context The I/O execution 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(my_context);
+ * ...
+ * asio::ip::tcp::endpoint endpoint;
+ * asio::ip::tcp::socket socket(
+ * acceptor.accept(my_context2, endpoint));
+ * @endcode
+ */
+ template <typename ExecutionContext>
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other
+ accept(ExecutionContext& context, endpoint_type& peer_endpoint,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ {
+ asio::error_code ec;
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other peer(context);
+ impl_.get_service().accept(impl_.get_implementation(),
+ peer, &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 ex The I/O executor 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(my_context);
+ * ...
+ * asio::ip::tcp::endpoint endpoint;
+ * asio::ip::tcp::socket socket(
+ * acceptor.accept(my_context2, endpoint, ec));
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ template <typename Executor1>
+ typename Protocol::socket::template rebind_executor<Executor1>::other
+ accept(const executor_type& ex,
+ endpoint_type& peer_endpoint, asio::error_code& ec,
+ constraint_t<
+ is_executor<Executor1>::value
+ || execution::is_executor<Executor1>::value
+ > = 0)
+ {
+ typename Protocol::socket::template
+ rebind_executor<Executor1>::other peer(ex);
+ impl_.get_service().accept(impl_.get_implementation(),
+ peer, &peer_endpoint, ec);
+ 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 context The I/O execution 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(my_context);
+ * ...
+ * asio::ip::tcp::endpoint endpoint;
+ * asio::ip::tcp::socket socket(
+ * acceptor.accept(my_context2, endpoint, ec));
+ * if (ec)
+ * {
+ * // An error occurred.
+ * }
+ * @endcode
+ */
+ template <typename ExecutionContext>
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other
+ accept(ExecutionContext& context,
+ endpoint_type& peer_endpoint, asio::error_code& ec,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ {
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other peer(context);
+ impl_.get_service().accept(impl_.get_implementation(),
+ peer, &peer_endpoint, ec);
+ return peer;
+ }
+
+ /// Start an asynchronous accept.
+ /**
+ * This function is used to asynchronously accept a new connection. It is an
+ * initiating function for an @ref asynchronous_operation, and always returns
+ * immediately.
+ *
+ * This overload requires that the Protocol template parameter satisfy the
+ * AcceptableProtocol type requirements.
+ *
+ * @param ex The I/O executor 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
+ * completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the accept completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion handler must be:
+ * @code void handler(
+ * // Result of operation.
+ * const asio::error_code& error,
+ *
+ * // On success, the newly accepted socket.
+ * typename Protocol::socket::template rebind_executor<
+ * Executor1>::other peer
+ * ); @endcode
+ * Regardless of whether the asynchronous operation completes immediately or
+ * not, the completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code,
+ * typename Protocol::socket::template rebind_executor<
+ * Executor1>::other)) @endcode
+ *
+ * @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(my_context);
+ * ...
+ * asio::ip::tcp::endpoint endpoint;
+ * acceptor.async_accept(my_context2, endpoint, accept_handler);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename Executor1,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ constraint_t<is_executor<Executor1>::value
+ || execution::is_executor<Executor1>::value,
+ Executor1>>::other)) MoveAcceptToken
+ = default_completion_token_t<executor_type>>
+ auto async_accept(const Executor1& ex, endpoint_type& peer_endpoint,
+ MoveAcceptToken&& token = default_completion_token_t<executor_type>(),
+ constraint_t<
+ is_executor<Executor1>::value
+ || execution::is_executor<Executor1>::value
+ > = 0)
+ -> decltype(
+ async_initiate<MoveAcceptToken,
+ void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ Executor1>::other)>(
+ declval<initiate_async_move_accept>(), token, ex, &peer_endpoint,
+ static_cast<typename Protocol::socket::template
+ rebind_executor<Executor1>::other*>(0)))
+ {
+ return async_initiate<MoveAcceptToken,
+ void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ Executor1>::other)>(
+ initiate_async_move_accept(this), token, ex, &peer_endpoint,
+ static_cast<typename Protocol::socket::template
+ rebind_executor<Executor1>::other*>(0));
+ }
+
+ /// Start an asynchronous accept.
+ /**
+ * This function is used to asynchronously accept a new connection. It is an
+ * initiating function for an @ref asynchronous_operation, and always returns
+ * immediately.
+ *
+ * This overload requires that the Protocol template parameter satisfy the
+ * AcceptableProtocol type requirements.
+ *
+ * @param context The I/O execution 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
+ * completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the accept completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion handler must be:
+ * @code void handler(
+ * // Result of operation.
+ * const asio::error_code& error,
+ *
+ * // On success, the newly accepted socket.
+ * typename Protocol::socket::template rebind_executor<
+ * typename ExecutionContext::executor_type>::other peer
+ * ); @endcode
+ * Regardless of whether the asynchronous operation completes immediately or
+ * not, the completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code,
+ * typename Protocol::socket::template rebind_executor<
+ * typename ExecutionContext::executor_type>::other)) @endcode
+ *
+ * @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(my_context);
+ * ...
+ * asio::ip::tcp::endpoint endpoint;
+ * acceptor.async_accept(my_context2, endpoint, accept_handler);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ExecutionContext,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other)) MoveAcceptToken
+ = default_completion_token_t<executor_type>>
+ auto async_accept(ExecutionContext& context, endpoint_type& peer_endpoint,
+ MoveAcceptToken&& token = default_completion_token_t<executor_type>(),
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ -> decltype(
+ async_initiate<MoveAcceptToken,
+ void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other)>(
+ declval<initiate_async_move_accept>(), token,
+ context.get_executor(), &peer_endpoint,
+ static_cast<typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other*>(0)))
+ {
+ return async_initiate<MoveAcceptToken,
+ void (asio::error_code,
+ typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other)>(
+ initiate_async_move_accept(this), token,
+ context.get_executor(), &peer_endpoint,
+ static_cast<typename Protocol::socket::template rebind_executor<
+ typename ExecutionContext::executor_type>::other*>(0));
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_socket_acceptor(const basic_socket_acceptor&) = delete;
+ basic_socket_acceptor& operator=(
+ const basic_socket_acceptor&) = delete;
+
+ class initiate_async_wait
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_wait(basic_socket_acceptor* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WaitHandler>
+ void operator()(WaitHandler&& handler, wait_type w) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WaitHandler> handler2(handler);
+ self_->impl_.get_service().async_wait(
+ self_->impl_.get_implementation(), w,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_socket_acceptor* self_;
+ };
+
+ class initiate_async_accept
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_accept(basic_socket_acceptor* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename AcceptHandler, typename Protocol1, typename Executor1>
+ void operator()(AcceptHandler&& handler,
+ basic_socket<Protocol1, Executor1>* peer,
+ endpoint_type* peer_endpoint) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<AcceptHandler> handler2(handler);
+ self_->impl_.get_service().async_accept(
+ self_->impl_.get_implementation(), *peer, peer_endpoint,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_socket_acceptor* self_;
+ };
+
+ class initiate_async_move_accept
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_move_accept(basic_socket_acceptor* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename MoveAcceptHandler, typename Executor1, typename Socket>
+ void operator()(MoveAcceptHandler&& handler,
+ const Executor1& peer_ex, endpoint_type* peer_endpoint, Socket*) const
+ {
+ // 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, Socket) type_check;
+
+ detail::non_const_lvalue<MoveAcceptHandler> handler2(handler);
+ self_->impl_.get_service().async_move_accept(
+ self_->impl_.get_implementation(), peer_ex, peer_endpoint,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_socket_acceptor* self_;
+ };
+
+#if defined(ASIO_WINDOWS_RUNTIME)
+ detail::io_object_impl<
+ detail::null_socket_service<Protocol>, Executor> impl_;
+#elif defined(ASIO_HAS_IOCP)
+ detail::io_object_impl<
+ detail::win_iocp_socket_service<Protocol>, Executor> impl_;
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ detail::io_object_impl<
+ detail::io_uring_socket_service<Protocol>, Executor> impl_;
+#else
+ detail::io_object_impl<
+ detail::reactive_socket_service<Protocol>, Executor> impl_;
+#endif
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BASIC_SOCKET_ACCEPTOR_HPP
diff --git a/3rdparty/asio/include/asio/basic_socket_iostream.hpp b/3rdparty/asio/include/asio/basic_socket_iostream.hpp
new file mode 100644
index 00000000000..902898d9502
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_socket_iostream.hpp
@@ -0,0 +1,331 @@
+//
+// basic_socket_iostream.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <istream>
+#include <ostream>
+#include "asio/basic_socket_streambuf.hpp"
+
+#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 <typename Protocol, typename Clock, typename WaitTraits>
+class socket_iostream_base
+{
+protected:
+ socket_iostream_base()
+ {
+ }
+
+ socket_iostream_base(socket_iostream_base&& other)
+ : streambuf_(std::move(other.streambuf_))
+ {
+ }
+
+ socket_iostream_base(basic_stream_socket<Protocol> s)
+ : streambuf_(std::move(s))
+ {
+ }
+
+ socket_iostream_base& operator=(socket_iostream_base&& other)
+ {
+ streambuf_ = std::move(other.streambuf_);
+ return *this;
+ }
+
+ basic_socket_streambuf<Protocol, Clock, WaitTraits> streambuf_;
+};
+
+} // namespace detail
+
+#if !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL)
+#define ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Protocol,
+#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<Clock>>
+#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<Clock>>
+#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 <typename Protocol,
+ typename Clock = chrono::steady_clock,
+ typename WaitTraits = wait_traits<Clock>>
+#else // defined(GENERATING_DOCUMENTATION)
+template <typename Protocol, typename Clock, typename WaitTraits>
+#endif // defined(GENERATING_DOCUMENTATION)
+class basic_socket_iostream
+ : private detail::socket_iostream_base<Protocol, Clock, WaitTraits>,
+ public std::basic_iostream<char>
+{
+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<Clock, WaitTraits> 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<char>(
+ &this->detail::socket_iostream_base<
+ Protocol, Clock, WaitTraits>::streambuf_)
+ {
+ this->setf(std::ios_base::unitbuf);
+ }
+
+ /// Construct a basic_socket_iostream from the supplied socket.
+ explicit basic_socket_iostream(basic_stream_socket<protocol_type> s)
+ : detail::socket_iostream_base<
+ Protocol, Clock, WaitTraits>(std::move(s)),
+ std::basic_iostream<char>(
+ &this->detail::socket_iostream_base<
+ Protocol, Clock, WaitTraits>::streambuf_)
+ {
+ this->setf(std::ios_base::unitbuf);
+ }
+
+ /// Move-construct a basic_socket_iostream from another.
+ basic_socket_iostream(basic_socket_iostream&& other)
+ : detail::socket_iostream_base<
+ Protocol, Clock, WaitTraits>(std::move(other)),
+ std::basic_iostream<char>(std::move(other))
+ {
+ this->set_rdbuf(&this->detail::socket_iostream_base<
+ Protocol, Clock, WaitTraits>::streambuf_);
+ }
+
+ /// Move-assign a basic_socket_iostream from another.
+ basic_socket_iostream& operator=(basic_socket_iostream&& other)
+ {
+ std::basic_iostream<char>::operator=(std::move(other));
+ detail::socket_iostream_base<
+ Protocol, Clock, WaitTraits>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// 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 <typename... T>
+ explicit basic_socket_iostream(T... x)
+ : std::basic_iostream<char>(
+ &this->detail::socket_iostream_base<
+ Protocol, Clock, WaitTraits>::streambuf_)
+ {
+ this->setf(std::ios_base::unitbuf);
+ if (rdbuf()->connect(x...) == 0)
+ this->setstate(std::ios_base::failbit);
+ }
+
+ /// 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 <typename... T>
+ void connect(T... x)
+ {
+ if (rdbuf()->connect(x...) == 0)
+ this->setstate(std::ios_base::failbit);
+ }
+
+ /// 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<Protocol, Clock, WaitTraits>* rdbuf() const
+ {
+ return const_cast<basic_socket_streambuf<Protocol, Clock, WaitTraits>*>(
+ &this->detail::socket_iostream_base<
+ Protocol, Clock, WaitTraits>::streambuf_);
+ }
+
+ /// Get a reference to the underlying socket.
+ basic_socket<Protocol>& 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&) = delete;
+ basic_socket_iostream& operator=(
+ const basic_socket_iostream&) = delete;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+
+#endif // ASIO_BASIC_SOCKET_IOSTREAM_HPP
diff --git a/3rdparty/asio/include/asio/basic_socket_streambuf.hpp b/3rdparty/asio/include/asio/basic_socket_streambuf.hpp
new file mode 100644
index 00000000000..e3a5f836382
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_socket_streambuf.hpp
@@ -0,0 +1,642 @@
+//
+// basic_socket_streambuf.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <streambuf>
+#include <vector>
+#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_HAS_BOOST_DATE_TIME) \
+ && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM)
+# include "asio/detail/deadline_timer_service.hpp"
+#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)
+
+#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<io_context> 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<char> get_buffer_;
+ std::vector<char> 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 <typename Protocol,
+#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<Clock>>
+#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<Clock>>
+#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 <typename Protocol,
+ typename Clock = chrono::steady_clock,
+ typename WaitTraits = wait_traits<Clock>>
+#else // defined(GENERATING_DOCUMENTATION)
+template <typename Protocol, typename Clock, typename WaitTraits>
+#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<Protocol>
+#else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION)
+ public basic_socket<Protocol>
+#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<Clock, WaitTraits> 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<Protocol>(*default_io_context_),
+ expiry_time_(max_expiry_time())
+ {
+ init_buffers();
+ }
+
+ /// Construct a basic_socket_streambuf from the supplied socket.
+ explicit basic_socket_streambuf(basic_stream_socket<protocol_type> s)
+ : detail::socket_streambuf_io_context(0),
+ basic_socket<Protocol>(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<Protocol>(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;
+ }
+
+ /// 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;
+ }
+
+ /// 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 <typename... T>
+ basic_socket_streambuf* connect(T... x)
+ {
+ init_buffers();
+ typedef typename Protocol::resolver resolver_type;
+ resolver_type resolver(socket().get_executor());
+ connect_to_endpoints(resolver.resolve(x..., ec_));
+ return !ec_ ? this : 0;
+ }
+
+ /// 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<Protocol>& 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<mutable_buffer, mutable_buffer>
+ 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<std::size_t>(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&) = delete;
+ basic_socket_streambuf& operator=(
+ const basic_socket_streambuf&) = delete;
+
+ 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<int>::max)())
+ msec = (std::numeric_limits<int>::max)();
+ else if (msec < 0)
+ msec = 0;
+ return static_cast<int>(msec);
+ }
+
+ template <typename EndpointSequence>
+ void connect_to_endpoints(const EndpointSequence& endpoints)
+ {
+ this->connect_to_endpoints(endpoints.begin(), endpoints.end());
+ }
+
+ template <typename EndpointIterator>
+ 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"
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+
+#endif // ASIO_BASIC_SOCKET_STREAMBUF_HPP
diff --git a/3rdparty/asio/include/asio/basic_stream_file.hpp b/3rdparty/asio/include/asio/basic_stream_file.hpp
new file mode 100644
index 00000000000..4b2ca8775e5
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_stream_file.hpp
@@ -0,0 +1,744 @@
+//
+// basic_stream_file.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_FILE_HPP
+#define ASIO_BASIC_STREAM_FILE_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_FILE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include <cstddef>
+#include "asio/async_result.hpp"
+#include "asio/basic_file.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if !defined(ASIO_BASIC_STREAM_FILE_FWD_DECL)
+#define ASIO_BASIC_STREAM_FILE_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Executor = any_io_executor>
+class basic_stream_file;
+
+#endif // !defined(ASIO_BASIC_STREAM_FILE_FWD_DECL)
+
+/// Provides stream-oriented file functionality.
+/**
+ * The basic_stream_file class template provides asynchronous and blocking
+ * stream-oriented file functionality.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ *
+ * @par Concepts:
+ * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream.
+ */
+template <typename Executor>
+class basic_stream_file
+ : public basic_file<Executor>
+{
+private:
+ class initiate_async_write_some;
+ class initiate_async_read_some;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the file type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The file type when rebound to the specified executor.
+ typedef basic_stream_file<Executor1> other;
+ };
+
+ /// The native representation of a file.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#else
+ typedef typename basic_file<Executor>::native_handle_type native_handle_type;
+#endif
+
+ /// Construct a basic_stream_file without opening it.
+ /**
+ * This constructor initialises a file without opening it. The file needs to
+ * be opened before data can be read from or or written to it.
+ *
+ * @param ex The I/O executor that the file will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the file.
+ */
+ explicit basic_stream_file(const executor_type& ex)
+ : basic_file<Executor>(ex)
+ {
+ this->impl_.get_service().set_is_stream(
+ this->impl_.get_implementation(), true);
+ }
+
+ /// Construct a basic_stream_file without opening it.
+ /**
+ * This constructor initialises a file without opening it. The file needs to
+ * be opened before data can be read from or or written to it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the file will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the file.
+ */
+ template <typename ExecutionContext>
+ explicit basic_stream_file(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_file<Executor>(context)
+ {
+ this->impl_.get_service().set_is_stream(
+ this->impl_.get_implementation(), true);
+ }
+
+ /// Construct and open a basic_stream_file.
+ /**
+ * This constructor initialises and opens a file.
+ *
+ * @param ex The I/O executor that the file will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the file.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_stream_file(const executor_type& ex,
+ const char* path, file_base::flags open_flags)
+ : basic_file<Executor>(ex)
+ {
+ asio::error_code ec;
+ this->impl_.get_service().set_is_stream(
+ this->impl_.get_implementation(), true);
+ this->impl_.get_service().open(
+ this->impl_.get_implementation(),
+ path, open_flags, ec);
+ asio::detail::throw_error(ec, "open");
+ }
+
+ /// Construct and open a basic_stream_file.
+ /**
+ * This constructor initialises and opens a file.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the file will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the file.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_stream_file(ExecutionContext& context,
+ const char* path, file_base::flags open_flags,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_file<Executor>(context)
+ {
+ asio::error_code ec;
+ this->impl_.get_service().set_is_stream(
+ this->impl_.get_implementation(), true);
+ this->impl_.get_service().open(
+ this->impl_.get_implementation(),
+ path, open_flags, ec);
+ asio::detail::throw_error(ec, "open");
+ }
+
+ /// Construct and open a basic_stream_file.
+ /**
+ * This constructor initialises and opens a file.
+ *
+ * @param ex The I/O executor that the file will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the file.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_stream_file(const executor_type& ex,
+ const std::string& path, file_base::flags open_flags)
+ : basic_file<Executor>(ex)
+ {
+ asio::error_code ec;
+ this->impl_.get_service().set_is_stream(
+ this->impl_.get_implementation(), true);
+ this->impl_.get_service().open(
+ this->impl_.get_implementation(),
+ path.c_str(), open_flags, ec);
+ asio::detail::throw_error(ec, "open");
+ }
+
+ /// Construct and open a basic_stream_file.
+ /**
+ * This constructor initialises and opens a file.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the file will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the file.
+ *
+ * @param path The path name identifying the file to be opened.
+ *
+ * @param open_flags A set of flags that determine how the file should be
+ * opened.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_stream_file(ExecutionContext& context,
+ const std::string& path, file_base::flags open_flags,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_file<Executor>(context)
+ {
+ asio::error_code ec;
+ this->impl_.get_service().set_is_stream(
+ this->impl_.get_implementation(), true);
+ this->impl_.get_service().open(
+ this->impl_.get_implementation(),
+ path.c_str(), open_flags, ec);
+ asio::detail::throw_error(ec, "open");
+ }
+
+ /// Construct a basic_stream_file on an existing native file.
+ /**
+ * This constructor initialises a stream file object to hold an existing
+ * native file.
+ *
+ * @param ex The I/O executor that the file will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the file.
+ *
+ * @param native_file The new underlying file implementation.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_stream_file(const executor_type& ex,
+ const native_handle_type& native_file)
+ : basic_file<Executor>(ex, native_file)
+ {
+ this->impl_.get_service().set_is_stream(
+ this->impl_.get_implementation(), true);
+ }
+
+ /// Construct a basic_stream_file on an existing native file.
+ /**
+ * This constructor initialises a stream file object to hold an existing
+ * native file.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the file will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the file.
+ *
+ * @param native_file The new underlying file implementation.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_stream_file(ExecutionContext& context,
+ const native_handle_type& native_file,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_file<Executor>(context, native_file)
+ {
+ this->impl_.get_service().set_is_stream(
+ this->impl_.get_implementation(), true);
+ }
+
+ /// Move-construct a basic_stream_file from another.
+ /**
+ * This constructor moves a stream file from one object to another.
+ *
+ * @param other The other basic_stream_file 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_file(const executor_type&)
+ * constructor.
+ */
+ basic_stream_file(basic_stream_file&& other) noexcept
+ : basic_file<Executor>(std::move(other))
+ {
+ }
+
+ /// Move-assign a basic_stream_file from another.
+ /**
+ * This assignment operator moves a stream file from one object to another.
+ *
+ * @param other The other basic_stream_file 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_file(const executor_type&)
+ * constructor.
+ */
+ basic_stream_file& operator=(basic_stream_file&& other)
+ {
+ basic_file<Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// Move-construct a basic_stream_file from a file of another executor
+ /// type.
+ /**
+ * This constructor moves a stream file from one object to another.
+ *
+ * @param other The other basic_stream_file 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_file(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ basic_stream_file(basic_stream_file<Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_file<Executor>(std::move(other))
+ {
+ }
+
+ /// Move-assign a basic_stream_file from a file of another executor type.
+ /**
+ * This assignment operator moves a stream file from one object to another.
+ *
+ * @param other The other basic_stream_file 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_file(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_stream_file&
+ > operator=(basic_stream_file<Executor1>&& other)
+ {
+ basic_file<Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// Destroys the file.
+ /**
+ * This function destroys the file, cancelling any outstanding asynchronous
+ * operations associated with the file as if by calling @c cancel.
+ */
+ ~basic_stream_file()
+ {
+ }
+
+ /// Seek to a position in the file.
+ /**
+ * This function updates the current position in the file.
+ *
+ * @param offset The requested position in the file, relative to @c whence.
+ *
+ * @param whence One of @c seek_set, @c seek_cur or @c seek_end.
+ *
+ * @returns The new position relative to the beginning of the file.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ uint64_t seek(int64_t offset, file_base::seek_basis whence)
+ {
+ asio::error_code ec;
+ uint64_t n = this->impl_.get_service().seek(
+ this->impl_.get_implementation(), offset, whence, ec);
+ asio::detail::throw_error(ec, "seek");
+ return n;
+ }
+
+ /// Seek to a position in the file.
+ /**
+ * This function updates the current position in the file.
+ *
+ * @param offset The requested position in the file, relative to @c whence.
+ *
+ * @param whence One of @c seek_set, @c seek_cur or @c seek_end.
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ *
+ * @returns The new position relative to the beginning of the file.
+ */
+ uint64_t seek(int64_t offset, file_base::seek_basis whence,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().seek(
+ this->impl_.get_implementation(), offset, whence, ec);
+ }
+
+ /// Write some data to the file.
+ /**
+ * This function is used to write data to the stream file. 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 file.
+ *
+ * @returns The number of bytes written.
+ *
+ * @throws asio::system_error Thrown on failure. An error code of
+ * asio::error::eof indicates that the end of the file was reached.
+ *
+ * @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
+ * file.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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().write_some(
+ this->impl_.get_implementation(), buffers, ec);
+ asio::detail::throw_error(ec, "write_some");
+ return s;
+ }
+
+ /// Write some data to the file.
+ /**
+ * This function is used to write data to the stream file. 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 file.
+ *
+ * @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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().write_some(
+ this->impl_.get_implementation(), buffers, ec);
+ }
+
+ /// Start an asynchronous write.
+ /**
+ * This function is used to asynchronously write data to the stream file.
+ * It is an initiating function for an @ref asynchronous_operation, and always
+ * returns immediately.
+ *
+ * @param buffers One or more data buffers to be written to the file.
+ * 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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
+ * file.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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_write_some(const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_write_some>(), token, buffers))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_write_some(this), token, buffers);
+ }
+
+ /// Read some data from the file.
+ /**
+ * This function is used to read data from the stream file. 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 end of the file was reached.
+ *
+ * @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
+ * file.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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().read_some(
+ this->impl_.get_implementation(), buffers, ec);
+ asio::detail::throw_error(ec, "read_some");
+ return s;
+ }
+
+ /// Read some data from the file.
+ /**
+ * This function is used to read data from the stream file. 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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().read_some(
+ this->impl_.get_implementation(), buffers, ec);
+ }
+
+ /// Start an asynchronous read.
+ /**
+ * This function is used to asynchronously read data from the stream file.
+ * It is an initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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
+ * file.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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_read_some(const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_read_some>(), token, buffers))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_read_some(this), token, buffers);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_stream_file(const basic_stream_file&) = delete;
+ basic_stream_file& operator=(const basic_stream_file&) = delete;
+
+ class initiate_async_write_some
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_write_some(basic_stream_file* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_write_some(
+ self_->impl_.get_implementation(), buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_stream_file* self_;
+ };
+
+ class initiate_async_read_some
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_read_some(basic_stream_file* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_read_some(
+ self_->impl_.get_implementation(), buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_stream_file* self_;
+ };
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_FILE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_BASIC_STREAM_FILE_HPP
diff --git a/3rdparty/asio/include/asio/basic_stream_socket.hpp b/3rdparty/asio/include/asio/basic_stream_socket.hpp
new file mode 100644
index 00000000000..e3a79450037
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_stream_socket.hpp
@@ -0,0 +1,1163 @@
+//
+// basic_stream_socket.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include "asio/async_result.hpp"
+#include "asio/basic_socket.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if !defined(ASIO_BASIC_STREAM_SOCKET_FWD_DECL)
+#define ASIO_BASIC_STREAM_SOCKET_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Protocol, typename Executor = any_io_executor>
+class basic_stream_socket;
+
+#endif // !defined(ASIO_BASIC_STREAM_SOCKET_FWD_DECL)
+
+/// 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.
+ *
+ * Synchronous @c send, @c receive, @c connect, and @c shutdown operations are
+ * thread safe with respect to each other, if the underlying operating system
+ * calls are also thread safe. This means that it is permitted to perform
+ * concurrent calls to these synchronous operations on a single socket object.
+ * Other synchronous operations, such as @c open or @c close, are not thread
+ * safe.
+ *
+ * @par Concepts:
+ * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream.
+ */
+template <typename Protocol, typename Executor>
+class basic_stream_socket
+ : public basic_socket<Protocol, Executor>
+{
+private:
+ class initiate_async_send;
+ class initiate_async_receive;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the socket type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The socket type when rebound to the specified executor.
+ typedef basic_stream_socket<Protocol, Executor1> other;
+ };
+
+ /// The native representation of a socket.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#else
+ typedef typename basic_socket<Protocol,
+ Executor>::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 ex The I/O executor that the socket will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the socket.
+ */
+ explicit basic_stream_socket(const executor_type& ex)
+ : basic_socket<Protocol, Executor>(ex)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the socket will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the socket.
+ */
+ template <typename ExecutionContext>
+ explicit basic_stream_socket(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(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 ex The I/O executor that the socket will use, by default, 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(const executor_type& ex, const protocol_type& protocol)
+ : basic_socket<Protocol, Executor>(ex, protocol)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_stream_socket(ExecutionContext& context, const protocol_type& protocol,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_socket<Protocol, Executor>(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 ex The I/O executor that the socket will use, by default, 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(const executor_type& ex, const endpoint_type& endpoint)
+ : basic_socket<Protocol, Executor>(ex, endpoint)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_stream_socket(ExecutionContext& context, const endpoint_type& endpoint,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(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 ex The I/O executor that the socket will use, by default, 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(const executor_type& ex,
+ const protocol_type& protocol, const native_handle_type& native_socket)
+ : basic_socket<Protocol, Executor>(ex, protocol, native_socket)
+ {
+ }
+
+ /// Construct a basic_stream_socket on an existing native socket.
+ /**
+ * This constructor creates a stream socket object to hold an existing native
+ * socket.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the socket will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_stream_socket(ExecutionContext& context,
+ const protocol_type& protocol, const native_handle_type& native_socket,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(context, protocol, native_socket)
+ {
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_stream_socket(basic_stream_socket&& other) noexcept
+ : basic_socket<Protocol, Executor>(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(const executor_type&)
+ * constructor.
+ */
+ basic_stream_socket& operator=(basic_stream_socket&& other)
+ {
+ basic_socket<Protocol, Executor>::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(const executor_type&)
+ * constructor.
+ */
+ template <typename Protocol1, typename Executor1>
+ basic_stream_socket(basic_stream_socket<Protocol1, Executor1>&& other,
+ constraint_t<
+ is_convertible<Protocol1, Protocol>::value
+ && is_convertible<Executor1, Executor>::value
+ > = 0)
+ : basic_socket<Protocol, Executor>(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(const executor_type&)
+ * constructor.
+ */
+ template <typename Protocol1, typename Executor1>
+ constraint_t<
+ is_convertible<Protocol1, Protocol>::value
+ && is_convertible<Executor1, Executor>::value,
+ basic_stream_socket&
+ > operator=(basic_stream_socket<Protocol1, Executor1>&& other)
+ {
+ basic_socket<Protocol, Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// 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 <typename ConstBufferSequence>
+ std::size_t send(const ConstBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().send(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t send(const ConstBufferSequence& buffers,
+ socket_base::message_flags flags)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().send(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t send(const ConstBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ return this->impl_.get_service().send(
+ this->impl_.get_implementation(), buffers, flags, ec);
+ }
+
+ /// Start an asynchronous send.
+ /**
+ * This function is used to asynchronously send data on the stream socket.
+ * It is an initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the send completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_send(const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_send>(), token,
+ buffers, socket_base::message_flags(0)))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_send(this), token,
+ buffers, socket_base::message_flags(0));
+ }
+
+ /// Start an asynchronous send.
+ /**
+ * This function is used to asynchronously send data on the stream socket.
+ * It is an initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param flags Flags specifying how the send call is to be made.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the send completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_send(const ConstBufferSequence& buffers,
+ socket_base::message_flags flags,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_send>(), token, buffers, flags))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_send(this), token, buffers, flags);
+ }
+
+ /// 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 <typename MutableBufferSequence>
+ std::size_t receive(const MutableBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().receive(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags flags)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().receive(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ return this->impl_.get_service().receive(
+ this->impl_.get_implementation(), buffers, flags, ec);
+ }
+
+ /// Start an asynchronous receive.
+ /**
+ * This function is used to asynchronously receive data from the stream
+ * socket. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the receive completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_receive(const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive>(), token,
+ buffers, socket_base::message_flags(0)))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive(this), token,
+ buffers, socket_base::message_flags(0));
+ }
+
+ /// Start an asynchronous receive.
+ /**
+ * This function is used to asynchronously receive data from the stream
+ * socket. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param flags Flags specifying how the receive call is to be made.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the receive completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_receive(const MutableBufferSequence& buffers,
+ socket_base::message_flags flags,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive>(), token, buffers, flags))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive(this), token, buffers, flags);
+ }
+
+ /// 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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().send(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().send(
+ this->impl_.get_implementation(), buffers, 0, ec);
+ }
+
+ /// Start an asynchronous write.
+ /**
+ * This function is used to asynchronously write data to the stream socket.
+ * It is an initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_write_some(const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_send>(), token,
+ buffers, socket_base::message_flags(0)))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_send(this), token,
+ buffers, socket_base::message_flags(0));
+ }
+
+ /// 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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().receive(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().receive(
+ this->impl_.get_implementation(), buffers, 0, ec);
+ }
+
+ /// Start an asynchronous read.
+ /**
+ * This function is used to asynchronously read data from the stream socket.
+ * socket. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * On POSIX or Windows operating systems, this asynchronous operation supports
+ * cancellation for the following asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_read_some(const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_receive>(), token,
+ buffers, socket_base::message_flags(0)))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_receive(this), token,
+ buffers, socket_base::message_flags(0));
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_stream_socket(const basic_stream_socket&) = delete;
+ basic_stream_socket& operator=(const basic_stream_socket&) = delete;
+
+ class initiate_async_send
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_send(basic_stream_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers,
+ socket_base::message_flags flags) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_send(
+ self_->impl_.get_implementation(), buffers, flags,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_stream_socket* self_;
+ };
+
+ class initiate_async_receive
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_receive(basic_stream_socket* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers,
+ socket_base::message_flags flags) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_receive(
+ self_->impl_.get_implementation(), buffers, flags,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_stream_socket* self_;
+ };
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BASIC_STREAM_SOCKET_HPP
diff --git a/3rdparty/asio/include/asio/basic_streambuf.hpp b/3rdparty/asio/include/asio/basic_streambuf.hpp
new file mode 100644
index 00000000000..0450811dca1
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_streambuf.hpp
@@ -0,0 +1,450 @@
+//
+// basic_streambuf.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <algorithm>
+#include <cstring>
+#include <stdexcept>
+#include <streambuf>
+#include <vector>
+#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 <typename Allocator = std::allocator<char>>
+#else
+template <typename Allocator>
+#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<std::size_t>::max)(),
+ const Allocator& allocator = Allocator())
+ : max_size_(maximum_size),
+ buffer_(allocator)
+ {
+ std::size_t pend = (std::min<std::size_t>)(max_size_, buffer_delta);
+ buffer_.resize((std::max<std::size_t>)(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 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 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 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 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 <tt>size() + n > max_size()</tt>.
+ *
+ * @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 <tt>prepare(x)</tt> where <tt>x >= n</tt>, 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<std::size_t>(n, epptr() - pptr());
+ pbump(static_cast<int>(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<int>(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
+ * <tt>size() > max_size()</tt> 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<std::size_t>)(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<char_type, Allocator> 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::size_t>(
+ std::max<std::size_t>(512, sb.buffer_.capacity() - sb.size()),
+ std::min<std::size_t>(max_size, sb.max_size() - sb.size()));
+ }
+};
+
+/// Adapts basic_streambuf to the dynamic buffer sequence type requirements.
+#if defined(GENERATING_DOCUMENTATION)
+template <typename Allocator = std::allocator<char>>
+#else
+template <typename Allocator>
+#endif
+class basic_streambuf_ref
+{
+public:
+ /// The type used to represent the input sequence as a list of buffers.
+ typedef typename basic_streambuf<Allocator>::const_buffers_type
+ const_buffers_type;
+
+ /// The type used to represent the output sequence as a list of buffers.
+ typedef typename basic_streambuf<Allocator>::mutable_buffers_type
+ mutable_buffers_type;
+
+ /// Construct a basic_streambuf_ref for the given basic_streambuf object.
+ explicit basic_streambuf_ref(basic_streambuf<Allocator>& sb)
+ : sb_(sb)
+ {
+ }
+
+ /// Copy construct a basic_streambuf_ref.
+ basic_streambuf_ref(const basic_streambuf_ref& other) noexcept
+ : sb_(other.sb_)
+ {
+ }
+
+ /// Move construct a basic_streambuf_ref.
+ basic_streambuf_ref(basic_streambuf_ref&& other) noexcept
+ : sb_(other.sb_)
+ {
+ }
+
+ /// Get the size of the input sequence.
+ std::size_t size() const noexcept
+ {
+ return sb_.size();
+ }
+
+ /// Get the maximum size of the dynamic buffer.
+ std::size_t max_size() const noexcept
+ {
+ return sb_.max_size();
+ }
+
+ /// Get the current capacity of the dynamic buffer.
+ std::size_t capacity() const noexcept
+ {
+ return sb_.capacity();
+ }
+
+ /// Get a list of buffers that represents the input sequence.
+ const_buffers_type data() const 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<Allocator>& sb_;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+
+#endif // ASIO_BASIC_STREAMBUF_HPP
diff --git a/3rdparty/asio/include/asio/basic_streambuf_fwd.hpp b/3rdparty/asio/include/asio/basic_streambuf_fwd.hpp
new file mode 100644
index 00000000000..1ff320d4637
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_streambuf_fwd.hpp
@@ -0,0 +1,36 @@
+//
+// basic_streambuf_fwd.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <memory>
+
+namespace asio {
+
+template <typename Allocator = std::allocator<char>>
+class basic_streambuf;
+
+template <typename Allocator = std::allocator<char>>
+class basic_streambuf_ref;
+
+} // namespace asio
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+
+#endif // ASIO_BASIC_STREAMBUF_FWD_HPP
diff --git a/3rdparty/asio/include/asio/basic_waitable_timer.hpp b/3rdparty/asio/include/asio/basic_waitable_timer.hpp
new file mode 100644
index 00000000000..5e9df3ef4f8
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_waitable_timer.hpp
@@ -0,0 +1,824 @@
+//
+// basic_waitable_timer.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <utility>
+#include "asio/any_io_executor.hpp"
+#include "asio/detail/chrono_time_traits.hpp"
+#include "asio/detail/deadline_timer_service.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+#include "asio/wait_traits.hpp"
+
+#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 <typename Clock,
+ typename WaitTraits = asio::wait_traits<Clock>,
+ typename Executor = any_io_executor>
+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 &lt;chrono&gt; 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(my_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(my_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 <typename Clock, typename WaitTraits, typename Executor>
+class basic_waitable_timer
+{
+private:
+ class initiate_async_wait;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the timer type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The timer type when rebound to the specified executor.
+ typedef basic_waitable_timer<Clock, WaitTraits, Executor1> other;
+ };
+
+ /// 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 ex The I/O executor that the timer will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the timer.
+ */
+ explicit basic_waitable_timer(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the timer will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the timer.
+ */
+ template <typename ExecutionContext>
+ explicit basic_waitable_timer(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// Constructor to set a particular expiry time as an absolute time.
+ /**
+ * This constructor creates a timer and sets the expiry time.
+ *
+ * @param ex The I/O executor object that the timer will use, by default, 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(const executor_type& ex, const time_point& expiry_time)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().expires_at(impl_.get_implementation(), expiry_time, ec);
+ asio::detail::throw_error(ec, "expires_at");
+ }
+
+ /// Constructor to set a particular expiry time as an absolute time.
+ /**
+ * This constructor creates a timer and sets the expiry time.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the timer will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ explicit basic_waitable_timer(ExecutionContext& context,
+ const time_point& expiry_time,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().expires_at(impl_.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 ex The I/O executor that the timer will use, by default, 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(const executor_type& ex, const duration& expiry_time)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().expires_after(
+ impl_.get_implementation(), expiry_time, ec);
+ asio::detail::throw_error(ec, "expires_after");
+ }
+
+ /// Constructor to set a particular expiry time relative to now.
+ /**
+ * This constructor creates a timer and sets the expiry time.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the timer will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ explicit basic_waitable_timer(ExecutionContext& context,
+ const duration& expiry_time,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().expires_after(
+ impl_.get_implementation(), expiry_time, ec);
+ asio::detail::throw_error(ec, "expires_after");
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_waitable_timer(basic_waitable_timer&& other)
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_waitable_timer& operator=(basic_waitable_timer&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ // All timers have access to each other's implementations.
+ template <typename Clock1, typename WaitTraits1, typename Executor1>
+ friend class basic_waitable_timer;
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ basic_waitable_timer(
+ basic_waitable_timer<Clock, WaitTraits, Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value
+ > = 0)
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_waitable_timer&
+ > operator=(basic_waitable_timer<Clock, WaitTraits, Executor1>&& other)
+ {
+ basic_waitable_timer tmp(std::move(other));
+ impl_ = std::move(tmp.impl_);
+ return *this;
+ }
+
+ /// 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()
+ {
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return impl_.get_executor();
+ }
+
+ /// 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 = impl_.get_service().cancel(impl_.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 impl_.get_service().cancel(impl_.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 = impl_.get_service().cancel_one(
+ impl_.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 impl_.get_service().cancel_one(impl_.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 impl_.get_service().expires_at(impl_.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 impl_.get_service().expiry(impl_.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 = impl_.get_service().expires_at(
+ impl_.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 impl_.get_service().expires_at(
+ impl_.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 = impl_.get_service().expires_after(
+ impl_.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 impl_.get_service().expires_from_now(impl_.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 = impl_.get_service().expires_from_now(
+ impl_.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 impl_.get_service().expires_from_now(
+ impl_.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;
+ impl_.get_service().wait(impl_.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)
+ {
+ impl_.get_service().wait(impl_.get_implementation(), ec);
+ }
+
+ /// Start an asynchronous wait on the timer.
+ /**
+ * This function may be used to initiate an asynchronous wait against the
+ * timer. It is an initiating function for an @ref asynchronous_operation,
+ * and always returns immediately.
+ *
+ * For each call to async_wait(), the completion handler will be called
+ * exactly once. The completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the timer expires. Potential
+ * completion tokens include @ref use_future, @ref use_awaitable, @ref
+ * yield_context, or a function object with the correct completion signature.
+ * The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ WaitToken = default_completion_token_t<executor_type>>
+ auto async_wait(
+ WaitToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WaitToken, void (asio::error_code)>(
+ declval<initiate_async_wait>(), token))
+ {
+ return async_initiate<WaitToken, void (asio::error_code)>(
+ initiate_async_wait(this), token);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_waitable_timer(const basic_waitable_timer&) = delete;
+ basic_waitable_timer& operator=(const basic_waitable_timer&) = delete;
+
+ class initiate_async_wait
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_wait(basic_waitable_timer* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WaitHandler>
+ void operator()(WaitHandler&& handler) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WaitHandler> handler2(handler);
+ self_->impl_.get_service().async_wait(
+ self_->impl_.get_implementation(),
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_waitable_timer* self_;
+ };
+
+ detail::io_object_impl<
+ detail::deadline_timer_service<
+ detail::chrono_time_traits<Clock, WaitTraits>>,
+ executor_type > impl_;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BASIC_WAITABLE_TIMER_HPP
diff --git a/3rdparty/asio/include/asio/basic_writable_pipe.hpp b/3rdparty/asio/include/asio/basic_writable_pipe.hpp
new file mode 100644
index 00000000000..4c389c9b464
--- /dev/null
+++ b/3rdparty/asio/include/asio/basic_writable_pipe.hpp
@@ -0,0 +1,622 @@
+//
+// basic_writable_pipe.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_WRITABLE_PIPE_HPP
+#define ASIO_BASIC_WRITABLE_PIPE_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_PIPE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include <string>
+#include <utility>
+#include "asio/any_io_executor.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_handle_service.hpp"
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/io_uring_descriptor_service.hpp"
+#else
+# include "asio/detail/reactive_descriptor_service.hpp"
+#endif
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Provides pipe functionality.
+/**
+ * The basic_writable_pipe class provides a wrapper over pipe
+ * functionality.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ */
+template <typename Executor = any_io_executor>
+class basic_writable_pipe
+{
+private:
+ class initiate_async_write_some;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the pipe type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The pipe type when rebound to the specified executor.
+ typedef basic_writable_pipe<Executor1> other;
+ };
+
+ /// The native representation of a pipe.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#elif defined(ASIO_HAS_IOCP)
+ typedef detail::win_iocp_handle_service::native_handle_type
+ native_handle_type;
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ typedef detail::io_uring_descriptor_service::native_handle_type
+ native_handle_type;
+#else
+ typedef detail::reactive_descriptor_service::native_handle_type
+ native_handle_type;
+#endif
+
+ /// A basic_writable_pipe is always the lowest layer.
+ typedef basic_writable_pipe lowest_layer_type;
+
+ /// Construct a basic_writable_pipe without opening it.
+ /**
+ * This constructor creates a pipe without opening it.
+ *
+ * @param ex The I/O executor that the pipe will use, by default, to dispatch
+ * handlers for any asynchronous operations performed on the pipe.
+ */
+ explicit basic_writable_pipe(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// Construct a basic_writable_pipe without opening it.
+ /**
+ * This constructor creates a pipe without opening it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the pipe will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the pipe.
+ */
+ template <typename ExecutionContext>
+ explicit basic_writable_pipe(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// Construct a basic_writable_pipe on an existing native pipe.
+ /**
+ * This constructor creates a pipe object to hold an existing native
+ * pipe.
+ *
+ * @param ex The I/O executor that the pipe will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * pipe.
+ *
+ * @param native_pipe A native pipe.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_writable_pipe(const executor_type& ex,
+ const native_handle_type& native_pipe)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(),
+ native_pipe, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Construct a basic_writable_pipe on an existing native pipe.
+ /**
+ * This constructor creates a pipe object to hold an existing native
+ * pipe.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the pipe will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the pipe.
+ *
+ * @param native_pipe A native pipe.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_writable_pipe(ExecutionContext& context,
+ const native_handle_type& native_pipe,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(),
+ native_pipe, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Move-construct a basic_writable_pipe from another.
+ /**
+ * This constructor moves a pipe from one object to another.
+ *
+ * @param other The other basic_writable_pipe 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_writable_pipe(const executor_type&)
+ * constructor.
+ */
+ basic_writable_pipe(basic_writable_pipe&& other)
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// Move-assign a basic_writable_pipe from another.
+ /**
+ * This assignment operator moves a pipe from one object to another.
+ *
+ * @param other The other basic_writable_pipe 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_writable_pipe(const executor_type&)
+ * constructor.
+ */
+ basic_writable_pipe& operator=(basic_writable_pipe&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ // All pipes have access to each other's implementations.
+ template <typename Executor1>
+ friend class basic_writable_pipe;
+
+ /// Move-construct a basic_writable_pipe from a pipe of another executor type.
+ /**
+ * This constructor moves a pipe from one object to another.
+ *
+ * @param other The other basic_writable_pipe 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_writable_pipe(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ basic_writable_pipe(basic_writable_pipe<Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// Move-assign a basic_writable_pipe from a pipe of another executor type.
+ /**
+ * This assignment operator moves a pipe from one object to another.
+ *
+ * @param other The other basic_writable_pipe 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_writable_pipe(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_writable_pipe&
+ > operator=(basic_writable_pipe<Executor1>&& other)
+ {
+ basic_writable_pipe tmp(std::move(other));
+ impl_ = std::move(tmp.impl_);
+ return *this;
+ }
+
+ /// Destroys the pipe.
+ /**
+ * This function destroys the pipe, cancelling any outstanding
+ * asynchronous wait operations associated with the pipe as if by
+ * calling @c cancel.
+ */
+ ~basic_writable_pipe()
+ {
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return impl_.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 basic_writable_pipe 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_writable_pipe 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 pipe to the pipe.
+ /*
+ * This function opens the pipe to hold an existing native pipe.
+ *
+ * @param native_pipe A native pipe.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ void assign(const native_handle_type& native_pipe)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(), native_pipe, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Assign an existing native pipe to the pipe.
+ /*
+ * This function opens the pipe to hold an existing native pipe.
+ *
+ * @param native_pipe A native pipe.
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ */
+ ASIO_SYNC_OP_VOID assign(const native_handle_type& native_pipe,
+ asio::error_code& ec)
+ {
+ impl_.get_service().assign(impl_.get_implementation(), native_pipe, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Determine whether the pipe is open.
+ bool is_open() const
+ {
+ return impl_.get_service().is_open(impl_.get_implementation());
+ }
+
+ /// Close the pipe.
+ /**
+ * This function is used to close the pipe. Any asynchronous 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;
+ impl_.get_service().close(impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "close");
+ }
+
+ /// Close the pipe.
+ /**
+ * This function is used to close the pipe. Any asynchronous 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)
+ {
+ impl_.get_service().close(impl_.get_implementation(), ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Release ownership of the underlying native pipe.
+ /**
+ * This function causes all outstanding asynchronous write operations to
+ * finish immediately, and the handlers for cancelled operations will be
+ * passed the asio::error::operation_aborted error. Ownership of the
+ * native pipe 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 = impl_.get_service().release(
+ impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "release");
+ return s;
+ }
+
+ /// Release ownership of the underlying native pipe.
+ /**
+ * This function causes all outstanding asynchronous write operations to
+ * finish immediately, and the handlers for cancelled operations will be
+ * passed the asio::error::operation_aborted error. Ownership of the
+ * native pipe 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 impl_.get_service().release(impl_.get_implementation(), ec);
+ }
+
+ /// Get the native pipe representation.
+ /**
+ * This function may be used to obtain the underlying representation of the
+ * pipe. This is intended to allow access to native pipe
+ * functionality that is not otherwise provided.
+ */
+ native_handle_type native_handle()
+ {
+ return impl_.get_service().native_handle(impl_.get_implementation());
+ }
+
+ /// Cancel all asynchronous operations associated with the pipe.
+ /**
+ * This function causes all outstanding asynchronous 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;
+ impl_.get_service().cancel(impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "cancel");
+ }
+
+ /// Cancel all asynchronous operations associated with the pipe.
+ /**
+ * This function causes all outstanding asynchronous 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)
+ {
+ impl_.get_service().cancel(impl_.get_implementation(), ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Write some data to the pipe.
+ /**
+ * This function is used to write data to the pipe. 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 pipe.
+ *
+ * @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
+ * pipe.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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = impl_.get_service().write_some(
+ impl_.get_implementation(), buffers, ec);
+ asio::detail::throw_error(ec, "write_some");
+ return s;
+ }
+
+ /// Write some data to the pipe.
+ /**
+ * This function is used to write data to the pipe. 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 pipe.
+ *
+ * @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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return impl_.get_service().write_some(
+ impl_.get_implementation(), buffers, ec);
+ }
+
+ /// Start an asynchronous write.
+ /**
+ * This function is used to asynchronously write data to the pipe. It is an
+ * initiating function for an @ref asynchronous_operation, and always returns
+ * immediately.
+ *
+ * @param buffers One or more data buffers to be written to the pipe.
+ * 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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
+ * pipe.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 <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_write_some(const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_write_some>(), token, buffers))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_write_some(this), token, buffers);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_writable_pipe(const basic_writable_pipe&) = delete;
+ basic_writable_pipe& operator=(const basic_writable_pipe&) = delete;
+
+ class initiate_async_write_some
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_write_some(basic_writable_pipe* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_write_some(
+ self_->impl_.get_implementation(), buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_writable_pipe* self_;
+ };
+
+#if defined(ASIO_HAS_IOCP)
+ detail::io_object_impl<detail::win_iocp_handle_service, Executor> impl_;
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ detail::io_object_impl<detail::io_uring_descriptor_service, Executor> impl_;
+#else
+ detail::io_object_impl<detail::reactive_descriptor_service, Executor> impl_;
+#endif
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_PIPE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_BASIC_WRITABLE_PIPE_HPP
diff --git a/3rdparty/asio/include/asio/bind_allocator.hpp b/3rdparty/asio/include/asio/bind_allocator.hpp
new file mode 100644
index 00000000000..27910a2ec69
--- /dev/null
+++ b/3rdparty/asio/include/asio/bind_allocator.hpp
@@ -0,0 +1,530 @@
+//
+// bind_allocator.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_ALLOCATOR_HPP
+#define ASIO_BIND_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/type_traits.hpp"
+#include "asio/associated_allocator.hpp"
+#include "asio/associator.hpp"
+#include "asio/async_result.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Helper to automatically define nested typedef result_type.
+
+template <typename T, typename = void>
+struct allocator_binder_result_type
+{
+protected:
+ typedef void result_type_or_void;
+};
+
+template <typename T>
+struct allocator_binder_result_type<T, void_t<typename T::result_type>>
+{
+ typedef typename T::result_type result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R>
+struct allocator_binder_result_type<R(*)()>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R>
+struct allocator_binder_result_type<R(&)()>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1>
+struct allocator_binder_result_type<R(*)(A1)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1>
+struct allocator_binder_result_type<R(&)(A1)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1, typename A2>
+struct allocator_binder_result_type<R(*)(A1, A2)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1, typename A2>
+struct allocator_binder_result_type<R(&)(A1, A2)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+// Helper to automatically define nested typedef argument_type.
+
+template <typename T, typename = void>
+struct allocator_binder_argument_type {};
+
+template <typename T>
+struct allocator_binder_argument_type<T, void_t<typename T::argument_type>>
+{
+ typedef typename T::argument_type argument_type;
+};
+
+template <typename R, typename A1>
+struct allocator_binder_argument_type<R(*)(A1)>
+{
+ typedef A1 argument_type;
+};
+
+template <typename R, typename A1>
+struct allocator_binder_argument_type<R(&)(A1)>
+{
+ typedef A1 argument_type;
+};
+
+// Helper to automatically define nested typedefs first_argument_type and
+// second_argument_type.
+
+template <typename T, typename = void>
+struct allocator_binder_argument_types {};
+
+template <typename T>
+struct allocator_binder_argument_types<T,
+ void_t<typename T::first_argument_type>>
+{
+ typedef typename T::first_argument_type first_argument_type;
+ typedef typename T::second_argument_type second_argument_type;
+};
+
+template <typename R, typename A1, typename A2>
+struct allocator_binder_argument_type<R(*)(A1, A2)>
+{
+ typedef A1 first_argument_type;
+ typedef A2 second_argument_type;
+};
+
+template <typename R, typename A1, typename A2>
+struct allocator_binder_argument_type<R(&)(A1, A2)>
+{
+ typedef A1 first_argument_type;
+ typedef A2 second_argument_type;
+};
+
+} // namespace detail
+
+/// A call wrapper type to bind an allocator of type @c Allocator
+/// to an object of type @c T.
+template <typename T, typename Allocator>
+class allocator_binder
+#if !defined(GENERATING_DOCUMENTATION)
+ : public detail::allocator_binder_result_type<T>,
+ public detail::allocator_binder_argument_type<T>,
+ public detail::allocator_binder_argument_types<T>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+public:
+ /// The type of the target object.
+ typedef T target_type;
+
+ /// The type of the associated allocator.
+ typedef Allocator allocator_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 allocator wrapper for the specified object.
+ /**
+ * This constructor is only valid if the type @c T is constructible from type
+ * @c U.
+ */
+ template <typename U>
+ allocator_binder(const allocator_type& s, U&& u)
+ : allocator_(s),
+ target_(static_cast<U&&>(u))
+ {
+ }
+
+ /// Copy constructor.
+ allocator_binder(const allocator_binder& other)
+ : allocator_(other.get_allocator()),
+ target_(other.get())
+ {
+ }
+
+ /// Construct a copy, but specify a different allocator.
+ allocator_binder(const allocator_type& s, const allocator_binder& other)
+ : allocator_(s),
+ target_(other.get())
+ {
+ }
+
+ /// Construct a copy of a different allocator wrapper type.
+ /**
+ * This constructor is only valid if the @c Allocator type is
+ * constructible from type @c OtherAllocator, and the type @c T is
+ * constructible from type @c U.
+ */
+ template <typename U, typename OtherAllocator>
+ allocator_binder(const allocator_binder<U, OtherAllocator>& other,
+ constraint_t<is_constructible<Allocator, OtherAllocator>::value> = 0,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : allocator_(other.get_allocator()),
+ target_(other.get())
+ {
+ }
+
+ /// Construct a copy of a different allocator wrapper type, but
+ /// specify a different allocator.
+ /**
+ * This constructor is only valid if the type @c T is constructible from type
+ * @c U.
+ */
+ template <typename U, typename OtherAllocator>
+ allocator_binder(const allocator_type& s,
+ const allocator_binder<U, OtherAllocator>& other,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : allocator_(s),
+ target_(other.get())
+ {
+ }
+
+ /// Move constructor.
+ allocator_binder(allocator_binder&& other)
+ : allocator_(static_cast<allocator_type&&>(
+ other.get_allocator())),
+ target_(static_cast<T&&>(other.get()))
+ {
+ }
+
+ /// Move construct the target object, but specify a different allocator.
+ allocator_binder(const allocator_type& s,
+ allocator_binder&& other)
+ : allocator_(s),
+ target_(static_cast<T&&>(other.get()))
+ {
+ }
+
+ /// Move construct from a different allocator wrapper type.
+ template <typename U, typename OtherAllocator>
+ allocator_binder(
+ allocator_binder<U, OtherAllocator>&& other,
+ constraint_t<is_constructible<Allocator, OtherAllocator>::value> = 0,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : allocator_(static_cast<OtherAllocator&&>(
+ other.get_allocator())),
+ target_(static_cast<U&&>(other.get()))
+ {
+ }
+
+ /// Move construct from a different allocator wrapper type, but
+ /// specify a different allocator.
+ template <typename U, typename OtherAllocator>
+ allocator_binder(const allocator_type& s,
+ allocator_binder<U, OtherAllocator>&& other,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : allocator_(s),
+ target_(static_cast<U&&>(other.get()))
+ {
+ }
+
+ /// Destructor.
+ ~allocator_binder()
+ {
+ }
+
+ /// Obtain a reference to the target object.
+ target_type& get() noexcept
+ {
+ return target_;
+ }
+
+ /// Obtain a reference to the target object.
+ const target_type& get() const noexcept
+ {
+ return target_;
+ }
+
+ /// Obtain the associated allocator.
+ allocator_type get_allocator() const noexcept
+ {
+ return allocator_;
+ }
+
+ /// Forwarding function call operator.
+ template <typename... Args>
+ result_of_t<T(Args...)> operator()(Args&&... args)
+ {
+ return target_(static_cast<Args&&>(args)...);
+ }
+
+ /// Forwarding function call operator.
+ template <typename... Args>
+ result_of_t<T(Args...)> operator()(Args&&... args) const
+ {
+ return target_(static_cast<Args&&>(args)...);
+ }
+
+private:
+ Allocator allocator_;
+ T target_;
+};
+
+/// Associate an object of type @c T with an allocator of type
+/// @c Allocator.
+template <typename Allocator, typename T>
+ASIO_NODISCARD inline allocator_binder<decay_t<T>, Allocator>
+bind_allocator(const Allocator& s, T&& t)
+{
+ return allocator_binder<decay_t<T>, Allocator>(s, static_cast<T&&>(t));
+}
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+namespace detail {
+
+template <typename TargetAsyncResult, typename Allocator, typename = void>
+class allocator_binder_completion_handler_async_result
+{
+public:
+ template <typename T>
+ explicit allocator_binder_completion_handler_async_result(T&)
+ {
+ }
+};
+
+template <typename TargetAsyncResult, typename Allocator>
+class allocator_binder_completion_handler_async_result<
+ TargetAsyncResult, Allocator,
+ void_t<typename TargetAsyncResult::completion_handler_type>>
+{
+private:
+ TargetAsyncResult target_;
+
+public:
+ typedef allocator_binder<
+ typename TargetAsyncResult::completion_handler_type, Allocator>
+ completion_handler_type;
+
+ explicit allocator_binder_completion_handler_async_result(
+ typename TargetAsyncResult::completion_handler_type& handler)
+ : target_(handler)
+ {
+ }
+
+ auto get() -> decltype(target_.get())
+ {
+ return target_.get();
+ }
+};
+
+template <typename TargetAsyncResult, typename = void>
+struct allocator_binder_async_result_return_type
+{
+};
+
+template <typename TargetAsyncResult>
+struct allocator_binder_async_result_return_type<
+ TargetAsyncResult, void_type<typename TargetAsyncResult::return_type>>
+{
+ typedef typename TargetAsyncResult::return_type return_type;
+};
+
+} // namespace detail
+
+template <typename T, typename Allocator, typename Signature>
+class async_result<allocator_binder<T, Allocator>, Signature> :
+ public detail::allocator_binder_completion_handler_async_result<
+ async_result<T, Signature>, Allocator>,
+ public detail::allocator_binder_async_result_return_type<
+ async_result<T, Signature>>
+{
+public:
+ explicit async_result(allocator_binder<T, Allocator>& b)
+ : detail::allocator_binder_completion_handler_async_result<
+ async_result<T, Signature>, Allocator>(b.get())
+ {
+ }
+
+ template <typename Initiation>
+ struct init_wrapper
+ {
+ template <typename Init>
+ init_wrapper(const Allocator& allocator, Init&& init)
+ : allocator_(allocator),
+ initiation_(static_cast<Init&&>(init))
+ {
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler, Args&&... args)
+ {
+ static_cast<Initiation&&>(initiation_)(
+ allocator_binder<decay_t<Handler>, Allocator>(
+ allocator_, static_cast<Handler&&>(handler)),
+ static_cast<Args&&>(args)...);
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler, Args&&... args) const
+ {
+ initiation_(
+ allocator_binder<decay_t<Handler>, Allocator>(
+ allocator_, static_cast<Handler&&>(handler)),
+ static_cast<Args&&>(args)...);
+ }
+
+ Allocator allocator_;
+ Initiation initiation_;
+ };
+
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static auto initiate(Initiation&& initiation,
+ RawCompletionToken&& token, Args&&... args)
+ -> decltype(
+ async_initiate<T, Signature>(
+ declval<init_wrapper<decay_t<Initiation>>>(),
+ token.get(), static_cast<Args&&>(args)...))
+ {
+ return async_initiate<T, Signature>(
+ init_wrapper<decay_t<Initiation>>(token.get_allocator(),
+ static_cast<Initiation&&>(initiation)),
+ token.get(), static_cast<Args&&>(args)...);
+ }
+
+private:
+ async_result(const async_result&) = delete;
+ async_result& operator=(const async_result&) = delete;
+
+ async_result<T, Signature> target_;
+};
+
+template <template <typename, typename> class Associator,
+ typename T, typename Allocator, typename DefaultCandidate>
+struct associator<Associator, allocator_binder<T, Allocator>, DefaultCandidate>
+ : Associator<T, DefaultCandidate>
+{
+ static typename Associator<T, DefaultCandidate>::type get(
+ const allocator_binder<T, Allocator>& b) noexcept
+ {
+ return Associator<T, DefaultCandidate>::get(b.get());
+ }
+
+ static auto get(const allocator_binder<T, Allocator>& b,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<T, DefaultCandidate>::get(b.get(), c))
+ {
+ return Associator<T, DefaultCandidate>::get(b.get(), c);
+ }
+};
+
+template <typename T, typename Allocator, typename Allocator1>
+struct associated_allocator<allocator_binder<T, Allocator>, Allocator1>
+{
+ typedef Allocator type;
+
+ static auto get(const allocator_binder<T, Allocator>& b,
+ const Allocator1& = Allocator1()) noexcept
+ -> decltype(b.get_allocator())
+ {
+ return b.get_allocator();
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BIND_ALLOCATOR_HPP
diff --git a/3rdparty/asio/include/asio/bind_cancellation_slot.hpp b/3rdparty/asio/include/asio/bind_cancellation_slot.hpp
new file mode 100644
index 00000000000..7be13426283
--- /dev/null
+++ b/3rdparty/asio/include/asio/bind_cancellation_slot.hpp
@@ -0,0 +1,544 @@
+//
+// bind_cancellation_slot.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CANCELLATION_SLOT_HPP
+#define ASIO_BIND_CANCELLATION_SLOT_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/associated_cancellation_slot.hpp"
+#include "asio/associator.hpp"
+#include "asio/async_result.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Helper to automatically define nested typedef result_type.
+
+template <typename T, typename = void>
+struct cancellation_slot_binder_result_type
+{
+protected:
+ typedef void result_type_or_void;
+};
+
+template <typename T>
+struct cancellation_slot_binder_result_type<T, void_t<typename T::result_type>>
+{
+ typedef typename T::result_type result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R>
+struct cancellation_slot_binder_result_type<R(*)()>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R>
+struct cancellation_slot_binder_result_type<R(&)()>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1>
+struct cancellation_slot_binder_result_type<R(*)(A1)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1>
+struct cancellation_slot_binder_result_type<R(&)(A1)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1, typename A2>
+struct cancellation_slot_binder_result_type<R(*)(A1, A2)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1, typename A2>
+struct cancellation_slot_binder_result_type<R(&)(A1, A2)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+// Helper to automatically define nested typedef argument_type.
+
+template <typename T, typename = void>
+struct cancellation_slot_binder_argument_type {};
+
+template <typename T>
+struct cancellation_slot_binder_argument_type<T,
+ void_t<typename T::argument_type>>
+{
+ typedef typename T::argument_type argument_type;
+};
+
+template <typename R, typename A1>
+struct cancellation_slot_binder_argument_type<R(*)(A1)>
+{
+ typedef A1 argument_type;
+};
+
+template <typename R, typename A1>
+struct cancellation_slot_binder_argument_type<R(&)(A1)>
+{
+ typedef A1 argument_type;
+};
+
+// Helper to automatically define nested typedefs first_argument_type and
+// second_argument_type.
+
+template <typename T, typename = void>
+struct cancellation_slot_binder_argument_types {};
+
+template <typename T>
+struct cancellation_slot_binder_argument_types<T,
+ void_t<typename T::first_argument_type>>
+{
+ typedef typename T::first_argument_type first_argument_type;
+ typedef typename T::second_argument_type second_argument_type;
+};
+
+template <typename R, typename A1, typename A2>
+struct cancellation_slot_binder_argument_type<R(*)(A1, A2)>
+{
+ typedef A1 first_argument_type;
+ typedef A2 second_argument_type;
+};
+
+template <typename R, typename A1, typename A2>
+struct cancellation_slot_binder_argument_type<R(&)(A1, A2)>
+{
+ typedef A1 first_argument_type;
+ typedef A2 second_argument_type;
+};
+
+} // namespace detail
+
+/// A call wrapper type to bind a cancellation slot of type @c CancellationSlot
+/// to an object of type @c T.
+template <typename T, typename CancellationSlot>
+class cancellation_slot_binder
+#if !defined(GENERATING_DOCUMENTATION)
+ : public detail::cancellation_slot_binder_result_type<T>,
+ public detail::cancellation_slot_binder_argument_type<T>,
+ public detail::cancellation_slot_binder_argument_types<T>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+public:
+ /// The type of the target object.
+ typedef T target_type;
+
+ /// The type of the associated cancellation slot.
+ typedef CancellationSlot cancellation_slot_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 a cancellation slot wrapper for the specified object.
+ /**
+ * This constructor is only valid if the type @c T is constructible from type
+ * @c U.
+ */
+ template <typename U>
+ cancellation_slot_binder(const cancellation_slot_type& s, U&& u)
+ : slot_(s),
+ target_(static_cast<U&&>(u))
+ {
+ }
+
+ /// Copy constructor.
+ cancellation_slot_binder(const cancellation_slot_binder& other)
+ : slot_(other.get_cancellation_slot()),
+ target_(other.get())
+ {
+ }
+
+ /// Construct a copy, but specify a different cancellation slot.
+ cancellation_slot_binder(const cancellation_slot_type& s,
+ const cancellation_slot_binder& other)
+ : slot_(s),
+ target_(other.get())
+ {
+ }
+
+ /// Construct a copy of a different cancellation slot wrapper type.
+ /**
+ * This constructor is only valid if the @c CancellationSlot type is
+ * constructible from type @c OtherCancellationSlot, and the type @c T is
+ * constructible from type @c U.
+ */
+ template <typename U, typename OtherCancellationSlot>
+ cancellation_slot_binder(
+ const cancellation_slot_binder<U, OtherCancellationSlot>& other,
+ constraint_t<is_constructible<CancellationSlot,
+ OtherCancellationSlot>::value> = 0,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : slot_(other.get_cancellation_slot()),
+ target_(other.get())
+ {
+ }
+
+ /// Construct a copy of a different cancellation slot wrapper type, but
+ /// specify a different cancellation slot.
+ /**
+ * This constructor is only valid if the type @c T is constructible from type
+ * @c U.
+ */
+ template <typename U, typename OtherCancellationSlot>
+ cancellation_slot_binder(const cancellation_slot_type& s,
+ const cancellation_slot_binder<U, OtherCancellationSlot>& other,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : slot_(s),
+ target_(other.get())
+ {
+ }
+
+ /// Move constructor.
+ cancellation_slot_binder(cancellation_slot_binder&& other)
+ : slot_(static_cast<cancellation_slot_type&&>(
+ other.get_cancellation_slot())),
+ target_(static_cast<T&&>(other.get()))
+ {
+ }
+
+ /// Move construct the target object, but specify a different cancellation
+ /// slot.
+ cancellation_slot_binder(const cancellation_slot_type& s,
+ cancellation_slot_binder&& other)
+ : slot_(s),
+ target_(static_cast<T&&>(other.get()))
+ {
+ }
+
+ /// Move construct from a different cancellation slot wrapper type.
+ template <typename U, typename OtherCancellationSlot>
+ cancellation_slot_binder(
+ cancellation_slot_binder<U, OtherCancellationSlot>&& other,
+ constraint_t<is_constructible<CancellationSlot,
+ OtherCancellationSlot>::value> = 0,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : slot_(static_cast<OtherCancellationSlot&&>(
+ other.get_cancellation_slot())),
+ target_(static_cast<U&&>(other.get()))
+ {
+ }
+
+ /// Move construct from a different cancellation slot wrapper type, but
+ /// specify a different cancellation slot.
+ template <typename U, typename OtherCancellationSlot>
+ cancellation_slot_binder(const cancellation_slot_type& s,
+ cancellation_slot_binder<U, OtherCancellationSlot>&& other,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : slot_(s),
+ target_(static_cast<U&&>(other.get()))
+ {
+ }
+
+ /// Destructor.
+ ~cancellation_slot_binder()
+ {
+ }
+
+ /// Obtain a reference to the target object.
+ target_type& get() noexcept
+ {
+ return target_;
+ }
+
+ /// Obtain a reference to the target object.
+ const target_type& get() const noexcept
+ {
+ return target_;
+ }
+
+ /// Obtain the associated cancellation slot.
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return slot_;
+ }
+
+ /// Forwarding function call operator.
+ template <typename... Args>
+ result_of_t<T(Args...)> operator()(Args&&... args)
+ {
+ return target_(static_cast<Args&&>(args)...);
+ }
+
+ /// Forwarding function call operator.
+ template <typename... Args>
+ result_of_t<T(Args...)> operator()(Args&&... args) const
+ {
+ return target_(static_cast<Args&&>(args)...);
+ }
+
+private:
+ CancellationSlot slot_;
+ T target_;
+};
+
+/// Associate an object of type @c T with a cancellation slot of type
+/// @c CancellationSlot.
+template <typename CancellationSlot, typename T>
+ASIO_NODISCARD inline
+cancellation_slot_binder<decay_t<T>, CancellationSlot>
+bind_cancellation_slot(const CancellationSlot& s, T&& t)
+{
+ return cancellation_slot_binder<decay_t<T>, CancellationSlot>(
+ s, static_cast<T&&>(t));
+}
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+namespace detail {
+
+template <typename TargetAsyncResult,
+ typename CancellationSlot, typename = void>
+class cancellation_slot_binder_completion_handler_async_result
+{
+public:
+ template <typename T>
+ explicit cancellation_slot_binder_completion_handler_async_result(T&)
+ {
+ }
+};
+
+template <typename TargetAsyncResult, typename CancellationSlot>
+class cancellation_slot_binder_completion_handler_async_result<
+ TargetAsyncResult, CancellationSlot,
+ void_t<typename TargetAsyncResult::completion_handler_type>>
+{
+private:
+ TargetAsyncResult target_;
+
+public:
+ typedef cancellation_slot_binder<
+ typename TargetAsyncResult::completion_handler_type, CancellationSlot>
+ completion_handler_type;
+
+ explicit cancellation_slot_binder_completion_handler_async_result(
+ typename TargetAsyncResult::completion_handler_type& handler)
+ : target_(handler)
+ {
+ }
+
+ auto get() -> decltype(target_.get())
+ {
+ return target_.get();
+ }
+};
+
+template <typename TargetAsyncResult, typename = void>
+struct cancellation_slot_binder_async_result_return_type
+{
+};
+
+template <typename TargetAsyncResult>
+struct cancellation_slot_binder_async_result_return_type<
+ TargetAsyncResult, void_t<typename TargetAsyncResult::return_type>>
+{
+ typedef typename TargetAsyncResult::return_type return_type;
+};
+
+} // namespace detail
+
+template <typename T, typename CancellationSlot, typename Signature>
+class async_result<cancellation_slot_binder<T, CancellationSlot>, Signature> :
+ public detail::cancellation_slot_binder_completion_handler_async_result<
+ async_result<T, Signature>, CancellationSlot>,
+ public detail::cancellation_slot_binder_async_result_return_type<
+ async_result<T, Signature>>
+{
+public:
+ explicit async_result(cancellation_slot_binder<T, CancellationSlot>& b)
+ : detail::cancellation_slot_binder_completion_handler_async_result<
+ async_result<T, Signature>, CancellationSlot>(b.get())
+ {
+ }
+
+ template <typename Initiation>
+ struct init_wrapper
+ {
+ template <typename Init>
+ init_wrapper(const CancellationSlot& slot, Init&& init)
+ : slot_(slot),
+ initiation_(static_cast<Init&&>(init))
+ {
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler, Args&&... args)
+ {
+ static_cast<Initiation&&>(initiation_)(
+ cancellation_slot_binder<decay_t<Handler>, CancellationSlot>(
+ slot_, static_cast<Handler&&>(handler)),
+ static_cast<Args&&>(args)...);
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler, Args&&... args) const
+ {
+ initiation_(
+ cancellation_slot_binder<decay_t<Handler>, CancellationSlot>(
+ slot_, static_cast<Handler&&>(handler)),
+ static_cast<Args&&>(args)...);
+ }
+
+ CancellationSlot slot_;
+ Initiation initiation_;
+ };
+
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static auto initiate(Initiation&& initiation,
+ RawCompletionToken&& token, Args&&... args)
+ -> decltype(
+ async_initiate<T, Signature>(
+ declval<init_wrapper<decay_t<Initiation>>>(),
+ token.get(), static_cast<Args&&>(args)...))
+ {
+ return async_initiate<T, Signature>(
+ init_wrapper<decay_t<Initiation>>(
+ token.get_cancellation_slot(),
+ static_cast<Initiation&&>(initiation)),
+ token.get(), static_cast<Args&&>(args)...);
+ }
+
+private:
+ async_result(const async_result&) = delete;
+ async_result& operator=(const async_result&) = delete;
+
+ async_result<T, Signature> target_;
+};
+
+template <template <typename, typename> class Associator,
+ typename T, typename CancellationSlot, typename DefaultCandidate>
+struct associator<Associator,
+ cancellation_slot_binder<T, CancellationSlot>,
+ DefaultCandidate>
+ : Associator<T, DefaultCandidate>
+{
+ static typename Associator<T, DefaultCandidate>::type get(
+ const cancellation_slot_binder<T, CancellationSlot>& b) noexcept
+ {
+ return Associator<T, DefaultCandidate>::get(b.get());
+ }
+
+ static auto get(const cancellation_slot_binder<T, CancellationSlot>& b,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<T, DefaultCandidate>::get(b.get(), c))
+ {
+ return Associator<T, DefaultCandidate>::get(b.get(), c);
+ }
+};
+
+template <typename T, typename CancellationSlot, typename CancellationSlot1>
+struct associated_cancellation_slot<
+ cancellation_slot_binder<T, CancellationSlot>,
+ CancellationSlot1>
+{
+ typedef CancellationSlot type;
+
+ static auto get(const cancellation_slot_binder<T, CancellationSlot>& b,
+ const CancellationSlot1& = CancellationSlot1()) noexcept
+ -> decltype(b.get_cancellation_slot())
+ {
+ return b.get_cancellation_slot();
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BIND_CANCELLATION_SLOT_HPP
diff --git a/3rdparty/asio/include/asio/bind_executor.hpp b/3rdparty/asio/include/asio/bind_executor.hpp
new file mode 100644
index 00000000000..f117b4ce903
--- /dev/null
+++ b/3rdparty/asio/include/asio/bind_executor.hpp
@@ -0,0 +1,582 @@
+//
+// bind_executor.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/associated_executor.hpp"
+#include "asio/associator.hpp"
+#include "asio/async_result.hpp"
+#include "asio/execution/executor.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 {
+
+// Helper to automatically define nested typedef result_type.
+
+template <typename T, typename = void>
+struct executor_binder_result_type
+{
+protected:
+ typedef void result_type_or_void;
+};
+
+template <typename T>
+struct executor_binder_result_type<T, void_t<typename T::result_type>>
+{
+ typedef typename T::result_type result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R>
+struct executor_binder_result_type<R(*)()>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R>
+struct executor_binder_result_type<R(&)()>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1>
+struct executor_binder_result_type<R(*)(A1)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1>
+struct executor_binder_result_type<R(&)(A1)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1, typename A2>
+struct executor_binder_result_type<R(*)(A1, A2)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1, typename A2>
+struct executor_binder_result_type<R(&)(A1, A2)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+// Helper to automatically define nested typedef argument_type.
+
+template <typename T, typename = void>
+struct executor_binder_argument_type {};
+
+template <typename T>
+struct executor_binder_argument_type<T, void_t<typename T::argument_type>>
+{
+ typedef typename T::argument_type argument_type;
+};
+
+template <typename R, typename A1>
+struct executor_binder_argument_type<R(*)(A1)>
+{
+ typedef A1 argument_type;
+};
+
+template <typename R, typename A1>
+struct executor_binder_argument_type<R(&)(A1)>
+{
+ typedef A1 argument_type;
+};
+
+// Helper to automatically define nested typedefs first_argument_type and
+// second_argument_type.
+
+template <typename T, typename = void>
+struct executor_binder_argument_types {};
+
+template <typename T>
+struct executor_binder_argument_types<T,
+ void_t<typename T::first_argument_type>>
+{
+ typedef typename T::first_argument_type first_argument_type;
+ typedef typename T::second_argument_type second_argument_type;
+};
+
+template <typename R, typename A1, typename A2>
+struct executor_binder_argument_type<R(*)(A1, A2)>
+{
+ typedef A1 first_argument_type;
+ typedef A2 second_argument_type;
+};
+
+template <typename R, typename A1, typename A2>
+struct executor_binder_argument_type<R(&)(A1, A2)>
+{
+ typedef A1 first_argument_type;
+ typedef A2 second_argument_type;
+};
+
+// Helper to perform uses_executor construction of the target type, if
+// required.
+
+template <typename T, typename Executor, bool UsesExecutor>
+class executor_binder_base;
+
+template <typename T, typename Executor>
+class executor_binder_base<T, Executor, true>
+{
+protected:
+ template <typename E, typename U>
+ executor_binder_base(E&& e, U&& u)
+ : executor_(static_cast<E&&>(e)),
+ target_(executor_arg_t(), executor_, static_cast<U&&>(u))
+ {
+ }
+
+ Executor executor_;
+ T target_;
+};
+
+template <typename T, typename Executor>
+class executor_binder_base<T, Executor, false>
+{
+protected:
+ template <typename E, typename U>
+ executor_binder_base(E&& e, U&& u)
+ : executor_(static_cast<E&&>(e)),
+ target_(static_cast<U&&>(u))
+ {
+ }
+
+ Executor executor_;
+ T target_;
+};
+
+} // namespace detail
+
+/// A call wrapper type to bind an executor of type @c Executor to an object of
+/// type @c T.
+template <typename T, typename Executor>
+class executor_binder
+#if !defined(GENERATING_DOCUMENTATION)
+ : public detail::executor_binder_result_type<T>,
+ public detail::executor_binder_argument_type<T>,
+ public detail::executor_binder_argument_types<T>,
+ private detail::executor_binder_base<
+ T, Executor, uses_executor<T, 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 <typename U>
+ executor_binder(executor_arg_t, const executor_type& e,
+ U&& u)
+ : base_type(e, static_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 <typename U, typename OtherExecutor>
+ executor_binder(const executor_binder<U, OtherExecutor>& other,
+ constraint_t<is_constructible<Executor, OtherExecutor>::value> = 0,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : 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 <typename U, typename OtherExecutor>
+ executor_binder(executor_arg_t, const executor_type& e,
+ const executor_binder<U, OtherExecutor>& other,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : base_type(e, other.get())
+ {
+ }
+
+ /// Move constructor.
+ executor_binder(executor_binder&& other)
+ : base_type(static_cast<executor_type&&>(other.get_executor()),
+ static_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, static_cast<T&&>(other.get()))
+ {
+ }
+
+ /// Move construct from a different executor wrapper type.
+ template <typename U, typename OtherExecutor>
+ executor_binder(executor_binder<U, OtherExecutor>&& other,
+ constraint_t<is_constructible<Executor, OtherExecutor>::value> = 0,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : base_type(static_cast<OtherExecutor&&>(other.get_executor()),
+ static_cast<U&&>(other.get()))
+ {
+ }
+
+ /// Move construct from a different executor wrapper type, but specify a
+ /// different executor.
+ template <typename U, typename OtherExecutor>
+ executor_binder(executor_arg_t, const executor_type& e,
+ executor_binder<U, OtherExecutor>&& other,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : base_type(e, static_cast<U&&>(other.get()))
+ {
+ }
+
+ /// Destructor.
+ ~executor_binder()
+ {
+ }
+
+ /// Obtain a reference to the target object.
+ target_type& get() noexcept
+ {
+ return this->target_;
+ }
+
+ /// Obtain a reference to the target object.
+ const target_type& get() const noexcept
+ {
+ return this->target_;
+ }
+
+ /// Obtain the associated executor.
+ executor_type get_executor() const noexcept
+ {
+ return this->executor_;
+ }
+
+ /// Forwarding function call operator.
+ template <typename... Args>
+ result_of_t<T(Args...)> operator()(Args&&... args)
+ {
+ return this->target_(static_cast<Args&&>(args)...);
+ }
+
+ /// Forwarding function call operator.
+ template <typename... Args>
+ result_of_t<T(Args...)> operator()(Args&&... args) const
+ {
+ return this->target_(static_cast<Args&&>(args)...);
+ }
+
+private:
+ typedef detail::executor_binder_base<T, Executor,
+ uses_executor<T, Executor>::value> base_type;
+};
+
+/// Associate an object of type @c T with an executor of type @c Executor.
+template <typename Executor, typename T>
+ASIO_NODISCARD inline executor_binder<decay_t<T>, Executor>
+bind_executor(const Executor& ex, T&& t,
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0)
+{
+ return executor_binder<decay_t<T>, Executor>(
+ executor_arg_t(), ex, static_cast<T&&>(t));
+}
+
+/// Associate an object of type @c T with an execution context's executor.
+template <typename ExecutionContext, typename T>
+ASIO_NODISCARD inline executor_binder<decay_t<T>,
+ typename ExecutionContext::executor_type>
+bind_executor(ExecutionContext& ctx, T&& t,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+{
+ return executor_binder<decay_t<T>, typename ExecutionContext::executor_type>(
+ executor_arg_t(), ctx.get_executor(), static_cast<T&&>(t));
+}
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename T, typename Executor>
+struct uses_executor<executor_binder<T, Executor>, Executor>
+ : true_type {};
+
+namespace detail {
+
+template <typename TargetAsyncResult, typename Executor, typename = void>
+class executor_binder_completion_handler_async_result
+{
+public:
+ template <typename T>
+ explicit executor_binder_completion_handler_async_result(T&)
+ {
+ }
+};
+
+template <typename TargetAsyncResult, typename Executor>
+class executor_binder_completion_handler_async_result<
+ TargetAsyncResult, Executor,
+ void_t<typename TargetAsyncResult::completion_handler_type >>
+{
+private:
+ TargetAsyncResult target_;
+
+public:
+ typedef executor_binder<
+ typename TargetAsyncResult::completion_handler_type, Executor>
+ completion_handler_type;
+
+ explicit executor_binder_completion_handler_async_result(
+ typename TargetAsyncResult::completion_handler_type& handler)
+ : target_(handler)
+ {
+ }
+
+ auto get() -> decltype(target_.get())
+ {
+ return target_.get();
+ }
+};
+
+template <typename TargetAsyncResult, typename = void>
+struct executor_binder_async_result_return_type
+{
+};
+
+template <typename TargetAsyncResult>
+struct executor_binder_async_result_return_type<TargetAsyncResult,
+ void_t<typename TargetAsyncResult::return_type>>
+{
+ typedef typename TargetAsyncResult::return_type return_type;
+};
+
+} // namespace detail
+
+template <typename T, typename Executor, typename Signature>
+class async_result<executor_binder<T, Executor>, Signature> :
+ public detail::executor_binder_completion_handler_async_result<
+ async_result<T, Signature>, Executor>,
+ public detail::executor_binder_async_result_return_type<
+ async_result<T, Signature>>
+{
+public:
+ explicit async_result(executor_binder<T, Executor>& b)
+ : detail::executor_binder_completion_handler_async_result<
+ async_result<T, Signature>, Executor>(b.get())
+ {
+ }
+
+ template <typename Initiation>
+ struct init_wrapper
+ {
+ template <typename Init>
+ init_wrapper(const Executor& ex, Init&& init)
+ : ex_(ex),
+ initiation_(static_cast<Init&&>(init))
+ {
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler, Args&&... args)
+ {
+ static_cast<Initiation&&>(initiation_)(
+ executor_binder<decay_t<Handler>, Executor>(
+ executor_arg_t(), ex_, static_cast<Handler&&>(handler)),
+ static_cast<Args&&>(args)...);
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler, Args&&... args) const
+ {
+ initiation_(
+ executor_binder<decay_t<Handler>, Executor>(
+ executor_arg_t(), ex_, static_cast<Handler&&>(handler)),
+ static_cast<Args&&>(args)...);
+ }
+
+ Executor ex_;
+ Initiation initiation_;
+ };
+
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static auto initiate(Initiation&& initiation,
+ RawCompletionToken&& token, Args&&... args)
+ -> decltype(
+ async_initiate<T, Signature>(
+ declval<init_wrapper<decay_t<Initiation>>>(),
+ token.get(), static_cast<Args&&>(args)...))
+ {
+ return async_initiate<T, Signature>(
+ init_wrapper<decay_t<Initiation>>(
+ token.get_executor(), static_cast<Initiation&&>(initiation)),
+ token.get(), static_cast<Args&&>(args)...);
+ }
+
+private:
+ async_result(const async_result&) = delete;
+ async_result& operator=(const async_result&) = delete;
+};
+
+template <template <typename, typename> class Associator,
+ typename T, typename Executor, typename DefaultCandidate>
+struct associator<Associator, executor_binder<T, Executor>, DefaultCandidate>
+ : Associator<T, DefaultCandidate>
+{
+ static typename Associator<T, DefaultCandidate>::type get(
+ const executor_binder<T, Executor>& b) noexcept
+ {
+ return Associator<T, DefaultCandidate>::get(b.get());
+ }
+
+ static auto get(const executor_binder<T, Executor>& b,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<T, DefaultCandidate>::get(b.get(), c))
+ {
+ return Associator<T, DefaultCandidate>::get(b.get(), c);
+ }
+};
+
+template <typename T, typename Executor, typename Executor1>
+struct associated_executor<executor_binder<T, Executor>, Executor1>
+{
+ typedef Executor type;
+
+ static auto get(const executor_binder<T, Executor>& b,
+ const Executor1& = Executor1()) noexcept
+ -> decltype(b.get_executor())
+ {
+ return b.get_executor();
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BIND_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/bind_immediate_executor.hpp b/3rdparty/asio/include/asio/bind_immediate_executor.hpp
new file mode 100644
index 00000000000..b02c520a689
--- /dev/null
+++ b/3rdparty/asio/include/asio/bind_immediate_executor.hpp
@@ -0,0 +1,549 @@
+//
+// bind_immediate_executor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_IMMEDIATE_EXECUTOR_HPP
+#define ASIO_BIND_IMMEDIATE_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/associated_immediate_executor.hpp"
+#include "asio/associator.hpp"
+#include "asio/async_result.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Helper to automatically define nested typedef result_type.
+
+template <typename T, typename = void>
+struct immediate_executor_binder_result_type
+{
+protected:
+ typedef void result_type_or_void;
+};
+
+template <typename T>
+struct immediate_executor_binder_result_type<T, void_t<typename T::result_type>>
+{
+ typedef typename T::result_type result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R>
+struct immediate_executor_binder_result_type<R(*)()>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R>
+struct immediate_executor_binder_result_type<R(&)()>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1>
+struct immediate_executor_binder_result_type<R(*)(A1)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1>
+struct immediate_executor_binder_result_type<R(&)(A1)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1, typename A2>
+struct immediate_executor_binder_result_type<R(*)(A1, A2)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+template <typename R, typename A1, typename A2>
+struct immediate_executor_binder_result_type<R(&)(A1, A2)>
+{
+ typedef R result_type;
+protected:
+ typedef result_type result_type_or_void;
+};
+
+// Helper to automatically define nested typedef argument_type.
+
+template <typename T, typename = void>
+struct immediate_executor_binder_argument_type {};
+
+template <typename T>
+struct immediate_executor_binder_argument_type<T,
+ void_t<typename T::argument_type>>
+{
+ typedef typename T::argument_type argument_type;
+};
+
+template <typename R, typename A1>
+struct immediate_executor_binder_argument_type<R(*)(A1)>
+{
+ typedef A1 argument_type;
+};
+
+template <typename R, typename A1>
+struct immediate_executor_binder_argument_type<R(&)(A1)>
+{
+ typedef A1 argument_type;
+};
+
+// Helper to automatically define nested typedefs first_argument_type and
+// second_argument_type.
+
+template <typename T, typename = void>
+struct immediate_executor_binder_argument_types {};
+
+template <typename T>
+struct immediate_executor_binder_argument_types<T,
+ void_t<typename T::first_argument_type>>
+{
+ typedef typename T::first_argument_type first_argument_type;
+ typedef typename T::second_argument_type second_argument_type;
+};
+
+template <typename R, typename A1, typename A2>
+struct immediate_executor_binder_argument_type<R(*)(A1, A2)>
+{
+ typedef A1 first_argument_type;
+ typedef A2 second_argument_type;
+};
+
+template <typename R, typename A1, typename A2>
+struct immediate_executor_binder_argument_type<R(&)(A1, A2)>
+{
+ typedef A1 first_argument_type;
+ typedef A2 second_argument_type;
+};
+
+} // namespace detail
+
+/// A call wrapper type to bind a immediate executor of type @c Executor
+/// to an object of type @c T.
+template <typename T, typename Executor>
+class immediate_executor_binder
+#if !defined(GENERATING_DOCUMENTATION)
+ : public detail::immediate_executor_binder_result_type<T>,
+ public detail::immediate_executor_binder_argument_type<T>,
+ public detail::immediate_executor_binder_argument_types<T>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+public:
+ /// The type of the target object.
+ typedef T target_type;
+
+ /// The type of the associated immediate executor.
+ typedef Executor immediate_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 a immediate executor wrapper for the specified object.
+ /**
+ * This constructor is only valid if the type @c T is constructible from type
+ * @c U.
+ */
+ template <typename U>
+ immediate_executor_binder(const immediate_executor_type& e,
+ U&& u)
+ : executor_(e),
+ target_(static_cast<U&&>(u))
+ {
+ }
+
+ /// Copy constructor.
+ immediate_executor_binder(const immediate_executor_binder& other)
+ : executor_(other.get_immediate_executor()),
+ target_(other.get())
+ {
+ }
+
+ /// Construct a copy, but specify a different immediate executor.
+ immediate_executor_binder(const immediate_executor_type& e,
+ const immediate_executor_binder& other)
+ : executor_(e),
+ target_(other.get())
+ {
+ }
+
+ /// Construct a copy of a different immediate 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 <typename U, typename OtherExecutor>
+ immediate_executor_binder(
+ const immediate_executor_binder<U, OtherExecutor>& other,
+ constraint_t<is_constructible<Executor, OtherExecutor>::value> = 0,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : executor_(other.get_immediate_executor()),
+ target_(other.get())
+ {
+ }
+
+ /// Construct a copy of a different immediate executor wrapper type, but
+ /// specify a different immediate executor.
+ /**
+ * This constructor is only valid if the type @c T is constructible from type
+ * @c U.
+ */
+ template <typename U, typename OtherExecutor>
+ immediate_executor_binder(const immediate_executor_type& e,
+ const immediate_executor_binder<U, OtherExecutor>& other,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : executor_(e),
+ target_(other.get())
+ {
+ }
+
+ /// Move constructor.
+ immediate_executor_binder(immediate_executor_binder&& other)
+ : executor_(static_cast<immediate_executor_type&&>(
+ other.get_immediate_executor())),
+ target_(static_cast<T&&>(other.get()))
+ {
+ }
+
+ /// Move construct the target object, but specify a different immediate
+ /// executor.
+ immediate_executor_binder(const immediate_executor_type& e,
+ immediate_executor_binder&& other)
+ : executor_(e),
+ target_(static_cast<T&&>(other.get()))
+ {
+ }
+
+ /// Move construct from a different immediate executor wrapper type.
+ template <typename U, typename OtherExecutor>
+ immediate_executor_binder(
+ immediate_executor_binder<U, OtherExecutor>&& other,
+ constraint_t<is_constructible<Executor, OtherExecutor>::value> = 0,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : executor_(static_cast<OtherExecutor&&>(
+ other.get_immediate_executor())),
+ target_(static_cast<U&&>(other.get()))
+ {
+ }
+
+ /// Move construct from a different immediate executor wrapper type, but
+ /// specify a different immediate executor.
+ template <typename U, typename OtherExecutor>
+ immediate_executor_binder(const immediate_executor_type& e,
+ immediate_executor_binder<U, OtherExecutor>&& other,
+ constraint_t<is_constructible<T, U>::value> = 0)
+ : executor_(e),
+ target_(static_cast<U&&>(other.get()))
+ {
+ }
+
+ /// Destructor.
+ ~immediate_executor_binder()
+ {
+ }
+
+ /// Obtain a reference to the target object.
+ target_type& get() noexcept
+ {
+ return target_;
+ }
+
+ /// Obtain a reference to the target object.
+ const target_type& get() const noexcept
+ {
+ return target_;
+ }
+
+ /// Obtain the associated immediate executor.
+ immediate_executor_type get_immediate_executor() const noexcept
+ {
+ return executor_;
+ }
+
+ /// Forwarding function call operator.
+ template <typename... Args>
+ result_of_t<T(Args...)> operator()(Args&&... args)
+ {
+ return target_(static_cast<Args&&>(args)...);
+ }
+
+ /// Forwarding function call operator.
+ template <typename... Args>
+ result_of_t<T(Args...)> operator()(Args&&... args) const
+ {
+ return target_(static_cast<Args&&>(args)...);
+ }
+
+private:
+ Executor executor_;
+ T target_;
+};
+
+/// Associate an object of type @c T with a immediate executor of type
+/// @c Executor.
+template <typename Executor, typename T>
+ASIO_NODISCARD inline immediate_executor_binder<decay_t<T>, Executor>
+bind_immediate_executor(const Executor& e, T&& t)
+{
+ return immediate_executor_binder<
+ decay_t<T>, Executor>(
+ e, static_cast<T&&>(t));
+}
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+namespace detail {
+
+template <typename TargetAsyncResult, typename Executor, typename = void>
+class immediate_executor_binder_completion_handler_async_result
+{
+public:
+ template <typename T>
+ explicit immediate_executor_binder_completion_handler_async_result(T&)
+ {
+ }
+};
+
+template <typename TargetAsyncResult, typename Executor>
+class immediate_executor_binder_completion_handler_async_result<
+ TargetAsyncResult, Executor,
+ void_t<
+ typename TargetAsyncResult::completion_handler_type
+ >>
+{
+private:
+ TargetAsyncResult target_;
+
+public:
+ typedef immediate_executor_binder<
+ typename TargetAsyncResult::completion_handler_type, Executor>
+ completion_handler_type;
+
+ explicit immediate_executor_binder_completion_handler_async_result(
+ typename TargetAsyncResult::completion_handler_type& handler)
+ : target_(handler)
+ {
+ }
+
+ auto get() -> decltype(target_.get())
+ {
+ return target_.get();
+ }
+};
+
+template <typename TargetAsyncResult, typename = void>
+struct immediate_executor_binder_async_result_return_type
+{
+};
+
+template <typename TargetAsyncResult>
+struct immediate_executor_binder_async_result_return_type<
+ TargetAsyncResult,
+ void_t<
+ typename TargetAsyncResult::return_type
+ >>
+{
+ typedef typename TargetAsyncResult::return_type return_type;
+};
+
+} // namespace detail
+
+template <typename T, typename Executor, typename Signature>
+class async_result<immediate_executor_binder<T, Executor>, Signature> :
+ public detail::immediate_executor_binder_completion_handler_async_result<
+ async_result<T, Signature>, Executor>,
+ public detail::immediate_executor_binder_async_result_return_type<
+ async_result<T, Signature>>
+{
+public:
+ explicit async_result(immediate_executor_binder<T, Executor>& b)
+ : detail::immediate_executor_binder_completion_handler_async_result<
+ async_result<T, Signature>, Executor>(b.get())
+ {
+ }
+
+ template <typename Initiation>
+ struct init_wrapper
+ {
+ template <typename Init>
+ init_wrapper(const Executor& e, Init&& init)
+ : executor_(e),
+ initiation_(static_cast<Init&&>(init))
+ {
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler, Args&&... args)
+ {
+ static_cast<Initiation&&>(initiation_)(
+ immediate_executor_binder<
+ decay_t<Handler>, Executor>(
+ executor_, static_cast<Handler&&>(handler)),
+ static_cast<Args&&>(args)...);
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler, Args&&... args) const
+ {
+ initiation_(
+ immediate_executor_binder<
+ decay_t<Handler>, Executor>(
+ executor_, static_cast<Handler&&>(handler)),
+ static_cast<Args&&>(args)...);
+ }
+
+ Executor executor_;
+ Initiation initiation_;
+ };
+
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static auto initiate(Initiation&& initiation,
+ RawCompletionToken&& token, Args&&... args)
+ -> decltype(
+ async_initiate<T, Signature>(
+ declval<init_wrapper<decay_t<Initiation>>>(),
+ token.get(), static_cast<Args&&>(args)...))
+ {
+ return async_initiate<T, Signature>(
+ init_wrapper<decay_t<Initiation>>(
+ token.get_immediate_executor(),
+ static_cast<Initiation&&>(initiation)),
+ token.get(), static_cast<Args&&>(args)...);
+ }
+
+private:
+ async_result(const async_result&) = delete;
+ async_result& operator=(const async_result&) = delete;
+
+ async_result<T, Signature> target_;
+};
+
+template <template <typename, typename> class Associator,
+ typename T, typename Executor, typename DefaultCandidate>
+struct associator<Associator,
+ immediate_executor_binder<T, Executor>,
+ DefaultCandidate>
+ : Associator<T, DefaultCandidate>
+{
+ static typename Associator<T, DefaultCandidate>::type get(
+ const immediate_executor_binder<T, Executor>& b) noexcept
+ {
+ return Associator<T, DefaultCandidate>::get(b.get());
+ }
+
+ static auto get(const immediate_executor_binder<T, Executor>& b,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<T, DefaultCandidate>::get(b.get(), c))
+ {
+ return Associator<T, DefaultCandidate>::get(b.get(), c);
+ }
+};
+
+template <typename T, typename Executor, typename Executor1>
+struct associated_immediate_executor<
+ immediate_executor_binder<T, Executor>,
+ Executor1>
+{
+ typedef Executor type;
+
+ static auto get(const immediate_executor_binder<T, Executor>& b,
+ const Executor1& = Executor1()) noexcept
+ -> decltype(b.get_immediate_executor())
+ {
+ return b.get_immediate_executor();
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BIND_IMMEDIATE_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/buffer.hpp b/3rdparty/asio/include/asio/buffer.hpp
new file mode 100644
index 00000000000..ad49f290a66
--- /dev/null
+++ b/3rdparty/asio/include/asio/buffer.hpp
@@ -0,0 +1,2751 @@
+//
+// buffer.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <cstring>
+#include <limits>
+#include <stdexcept>
+#include <string>
+#include <vector>
+#include "asio/detail/array_fwd.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/string_view.hpp"
+#include "asio/detail/throw_exception.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/is_contiguous_iterator.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
+
+#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<unsigned char*>(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() noexcept
+ : data_(0),
+ size_(0)
+ {
+ }
+
+ /// Construct a buffer to represent a given memory range.
+ mutable_buffer(void* data, std::size_t size) noexcept
+ : data_(data),
+ size_(size)
+ {
+ }
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ mutable_buffer(void* data, std::size_t size,
+ asio::detail::function<void()> debug_check)
+ : data_(data),
+ size_(size),
+ debug_check_(debug_check)
+ {
+ }
+
+ const asio::detail::function<void()>& 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 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 noexcept
+ {
+ return size_;
+ }
+
+ /// Move the start of the buffer by the specified number of bytes.
+ mutable_buffer& operator+=(std::size_t n) noexcept
+ {
+ std::size_t offset = n < size_ ? n : size_;
+ data_ = static_cast<char*>(data_) + offset;
+ size_ -= offset;
+ return *this;
+ }
+
+private:
+ void* data_;
+ std::size_t size_;
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ asio::detail::function<void()> 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) noexcept
+ : mutable_buffer(data, size)
+ {
+ }
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ mutable_buffers_1(void* data, std::size_t size,
+ asio::detail::function<void()> 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) noexcept
+ : mutable_buffer(b)
+ {
+ }
+
+ /// Get a random-access iterator to the first element.
+ const_iterator begin() const noexcept
+ {
+ return this;
+ }
+
+ /// Get a random-access iterator for one past the last element.
+ const_iterator end() const 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<const unsigned char*>(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() noexcept
+ : data_(0),
+ size_(0)
+ {
+ }
+
+ /// Construct a buffer to represent a given memory range.
+ const_buffer(const void* data, std::size_t size) noexcept
+ : data_(data),
+ size_(size)
+ {
+ }
+
+ /// Construct a non-modifiable buffer from a modifiable one.
+ const_buffer(const mutable_buffer& b) 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<void()> debug_check)
+ : data_(data),
+ size_(size),
+ debug_check_(debug_check)
+ {
+ }
+
+ const asio::detail::function<void()>& 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 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 noexcept
+ {
+ return size_;
+ }
+
+ /// Move the start of the buffer by the specified number of bytes.
+ const_buffer& operator+=(std::size_t n) noexcept
+ {
+ std::size_t offset = n < size_ ? n : size_;
+ data_ = static_cast<const char*>(data_) + offset;
+ size_ -= offset;
+ return *this;
+ }
+
+private:
+ const void* data_;
+ std::size_t size_;
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ asio::detail::function<void()> 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) noexcept
+ : const_buffer(data, size)
+ {
+ }
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ const_buffers_1(const void* data, std::size_t size,
+ asio::detail::function<void()> 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) noexcept
+ : const_buffer(b)
+ {
+ }
+
+ /// Get a random-access iterator to the first element.
+ const_iterator begin() const noexcept
+ {
+ return this;
+ }
+
+ /// Get a random-access iterator for one past the last element.
+ const_iterator end() const noexcept
+ {
+ return begin() + 1;
+ }
+};
+
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+/// (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 noexcept
+ {
+ return &buf_;
+ }
+
+ /// Get a random-access iterator for one past the last element.
+ const_iterator end() const 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.
+template <typename MutableBuffer>
+inline const mutable_buffer* buffer_sequence_begin(const MutableBuffer& b,
+ constraint_t<
+ is_convertible<const MutableBuffer*, const mutable_buffer*>::value
+ > = 0) noexcept
+{
+ return static_cast<const mutable_buffer*>(detail::addressof(b));
+}
+
+/// Get an iterator to the first element in a buffer sequence.
+template <typename ConstBuffer>
+inline const const_buffer* buffer_sequence_begin(const ConstBuffer& b,
+ constraint_t<
+ is_convertible<const ConstBuffer*, const const_buffer*>::value
+ > = 0) noexcept
+{
+ return static_cast<const const_buffer*>(detail::addressof(b));
+}
+
+/// Get an iterator to the first element in a buffer sequence.
+template <typename C>
+inline auto buffer_sequence_begin(C& c,
+ constraint_t<
+ !is_convertible<const C*, const mutable_buffer*>::value
+ && !is_convertible<const C*, const const_buffer*>::value
+ > = 0) noexcept -> decltype(c.begin())
+{
+ return c.begin();
+}
+
+/// Get an iterator to the first element in a buffer sequence.
+template <typename C>
+inline auto buffer_sequence_begin(const C& c,
+ constraint_t<
+ !is_convertible<const C*, const mutable_buffer*>::value
+ && !is_convertible<const C*, const const_buffer*>::value
+ > = 0) noexcept -> decltype(c.begin())
+{
+ return c.begin();
+}
+
+/*@}*/
+
+/** @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.
+template <typename MutableBuffer>
+inline const mutable_buffer* buffer_sequence_end(const MutableBuffer& b,
+ constraint_t<
+ is_convertible<const MutableBuffer*, const mutable_buffer*>::value
+ > = 0) noexcept
+{
+ return static_cast<const mutable_buffer*>(detail::addressof(b)) + 1;
+}
+
+/// Get an iterator to one past the end element in a buffer sequence.
+template <typename ConstBuffer>
+inline const const_buffer* buffer_sequence_end(const ConstBuffer& b,
+ constraint_t<
+ is_convertible<const ConstBuffer*, const const_buffer*>::value
+ > = 0) noexcept
+{
+ return static_cast<const const_buffer*>(detail::addressof(b)) + 1;
+}
+
+/// Get an iterator to one past the end element in a buffer sequence.
+template <typename C>
+inline auto buffer_sequence_end(C& c,
+ constraint_t<
+ !is_convertible<const C*, const mutable_buffer*>::value
+ && !is_convertible<const C*, const const_buffer*>::value
+ > = 0) noexcept -> decltype(c.end())
+{
+ return c.end();
+}
+
+/// Get an iterator to one past the end element in a buffer sequence.
+template <typename C>
+inline auto buffer_sequence_end(const C& c,
+ constraint_t<
+ !is_convertible<const C*, const mutable_buffer*>::value
+ && !is_convertible<const C*, const const_buffer*>::value
+ > = 0) noexcept -> decltype(c.end())
+{
+ return c.end();
+}
+
+/*@}*/
+
+namespace detail {
+
+// Tag types used to select appropriately optimised overloads.
+struct one_buffer {};
+struct multiple_buffers {};
+
+// Helper trait to detect single buffers.
+template <typename BufferSequence>
+struct buffer_sequence_cardinality :
+ conditional_t<
+ is_same<BufferSequence, mutable_buffer>::value
+#if !defined(ASIO_NO_DEPRECATED)
+ || is_same<BufferSequence, mutable_buffers_1>::value
+ || is_same<BufferSequence, const_buffers_1>::value
+#endif // !defined(ASIO_NO_DEPRECATED)
+ || is_same<BufferSequence, const_buffer>::value,
+ one_buffer, multiple_buffers> {};
+
+template <typename Iterator>
+inline std::size_t buffer_size(one_buffer,
+ Iterator begin, Iterator) noexcept
+{
+ return const_buffer(*begin).size();
+}
+
+template <typename Iterator>
+inline std::size_t buffer_size(multiple_buffers,
+ Iterator begin, Iterator end) 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 <typename BufferSequence>
+inline std::size_t buffer_size(const BufferSequence& b) noexcept
+{
+ return detail::buffer_size(
+ detail::buffer_sequence_cardinality<BufferSequence>(),
+ 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<const unsigned char*>(b1);
+ * @endcode
+ *
+ * To access the memory of a modifiable buffer, use:
+ * @code asio::mutable_buffer b2 = ...;
+ * unsigned char* p2 = asio::buffer_cast<unsigned char*>(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 <typename PointerToPodType>
+inline PointerToPodType buffer_cast(const mutable_buffer& b) noexcept
+{
+ return static_cast<PointerToPodType>(b.data());
+}
+
+/// Cast a non-modifiable buffer to a specified pointer to POD type.
+template <typename PointerToPodType>
+inline PointerToPodType buffer_cast(const const_buffer& b) noexcept
+{
+ return static_cast<PointerToPodType>(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) noexcept
+{
+ std::size_t offset = n < b.size() ? n : b.size();
+ char* new_data = static_cast<char*>(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) 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) noexcept
+{
+ std::size_t offset = n < b.size() ? n : b.size();
+ const char* new_data = static_cast<const char*>(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) noexcept
+{
+ return b + n;
+}
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+namespace detail {
+
+template <typename Iterator>
+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 <tt>{void*,
+ * size_t}</tt> specifies a mutable (modifiable) region of memory. Similarly, a
+ * tuple of the form <tt>{const void*, size_t}</tt> 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<char> d2(128);
+ * bytes_transferred = sock.receive(asio::buffer(d2));
+ *
+ * std::array<char, 128> d3;
+ * bytes_transferred = sock.receive(asio::buffer(d3));
+ *
+ * boost::array<char, 128> 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 <tt>size()</tt>
+ * 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<unsigned char*>(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<const_buffer> buffers = ...;
+ *
+ * vector<unsigned char> 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<char, 6> a = { 'a', 'b', 'c', 'd', 'e' }; @endcode
+ *
+ * A buffer object @c b1 created using:
+ *
+ * @code b1 = asio::buffer(a); @endcode
+ *
+ * represents the entire array, <tt>{ 'a', 'b', 'c', 'd', 'e' }</tt>. 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 <tt>{ 'a', 'b', 'c' }</tt>. 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 <tt>{ 'c', 'd', 'e' }</tt>. 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 <tt>{ 'b', 'c', 'd' }</tt>.
+ *
+ * @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<char> d2(128);
+ * boost::array<char, 128> d3;
+ *
+ * boost::array<mutable_buffer, 3> bufs1 = {
+ * asio::buffer(d1),
+ * asio::buffer(d2),
+ * asio::buffer(d3) };
+ * bytes_transferred = sock.receive(bufs1);
+ *
+ * std::vector<const_buffer> 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
+ *
+ * @par Buffer Literals
+ *
+ * The `_buf` literal suffix, defined in namespace
+ * <tt>asio::buffer_literals</tt>, may be used to create @c const_buffer
+ * objects from string, binary integer, and hexadecimal integer literals.
+ * For example:
+ *
+ * @code
+ * using namespace asio::buffer_literals;
+ *
+ * asio::const_buffer b1 = "hello"_buf;
+ * asio::const_buffer b2 = 0xdeadbeef_buf;
+ * asio::const_buffer b3 = 0x0123456789abcdef0123456789abcdef_buf;
+ * asio::const_buffer b4 = 0b1010101011001100_buf; @endcode
+ *
+ * Note that the memory associated with a buffer literal is valid for the
+ * lifetime of the program. This means that the buffer can be safely used with
+ * asynchronous operations.
+ */
+/*@{*/
+
+#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 <tt>mutable_buffer(b)</tt>.
+ */
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ const mutable_buffer& b) 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
+ */
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ const mutable_buffer& b,
+ std::size_t max_size_in_bytes) 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 <tt>const_buffer(b)</tt>.
+ */
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const const_buffer& b) 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
+ */
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const const_buffer& b,
+ std::size_t max_size_in_bytes) 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 <tt>mutable_buffer(data, size_in_bytes)</tt>.
+ */
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ void* data, std::size_t size_in_bytes) noexcept
+{
+ return ASIO_MUTABLE_BUFFER(data, size_in_bytes);
+}
+
+/// Create a new non-modifiable buffer that represents the given memory range.
+/**
+ * @returns <tt>const_buffer(data, size_in_bytes)</tt>.
+ */
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const void* data, std::size_t size_in_bytes) 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<void*>(data),
+ * N * sizeof(PodType)); @endcode
+ */
+template <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ PodType (&data)[N]) 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<void*>(data),
+ * min(N * sizeof(PodType), max_size_in_bytes)); @endcode
+ */
+template <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ PodType (&data)[N],
+ std::size_t max_size_in_bytes) 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<const void*>(data),
+ * N * sizeof(PodType)); @endcode
+ */
+template <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const PodType (&data)[N]) 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<const void*>(data),
+ * min(N * sizeof(PodType), max_size_in_bytes)); @endcode
+ */
+template <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const PodType (&data)[N],
+ std::size_t max_size_in_bytes) noexcept
+{
+ return ASIO_CONST_BUFFER(data,
+ N * sizeof(PodType) < max_size_in_bytes
+ ? N * sizeof(PodType) : max_size_in_bytes);
+}
+
+/// 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 <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ boost::array<PodType, N>& data) 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 <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ boost::array<PodType, N>& data,
+ std::size_t max_size_in_bytes) 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 <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ boost::array<const PodType, N>& data) 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 <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ boost::array<const PodType, N>& data,
+ std::size_t max_size_in_bytes) 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 <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const boost::array<PodType, N>& data) 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 <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const boost::array<PodType, N>& data,
+ std::size_t max_size_in_bytes) 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 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 <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ std::array<PodType, N>& data) 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 <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ std::array<PodType, N>& data,
+ std::size_t max_size_in_bytes) 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 <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ std::array<const PodType, N>& data) 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 <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ std::array<const PodType, N>& data,
+ std::size_t max_size_in_bytes) 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 <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const std::array<PodType, N>& data) 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 <typename PodType, std::size_t N>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const std::array<PodType, N>& data,
+ std::size_t max_size_in_bytes) 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 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 <typename PodType, typename Allocator>
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ std::vector<PodType, Allocator>& data) 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<PodType, Allocator>::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 <typename PodType, typename Allocator>
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ std::vector<PodType, Allocator>& data,
+ std::size_t max_size_in_bytes) 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<PodType, Allocator>::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 <typename PodType, typename Allocator>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const std::vector<PodType, Allocator>& data) 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<PodType, Allocator>::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 <typename PodType, typename Allocator>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const std::vector<PodType, Allocator>& data,
+ std::size_t max_size_in_bytes) 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<PodType, Allocator>::const_iterator
+ >(data.begin())
+#endif // ASIO_ENABLE_BUFFER_DEBUGGING
+ );
+}
+
+/// Create a new modifiable buffer that represents the given string.
+/**
+ * @returns <tt>mutable_buffer(data.size() ? &data[0] : 0,
+ * data.size() * sizeof(Elem))</tt>.
+ *
+ * @note The buffer is invalidated by any non-const operation called on the
+ * given string object.
+ */
+template <typename Elem, typename Traits, typename Allocator>
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ std::basic_string<Elem, Traits, Allocator>& data) 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<Elem, Traits, Allocator>::iterator
+ >(data.begin())
+#endif // ASIO_ENABLE_BUFFER_DEBUGGING
+ );
+}
+
+/// Create a new 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 <typename Elem, typename Traits, typename Allocator>
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ std::basic_string<Elem, Traits, Allocator>& data,
+ std::size_t max_size_in_bytes) 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<Elem, Traits, Allocator>::iterator
+ >(data.begin())
+#endif // ASIO_ENABLE_BUFFER_DEBUGGING
+ );
+}
+
+/// Create a new non-modifiable buffer that represents the given string.
+/**
+ * @returns <tt>const_buffer(data.data(), data.size() * sizeof(Elem))</tt>.
+ *
+ * @note The buffer is invalidated by any non-const operation called on the
+ * given string object.
+ */
+template <typename Elem, typename Traits, typename Allocator>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const std::basic_string<Elem, Traits, Allocator>& data) 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<Elem, Traits, Allocator>::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 <typename Elem, typename Traits, typename Allocator>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const std::basic_string<Elem, Traits, Allocator>& data,
+ std::size_t max_size_in_bytes) 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<Elem, Traits, Allocator>::const_iterator
+ >(data.begin())
+#endif // ASIO_ENABLE_BUFFER_DEBUGGING
+ );
+}
+
+#if defined(ASIO_HAS_STRING_VIEW) \
+ || defined(GENERATING_DOCUMENTATION)
+
+/// Create a new non-modifiable buffer that represents the given string_view.
+/**
+ * @returns <tt>mutable_buffer(data.size() ? &data[0] : 0,
+ * data.size() * sizeof(Elem))</tt>.
+ */
+template <typename Elem, typename Traits>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ basic_string_view<Elem, Traits> data) 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<Elem, Traits>::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 <typename Elem, typename Traits>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ basic_string_view<Elem, Traits> data,
+ std::size_t max_size_in_bytes) 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<Elem, Traits>::iterator
+ >(data.begin())
+#endif // ASIO_ENABLE_BUFFER_DEBUGGING
+ );
+}
+
+#endif // defined(ASIO_HAS_STRING_VIEW)
+ // || defined(GENERATING_DOCUMENTATION)
+
+/// Create a new modifiable buffer from a contiguous container.
+/**
+ * @returns A mutable_buffer value equivalent to:
+ * @code mutable_buffer(
+ * data.size() ? &data[0] : 0,
+ * data.size() * sizeof(typename T::value_type)); @endcode
+ */
+template <typename T>
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ T& data,
+ constraint_t<
+ is_contiguous_iterator<typename T::iterator>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_convertible<T, const_buffer>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_convertible<T, mutable_buffer>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_const<
+ remove_reference_t<
+ typename std::iterator_traits<typename T::iterator>::reference
+ >
+ >::value,
+ defaulted_constraint
+ > = defaulted_constraint()) noexcept
+{
+ return ASIO_MUTABLE_BUFFER(
+ data.size() ? detail::to_address(data.begin()) : 0,
+ data.size() * sizeof(typename T::value_type));
+}
+
+/// Create a new modifiable buffer from a contiguous container.
+/**
+ * @returns A mutable_buffer value equivalent to:
+ * @code mutable_buffer(
+ * data.size() ? &data[0] : 0,
+ * min(
+ * data.size() * sizeof(typename T::value_type),
+ * max_size_in_bytes)); @endcode
+ */
+template <typename T>
+ASIO_NODISCARD inline ASIO_MUTABLE_BUFFER buffer(
+ T& data, std::size_t max_size_in_bytes,
+ constraint_t<
+ is_contiguous_iterator<typename T::iterator>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_convertible<T, const_buffer>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_convertible<T, mutable_buffer>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_const<
+ remove_reference_t<
+ typename std::iterator_traits<typename T::iterator>::reference
+ >
+ >::value,
+ defaulted_constraint
+ > = defaulted_constraint()) noexcept
+{
+ return ASIO_MUTABLE_BUFFER(
+ data.size() ? detail::to_address(data.begin()) : 0,
+ data.size() * sizeof(typename T::value_type) < max_size_in_bytes
+ ? data.size() * sizeof(typename T::value_type) : max_size_in_bytes);
+}
+
+/// Create a new non-modifiable buffer from a contiguous container.
+/**
+ * @returns A const_buffer value equivalent to:
+ * @code const_buffer(
+ * data.size() ? &data[0] : 0,
+ * data.size() * sizeof(typename T::value_type)); @endcode
+ */
+template <typename T>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ T& data,
+ constraint_t<
+ is_contiguous_iterator<typename T::iterator>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_convertible<T, const_buffer>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_convertible<T, mutable_buffer>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ is_const<
+ remove_reference_t<
+ typename std::iterator_traits<typename T::iterator>::reference
+ >
+ >::value,
+ defaulted_constraint
+ > = defaulted_constraint()) noexcept
+{
+ return ASIO_CONST_BUFFER(
+ data.size() ? detail::to_address(data.begin()) : 0,
+ data.size() * sizeof(typename T::value_type));
+}
+
+/// Create a new non-modifiable buffer from a contiguous container.
+/**
+ * @returns A const_buffer value equivalent to:
+ * @code const_buffer(
+ * data.size() ? &data[0] : 0,
+ * min(
+ * data.size() * sizeof(typename T::value_type),
+ * max_size_in_bytes)); @endcode
+ */
+template <typename T>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ T& data, std::size_t max_size_in_bytes,
+ constraint_t<
+ is_contiguous_iterator<typename T::iterator>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_convertible<T, const_buffer>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_convertible<T, mutable_buffer>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ is_const<
+ remove_reference_t<
+ typename std::iterator_traits<typename T::iterator>::reference
+ >
+ >::value,
+ defaulted_constraint
+ > = defaulted_constraint()) noexcept
+{
+ return ASIO_CONST_BUFFER(
+ data.size() ? detail::to_address(data.begin()) : 0,
+ data.size() * sizeof(typename T::value_type) < max_size_in_bytes
+ ? data.size() * sizeof(typename T::value_type) : max_size_in_bytes);
+}
+
+/// Create a new non-modifiable buffer from a contiguous container.
+/**
+ * @returns A const_buffer value equivalent to:
+ * @code const_buffer(
+ * data.size() ? &data[0] : 0,
+ * data.size() * sizeof(typename T::value_type)); @endcode
+ */
+template <typename T>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const T& data,
+ constraint_t<
+ is_contiguous_iterator<typename T::const_iterator>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_convertible<T, const_buffer>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_convertible<T, mutable_buffer>::value,
+ defaulted_constraint
+ > = defaulted_constraint()) noexcept
+{
+ return ASIO_CONST_BUFFER(
+ data.size() ? detail::to_address(data.begin()) : 0,
+ data.size() * sizeof(typename T::value_type));
+}
+
+/// Create a new non-modifiable buffer from a contiguous container.
+/**
+ * @returns A const_buffer value equivalent to:
+ * @code const_buffer(
+ * data.size() ? &data[0] : 0,
+ * min(
+ * data.size() * sizeof(typename T::value_type),
+ * max_size_in_bytes)); @endcode
+ */
+template <typename T>
+ASIO_NODISCARD inline ASIO_CONST_BUFFER buffer(
+ const T& data, std::size_t max_size_in_bytes,
+ constraint_t<
+ is_contiguous_iterator<typename T::const_iterator>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_convertible<T, const_buffer>::value,
+ defaulted_constraint
+ > = defaulted_constraint(),
+ constraint_t<
+ !is_convertible<T, mutable_buffer>::value,
+ defaulted_constraint
+ > = defaulted_constraint()) noexcept
+{
+ return ASIO_CONST_BUFFER(
+ data.size() ? detail::to_address(data.begin()) : 0,
+ data.size() * sizeof(typename T::value_type) < max_size_in_bytes
+ ? data.size() * sizeof(typename T::value_type) : max_size_in_bytes);
+}
+
+/*@}*/
+
+/// Adapt a basic_string to the DynamicBuffer requirements.
+/**
+ * Requires that <tt>sizeof(Elem) == 1</tt>.
+ */
+template <typename Elem, typename Traits, typename Allocator>
+class dynamic_string_buffer
+{
+public:
+ /// The type used to represent a sequence of constant buffers that refers to
+ /// the underlying memory.
+ typedef ASIO_CONST_BUFFER const_buffers_type;
+
+ /// The type used to represent a sequence of mutable buffers that refers to
+ /// the underlying memory.
+ 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.
+ * The object stores a reference to the string and the user is responsible
+ * for ensuring that the string object remains valid while the
+ * dynamic_string_buffer object, and copies of the object, are in use.
+ *
+ * @b DynamicBuffer_v1: Any existing data in the string is treated as the
+ * dynamic buffer's input sequence.
+ *
+ * @param maximum_size Specifies a maximum size for the buffer, in bytes.
+ */
+ explicit dynamic_string_buffer(std::basic_string<Elem, Traits, Allocator>& s,
+ std::size_t maximum_size =
+ (std::numeric_limits<std::size_t>::max)()) noexcept
+ : string_(s),
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ size_((std::numeric_limits<std::size_t>::max)()),
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ max_size_(maximum_size)
+ {
+ }
+
+ /// @b DynamicBuffer_v2: Copy construct a dynamic buffer.
+ dynamic_string_buffer(const dynamic_string_buffer& other) noexcept
+ : string_(other.string_),
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ size_(other.size_),
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ max_size_(other.max_size_)
+ {
+ }
+
+ /// Move construct a dynamic buffer.
+ dynamic_string_buffer(dynamic_string_buffer&& other) noexcept
+ : string_(other.string_),
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ size_(other.size_),
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ max_size_(other.max_size_)
+ {
+ }
+
+ /// @b DynamicBuffer_v1: Get the size of the input sequence.
+ /// @b DynamicBuffer_v2: Get the current size of the underlying memory.
+ /**
+ * @returns @b DynamicBuffer_v1 The current size of the input sequence.
+ * @b DynamicBuffer_v2: The current size of the underlying string if less than
+ * max_size(). Otherwise returns max_size().
+ */
+ std::size_t size() const noexcept
+ {
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ if (size_ != (std::numeric_limits<std::size_t>::max)())
+ return size_;
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ return (std::min)(string_.size(), max_size());
+ }
+
+ /// Get the maximum size of the dynamic buffer.
+ /**
+ * @returns The allowed maximum size of the underlying memory.
+ */
+ std::size_t max_size() const noexcept
+ {
+ return max_size_;
+ }
+
+ /// Get the maximum size that the buffer may grow to without triggering
+ /// reallocation.
+ /**
+ * @returns The current capacity of the underlying string if less than
+ * max_size(). Otherwise returns max_size().
+ */
+ std::size_t capacity() const noexcept
+ {
+ return (std::min)(string_.capacity(), max_size());
+ }
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ /// @b DynamicBuffer_v1: 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
+ * the input sequence.
+ *
+ * @note The returned object is invalidated by any @c dynamic_string_buffer
+ * or @c basic_string member function that resizes or erases the string.
+ */
+ const_buffers_type data() const noexcept
+ {
+ return const_buffers_type(asio::buffer(string_, size_));
+ }
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+ /// @b DynamicBuffer_v2: Get a sequence of buffers that represents the
+ /// underlying memory.
+ /**
+ * @param pos Position of the first byte to represent in the buffer sequence
+ *
+ * @param n The number of bytes to return in the buffer sequence. If the
+ * underlying memory is shorter, the buffer sequence represents as many bytes
+ * as are available.
+ *
+ * @returns An object of type @c mutable_buffers_type that satisfies
+ * MutableBufferSequence requirements, representing the basic_string memory.
+ *
+ * @note The returned object is invalidated by any @c dynamic_string_buffer
+ * or @c basic_string member function that resizes or erases the string.
+ */
+ mutable_buffers_type data(std::size_t pos, std::size_t n) noexcept
+ {
+ return mutable_buffers_type(asio::buffer(
+ asio::buffer(string_, max_size_) + pos, n));
+ }
+
+ /// @b DynamicBuffer_v2: Get a sequence of buffers that represents the
+ /// underlying memory.
+ /**
+ * @param pos Position of the first byte to represent in the buffer sequence
+ *
+ * @param n The number of bytes to return in the buffer sequence. If the
+ * underlying memory is shorter, the buffer sequence represents as many bytes
+ * as are available.
+ *
+ * @note The returned object is invalidated by any @c dynamic_string_buffer
+ * or @c basic_string member function that resizes or erases the string.
+ */
+ const_buffers_type data(std::size_t pos,
+ std::size_t n) const noexcept
+ {
+ return const_buffers_type(asio::buffer(
+ asio::buffer(string_, max_size_) + pos, n));
+ }
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ /// @b DynamicBuffer_v1: 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 <tt>size() + n > max_size()</tt>.
+ *
+ * @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);
+ }
+
+ if (size_ == (std::numeric_limits<std::size_t>::max)())
+ size_ = string_.size(); // Enable v1 behaviour.
+
+ string_.resize(size_ + n);
+
+ return asio::buffer(asio::buffer(string_) + size_, n);
+ }
+
+ /// @b DynamicBuffer_v1: 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 <tt>prepare(x)</tt> where <tt>x >= n</tt>, 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_);
+ }
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+ /// @b DynamicBuffer_v2: Grow the underlying memory by the specified number of
+ /// bytes.
+ /**
+ * Resizes the string to accommodate an additional @c n bytes at the end.
+ *
+ * @throws std::length_error If <tt>size() + n > max_size()</tt>.
+ */
+ void grow(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);
+ }
+
+ /// @b DynamicBuffer_v2: Shrink the underlying memory by the specified number
+ /// of bytes.
+ /**
+ * Erases @c n bytes from the end of the string by resizing the basic_string
+ * object. If @c n is greater than the current size of the string, the string
+ * is emptied.
+ */
+ void shrink(std::size_t n)
+ {
+ string_.resize(n > size() ? 0 : size() - n);
+ }
+
+ /// @b DynamicBuffer_v1: Remove characters from the input sequence.
+ /// @b DynamicBuffer_v2: Consume the specified number of bytes from the
+ /// beginning of the underlying memory.
+ /**
+ * @b DynamicBuffer_v1: 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.
+ *
+ * @b DynamicBuffer_v2: Erases @c n bytes from the beginning of the string.
+ * If @c n is greater than the current size of the string, the string is
+ * emptied.
+ */
+ void consume(std::size_t n)
+ {
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ if (size_ != (std::numeric_limits<std::size_t>::max)())
+ {
+ std::size_t consume_length = (std::min)(n, size_);
+ string_.erase(0, consume_length);
+ size_ -= consume_length;
+ return;
+ }
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ string_.erase(0, n);
+ }
+
+private:
+ std::basic_string<Elem, Traits, Allocator>& string_;
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ std::size_t size_;
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ const std::size_t max_size_;
+};
+
+/// Adapt a vector to the DynamicBuffer requirements.
+/**
+ * Requires that <tt>sizeof(Elem) == 1</tt>.
+ */
+template <typename Elem, typename Allocator>
+class dynamic_vector_buffer
+{
+public:
+ /// The type used to represent a sequence of constant buffers that refers to
+ /// the underlying memory.
+ typedef ASIO_CONST_BUFFER const_buffers_type;
+
+ /// The type used to represent a sequence of mutable buffers that refers to
+ /// the underlying memory.
+ typedef ASIO_MUTABLE_BUFFER mutable_buffers_type;
+
+ /// Construct a dynamic buffer from a vector.
+ /**
+ * @param v The vector to be used as backing storage for the dynamic buffer.
+ * The object stores a reference to the vector and the user is responsible
+ * for ensuring that the vector object remains valid while the
+ * dynamic_vector_buffer object, and copies of the object, are in use.
+ *
+ * @param maximum_size Specifies a maximum size for the buffer, in bytes.
+ */
+ explicit dynamic_vector_buffer(std::vector<Elem, Allocator>& v,
+ std::size_t maximum_size =
+ (std::numeric_limits<std::size_t>::max)()) noexcept
+ : vector_(v),
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ size_((std::numeric_limits<std::size_t>::max)()),
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ max_size_(maximum_size)
+ {
+ }
+
+ /// @b DynamicBuffer_v2: Copy construct a dynamic buffer.
+ dynamic_vector_buffer(const dynamic_vector_buffer& other) noexcept
+ : vector_(other.vector_),
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ size_(other.size_),
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ max_size_(other.max_size_)
+ {
+ }
+
+ /// Move construct a dynamic buffer.
+ dynamic_vector_buffer(dynamic_vector_buffer&& other) noexcept
+ : vector_(other.vector_),
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ size_(other.size_),
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ max_size_(other.max_size_)
+ {
+ }
+
+ /// @b DynamicBuffer_v1: Get the size of the input sequence.
+ /// @b DynamicBuffer_v2: Get the current size of the underlying memory.
+ /**
+ * @returns @b DynamicBuffer_v1 The current size of the input sequence.
+ * @b DynamicBuffer_v2: The current size of the underlying vector if less than
+ * max_size(). Otherwise returns max_size().
+ */
+ std::size_t size() const noexcept
+ {
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ if (size_ != (std::numeric_limits<std::size_t>::max)())
+ return size_;
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ return (std::min)(vector_.size(), max_size());
+ }
+
+ /// Get the maximum size of the dynamic buffer.
+ /**
+ * @returns @b DynamicBuffer_v1: The allowed maximum of the sum of the sizes
+ * of the input sequence and output sequence. @b DynamicBuffer_v2: The allowed
+ * maximum size of the underlying memory.
+ */
+ std::size_t max_size() const noexcept
+ {
+ return max_size_;
+ }
+
+ /// Get the maximum size that the buffer may grow to without triggering
+ /// reallocation.
+ /**
+ * @returns @b DynamicBuffer_v1: The current total capacity of the buffer,
+ * i.e. for both the input sequence and output sequence. @b DynamicBuffer_v2:
+ * The current capacity of the underlying vector if less than max_size().
+ * Otherwise returns max_size().
+ */
+ std::size_t capacity() const noexcept
+ {
+ return (std::min)(vector_.capacity(), max_size());
+ }
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ /// @b DynamicBuffer_v1: 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 vector memory in the
+ * input sequence.
+ *
+ * @note The returned object is invalidated by any @c dynamic_vector_buffer
+ * or @c vector member function that modifies the input sequence or output
+ * sequence.
+ */
+ const_buffers_type data() const noexcept
+ {
+ return const_buffers_type(asio::buffer(vector_, size_));
+ }
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+ /// @b DynamicBuffer_v2: Get a sequence of buffers that represents the
+ /// underlying memory.
+ /**
+ * @param pos Position of the first byte to represent in the buffer sequence
+ *
+ * @param n The number of bytes to return in the buffer sequence. If the
+ * underlying memory is shorter, the buffer sequence represents as many bytes
+ * as are available.
+ *
+ * @returns An object of type @c mutable_buffers_type that satisfies
+ * MutableBufferSequence requirements, representing the vector memory.
+ *
+ * @note The returned object is invalidated by any @c dynamic_vector_buffer
+ * or @c vector member function that resizes or erases the vector.
+ */
+ mutable_buffers_type data(std::size_t pos, std::size_t n) noexcept
+ {
+ return mutable_buffers_type(asio::buffer(
+ asio::buffer(vector_, max_size_) + pos, n));
+ }
+
+ /// @b DynamicBuffer_v2: Get a sequence of buffers that represents the
+ /// underlying memory.
+ /**
+ * @param pos Position of the first byte to represent in the buffer sequence
+ *
+ * @param n The number of bytes to return in the buffer sequence. If the
+ * underlying memory is shorter, the buffer sequence represents as many bytes
+ * as are available.
+ *
+ * @note The returned object is invalidated by any @c dynamic_vector_buffer
+ * or @c vector member function that resizes or erases the vector.
+ */
+ const_buffers_type data(std::size_t pos,
+ std::size_t n) const noexcept
+ {
+ return const_buffers_type(asio::buffer(
+ asio::buffer(vector_, max_size_) + pos, n));
+ }
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ /// @b DynamicBuffer_v1: 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
+ * vector object as necessary.
+ *
+ * @returns An object of type @c mutable_buffers_type that satisfies
+ * MutableBufferSequence requirements, representing vector memory at the
+ * start of the output sequence of size @c n.
+ *
+ * @throws std::length_error If <tt>size() + n > max_size()</tt>.
+ *
+ * @note The returned object is invalidated by any @c dynamic_vector_buffer
+ * or @c vector 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);
+ }
+
+ if (size_ == (std::numeric_limits<std::size_t>::max)())
+ size_ = vector_.size(); // Enable v1 behaviour.
+
+ vector_.resize(size_ + n);
+
+ return asio::buffer(asio::buffer(vector_) + size_, n);
+ }
+
+ /// @b DynamicBuffer_v1: 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 <tt>prepare(x)</tt> where <tt>x >= n</tt>, 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_);
+ }
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+ /// @b DynamicBuffer_v2: Grow the underlying memory by the specified number of
+ /// bytes.
+ /**
+ * Resizes the vector to accommodate an additional @c n bytes at the end.
+ *
+ * @throws std::length_error If <tt>size() + n > max_size()</tt>.
+ */
+ void grow(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);
+ }
+
+ /// @b DynamicBuffer_v2: Shrink the underlying memory by the specified number
+ /// of bytes.
+ /**
+ * Erases @c n bytes from the end of the vector by resizing the vector
+ * object. If @c n is greater than the current size of the vector, the vector
+ * is emptied.
+ */
+ void shrink(std::size_t n)
+ {
+ vector_.resize(n > size() ? 0 : size() - n);
+ }
+
+ /// @b DynamicBuffer_v1: Remove characters from the input sequence.
+ /// @b DynamicBuffer_v2: Consume the specified number of bytes from the
+ /// beginning of the underlying memory.
+ /**
+ * @b DynamicBuffer_v1: 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.
+ *
+ * @b DynamicBuffer_v2: Erases @c n bytes from the beginning of the vector.
+ * If @c n is greater than the current size of the vector, the vector is
+ * emptied.
+ */
+ void consume(std::size_t n)
+ {
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ if (size_ != (std::numeric_limits<std::size_t>::max)())
+ {
+ std::size_t consume_length = (std::min)(n, size_);
+ vector_.erase(vector_.begin(), vector_.begin() + consume_length);
+ size_ -= consume_length;
+ return;
+ }
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ vector_.erase(vector_.begin(), vector_.begin() + (std::min)(size(), n));
+ }
+
+private:
+ std::vector<Elem, Allocator>& vector_;
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ std::size_t size_;
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ 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 <tt>dynamic_string_buffer<Elem, Traits, Allocator>(data)</tt>.
+ */
+template <typename Elem, typename Traits, typename Allocator>
+ASIO_NODISCARD inline
+dynamic_string_buffer<Elem, Traits, Allocator> dynamic_buffer(
+ std::basic_string<Elem, Traits, Allocator>& data) noexcept
+{
+ return dynamic_string_buffer<Elem, Traits, Allocator>(data);
+}
+
+/// Create a new dynamic buffer that represents the given string.
+/**
+ * @returns <tt>dynamic_string_buffer<Elem, Traits, Allocator>(data,
+ * max_size)</tt>.
+ */
+template <typename Elem, typename Traits, typename Allocator>
+ASIO_NODISCARD inline
+dynamic_string_buffer<Elem, Traits, Allocator> dynamic_buffer(
+ std::basic_string<Elem, Traits, Allocator>& data,
+ std::size_t max_size) noexcept
+{
+ return dynamic_string_buffer<Elem, Traits, Allocator>(data, max_size);
+}
+
+/// Create a new dynamic buffer that represents the given vector.
+/**
+ * @returns <tt>dynamic_vector_buffer<Elem, Allocator>(data)</tt>.
+ */
+template <typename Elem, typename Allocator>
+ASIO_NODISCARD inline
+dynamic_vector_buffer<Elem, Allocator> dynamic_buffer(
+ std::vector<Elem, Allocator>& data) noexcept
+{
+ return dynamic_vector_buffer<Elem, Allocator>(data);
+}
+
+/// Create a new dynamic buffer that represents the given vector.
+/**
+ * @returns <tt>dynamic_vector_buffer<Elem, Allocator>(data, max_size)</tt>.
+ */
+template <typename Elem, typename Allocator>
+ASIO_NODISCARD inline
+dynamic_vector_buffer<Elem, Allocator> dynamic_buffer(
+ std::vector<Elem, Allocator>& data,
+ std::size_t max_size) noexcept
+{
+ return dynamic_vector_buffer<Elem, Allocator>(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 <typename TargetIterator, typename SourceIterator>
+inline std::size_t buffer_copy(one_buffer, one_buffer,
+ TargetIterator target_begin, TargetIterator,
+ SourceIterator source_begin, SourceIterator) noexcept
+{
+ return (buffer_copy_1)(*target_begin, *source_begin);
+}
+
+template <typename TargetIterator, typename SourceIterator>
+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) noexcept
+{
+ return (buffer_copy_1)(*target_begin,
+ asio::buffer(*source_begin, max_bytes_to_copy));
+}
+
+template <typename TargetIterator, typename SourceIterator>
+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<std::size_t>::max)()) 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 <typename TargetIterator, typename SourceIterator>
+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<std::size_t>::max)()) 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 <typename TargetIterator, typename SourceIterator>
+std::size_t buffer_copy(multiple_buffers, multiple_buffers,
+ TargetIterator target_begin, TargetIterator target_end,
+ SourceIterator source_begin, SourceIterator source_end) 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 <typename TargetIterator, typename SourceIterator>
+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) 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 <typename MutableBufferSequence, typename ConstBufferSequence>
+inline std::size_t buffer_copy(const MutableBufferSequence& target,
+ const ConstBufferSequence& source) noexcept
+{
+ return detail::buffer_copy(
+ detail::buffer_sequence_cardinality<MutableBufferSequence>(),
+ detail::buffer_sequence_cardinality<ConstBufferSequence>(),
+ 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 <typename MutableBufferSequence, typename ConstBufferSequence>
+inline std::size_t buffer_copy(const MutableBufferSequence& target,
+ const ConstBufferSequence& source,
+ std::size_t max_bytes_to_copy) noexcept
+{
+ return detail::buffer_copy(
+ detail::buffer_sequence_cardinality<MutableBufferSequence>(),
+ detail::buffer_sequence_cardinality<ConstBufferSequence>(),
+ 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"
+#include "asio/detail/is_buffer_sequence.hpp"
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Trait to determine whether a type satisfies the MutableBufferSequence
+/// requirements.
+template <typename T>
+struct is_mutable_buffer_sequence
+#if defined(GENERATING_DOCUMENTATION)
+ : integral_constant<bool, automatically_determined>
+#else // defined(GENERATING_DOCUMENTATION)
+ : asio::detail::is_buffer_sequence<T, mutable_buffer>
+#endif // defined(GENERATING_DOCUMENTATION)
+{
+};
+
+/// Trait to determine whether a type satisfies the ConstBufferSequence
+/// requirements.
+template <typename T>
+struct is_const_buffer_sequence
+#if defined(GENERATING_DOCUMENTATION)
+ : integral_constant<bool, automatically_determined>
+#else // defined(GENERATING_DOCUMENTATION)
+ : asio::detail::is_buffer_sequence<T, const_buffer>
+#endif // defined(GENERATING_DOCUMENTATION)
+{
+};
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+/// Trait to determine whether a type satisfies the DynamicBuffer_v1
+/// requirements.
+template <typename T>
+struct is_dynamic_buffer_v1
+#if defined(GENERATING_DOCUMENTATION)
+ : integral_constant<bool, automatically_determined>
+#else // defined(GENERATING_DOCUMENTATION)
+ : asio::detail::is_dynamic_buffer_v1<T>
+#endif // defined(GENERATING_DOCUMENTATION)
+{
+};
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// Trait to determine whether a type satisfies the DynamicBuffer_v2
+/// requirements.
+template <typename T>
+struct is_dynamic_buffer_v2
+#if defined(GENERATING_DOCUMENTATION)
+ : integral_constant<bool, automatically_determined>
+#else // defined(GENERATING_DOCUMENTATION)
+ : asio::detail::is_dynamic_buffer_v2<T>
+#endif // defined(GENERATING_DOCUMENTATION)
+{
+};
+
+/// Trait to determine whether a type satisfies the DynamicBuffer requirements.
+/**
+ * If @c ASIO_NO_DYNAMIC_BUFFER_V1 is not defined, determines whether the
+ * type satisfies the DynamicBuffer_v1 requirements. Otherwise, if @c
+ * ASIO_NO_DYNAMIC_BUFFER_V1 is defined, determines whether the type
+ * satisfies the DynamicBuffer_v2 requirements.
+ */
+template <typename T>
+struct is_dynamic_buffer
+#if defined(GENERATING_DOCUMENTATION)
+ : integral_constant<bool, automatically_determined>
+#elif defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ : asio::is_dynamic_buffer_v2<T>
+#else // defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ : asio::is_dynamic_buffer_v1<T>
+#endif // defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+{
+};
+
+namespace buffer_literals {
+namespace detail {
+
+template <char... Chars>
+struct chars {};
+
+template <unsigned char... Bytes>
+struct bytes {};
+
+// Literal processor that converts binary literals to an array of bytes.
+
+template <typename Bytes, char... Chars>
+struct bin_literal;
+
+template <unsigned char... Bytes>
+struct bin_literal<bytes<Bytes...>>
+{
+ static const std::size_t size = sizeof...(Bytes);
+ static const unsigned char data[sizeof...(Bytes)];
+};
+
+template <unsigned char... Bytes>
+const unsigned char bin_literal<bytes<Bytes...>>::data[sizeof...(Bytes)]
+ = { Bytes... };
+
+template <unsigned char... Bytes, char Bit7, char Bit6, char Bit5,
+ char Bit4, char Bit3, char Bit2, char Bit1, char Bit0, char... Chars>
+struct bin_literal<bytes<Bytes...>, Bit7, Bit6,
+ Bit5, Bit4, Bit3, Bit2, Bit1, Bit0, Chars...> :
+ bin_literal<
+ bytes<Bytes...,
+ static_cast<unsigned char>(
+ (Bit7 == '1' ? 0x80 : 0) |
+ (Bit6 == '1' ? 0x40 : 0) |
+ (Bit5 == '1' ? 0x20 : 0) |
+ (Bit4 == '1' ? 0x10 : 0) |
+ (Bit3 == '1' ? 0x08 : 0) |
+ (Bit2 == '1' ? 0x04 : 0) |
+ (Bit1 == '1' ? 0x02 : 0) |
+ (Bit0 == '1' ? 0x01 : 0))
+ >, Chars...> {};
+
+template <unsigned char... Bytes, char... Chars>
+struct bin_literal<bytes<Bytes...>, Chars...>
+{
+ static_assert(sizeof...(Chars) == 0,
+ "number of digits in a binary buffer literal must be a multiple of 8");
+
+ static const std::size_t size = 0;
+ static const unsigned char data[1];
+};
+
+template <unsigned char... Bytes, char... Chars>
+const unsigned char bin_literal<bytes<Bytes...>, Chars...>::data[1] = {};
+
+// Literal processor that converts hexadecimal literals to an array of bytes.
+
+template <typename Bytes, char... Chars>
+struct hex_literal;
+
+template <unsigned char... Bytes>
+struct hex_literal<bytes<Bytes...>>
+{
+ static const std::size_t size = sizeof...(Bytes);
+ static const unsigned char data[sizeof...(Bytes)];
+};
+
+template <unsigned char... Bytes>
+const unsigned char hex_literal<bytes<Bytes...>>::data[sizeof...(Bytes)]
+ = { Bytes... };
+
+template <unsigned char... Bytes, char Hi, char Lo, char... Chars>
+struct hex_literal<bytes<Bytes...>, Hi, Lo, Chars...> :
+ hex_literal<
+ bytes<Bytes...,
+ static_cast<unsigned char>(
+ Lo >= 'A' && Lo <= 'F' ? Lo - 'A' + 10 :
+ (Lo >= 'a' && Lo <= 'f' ? Lo - 'a' + 10 : Lo - '0')) |
+ ((static_cast<unsigned char>(
+ Hi >= 'A' && Hi <= 'F' ? Hi - 'A' + 10 :
+ (Hi >= 'a' && Hi <= 'f' ? Hi - 'a' + 10 : Hi - '0'))) << 4)
+ >, Chars...> {};
+
+template <unsigned char... Bytes, char Char>
+struct hex_literal<bytes<Bytes...>, Char>
+{
+ static_assert(!Char,
+ "a hexadecimal buffer literal must have an even number of digits");
+
+ static const std::size_t size = 0;
+ static const unsigned char data[1];
+};
+
+template <unsigned char... Bytes, char Char>
+const unsigned char hex_literal<bytes<Bytes...>, Char>::data[1] = {};
+
+// Helper template that removes digit separators and then passes the cleaned
+// variadic pack of characters to the literal processor.
+
+template <template <typename, char...> class Literal,
+ typename Clean, char... Raw>
+struct remove_separators;
+
+template <template <typename, char...> class Literal,
+ char... Clean, char... Raw>
+struct remove_separators<Literal, chars<Clean...>, '\'', Raw...> :
+ remove_separators<Literal, chars<Clean...>, Raw...> {};
+
+template <template <typename, char...> class Literal,
+ char... Clean, char C, char... Raw>
+struct remove_separators<Literal, chars<Clean...>, C, Raw...> :
+ remove_separators<Literal, chars<Clean..., C>, Raw...> {};
+
+template <template <typename, char...> class Literal, char... Clean>
+struct remove_separators<Literal, chars<Clean...>> :
+ Literal<bytes<>, Clean...> {};
+
+// Helper template to determine the literal type based on the prefix.
+
+template <char... Chars>
+struct literal;
+
+template <char... Chars>
+struct literal<'0', 'b', Chars...> :
+ remove_separators<bin_literal, chars<>, Chars...>{};
+
+template <char... Chars>
+struct literal<'0', 'B', Chars...> :
+ remove_separators<bin_literal, chars<>, Chars...>{};
+
+template <char... Chars>
+struct literal<'0', 'x', Chars...> :
+ remove_separators<hex_literal, chars<>, Chars...>{};
+
+template <char... Chars>
+struct literal<'0', 'X', Chars...> :
+ remove_separators<hex_literal, chars<>, Chars...>{};
+
+} // namespace detail
+
+/// Literal operator for creating const_buffer objects from string literals.
+inline ASIO_CONST_BUFFER operator ""_buf(const char* data, std::size_t n)
+{
+ return ASIO_CONST_BUFFER(data, n);
+}
+
+/// Literal operator for creating const_buffer objects from unbounded binary or
+/// hexadecimal integer literals.
+template <char... Chars>
+inline ASIO_CONST_BUFFER operator ""_buf()
+{
+ return ASIO_CONST_BUFFER(
+ +detail::literal<Chars...>::data,
+ detail::literal<Chars...>::size);
+}
+
+} // namespace buffer_literals
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BUFFER_HPP
diff --git a/3rdparty/asio/include/asio/buffer_registration.hpp b/3rdparty/asio/include/asio/buffer_registration.hpp
new file mode 100644
index 00000000000..39897ba2450
--- /dev/null
+++ b/3rdparty/asio/include/asio/buffer_registration.hpp
@@ -0,0 +1,318 @@
+//
+// buffer_registration.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_REGISTRATION_HPP
+#define ASIO_BUFFER_REGISTRATION_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <iterator>
+#include <utility>
+#include <vector>
+#include "asio/detail/memory.hpp"
+#include "asio/execution/context.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/is_executor.hpp"
+#include "asio/query.hpp"
+#include "asio/registered_buffer.hpp"
+
+#if defined(ASIO_HAS_IO_URING)
+# include "asio/detail/scheduler.hpp"
+# include "asio/detail/io_uring_service.hpp"
+#endif // defined(ASIO_HAS_IO_URING)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class buffer_registration_base
+{
+protected:
+ static mutable_registered_buffer make_buffer(const mutable_buffer& b,
+ const void* scope, int index) noexcept
+ {
+ return mutable_registered_buffer(b, registered_buffer_id(scope, index));
+ }
+};
+
+} // namespace detail
+
+/// Automatically registers and unregistered buffers with an execution context.
+/**
+ * For portability, applications should assume that only one registration is
+ * permitted per execution context.
+ */
+template <typename MutableBufferSequence,
+ typename Allocator = std::allocator<void>>
+class buffer_registration
+ : detail::buffer_registration_base
+{
+public:
+ /// The allocator type used for allocating storage for the buffers container.
+ typedef Allocator allocator_type;
+
+#if defined(GENERATING_DOCUMENTATION)
+ /// The type of an iterator over the registered buffers.
+ typedef unspecified iterator;
+
+ /// The type of a const iterator over the registered buffers.
+ typedef unspecified const_iterator;
+#else // defined(GENERATING_DOCUMENTATION)
+ typedef std::vector<mutable_registered_buffer>::const_iterator iterator;
+ typedef std::vector<mutable_registered_buffer>::const_iterator const_iterator;
+#endif // defined(GENERATING_DOCUMENTATION)
+
+ /// Register buffers with an executor's execution context.
+ template <typename Executor>
+ buffer_registration(const Executor& ex,
+ const MutableBufferSequence& buffer_sequence,
+ const allocator_type& alloc = allocator_type(),
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0)
+ : buffer_sequence_(buffer_sequence),
+ buffers_(
+ ASIO_REBIND_ALLOC(allocator_type,
+ mutable_registered_buffer)(alloc))
+ {
+ init_buffers(buffer_registration::get_context(ex),
+ asio::buffer_sequence_begin(buffer_sequence_),
+ asio::buffer_sequence_end(buffer_sequence_));
+ }
+
+ /// Register buffers with an execution context.
+ template <typename ExecutionContext>
+ buffer_registration(ExecutionContext& ctx,
+ const MutableBufferSequence& buffer_sequence,
+ const allocator_type& alloc = allocator_type(),
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : buffer_sequence_(buffer_sequence),
+ buffers_(
+ ASIO_REBIND_ALLOC(allocator_type,
+ mutable_registered_buffer)(alloc))
+ {
+ init_buffers(ctx,
+ asio::buffer_sequence_begin(buffer_sequence_),
+ asio::buffer_sequence_end(buffer_sequence_));
+ }
+
+ /// Move constructor.
+ buffer_registration(buffer_registration&& other) noexcept
+ : buffer_sequence_(std::move(other.buffer_sequence_)),
+ buffers_(std::move(other.buffers_))
+ {
+#if defined(ASIO_HAS_IO_URING)
+ service_ = other.service_;
+ other.service_ = 0;
+#endif // defined(ASIO_HAS_IO_URING)
+ }
+
+ /// Unregisters the buffers.
+ ~buffer_registration()
+ {
+#if defined(ASIO_HAS_IO_URING)
+ if (service_)
+ service_->unregister_buffers();
+#endif // defined(ASIO_HAS_IO_URING)
+ }
+
+ /// Move assignment.
+ buffer_registration& operator=(buffer_registration&& other) noexcept
+ {
+ if (this != &other)
+ {
+ buffer_sequence_ = std::move(other.buffer_sequence_);
+ buffers_ = std::move(other.buffers_);
+#if defined(ASIO_HAS_IO_URING)
+ if (service_)
+ service_->unregister_buffers();
+ service_ = other.service_;
+ other.service_ = 0;
+#endif // defined(ASIO_HAS_IO_URING)
+ }
+ return *this;
+ }
+
+ /// Get the number of registered buffers.
+ std::size_t size() const noexcept
+ {
+ return buffers_.size();
+ }
+
+ /// Get the begin iterator for the sequence of registered buffers.
+ const_iterator begin() const noexcept
+ {
+ return buffers_.begin();
+ }
+
+ /// Get the begin iterator for the sequence of registered buffers.
+ const_iterator cbegin() const noexcept
+ {
+ return buffers_.cbegin();
+ }
+
+ /// Get the end iterator for the sequence of registered buffers.
+ const_iterator end() const noexcept
+ {
+ return buffers_.end();
+ }
+
+ /// Get the end iterator for the sequence of registered buffers.
+ const_iterator cend() const noexcept
+ {
+ return buffers_.cend();
+ }
+
+ /// Get the buffer at the specified index.
+ const mutable_registered_buffer& operator[](std::size_t i) noexcept
+ {
+ return buffers_[i];
+ }
+
+ /// Get the buffer at the specified index.
+ const mutable_registered_buffer& at(std::size_t i) noexcept
+ {
+ return buffers_.at(i);
+ }
+
+private:
+ // Disallow copying and assignment.
+ buffer_registration(const buffer_registration&) = delete;
+ buffer_registration& operator=(const buffer_registration&) = delete;
+
+ // Helper function to get an executor's context.
+ template <typename T>
+ static execution_context& get_context(const T& t,
+ enable_if_t<execution::is_executor<T>::value>* = 0)
+ {
+ return asio::query(t, execution::context);
+ }
+
+ // Helper function to get an executor's context.
+ template <typename T>
+ static execution_context& get_context(const T& t,
+ enable_if_t<!execution::is_executor<T>::value>* = 0)
+ {
+ return t.context();
+ }
+
+ // Helper function to initialise the container of buffers.
+ template <typename Iterator>
+ void init_buffers(execution_context& ctx, Iterator begin, Iterator end)
+ {
+ std::size_t n = std::distance(begin, end);
+ buffers_.resize(n);
+
+#if defined(ASIO_HAS_IO_URING)
+ service_ = &use_service<detail::io_uring_service>(ctx);
+ std::vector<iovec,
+ ASIO_REBIND_ALLOC(allocator_type, iovec)> iovecs(n,
+ ASIO_REBIND_ALLOC(allocator_type, iovec)(
+ buffers_.get_allocator()));
+#endif // defined(ASIO_HAS_IO_URING)
+
+ Iterator iter = begin;
+ for (int index = 0; iter != end; ++index, ++iter)
+ {
+ mutable_buffer b(*iter);
+ std::size_t i = static_cast<std::size_t>(index);
+ buffers_[i] = this->make_buffer(b, &ctx, index);
+
+#if defined(ASIO_HAS_IO_URING)
+ iovecs[i].iov_base = buffers_[i].data();
+ iovecs[i].iov_len = buffers_[i].size();
+#endif // defined(ASIO_HAS_IO_URING)
+ }
+
+#if defined(ASIO_HAS_IO_URING)
+ if (n > 0)
+ {
+ service_->register_buffers(&iovecs[0],
+ static_cast<unsigned>(iovecs.size()));
+ }
+#endif // defined(ASIO_HAS_IO_URING)
+ }
+
+ MutableBufferSequence buffer_sequence_;
+ std::vector<mutable_registered_buffer,
+ ASIO_REBIND_ALLOC(allocator_type,
+ mutable_registered_buffer)> buffers_;
+#if defined(ASIO_HAS_IO_URING)
+ detail::io_uring_service* service_;
+#endif // defined(ASIO_HAS_IO_URING)
+};
+
+/// Register buffers with an execution context.
+template <typename Executor, typename MutableBufferSequence>
+ASIO_NODISCARD inline
+buffer_registration<MutableBufferSequence>
+register_buffers(const Executor& ex,
+ const MutableBufferSequence& buffer_sequence,
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0)
+{
+ return buffer_registration<MutableBufferSequence>(ex, buffer_sequence);
+}
+
+/// Register buffers with an execution context.
+template <typename Executor, typename MutableBufferSequence, typename Allocator>
+ASIO_NODISCARD inline
+buffer_registration<MutableBufferSequence, Allocator>
+register_buffers(const Executor& ex,
+ const MutableBufferSequence& buffer_sequence, const Allocator& alloc,
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0)
+{
+ return buffer_registration<MutableBufferSequence, Allocator>(
+ ex, buffer_sequence, alloc);
+}
+
+/// Register buffers with an execution context.
+template <typename ExecutionContext, typename MutableBufferSequence>
+ASIO_NODISCARD inline
+buffer_registration<MutableBufferSequence>
+register_buffers(ExecutionContext& ctx,
+ const MutableBufferSequence& buffer_sequence,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+{
+ return buffer_registration<MutableBufferSequence>(ctx, buffer_sequence);
+}
+
+/// Register buffers with an execution context.
+template <typename ExecutionContext,
+ typename MutableBufferSequence, typename Allocator>
+ASIO_NODISCARD inline
+buffer_registration<MutableBufferSequence, Allocator>
+register_buffers(ExecutionContext& ctx,
+ const MutableBufferSequence& buffer_sequence, const Allocator& alloc,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+{
+ return buffer_registration<MutableBufferSequence, Allocator>(
+ ctx, buffer_sequence, alloc);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BUFFER_REGISTRATION_HPP
diff --git a/3rdparty/asio/include/asio/buffered_read_stream.hpp b/3rdparty/asio/include/asio/buffered_read_stream.hpp
new file mode 100644
index 00000000000..264f66c55d8
--- /dev/null
+++ b/3rdparty/asio/include/asio/buffered_read_stream.hpp
@@ -0,0 +1,273 @@
+//
+// buffered_read_stream.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#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/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename> class initiate_async_buffered_fill;
+template <typename> class initiate_async_buffered_read_some;
+
+} // namespace detail
+
+/// 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 <typename Stream>
+class buffered_read_stream
+ : private noncopyable
+{
+public:
+ /// The type of the next layer.
+ typedef remove_reference_t<Stream> 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 <typename Arg>
+ explicit buffered_read_stream(Arg&& a)
+ : next_layer_(static_cast<Arg&&>(a)),
+ storage_(default_buffer_size)
+ {
+ }
+
+ /// Construct, passing the specified argument to initialise the next layer.
+ template <typename Arg>
+ buffered_read_stream(Arg&& a,
+ std::size_t buffer_size)
+ : next_layer_(static_cast<Arg&&>(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() noexcept
+ {
+ return next_layer_.lowest_layer().get_executor();
+ }
+
+ /// 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 <typename ConstBufferSequence>
+ 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 <typename ConstBufferSequence>
+ 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.
+ /**
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteHandler = default_completion_token_t<executor_type>>
+ auto async_write_some(const ConstBufferSequence& buffers,
+ WriteHandler&& handler = default_completion_token_t<executor_type>())
+ -> decltype(
+ declval<conditional_t<true, Stream&, WriteHandler>>().async_write_some(
+ buffers, static_cast<WriteHandler&&>(handler)))
+ {
+ return next_layer_.async_write_some(buffers,
+ static_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.
+ /**
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadHandler = default_completion_token_t<executor_type>>
+ auto async_fill(
+ ReadHandler&& handler = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadHandler,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_buffered_fill<Stream>>(),
+ handler, declval<detail::buffered_stream_storage*>()));
+
+ /// Read some data from the stream. Returns the number of bytes read. Throws
+ /// an exception on failure.
+ template <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence>
+ 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.
+ /**
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadHandler = default_completion_token_t<executor_type>>
+ auto async_read_some(const MutableBufferSequence& buffers,
+ ReadHandler&& handler = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadHandler,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_buffered_read_some<Stream>>(),
+ handler, declval<detail::buffered_stream_storage*>(), buffers));
+
+ /// Peek at the incoming data on the stream. Returns the number of bytes read.
+ /// Throws an exception on failure.
+ template <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence>
+ 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/3rdparty/asio/include/asio/buffered_read_stream_fwd.hpp b/3rdparty/asio/include/asio/buffered_read_stream_fwd.hpp
new file mode 100644
index 00000000000..d98aa70483a
--- /dev/null
+++ b/3rdparty/asio/include/asio/buffered_read_stream_fwd.hpp
@@ -0,0 +1,25 @@
+//
+// buffered_read_stream_fwd.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Stream>
+class buffered_read_stream;
+
+} // namespace asio
+
+#endif // ASIO_BUFFERED_READ_STREAM_FWD_HPP
diff --git a/3rdparty/asio/include/asio/buffered_stream.hpp b/3rdparty/asio/include/asio/buffered_stream.hpp
new file mode 100644
index 00000000000..e0e1b47b792
--- /dev/null
+++ b/3rdparty/asio/include/asio/buffered_stream.hpp
@@ -0,0 +1,292 @@
+//
+// buffered_stream.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#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/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 <typename Stream>
+class buffered_stream
+ : private noncopyable
+{
+public:
+ /// The type of the next layer.
+ typedef remove_reference_t<Stream> 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 <typename Arg>
+ explicit buffered_stream(Arg&& a)
+ : inner_stream_impl_(static_cast<Arg&&>(a)),
+ stream_impl_(inner_stream_impl_)
+ {
+ }
+
+ /// Construct, passing the specified argument to initialise the next layer.
+ template <typename Arg>
+ explicit buffered_stream(Arg&& a,
+ std::size_t read_buffer_size, std::size_t write_buffer_size)
+ : inner_stream_impl_(static_cast<Arg&&>(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() noexcept
+ {
+ return stream_impl_.lowest_layer().get_executor();
+ }
+
+ /// 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.
+ /**
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteHandler = default_completion_token_t<executor_type>>
+ auto async_flush(
+ WriteHandler&& handler = default_completion_token_t<executor_type>())
+ -> decltype(
+ declval<buffered_write_stream<Stream>&>().async_flush(
+ static_cast<WriteHandler&&>(handler)))
+ {
+ return stream_impl_.next_layer().async_flush(
+ static_cast<WriteHandler&&>(handler));
+ }
+
+ /// Write the given data to the stream. Returns the number of bytes written.
+ /// Throws an exception on failure.
+ template <typename ConstBufferSequence>
+ 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 <typename ConstBufferSequence>
+ 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.
+ /**
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteHandler = default_completion_token_t<executor_type>>
+ auto async_write_some(const ConstBufferSequence& buffers,
+ WriteHandler&& handler = default_completion_token_t<executor_type>())
+ -> decltype(
+ declval<Stream&>().async_write_some(buffers,
+ static_cast<WriteHandler&&>(handler)))
+ {
+ return stream_impl_.async_write_some(buffers,
+ static_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.
+ /**
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadHandler = default_completion_token_t<executor_type>>
+ auto async_fill(
+ ReadHandler&& handler = default_completion_token_t<executor_type>())
+ -> decltype(
+ declval<buffered_read_stream<
+ buffered_write_stream<Stream>>&>().async_fill(
+ static_cast<ReadHandler&&>(handler)))
+ {
+ return stream_impl_.async_fill(static_cast<ReadHandler&&>(handler));
+ }
+
+ /// Read some data from the stream. Returns the number of bytes read. Throws
+ /// an exception on failure.
+ template <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence>
+ 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.
+ /**
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadHandler = default_completion_token_t<executor_type>>
+ auto async_read_some(const MutableBufferSequence& buffers,
+ ReadHandler&& handler = default_completion_token_t<executor_type>())
+ -> decltype(
+ declval<Stream&>().async_read_some(buffers,
+ static_cast<ReadHandler&&>(handler)))
+ {
+ return stream_impl_.async_read_some(buffers,
+ static_cast<ReadHandler&&>(handler));
+ }
+
+ /// Peek at the incoming data on the stream. Returns the number of bytes read.
+ /// Throws an exception on failure.
+ template <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence>
+ 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<Stream> write_stream_type;
+ write_stream_type inner_stream_impl_;
+
+ // The buffered read stream.
+ typedef buffered_read_stream<write_stream_type&> read_stream_type;
+ read_stream_type stream_impl_;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BUFFERED_STREAM_HPP
diff --git a/3rdparty/asio/include/asio/buffered_stream_fwd.hpp b/3rdparty/asio/include/asio/buffered_stream_fwd.hpp
new file mode 100644
index 00000000000..790c76269f9
--- /dev/null
+++ b/3rdparty/asio/include/asio/buffered_stream_fwd.hpp
@@ -0,0 +1,25 @@
+//
+// buffered_stream_fwd.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Stream>
+class buffered_stream;
+
+} // namespace asio
+
+#endif // ASIO_BUFFERED_STREAM_FWD_HPP
diff --git a/3rdparty/asio/include/asio/buffered_write_stream.hpp b/3rdparty/asio/include/asio/buffered_write_stream.hpp
new file mode 100644
index 00000000000..f8f0538dcea
--- /dev/null
+++ b/3rdparty/asio/include/asio/buffered_write_stream.hpp
@@ -0,0 +1,265 @@
+//
+// buffered_write_stream.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#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/write.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename> class initiate_async_buffered_flush;
+template <typename> class initiate_async_buffered_write_some;
+
+} // namespace detail
+
+/// 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 <typename Stream>
+class buffered_write_stream
+ : private noncopyable
+{
+public:
+ /// The type of the next layer.
+ typedef remove_reference_t<Stream> 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 <typename Arg>
+ explicit buffered_write_stream(Arg&& a)
+ : next_layer_(static_cast<Arg&&>(a)),
+ storage_(default_buffer_size)
+ {
+ }
+
+ /// Construct, passing the specified argument to initialise the next layer.
+ template <typename Arg>
+ buffered_write_stream(Arg&& a,
+ std::size_t buffer_size)
+ : next_layer_(static_cast<Arg&&>(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() noexcept
+ {
+ return next_layer_.lowest_layer().get_executor();
+ }
+
+ /// 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.
+ /**
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteHandler = default_completion_token_t<executor_type>>
+ auto async_flush(
+ WriteHandler&& handler = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteHandler,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_buffered_flush<Stream>>(),
+ handler, declval<detail::buffered_stream_storage*>()));
+
+ /// Write the given data to the stream. Returns the number of bytes written.
+ /// Throws an exception on failure.
+ template <typename ConstBufferSequence>
+ 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 <typename ConstBufferSequence>
+ 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.
+ /**
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteHandler = default_completion_token_t<executor_type>>
+ auto async_write_some(const ConstBufferSequence& buffers,
+ WriteHandler&& handler = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteHandler,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_buffered_write_some<Stream>>(),
+ handler, declval<detail::buffered_stream_storage*>(), buffers));
+
+ /// Read some data from the stream. Returns the number of bytes read. Throws
+ /// an exception on failure.
+ template <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence>
+ 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.
+ /**
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadHandler = default_completion_token_t<executor_type>>
+ auto async_read_some(const MutableBufferSequence& buffers,
+ ReadHandler&& handler = default_completion_token_t<executor_type>())
+ -> decltype(
+ declval<conditional_t<true, Stream&, ReadHandler>>().async_read_some(
+ buffers, static_cast<ReadHandler&&>(handler)))
+ {
+ return next_layer_.async_read_some(buffers,
+ static_cast<ReadHandler&&>(handler));
+ }
+
+ /// Peek at the incoming data on the stream. Returns the number of bytes read.
+ /// Throws an exception on failure.
+ template <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence>
+ 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 <typename ConstBufferSequence>
+ 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/3rdparty/asio/include/asio/buffered_write_stream_fwd.hpp b/3rdparty/asio/include/asio/buffered_write_stream_fwd.hpp
new file mode 100644
index 00000000000..809f44af03d
--- /dev/null
+++ b/3rdparty/asio/include/asio/buffered_write_stream_fwd.hpp
@@ -0,0 +1,25 @@
+//
+// buffered_write_stream_fwd.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Stream>
+class buffered_write_stream;
+
+} // namespace asio
+
+#endif // ASIO_BUFFERED_WRITE_STREAM_FWD_HPP
diff --git a/3rdparty/asio/include/asio/buffers_iterator.hpp b/3rdparty/asio/include/asio/buffers_iterator.hpp
new file mode 100644
index 00000000000..2c6d720787c
--- /dev/null
+++ b/3rdparty/asio/include/asio/buffers_iterator.hpp
@@ -0,0 +1,521 @@
+//
+// buffers_iterator.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <iterator>
+#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 <bool IsMutable>
+ struct buffers_iterator_types_helper;
+
+ template <>
+ struct buffers_iterator_types_helper<false>
+ {
+ typedef const_buffer buffer_type;
+ template <typename ByteType>
+ struct byte_type
+ {
+ typedef add_const_t<ByteType> type;
+ };
+ };
+
+ template <>
+ struct buffers_iterator_types_helper<true>
+ {
+ typedef mutable_buffer buffer_type;
+ template <typename ByteType>
+ struct byte_type
+ {
+ typedef ByteType type;
+ };
+ };
+
+ template <typename BufferSequence, typename ByteType>
+ struct buffers_iterator_types
+ {
+ enum
+ {
+ is_mutable = is_convertible<
+ typename BufferSequence::value_type,
+ mutable_buffer>::value
+ };
+ typedef buffers_iterator_types_helper<is_mutable> helper;
+ typedef typename helper::buffer_type buffer_type;
+ typedef typename helper::template byte_type<ByteType>::type byte_type;
+ typedef typename BufferSequence::const_iterator const_iterator;
+ };
+
+ template <typename ByteType>
+ struct buffers_iterator_types<mutable_buffer, ByteType>
+ {
+ typedef mutable_buffer buffer_type;
+ typedef ByteType byte_type;
+ typedef const mutable_buffer* const_iterator;
+ };
+
+ template <typename ByteType>
+ struct buffers_iterator_types<const_buffer, ByteType>
+ {
+ typedef const_buffer buffer_type;
+ typedef add_const_t<ByteType> byte_type;
+ typedef const const_buffer* const_iterator;
+ };
+
+#if !defined(ASIO_NO_DEPRECATED)
+
+ template <typename ByteType>
+ struct buffers_iterator_types<mutable_buffers_1, ByteType>
+ {
+ typedef mutable_buffer buffer_type;
+ typedef ByteType byte_type;
+ typedef const mutable_buffer* const_iterator;
+ };
+
+ template <typename ByteType>
+ struct buffers_iterator_types<const_buffers_1, ByteType>
+ {
+ typedef const_buffer buffer_type;
+ typedef add_const_t<ByteType> 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 <typename BufferSequence, typename ByteType = char>
+class buffers_iterator
+{
+private:
+ typedef typename detail::buffers_iterator_types<
+ BufferSequence, ByteType>::buffer_type buffer_type;
+
+ typedef typename detail::buffers_iterator_types<BufferSequence,
+ ByteType>::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<pointer>(
+ 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 <typename BufferSequence>
+inline buffers_iterator<BufferSequence> buffers_begin(
+ const BufferSequence& buffers)
+{
+ return buffers_iterator<BufferSequence>::begin(buffers);
+}
+
+/// Construct an iterator representing the end of the buffers' data.
+template <typename BufferSequence>
+inline buffers_iterator<BufferSequence> buffers_end(
+ const BufferSequence& buffers)
+{
+ return buffers_iterator<BufferSequence>::end(buffers);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_BUFFERS_ITERATOR_HPP
diff --git a/3rdparty/asio/include/asio/cancellation_signal.hpp b/3rdparty/asio/include/asio/cancellation_signal.hpp
new file mode 100644
index 00000000000..43540ac3b08
--- /dev/null
+++ b/3rdparty/asio/include/asio/cancellation_signal.hpp
@@ -0,0 +1,245 @@
+//
+// cancellation_signal.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_CANCELLATION_SIGNAL_HPP
+#define ASIO_CANCELLATION_SIGNAL_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <cassert>
+#include <new>
+#include <utility>
+#include "asio/cancellation_type.hpp"
+#include "asio/detail/cstddef.hpp"
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class cancellation_handler_base
+{
+public:
+ virtual void call(cancellation_type_t) = 0;
+ virtual std::pair<void*, std::size_t> destroy() noexcept = 0;
+
+protected:
+ ~cancellation_handler_base() {}
+};
+
+template <typename Handler>
+class cancellation_handler
+ : public cancellation_handler_base
+{
+public:
+ template <typename... Args>
+ cancellation_handler(std::size_t size, Args&&... args)
+ : handler_(static_cast<Args&&>(args)...),
+ size_(size)
+ {
+ }
+
+ void call(cancellation_type_t type)
+ {
+ handler_(type);
+ }
+
+ std::pair<void*, std::size_t> destroy() noexcept
+ {
+ std::pair<void*, std::size_t> mem(this, size_);
+ this->cancellation_handler::~cancellation_handler();
+ return mem;
+ }
+
+ Handler& handler() noexcept
+ {
+ return handler_;
+ }
+
+private:
+ ~cancellation_handler()
+ {
+ }
+
+ Handler handler_;
+ std::size_t size_;
+};
+
+} // namespace detail
+
+class cancellation_slot;
+
+/// A cancellation signal with a single slot.
+class cancellation_signal
+{
+public:
+ constexpr cancellation_signal()
+ : handler_(0)
+ {
+ }
+
+ ASIO_DECL ~cancellation_signal();
+
+ /// Emits the signal and causes invocation of the slot's handler, if any.
+ void emit(cancellation_type_t type)
+ {
+ if (handler_)
+ handler_->call(type);
+ }
+
+ /// Returns the single slot associated with the signal.
+ /**
+ * The signal object must remain valid for as long the slot may be used.
+ * Destruction of the signal invalidates the slot.
+ */
+ cancellation_slot slot() noexcept;
+
+private:
+ cancellation_signal(const cancellation_signal&) = delete;
+ cancellation_signal& operator=(const cancellation_signal&) = delete;
+
+ detail::cancellation_handler_base* handler_;
+};
+
+/// A slot associated with a cancellation signal.
+class cancellation_slot
+{
+public:
+ /// Creates a slot that is not connected to any cancellation signal.
+ constexpr cancellation_slot()
+ : handler_(0)
+ {
+ }
+
+ /// Installs a handler into the slot, constructing the new object directly.
+ /**
+ * Destroys any existing handler in the slot, then installs the new handler,
+ * constructing it with the supplied @c args.
+ *
+ * The handler is a function object to be called when the signal is emitted.
+ * The signature of the handler must be
+ * @code void handler(asio::cancellation_type_t); @endcode
+ *
+ * @param args Arguments to be passed to the @c CancellationHandler object's
+ * constructor.
+ *
+ * @returns A reference to the newly installed handler.
+ *
+ * @note Handlers installed into the slot via @c emplace are not required to
+ * be copy constructible or move constructible.
+ */
+ template <typename CancellationHandler, typename... Args>
+ CancellationHandler& emplace(Args&&... args)
+ {
+ typedef detail::cancellation_handler<CancellationHandler>
+ cancellation_handler_type;
+ auto_delete_helper del = { prepare_memory(
+ sizeof(cancellation_handler_type),
+ alignof(CancellationHandler)) };
+ cancellation_handler_type* handler_obj =
+ new (del.mem.first) cancellation_handler_type(
+ del.mem.second, static_cast<Args&&>(args)...);
+ del.mem.first = 0;
+ *handler_ = handler_obj;
+ return handler_obj->handler();
+ }
+
+ /// Installs a handler into the slot.
+ /**
+ * Destroys any existing handler in the slot, then installs the new handler,
+ * constructing it as a decay-copy of the supplied handler.
+ *
+ * The handler is a function object to be called when the signal is emitted.
+ * The signature of the handler must be
+ * @code void handler(asio::cancellation_type_t); @endcode
+ *
+ * @param handler The handler to be installed.
+ *
+ * @returns A reference to the newly installed handler.
+ */
+ template <typename CancellationHandler>
+ decay_t<CancellationHandler>& assign(CancellationHandler&& handler)
+ {
+ return this->emplace<decay_t<CancellationHandler>>(
+ static_cast<CancellationHandler&&>(handler));
+ }
+
+ /// Clears the slot.
+ /**
+ * Destroys any existing handler in the slot.
+ */
+ ASIO_DECL void clear();
+
+ /// Returns whether the slot is connected to a signal.
+ constexpr bool is_connected() const noexcept
+ {
+ return handler_ != 0;
+ }
+
+ /// Returns whether the slot is connected and has an installed handler.
+ constexpr bool has_handler() const noexcept
+ {
+ return handler_ != 0 && *handler_ != 0;
+ }
+
+ /// Compare two slots for equality.
+ friend constexpr bool operator==(const cancellation_slot& lhs,
+ const cancellation_slot& rhs) noexcept
+ {
+ return lhs.handler_ == rhs.handler_;
+ }
+
+ /// Compare two slots for inequality.
+ friend constexpr bool operator!=(const cancellation_slot& lhs,
+ const cancellation_slot& rhs) noexcept
+ {
+ return lhs.handler_ != rhs.handler_;
+ }
+
+private:
+ friend class cancellation_signal;
+
+ constexpr cancellation_slot(int,
+ detail::cancellation_handler_base** handler)
+ : handler_(handler)
+ {
+ }
+
+ ASIO_DECL std::pair<void*, std::size_t> prepare_memory(
+ std::size_t size, std::size_t align);
+
+ struct auto_delete_helper
+ {
+ std::pair<void*, std::size_t> mem;
+
+ ASIO_DECL ~auto_delete_helper();
+ };
+
+ detail::cancellation_handler_base** handler_;
+};
+
+inline cancellation_slot cancellation_signal::slot() noexcept
+{
+ return cancellation_slot(0, &handler_);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#if defined(ASIO_HEADER_ONLY)
+# include "asio/impl/cancellation_signal.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // ASIO_CANCELLATION_SIGNAL_HPP
diff --git a/3rdparty/asio/include/asio/cancellation_state.hpp b/3rdparty/asio/include/asio/cancellation_state.hpp
new file mode 100644
index 00000000000..3c13edcab94
--- /dev/null
+++ b/3rdparty/asio/include/asio/cancellation_state.hpp
@@ -0,0 +1,235 @@
+//
+// cancellation_state.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_CANCELLATION_STATE_HPP
+#define ASIO_CANCELLATION_STATE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <cassert>
+#include <new>
+#include <utility>
+#include "asio/cancellation_signal.hpp"
+#include "asio/detail/cstddef.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// A simple cancellation signal propagation filter.
+template <cancellation_type_t Mask>
+struct cancellation_filter
+{
+ /// Returns <tt>type & Mask</tt>.
+ cancellation_type_t operator()(
+ cancellation_type_t type) const noexcept
+ {
+ return type & Mask;
+ }
+};
+
+/// A cancellation filter that disables cancellation.
+typedef cancellation_filter<cancellation_type::none>
+ disable_cancellation;
+
+/// A cancellation filter that enables terminal cancellation only.
+typedef cancellation_filter<cancellation_type::terminal>
+ enable_terminal_cancellation;
+
+#if defined(GENERATING_DOCUMENTATION)
+
+/// A cancellation filter that enables terminal and partial cancellation.
+typedef cancellation_filter<
+ cancellation_type::terminal | cancellation_type::partial>
+ enable_partial_cancellation;
+
+/// A cancellation filter that enables terminal, partial and total cancellation.
+typedef cancellation_filter<cancellation_type::terminal
+ | cancellation_type::partial | cancellation_type::total>
+ enable_total_cancellation;
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+typedef cancellation_filter<
+ static_cast<cancellation_type_t>(
+ static_cast<unsigned int>(cancellation_type::terminal)
+ | static_cast<unsigned int>(cancellation_type::partial))>
+ enable_partial_cancellation;
+
+typedef cancellation_filter<
+ static_cast<cancellation_type_t>(
+ static_cast<unsigned int>(cancellation_type::terminal)
+ | static_cast<unsigned int>(cancellation_type::partial)
+ | static_cast<unsigned int>(cancellation_type::total))>
+ enable_total_cancellation;
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+/// A cancellation state is used for chaining signals and slots in compositions.
+class cancellation_state
+{
+public:
+ /// Construct a disconnected cancellation state.
+ constexpr cancellation_state() noexcept
+ : impl_(0)
+ {
+ }
+
+ /// Construct and attach to a parent slot to create a new child slot.
+ /**
+ * Initialises the cancellation state so that it allows terminal cancellation
+ * only. Equivalent to <tt>cancellation_state(slot,
+ * enable_terminal_cancellation())</tt>.
+ *
+ * @param slot The parent cancellation slot to which the state will be
+ * attached.
+ */
+ template <typename CancellationSlot>
+ constexpr explicit cancellation_state(CancellationSlot slot)
+ : impl_(slot.is_connected() ? &slot.template emplace<impl<>>() : 0)
+ {
+ }
+
+ /// Construct and attach to a parent slot to create a new child slot.
+ /**
+ * @param slot The parent cancellation slot to which the state will be
+ * attached.
+ *
+ * @param filter A function object that is used to transform incoming
+ * cancellation signals as they are received from the parent slot. This
+ * function object must have the signature:
+ * @code asio::cancellation_type_t filter(
+ * asio::cancellation_type_t); @endcode
+ *
+ * The library provides the following pre-defined cancellation filters:
+ *
+ * @li asio::disable_cancellation
+ * @li asio::enable_terminal_cancellation
+ * @li asio::enable_partial_cancellation
+ * @li asio::enable_total_cancellation
+ */
+ template <typename CancellationSlot, typename Filter>
+ constexpr cancellation_state(CancellationSlot slot, Filter filter)
+ : impl_(slot.is_connected()
+ ? &slot.template emplace<impl<Filter, Filter>>(filter, filter)
+ : 0)
+ {
+ }
+
+ /// Construct and attach to a parent slot to create a new child slot.
+ /**
+ * @param slot The parent cancellation slot to which the state will be
+ * attached.
+ *
+ * @param in_filter A function object that is used to transform incoming
+ * cancellation signals as they are received from the parent slot. This
+ * function object must have the signature:
+ * @code asio::cancellation_type_t in_filter(
+ * asio::cancellation_type_t); @endcode
+ *
+ * @param out_filter A function object that is used to transform outcoming
+ * cancellation signals as they are relayed to the child slot. This function
+ * object must have the signature:
+ * @code asio::cancellation_type_t out_filter(
+ * asio::cancellation_type_t); @endcode
+ *
+ * The library provides the following pre-defined cancellation filters:
+ *
+ * @li asio::disable_cancellation
+ * @li asio::enable_terminal_cancellation
+ * @li asio::enable_partial_cancellation
+ * @li asio::enable_total_cancellation
+ */
+ template <typename CancellationSlot, typename InFilter, typename OutFilter>
+ constexpr cancellation_state(CancellationSlot slot,
+ InFilter in_filter, OutFilter out_filter)
+ : impl_(slot.is_connected()
+ ? &slot.template emplace<impl<InFilter, OutFilter>>(
+ static_cast<InFilter&&>(in_filter),
+ static_cast<OutFilter&&>(out_filter))
+ : 0)
+ {
+ }
+
+ /// Returns the single child slot associated with the state.
+ /**
+ * This sub-slot is used with the operations that are being composed.
+ */
+ constexpr cancellation_slot slot() const noexcept
+ {
+ return impl_ ? impl_->signal_.slot() : cancellation_slot();
+ }
+
+ /// Returns the cancellation types that have been triggered.
+ cancellation_type_t cancelled() const noexcept
+ {
+ return impl_ ? impl_->cancelled_ : cancellation_type_t();
+ }
+
+ /// Clears the specified cancellation types, if they have been triggered.
+ void clear(cancellation_type_t mask = cancellation_type::all)
+ noexcept
+ {
+ if (impl_)
+ impl_->cancelled_ &= ~mask;
+ }
+
+private:
+ struct impl_base
+ {
+ impl_base()
+ : cancelled_()
+ {
+ }
+
+ cancellation_signal signal_;
+ cancellation_type_t cancelled_;
+ };
+
+ template <
+ typename InFilter = enable_terminal_cancellation,
+ typename OutFilter = InFilter>
+ struct impl : impl_base
+ {
+ impl()
+ : in_filter_(),
+ out_filter_()
+ {
+ }
+
+ impl(InFilter in_filter, OutFilter out_filter)
+ : in_filter_(static_cast<InFilter&&>(in_filter)),
+ out_filter_(static_cast<OutFilter&&>(out_filter))
+ {
+ }
+
+ void operator()(cancellation_type_t in)
+ {
+ this->cancelled_ = in_filter_(in);
+ cancellation_type_t out = out_filter_(this->cancelled_);
+ if (out != cancellation_type::none)
+ this->signal_.emit(out);
+ }
+
+ InFilter in_filter_;
+ OutFilter out_filter_;
+ };
+
+ impl_base* impl_;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_CANCELLATION_STATE_HPP
diff --git a/3rdparty/asio/include/asio/cancellation_type.hpp b/3rdparty/asio/include/asio/cancellation_type.hpp
new file mode 100644
index 00000000000..ec4a4d2458a
--- /dev/null
+++ b/3rdparty/asio/include/asio/cancellation_type.hpp
@@ -0,0 +1,157 @@
+//
+// cancellation_type.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_CANCELLATION_TYPE_HPP
+#define ASIO_CANCELLATION_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 {
+
+# if defined(GENERATING_DOCUMENTATION)
+
+/// Enumeration representing the different types of cancellation that may
+/// be requested from or implemented by an asynchronous operation.
+enum cancellation_type
+{
+ /// Bitmask representing no types of cancellation.
+ none = 0,
+
+ /// Requests cancellation where, following a successful cancellation, the only
+ /// safe operations on the I/O object are closure or destruction.
+ terminal = 1,
+
+ /// Requests cancellation where a successful cancellation may result in
+ /// partial side effects or no side effects. Following cancellation, the I/O
+ /// object is in a well-known state, and may be used for further operations.
+ partial = 2,
+
+ /// Requests cancellation where a successful cancellation results in no
+ /// apparent side effects. Following cancellation, the I/O object is in the
+ /// same observable state as it was prior to the operation.
+ total = 4,
+
+ /// Bitmask representing all types of cancellation.
+ all = 0xFFFFFFFF
+};
+
+/// Portability typedef.
+typedef cancellation_type cancellation_type_t;
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+enum class cancellation_type : unsigned int
+{
+ none = 0,
+ terminal = 1,
+ partial = 2,
+ total = 4,
+ all = 0xFFFFFFFF
+};
+
+typedef cancellation_type cancellation_type_t;
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+/// Negation operator.
+/**
+ * @relates cancellation_type
+ */
+inline constexpr bool operator!(cancellation_type_t x)
+{
+ return static_cast<unsigned int>(x) == 0;
+}
+
+/// Bitwise and operator.
+/**
+ * @relates cancellation_type
+ */
+inline constexpr cancellation_type_t operator&(
+ cancellation_type_t x, cancellation_type_t y)
+{
+ return static_cast<cancellation_type_t>(
+ static_cast<unsigned int>(x) & static_cast<unsigned int>(y));
+}
+
+/// Bitwise or operator.
+/**
+ * @relates cancellation_type
+ */
+inline constexpr cancellation_type_t operator|(
+ cancellation_type_t x, cancellation_type_t y)
+{
+ return static_cast<cancellation_type_t>(
+ static_cast<unsigned int>(x) | static_cast<unsigned int>(y));
+}
+
+/// Bitwise xor operator.
+/**
+ * @relates cancellation_type
+ */
+inline constexpr cancellation_type_t operator^(
+ cancellation_type_t x, cancellation_type_t y)
+{
+ return static_cast<cancellation_type_t>(
+ static_cast<unsigned int>(x) ^ static_cast<unsigned int>(y));
+}
+
+/// Bitwise negation operator.
+/**
+ * @relates cancellation_type
+ */
+inline constexpr cancellation_type_t operator~(cancellation_type_t x)
+{
+ return static_cast<cancellation_type_t>(~static_cast<unsigned int>(x));
+}
+
+/// Bitwise and-assignment operator.
+/**
+ * @relates cancellation_type
+ */
+inline cancellation_type_t& operator&=(
+ cancellation_type_t& x, cancellation_type_t y)
+{
+ x = x & y;
+ return x;
+}
+
+/// Bitwise or-assignment operator.
+/**
+ * @relates cancellation_type
+ */
+inline cancellation_type_t& operator|=(
+ cancellation_type_t& x, cancellation_type_t y)
+{
+ x = x | y;
+ return x;
+}
+
+/// Bitwise xor-assignment operator.
+/**
+ * @relates cancellation_type
+ */
+inline cancellation_type_t& operator^=(
+ cancellation_type_t& x, cancellation_type_t y)
+{
+ x = x ^ y;
+ return x;
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_CANCELLATION_TYPE_HPP
diff --git a/3rdparty/asio/include/asio/co_spawn.hpp b/3rdparty/asio/include/asio/co_spawn.hpp
new file mode 100644
index 00000000000..26988f47da0
--- /dev/null
+++ b/3rdparty/asio/include/asio/co_spawn.hpp
@@ -0,0 +1,523 @@
+//
+// co_spawn.hpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_CO_SPAWN_HPP
+#define ASIO_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 "asio/awaitable.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/is_executor.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename T>
+struct awaitable_signature;
+
+template <typename T, typename Executor>
+struct awaitable_signature<awaitable<T, Executor>>
+{
+ typedef void type(std::exception_ptr, T);
+};
+
+template <typename Executor>
+struct awaitable_signature<awaitable<void, Executor>>
+{
+ typedef void type(std::exception_ptr);
+};
+
+} // namespace detail
+
+/// Spawn a new coroutined-based thread of execution.
+/**
+ * @param ex The executor that will be used to schedule the new thread of
+ * execution.
+ *
+ * @param a The asio::awaitable object that is the result of calling the
+ * coroutine's entry point function.
+ *
+ * @param token The @ref completion_token that will handle the notification that
+ * the thread of execution has completed. The function signature of the
+ * completion handler must be:
+ * @code void handler(std::exception_ptr, T); @endcode
+ *
+ * @par Completion Signature
+ * @code void(std::exception_ptr, T) @endcode
+ *
+ * @par Example
+ * @code
+ * asio::awaitable<std::size_t> echo(tcp::socket socket)
+ * {
+ * std::size_t bytes_transferred = 0;
+ *
+ * try
+ * {
+ * char data[1024];
+ * for (;;)
+ * {
+ * std::size_t n = co_await socket.async_read_some(
+ * asio::buffer(data), asio::use_awaitable);
+ *
+ * co_await asio::async_write(socket,
+ * asio::buffer(data, n), asio::use_awaitable);
+ *
+ * bytes_transferred += n;
+ * }
+ * }
+ * catch (const std::exception&)
+ * {
+ * }
+ *
+ * co_return bytes_transferred;
+ * }
+ *
+ * // ...
+ *
+ * asio::co_spawn(my_executor,
+ * echo(std::move(my_tcp_socket)),
+ * [](std::exception_ptr e, std::size_t n)
+ * {
+ * std::cout << "transferred " << n << "\n";
+ * });
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * The new thread of execution is created with a cancellation state that
+ * supports @c cancellation_type::terminal values only. To change the
+ * cancellation state, call asio::this_coro::reset_cancellation_state.
+ */
+template <typename Executor, typename T, typename AwaitableExecutor,
+ ASIO_COMPLETION_TOKEN_FOR(
+ void(std::exception_ptr, T)) CompletionToken
+ ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
+inline ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(std::exception_ptr, T))
+co_spawn(const Executor& ex, awaitable<T, AwaitableExecutor> a,
+ CompletionToken&& token
+ ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
+ constraint_t<
+ (is_executor<Executor>::value || execution::is_executor<Executor>::value)
+ && is_convertible<Executor, AwaitableExecutor>::value
+ > = 0);
+
+/// Spawn a new coroutined-based thread of execution.
+/**
+ * @param ex The executor that will be used to schedule the new thread of
+ * execution.
+ *
+ * @param a The asio::awaitable object that is the result of calling the
+ * coroutine's entry point function.
+ *
+ * @param token The @ref completion_token that will handle the notification that
+ * the thread of execution has completed. The function signature of the
+ * completion handler must be:
+ * @code void handler(std::exception_ptr); @endcode
+ *
+ * @par Completion Signature
+ * @code void(std::exception_ptr) @endcode
+ *
+ * @par Example
+ * @code
+ * asio::awaitable<void> echo(tcp::socket socket)
+ * {
+ * try
+ * {
+ * char data[1024];
+ * for (;;)
+ * {
+ * std::size_t n = co_await socket.async_read_some(
+ * asio::buffer(data), asio::use_awaitable);
+ *
+ * co_await asio::async_write(socket,
+ * asio::buffer(data, n), asio::use_awaitable);
+ * }
+ * }
+ * catch (const std::exception& e)
+ * {
+ * std::cerr << "Exception: " << e.what() << "\n";
+ * }
+ * }
+ *
+ * // ...
+ *
+ * asio::co_spawn(my_executor,
+ * echo(std::move(my_tcp_socket)),
+ * asio::detached);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * The new thread of execution is created with a cancellation state that
+ * supports @c cancellation_type::terminal values only. To change the
+ * cancellation state, call asio::this_coro::reset_cancellation_state.
+ */
+template <typename Executor, typename AwaitableExecutor,
+ ASIO_COMPLETION_TOKEN_FOR(
+ void(std::exception_ptr)) CompletionToken
+ ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
+inline ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(std::exception_ptr))
+co_spawn(const Executor& ex, awaitable<void, AwaitableExecutor> a,
+ CompletionToken&& token
+ ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
+ constraint_t<
+ (is_executor<Executor>::value || execution::is_executor<Executor>::value)
+ && is_convertible<Executor, AwaitableExecutor>::value
+ > = 0);
+
+/// Spawn a new coroutined-based thread of execution.
+/**
+ * @param ctx An execution context that will provide the executor to be used to
+ * schedule the new thread of execution.
+ *
+ * @param a The asio::awaitable object that is the result of calling the
+ * coroutine's entry point function.
+ *
+ * @param token The @ref completion_token that will handle the notification that
+ * the thread of execution has completed. The function signature of the
+ * completion handler must be:
+ * @code void handler(std::exception_ptr); @endcode
+ *
+ * @par Completion Signature
+ * @code void(std::exception_ptr, T) @endcode
+ *
+ * @par Example
+ * @code
+ * asio::awaitable<std::size_t> echo(tcp::socket socket)
+ * {
+ * std::size_t bytes_transferred = 0;
+ *
+ * try
+ * {
+ * char data[1024];
+ * for (;;)
+ * {
+ * std::size_t n = co_await socket.async_read_some(
+ * asio::buffer(data), asio::use_awaitable);
+ *
+ * co_await asio::async_write(socket,
+ * asio::buffer(data, n), asio::use_awaitable);
+ *
+ * bytes_transferred += n;
+ * }
+ * }
+ * catch (const std::exception&)
+ * {
+ * }
+ *
+ * co_return bytes_transferred;
+ * }
+ *
+ * // ...
+ *
+ * asio::co_spawn(my_io_context,
+ * echo(std::move(my_tcp_socket)),
+ * [](std::exception_ptr e, std::size_t n)
+ * {
+ * std::cout << "transferred " << n << "\n";
+ * });
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * The new thread of execution is created with a cancellation state that
+ * supports @c cancellation_type::terminal values only. To change the
+ * cancellation state, call asio::this_coro::reset_cancellation_state.
+ */
+template <typename ExecutionContext, typename T, typename AwaitableExecutor,
+ ASIO_COMPLETION_TOKEN_FOR(
+ void(std::exception_ptr, T)) CompletionToken
+ ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
+ typename ExecutionContext::executor_type)>
+inline ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(std::exception_ptr, T))
+co_spawn(ExecutionContext& ctx, awaitable<T, AwaitableExecutor> a,
+ CompletionToken&& token
+ ASIO_DEFAULT_COMPLETION_TOKEN(
+ typename ExecutionContext::executor_type),
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ && is_convertible<typename ExecutionContext::executor_type,
+ AwaitableExecutor>::value
+ > = 0);
+
+/// Spawn a new coroutined-based thread of execution.
+/**
+ * @param ctx An execution context that will provide the executor to be used to
+ * schedule the new thread of execution.
+ *
+ * @param a The asio::awaitable object that is the result of calling the
+ * coroutine's entry point function.
+ *
+ * @param token The @ref completion_token that will handle the notification that
+ * the thread of execution has completed. The function signature of the
+ * completion handler must be:
+ * @code void handler(std::exception_ptr); @endcode
+ *
+ * @par Completion Signature
+ * @code void(std::exception_ptr) @endcode
+ *
+ * @par Example
+ * @code
+ * asio::awaitable<void> echo(tcp::socket socket)
+ * {
+ * try
+ * {
+ * char data[1024];
+ * for (;;)
+ * {
+ * std::size_t n = co_await socket.async_read_some(
+ * asio::buffer(data), asio::use_awaitable);
+ *
+ * co_await asio::async_write(socket,
+ * asio::buffer(data, n), asio::use_awaitable);
+ * }
+ * }
+ * catch (const std::exception& e)
+ * {
+ * std::cerr << "Exception: " << e.what() << "\n";
+ * }
+ * }
+ *
+ * // ...
+ *
+ * asio::co_spawn(my_io_context,
+ * echo(std::move(my_tcp_socket)),
+ * asio::detached);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * The new thread of execution is created with a cancellation state that
+ * supports @c cancellation_type::terminal values only. To change the
+ * cancellation state, call asio::this_coro::reset_cancellation_state.
+ */
+template <typename ExecutionContext, typename AwaitableExecutor,
+ ASIO_COMPLETION_TOKEN_FOR(
+ void(std::exception_ptr)) CompletionToken
+ ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
+ typename ExecutionContext::executor_type)>
+inline ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(std::exception_ptr))
+co_spawn(ExecutionContext& ctx, awaitable<void, AwaitableExecutor> a,
+ CompletionToken&& token
+ ASIO_DEFAULT_COMPLETION_TOKEN(
+ typename ExecutionContext::executor_type),
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ && is_convertible<typename ExecutionContext::executor_type,
+ AwaitableExecutor>::value
+ > = 0);
+
+/// Spawn a new coroutined-based thread of execution.
+/**
+ * @param ex The executor that will be used to schedule the new thread of
+ * execution.
+ *
+ * @param f A nullary function object with a return type of the form
+ * @c asio::awaitable<R,E> that will be used as the coroutine's entry
+ * point.
+ *
+ * @param token The @ref completion_token that will handle the notification
+ * that the thread of execution has completed. If @c R is @c void, the function
+ * signature of the completion handler must be:
+ *
+ * @code void handler(std::exception_ptr); @endcode
+ * Otherwise, the function signature of the completion handler must be:
+ * @code void handler(std::exception_ptr, R); @endcode
+ *
+ * @par Completion Signature
+ * @code void(std::exception_ptr, R) @endcode
+ * where @c R is the first template argument to the @c awaitable returned by the
+ * supplied function object @c F:
+ * @code asio::awaitable<R, AwaitableExecutor> F() @endcode
+ *
+ * @par Example
+ * @code
+ * asio::awaitable<std::size_t> echo(tcp::socket socket)
+ * {
+ * std::size_t bytes_transferred = 0;
+ *
+ * try
+ * {
+ * char data[1024];
+ * for (;;)
+ * {
+ * std::size_t n = co_await socket.async_read_some(
+ * asio::buffer(data), asio::use_awaitable);
+ *
+ * co_await asio::async_write(socket,
+ * asio::buffer(data, n), asio::use_awaitable);
+ *
+ * bytes_transferred += n;
+ * }
+ * }
+ * catch (const std::exception&)
+ * {
+ * }
+ *
+ * co_return bytes_transferred;
+ * }
+ *
+ * // ...
+ *
+ * asio::co_spawn(my_executor,
+ * [socket = std::move(my_tcp_socket)]() mutable
+ * -> asio::awaitable<void>
+ * {
+ * try
+ * {
+ * char data[1024];
+ * for (;;)
+ * {
+ * std::size_t n = co_await socket.async_read_some(
+ * asio::buffer(data), asio::use_awaitable);
+ *
+ * co_await asio::async_write(socket,
+ * asio::buffer(data, n), asio::use_awaitable);
+ * }
+ * }
+ * catch (const std::exception& e)
+ * {
+ * std::cerr << "Exception: " << e.what() << "\n";
+ * }
+ * }, asio::detached);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * The new thread of execution is created with a cancellation state that
+ * supports @c cancellation_type::terminal values only. To change the
+ * cancellation state, call asio::this_coro::reset_cancellation_state.
+ */
+template <typename Executor, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::awaitable_signature<
+ result_of_t<F()>>::type) CompletionToken
+ ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
+ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken,
+ typename detail::awaitable_signature<result_of_t<F()>>::type)
+co_spawn(const Executor& ex, F&& f,
+ CompletionToken&& token
+ ASIO_DEFAULT_COMPLETION_TOKEN(Executor),
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0);
+
+/// Spawn a new coroutined-based thread of execution.
+/**
+ * @param ctx An execution context that will provide the executor to be used to
+ * schedule the new thread of execution.
+ *
+ * @param f A nullary function object with a return type of the form
+ * @c asio::awaitable<R,E> that will be used as the coroutine's entry
+ * point.
+ *
+ * @param token The @ref completion_token that will handle the notification
+ * that the thread of execution has completed. If @c R is @c void, the function
+ * signature of the completion handler must be:
+ *
+ * @code void handler(std::exception_ptr); @endcode
+ * Otherwise, the function signature of the completion handler must be:
+ * @code void handler(std::exception_ptr, R); @endcode
+ *
+ * @par Completion Signature
+ * @code void(std::exception_ptr, R) @endcode
+ * where @c R is the first template argument to the @c awaitable returned by the
+ * supplied function object @c F:
+ * @code asio::awaitable<R, AwaitableExecutor> F() @endcode
+ *
+ * @par Example
+ * @code
+ * asio::awaitable<std::size_t> echo(tcp::socket socket)
+ * {
+ * std::size_t bytes_transferred = 0;
+ *
+ * try
+ * {
+ * char data[1024];
+ * for (;;)
+ * {
+ * std::size_t n = co_await socket.async_read_some(
+ * asio::buffer(data), asio::use_awaitable);
+ *
+ * co_await asio::async_write(socket,
+ * asio::buffer(data, n), asio::use_awaitable);
+ *
+ * bytes_transferred += n;
+ * }
+ * }
+ * catch (const std::exception&)
+ * {
+ * }
+ *
+ * co_return bytes_transferred;
+ * }
+ *
+ * // ...
+ *
+ * asio::co_spawn(my_io_context,
+ * [socket = std::move(my_tcp_socket)]() mutable
+ * -> asio::awaitable<void>
+ * {
+ * try
+ * {
+ * char data[1024];
+ * for (;;)
+ * {
+ * std::size_t n = co_await socket.async_read_some(
+ * asio::buffer(data), asio::use_awaitable);
+ *
+ * co_await asio::async_write(socket,
+ * asio::buffer(data, n), asio::use_awaitable);
+ * }
+ * }
+ * catch (const std::exception& e)
+ * {
+ * std::cerr << "Exception: " << e.what() << "\n";
+ * }
+ * }, asio::detached);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * The new thread of execution is created with a cancellation state that
+ * supports @c cancellation_type::terminal values only. To change the
+ * cancellation state, call asio::this_coro::reset_cancellation_state.
+ */
+template <typename ExecutionContext, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::awaitable_signature<
+ result_of_t<F()>>::type) CompletionToken
+ ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(
+ typename ExecutionContext::executor_type)>
+ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken,
+ typename detail::awaitable_signature<result_of_t<F()>>::type)
+co_spawn(ExecutionContext& ctx, F&& f,
+ CompletionToken&& token
+ ASIO_DEFAULT_COMPLETION_TOKEN(
+ typename ExecutionContext::executor_type),
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0);
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/co_spawn.hpp"
+
+#endif // defined(ASIO_HAS_CO_AWAIT) || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_CO_SPAWN_HPP
diff --git a/3rdparty/asio/include/asio/completion_condition.hpp b/3rdparty/asio/include/asio/completion_condition.hpp
new file mode 100644
index 00000000000..3fe774f1ef1
--- /dev/null
+++ b/3rdparty/asio/include/asio/completion_condition.hpp
@@ -0,0 +1,218 @@
+//
+// completion_condition.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+
+#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 <typename Error>
+ 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 <typename Error>
+ 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 <typename Error>
+ 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<char, 128> 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<char, 128> 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<char, 128> 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/3rdparty/asio/include/asio/compose.hpp b/3rdparty/asio/include/asio/compose.hpp
new file mode 100644
index 00000000000..abb438e3da7
--- /dev/null
+++ b/3rdparty/asio/include/asio/compose.hpp
@@ -0,0 +1,319 @@
+//
+// compose.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_COMPOSE_HPP
+#define ASIO_COMPOSE_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/async_result.hpp"
+#include "asio/detail/base_from_cancellation_state.hpp"
+#include "asio/detail/composed_work.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Impl, typename Work, typename Handler, typename Signature>
+class composed_op;
+
+template <typename Impl, typename Work, typename Handler,
+ typename R, typename... Args>
+class composed_op<Impl, Work, Handler, R(Args...)>
+ : public base_from_cancellation_state<Handler>
+{
+public:
+ template <typename I, typename W, typename H>
+ composed_op(I&& impl,
+ W&& work,
+ H&& handler)
+ : base_from_cancellation_state<Handler>(
+ handler, enable_terminal_cancellation()),
+ impl_(static_cast<I&&>(impl)),
+ work_(static_cast<W&&>(work)),
+ handler_(static_cast<H&&>(handler)),
+ invocations_(0)
+ {
+ }
+
+ composed_op(composed_op&& other)
+ : base_from_cancellation_state<Handler>(
+ static_cast<base_from_cancellation_state<Handler>&&>(other)),
+ impl_(static_cast<Impl&&>(other.impl_)),
+ work_(static_cast<Work&&>(other.work_)),
+ handler_(static_cast<Handler&&>(other.handler_)),
+ invocations_(other.invocations_)
+ {
+ }
+
+ typedef typename composed_work_guard<
+ typename Work::head_type>::executor_type io_executor_type;
+
+ io_executor_type get_io_executor() const noexcept
+ {
+ return work_.head_.get_executor();
+ }
+
+ typedef associated_executor_t<Handler, io_executor_type> executor_type;
+
+ executor_type get_executor() const noexcept
+ {
+ return (get_associated_executor)(handler_, work_.head_.get_executor());
+ }
+
+ typedef associated_allocator_t<Handler, std::allocator<void>> allocator_type;
+
+ allocator_type get_allocator() const noexcept
+ {
+ return (get_associated_allocator)(handler_, std::allocator<void>());
+ }
+
+ template<typename... T>
+ void operator()(T&&... t)
+ {
+ if (invocations_ < ~0u)
+ ++invocations_;
+ this->get_cancellation_state().slot().clear();
+ impl_(*this, static_cast<T&&>(t)...);
+ }
+
+ void complete(Args... args)
+ {
+ this->work_.reset();
+ static_cast<Handler&&>(this->handler_)(static_cast<Args&&>(args)...);
+ }
+
+ void reset_cancellation_state()
+ {
+ base_from_cancellation_state<Handler>::reset_cancellation_state(handler_);
+ }
+
+ template <typename Filter>
+ void reset_cancellation_state(Filter&& filter)
+ {
+ base_from_cancellation_state<Handler>::reset_cancellation_state(handler_,
+ static_cast<Filter&&>(filter));
+ }
+
+ template <typename InFilter, typename OutFilter>
+ void reset_cancellation_state(InFilter&& in_filter,
+ OutFilter&& out_filter)
+ {
+ base_from_cancellation_state<Handler>::reset_cancellation_state(handler_,
+ static_cast<InFilter&&>(in_filter),
+ static_cast<OutFilter&&>(out_filter));
+ }
+
+ cancellation_type_t cancelled() const noexcept
+ {
+ return base_from_cancellation_state<Handler>::cancelled();
+ }
+
+//private:
+ Impl impl_;
+ Work work_;
+ Handler handler_;
+ unsigned invocations_;
+};
+
+template <typename Impl, typename Work, typename Handler, typename Signature>
+inline bool asio_handler_is_continuation(
+ composed_op<Impl, Work, Handler, Signature>* this_handler)
+{
+ return this_handler->invocations_ > 1 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Signature, typename Executors>
+class initiate_composed_op
+{
+public:
+ typedef typename composed_io_executors<Executors>::head_type executor_type;
+
+ template <typename T>
+ explicit initiate_composed_op(int, T&& executors)
+ : executors_(static_cast<T&&>(executors))
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return executors_.head_;
+ }
+
+ template <typename Handler, typename Impl>
+ void operator()(Handler&& handler,
+ Impl&& impl) const
+ {
+ composed_op<decay_t<Impl>, composed_work<Executors>,
+ decay_t<Handler>, Signature>(
+ static_cast<Impl&&>(impl),
+ composed_work<Executors>(executors_),
+ static_cast<Handler&&>(handler))();
+ }
+
+private:
+ composed_io_executors<Executors> executors_;
+};
+
+template <typename Signature, typename Executors>
+inline initiate_composed_op<Signature, Executors> make_initiate_composed_op(
+ composed_io_executors<Executors>&& executors)
+{
+ return initiate_composed_op<Signature, Executors>(0,
+ static_cast<composed_io_executors<Executors>&&>(executors));
+}
+
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename Impl, typename Work, typename Handler,
+ typename Signature, typename DefaultCandidate>
+struct associator<Associator,
+ detail::composed_op<Impl, Work, Handler, Signature>,
+ DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::composed_op<Impl, Work, Handler, Signature>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::composed_op<Impl, Work, Handler, Signature>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+/// Launch an asynchronous operation with a stateful implementation.
+/**
+ * The async_compose function simplifies the implementation of composed
+ * asynchronous operations automatically wrapping a stateful function object
+ * with a conforming intermediate completion handler.
+ *
+ * @param implementation A function object that contains the implementation of
+ * the composed asynchronous operation. The first argument to the function
+ * object is a non-const reference to the enclosing intermediate completion
+ * handler. The remaining arguments are any arguments that originate from the
+ * completion handlers of any asynchronous operations performed by the
+ * implementation.
+ *
+ * @param token The completion token.
+ *
+ * @param io_objects_or_executors Zero or more I/O objects or I/O executors for
+ * which outstanding work must be maintained.
+ *
+ * @par Per-Operation Cancellation
+ * By default, terminal per-operation cancellation is enabled for
+ * composed operations that are implemented using @c async_compose. To
+ * disable cancellation for the composed operation, or to alter its
+ * supported cancellation types, call the @c self object's @c
+ * reset_cancellation_state function.
+ *
+ * @par Example:
+ *
+ * @code struct async_echo_implementation
+ * {
+ * tcp::socket& socket_;
+ * asio::mutable_buffer buffer_;
+ * enum { starting, reading, writing } state_;
+ *
+ * template <typename Self>
+ * void operator()(Self& self,
+ * asio::error_code error = {},
+ * std::size_t n = 0)
+ * {
+ * switch (state_)
+ * {
+ * case starting:
+ * state_ = reading;
+ * socket_.async_read_some(
+ * buffer_, std::move(self));
+ * break;
+ * case reading:
+ * if (error)
+ * {
+ * self.complete(error, 0);
+ * }
+ * else
+ * {
+ * state_ = writing;
+ * asio::async_write(socket_, buffer_,
+ * asio::transfer_exactly(n),
+ * std::move(self));
+ * }
+ * break;
+ * case writing:
+ * self.complete(error, n);
+ * break;
+ * }
+ * }
+ * };
+ *
+ * template <typename CompletionToken>
+ * auto async_echo(tcp::socket& socket,
+ * asio::mutable_buffer buffer,
+ * CompletionToken&& token) ->
+ * decltype(
+ * asio::async_compose<CompletionToken,
+ * void(asio::error_code, std::size_t)>(
+ * std::declval<async_echo_implementation>(),
+ * token, socket))
+ * {
+ * return asio::async_compose<CompletionToken,
+ * void(asio::error_code, std::size_t)>(
+ * async_echo_implementation{socket, buffer,
+ * async_echo_implementation::starting},
+ * token, socket);
+ * } @endcode
+ */
+template <typename CompletionToken, typename Signature,
+ typename Implementation, typename... IoObjectsOrExecutors>
+auto async_compose(Implementation&& implementation,
+ type_identity_t<CompletionToken>& token,
+ IoObjectsOrExecutors&&... io_objects_or_executors)
+ -> decltype(
+ async_initiate<CompletionToken, Signature>(
+ detail::make_initiate_composed_op<Signature>(
+ detail::make_composed_io_executors(
+ detail::get_composed_io_executor(
+ static_cast<IoObjectsOrExecutors&&>(
+ io_objects_or_executors))...)),
+ token, static_cast<Implementation&&>(implementation)))
+{
+ return async_initiate<CompletionToken, Signature>(
+ detail::make_initiate_composed_op<Signature>(
+ detail::make_composed_io_executors(
+ detail::get_composed_io_executor(
+ static_cast<IoObjectsOrExecutors&&>(
+ io_objects_or_executors))...)),
+ token, static_cast<Implementation&&>(implementation));
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_COMPOSE_HPP
diff --git a/3rdparty/asio/include/asio/connect.hpp b/3rdparty/asio/include/asio/connect.hpp
new file mode 100644
index 00000000000..d2916675455
--- /dev/null
+++ b/3rdparty/asio/include/asio/connect.hpp
@@ -0,0 +1,1180 @@
+//
+// connect.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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
+{
+ struct default_connect_condition;
+ template <typename, typename> class initiate_async_range_connect;
+ template <typename, typename> class initiate_async_iterator_connect;
+
+ char (&has_iterator_helper(...))[2];
+
+ template <typename T>
+ char has_iterator_helper(T*, typename T::iterator* = 0);
+
+ template <typename T>
+ 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 <typename T>
+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<T>::value
+ };
+#endif
+};
+
+/**
+ * @defgroup connect asio::connect
+ *
+ * @brief The @c connect function is a composed operation that 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(my_context);
+ * tcp::resolver::query q("host", "service");
+ * tcp::socket s(my_context);
+ * asio::connect(s, r.resolve(q)); @endcode
+ */
+template <typename Protocol, typename Executor, typename EndpointSequence>
+typename Protocol::endpoint connect(basic_socket<Protocol, Executor>& s,
+ const EndpointSequence& endpoints,
+ constraint_t<is_endpoint_sequence<EndpointSequence>::value> = 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(my_context);
+ * tcp::resolver::query q("host", "service");
+ * tcp::socket s(my_context);
+ * asio::error_code ec;
+ * asio::connect(s, r.resolve(q), ec);
+ * if (ec)
+ * {
+ * // An error occurred.
+ * } @endcode
+ */
+template <typename Protocol, typename Executor, typename EndpointSequence>
+typename Protocol::endpoint connect(basic_socket<Protocol, Executor>& s,
+ const EndpointSequence& endpoints, asio::error_code& ec,
+ constraint_t<is_endpoint_sequence<EndpointSequence>::value> = 0);
+
+#if !defined(ASIO_NO_DEPRECATED)
+/// (Deprecated: Use range overload.) 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 <typename Protocol, typename Executor, typename Iterator>
+Iterator connect(basic_socket<Protocol, Executor>& s, Iterator begin,
+ constraint_t<!is_endpoint_sequence<Iterator>::value> = 0);
+
+/// (Deprecated: Use range overload.) 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 <typename Protocol, typename Executor, typename Iterator>
+Iterator connect(basic_socket<Protocol, Executor>& s,
+ Iterator begin, asio::error_code& ec,
+ constraint_t<!is_endpoint_sequence<Iterator>::value> = 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(my_context);
+ * tcp::resolver::query q("host", "service");
+ * tcp::resolver::results_type e = r.resolve(q);
+ * tcp::socket s(my_context);
+ * asio::connect(s, e.begin(), e.end()); @endcode
+ */
+template <typename Protocol, typename Executor, typename Iterator>
+Iterator connect(basic_socket<Protocol, Executor>& 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(my_context);
+ * tcp::resolver::query q("host", "service");
+ * tcp::resolver::results_type e = r.resolve(q);
+ * tcp::socket s(my_context);
+ * asio::error_code ec;
+ * asio::connect(s, e.begin(), e.end(), ec);
+ * if (ec)
+ * {
+ * // An error occurred.
+ * } @endcode
+ */
+template <typename Protocol, typename Executor, typename Iterator>
+Iterator connect(basic_socket<Protocol, Executor>& 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(my_context);
+ * tcp::resolver::query q("host", "service");
+ * tcp::socket s(my_context);
+ * tcp::endpoint e = asio::connect(s,
+ * r.resolve(q), my_connect_condition());
+ * std::cout << "Connected to: " << e << std::endl; @endcode
+ */
+template <typename Protocol, typename Executor,
+ typename EndpointSequence, typename ConnectCondition>
+typename Protocol::endpoint connect(basic_socket<Protocol, Executor>& s,
+ const EndpointSequence& endpoints, ConnectCondition connect_condition,
+ constraint_t<is_endpoint_sequence<EndpointSequence>::value> = 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(my_context);
+ * tcp::resolver::query q("host", "service");
+ * tcp::socket s(my_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, typename Executor,
+ typename EndpointSequence, typename ConnectCondition>
+typename Protocol::endpoint connect(basic_socket<Protocol, Executor>& s,
+ const EndpointSequence& endpoints, ConnectCondition connect_condition,
+ asio::error_code& ec,
+ constraint_t<is_endpoint_sequence<EndpointSequence>::value> = 0);
+
+#if !defined(ASIO_NO_DEPRECATED)
+/// (Deprecated: Use range overload.) 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 <typename Protocol, typename Executor,
+ typename Iterator, typename ConnectCondition>
+Iterator connect(basic_socket<Protocol, Executor>& s,
+ Iterator begin, ConnectCondition connect_condition,
+ constraint_t<!is_endpoint_sequence<Iterator>::value> = 0);
+
+/// (Deprecated: Use range overload.) 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 <typename Protocol, typename Executor,
+ typename Iterator, typename ConnectCondition>
+Iterator connect(basic_socket<Protocol, Executor>& s, Iterator begin,
+ ConnectCondition connect_condition, asio::error_code& ec,
+ constraint_t<!is_endpoint_sequence<Iterator>::value> = 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(my_context);
+ * tcp::resolver::query q("host", "service");
+ * tcp::resolver::results_type e = r.resolve(q);
+ * tcp::socket s(my_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 <typename Protocol, typename Executor,
+ typename Iterator, typename ConnectCondition>
+Iterator connect(basic_socket<Protocol, Executor>& 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(my_context);
+ * tcp::resolver::query q("host", "service");
+ * tcp::resolver::results_type e = r.resolve(q);
+ * tcp::socket s(my_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 <typename Protocol, typename Executor,
+ typename Iterator, typename ConnectCondition>
+Iterator connect(basic_socket<Protocol, Executor>& s,
+ Iterator begin, Iterator end, ConnectCondition connect_condition,
+ asio::error_code& ec);
+
+/*@}*/
+
+/**
+ * @defgroup async_connect asio::async_connect
+ *
+ * @brief The @c async_connect function is a composed asynchronous operation
+ * that 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. It is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * @param s The socket to be connected. If the socket is already open, it will
+ * be closed.
+ *
+ * @param endpoints A sequence of endpoints.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the connect completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, typename Protocol::endpoint) @endcode
+ *
+ * @par Example
+ * @code tcp::resolver r(my_context);
+ * tcp::resolver::query q("host", "service");
+ * tcp::socket s(my_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
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the socket's @c async_connect operation.
+ */
+template <typename Protocol, typename Executor, typename EndpointSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ typename Protocol::endpoint)) RangeConnectToken
+ = default_completion_token_t<Executor>>
+auto async_connect(basic_socket<Protocol, Executor>& s,
+ const EndpointSequence& endpoints,
+ RangeConnectToken&& token = default_completion_token_t<Executor>(),
+ constraint_t<is_endpoint_sequence<EndpointSequence>::value> = 0)
+ -> decltype(
+ async_initiate<RangeConnectToken,
+ void (asio::error_code, typename Protocol::endpoint)>(
+ declval<detail::initiate_async_range_connect<Protocol, Executor>>(),
+ token, endpoints, declval<detail::default_connect_condition>()));
+
+#if !defined(ASIO_NO_DEPRECATED)
+/// (Deprecated: Use range overload.) 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. It is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * @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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the connect completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, Iterator) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the socket's @c async_connect operation.
+ */
+template <typename Protocol, typename Executor, typename Iterator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ Iterator)) IteratorConnectToken = default_completion_token_t<Executor>>
+auto async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
+ IteratorConnectToken&& token = default_completion_token_t<Executor>(),
+ constraint_t<!is_endpoint_sequence<Iterator>::value> = 0)
+ -> decltype(
+ async_initiate<IteratorConnectToken,
+ void (asio::error_code, Iterator)>(
+ declval<detail::initiate_async_iterator_connect<Protocol, Executor>>(),
+ token, begin, Iterator(),
+ declval<detail::default_connect_condition>()));
+#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. It is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * @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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the connect completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, Iterator) @endcode
+ *
+ * @par Example
+ * @code std::vector<tcp::endpoint> endpoints = ...;
+ * tcp::socket s(my_context);
+ * asio::async_connect(s,
+ * endpoints.begin(), endpoints.end(),
+ * connect_handler);
+ *
+ * // ...
+ *
+ * void connect_handler(
+ * const asio::error_code& ec,
+ * std::vector<tcp::endpoint>::iterator i)
+ * {
+ * // ...
+ * } @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the socket's @c async_connect operation.
+ */
+template <typename Protocol, typename Executor, typename Iterator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ Iterator)) IteratorConnectToken = default_completion_token_t<Executor>>
+auto async_connect(
+ basic_socket<Protocol, Executor>& s, Iterator begin, Iterator end,
+ IteratorConnectToken&& token = default_completion_token_t<Executor>())
+ -> decltype(
+ async_initiate<IteratorConnectToken,
+ void (asio::error_code, Iterator)>(
+ declval<detail::initiate_async_iterator_connect<Protocol, Executor>>(),
+ token, begin, end, declval<detail::default_connect_condition>()));
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * @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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the connect completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, typename Protocol::endpoint) @endcode
+ *
+ * @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(my_context);
+ * tcp::resolver::query q("host", "service");
+ * tcp::socket s(my_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
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the socket's @c async_connect operation.
+ */
+template <typename Protocol, typename Executor,
+ typename EndpointSequence, typename ConnectCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ typename Protocol::endpoint)) RangeConnectToken
+ = default_completion_token_t<Executor>>
+auto async_connect(basic_socket<Protocol, Executor>& s,
+ const EndpointSequence& endpoints, ConnectCondition connect_condition,
+ RangeConnectToken&& token = default_completion_token_t<Executor>(),
+ constraint_t<is_endpoint_sequence<EndpointSequence>::value> = 0)
+ -> decltype(
+ async_initiate<RangeConnectToken,
+ void (asio::error_code, typename Protocol::endpoint)>(
+ declval<detail::initiate_async_range_connect<Protocol, Executor>>(),
+ token, endpoints, connect_condition));
+
+#if !defined(ASIO_NO_DEPRECATED)
+/// (Deprecated: Use range overload.) 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. It is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * @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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the connect completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, Iterator) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the socket's @c async_connect operation.
+ */
+template <typename Protocol, typename Executor,
+ typename Iterator, typename ConnectCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ Iterator)) IteratorConnectToken = default_completion_token_t<Executor>>
+auto async_connect(basic_socket<Protocol, Executor>& s,
+ Iterator begin, ConnectCondition connect_condition,
+ IteratorConnectToken&& token = default_completion_token_t<Executor>(),
+ constraint_t<!is_endpoint_sequence<Iterator>::value> = 0)
+ -> decltype(
+ async_initiate<IteratorConnectToken,
+ void (asio::error_code, Iterator)>(
+ declval<detail::initiate_async_iterator_connect<Protocol, Executor>>(),
+ token, begin, Iterator(), connect_condition));
+#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. It is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * @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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the connect completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, Iterator) @endcode
+ *
+ * @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(my_context);
+ * tcp::resolver::query q("host", "service");
+ * tcp::socket s(my_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
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the socket's @c async_connect operation.
+ */
+template <typename Protocol, typename Executor,
+ typename Iterator, typename ConnectCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ Iterator)) IteratorConnectToken = default_completion_token_t<Executor>>
+auto async_connect(basic_socket<Protocol, Executor>& s,
+ Iterator begin, Iterator end, ConnectCondition connect_condition,
+ IteratorConnectToken&& token = default_completion_token_t<Executor>())
+ -> decltype(
+ async_initiate<IteratorConnectToken,
+ void (asio::error_code, Iterator)>(
+ declval<detail::initiate_async_iterator_connect<Protocol, Executor>>(),
+ token, begin, end, connect_condition));
+
+/*@}*/
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/connect.hpp"
+
+#endif
diff --git a/3rdparty/asio/include/asio/connect_pipe.hpp b/3rdparty/asio/include/asio/connect_pipe.hpp
new file mode 100644
index 00000000000..1c9eb79383f
--- /dev/null
+++ b/3rdparty/asio/include/asio/connect_pipe.hpp
@@ -0,0 +1,83 @@
+//
+// connect_pipe.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_PIPE_HPP
+#define ASIO_CONNECT_PIPE_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_PIPE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/basic_readable_pipe.hpp"
+#include "asio/basic_writable_pipe.hpp"
+#include "asio/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+#if defined(ASIO_HAS_IOCP)
+typedef HANDLE native_pipe_handle;
+#else // defined(ASIO_HAS_IOCP)
+typedef int native_pipe_handle;
+#endif // defined(ASIO_HAS_IOCP)
+
+ASIO_DECL void create_pipe(native_pipe_handle p[2],
+ asio::error_code& ec);
+
+ASIO_DECL void close_pipe(native_pipe_handle p);
+
+} // namespace detail
+
+/// Connect two pipe ends using an anonymous pipe.
+/**
+ * @param read_end The read end of the pipe.
+ *
+ * @param write_end The write end of the pipe.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+template <typename Executor1, typename Executor2>
+void connect_pipe(basic_readable_pipe<Executor1>& read_end,
+ basic_writable_pipe<Executor2>& write_end);
+
+/// Connect two pipe ends using an anonymous pipe.
+/**
+ * @param read_end The read end of the pipe.
+ *
+ * @param write_end The write end of the pipe.
+ *
+ * @throws asio::system_error Thrown on failure.
+ *
+ * @param ec Set to indicate what error occurred, if any.
+ */
+template <typename Executor1, typename Executor2>
+ASIO_SYNC_OP_VOID connect_pipe(basic_readable_pipe<Executor1>& read_end,
+ basic_writable_pipe<Executor2>& write_end, asio::error_code& ec);
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/connect_pipe.hpp"
+#if defined(ASIO_HEADER_ONLY)
+# include "asio/impl/connect_pipe.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // defined(ASIO_HAS_PIPE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_CONNECT_PIPE_HPP
diff --git a/3rdparty/asio/include/asio/consign.hpp b/3rdparty/asio/include/asio/consign.hpp
new file mode 100644
index 00000000000..4b0bc431309
--- /dev/null
+++ b/3rdparty/asio/include/asio/consign.hpp
@@ -0,0 +1,75 @@
+//
+// consign.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_CONSIGN_HPP
+#define ASIO_CONSIGN_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <tuple>
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Completion token type used to specify that the completion handler should
+/// carry additional values along with it.
+/**
+ * This completion token adapter is typically used to keep at least one copy of
+ * an object, such as a smart pointer, alive until the completion handler is
+ * called.
+ */
+template <typename CompletionToken, typename... Values>
+class consign_t
+{
+public:
+ /// Constructor.
+ template <typename T, typename... V>
+ constexpr explicit consign_t(T&& completion_token, V&&... values)
+ : token_(static_cast<T&&>(completion_token)),
+ values_(static_cast<V&&>(values)...)
+ {
+ }
+
+#if defined(GENERATING_DOCUMENTATION)
+private:
+#endif // defined(GENERATING_DOCUMENTATION)
+ CompletionToken token_;
+ std::tuple<Values...> values_;
+};
+
+/// Completion token adapter used to specify that the completion handler should
+/// carry additional values along with it.
+/**
+ * This completion token adapter is typically used to keep at least one copy of
+ * an object, such as a smart pointer, alive until the completion handler is
+ * called.
+ */
+template <typename CompletionToken, typename... Values>
+ASIO_NODISCARD inline constexpr
+consign_t<decay_t<CompletionToken>, decay_t<Values>...>
+consign(CompletionToken&& completion_token, Values&&... values)
+{
+ return consign_t<decay_t<CompletionToken>, decay_t<Values>...>(
+ static_cast<CompletionToken&&>(completion_token),
+ static_cast<Values&&>(values)...);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/consign.hpp"
+
+#endif // ASIO_CONSIGN_HPP
diff --git a/3rdparty/asio/include/asio/coroutine.hpp b/3rdparty/asio/include/asio/coroutine.hpp
new file mode 100644
index 00000000000..036e5148ad0
--- /dev/null
+++ b/3rdparty/asio/include/asio/coroutine.hpp
@@ -0,0 +1,329 @@
+//
+// coroutine.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <asio/yield.hpp>@endcode
+ *
+ * and may conversely be undefined as follows:
+ *
+ * @code #include <asio/unyield.hpp>@endcode
+ *
+ * <b>reenter</b>
+ *
+ * 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.
+ *
+ * <b>yield <em>statement</em></b>
+ *
+ * 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
+ *
+ * <b>yield return <em>expression</em> ;</b>
+ *
+ * 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.
+ *
+ * <b>yield ;</b>
+ *
+ * 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
+ *
+ * <b>yield break ;</b>
+ *
+ * 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.
+ *
+ * <b>fork <em>statement</em></b>
+ *
+ * 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(my_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 asio::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(const coroutine_ref&) = default;
+ ~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/3rdparty/asio/include/asio/deadline_timer.hpp b/3rdparty/asio/include/asio/deadline_timer.hpp
new file mode 100644
index 00000000000..dfa0b9ca169
--- /dev/null
+++ b/3rdparty/asio/include/asio/deadline_timer.hpp
@@ -0,0 +1,38 @@
+//
+// deadline_timer.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <boost/date_time/posix_time/posix_time_types.hpp>
+
+namespace asio {
+
+/// Typedef for the typical usage of timer. Uses a UTC clock.
+typedef basic_deadline_timer<boost::posix_time::ptime> deadline_timer;
+
+} // namespace asio
+
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_DEADLINE_TIMER_HPP
diff --git a/3rdparty/asio/include/asio/defer.hpp b/3rdparty/asio/include/asio/defer.hpp
new file mode 100644
index 00000000000..608debe4d91
--- /dev/null
+++ b/3rdparty/asio/include/asio/defer.hpp
@@ -0,0 +1,218 @@
+//
+// defer.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/initiate_defer.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/execution/blocking.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/is_executor.hpp"
+#include "asio/require.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 <tt>defer()</tt>.
+ *
+ * The use of @c defer(), rather than @ref post(), indicates the caller's
+ * preference that the executor defer the queueing of the function object. This
+ * may allow the executor to optimise queueing for cases when the function
+ * object represents a continuation of the current call context.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler. The function signature of the completion handler must be:
+ * @code void handler(); @endcode
+ *
+ * @returns This function returns <tt>async_initiate<NullaryToken,
+ * void()>(Init{}, token)</tt>, where @c Init is a function object type defined
+ * as:
+ *
+ * @code class Init
+ * {
+ * public:
+ * template <typename CompletionHandler>
+ * void operator()(CompletionHandler&& completion_handler) const;
+ * }; @endcode
+ *
+ * The function call operator of @c Init:
+ *
+ * @li Obtains the handler's associated executor object @c ex of type @c Ex by
+ * performing @code auto ex = get_associated_executor(handler); @endcode
+ *
+ * @li Obtains the handler's associated allocator object @c alloc by performing
+ * @code auto alloc = get_associated_allocator(handler); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex>::value</tt> is true, performs
+ * @code prefer(
+ * require(ex, execution::blocking.never),
+ * execution::relationship.continuation,
+ * execution::allocator(alloc)
+ * ).execute(std::forward<CompletionHandler>(completion_handler)); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex>::value</tt> is false, performs
+ * @code ex.defer(
+ * std::forward<CompletionHandler>(completion_handler),
+ * alloc); @endcode
+ *
+ * @par Completion Signature
+ * @code void() @endcode
+ */
+template <ASIO_COMPLETION_TOKEN_FOR(void()) NullaryToken>
+auto defer(NullaryToken&& token)
+ -> decltype(
+ async_initiate<NullaryToken, void()>(
+ declval<detail::initiate_defer>(), token))
+{
+ return async_initiate<NullaryToken, void()>(
+ detail::initiate_defer(), 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 <tt>defer()</tt>.
+ *
+ * The use of @c defer(), rather than @ref post(), indicates the caller's
+ * preference that the executor defer the queueing of the function object. This
+ * may allow the executor to optimise queueing for cases when the function
+ * object represents a continuation of the current call context.
+ *
+ * @param ex The target executor.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler. The function signature of the completion handler must be:
+ * @code void handler(); @endcode
+ *
+ * @returns This function returns <tt>async_initiate<NullaryToken,
+ * void()>(Init{ex}, token)</tt>, where @c Init is a function object type
+ * defined as:
+ *
+ * @code class Init
+ * {
+ * public:
+ * using executor_type = Executor;
+ * explicit Init(const Executor& ex) : ex_(ex) {}
+ * executor_type get_executor() const noexcept { return ex_; }
+ * template <typename CompletionHandler>
+ * void operator()(CompletionHandler&& completion_handler) const;
+ * private:
+ * Executor ex_; // exposition only
+ * }; @endcode
+ *
+ * The function call operator of @c Init:
+ *
+ * @li Obtains the handler's associated executor object @c ex1 of type @c Ex1 by
+ * performing @code auto ex1 = get_associated_executor(handler, ex); @endcode
+ *
+ * @li Obtains the handler's associated allocator object @c alloc by performing
+ * @code auto alloc = get_associated_allocator(handler); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex1>::value</tt> is true, constructs a
+ * function object @c f with a member @c executor_ that is initialised with
+ * <tt>prefer(ex1, execution::outstanding_work.tracked)</tt>, a member @c
+ * handler_ that is a decay-copy of @c completion_handler, and a function call
+ * operator that performs:
+ * @code auto a = get_associated_allocator(handler_);
+ * prefer(executor_, execution::allocator(a)).execute(std::move(handler_));
+ * @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex1>::value</tt> is false, constructs a
+ * function object @c f with a member @c work_ that is initialised with
+ * <tt>make_work_guard(ex1)</tt>, a member @c handler_ that is a decay-copy of
+ * @c completion_handler, and a function call operator that performs:
+ * @code auto a = get_associated_allocator(handler_);
+ * work_.get_executor().dispatch(std::move(handler_), a);
+ * work_.reset(); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex>::value</tt> is true, performs
+ * @code prefer(
+ * require(ex, execution::blocking.never),
+ * execution::relationship.continuation,
+ * execution::allocator(alloc)
+ * ).execute(std::move(f)); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex>::value</tt> is false, performs
+ * @code ex.defer(std::move(f), alloc); @endcode
+ *
+ * @par Completion Signature
+ * @code void() @endcode
+ */
+template <typename Executor,
+ ASIO_COMPLETION_TOKEN_FOR(void()) NullaryToken
+ = default_completion_token_t<Executor>>
+auto defer(const Executor& ex,
+ NullaryToken&& token
+ = default_completion_token_t<Executor>(),
+ constraint_t<
+ (execution::is_executor<Executor>::value
+ && can_require<Executor, execution::blocking_t::never_t>::value)
+ || is_executor<Executor>::value
+ > = 0)
+ -> decltype(
+ async_initiate<NullaryToken, void()>(
+ declval<detail::initiate_defer_with_executor<Executor>>(), token))
+{
+ return async_initiate<NullaryToken, void()>(
+ detail::initiate_defer_with_executor<Executor>(ex), token);
+}
+
+/// Submits a completion token or function object for execution.
+/**
+ * @param ctx An execution context, from which the target executor is obtained.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler. The function signature of the completion handler must be:
+ * @code void handler(); @endcode
+ *
+ * @returns <tt>defer(ctx.get_executor(), forward<NullaryToken>(token))</tt>.
+ *
+ * @par Completion Signature
+ * @code void() @endcode
+ */
+template <typename ExecutionContext,
+ ASIO_COMPLETION_TOKEN_FOR(void()) NullaryToken
+ = default_completion_token_t<typename ExecutionContext::executor_type>>
+auto defer(ExecutionContext& ctx,
+ NullaryToken&& token
+ = default_completion_token_t<typename ExecutionContext::executor_type>(),
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ -> decltype(
+ async_initiate<NullaryToken, void()>(
+ declval<detail::initiate_defer_with_executor<
+ typename ExecutionContext::executor_type>>(), token))
+{
+ return async_initiate<NullaryToken, void()>(
+ detail::initiate_defer_with_executor<
+ typename ExecutionContext::executor_type>(
+ ctx.get_executor()), token);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DEFER_HPP
diff --git a/3rdparty/asio/include/asio/deferred.hpp b/3rdparty/asio/include/asio/deferred.hpp
new file mode 100644
index 00000000000..b919f249553
--- /dev/null
+++ b/3rdparty/asio/include/asio/deferred.hpp
@@ -0,0 +1,715 @@
+//
+// deferred.hpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_DEFERRED_HPP
+#define ASIO_DEFERRED_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <tuple>
+#include "asio/associator.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/detail/utility.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Trait for detecting objects that are usable as deferred operations.
+template <typename T>
+struct is_deferred : false_type
+{
+};
+
+/// Helper type to wrap multiple completion signatures.
+template <typename... Signatures>
+struct deferred_signatures
+{
+};
+
+namespace detail {
+
+// Helper trait for getting the completion signatures of the tail in a sequence
+// when invoked with the specified arguments.
+
+template <typename Tail, typename... Signatures>
+struct deferred_sequence_signatures;
+
+template <typename Tail, typename R, typename... Args, typename... Signatures>
+struct deferred_sequence_signatures<Tail, R(Args...), Signatures...>
+ : completion_signature_of<decltype(declval<Tail>()(declval<Args>()...))>
+{
+ static_assert(
+ !is_same<decltype(declval<Tail>()(declval<Args>()...)), void>::value,
+ "deferred functions must produce a deferred return type");
+};
+
+// Completion handler for the head component of a deferred sequence.
+template <typename Handler, typename Tail>
+class deferred_sequence_handler
+{
+public:
+ template <typename H, typename T>
+ explicit deferred_sequence_handler(H&& handler, T&& tail)
+ : handler_(static_cast<H&&>(handler)),
+ tail_(static_cast<T&&>(tail))
+ {
+ }
+
+ template <typename... Args>
+ void operator()(Args&&... args)
+ {
+ static_cast<Tail&&>(tail_)(
+ static_cast<Args&&>(args)...)(
+ static_cast<Handler&&>(handler_));
+ }
+
+//private:
+ Handler handler_;
+ Tail tail_;
+};
+
+template <typename Head, typename Tail, typename... Signatures>
+class deferred_sequence_base
+{
+private:
+ struct initiate
+ {
+ template <typename Handler>
+ void operator()(Handler&& handler, Head head, Tail&& tail)
+ {
+ static_cast<Head&&>(head)(
+ deferred_sequence_handler<decay_t<Handler>, decay_t<Tail>>(
+ static_cast<Handler&&>(handler), static_cast<Tail&&>(tail)));
+ }
+ };
+
+ Head head_;
+ Tail tail_;
+
+public:
+ template <typename H, typename T>
+ constexpr explicit deferred_sequence_base(H&& head, T&& tail)
+ : head_(static_cast<H&&>(head)),
+ tail_(static_cast<T&&>(tail))
+ {
+ }
+
+ template <ASIO_COMPLETION_TOKEN_FOR(Signatures...) CompletionToken>
+ auto operator()(CompletionToken&& token) &&
+ -> decltype(
+ async_initiate<CompletionToken, Signatures...>(
+ initiate(), token, static_cast<Head&&>(this->head_),
+ static_cast<Tail&&>(this->tail_)))
+ {
+ return async_initiate<CompletionToken, Signatures...>(initiate(),
+ token, static_cast<Head&&>(head_), static_cast<Tail&&>(tail_));
+ }
+
+ template <ASIO_COMPLETION_TOKEN_FOR(Signatures...) CompletionToken>
+ auto operator()(CompletionToken&& token) const &
+ -> decltype(
+ async_initiate<CompletionToken, Signatures...>(
+ initiate(), token, this->head_, this->tail_))
+ {
+ return async_initiate<CompletionToken, Signatures...>(
+ initiate(), token, head_, tail_);
+ }
+};
+
+// Two-step application of variadic Signatures to determine correct base type.
+
+template <typename Head, typename Tail>
+struct deferred_sequence_types
+{
+ template <typename... Signatures>
+ struct op1
+ {
+ typedef deferred_sequence_base<Head, Tail, Signatures...> type;
+ };
+
+ template <typename... Signatures>
+ struct op2
+ {
+ typedef typename deferred_sequence_signatures<Tail, Signatures...>::template
+ apply<op1>::type::type type;
+ };
+
+ typedef typename completion_signature_of<Head>::template
+ apply<op2>::type::type base;
+};
+
+} // namespace detail
+
+/// Used to represent an empty deferred action.
+struct deferred_noop
+{
+ /// No effect.
+ template <typename... Args>
+ void operator()(Args&&...) &&
+ {
+ }
+
+ /// No effect.
+ template <typename... Args>
+ void operator()(Args&&...) const &
+ {
+ }
+};
+
+#if !defined(GENERATING_DOCUMENTATION)
+template <>
+struct is_deferred<deferred_noop> : true_type
+{
+};
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+/// Tag type to disambiguate deferred constructors.
+struct deferred_init_tag {};
+
+/// Wraps a function object so that it may be used as an element in a deferred
+/// composition.
+template <typename Function>
+class deferred_function
+{
+public:
+ /// Constructor.
+ template <typename F>
+ constexpr explicit deferred_function(deferred_init_tag, F&& function)
+ : function_(static_cast<F&&>(function))
+ {
+ }
+
+//private:
+ Function function_;
+
+public:
+ template <typename... Args>
+ auto operator()(Args&&... args) &&
+ -> decltype(
+ static_cast<Function&&>(this->function_)(static_cast<Args&&>(args)...))
+ {
+ return static_cast<Function&&>(function_)(static_cast<Args&&>(args)...);
+ }
+
+ template <typename... Args>
+ auto operator()(Args&&... args) const &
+ -> decltype(Function(function_)(static_cast<Args&&>(args)...))
+ {
+ return Function(function_)(static_cast<Args&&>(args)...);
+ }
+};
+
+#if !defined(GENERATING_DOCUMENTATION)
+template <typename Function>
+struct is_deferred<deferred_function<Function>> : true_type
+{
+};
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+/// Encapsulates deferred values.
+template <typename... Values>
+class ASIO_NODISCARD deferred_values
+{
+private:
+ std::tuple<Values...> values_;
+
+ struct initiate
+ {
+ template <typename Handler, typename... V>
+ void operator()(Handler handler, V&&... values)
+ {
+ static_cast<Handler&&>(handler)(static_cast<V&&>(values)...);
+ }
+ };
+
+ template <typename CompletionToken, std::size_t... I>
+ auto invoke_helper(CompletionToken&& token, detail::index_sequence<I...>)
+ -> decltype(
+ async_initiate<CompletionToken, void(Values...)>(initiate(), token,
+ std::get<I>(static_cast<std::tuple<Values...>&&>(this->values_))...))
+ {
+ return async_initiate<CompletionToken, void(Values...)>(initiate(), token,
+ std::get<I>(static_cast<std::tuple<Values...>&&>(values_))...);
+ }
+
+ template <typename CompletionToken, std::size_t... I>
+ auto const_invoke_helper(CompletionToken&& token,
+ detail::index_sequence<I...>)
+ -> decltype(
+ async_initiate<CompletionToken, void(Values...)>(
+ initiate(), token, std::get<I>(values_)...))
+ {
+ return async_initiate<CompletionToken, void(Values...)>(
+ initiate(), token, std::get<I>(values_)...);
+ }
+
+public:
+ /// Construct a deferred asynchronous operation from the arguments to an
+ /// initiation function object.
+ template <typename... V>
+ constexpr explicit deferred_values(
+ deferred_init_tag, V&&... values)
+ : values_(static_cast<V&&>(values)...)
+ {
+ }
+
+ /// Initiate the deferred operation using the supplied completion token.
+ template <ASIO_COMPLETION_TOKEN_FOR(void(Values...)) CompletionToken>
+ auto operator()(CompletionToken&& token) &&
+ -> decltype(
+ this->invoke_helper(
+ static_cast<CompletionToken&&>(token),
+ detail::index_sequence_for<Values...>()))
+ {
+ return this->invoke_helper(
+ static_cast<CompletionToken&&>(token),
+ detail::index_sequence_for<Values...>());
+ }
+
+ template <ASIO_COMPLETION_TOKEN_FOR(void(Values...)) CompletionToken>
+ auto operator()(CompletionToken&& token) const &
+ -> decltype(
+ this->const_invoke_helper(
+ static_cast<CompletionToken&&>(token),
+ detail::index_sequence_for<Values...>()))
+ {
+ return this->const_invoke_helper(
+ static_cast<CompletionToken&&>(token),
+ detail::index_sequence_for<Values...>());
+ }
+};
+
+#if !defined(GENERATING_DOCUMENTATION)
+template <typename... Values>
+struct is_deferred<deferred_values<Values...>> : true_type
+{
+};
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+/// Encapsulates a deferred asynchronous operation.
+template <typename Signature, typename Initiation, typename... InitArgs>
+class ASIO_NODISCARD deferred_async_operation
+{
+private:
+ typedef decay_t<Initiation> initiation_t;
+ initiation_t initiation_;
+ typedef std::tuple<decay_t<InitArgs>...> init_args_t;
+ init_args_t init_args_;
+
+ template <typename CompletionToken, std::size_t... I>
+ auto invoke_helper(CompletionToken&& token, detail::index_sequence<I...>)
+ -> decltype(
+ async_initiate<CompletionToken, Signature>(
+ static_cast<initiation_t&&>(initiation_), token,
+ std::get<I>(static_cast<init_args_t&&>(init_args_))...))
+ {
+ return async_initiate<CompletionToken, Signature>(
+ static_cast<initiation_t&&>(initiation_), token,
+ std::get<I>(static_cast<init_args_t&&>(init_args_))...);
+ }
+
+ template <typename CompletionToken, std::size_t... I>
+ auto const_invoke_helper(CompletionToken&& token,
+ detail::index_sequence<I...>) const &
+ -> decltype(
+ async_initiate<CompletionToken, Signature>(
+ initiation_t(initiation_), token, std::get<I>(init_args_)...))
+ {
+ return async_initiate<CompletionToken, Signature>(
+ initiation_t(initiation_), token, std::get<I>(init_args_)...);
+ }
+
+public:
+ /// Construct a deferred asynchronous operation from the arguments to an
+ /// initiation function object.
+ template <typename I, typename... A>
+ constexpr explicit deferred_async_operation(
+ deferred_init_tag, I&& initiation, A&&... init_args)
+ : initiation_(static_cast<I&&>(initiation)),
+ init_args_(static_cast<A&&>(init_args)...)
+ {
+ }
+
+ /// Initiate the asynchronous operation using the supplied completion token.
+ template <ASIO_COMPLETION_TOKEN_FOR(Signature) CompletionToken>
+ auto operator()(CompletionToken&& token) &&
+ -> decltype(
+ this->invoke_helper(
+ static_cast<CompletionToken&&>(token),
+ detail::index_sequence_for<InitArgs...>()))
+ {
+ return this->invoke_helper(
+ static_cast<CompletionToken&&>(token),
+ detail::index_sequence_for<InitArgs...>());
+ }
+
+ template <ASIO_COMPLETION_TOKEN_FOR(Signature) CompletionToken>
+ auto operator()(CompletionToken&& token) const &
+ -> decltype(
+ this->const_invoke_helper(
+ static_cast<CompletionToken&&>(token),
+ detail::index_sequence_for<InitArgs...>()))
+ {
+ return this->const_invoke_helper(
+ static_cast<CompletionToken&&>(token),
+ detail::index_sequence_for<InitArgs...>());
+ }
+};
+
+/// Encapsulates a deferred asynchronous operation thas has multiple completion
+/// signatures.
+template <typename... Signatures, typename Initiation, typename... InitArgs>
+class ASIO_NODISCARD deferred_async_operation<
+ deferred_signatures<Signatures...>, Initiation, InitArgs...>
+{
+private:
+ typedef decay_t<Initiation> initiation_t;
+ initiation_t initiation_;
+ typedef std::tuple<decay_t<InitArgs>...> init_args_t;
+ init_args_t init_args_;
+
+ template <typename CompletionToken, std::size_t... I>
+ auto invoke_helper(CompletionToken&& token, detail::index_sequence<I...>)
+ -> decltype(
+ async_initiate<CompletionToken, Signatures...>(
+ static_cast<initiation_t&&>(initiation_), token,
+ std::get<I>(static_cast<init_args_t&&>(init_args_))...))
+ {
+ return async_initiate<CompletionToken, Signatures...>(
+ static_cast<initiation_t&&>(initiation_), token,
+ std::get<I>(static_cast<init_args_t&&>(init_args_))...);
+ }
+
+ template <typename CompletionToken, std::size_t... I>
+ auto const_invoke_helper(CompletionToken&& token,
+ detail::index_sequence<I...>) const &
+ -> decltype(
+ async_initiate<CompletionToken, Signatures...>(
+ initiation_t(initiation_), token, std::get<I>(init_args_)...))
+ {
+ return async_initiate<CompletionToken, Signatures...>(
+ initiation_t(initiation_), token, std::get<I>(init_args_)...);
+ }
+
+public:
+ /// Construct a deferred asynchronous operation from the arguments to an
+ /// initiation function object.
+ template <typename I, typename... A>
+ constexpr explicit deferred_async_operation(
+ deferred_init_tag, I&& initiation, A&&... init_args)
+ : initiation_(static_cast<I&&>(initiation)),
+ init_args_(static_cast<A&&>(init_args)...)
+ {
+ }
+
+ /// Initiate the asynchronous operation using the supplied completion token.
+ template <ASIO_COMPLETION_TOKEN_FOR(Signatures...) CompletionToken>
+ auto operator()(CompletionToken&& token) &&
+ -> decltype(
+ this->invoke_helper(
+ static_cast<CompletionToken&&>(token),
+ detail::index_sequence_for<InitArgs...>()))
+ {
+ return this->invoke_helper(
+ static_cast<CompletionToken&&>(token),
+ detail::index_sequence_for<InitArgs...>());
+ }
+
+ template <ASIO_COMPLETION_TOKEN_FOR(Signatures...) CompletionToken>
+ auto operator()(CompletionToken&& token) const &
+ -> decltype(
+ this->const_invoke_helper(
+ static_cast<CompletionToken&&>(token),
+ detail::index_sequence_for<InitArgs...>()))
+ {
+ return this->const_invoke_helper(
+ static_cast<CompletionToken&&>(token),
+ detail::index_sequence_for<InitArgs...>());
+ }
+};
+
+#if !defined(GENERATING_DOCUMENTATION)
+template <typename Signature, typename Initiation, typename... InitArgs>
+struct is_deferred<
+ deferred_async_operation<Signature, Initiation, InitArgs...>> : true_type
+{
+};
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+/// Defines a link between two consecutive operations in a sequence.
+template <typename Head, typename Tail>
+class ASIO_NODISCARD deferred_sequence :
+ public detail::deferred_sequence_types<Head, Tail>::base
+{
+public:
+ template <typename H, typename T>
+ constexpr explicit deferred_sequence(deferred_init_tag, H&& head, T&& tail)
+ : detail::deferred_sequence_types<Head, Tail>::base(
+ static_cast<H&&>(head), static_cast<T&&>(tail))
+ {
+ }
+
+#if defined(GENERATING_DOCUMENTATION)
+ template <typename CompletionToken>
+ auto operator()(CompletionToken&& token) &&;
+
+ template <typename CompletionToken>
+ auto operator()(CompletionToken&& token) const &;
+#endif // defined(GENERATING_DOCUMENTATION)
+};
+
+#if !defined(GENERATING_DOCUMENTATION)
+template <typename Head, typename Tail>
+struct is_deferred<deferred_sequence<Head, Tail>> : true_type
+{
+};
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+/// Used to represent a deferred conditional branch.
+template <typename OnTrue = deferred_noop, typename OnFalse = deferred_noop>
+class ASIO_NODISCARD deferred_conditional
+{
+private:
+ template <typename T, typename F> friend class deferred_conditional;
+
+ // Helper constructor.
+ template <typename T, typename F>
+ explicit deferred_conditional(bool b, T&& on_true, F&& on_false)
+ : on_true_(static_cast<T&&>(on_true)),
+ on_false_(static_cast<F&&>(on_false)),
+ bool_(b)
+ {
+ }
+
+ OnTrue on_true_;
+ OnFalse on_false_;
+ bool bool_;
+
+public:
+ /// Construct a deferred conditional with the value to determine which branch
+ /// will be executed.
+ constexpr explicit deferred_conditional(bool b)
+ : on_true_(),
+ on_false_(),
+ bool_(b)
+ {
+ }
+
+ /// Invoke the conditional branch bsaed on the stored value.
+ template <typename... Args>
+ auto operator()(Args&&... args) &&
+ -> decltype(static_cast<OnTrue&&>(on_true_)(static_cast<Args&&>(args)...))
+ {
+ if (bool_)
+ {
+ return static_cast<OnTrue&&>(on_true_)(static_cast<Args&&>(args)...);
+ }
+ else
+ {
+ return static_cast<OnFalse&&>(on_false_)(static_cast<Args&&>(args)...);
+ }
+ }
+
+ template <typename... Args>
+ auto operator()(Args&&... args) const &
+ -> decltype(on_true_(static_cast<Args&&>(args)...))
+ {
+ if (bool_)
+ {
+ return on_true_(static_cast<Args&&>(args)...);
+ }
+ else
+ {
+ return on_false_(static_cast<Args&&>(args)...);
+ }
+ }
+
+ /// Set the true branch of the conditional.
+ template <typename T>
+ deferred_conditional<T, OnFalse> then(T on_true,
+ constraint_t<
+ is_deferred<T>::value
+ >* = 0,
+ constraint_t<
+ is_same<
+ conditional_t<true, OnTrue, T>,
+ deferred_noop
+ >::value
+ >* = 0) &&
+ {
+ return deferred_conditional<T, OnFalse>(
+ bool_, static_cast<T&&>(on_true),
+ static_cast<OnFalse&&>(on_false_));
+ }
+
+ /// Set the false branch of the conditional.
+ template <typename T>
+ deferred_conditional<OnTrue, T> otherwise(T on_false,
+ constraint_t<
+ is_deferred<T>::value
+ >* = 0,
+ constraint_t<
+ !is_same<
+ conditional_t<true, OnTrue, T>,
+ deferred_noop
+ >::value
+ >* = 0,
+ constraint_t<
+ is_same<
+ conditional_t<true, OnFalse, T>,
+ deferred_noop
+ >::value
+ >* = 0) &&
+ {
+ return deferred_conditional<OnTrue, T>(
+ bool_, static_cast<OnTrue&&>(on_true_),
+ static_cast<T&&>(on_false));
+ }
+};
+
+#if !defined(GENERATING_DOCUMENTATION)
+template <typename OnTrue, typename OnFalse>
+struct is_deferred<deferred_conditional<OnTrue, OnFalse>> : true_type
+{
+};
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+/// Class used to specify that an asynchronous operation should return a
+/// function object to lazily launch the operation.
+/**
+ * The deferred_t class is used to indicate that an asynchronous operation
+ * should return a function object which is itself an initiation function. A
+ * deferred_t object may be passed as a completion token to an asynchronous
+ * operation, typically using the special value @c asio::deferred. For
+ * example:
+ *
+ * @code auto my_deferred_op
+ * = my_socket.async_read_some(my_buffer,
+ * asio::deferred); @endcode
+ *
+ * The initiating function (async_read_some in the above example) returns a
+ * function object that will lazily initiate the operation.
+ */
+class deferred_t
+{
+public:
+ /// Default constructor.
+ constexpr deferred_t()
+ {
+ }
+
+ /// Adapts an executor to add the @c deferred_t completion token as the
+ /// default.
+ template <typename InnerExecutor>
+ struct executor_with_default : InnerExecutor
+ {
+ /// Specify @c deferred_t as the default completion token type.
+ typedef deferred_t default_completion_token_type;
+
+ /// Construct the adapted executor from the inner executor type.
+ template <typename InnerExecutor1>
+ executor_with_default(const InnerExecutor1& ex,
+ constraint_t<
+ conditional_t<
+ !is_same<InnerExecutor1, executor_with_default>::value,
+ is_convertible<InnerExecutor1, InnerExecutor>,
+ false_type
+ >::value
+ > = 0) noexcept
+ : InnerExecutor(ex)
+ {
+ }
+ };
+
+ /// Type alias to adapt an I/O object to use @c deferred_t as its
+ /// default completion token type.
+ template <typename T>
+ using as_default_on_t = typename T::template rebind_executor<
+ executor_with_default<typename T::executor_type>>::other;
+
+ /// Function helper to adapt an I/O object to use @c deferred_t as its
+ /// default completion token type.
+ template <typename T>
+ static typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other
+ as_default_on(T&& object)
+ {
+ return typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other(static_cast<T&&>(object));
+ }
+
+ /// Creates a new deferred from a function.
+ template <typename Function>
+ constraint_t<
+ !is_deferred<decay_t<Function>>::value,
+ deferred_function<decay_t<Function>>
+ > operator()(Function&& function) const
+ {
+ return deferred_function<decay_t<Function>>(
+ deferred_init_tag{}, static_cast<Function&&>(function));
+ }
+
+ /// Passes through anything that is already deferred.
+ template <typename T>
+ constraint_t<
+ is_deferred<decay_t<T>>::value,
+ decay_t<T>
+ > operator()(T&& t) const
+ {
+ return static_cast<T&&>(t);
+ }
+
+ /// Returns a deferred operation that returns the provided values.
+ template <typename... Args>
+ static constexpr deferred_values<decay_t<Args>...> values(Args&&... args)
+ {
+ return deferred_values<decay_t<Args>...>(
+ deferred_init_tag{}, static_cast<Args&&>(args)...);
+ }
+
+ /// Creates a conditional object for branching deferred operations.
+ static constexpr deferred_conditional<> when(bool b)
+ {
+ return deferred_conditional<>(b);
+ }
+};
+
+/// Pipe operator used to chain deferred operations.
+template <typename Head, typename Tail>
+inline auto operator|(Head head, Tail&& tail)
+ -> constraint_t<
+ is_deferred<Head>::value,
+ decltype(static_cast<Head&&>(head)(static_cast<Tail&&>(tail)))
+ >
+{
+ return static_cast<Head&&>(head)(static_cast<Tail&&>(tail));
+}
+
+/// A @ref completion_token object used to specify that an asynchronous
+/// operation should return a function object to lazily launch the operation.
+/**
+ * See the documentation for asio::deferred_t for a usage example.
+ */
+constexpr deferred_t deferred;
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/deferred.hpp"
+
+#endif // ASIO_DEFERRED_HPP
diff --git a/3rdparty/asio/include/asio/detached.hpp b/3rdparty/asio/include/asio/detached.hpp
new file mode 100644
index 00000000000..b71bd9d978b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detached.hpp
@@ -0,0 +1,105 @@
+//
+// detached.hpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_DETACHED_HPP
+#define ASIO_DETACHED_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <memory>
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// A @ref completion_token type 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::detached. For example:
+ *
+ * @code my_socket.async_send(my_buffer, asio::detached);
+ * @endcode
+ */
+class detached_t
+{
+public:
+ /// Constructor.
+ constexpr detached_t()
+ {
+ }
+
+ /// Adapts an executor to add the @c detached_t completion token as the
+ /// default.
+ template <typename InnerExecutor>
+ struct executor_with_default : InnerExecutor
+ {
+ /// Specify @c detached_t as the default completion token type.
+ typedef detached_t default_completion_token_type;
+
+ /// Construct the adapted executor from the inner executor type.
+ executor_with_default(const InnerExecutor& ex) noexcept
+ : InnerExecutor(ex)
+ {
+ }
+
+ /// Convert the specified executor to the inner executor type, then use
+ /// that to construct the adapted executor.
+ template <typename OtherExecutor>
+ executor_with_default(const OtherExecutor& ex,
+ constraint_t<
+ is_convertible<OtherExecutor, InnerExecutor>::value
+ > = 0) noexcept
+ : InnerExecutor(ex)
+ {
+ }
+ };
+
+ /// Type alias to adapt an I/O object to use @c detached_t as its
+ /// default completion token type.
+ template <typename T>
+ using as_default_on_t = typename T::template rebind_executor<
+ executor_with_default<typename T::executor_type>>::other;
+
+ /// Function helper to adapt an I/O object to use @c detached_t as its
+ /// default completion token type.
+ template <typename T>
+ static typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other
+ as_default_on(T&& object)
+ {
+ return typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other(static_cast<T&&>(object));
+ }
+};
+
+/// A @ref completion_token object used to specify that an asynchronous
+/// operation is detached.
+/**
+ * See the documentation for asio::detached_t for a usage example.
+ */
+constexpr detached_t detached;
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/detached.hpp"
+
+#endif // ASIO_DETACHED_HPP
diff --git a/3rdparty/asio/include/asio/detail/array.hpp b/3rdparty/asio/include/asio/detail/array.hpp
new file mode 100644
index 00000000000..f2015c7919b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/array.hpp
@@ -0,0 +1,30 @@
+//
+// detail/array.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#include <array>
+
+namespace asio {
+namespace detail {
+
+using std::array;
+
+} // namespace detail
+} // namespace asio
+
+#endif // ASIO_DETAIL_ARRAY_HPP
diff --git a/3rdparty/asio/include/asio/detail/array_fwd.hpp b/3rdparty/asio/include/asio/detail/array_fwd.hpp
new file mode 100644
index 00000000000..79491348a69
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/array_fwd.hpp
@@ -0,0 +1,32 @@
+//
+// detail/array_fwd.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 T, std::size_t N>
+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.
+#include <array>
+
+#endif // ASIO_DETAIL_ARRAY_FWD_HPP
diff --git a/3rdparty/asio/include/asio/detail/assert.hpp b/3rdparty/asio/include/asio/detail/assert.hpp
new file mode 100644
index 00000000000..b53774d9aff
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/assert.hpp
@@ -0,0 +1,32 @@
+//
+// detail/assert.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <boost/assert.hpp>
+#else // defined(ASIO_HAS_BOOST_ASSERT)
+# include <cassert>
+#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/3rdparty/asio/include/asio/detail/atomic_count.hpp b/3rdparty/asio/include/asio/detail/atomic_count.hpp
new file mode 100644
index 00000000000..6116279c89e
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/atomic_count.hpp
@@ -0,0 +1,59 @@
+//
+// detail/atomic_count.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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.
+#else // !defined(ASIO_HAS_THREADS)
+# include <atomic>
+#endif // !defined(ASIO_HAS_THREADS)
+
+namespace asio {
+namespace detail {
+
+#if !defined(ASIO_HAS_THREADS)
+typedef long atomic_count;
+inline void increment(atomic_count& a, long b) { a += b; }
+inline void decrement(atomic_count& a, long b) { a -= b; }
+inline void ref_count_up(atomic_count& a) { ++a; }
+inline bool ref_count_down(atomic_count& a) { return --a == 0; }
+#else // !defined(ASIO_HAS_THREADS)
+typedef std::atomic<long> atomic_count;
+inline void increment(atomic_count& a, long b) { a += b; }
+inline void decrement(atomic_count& a, long b) { a -= b; }
+
+inline void ref_count_up(atomic_count& a)
+{
+ a.fetch_add(1, std::memory_order_relaxed);
+}
+
+inline bool ref_count_down(atomic_count& a)
+{
+ if (a.fetch_sub(1, std::memory_order_release) == 1)
+ {
+ std::atomic_thread_fence(std::memory_order_acquire);
+ return true;
+ }
+ return false;
+}
+#endif // !defined(ASIO_HAS_THREADS)
+
+} // namespace detail
+} // namespace asio
+
+#endif // ASIO_DETAIL_ATOMIC_COUNT_HPP
diff --git a/3rdparty/asio/include/asio/detail/base_from_cancellation_state.hpp b/3rdparty/asio/include/asio/detail/base_from_cancellation_state.hpp
new file mode 100644
index 00000000000..3ce7dcf0b7f
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/base_from_cancellation_state.hpp
@@ -0,0 +1,164 @@
+//
+// detail/base_from_cancellation_state.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CANCELLATION_STATE_HPP
+#define ASIO_DETAIL_BASE_FROM_CANCELLATION_STATE_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_cancellation_slot.hpp"
+#include "asio/cancellation_state.hpp"
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Handler, typename = void>
+class base_from_cancellation_state
+{
+public:
+ typedef cancellation_slot cancellation_slot_type;
+
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return cancellation_state_.slot();
+ }
+
+ cancellation_state get_cancellation_state() const noexcept
+ {
+ return cancellation_state_;
+ }
+
+protected:
+ explicit base_from_cancellation_state(const Handler& handler)
+ : cancellation_state_(
+ asio::get_associated_cancellation_slot(handler))
+ {
+ }
+
+ template <typename Filter>
+ base_from_cancellation_state(const Handler& handler, Filter filter)
+ : cancellation_state_(
+ asio::get_associated_cancellation_slot(handler), filter, filter)
+ {
+ }
+
+ template <typename InFilter, typename OutFilter>
+ base_from_cancellation_state(const Handler& handler,
+ InFilter&& in_filter,
+ OutFilter&& out_filter)
+ : cancellation_state_(
+ asio::get_associated_cancellation_slot(handler),
+ static_cast<InFilter&&>(in_filter),
+ static_cast<OutFilter&&>(out_filter))
+ {
+ }
+
+ void reset_cancellation_state(const Handler& handler)
+ {
+ cancellation_state_ = cancellation_state(
+ asio::get_associated_cancellation_slot(handler));
+ }
+
+ template <typename Filter>
+ void reset_cancellation_state(const Handler& handler, Filter filter)
+ {
+ cancellation_state_ = cancellation_state(
+ asio::get_associated_cancellation_slot(handler), filter, filter);
+ }
+
+ template <typename InFilter, typename OutFilter>
+ void reset_cancellation_state(const Handler& handler,
+ InFilter&& in_filter,
+ OutFilter&& out_filter)
+ {
+ cancellation_state_ = cancellation_state(
+ asio::get_associated_cancellation_slot(handler),
+ static_cast<InFilter&&>(in_filter),
+ static_cast<OutFilter&&>(out_filter));
+ }
+
+ cancellation_type_t cancelled() const noexcept
+ {
+ return cancellation_state_.cancelled();
+ }
+
+private:
+ cancellation_state cancellation_state_;
+};
+
+template <typename Handler>
+class base_from_cancellation_state<Handler,
+ enable_if_t<
+ is_same<
+ typename associated_cancellation_slot<
+ Handler, cancellation_slot
+ >::asio_associated_cancellation_slot_is_unspecialised,
+ void
+ >::value
+ >
+ >
+{
+public:
+ cancellation_state get_cancellation_state() const noexcept
+ {
+ return cancellation_state();
+ }
+
+protected:
+ explicit base_from_cancellation_state(const Handler&)
+ {
+ }
+
+ template <typename Filter>
+ base_from_cancellation_state(const Handler&, Filter)
+ {
+ }
+
+ template <typename InFilter, typename OutFilter>
+ base_from_cancellation_state(const Handler&,
+ InFilter&&,
+ OutFilter&&)
+ {
+ }
+
+ void reset_cancellation_state(const Handler&)
+ {
+ }
+
+ template <typename Filter>
+ void reset_cancellation_state(const Handler&, Filter)
+ {
+ }
+
+ template <typename InFilter, typename OutFilter>
+ void reset_cancellation_state(const Handler&,
+ InFilter&&,
+ OutFilter&&)
+ {
+ }
+
+ constexpr cancellation_type_t cancelled() const noexcept
+ {
+ return cancellation_type::none;
+ }
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_BASE_FROM_CANCELLATION_STATE_HPP
diff --git a/3rdparty/asio/include/asio/detail/base_from_completion_cond.hpp b/3rdparty/asio/include/asio/detail/base_from_completion_cond.hpp
new file mode 100644
index 00000000000..ba0cc879602
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/base_from_completion_cond.hpp
@@ -0,0 +1,69 @@
+//
+// detail/base_from_completion_cond.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename CompletionCondition>
+class base_from_completion_cond
+{
+protected:
+ explicit base_from_completion_cond(CompletionCondition& completion_condition)
+ : completion_condition_(
+ static_cast<CompletionCondition&&>(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<transfer_all_t>
+{
+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/3rdparty/asio/include/asio/detail/bind_handler.hpp b/3rdparty/asio/include/asio/detail/bind_handler.hpp
new file mode 100644
index 00000000000..3c16b13a458
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/bind_handler.hpp
@@ -0,0 +1,711 @@
+//
+// detail/bind_handler.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/associator.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Handler>
+class binder0
+{
+public:
+ template <typename T>
+ binder0(int, T&& handler)
+ : handler_(static_cast<T&&>(handler))
+ {
+ }
+
+ binder0(Handler& handler)
+ : handler_(static_cast<Handler&&>(handler))
+ {
+ }
+
+ binder0(const binder0& other)
+ : handler_(other.handler_)
+ {
+ }
+
+ binder0(binder0&& other)
+ : handler_(static_cast<Handler&&>(other.handler_))
+ {
+ }
+
+ void operator()()
+ {
+ static_cast<Handler&&>(handler_)();
+ }
+
+ void operator()() const
+ {
+ handler_();
+ }
+
+//private:
+ Handler handler_;
+};
+
+template <typename Handler>
+inline bool asio_handler_is_continuation(
+ binder0<Handler>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Handler>
+inline binder0<decay_t<Handler>> bind_handler(
+ Handler&& handler)
+{
+ return binder0<decay_t<Handler>>(
+ 0, static_cast<Handler&&>(handler));
+}
+
+template <typename Handler, typename Arg1>
+class binder1
+{
+public:
+ template <typename T>
+ binder1(int, T&& handler, const Arg1& arg1)
+ : handler_(static_cast<T&&>(handler)),
+ arg1_(arg1)
+ {
+ }
+
+ binder1(Handler& handler, const Arg1& arg1)
+ : handler_(static_cast<Handler&&>(handler)),
+ arg1_(arg1)
+ {
+ }
+
+ binder1(const binder1& other)
+ : handler_(other.handler_),
+ arg1_(other.arg1_)
+ {
+ }
+
+ binder1(binder1&& other)
+ : handler_(static_cast<Handler&&>(other.handler_)),
+ arg1_(static_cast<Arg1&&>(other.arg1_))
+ {
+ }
+
+ void operator()()
+ {
+ static_cast<Handler&&>(handler_)(
+ static_cast<const Arg1&>(arg1_));
+ }
+
+ void operator()() const
+ {
+ handler_(arg1_);
+ }
+
+//private:
+ Handler handler_;
+ Arg1 arg1_;
+};
+
+template <typename Handler, typename Arg1>
+inline bool asio_handler_is_continuation(
+ binder1<Handler, Arg1>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Handler, typename Arg1>
+inline binder1<decay_t<Handler>, Arg1> bind_handler(
+ Handler&& handler, const Arg1& arg1)
+{
+ return binder1<decay_t<Handler>, Arg1>(0,
+ static_cast<Handler&&>(handler), arg1);
+}
+
+template <typename Handler, typename Arg1, typename Arg2>
+class binder2
+{
+public:
+ template <typename T>
+ binder2(int, T&& handler,
+ const Arg1& arg1, const Arg2& arg2)
+ : handler_(static_cast<T&&>(handler)),
+ arg1_(arg1),
+ arg2_(arg2)
+ {
+ }
+
+ binder2(Handler& handler, const Arg1& arg1, const Arg2& arg2)
+ : handler_(static_cast<Handler&&>(handler)),
+ arg1_(arg1),
+ arg2_(arg2)
+ {
+ }
+
+ binder2(const binder2& other)
+ : handler_(other.handler_),
+ arg1_(other.arg1_),
+ arg2_(other.arg2_)
+ {
+ }
+
+ binder2(binder2&& other)
+ : handler_(static_cast<Handler&&>(other.handler_)),
+ arg1_(static_cast<Arg1&&>(other.arg1_)),
+ arg2_(static_cast<Arg2&&>(other.arg2_))
+ {
+ }
+
+ void operator()()
+ {
+ static_cast<Handler&&>(handler_)(
+ static_cast<const Arg1&>(arg1_),
+ static_cast<const Arg2&>(arg2_));
+ }
+
+ void operator()() const
+ {
+ handler_(arg1_, arg2_);
+ }
+
+//private:
+ Handler handler_;
+ Arg1 arg1_;
+ Arg2 arg2_;
+};
+
+template <typename Handler, typename Arg1, typename Arg2>
+inline bool asio_handler_is_continuation(
+ binder2<Handler, Arg1, Arg2>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Handler, typename Arg1, typename Arg2>
+inline binder2<decay_t<Handler>, Arg1, Arg2> bind_handler(
+ Handler&& handler, const Arg1& arg1, const Arg2& arg2)
+{
+ return binder2<decay_t<Handler>, Arg1, Arg2>(0,
+ static_cast<Handler&&>(handler), arg1, arg2);
+}
+
+template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
+class binder3
+{
+public:
+ template <typename T>
+ binder3(int, T&& handler, const Arg1& arg1,
+ const Arg2& arg2, const Arg3& arg3)
+ : handler_(static_cast<T&&>(handler)),
+ arg1_(arg1),
+ arg2_(arg2),
+ arg3_(arg3)
+ {
+ }
+
+ binder3(Handler& handler, const Arg1& arg1,
+ const Arg2& arg2, const Arg3& arg3)
+ : handler_(static_cast<Handler&&>(handler)),
+ arg1_(arg1),
+ arg2_(arg2),
+ arg3_(arg3)
+ {
+ }
+
+ binder3(const binder3& other)
+ : handler_(other.handler_),
+ arg1_(other.arg1_),
+ arg2_(other.arg2_),
+ arg3_(other.arg3_)
+ {
+ }
+
+ binder3(binder3&& other)
+ : handler_(static_cast<Handler&&>(other.handler_)),
+ arg1_(static_cast<Arg1&&>(other.arg1_)),
+ arg2_(static_cast<Arg2&&>(other.arg2_)),
+ arg3_(static_cast<Arg3&&>(other.arg3_))
+ {
+ }
+
+ void operator()()
+ {
+ static_cast<Handler&&>(handler_)(
+ static_cast<const Arg1&>(arg1_),
+ static_cast<const Arg2&>(arg2_),
+ static_cast<const Arg3&>(arg3_));
+ }
+
+ void operator()() const
+ {
+ handler_(arg1_, arg2_, arg3_);
+ }
+
+//private:
+ Handler handler_;
+ Arg1 arg1_;
+ Arg2 arg2_;
+ Arg3 arg3_;
+};
+
+template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
+inline bool asio_handler_is_continuation(
+ binder3<Handler, Arg1, Arg2, Arg3>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Handler, typename Arg1, typename Arg2, typename Arg3>
+inline binder3<decay_t<Handler>, Arg1, Arg2, Arg3> bind_handler(
+ Handler&& handler, const Arg1& arg1, const Arg2& arg2,
+ const Arg3& arg3)
+{
+ return binder3<decay_t<Handler>, Arg1, Arg2, Arg3>(0,
+ static_cast<Handler&&>(handler), arg1, arg2, arg3);
+}
+
+template <typename Handler, typename Arg1,
+ typename Arg2, typename Arg3, typename Arg4>
+class binder4
+{
+public:
+ template <typename T>
+ binder4(int, T&& handler, const Arg1& arg1,
+ const Arg2& arg2, const Arg3& arg3, const Arg4& arg4)
+ : handler_(static_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_(static_cast<Handler&&>(handler)),
+ arg1_(arg1),
+ arg2_(arg2),
+ arg3_(arg3),
+ arg4_(arg4)
+ {
+ }
+
+ binder4(const binder4& other)
+ : handler_(other.handler_),
+ arg1_(other.arg1_),
+ arg2_(other.arg2_),
+ arg3_(other.arg3_),
+ arg4_(other.arg4_)
+ {
+ }
+
+ binder4(binder4&& other)
+ : handler_(static_cast<Handler&&>(other.handler_)),
+ arg1_(static_cast<Arg1&&>(other.arg1_)),
+ arg2_(static_cast<Arg2&&>(other.arg2_)),
+ arg3_(static_cast<Arg3&&>(other.arg3_)),
+ arg4_(static_cast<Arg4&&>(other.arg4_))
+ {
+ }
+
+ void operator()()
+ {
+ static_cast<Handler&&>(handler_)(
+ static_cast<const Arg1&>(arg1_),
+ static_cast<const Arg2&>(arg2_),
+ static_cast<const Arg3&>(arg3_),
+ static_cast<const Arg4&>(arg4_));
+ }
+
+ void operator()() const
+ {
+ handler_(arg1_, arg2_, arg3_, arg4_);
+ }
+
+//private:
+ Handler handler_;
+ Arg1 arg1_;
+ Arg2 arg2_;
+ Arg3 arg3_;
+ Arg4 arg4_;
+};
+
+template <typename Handler, typename Arg1,
+ typename Arg2, typename Arg3, typename Arg4>
+inline bool asio_handler_is_continuation(
+ binder4<Handler, Arg1, Arg2, Arg3, Arg4>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Handler, typename Arg1,
+ typename Arg2, typename Arg3, typename Arg4>
+inline binder4<decay_t<Handler>, Arg1, Arg2, Arg3, Arg4>
+bind_handler(Handler&& handler, const Arg1& arg1,
+ const Arg2& arg2, const Arg3& arg3, const Arg4& arg4)
+{
+ return binder4<decay_t<Handler>, Arg1, Arg2, Arg3, Arg4>(0,
+ static_cast<Handler&&>(handler), arg1, arg2, arg3, arg4);
+}
+
+template <typename Handler, typename Arg1, typename Arg2,
+ typename Arg3, typename Arg4, typename Arg5>
+class binder5
+{
+public:
+ template <typename T>
+ binder5(int, T&& handler, const Arg1& arg1,
+ const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
+ : handler_(static_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_(static_cast<Handler&&>(handler)),
+ arg1_(arg1),
+ arg2_(arg2),
+ arg3_(arg3),
+ arg4_(arg4),
+ arg5_(arg5)
+ {
+ }
+
+ 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_(static_cast<Handler&&>(other.handler_)),
+ arg1_(static_cast<Arg1&&>(other.arg1_)),
+ arg2_(static_cast<Arg2&&>(other.arg2_)),
+ arg3_(static_cast<Arg3&&>(other.arg3_)),
+ arg4_(static_cast<Arg4&&>(other.arg4_)),
+ arg5_(static_cast<Arg5&&>(other.arg5_))
+ {
+ }
+
+ void operator()()
+ {
+ static_cast<Handler&&>(handler_)(
+ static_cast<const Arg1&>(arg1_),
+ static_cast<const Arg2&>(arg2_),
+ static_cast<const Arg3&>(arg3_),
+ static_cast<const Arg4&>(arg4_),
+ static_cast<const Arg5&>(arg5_));
+ }
+
+ void operator()() const
+ {
+ handler_(arg1_, arg2_, arg3_, arg4_, arg5_);
+ }
+
+//private:
+ Handler handler_;
+ Arg1 arg1_;
+ Arg2 arg2_;
+ Arg3 arg3_;
+ Arg4 arg4_;
+ Arg5 arg5_;
+};
+
+template <typename Handler, typename Arg1, typename Arg2,
+ typename Arg3, typename Arg4, typename Arg5>
+inline bool asio_handler_is_continuation(
+ binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Handler, typename Arg1, typename Arg2,
+ typename Arg3, typename Arg4, typename Arg5>
+inline binder5<decay_t<Handler>, Arg1, Arg2, Arg3, Arg4, Arg5>
+bind_handler(Handler&& handler, const Arg1& arg1,
+ const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5)
+{
+ return binder5<decay_t<Handler>, Arg1, Arg2, Arg3, Arg4, Arg5>(0,
+ static_cast<Handler&&>(handler), arg1, arg2, arg3, arg4, arg5);
+}
+
+template <typename Handler, typename Arg1>
+class move_binder1
+{
+public:
+ move_binder1(int, Handler&& handler,
+ Arg1&& arg1)
+ : handler_(static_cast<Handler&&>(handler)),
+ arg1_(static_cast<Arg1&&>(arg1))
+ {
+ }
+
+ move_binder1(move_binder1&& other)
+ : handler_(static_cast<Handler&&>(other.handler_)),
+ arg1_(static_cast<Arg1&&>(other.arg1_))
+ {
+ }
+
+ void operator()()
+ {
+ static_cast<Handler&&>(handler_)(
+ static_cast<Arg1&&>(arg1_));
+ }
+
+//private:
+ Handler handler_;
+ Arg1 arg1_;
+};
+
+template <typename Handler, typename Arg1>
+inline bool asio_handler_is_continuation(
+ move_binder1<Handler, Arg1>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Handler, typename Arg1, typename Arg2>
+class move_binder2
+{
+public:
+ move_binder2(int, Handler&& handler,
+ const Arg1& arg1, Arg2&& arg2)
+ : handler_(static_cast<Handler&&>(handler)),
+ arg1_(arg1),
+ arg2_(static_cast<Arg2&&>(arg2))
+ {
+ }
+
+ move_binder2(move_binder2&& other)
+ : handler_(static_cast<Handler&&>(other.handler_)),
+ arg1_(static_cast<Arg1&&>(other.arg1_)),
+ arg2_(static_cast<Arg2&&>(other.arg2_))
+ {
+ }
+
+ void operator()()
+ {
+ static_cast<Handler&&>(handler_)(
+ static_cast<const Arg1&>(arg1_),
+ static_cast<Arg2&&>(arg2_));
+ }
+
+//private:
+ Handler handler_;
+ Arg1 arg1_;
+ Arg2 arg2_;
+};
+
+template <typename Handler, typename Arg1, typename Arg2>
+inline bool asio_handler_is_continuation(
+ move_binder2<Handler, Arg1, Arg2>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+} // namespace detail
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::binder0<Handler>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::binder0<Handler>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::binder0<Handler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename Arg1, typename DefaultCandidate>
+struct associator<Associator,
+ detail::binder1<Handler, Arg1>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::binder1<Handler, Arg1>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::binder1<Handler, Arg1>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename Arg1, typename Arg2,
+ typename DefaultCandidate>
+struct associator<Associator,
+ detail::binder2<Handler, Arg1, Arg2>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::binder2<Handler, Arg1, Arg2>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::binder2<Handler, Arg1, Arg2>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename Arg1, typename Arg2, typename Arg3,
+ typename DefaultCandidate>
+struct associator<Associator,
+ detail::binder3<Handler, Arg1, Arg2, Arg3>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::binder3<Handler, Arg1, Arg2, Arg3>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::binder3<Handler, Arg1, Arg2, Arg3>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename Arg1, typename Arg2, typename Arg3,
+ typename Arg4, typename DefaultCandidate>
+struct associator<Associator,
+ detail::binder4<Handler, Arg1, Arg2, Arg3, Arg4>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::binder4<Handler, Arg1, Arg2, Arg3, Arg4>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::binder4<Handler, Arg1, Arg2, Arg3, Arg4>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename Arg1, typename Arg2, typename Arg3,
+ typename Arg4, typename Arg5, typename DefaultCandidate>
+struct associator<Associator,
+ detail::binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::binder5<Handler, Arg1, Arg2, Arg3, Arg4, Arg5>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename Arg1, typename DefaultCandidate>
+struct associator<Associator,
+ detail::move_binder1<Handler, Arg1>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::move_binder1<Handler, Arg1>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::move_binder1<Handler, Arg1>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename Arg1, typename Arg2, typename DefaultCandidate>
+struct associator<Associator,
+ detail::move_binder2<Handler, Arg1, Arg2>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::move_binder2<Handler, Arg1, Arg2>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::move_binder2<Handler, Arg1, Arg2>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_BIND_HANDLER_HPP
diff --git a/3rdparty/asio/include/asio/detail/blocking_executor_op.hpp b/3rdparty/asio/include/asio/detail/blocking_executor_op.hpp
new file mode 100644
index 00000000000..c70e562f403
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/blocking_executor_op.hpp
@@ -0,0 +1,107 @@
+//
+// detail/blocking_executor_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_BLOCKING_EXECUTOR_OP_HPP
+#define ASIO_DETAIL_BLOCKING_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/event.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/mutex.hpp"
+#include "asio/detail/scheduler_operation.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Operation = scheduler_operation>
+class blocking_executor_op_base : public Operation
+{
+public:
+ blocking_executor_op_base(typename Operation::func_type complete_func)
+ : Operation(complete_func),
+ is_complete_(false)
+ {
+ }
+
+ void wait()
+ {
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ while (!is_complete_)
+ event_.wait(lock);
+ }
+
+protected:
+ struct do_complete_cleanup
+ {
+ ~do_complete_cleanup()
+ {
+ asio::detail::mutex::scoped_lock lock(op_->mutex_);
+ op_->is_complete_ = true;
+ op_->event_.unlock_and_signal_one_for_destruction(lock);
+ }
+
+ blocking_executor_op_base* op_;
+ };
+
+private:
+ asio::detail::mutex mutex_;
+ asio::detail::event event_;
+ bool is_complete_;
+};
+
+template <typename Handler, typename Operation = scheduler_operation>
+class blocking_executor_op : public blocking_executor_op_base<Operation>
+{
+public:
+ blocking_executor_op(Handler& h)
+ : blocking_executor_op_base<Operation>(&blocking_executor_op::do_complete),
+ handler_(h)
+ {
+ }
+
+ static void do_complete(void* owner, Operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ ASIO_ASSUME(base != 0);
+ blocking_executor_op* o(static_cast<blocking_executor_op*>(base));
+
+ typename blocking_executor_op_base<Operation>::do_complete_cleanup
+ on_exit = { o };
+ (void)on_exit;
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Make the upcall if required.
+ if (owner)
+ {
+ fenced_block b(fenced_block::half);
+ ASIO_HANDLER_INVOCATION_BEGIN(());
+ static_cast<Handler&&>(o->handler_)();
+ ASIO_HANDLER_INVOCATION_END;
+ }
+ }
+
+private:
+ Handler& handler_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_BLOCKING_EXECUTOR_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/buffer_resize_guard.hpp b/3rdparty/asio/include/asio/detail/buffer_resize_guard.hpp
new file mode 100644
index 00000000000..1a78307aaae
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/buffer_resize_guard.hpp
@@ -0,0 +1,66 @@
+//
+// detail/buffer_resize_guard.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Buffer>
+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<size_t>::max)())
+ {
+ buffer_.resize(old_size_);
+ }
+ }
+
+ // Commit the resize transaction.
+ void commit()
+ {
+ old_size_ = (std::numeric_limits<size_t>::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/3rdparty/asio/include/asio/detail/buffer_sequence_adapter.hpp b/3rdparty/asio/include/asio/detail/buffer_sequence_adapter.hpp
new file mode 100644
index 00000000000..8ea904e7023
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/buffer_sequence_adapter.hpp
@@ -0,0 +1,837 @@
+//
+// detail/buffer_sequence_adapter.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/registered_buffer.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<char*>(buffer.data());
+ buf.len = static_cast<ULONG>(buffer.size());
+ }
+
+ static void init_native_buffer(WSABUF& buf,
+ const asio::const_buffer& buffer)
+ {
+ buf.buf = const_cast<char*>(static_cast<const char*>(buffer.data()));
+ buf.len = static_cast<ULONG>(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 <typename T>
+ static void init_iov_base(T& base, void* addr)
+ {
+ base = static_cast<T>(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<void*>(buffer.data()));
+ iov.iov_len = buffer.size();
+ }
+#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+};
+
+// Helper class to translate buffers into the native buffer representation.
+template <typename Buffer, typename Buffers>
+class buffer_sequence_adapter
+ : buffer_sequence_adapter_base
+{
+public:
+ enum { is_single_buffer = false };
+ enum { is_registered_buffer = false };
+
+ 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_;
+ }
+
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
+ 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));
+ }
+
+ enum { linearisation_storage_size = 8192 };
+
+ static Buffer linearise(const Buffers& buffer_sequence,
+ const asio::mutable_buffer& storage)
+ {
+ return buffer_sequence_adapter::linearise(
+ asio::buffer_sequence_begin(buffer_sequence),
+ asio::buffer_sequence_end(buffer_sequence), storage);
+ }
+
+private:
+ template <typename Iterator>
+ 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 <typename Iterator>
+ 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 <typename Iterator>
+ static void validate(Iterator begin, Iterator end)
+ {
+ Iterator iter = begin;
+ for (; iter != end; ++iter)
+ {
+ Buffer buffer(*iter);
+ buffer.data();
+ }
+ }
+
+ template <typename Iterator>
+ 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();
+ }
+
+ template <typename Iterator>
+ static Buffer linearise(Iterator begin, Iterator end,
+ const asio::mutable_buffer& storage)
+ {
+ asio::mutable_buffer unused_storage = storage;
+ Iterator iter = begin;
+ while (iter != end && unused_storage.size() != 0)
+ {
+ Buffer buffer(*iter);
+ ++iter;
+ if (buffer.size() == 0)
+ continue;
+ if (unused_storage.size() == storage.size())
+ {
+ if (iter == end)
+ return buffer;
+ if (buffer.size() >= unused_storage.size())
+ return buffer;
+ }
+ unused_storage += asio::buffer_copy(unused_storage, buffer);
+ }
+ return Buffer(storage.data(), storage.size() - unused_storage.size());
+ }
+
+ native_buffer_type buffers_[max_buffers];
+ std::size_t count_;
+ std::size_t total_buffer_size_;
+};
+
+template <typename Buffer>
+class buffer_sequence_adapter<Buffer, asio::mutable_buffer>
+ : buffer_sequence_adapter_base
+{
+public:
+ enum { is_single_buffer = true };
+ enum { is_registered_buffer = false };
+
+ 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_;
+ }
+
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
+ 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);
+ }
+
+ enum { linearisation_storage_size = 1 };
+
+ static Buffer linearise(const asio::mutable_buffer& buffer_sequence,
+ const Buffer&)
+ {
+ return Buffer(buffer_sequence);
+ }
+
+private:
+ native_buffer_type buffer_;
+ std::size_t total_buffer_size_;
+};
+
+template <typename Buffer>
+class buffer_sequence_adapter<Buffer, asio::const_buffer>
+ : buffer_sequence_adapter_base
+{
+public:
+ enum { is_single_buffer = true };
+ enum { is_registered_buffer = false };
+
+ 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_;
+ }
+
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
+ 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);
+ }
+
+ enum { linearisation_storage_size = 1 };
+
+ static Buffer linearise(const asio::const_buffer& buffer_sequence,
+ const Buffer&)
+ {
+ return Buffer(buffer_sequence);
+ }
+
+private:
+ native_buffer_type buffer_;
+ std::size_t total_buffer_size_;
+};
+
+#if !defined(ASIO_NO_DEPRECATED)
+
+template <typename Buffer>
+class buffer_sequence_adapter<Buffer, asio::mutable_buffers_1>
+ : buffer_sequence_adapter_base
+{
+public:
+ enum { is_single_buffer = true };
+ enum { is_registered_buffer = false };
+
+ 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_;
+ }
+
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
+ 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);
+ }
+
+ enum { linearisation_storage_size = 1 };
+
+ static Buffer linearise(const asio::mutable_buffers_1& buffer_sequence,
+ const Buffer&)
+ {
+ return Buffer(buffer_sequence);
+ }
+
+private:
+ native_buffer_type buffer_;
+ std::size_t total_buffer_size_;
+};
+
+template <typename Buffer>
+class buffer_sequence_adapter<Buffer, asio::const_buffers_1>
+ : buffer_sequence_adapter_base
+{
+public:
+ enum { is_single_buffer = true };
+ enum { is_registered_buffer = false };
+
+ 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_;
+ }
+
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
+ 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);
+ }
+
+ enum { linearisation_storage_size = 1 };
+
+ static Buffer linearise(const asio::const_buffers_1& buffer_sequence,
+ const Buffer&)
+ {
+ return Buffer(buffer_sequence);
+ }
+
+private:
+ native_buffer_type buffer_;
+ std::size_t total_buffer_size_;
+};
+
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+template <typename Buffer>
+class buffer_sequence_adapter<Buffer, asio::mutable_registered_buffer>
+ : buffer_sequence_adapter_base
+{
+public:
+ enum { is_single_buffer = true };
+ enum { is_registered_buffer = true };
+
+ explicit buffer_sequence_adapter(
+ const asio::mutable_registered_buffer& buffer_sequence)
+ {
+ init_native_buffer(buffer_, buffer_sequence.buffer());
+ total_buffer_size_ = buffer_sequence.size();
+ registered_id_ = buffer_sequence.id();
+ }
+
+ native_buffer_type* buffers()
+ {
+ return &buffer_;
+ }
+
+ std::size_t count() const
+ {
+ return 1;
+ }
+
+ std::size_t total_size() const
+ {
+ return total_buffer_size_;
+ }
+
+ registered_buffer_id registered_id() const
+ {
+ return registered_id_;
+ }
+
+ bool all_empty() const
+ {
+ return total_buffer_size_ == 0;
+ }
+
+ static bool all_empty(
+ const asio::mutable_registered_buffer& buffer_sequence)
+ {
+ return buffer_sequence.size() == 0;
+ }
+
+ static void validate(
+ const asio::mutable_registered_buffer& buffer_sequence)
+ {
+ buffer_sequence.data();
+ }
+
+ static Buffer first(
+ const asio::mutable_registered_buffer& buffer_sequence)
+ {
+ return Buffer(buffer_sequence.buffer());
+ }
+
+ enum { linearisation_storage_size = 1 };
+
+ static Buffer linearise(
+ const asio::mutable_registered_buffer& buffer_sequence,
+ const Buffer&)
+ {
+ return Buffer(buffer_sequence.buffer());
+ }
+
+private:
+ native_buffer_type buffer_;
+ std::size_t total_buffer_size_;
+ registered_buffer_id registered_id_;
+};
+
+template <typename Buffer>
+class buffer_sequence_adapter<Buffer, asio::const_registered_buffer>
+ : buffer_sequence_adapter_base
+{
+public:
+ enum { is_single_buffer = true };
+ enum { is_registered_buffer = true };
+
+ explicit buffer_sequence_adapter(
+ const asio::const_registered_buffer& buffer_sequence)
+ {
+ init_native_buffer(buffer_, buffer_sequence.buffer());
+ total_buffer_size_ = buffer_sequence.size();
+ registered_id_ = buffer_sequence.id();
+ }
+
+ native_buffer_type* buffers()
+ {
+ return &buffer_;
+ }
+
+ std::size_t count() const
+ {
+ return 1;
+ }
+
+ std::size_t total_size() const
+ {
+ return total_buffer_size_;
+ }
+
+ registered_buffer_id registered_id() const
+ {
+ return registered_id_;
+ }
+
+ bool all_empty() const
+ {
+ return total_buffer_size_ == 0;
+ }
+
+ static bool all_empty(
+ const asio::const_registered_buffer& buffer_sequence)
+ {
+ return buffer_sequence.size() == 0;
+ }
+
+ static void validate(
+ const asio::const_registered_buffer& buffer_sequence)
+ {
+ buffer_sequence.data();
+ }
+
+ static Buffer first(
+ const asio::const_registered_buffer& buffer_sequence)
+ {
+ return Buffer(buffer_sequence.buffer());
+ }
+
+ enum { linearisation_storage_size = 1 };
+
+ static Buffer linearise(
+ const asio::const_registered_buffer& buffer_sequence,
+ const Buffer&)
+ {
+ return Buffer(buffer_sequence.buffer());
+ }
+
+private:
+ native_buffer_type buffer_;
+ std::size_t total_buffer_size_;
+ registered_buffer_id registered_id_;
+};
+
+template <typename Buffer, typename Elem>
+class buffer_sequence_adapter<Buffer, boost::array<Elem, 2>>
+ : buffer_sequence_adapter_base
+{
+public:
+ enum { is_single_buffer = false };
+ enum { is_registered_buffer = false };
+
+ explicit buffer_sequence_adapter(
+ const boost::array<Elem, 2>& 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_;
+ }
+
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
+ bool all_empty() const
+ {
+ return total_buffer_size_ == 0;
+ }
+
+ static bool all_empty(const boost::array<Elem, 2>& buffer_sequence)
+ {
+ return buffer_sequence[0].size() == 0 && buffer_sequence[1].size() == 0;
+ }
+
+ static void validate(const boost::array<Elem, 2>& buffer_sequence)
+ {
+ buffer_sequence[0].data();
+ buffer_sequence[1].data();
+ }
+
+ static Buffer first(const boost::array<Elem, 2>& buffer_sequence)
+ {
+ return Buffer(buffer_sequence[0].size() != 0
+ ? buffer_sequence[0] : buffer_sequence[1]);
+ }
+
+ enum { linearisation_storage_size = 8192 };
+
+ static Buffer linearise(const boost::array<Elem, 2>& buffer_sequence,
+ const asio::mutable_buffer& storage)
+ {
+ if (buffer_sequence[0].size() == 0)
+ return Buffer(buffer_sequence[1]);
+ if (buffer_sequence[1].size() == 0)
+ return Buffer(buffer_sequence[0]);
+ return Buffer(storage.data(),
+ asio::buffer_copy(storage, buffer_sequence));
+ }
+
+private:
+ native_buffer_type buffers_[2];
+ std::size_t total_buffer_size_;
+};
+
+template <typename Buffer, typename Elem>
+class buffer_sequence_adapter<Buffer, std::array<Elem, 2>>
+ : buffer_sequence_adapter_base
+{
+public:
+ enum { is_single_buffer = false };
+ enum { is_registered_buffer = false };
+
+ explicit buffer_sequence_adapter(
+ const std::array<Elem, 2>& 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_;
+ }
+
+ registered_buffer_id registered_id() const
+ {
+ return registered_buffer_id();
+ }
+
+ bool all_empty() const
+ {
+ return total_buffer_size_ == 0;
+ }
+
+ static bool all_empty(const std::array<Elem, 2>& buffer_sequence)
+ {
+ return buffer_sequence[0].size() == 0 && buffer_sequence[1].size() == 0;
+ }
+
+ static void validate(const std::array<Elem, 2>& buffer_sequence)
+ {
+ buffer_sequence[0].data();
+ buffer_sequence[1].data();
+ }
+
+ static Buffer first(const std::array<Elem, 2>& buffer_sequence)
+ {
+ return Buffer(buffer_sequence[0].size() != 0
+ ? buffer_sequence[0] : buffer_sequence[1]);
+ }
+
+ enum { linearisation_storage_size = 8192 };
+
+ static Buffer linearise(const std::array<Elem, 2>& buffer_sequence,
+ const asio::mutable_buffer& storage)
+ {
+ if (buffer_sequence[0].size() == 0)
+ return Buffer(buffer_sequence[1]);
+ if (buffer_sequence[1].size() == 0)
+ return Buffer(buffer_sequence[0]);
+ return Buffer(storage.data(),
+ asio::buffer_copy(storage, buffer_sequence));
+ }
+
+private:
+ native_buffer_type buffers_[2];
+ std::size_t total_buffer_size_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/buffered_stream_storage.hpp b/3rdparty/asio/include/asio/detail/buffered_stream_storage.hpp
new file mode 100644
index 00000000000..afe5cadffda
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/buffered_stream_storage.hpp
@@ -0,0 +1,126 @@
+//
+// detail/buffered_stream_storage.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <cstring>
+#include <vector>
+
+#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<byte_type> buffer_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP
diff --git a/3rdparty/asio/include/asio/detail/call_stack.hpp b/3rdparty/asio/include/asio/detail/call_stack.hpp
new file mode 100644
index 00000000000..c287c57e2c6
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/call_stack.hpp
@@ -0,0 +1,125 @@
+//
+// detail/call_stack.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Key, typename Value = unsigned char>
+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<Key, Value>::top_)
+ {
+ value_ = reinterpret_cast<unsigned char*>(this);
+ call_stack<Key, Value>::top_ = this;
+ }
+
+ // Push the key/value pair on to the stack.
+ context(Key* k, Value& v)
+ : key_(k),
+ value_(&v),
+ next_(call_stack<Key, Value>::top_)
+ {
+ call_stack<Key, Value>::top_ = this;
+ }
+
+ // Pop the key/value pair from the stack.
+ ~context()
+ {
+ call_stack<Key, Value>::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<Key, Value>;
+
+ // 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<context> top_;
+};
+
+template <typename Key, typename Value>
+tss_ptr<typename call_stack<Key, Value>::context>
+call_stack<Key, Value>::top_;
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_CALL_STACK_HPP
diff --git a/3rdparty/asio/include/asio/detail/chrono.hpp b/3rdparty/asio/include/asio/detail/chrono.hpp
new file mode 100644
index 00000000000..45490dde02e
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/chrono.hpp
@@ -0,0 +1,45 @@
+//
+// detail/chrono.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include <chrono>
+
+namespace asio {
+namespace 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;
+
+} // namespace chrono
+} // namespace asio
+
+#endif // ASIO_DETAIL_CHRONO_HPP
diff --git a/3rdparty/asio/include/asio/detail/chrono_time_traits.hpp b/3rdparty/asio/include/asio/detail/chrono_time_traits.hpp
new file mode 100644
index 00000000000..de7b7d69929
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/chrono_time_traits.hpp
@@ -0,0 +1,190 @@
+//
+// detail/chrono_time_traits.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <int64_t v1, int64_t v2>
+struct gcd { enum { value = gcd<v2, v1 % v2>::value }; };
+
+template <int64_t v1>
+struct gcd<v1, 0> { enum { value = v1 }; };
+
+// Adapts std::chrono clocks for use with a deadline timer.
+template <typename Clock, typename WaitTraits>
+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 Num, int64_t Den>
+ int64_t duration_cast() const
+ {
+ const int64_t num1 = period_type::num / gcd<period_type::num, Num>::value;
+ const int64_t num2 = Num / gcd<period_type::num, Num>::value;
+
+ const int64_t den1 = period_type::den / gcd<period_type::den, Den>::value;
+ const int64_t den2 = Den / gcd<period_type::den, Den>::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/3rdparty/asio/include/asio/detail/completion_handler.hpp b/3rdparty/asio/include/asio/detail/completion_handler.hpp
new file mode 100644
index 00000000000..c6f98b36c38
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/completion_handler.hpp
@@ -0,0 +1,88 @@
+//
+// detail/completion_handler.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Handler, typename IoExecutor>
+class completion_handler : public operation
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(completion_handler);
+
+ completion_handler(Handler& h, const IoExecutor& io_ex)
+ : operation(&completion_handler::do_complete),
+ handler_(static_cast<Handler&&>(h)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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<completion_handler*>(base));
+ ptr p = { asio::detail::addressof(h->handler_), h, h };
+
+ ASIO_HANDLER_COMPLETION((*h));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ h->work_));
+
+ // 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(static_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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_COMPLETION_HANDLER_HPP
diff --git a/3rdparty/asio/include/asio/detail/composed_work.hpp b/3rdparty/asio/include/asio/detail/composed_work.hpp
new file mode 100644
index 00000000000..8076f8508d6
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/composed_work.hpp
@@ -0,0 +1,252 @@
+//
+// detail/composed_work.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_COMPOSED_WORK_HPP
+#define ASIO_DETAIL_COMPOSED_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/detail/type_traits.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/execution/outstanding_work.hpp"
+#include "asio/executor_work_guard.hpp"
+#include "asio/is_executor.hpp"
+#include "asio/system_executor.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Executor, typename = void>
+class composed_work_guard
+{
+public:
+ typedef decay_t<
+ prefer_result_t<Executor, execution::outstanding_work_t::tracked_t>
+ > executor_type;
+
+ composed_work_guard(const Executor& ex)
+ : executor_(asio::prefer(ex, execution::outstanding_work.tracked))
+ {
+ }
+
+ void reset()
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return executor_;
+ }
+
+private:
+ executor_type executor_;
+};
+
+template <>
+struct composed_work_guard<system_executor>
+{
+public:
+ typedef system_executor executor_type;
+
+ composed_work_guard(const system_executor&)
+ {
+ }
+
+ void reset()
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return system_executor();
+ }
+};
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Executor>
+struct composed_work_guard<Executor,
+ enable_if_t<
+ !execution::is_executor<Executor>::value
+ >
+ > : executor_work_guard<Executor>
+{
+ composed_work_guard(const Executor& ex)
+ : executor_work_guard<Executor>(ex)
+ {
+ }
+};
+
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename>
+struct composed_io_executors;
+
+template <>
+struct composed_io_executors<void()>
+{
+ composed_io_executors() noexcept
+ : head_(system_executor())
+ {
+ }
+
+ typedef system_executor head_type;
+ system_executor head_;
+};
+
+inline composed_io_executors<void()> make_composed_io_executors()
+{
+ return composed_io_executors<void()>();
+}
+
+template <typename Head>
+struct composed_io_executors<void(Head)>
+{
+ explicit composed_io_executors(const Head& ex) noexcept
+ : head_(ex)
+ {
+ }
+
+ typedef Head head_type;
+ Head head_;
+};
+
+template <typename Head>
+inline composed_io_executors<void(Head)>
+make_composed_io_executors(const Head& head)
+{
+ return composed_io_executors<void(Head)>(head);
+}
+
+template <typename Head, typename... Tail>
+struct composed_io_executors<void(Head, Tail...)>
+{
+ explicit composed_io_executors(const Head& head,
+ const Tail&... tail) noexcept
+ : head_(head),
+ tail_(tail...)
+ {
+ }
+
+ void reset()
+ {
+ head_.reset();
+ tail_.reset();
+ }
+
+ typedef Head head_type;
+ Head head_;
+ composed_io_executors<void(Tail...)> tail_;
+};
+
+template <typename Head, typename... Tail>
+inline composed_io_executors<void(Head, Tail...)>
+make_composed_io_executors(const Head& head, const Tail&... tail)
+{
+ return composed_io_executors<void(Head, Tail...)>(head, tail...);
+}
+
+template <typename>
+struct composed_work;
+
+template <>
+struct composed_work<void()>
+{
+ typedef composed_io_executors<void()> executors_type;
+
+ composed_work(const executors_type&) noexcept
+ : head_(system_executor())
+ {
+ }
+
+ void reset()
+ {
+ head_.reset();
+ }
+
+ typedef system_executor head_type;
+ composed_work_guard<system_executor> head_;
+};
+
+template <typename Head>
+struct composed_work<void(Head)>
+{
+ typedef composed_io_executors<void(Head)> executors_type;
+
+ explicit composed_work(const executors_type& ex) noexcept
+ : head_(ex.head_)
+ {
+ }
+
+ void reset()
+ {
+ head_.reset();
+ }
+
+ typedef Head head_type;
+ composed_work_guard<Head> head_;
+};
+
+template <typename Head, typename... Tail>
+struct composed_work<void(Head, Tail...)>
+{
+ typedef composed_io_executors<void(Head, Tail...)> executors_type;
+
+ explicit composed_work(const executors_type& ex) noexcept
+ : head_(ex.head_),
+ tail_(ex.tail_)
+ {
+ }
+
+ void reset()
+ {
+ head_.reset();
+ tail_.reset();
+ }
+
+ typedef Head head_type;
+ composed_work_guard<Head> head_;
+ composed_work<void(Tail...)> tail_;
+};
+
+template <typename IoObject>
+inline typename IoObject::executor_type
+get_composed_io_executor(IoObject& io_object,
+ enable_if_t<
+ !is_executor<IoObject>::value
+ >* = 0,
+ enable_if_t<
+ !execution::is_executor<IoObject>::value
+ >* = 0)
+{
+ return io_object.get_executor();
+}
+
+template <typename Executor>
+inline const Executor& get_composed_io_executor(const Executor& ex,
+ enable_if_t<
+ is_executor<Executor>::value
+ || execution::is_executor<Executor>::value
+ >* = 0)
+{
+ return ex;
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_COMPOSED_WORK_HPP
diff --git a/3rdparty/asio/include/asio/detail/concurrency_hint.hpp b/3rdparty/asio/include/asio/detail/concurrency_hint.hpp
new file mode 100644
index 00000000000..43e81a4c22d
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/concurrency_hint.hpp
@@ -0,0 +1,94 @@
+//
+// detail/concurrency_hint.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<unsigned>(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<unsigned>(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<int>(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<int>(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<int>(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/3rdparty/asio/include/asio/detail/conditionally_enabled_event.hpp b/3rdparty/asio/include/asio/detail/conditionally_enabled_event.hpp
new file mode 100644
index 00000000000..af68dde32c0
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/conditionally_enabled_event.hpp
@@ -0,0 +1,120 @@
+//
+// detail/conditionally_enabled_event.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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);
+ }
+
+ // Unlock the mutex and signal one waiter who may destroy us.
+ void unlock_and_signal_one_for_destruction(
+ 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/3rdparty/asio/include/asio/detail/conditionally_enabled_mutex.hpp b/3rdparty/asio/include/asio/detail/conditionally_enabled_mutex.hpp
new file mode 100644
index 00000000000..27fc30ecbb2
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/conditionally_enabled_mutex.hpp
@@ -0,0 +1,149 @@
+//
+// detail/conditionally_enabled_mutex.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/config.hpp b/3rdparty/asio/include/asio/detail/config.hpp
new file mode 100644
index 00000000000..cd345eac2cd
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/config.hpp
@@ -0,0 +1,1422 @@
+//
+// detail/config.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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
+
+// boostify: non-boost code starts here
+#if !defined(ASIO_STANDALONE)
+# if !defined(ASIO_ENABLE_BOOST)
+# if (__cplusplus >= 201103)
+# define ASIO_STANDALONE 1
+# elif defined(_MSC_VER) && defined(_MSVC_LANG)
+# if (_MSC_VER >= 1900) && (_MSVC_LANG >= 201103)
+# define ASIO_STANDALONE 1
+# endif // (_MSC_VER >= 1900) && (_MSVC_LANG >= 201103)
+# endif // defined(_MSC_VER) && defined(_MSVC_LANG)
+# endif // !defined(ASIO_ENABLE_BOOST)
+#endif // !defined(ASIO_STANDALONE)
+
+// Make standard library feature macros available.
+#if defined(__has_include)
+# if __has_include(<version>)
+# include <version>
+# else // __has_include(<version>)
+# include <cstddef>
+# endif // __has_include(<version>)
+#else // defined(__has_include)
+# include <cstddef>
+#endif // defined(__has_include)
+
+// boostify: non-boost code ends here
+#if defined(ASIO_STANDALONE)
+# define ASIO_DISABLE_BOOST_ALIGN 1
+# 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)
+// Boost.Config library is available.
+# include <boost/config.hpp>
+# include <boost/version.hpp>
+# 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)
+
+// Helper macro for documentation.
+#define ASIO_UNSPECIFIED(e) e
+
+// 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)
+
+// 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 <android/api-level.h>
+#endif // defined(__ANDROID__)
+
+// Always enabled. Retained for backwards compatibility in user code.
+#if !defined(ASIO_DISABLE_CXX11_MACROS)
+# define ASIO_HAS_MOVE 1
+# define ASIO_MOVE_ARG(type) type&&
+# define ASIO_MOVE_ARG2(type1, type2) type1, type2&&
+# define ASIO_NONDEDUCED_MOVE_ARG(type) type&
+# define ASIO_MOVE_CAST(type) static_cast<type&&>
+# define ASIO_MOVE_CAST2(type1, type2) static_cast<type1, type2&&>
+# define ASIO_MOVE_OR_LVALUE(type) static_cast<type&&>
+# define ASIO_MOVE_OR_LVALUE_ARG(type) type&&
+# define ASIO_MOVE_OR_LVALUE_TYPE(type) type
+# define ASIO_DELETED = delete
+# define ASIO_HAS_VARIADIC_TEMPLATES 1
+# define ASIO_HAS_CONSTEXPR 1
+# define ASIO_STATIC_CONSTEXPR(type, assignment) \
+ static constexpr type assignment
+# define ASIO_HAS_NOEXCEPT 1
+# define ASIO_NOEXCEPT noexcept(true)
+# define ASIO_NOEXCEPT_OR_NOTHROW noexcept(true)
+# define ASIO_NOEXCEPT_IF(c) noexcept(c)
+# define ASIO_HAS_DECLTYPE 1
+# define ASIO_AUTO_RETURN_TYPE_PREFIX(t) auto
+# define ASIO_AUTO_RETURN_TYPE_PREFIX2(t0, t1) auto
+# define ASIO_AUTO_RETURN_TYPE_PREFIX3(t0, t1, t2) auto
+# define ASIO_AUTO_RETURN_TYPE_SUFFIX(expr) -> decltype expr
+# define ASIO_HAS_ALIAS_TEMPLATES 1
+# define ASIO_HAS_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS 1
+# define ASIO_HAS_ENUM_CLASS 1
+# define ASIO_HAS_REF_QUALIFIED_FUNCTIONS 1
+# define ASIO_LVALUE_REF_QUAL &
+# define ASIO_RVALUE_REF_QUAL &&
+# define ASIO_HAS_USER_DEFINED_LITERALS 1
+# define ASIO_HAS_ALIGNOF 1
+# define ASIO_ALIGNOF(T) alignof(T)
+# define ASIO_HAS_STD_ALIGN 1
+# define ASIO_HAS_STD_SYSTEM_ERROR 1
+# define ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true)
+# define ASIO_HAS_STD_ARRAY 1
+# define ASIO_HAS_STD_SHARED_PTR 1
+# define ASIO_HAS_STD_ALLOCATOR_ARG 1
+# define ASIO_HAS_STD_ATOMIC 1
+# define ASIO_HAS_STD_CHRONO 1
+# define ASIO_HAS_STD_ADDRESSOF 1
+# define ASIO_HAS_STD_FUNCTION 1
+# define ASIO_HAS_STD_REFERENCE_WRAPPER 1
+# define ASIO_HAS_STD_TYPE_TRAITS 1
+# define ASIO_HAS_NULLPTR 1
+# define ASIO_HAS_CXX11_ALLOCATORS 1
+# define ASIO_HAS_CSTDINT 1
+# define ASIO_HAS_STD_THREAD 1
+# define ASIO_HAS_STD_MUTEX_AND_CONDVAR 1
+# define ASIO_HAS_STD_CALL_ONCE 1
+# define ASIO_HAS_STD_FUTURE 1
+# define ASIO_HAS_STD_TUPLE 1
+# define ASIO_HAS_STD_IOSTREAM_MOVE 1
+# define ASIO_HAS_STD_EXCEPTION_PTR 1
+# define ASIO_HAS_STD_NESTED_EXCEPTION 1
+# define ASIO_HAS_STD_HASH 1
+#endif // !defined(ASIO_DISABLE_CXX11_MACROS)
+
+// Support for static constexpr with default initialisation.
+#if !defined(ASIO_STATIC_CONSTEXPR_DEFAULT_INIT)
+# if defined(__GNUC__)
+# if (__GNUC__ >= 8)
+# define ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(type, name) \
+ static constexpr const type name{}
+# else // (__GNUC__ >= 8)
+# define ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(type, name) \
+ static const type name
+# endif // (__GNUC__ >= 8)
+# elif defined(ASIO_MSVC)
+# define ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(type, name) \
+ static const type name
+# else // defined(ASIO_MSVC)
+# define ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(type, name) \
+ static constexpr const type name{}
+# endif // defined(ASIO_MSVC)
+#endif // !defined(ASIO_STATIC_CONSTEXPR_DEFAULT_INIT)
+
+// Support noexcept on function types on compilers known to allow it.
+#if !defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+# if !defined(ASIO_DISABLE_NOEXCEPT_FUNCTION_TYPE)
+# if defined(__clang__)
+# if (__cplusplus >= 202002)
+# define ASIO_HAS_NOEXCEPT_FUNCTION_TYPE 1
+# endif // (__cplusplus >= 202002)
+# elif defined(__GNUC__)
+# if (__cplusplus >= 202002)
+# define ASIO_HAS_NOEXCEPT_FUNCTION_TYPE 1
+# endif // (__cplusplus >= 202002)
+# elif defined(ASIO_MSVC)
+# if (_MSC_VER >= 1900 && _MSVC_LANG >= 202002)
+# define ASIO_HAS_NOEXCEPT_FUNCTION_TYPE 1
+# endif // (_MSC_VER >= 1900 && _MSVC_LANG >= 202002)
+# endif // defined(ASIO_MSVC)
+# endif // !defined(ASIO_DISABLE_NOEXCEPT_FUNCTION_TYPE)
+#endif // !defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+// Support return type deduction on compilers known to allow it.
+#if !defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+# if !defined(ASIO_DISABLE_RETURN_TYPE_DEDUCTION)
+# if defined(__clang__)
+# if __has_feature(__cxx_return_type_deduction__)
+# define ASIO_HAS_RETURN_TYPE_DEDUCTION 1
+# endif // __has_feature(__cxx_return_type_deduction__)
+# elif (__cplusplus >= 201402)
+# define ASIO_HAS_RETURN_TYPE_DEDUCTION 1
+# elif defined(__cpp_return_type_deduction)
+# if (__cpp_return_type_deduction >= 201304)
+# define ASIO_HAS_RETURN_TYPE_DEDUCTION 1
+# endif // (__cpp_return_type_deduction >= 201304)
+# elif defined(ASIO_MSVC)
+# if (_MSC_VER >= 1900 && _MSVC_LANG >= 201402)
+# define ASIO_HAS_RETURN_TYPE_DEDUCTION 1
+# endif // (_MSC_VER >= 1900 && _MSVC_LANG >= 201402)
+# endif // defined(ASIO_MSVC)
+# endif // !defined(ASIO_DISABLE_RETURN_TYPE_DEDUCTION)
+#endif // !defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+
+// Support concepts on compilers known to allow them.
+#if !defined(ASIO_HAS_CONCEPTS)
+# if !defined(ASIO_DISABLE_CONCEPTS)
+# if defined(__cpp_concepts)
+# define ASIO_HAS_CONCEPTS 1
+# if (__cpp_concepts >= 201707)
+# define ASIO_CONCEPT concept
+# else // (__cpp_concepts >= 201707)
+# define ASIO_CONCEPT concept bool
+# endif // (__cpp_concepts >= 201707)
+# endif // defined(__cpp_concepts)
+# endif // !defined(ASIO_DISABLE_CONCEPTS)
+#endif // !defined(ASIO_HAS_CONCEPTS)
+
+// Support concepts on compilers known to allow them.
+#if !defined(ASIO_HAS_STD_CONCEPTS)
+# if !defined(ASIO_DISABLE_STD_CONCEPTS)
+# if defined(ASIO_HAS_CONCEPTS)
+# if (__cpp_lib_concepts >= 202002L)
+# define ASIO_HAS_STD_CONCEPTS 1
+# endif // (__cpp_concepts >= 202002L)
+# endif // defined(ASIO_HAS_CONCEPTS)
+# endif // !defined(ASIO_DISABLE_STD_CONCEPTS)
+#endif // !defined(ASIO_HAS_STD_CONCEPTS)
+
+// Support template variables on compilers known to allow it.
+#if !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+# if !defined(ASIO_DISABLE_VARIABLE_TEMPLATES)
+# if defined(__clang__)
+# if (__cplusplus >= 201402)
+# if __has_feature(__cxx_variable_templates__)
+# define ASIO_HAS_VARIABLE_TEMPLATES 1
+# endif // __has_feature(__cxx_variable_templates__)
+# endif // (__cplusplus >= 201402)
+# elif defined(__GNUC__) && !defined(__INTEL_COMPILER)
+# if (__GNUC__ >= 6)
+# if (__cplusplus >= 201402)
+# define ASIO_HAS_VARIABLE_TEMPLATES 1
+# endif // (__cplusplus >= 201402)
+# endif // (__GNUC__ >= 6)
+# endif // defined(__GNUC__) && !defined(__INTEL_COMPILER)
+# if defined(ASIO_MSVC)
+# if (_MSC_VER >= 1901)
+# define ASIO_HAS_VARIABLE_TEMPLATES 1
+# endif // (_MSC_VER >= 1901)
+# endif // defined(ASIO_MSVC)
+# endif // !defined(ASIO_DISABLE_VARIABLE_TEMPLATES)
+#endif // !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+// Support SFINAEd template variables on compilers known to allow it.
+#if !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+# if !defined(ASIO_DISABLE_SFINAE_VARIABLE_TEMPLATES)
+# if defined(__clang__)
+# if (__cplusplus >= 201703)
+# if __has_feature(__cxx_variable_templates__)
+# define ASIO_HAS_SFINAE_VARIABLE_TEMPLATES 1
+# endif // __has_feature(__cxx_variable_templates__)
+# endif // (__cplusplus >= 201703)
+# elif defined(__GNUC__)
+# if ((__GNUC__ == 8) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 8)
+# if (__cplusplus >= 201402)
+# define ASIO_HAS_SFINAE_VARIABLE_TEMPLATES 1
+# endif // (__cplusplus >= 201402)
+# endif // ((__GNUC__ == 8) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 8)
+# endif // defined(__GNUC__)
+# if defined(ASIO_MSVC)
+# if (_MSC_VER >= 1901)
+# define ASIO_HAS_SFINAE_VARIABLE_TEMPLATES 1
+# endif // (_MSC_VER >= 1901)
+# endif // defined(ASIO_MSVC)
+# endif // !defined(ASIO_DISABLE_SFINAE_VARIABLE_TEMPLATES)
+#endif // !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+// Support SFINAE use of constant expressions on compilers known to allow it.
+#if !defined(ASIO_HAS_CONSTANT_EXPRESSION_SFINAE)
+# if !defined(ASIO_DISABLE_CONSTANT_EXPRESSION_SFINAE)
+# if defined(__clang__)
+# if (__cplusplus >= 201402)
+# define ASIO_HAS_CONSTANT_EXPRESSION_SFINAE 1
+# endif // (__cplusplus >= 201402)
+# elif defined(__GNUC__) && !defined(__INTEL_COMPILER)
+# if (__GNUC__ >= 7)
+# if (__cplusplus >= 201402)
+# define ASIO_HAS_CONSTANT_EXPRESSION_SFINAE 1
+# endif // (__cplusplus >= 201402)
+# endif // (__GNUC__ >= 7)
+# endif // defined(__GNUC__) && !defined(__INTEL_COMPILER)
+# if defined(ASIO_MSVC)
+# if (_MSC_VER >= 1901)
+# define ASIO_HAS_CONSTANT_EXPRESSION_SFINAE 1
+# endif // (_MSC_VER >= 1901)
+# endif // defined(ASIO_MSVC)
+# endif // !defined(ASIO_DISABLE_CONSTANT_EXPRESSION_SFINAE)
+#endif // !defined(ASIO_HAS_CONSTANT_EXPRESSION_SFINAE)
+
+// Enable workarounds for lack of working expression SFINAE.
+#if !defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# if !defined(ASIO_DISABLE_WORKING_EXPRESSION_SFINAE)
+# if !defined(ASIO_MSVC) && !defined(__INTEL_COMPILER)
+# if (__cplusplus >= 201103)
+# define ASIO_HAS_WORKING_EXPRESSION_SFINAE 1
+# endif // (__cplusplus >= 201103)
+# elif defined(ASIO_MSVC) && (_MSC_VER >= 1929)
+# if (_MSVC_LANG >= 202000)
+# define ASIO_HAS_WORKING_EXPRESSION_SFINAE 1
+# endif // (_MSVC_LANG >= 202000)
+# endif // defined(ASIO_MSVC) && (_MSC_VER >= 1929)
+# endif // !defined(ASIO_DISABLE_WORKING_EXPRESSION_SFINAE)
+#endif // !defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+// Support for capturing parameter packs in lambdas.
+#if !defined(ASIO_HAS_VARIADIC_LAMBDA_CAPTURES)
+# if !defined(ASIO_DISABLE_VARIADIC_LAMBDA_CAPTURES)
+# if defined(__GNUC__)
+# if (__GNUC__ >= 6)
+# define ASIO_HAS_VARIADIC_LAMBDA_CAPTURES 1
+# endif // (__GNUC__ >= 6)
+# elif defined(ASIO_MSVC)
+# if (_MSVC_LANG >= 201103)
+# define ASIO_HAS_VARIADIC_LAMBDA_CAPTURES 1
+# endif // (_MSC_LANG >= 201103)
+# else // defined(ASIO_MSVC)
+# if (__cplusplus >= 201103)
+# define ASIO_HAS_VARIADIC_LAMBDA_CAPTURES 1
+# endif // (__cplusplus >= 201103)
+# endif // defined(ASIO_MSVC)
+# endif // !defined(ASIO_DISABLE_VARIADIC_LAMBDA_CAPTURES)
+#endif // !defined(ASIO_HAS_VARIADIC_LAMBDA_CAPTURES)
+
+// Default alignment.
+#if defined(__STDCPP_DEFAULT_NEW_ALIGNMENT__)
+# define ASIO_DEFAULT_ALIGN __STDCPP_DEFAULT_NEW_ALIGNMENT__
+#elif defined(__GNUC__)
+# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 9)) || (__GNUC__ > 4)
+# define ASIO_DEFAULT_ALIGN alignof(std::max_align_t)
+# else // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 9)) || (__GNUC__ > 4)
+# define ASIO_DEFAULT_ALIGN alignof(max_align_t)
+# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 9)) || (__GNUC__ > 4)
+#else // defined(__GNUC__)
+# define ASIO_DEFAULT_ALIGN alignof(std::max_align_t)
+#endif // defined(__GNUC__)
+
+// Standard library support for aligned allocation.
+#if !defined(ASIO_HAS_STD_ALIGNED_ALLOC)
+# if !defined(ASIO_DISABLE_STD_ALIGNED_ALLOC)
+# if (__cplusplus >= 201703)
+# if defined(__clang__)
+# if defined(ASIO_HAS_CLANG_LIBCXX)
+# if (_LIBCPP_STD_VER > 14) && defined(_LIBCPP_HAS_ALIGNED_ALLOC) \
+ && !defined(_LIBCPP_MSVCRT) && !defined(__MINGW32__)
+# if defined(__APPLE__)
+# if defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
+# if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101500)
+# define ASIO_HAS_STD_ALIGNED_ALLOC 1
+# endif // (__MAC_OS_X_VERSION_MIN_REQUIRED >= 101500)
+# elif defined(__IPHONE_OS_VERSION_MIN_REQUIRED)
+# if (__IPHONE_OS_VERSION_MIN_REQUIRED >= 130000)
+# define ASIO_HAS_STD_ALIGNED_ALLOC 1
+# endif // (__IPHONE_OS_VERSION_MIN_REQUIRED >= 130000)
+# elif defined(__TV_OS_VERSION_MIN_REQUIRED)
+# if (__TV_OS_VERSION_MIN_REQUIRED >= 130000)
+# define ASIO_HAS_STD_ALIGNED_ALLOC 1
+# endif // (__TV_OS_VERSION_MIN_REQUIRED >= 130000)
+# elif defined(__WATCH_OS_VERSION_MIN_REQUIRED)
+# if (__WATCH_OS_VERSION_MIN_REQUIRED >= 60000)
+# define ASIO_HAS_STD_ALIGNED_ALLOC 1
+# endif // (__WATCH_OS_VERSION_MIN_REQUIRED >= 60000)
+# endif // defined(__WATCH_OS_X_VERSION_MIN_REQUIRED)
+# else // defined(__APPLE__)
+# define ASIO_HAS_STD_ALIGNED_ALLOC 1
+# endif // defined(__APPLE__)
+# endif // (_LIBCPP_STD_VER > 14) && defined(_LIBCPP_HAS_ALIGNED_ALLOC)
+ // && !defined(_LIBCPP_MSVCRT) && !defined(__MINGW32__)
+# elif defined(_GLIBCXX_HAVE_ALIGNED_ALLOC)
+# define ASIO_HAS_STD_ALIGNED_ALLOC 1
+# endif // defined(_GLIBCXX_HAVE_ALIGNED_ALLOC)
+# elif defined(__GNUC__)
+# if ((__GNUC__ == 7) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 7)
+# if defined(_GLIBCXX_HAVE_ALIGNED_ALLOC)
+# define ASIO_HAS_STD_ALIGNED_ALLOC 1
+# endif // defined(_GLIBCXX_HAVE_ALIGNED_ALLOC)
+# endif // ((__GNUC__ == 7) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 7)
+# endif // defined(__GNUC__)
+# endif // (__cplusplus >= 201703)
+# endif // !defined(ASIO_DISABLE_STD_ALIGNED_ALLOC)
+#endif // !defined(ASIO_HAS_STD_ALIGNED_ALLOC)
+
+// Boost support for chrono.
+#if !defined(ASIO_HAS_BOOST_CHRONO)
+# if !defined(ASIO_DISABLE_BOOST_CHRONO)
+# if defined(ASIO_HAS_BOOST_CONFIG) && (BOOST_VERSION >= 104700)
+# define ASIO_HAS_BOOST_CHRONO 1
+# endif // defined(ASIO_HAS_BOOST_CONFIG) && (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)
+
+// Boost support for the Coroutine library.
+#if !defined(ASIO_HAS_BOOST_COROUTINE)
+# if !defined(ASIO_DISABLE_BOOST_COROUTINE)
+# define ASIO_HAS_BOOST_COROUTINE 1
+# endif // !defined(ASIO_DISABLE_BOOST_COROUTINE)
+#endif // !defined(ASIO_HAS_BOOST_COROUTINE)
+
+// Boost support for the Context library's fibers.
+#if !defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+# if !defined(ASIO_DISABLE_BOOST_CONTEXT_FIBER)
+# if defined(__clang__)
+# if (__cplusplus >= 201103)
+# define ASIO_HAS_BOOST_CONTEXT_FIBER 1
+# endif // (__cplusplus >= 201103)
+# elif defined(__GNUC__)
+# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) || (__GNUC__ > 4)
+# if (__cplusplus >= 201103) || defined(__GXX_EXPERIMENTAL_CXX0X__)
+# define ASIO_HAS_BOOST_CONTEXT_FIBER 1
+# endif // (__cplusplus >= 201103) || defined(__GXX_EXPERIMENTAL_CXX0X__)
+# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) || (__GNUC__ > 4)
+# endif // defined(__GNUC__)
+# if defined(ASIO_MSVC)
+# if (_MSVC_LANG >= 201103)
+# define ASIO_HAS_BOOST_CONTEXT_FIBER 1
+# endif // (_MSC_LANG >= 201103)
+# endif // defined(ASIO_MSVC)
+# endif // !defined(ASIO_DISABLE_BOOST_CONTEXT_FIBER)
+#endif // !defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+
+// 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 defined(ASIO_HAS_CLANG_LIBCXX)
+# if (__cplusplus >= 201402)
+# if __has_include(<string_view>)
+# define ASIO_HAS_STD_STRING_VIEW 1
+# endif // __has_include(<string_view>)
+# endif // (__cplusplus >= 201402)
+# else // defined(ASIO_HAS_CLANG_LIBCXX)
+# if (__cplusplus >= 201703)
+# if __has_include(<string_view>)
+# define ASIO_HAS_STD_STRING_VIEW 1
+# endif // __has_include(<string_view>)
+# endif // (__cplusplus >= 201703)
+# endif // defined(ASIO_HAS_CLANG_LIBCXX)
+# elif defined(__GNUC__)
+# if (__GNUC__ >= 7)
+# if (__cplusplus >= 201703)
+# define ASIO_HAS_STD_STRING_VIEW 1
+# endif // (__cplusplus >= 201703)
+# endif // (__GNUC__ >= 7)
+# elif defined(ASIO_MSVC)
+# if (_MSC_VER >= 1910 && _MSVC_LANG >= 201703)
+# define ASIO_HAS_STD_STRING_VIEW 1
+# endif // (_MSC_VER >= 1910 && _MSVC_LANG >= 201703)
+# 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 defined(ASIO_HAS_CLANG_LIBCXX)
+# if (_LIBCPP_VERSION < 7000)
+# if (__cplusplus >= 201402)
+# if __has_include(<experimental/string_view>)
+# define ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW 1
+# endif // __has_include(<experimental/string_view>)
+# endif // (__cplusplus >= 201402)
+# endif // (_LIBCPP_VERSION < 7000)
+# else // defined(ASIO_HAS_CLANG_LIBCXX)
+# if (__cplusplus >= 201402)
+# if __has_include(<experimental/string_view>)
+# define ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW 1
+# endif // __has_include(<experimental/string_view>)
+# endif // (__cplusplus >= 201402)
+# endif // // defined(ASIO_HAS_CLANG_LIBCXX)
+# elif 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 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 >= 1911 && _MSVC_LANG >= 201703)
+# define ASIO_HAS_STD_INVOKE_RESULT 1
+# endif // (_MSC_VER >= 1911 && _MSVC_LANG >= 201703)
+# else // defined(ASIO_MSVC)
+# if (__cplusplus >= 201703)
+# define ASIO_HAS_STD_INVOKE_RESULT 1
+# endif // (__cplusplus >= 201703)
+# endif // defined(ASIO_MSVC)
+# endif // !defined(ASIO_DISABLE_STD_INVOKE_RESULT)
+#endif // !defined(ASIO_HAS_STD_INVOKE_RESULT)
+
+// Standard library support for std::any.
+#if !defined(ASIO_HAS_STD_ANY)
+# if !defined(ASIO_DISABLE_STD_ANY)
+# if defined(__clang__)
+# if (__cplusplus >= 201703)
+# if __has_include(<any>)
+# define ASIO_HAS_STD_ANY 1
+# endif // __has_include(<any>)
+# endif // (__cplusplus >= 201703)
+# elif defined(__GNUC__)
+# if (__GNUC__ >= 7)
+# if (__cplusplus >= 201703)
+# define ASIO_HAS_STD_ANY 1
+# endif // (__cplusplus >= 201703)
+# endif // (__GNUC__ >= 7)
+# endif // defined(__GNUC__)
+# if defined(ASIO_MSVC)
+# if (_MSC_VER >= 1910) && (_MSVC_LANG >= 201703)
+# define ASIO_HAS_STD_ANY 1
+# endif // (_MSC_VER >= 1910) && (_MSVC_LANG >= 201703)
+# endif // defined(ASIO_MSVC)
+# endif // !defined(ASIO_DISABLE_STD_ANY)
+#endif // !defined(ASIO_HAS_STD_ANY)
+
+// Standard library support for std::variant.
+#if !defined(ASIO_HAS_STD_VARIANT)
+# if !defined(ASIO_DISABLE_STD_VARIANT)
+# if defined(__clang__)
+# if (__cplusplus >= 201703)
+# if __has_include(<variant>)
+# define ASIO_HAS_STD_VARIANT 1
+# endif // __has_include(<variant>)
+# endif // (__cplusplus >= 201703)
+# elif defined(__GNUC__)
+# if (__GNUC__ >= 7)
+# if (__cplusplus >= 201703)
+# define ASIO_HAS_STD_VARIANT 1
+# endif // (__cplusplus >= 201703)
+# endif // (__GNUC__ >= 7)
+# endif // defined(__GNUC__)
+# if defined(ASIO_MSVC)
+# if (_MSC_VER >= 1910) && (_MSVC_LANG >= 201703)
+# define ASIO_HAS_STD_VARIANT 1
+# endif // (_MSC_VER >= 1910) && (_MSVC_LANG >= 201703)
+# endif // defined(ASIO_MSVC)
+# endif // !defined(ASIO_DISABLE_STD_VARIANT)
+#endif // !defined(ASIO_HAS_STD_VARIANT)
+
+// Standard library support for std::source_location.
+#if !defined(ASIO_HAS_STD_SOURCE_LOCATION)
+# if !defined(ASIO_DISABLE_STD_SOURCE_LOCATION)
+// ...
+# endif // !defined(ASIO_DISABLE_STD_SOURCE_LOCATION)
+#endif // !defined(ASIO_HAS_STD_SOURCE_LOCATION)
+
+// Standard library support for std::experimental::source_location.
+#if !defined(ASIO_HAS_STD_EXPERIMENTAL_SOURCE_LOCATION)
+# if !defined(ASIO_DISABLE_STD_EXPERIMENTAL_SOURCE_LOCATION)
+# if defined(__GNUC__)
+# if (__cplusplus >= 201709)
+# if __has_include(<experimental/source_location>)
+# define ASIO_HAS_STD_EXPERIMENTAL_SOURCE_LOCATION 1
+# endif // __has_include(<experimental/source_location>)
+# endif // (__cplusplus >= 201709)
+# endif // defined(__GNUC__)
+# endif // !defined(ASIO_DISABLE_STD_EXPERIMENTAL_SOURCE_LOCATION)
+#endif // !defined(ASIO_HAS_STD_EXPERIMENTAL_SOURCE_LOCATION)
+
+// Standard library has a source_location that we can use.
+#if !defined(ASIO_HAS_SOURCE_LOCATION)
+# if !defined(ASIO_DISABLE_SOURCE_LOCATION)
+# if defined(ASIO_HAS_STD_SOURCE_LOCATION)
+# define ASIO_HAS_SOURCE_LOCATION 1
+# elif defined(ASIO_HAS_STD_EXPERIMENTAL_SOURCE_LOCATION)
+# define ASIO_HAS_SOURCE_LOCATION 1
+# endif // defined(ASIO_HAS_STD_EXPERIMENTAL_SOURCE_LOCATION)
+# endif // !defined(ASIO_DISABLE_SOURCE_LOCATION)
+#endif // !defined(ASIO_HAS_SOURCE_LOCATION)
+
+// Boost support for source_location and system errors.
+#if !defined(ASIO_HAS_BOOST_SOURCE_LOCATION)
+# if !defined(ASIO_DISABLE_BOOST_SOURCE_LOCATION)
+# if defined(ASIO_HAS_BOOST_CONFIG) && (BOOST_VERSION >= 107900)
+# define ASIO_HAS_BOOST_SOURCE_LOCATION 1
+# endif // defined(ASIO_HAS_BOOST_CONFIG) && (BOOST_VERSION >= 107900)
+# endif // !defined(ASIO_DISABLE_BOOST_SOURCE_LOCATION)
+#endif // !defined(ASIO_HAS_BOOST_SOURCE_LOCATION)
+
+// Helper macros for working with Boost source locations.
+#if defined(ASIO_HAS_BOOST_SOURCE_LOCATION)
+# define ASIO_SOURCE_LOCATION_PARAM \
+ , const boost::source_location& loc
+# define ASIO_SOURCE_LOCATION_DEFAULTED_PARAM \
+ , const boost::source_location& loc = BOOST_CURRENT_LOCATION
+# define ASIO_SOURCE_LOCATION_ARG , loc
+#else // if defined(ASIO_HAS_BOOST_SOURCE_LOCATION)
+# define ASIO_SOURCE_LOCATION_PARAM
+# define ASIO_SOURCE_LOCATION_DEFAULTED_PARAM
+# define ASIO_SOURCE_LOCATION_ARG
+#endif // if defined(ASIO_HAS_BOOST_SOURCE_LOCATION)
+
+// Standard library support for std::index_sequence.
+#if !defined(ASIO_HAS_STD_INDEX_SEQUENCE)
+# if !defined(ASIO_DISABLE_STD_INDEX_SEQUENCE)
+# if defined(__clang__)
+# if (__cplusplus >= 201402)
+# define ASIO_HAS_STD_INDEX_SEQUENCE 1
+# endif // (__cplusplus >= 201402)
+# elif defined(__GNUC__)
+# if (__GNUC__ >= 7)
+# if (__cplusplus >= 201402)
+# define ASIO_HAS_STD_INDEX_SEQUENCE 1
+# endif // (__cplusplus >= 201402)
+# endif // (__GNUC__ >= 7)
+# endif // defined(__GNUC__)
+# if defined(ASIO_MSVC)
+# if (_MSC_VER >= 1910) && (_MSVC_LANG >= 201402)
+# define ASIO_HAS_STD_INDEX_SEQUENCE 1
+# endif // (_MSC_VER >= 1910) && (_MSVC_LANG >= 201402)
+# endif // defined(ASIO_MSVC)
+# endif // !defined(ASIO_DISABLE_STD_INDEX_SEQUENCE)
+#endif // !defined(ASIO_HAS_STD_INDEX_SEQUENCE)
+
+// Windows App target. Windows but with a limited API.
+#if !defined(ASIO_WINDOWS_APP)
+# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0603)
+# include <winapifamily.h>
+# if (WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) \
+ || WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE)) \
+ && !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 <winapifamily.h>
+# 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__) && !defined(__clang__))
+# pragma message( \
+ "Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately. For example:\n"\
+ "- add -D_WIN32_WINNT=0x0601 to the compiler command line; or\n"\
+ "- add _WIN32_WINNT=0x0601 to your project's Preprocessor Definitions.\n"\
+ "Assuming _WIN32_WINNT=0x0601 (i.e. Windows 7 target).")
+# else // defined(_MSC_VER) || (defined(__BORLANDC__) && !defined(__clang__))
+# warning Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately.
+# warning For example, add -D_WIN32_WINNT=0x0601 to the compiler command line.
+# warning Assuming _WIN32_WINNT=0x0601 (i.e. Windows 7 target).
+# endif // defined(_MSC_VER) || (defined(__BORLANDC__) && !defined(__clang__))
+# define _WIN32_WINNT 0x0601
+# 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__) \
+ || defined(__HAIKU__)
+# 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 <unistd.h>
+#endif // defined(ASIO_HAS_UNISTD_H)
+
+// Linux: epoll, eventfd, timerfd and io_uring.
+#if defined(__linux__)
+# include <linux/version.h>
+# 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)
+# if defined(ASIO_HAS_IO_URING)
+# if LINUX_VERSION_CODE < KERNEL_VERSION(5,10,0)
+# error Linux kernel 5.10 or later is required to support io_uring
+# endif // LINUX_VERSION_CODE < KERNEL_VERSION(5,10,0)
+# endif // defined(ASIO_HAS_IO_URING)
+#endif // defined(__linux__)
+
+// Linux: io_uring is used instead of epoll.
+#if !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# if !defined(ASIO_HAS_EPOLL) && defined(ASIO_HAS_IO_URING)
+# define ASIO_HAS_IO_URING_AS_DEFAULT 1
+# endif // !defined(ASIO_HAS_EPOLL) && defined(ASIO_HAS_IO_URING)
+#endif // !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+// 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_RUNTIME)
+# define ASIO_HAS_LOCAL_SOCKETS 1
+# endif // !defined(ASIO_WINDOWS_RUNTIME)
+# endif // !defined(ASIO_DISABLE_LOCAL_SOCKETS)
+#endif // !defined(ASIO_HAS_LOCAL_SOCKETS)
+
+// Files.
+#if !defined(ASIO_HAS_FILE)
+# if !defined(ASIO_DISABLE_FILE)
+# if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE)
+# define ASIO_HAS_FILE 1
+# elif defined(ASIO_HAS_IO_URING)
+# define ASIO_HAS_FILE 1
+# endif // defined(ASIO_HAS_IO_URING)
+# endif // !defined(ASIO_DISABLE_FILE)
+#endif // !defined(ASIO_HAS_FILE)
+
+// Pipes.
+#if !defined(ASIO_HAS_PIPE)
+# if defined(ASIO_HAS_IOCP) \
+ || !defined(ASIO_WINDOWS) \
+ && !defined(ASIO_WINDOWS_RUNTIME) \
+ && !defined(__CYGWIN__)
+# if !defined(__SYMBIAN32__)
+# if !defined(ASIO_DISABLE_PIPE)
+# define ASIO_HAS_PIPE 1
+# endif // !defined(ASIO_DISABLE_PIPE)
+# endif // !defined(__SYMBIAN32__)
+# endif // defined(ASIO_HAS_IOCP)
+ // || !defined(ASIO_WINDOWS)
+ // && !defined(ASIO_WINDOWS_RUNTIME)
+ // && !defined(__CYGWIN__)
+#endif // !defined(ASIO_HAS_PIPE)
+
+// 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(__HAIKU__)
+# 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
+# elif defined(__HAIKU__)
+# 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 align library.
+#if !defined(ASIO_HAS_BOOST_ALIGN)
+# if !defined(ASIO_DISABLE_BOOST_ALIGN)
+# if defined(ASIO_HAS_BOOST_CONFIG) && (BOOST_VERSION >= 105600)
+# define ASIO_HAS_BOOST_ALIGN 1
+# endif // defined(ASIO_HAS_BOOST_CONFIG) && (BOOST_VERSION >= 105600)
+# endif // !defined(ASIO_DISABLE_BOOST_ALIGN)
+#endif // !defined(ASIO_HAS_BOOST_ALIGN)
+
+// 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__) || defined(__clang__)
+# define ASIO_HAS_HANDLER_HOOKS 1
+# endif // !defined(__BORLANDC__) || defined(__clang__)
+# endif // !defined(ASIO_DISABLE_HANDLER_HOOKS)
+#endif // !defined(ASIO_HAS_HANDLER_HOOKS)
+
+// Support for the __thread keyword extension, or equivalent.
+#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)
+# if defined(__APPLE__)
+# if defined(__clang__)
+# if defined(__apple_build_version__)
+# define ASIO_HAS_THREAD_KEYWORD_EXTENSION 1
+# define ASIO_THREAD_KEYWORD __thread
+# endif // defined(__apple_build_version__)
+# endif // defined(__clang__)
+# endif // defined(__APPLE__)
+# if !defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION)
+# if defined(ASIO_HAS_BOOST_CONFIG)
+# if !defined(BOOST_NO_CXX11_THREAD_LOCAL)
+# define ASIO_HAS_THREAD_KEYWORD_EXTENSION 1
+# define ASIO_THREAD_KEYWORD thread_local
+# endif // !defined(BOOST_NO_CXX11_THREAD_LOCAL)
+# endif // defined(ASIO_HAS_BOOST_CONFIG)
+# endif // !defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION)
+#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 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)
+
+// Helper macro to tell the optimiser what may be assumed to be true.
+#if defined(ASIO_MSVC)
+# define ASIO_ASSUME(expr) __assume(expr)
+#elif defined(__clang__)
+# if __has_builtin(__builtin_assume)
+# define ASIO_ASSUME(expr) __builtin_assume(expr)
+# endif // __has_builtin(__builtin_assume)
+#elif defined(__GNUC__)
+# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4)
+# define ASIO_ASSUME(expr) if (expr) {} else { __builtin_unreachable(); }
+# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4)
+#endif // defined(__GNUC__)
+#if !defined(ASIO_ASSUME)
+# define ASIO_ASSUME(expr) (void)0
+#endif // !defined(ASIO_ASSUME)
+
+// Support the co_await keyword on compilers known to allow it.
+#if !defined(ASIO_HAS_CO_AWAIT)
+# if !defined(ASIO_DISABLE_CO_AWAIT)
+# if defined(ASIO_MSVC)
+# if (_MSC_VER >= 1928) && (_MSVC_LANG >= 201705) && !defined(__clang__)
+# define ASIO_HAS_CO_AWAIT 1
+# elif (_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)
+# elif defined(__clang__)
+# if (__clang_major__ >= 14)
+# if (__cplusplus >= 202002) && (__cpp_impl_coroutine >= 201902)
+# if __has_include(<coroutine>)
+# define ASIO_HAS_CO_AWAIT 1
+# endif // __has_include(<coroutine>)
+# elif (__cplusplus >= 201703) && defined(__cpp_coroutines) && (__cpp_coroutines >= 201703)
+# if __has_include(<experimental/coroutine>)
+# define ASIO_HAS_CO_AWAIT 1
+# endif // __has_include(<experimental/coroutine>)
+# endif // (__cplusplus >= 201703) && defined(__cpp_coroutines) && (__cpp_coroutines >= 201703)
+# else // (__clang_major__ >= 14)
+# if (__cplusplus >= 201703) && defined(__cpp_coroutines) && (__cpp_coroutines >= 201703)
+# if __has_include(<experimental/coroutine>)
+# define ASIO_HAS_CO_AWAIT 1
+# endif // __has_include(<experimental/coroutine>)
+# endif // (__cplusplus >= 201703) && defined(__cpp_coroutines) && (__cpp_coroutines >= 201703)
+# endif // (__clang_major__ >= 14)
+# elif defined(__GNUC__)
+# if (__cplusplus >= 201709) && (__cpp_impl_coroutine >= 201902)
+# if __has_include(<coroutine>)
+# define ASIO_HAS_CO_AWAIT 1
+# endif // __has_include(<coroutine>)
+# endif // (__cplusplus >= 201709) && (__cpp_impl_coroutine >= 201902)
+# endif // defined(__GNUC__)
+# endif // !defined(ASIO_DISABLE_CO_AWAIT)
+#endif // !defined(ASIO_HAS_CO_AWAIT)
+
+// Standard library support for coroutines.
+#if !defined(ASIO_HAS_STD_COROUTINE)
+# if !defined(ASIO_DISABLE_STD_COROUTINE)
+# if defined(ASIO_MSVC)
+# if (_MSC_VER >= 1928) && (_MSVC_LANG >= 201705)
+# define ASIO_HAS_STD_COROUTINE 1
+# endif // (_MSC_VER >= 1928) && (_MSVC_LANG >= 201705)
+# elif defined(__clang__)
+# if (__clang_major__ >= 14)
+# if (__cplusplus >= 202002) && (__cpp_impl_coroutine >= 201902)
+# if __has_include(<coroutine>)
+# define ASIO_HAS_STD_COROUTINE 1
+# endif // __has_include(<coroutine>)
+# endif // (__cplusplus >= 202002) && (__cpp_impl_coroutine >= 201902)
+# endif // (__clang_major__ >= 14)
+# elif defined(__GNUC__)
+# if (__cplusplus >= 201709) && (__cpp_impl_coroutine >= 201902)
+# if __has_include(<coroutine>)
+# define ASIO_HAS_STD_COROUTINE 1
+# endif // __has_include(<coroutine>)
+# endif // (__cplusplus >= 201709) && (__cpp_impl_coroutine >= 201902)
+# endif // defined(__GNUC__)
+# endif // !defined(ASIO_DISABLE_STD_COROUTINE)
+#endif // !defined(ASIO_HAS_STD_COROUTINE)
+
+// Compiler support for the the [[nodiscard]] attribute.
+#if !defined(ASIO_NODISCARD)
+# if defined(__has_cpp_attribute)
+# if __has_cpp_attribute(nodiscard)
+# if (__cplusplus >= 201703)
+# define ASIO_NODISCARD [[nodiscard]]
+# endif // (__cplusplus >= 201703)
+# endif // __has_cpp_attribute(nodiscard)
+# endif // defined(__has_cpp_attribute)
+#endif // !defined(ASIO_NODISCARD)
+#if !defined(ASIO_NODISCARD)
+# define ASIO_NODISCARD
+#endif // !defined(ASIO_NODISCARD)
+
+// Kernel support for MSG_NOSIGNAL.
+#if !defined(ASIO_HAS_MSG_NOSIGNAL)
+# if defined(__linux__)
+# define ASIO_HAS_MSG_NOSIGNAL 1
+# elif defined(_POSIX_VERSION)
+# if (_POSIX_VERSION >= 200809L)
+# define ASIO_HAS_MSG_NOSIGNAL 1
+# endif // _POSIX_VERSION >= 200809L
+# endif // defined(_POSIX_VERSION)
+#endif // !defined(ASIO_HAS_MSG_NOSIGNAL)
+
+// Standard library support for std::to_address.
+#if !defined(ASIO_HAS_STD_TO_ADDRESS)
+# if !defined(ASIO_DISABLE_STD_TO_ADDRESS)
+# if defined(__clang__)
+# if (__cplusplus >= 202002)
+# define ASIO_HAS_STD_TO_ADDRESS 1
+# endif // (__cplusplus >= 202002)
+# elif defined(__GNUC__)
+# if (__GNUC__ >= 8)
+# if (__cplusplus >= 202002)
+# define ASIO_HAS_STD_TO_ADDRESS 1
+# endif // (__cplusplus >= 202002)
+# endif // (__GNUC__ >= 8)
+# endif // defined(__GNUC__)
+# if defined(ASIO_MSVC)
+# if (_MSC_VER >= 1922) && (_MSVC_LANG >= 202002)
+# define ASIO_HAS_STD_TO_ADDRESS 1
+# endif // (_MSC_VER >= 1922) && (_MSVC_LANG >= 202002)
+# endif // defined(ASIO_MSVC)
+# endif // !defined(ASIO_DISABLE_STD_TO_ADDRESS)
+#endif // !defined(ASIO_HAS_STD_TO_ADDRESS)
+
+// Standard library support for snprintf.
+#if !defined(ASIO_HAS_SNPRINTF)
+# if !defined(ASIO_DISABLE_SNPRINTF)
+# if defined(__apple_build_version__)
+# if (__clang_major__ >= 14)
+# define ASIO_HAS_SNPRINTF 1
+# endif // (__clang_major__ >= 14)
+# endif // defined(__apple_build_version__)
+# endif // !defined(ASIO_DISABLE_SNPRINTF)
+#endif // !defined(ASIO_HAS_SNPRINTF)
+
+#endif // ASIO_DETAIL_CONFIG_HPP
diff --git a/3rdparty/asio/include/asio/detail/consuming_buffers.hpp b/3rdparty/asio/include/asio/detail/consuming_buffers.hpp
new file mode 100644
index 00000000000..8af95aab769
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/consuming_buffers.hpp
@@ -0,0 +1,443 @@
+//
+// detail/consuming_buffers.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include "asio/buffer.hpp"
+#include "asio/detail/buffer_sequence_adapter.hpp"
+#include "asio/detail/limits.hpp"
+#include "asio/registered_buffer.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Helper template to determine the maximum number of prepared buffers.
+template <typename Buffers>
+struct prepared_buffers_max
+{
+ enum { value = buffer_sequence_adapter_base::max_buffers };
+};
+
+template <typename Elem, std::size_t N>
+struct prepared_buffers_max<boost::array<Elem, N>>
+{
+ enum { value = N };
+};
+
+template <typename Elem, std::size_t N>
+struct prepared_buffers_max<std::array<Elem, N>>
+{
+ enum { value = N };
+};
+
+// A buffer sequence used to represent a subsequence of the buffers.
+template <typename Buffer, std::size_t MaxBuffers>
+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 <typename Buffer, typename Buffers, typename Buffer_Iterator>
+class consuming_buffers
+{
+public:
+ typedef prepared_buffers<Buffer, prepared_buffers_max<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 <typename Buffer>
+class consuming_single_buffer
+{
+public:
+ // Construct to represent the entire list of buffers.
+ template <typename Buffer1>
+ 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<mutable_buffer, mutable_buffer, const mutable_buffer*>
+ : public consuming_single_buffer<ASIO_MUTABLE_BUFFER>
+{
+public:
+ explicit consuming_buffers(const mutable_buffer& buffer)
+ : consuming_single_buffer<ASIO_MUTABLE_BUFFER>(buffer)
+ {
+ }
+};
+
+template <>
+class consuming_buffers<const_buffer, mutable_buffer, const mutable_buffer*>
+ : public consuming_single_buffer<ASIO_CONST_BUFFER>
+{
+public:
+ explicit consuming_buffers(const mutable_buffer& buffer)
+ : consuming_single_buffer<ASIO_CONST_BUFFER>(buffer)
+ {
+ }
+};
+
+template <>
+class consuming_buffers<const_buffer, const_buffer, const const_buffer*>
+ : public consuming_single_buffer<ASIO_CONST_BUFFER>
+{
+public:
+ explicit consuming_buffers(const const_buffer& buffer)
+ : consuming_single_buffer<ASIO_CONST_BUFFER>(buffer)
+ {
+ }
+};
+
+#if !defined(ASIO_NO_DEPRECATED)
+
+template <>
+class consuming_buffers<mutable_buffer,
+ mutable_buffers_1, const mutable_buffer*>
+ : public consuming_single_buffer<ASIO_MUTABLE_BUFFER>
+{
+public:
+ explicit consuming_buffers(const mutable_buffers_1& buffer)
+ : consuming_single_buffer<ASIO_MUTABLE_BUFFER>(buffer)
+ {
+ }
+};
+
+template <>
+class consuming_buffers<const_buffer, mutable_buffers_1, const mutable_buffer*>
+ : public consuming_single_buffer<ASIO_CONST_BUFFER>
+{
+public:
+ explicit consuming_buffers(const mutable_buffers_1& buffer)
+ : consuming_single_buffer<ASIO_CONST_BUFFER>(buffer)
+ {
+ }
+};
+
+template <>
+class consuming_buffers<const_buffer, const_buffers_1, const const_buffer*>
+ : public consuming_single_buffer<ASIO_CONST_BUFFER>
+{
+public:
+ explicit consuming_buffers(const const_buffers_1& buffer)
+ : consuming_single_buffer<ASIO_CONST_BUFFER>(buffer)
+ {
+ }
+};
+
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+template <>
+class consuming_buffers<mutable_buffer,
+ mutable_registered_buffer, const mutable_buffer*>
+ : public consuming_single_buffer<mutable_registered_buffer>
+{
+public:
+ explicit consuming_buffers(const mutable_registered_buffer& buffer)
+ : consuming_single_buffer<mutable_registered_buffer>(buffer)
+ {
+ }
+};
+
+template <>
+class consuming_buffers<const_buffer,
+ mutable_registered_buffer, const mutable_buffer*>
+ : public consuming_single_buffer<mutable_registered_buffer>
+{
+public:
+ explicit consuming_buffers(const mutable_registered_buffer& buffer)
+ : consuming_single_buffer<mutable_registered_buffer>(buffer)
+ {
+ }
+};
+
+template <>
+class consuming_buffers<const_buffer,
+ const_registered_buffer, const const_buffer*>
+ : public consuming_single_buffer<const_registered_buffer>
+{
+public:
+ explicit consuming_buffers(const const_registered_buffer& buffer)
+ : consuming_single_buffer<const_registered_buffer>(buffer)
+ {
+ }
+};
+
+template <typename Buffer, typename Elem>
+class consuming_buffers<Buffer, boost::array<Elem, 2>,
+ typename boost::array<Elem, 2>::const_iterator>
+{
+public:
+ // Construct to represent the entire list of buffers.
+ explicit consuming_buffers(const boost::array<Elem, 2>& 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<Buffer, 2> prepare(std::size_t max_size)
+ {
+ boost::array<Buffer, 2> 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<Elem, 2> buffers_;
+ std::size_t total_consumed_;
+};
+
+template <typename Buffer, typename Elem>
+class consuming_buffers<Buffer, std::array<Elem, 2>,
+ typename std::array<Elem, 2>::const_iterator>
+{
+public:
+ // Construct to represent the entire list of buffers.
+ explicit consuming_buffers(const std::array<Elem, 2>& 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<Buffer, 2> prepare(std::size_t max_size)
+ {
+ std::array<Buffer, 2> 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<Elem, 2> buffers_;
+ std::size_t total_consumed_;
+};
+
+// Specialisation for null_buffers to ensure that the null_buffers type is
+// always passed through to the underlying read or write operation.
+template <typename Buffer>
+class consuming_buffers<Buffer, null_buffers, const mutable_buffer*>
+ : 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/3rdparty/asio/include/asio/detail/cstddef.hpp b/3rdparty/asio/include/asio/detail/cstddef.hpp
new file mode 100644
index 00000000000..15ec42df5f3
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/cstddef.hpp
@@ -0,0 +1,27 @@
+//
+// detail/cstddef.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+
+namespace asio {
+
+using std::nullptr_t;
+
+} // namespace asio
+
+#endif // ASIO_DETAIL_CSTDDEF_HPP
diff --git a/3rdparty/asio/include/asio/detail/cstdint.hpp b/3rdparty/asio/include/asio/detail/cstdint.hpp
new file mode 100644
index 00000000000..a696e34c8ae
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/cstdint.hpp
@@ -0,0 +1,40 @@
+//
+// detail/cstdint.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include <cstdint>
+
+namespace asio {
+
+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::uintptr_t;
+using std::uintmax_t;
+
+} // namespace asio
+
+#endif // ASIO_DETAIL_CSTDINT_HPP
diff --git a/3rdparty/asio/include/asio/detail/date_time_fwd.hpp b/3rdparty/asio/include/asio/detail/date_time_fwd.hpp
new file mode 100644
index 00000000000..a586fbea713
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/date_time_fwd.hpp
@@ -0,0 +1,34 @@
+//
+// detail/date_time_fwd.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 T, class TimeSystem>
+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/3rdparty/asio/include/asio/detail/deadline_timer_service.hpp b/3rdparty/asio/include/asio/detail/deadline_timer_service.hpp
new file mode 100644
index 00000000000..bd99a6e910c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/deadline_timer_service.hpp
@@ -0,0 +1,335 @@
+//
+// detail/deadline_timer_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include "asio/associated_cancellation_slot.hpp"
+#include "asio/cancellation_type.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_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 <chrono>
+# include <thread>
+#endif // defined(ASIO_WINDOWS_RUNTIME)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Time_Traits>
+class deadline_timer_service
+ : public execution_context_service_base<deadline_timer_service<Time_Traits>>
+{
+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<Time_Traits>::per_timer_data timer_data;
+ };
+
+ // Constructor.
+ deadline_timer_service(execution_context& context)
+ : execution_context_service_base<
+ deadline_timer_service<Time_Traits>>(context),
+ scheduler_(asio::use_service<timer_scheduler>(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 timer 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 timer 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;
+ }
+
+ // Move-construct a new timer implementation.
+ void converting_move_construct(implementation_type& impl,
+ deadline_timer_service&, implementation_type& other_impl)
+ {
+ move_construct(impl, other_impl);
+ }
+
+ // Move-assign from another timer implementation.
+ void converting_move_assign(implementation_type& impl,
+ deadline_timer_service& other_service,
+ implementation_type& other_impl)
+ {
+ move_assign(impl, other_service, other_impl);
+ }
+
+ // 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 <typename Handler, typename IoExecutor>
+ void async_wait(implementation_type& impl,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef wait_handler<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<op_cancellation>(this, &impl.timer_data);
+ }
+
+ 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 <typename Duration>
+ 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)
+ }
+
+ // Helper class used to implement per-operation cancellation.
+ class op_cancellation
+ {
+ public:
+ op_cancellation(deadline_timer_service* s,
+ typename timer_queue<Time_Traits>::per_timer_data* p)
+ : service_(s),
+ timer_data_(p)
+ {
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ if (!!(type &
+ (cancellation_type::terminal
+ | cancellation_type::partial
+ | cancellation_type::total)))
+ {
+ service_->scheduler_.cancel_timer_by_key(
+ service_->timer_queue_, timer_data_, this);
+ }
+ }
+
+ private:
+ deadline_timer_service* service_;
+ typename timer_queue<Time_Traits>::per_timer_data* timer_data_;
+ };
+
+ // The queue of timers.
+ timer_queue<Time_Traits> 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/3rdparty/asio/include/asio/detail/dependent_type.hpp b/3rdparty/asio/include/asio/detail/dependent_type.hpp
new file mode 100644
index 00000000000..fde0e4a6eb5
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/dependent_type.hpp
@@ -0,0 +1,36 @@
+//
+// detail/dependent_type.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename DependsOn, typename T>
+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/3rdparty/asio/include/asio/detail/descriptor_ops.hpp b/3rdparty/asio/include/asio/detail/descriptor_ops.hpp
new file mode 100644
index 00000000000..c001696a9fd
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/descriptor_ops.hpp
@@ -0,0 +1,179 @@
+//
+// detail/descriptor_ops.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include "asio/error.hpp"
+#include "asio/error_code.hpp"
+#include "asio/detail/cstdint.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;
+
+inline void get_last_error(
+ asio::error_code& ec, bool is_error_condition)
+{
+ if (!is_error_condition)
+ {
+ asio::error::clear(ec);
+ }
+ else
+ {
+ ec = asio::error_code(errno,
+ asio::error::get_system_category());
+ }
+}
+
+ASIO_DECL int open(const char* path, int flags,
+ asio::error_code& ec);
+
+ASIO_DECL int open(const char* path, int flags, unsigned mode,
+ 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 std::size_t sync_read1(int d, state_type state, void* data,
+ std::size_t size, 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 bool non_blocking_read1(int d, void* data, std::size_t size,
+ 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 std::size_t sync_write1(int d, state_type state,
+ const void* data, std::size_t size, 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 bool non_blocking_write1(int d,
+ const void* data, std::size_t size,
+ asio::error_code& ec, std::size_t& bytes_transferred);
+
+#if defined(ASIO_HAS_FILE)
+
+ASIO_DECL std::size_t sync_read_at(int d, state_type state,
+ uint64_t offset, buf* bufs, std::size_t count, bool all_empty,
+ asio::error_code& ec);
+
+ASIO_DECL std::size_t sync_read_at1(int d, state_type state,
+ uint64_t offset, void* data, std::size_t size,
+ asio::error_code& ec);
+
+ASIO_DECL bool non_blocking_read_at(int d, uint64_t offset,
+ buf* bufs, std::size_t count, asio::error_code& ec,
+ std::size_t& bytes_transferred);
+
+ASIO_DECL bool non_blocking_read_at1(int d, uint64_t offset,
+ void* data, std::size_t size, asio::error_code& ec,
+ std::size_t& bytes_transferred);
+
+ASIO_DECL std::size_t sync_write_at(int d, state_type state,
+ uint64_t offset, const buf* bufs, std::size_t count, bool all_empty,
+ asio::error_code& ec);
+
+ASIO_DECL std::size_t sync_write_at1(int d, state_type state,
+ uint64_t offset, const void* data, std::size_t size,
+ asio::error_code& ec);
+
+ASIO_DECL bool non_blocking_write_at(int d,
+ uint64_t offset, const buf* bufs, std::size_t count,
+ asio::error_code& ec, std::size_t& bytes_transferred);
+
+ASIO_DECL bool non_blocking_write_at1(int d,
+ uint64_t offset, const void* data, std::size_t size,
+ asio::error_code& ec, std::size_t& bytes_transferred);
+
+#endif // defined(ASIO_HAS_FILE)
+
+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/3rdparty/asio/include/asio/detail/descriptor_read_op.hpp b/3rdparty/asio/include/asio/detail/descriptor_read_op.hpp
new file mode 100644
index 00000000000..415490cb8a5
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/descriptor_read_op.hpp
@@ -0,0 +1,188 @@
+//
+// detail/descriptor_read_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/dispatch.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename MutableBufferSequence>
+class descriptor_read_op_base : public reactor_op
+{
+public:
+ descriptor_read_op_base(const asio::error_code& success_ec,
+ int descriptor, const MutableBufferSequence& buffers,
+ func_type complete_func)
+ : reactor_op(success_ec,
+ &descriptor_read_op_base::do_perform, complete_func),
+ descriptor_(descriptor),
+ buffers_(buffers)
+ {
+ }
+
+ static status do_perform(reactor_op* base)
+ {
+ ASIO_ASSUME(base != 0);
+ descriptor_read_op_base* o(static_cast<descriptor_read_op_base*>(base));
+
+ typedef buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_type;
+
+ status result;
+ if (bufs_type::is_single_buffer)
+ {
+ result = descriptor_ops::non_blocking_read1(o->descriptor_,
+ bufs_type::first(o->buffers_).data(),
+ bufs_type::first(o->buffers_).size(),
+ o->ec_, o->bytes_transferred_) ? done : not_done;
+ }
+ else
+ {
+ bufs_type bufs(o->buffers_);
+ 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 <typename MutableBufferSequence, typename Handler, typename IoExecutor>
+class descriptor_read_op
+ : public descriptor_read_op_base<MutableBufferSequence>
+{
+public:
+ typedef Handler handler_type;
+ typedef IoExecutor io_executor_type;
+
+ ASIO_DEFINE_HANDLER_PTR(descriptor_read_op);
+
+ descriptor_read_op(const asio::error_code& success_ec,
+ int descriptor, const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ : descriptor_read_op_base<MutableBufferSequence>(success_ec,
+ descriptor, buffers, &descriptor_read_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ descriptor_read_op* o(static_cast<descriptor_read_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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;
+ }
+ }
+
+ static void do_immediate(operation* base, bool, const void* io_ex)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ descriptor_read_op* o(static_cast<descriptor_read_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ immediate_handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ handler(o->handler_, o->ec_, o->bytes_transferred_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_));
+ w.complete(handler, handler.handler_, io_ex);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+
+private:
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/descriptor_write_op.hpp b/3rdparty/asio/include/asio/detail/descriptor_write_op.hpp
new file mode 100644
index 00000000000..ed1814e7e39
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/descriptor_write_op.hpp
@@ -0,0 +1,187 @@
+//
+// detail/descriptor_write_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename ConstBufferSequence>
+class descriptor_write_op_base : public reactor_op
+{
+public:
+ descriptor_write_op_base(const asio::error_code& success_ec,
+ int descriptor, const ConstBufferSequence& buffers,
+ func_type complete_func)
+ : reactor_op(success_ec,
+ &descriptor_write_op_base::do_perform, complete_func),
+ descriptor_(descriptor),
+ buffers_(buffers)
+ {
+ }
+
+ static status do_perform(reactor_op* base)
+ {
+ ASIO_ASSUME(base != 0);
+ descriptor_write_op_base* o(static_cast<descriptor_write_op_base*>(base));
+
+ typedef buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs_type;
+
+ status result;
+ if (bufs_type::is_single_buffer)
+ {
+ result = descriptor_ops::non_blocking_write1(o->descriptor_,
+ bufs_type::first(o->buffers_).data(),
+ bufs_type::first(o->buffers_).size(),
+ o->ec_, o->bytes_transferred_) ? done : not_done;
+ }
+ else
+ {
+ bufs_type bufs(o->buffers_);
+ 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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+class descriptor_write_op
+ : public descriptor_write_op_base<ConstBufferSequence>
+{
+public:
+ typedef Handler handler_type;
+ typedef IoExecutor io_executor_type;
+
+ ASIO_DEFINE_HANDLER_PTR(descriptor_write_op);
+
+ descriptor_write_op(const asio::error_code& success_ec,
+ int descriptor, const ConstBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ : descriptor_write_op_base<ConstBufferSequence>(success_ec,
+ descriptor, buffers, &descriptor_write_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ descriptor_write_op* o(static_cast<descriptor_write_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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;
+ }
+ }
+
+ static void do_immediate(operation* base, bool, const void* io_ex)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ descriptor_write_op* o(static_cast<descriptor_write_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ immediate_handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ handler(o->handler_, o->ec_, o->bytes_transferred_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_));
+ w.complete(handler, handler.handler_, io_ex);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+
+private:
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/dev_poll_reactor.hpp b/3rdparty/asio/include/asio/detail/dev_poll_reactor.hpp
new file mode 100644
index 00000000000..720fd6b54e8
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/dev_poll_reactor.hpp
@@ -0,0 +1,247 @@
+//
+// detail/dev_poll_reactor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <vector>
+#include <sys/devpoll.h>
+#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/scheduler_task.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<dev_poll_reactor>,
+ public scheduler_task
+{
+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(operation* op, bool is_continuation) const;
+
+ // Post a reactor operation for immediate completion.
+ ASIO_DECL static void call_post_immediate_completion(
+ operation* op, bool is_continuation, const void* self);
+
+ // 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,
+ void (*on_immediate)(operation*, bool, const void*),
+ const void* immediate_arg);
+
+ // Start a new operation. The reactor operation will be performed when the
+ // given descriptor is flagged as ready, or an error has occurred.
+ void start_op(int op_type, socket_type descriptor,
+ per_descriptor_data& descriptor_data, reactor_op* op,
+ bool is_continuation, bool allow_speculative)
+ {
+ start_op(op_type, descriptor, descriptor_data,
+ op, is_continuation, allow_speculative,
+ &dev_poll_reactor::call_post_immediate_completion, this);
+ }
+
+ // 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 all operations associated with the given descriptor and key. The
+ // handlers associated with the descriptor will be invoked with the
+ // operation_aborted error.
+ ASIO_DECL void cancel_ops_by_key(socket_type descriptor,
+ per_descriptor_data& descriptor_data,
+ int op_type, void* cancellation_key);
+
+ // 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 <typename Time_Traits>
+ void add_timer_queue(timer_queue<Time_Traits>& queue);
+
+ // Remove a timer queue from the reactor.
+ template <typename Time_Traits>
+ void remove_timer_queue(timer_queue<Time_Traits>& queue);
+
+ // Schedule a new operation in the given timer queue to expire at the
+ // specified absolute time.
+ template <typename Time_Traits>
+ void schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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 <typename Time_Traits>
+ std::size_t cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled = (std::numeric_limits<std::size_t>::max)());
+
+ // Cancel the timer operations associated with the given key.
+ template <typename Time_Traits>
+ void cancel_timer_by_key(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data* timer,
+ void* cancellation_key);
+
+ // Move the timer operations associated with the given timer.
+ template <typename Time_Traits>
+ void move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& target,
+ typename timer_queue<Time_Traits>::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<operation>& 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<int, std::size_t> 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<socket_type> 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/3rdparty/asio/include/asio/detail/epoll_reactor.hpp b/3rdparty/asio/include/asio/detail/epoll_reactor.hpp
new file mode 100644
index 00000000000..212767a760f
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/epoll_reactor.hpp
@@ -0,0 +1,295 @@
+//
+// detail/epoll_reactor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/scheduler_task.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 <sys/timerfd.h>
+#endif // defined(ASIO_HAS_TIMERFD)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class epoll_reactor
+ : public execution_context_service_base<epoll_reactor>,
+ public scheduler_task
+{
+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<reactor_op> 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(operation* op, bool is_continuation) const;
+
+ // Post a reactor operation for immediate completion.
+ ASIO_DECL static void call_post_immediate_completion(
+ operation* op, bool is_continuation, const void* self);
+
+ // 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,
+ void (*on_immediate)(operation*, bool, const void*),
+ const void* immediate_arg);
+
+ // Start a new operation. The reactor operation will be performed when the
+ // given descriptor is flagged as ready, or an error has occurred.
+ void start_op(int op_type, socket_type descriptor,
+ per_descriptor_data& descriptor_data, reactor_op* op,
+ bool is_continuation, bool allow_speculative)
+ {
+ start_op(op_type, descriptor, descriptor_data,
+ op, is_continuation, allow_speculative,
+ &epoll_reactor::call_post_immediate_completion, this);
+ }
+
+ // 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 all operations associated with the given descriptor and key. The
+ // handlers associated with the descriptor will be invoked with the
+ // operation_aborted error.
+ ASIO_DECL void cancel_ops_by_key(socket_type descriptor,
+ per_descriptor_data& descriptor_data,
+ int op_type, void* cancellation_key);
+
+ // 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 <typename Time_Traits>
+ void add_timer_queue(timer_queue<Time_Traits>& timer_queue);
+
+ // Remove a timer queue from the reactor.
+ template <typename Time_Traits>
+ void remove_timer_queue(timer_queue<Time_Traits>& timer_queue);
+
+ // Schedule a new operation in the given timer queue to expire at the
+ // specified absolute time.
+ template <typename Time_Traits>
+ void schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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 <typename Time_Traits>
+ std::size_t cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled = (std::numeric_limits<std::size_t>::max)());
+
+ // Cancel the timer operations associated with the given key.
+ template <typename Time_Traits>
+ void cancel_timer_by_key(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data* timer,
+ void* cancellation_key);
+
+ // Move the timer operations associated with the given timer.
+ template <typename Time_Traits>
+ void move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& target,
+ typename timer_queue<Time_Traits>::per_timer_data& source);
+
+ // Run epoll once until interrupted or events are ready to be dispatched.
+ ASIO_DECL void run(long usec, op_queue<operation>& 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<descriptor_state> 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/3rdparty/asio/include/asio/detail/event.hpp b/3rdparty/asio/include/asio/detail/event.hpp
new file mode 100644
index 00000000000..19e458cdf05
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/event.hpp
@@ -0,0 +1,46 @@
+//
+// detail/event.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#else
+# include "asio/detail/std_event.hpp"
+#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;
+#else
+typedef std_event event;
+#endif
+
+} // namespace detail
+} // namespace asio
+
+#endif // ASIO_DETAIL_EVENT_HPP
diff --git a/3rdparty/asio/include/asio/detail/eventfd_select_interrupter.hpp b/3rdparty/asio/include/asio/detail/eventfd_select_interrupter.hpp
new file mode 100644
index 00000000000..0eb8843dd56
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/eventfd_select_interrupter.hpp
@@ -0,0 +1,83 @@
+//
+// detail/eventfd_select_interrupter.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 interrupter. Returns true if the reset was successful.
+ 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/3rdparty/asio/include/asio/detail/exception.hpp b/3rdparty/asio/include/asio/detail/exception.hpp
new file mode 100644
index 00000000000..28c7cffb5d8
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/exception.hpp
@@ -0,0 +1,29 @@
+//
+// detail/exception.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_EXCEPTION_HPP
+#define ASIO_DETAIL_EXCEPTION_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <exception>
+
+namespace asio {
+
+using std::exception_ptr;
+using std::current_exception;
+using std::rethrow_exception;
+
+} // namespace asio
+
+#endif // ASIO_DETAIL_EXCEPTION_HPP
diff --git a/3rdparty/asio/include/asio/detail/executor_function.hpp b/3rdparty/asio/include/asio/detail/executor_function.hpp
new file mode 100644
index 00000000000..cccf31bf3af
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/executor_function.hpp
@@ -0,0 +1,152 @@
+//
+// detail/executor_function.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_FUNCTION_HPP
+#define ASIO_DETAIL_EXECUTOR_FUNCTION_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/handler_alloc_helpers.hpp"
+#include "asio/detail/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Lightweight, move-only function object wrapper.
+class executor_function
+{
+public:
+ template <typename F, typename Alloc>
+ explicit executor_function(F f, const Alloc& a)
+ {
+ // Allocate and construct an object to wrap the function.
+ typedef impl<F, Alloc> impl_type;
+ typename impl_type::ptr p = {
+ detail::addressof(a), impl_type::ptr::allocate(a), 0 };
+ impl_ = new (p.v) impl_type(static_cast<F&&>(f), a);
+ p.v = 0;
+ }
+
+ executor_function(executor_function&& other) noexcept
+ : impl_(other.impl_)
+ {
+ other.impl_ = 0;
+ }
+
+ ~executor_function()
+ {
+ if (impl_)
+ impl_->complete_(impl_, false);
+ }
+
+ void operator()()
+ {
+ if (impl_)
+ {
+ impl_base* i = impl_;
+ impl_ = 0;
+ i->complete_(i, true);
+ }
+ }
+
+private:
+ // Base class for polymorphic function implementations.
+ struct impl_base
+ {
+ void (*complete_)(impl_base*, bool);
+ };
+
+ // Polymorphic function implementation.
+ template <typename Function, typename Alloc>
+ struct impl : impl_base
+ {
+ ASIO_DEFINE_TAGGED_HANDLER_ALLOCATOR_PTR(
+ thread_info_base::executor_function_tag, impl);
+
+ template <typename F>
+ impl(F&& f, const Alloc& a)
+ : function_(static_cast<F&&>(f)),
+ allocator_(a)
+ {
+ complete_ = &executor_function::complete<Function, Alloc>;
+ }
+
+ Function function_;
+ Alloc allocator_;
+ };
+
+ // Helper to complete function invocation.
+ template <typename Function, typename Alloc>
+ static void complete(impl_base* base, bool call)
+ {
+ // Take ownership of the function object.
+ impl<Function, Alloc>* i(static_cast<impl<Function, Alloc>*>(base));
+ Alloc allocator(i->allocator_);
+ typename impl<Function, Alloc>::ptr p = {
+ detail::addressof(allocator), i, i };
+
+ // Make a copy of the function 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 function may be the true owner of the memory
+ // associated with the function. Consequently, a local copy of the function
+ // is required to ensure that any owning sub-object remains valid until
+ // after we have deallocated the memory here.
+ Function function(static_cast<Function&&>(i->function_));
+ p.reset();
+
+ // Make the upcall if required.
+ if (call)
+ {
+ static_cast<Function&&>(function)();
+ }
+ }
+
+ impl_base* impl_;
+};
+
+// Lightweight, non-owning, copyable function object wrapper.
+class executor_function_view
+{
+public:
+ template <typename F>
+ explicit executor_function_view(F& f) noexcept
+ : complete_(&executor_function_view::complete<F>),
+ function_(&f)
+ {
+ }
+
+ void operator()()
+ {
+ complete_(function_);
+ }
+
+private:
+ // Helper to complete function invocation.
+ template <typename F>
+ static void complete(void* f)
+ {
+ (*static_cast<F*>(f))();
+ }
+
+ void (*complete_)(void*);
+ void* function_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_EXECUTOR_FUNCTION_HPP
diff --git a/3rdparty/asio/include/asio/detail/executor_op.hpp b/3rdparty/asio/include/asio/detail/executor_op.hpp
new file mode 100644
index 00000000000..78e781e217b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/executor_op.hpp
@@ -0,0 +1,84 @@
+//
+// detail/executor_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/scheduler_operation.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Handler, typename Alloc,
+ typename Operation = scheduler_operation>
+class executor_op : public Operation
+{
+public:
+ ASIO_DEFINE_HANDLER_ALLOCATOR_PTR(executor_op);
+
+ template <typename H>
+ executor_op(H&& h, const Alloc& allocator)
+ : Operation(&executor_op::do_complete),
+ handler_(static_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.
+ ASIO_ASSUME(base != 0);
+ executor_op* o(static_cast<executor_op*>(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(static_cast<Handler&&>(o->handler_));
+ p.reset();
+
+ // Make the upcall if required.
+ if (owner)
+ {
+ fenced_block b(fenced_block::half);
+ ASIO_HANDLER_INVOCATION_BEGIN(());
+ static_cast<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/3rdparty/asio/include/asio/detail/fd_set_adapter.hpp b/3rdparty/asio/include/asio/detail/fd_set_adapter.hpp
new file mode 100644
index 00000000000..80b8974a417
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/fd_set_adapter.hpp
@@ -0,0 +1,39 @@
+//
+// detail/fd_set_adapter.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/fenced_block.hpp b/3rdparty/asio/include/asio/detail/fenced_block.hpp
new file mode 100644
index 00000000000..ff096dc8486
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/fenced_block.hpp
@@ -0,0 +1,40 @@
+//
+// detail/fenced_block.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#else
+# include "asio/detail/std_fenced_block.hpp"
+#endif
+
+namespace asio {
+namespace detail {
+
+#if !defined(ASIO_HAS_THREADS) \
+ || defined(ASIO_DISABLE_FENCED_BLOCK)
+typedef null_fenced_block fenced_block;
+#else
+typedef std_fenced_block fenced_block;
+#endif
+
+} // namespace detail
+} // namespace asio
+
+#endif // ASIO_DETAIL_FENCED_BLOCK_HPP
diff --git a/3rdparty/asio/include/asio/detail/functional.hpp b/3rdparty/asio/include/asio/detail/functional.hpp
new file mode 100644
index 00000000000..145f9d2a9e1
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/functional.hpp
@@ -0,0 +1,33 @@
+//
+// detail/functional.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <functional>
+
+namespace asio {
+namespace detail {
+
+using std::function;
+
+} // namespace detail
+
+using std::ref;
+using std::reference_wrapper;
+
+} // namespace asio
+
+#endif // ASIO_DETAIL_FUNCTIONAL_HPP
diff --git a/3rdparty/asio/include/asio/detail/future.hpp b/3rdparty/asio/include/asio/detail/future.hpp
new file mode 100644
index 00000000000..f33136cbef2
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/future.hpp
@@ -0,0 +1,32 @@
+//
+// detail/future.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_FUTURE_HPP
+#define ASIO_DETAIL_FUTURE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <future>
+
+// Even though the future header is available, libstdc++ may not implement the
+// std::future class itself. However, we need to have already included the
+// future header to reliably test for _GLIBCXX_HAS_GTHREADS.
+#if defined(__GNUC__) && !defined(ASIO_HAS_CLANG_LIBCXX)
+# if defined(_GLIBCXX_HAS_GTHREADS)
+# define ASIO_HAS_STD_FUTURE_CLASS 1
+# endif // defined(_GLIBCXX_HAS_GTHREADS)
+#else // defined(__GNUC__) && !defined(ASIO_HAS_CLANG_LIBCXX)
+# define ASIO_HAS_STD_FUTURE_CLASS 1
+#endif // defined(__GNUC__) && !defined(ASIO_HAS_CLANG_LIBCXX)
+
+#endif // ASIO_DETAIL_FUTURE_HPP
diff --git a/3rdparty/asio/include/asio/detail/global.hpp b/3rdparty/asio/include/asio/detail/global.hpp
new file mode 100644
index 00000000000..59de23a4884
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/global.hpp
@@ -0,0 +1,50 @@
+//
+// detail/global.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#else
+# include "asio/detail/std_global.hpp"
+#endif
+
+namespace asio {
+namespace detail {
+
+template <typename T>
+inline T& global()
+{
+#if !defined(ASIO_HAS_THREADS)
+ return null_global<T>();
+#elif defined(ASIO_WINDOWS)
+ return win_global<T>();
+#elif defined(ASIO_HAS_PTHREADS)
+ return posix_global<T>();
+#else
+ return std_global<T>();
+#endif
+}
+
+} // namespace detail
+} // namespace asio
+
+#endif // ASIO_DETAIL_GLOBAL_HPP
diff --git a/3rdparty/asio/include/asio/detail/handler_alloc_helpers.hpp b/3rdparty/asio/include/asio/detail/handler_alloc_helpers.hpp
new file mode 100644
index 00000000000..c14d542e48c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/handler_alloc_helpers.hpp
@@ -0,0 +1,225 @@
+//
+// detail/handler_alloc_helpers.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/detail/thread_info_base.hpp"
+#include "asio/associated_allocator.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+inline void* default_allocate(std::size_t s,
+ std::size_t align = ASIO_DEFAULT_ALIGN)
+{
+#if !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
+ return asio::detail::thread_info_base::allocate(
+ asio::detail::thread_context::top_of_thread_call_stack(),
+ s, align);
+#else // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
+ return asio::aligned_new(align, s);
+#endif // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
+}
+
+inline void default_deallocate(void* p, std::size_t s)
+{
+#if !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
+ asio::detail::thread_info_base::deallocate(
+ asio::detail::thread_context::top_of_thread_call_stack(), p, s);
+#else // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
+ (void)s;
+ asio::aligned_delete(p);
+#endif // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING)
+}
+
+template <typename T>
+class default_allocator
+{
+public:
+ typedef T value_type;
+
+ template <typename U>
+ struct rebind
+ {
+ typedef default_allocator<U> other;
+ };
+
+ default_allocator() noexcept
+ {
+ }
+
+ template <typename U>
+ default_allocator(const default_allocator<U>&) noexcept
+ {
+ }
+
+ T* allocate(std::size_t n)
+ {
+ return static_cast<T*>(default_allocate(sizeof(T) * n, alignof(T)));
+ }
+
+ void deallocate(T* p, std::size_t n)
+ {
+ default_deallocate(p, sizeof(T) * n);
+ }
+};
+
+template <>
+class default_allocator<void>
+{
+public:
+ typedef void value_type;
+
+ template <typename U>
+ struct rebind
+ {
+ typedef default_allocator<U> other;
+ };
+
+ default_allocator() noexcept
+ {
+ }
+
+ template <typename U>
+ default_allocator(const default_allocator<U>&) noexcept
+ {
+ }
+};
+
+template <typename Allocator>
+struct get_default_allocator
+{
+ typedef Allocator type;
+
+ static type get(const Allocator& a)
+ {
+ return a;
+ }
+};
+
+template <typename T>
+struct get_default_allocator<std::allocator<T>>
+{
+ typedef default_allocator<T> type;
+
+ static type get(const std::allocator<T>&)
+ {
+ return type();
+ }
+};
+
+} // 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_default_allocator< \
+ associated_allocator_type>::type default_allocator_type; \
+ ASIO_REBIND_ALLOC(default_allocator_type, op) a( \
+ ::asio::detail::get_default_allocator< \
+ associated_allocator_type>::get( \
+ ::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_default_allocator< \
+ associated_allocator_type>::type default_allocator_type; \
+ ASIO_REBIND_ALLOC(default_allocator_type, op) a( \
+ ::asio::detail::get_default_allocator< \
+ associated_allocator_type>::get( \
+ ::asio::get_associated_allocator(*h))); \
+ a.deallocate(static_cast<op*>(v), 1); \
+ v = 0; \
+ } \
+ } \
+ } \
+ /**/
+
+#define ASIO_DEFINE_TAGGED_HANDLER_ALLOCATOR_PTR(purpose, 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, purpose>::type recycling_allocator_type; \
+ ASIO_REBIND_ALLOC(recycling_allocator_type, op) a1( \
+ ::asio::detail::get_recycling_allocator< \
+ Alloc, purpose>::get(a)); \
+ return a1.allocate(1); \
+ } \
+ void reset() \
+ { \
+ if (p) \
+ { \
+ p->~op(); \
+ p = 0; \
+ } \
+ if (v) \
+ { \
+ typedef typename ::asio::detail::get_recycling_allocator< \
+ Alloc, purpose>::type recycling_allocator_type; \
+ ASIO_REBIND_ALLOC(recycling_allocator_type, op) a1( \
+ ::asio::detail::get_recycling_allocator< \
+ Alloc, purpose>::get(*a)); \
+ a1.deallocate(static_cast<op*>(v), 1); \
+ v = 0; \
+ } \
+ } \
+ } \
+ /**/
+
+#define ASIO_DEFINE_HANDLER_ALLOCATOR_PTR(op) \
+ ASIO_DEFINE_TAGGED_HANDLER_ALLOCATOR_PTR( \
+ ::asio::detail::thread_info_base::default_tag, op ) \
+ /**/
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_HANDLER_ALLOC_HELPERS_HPP
diff --git a/3rdparty/asio/include/asio/detail/handler_cont_helpers.hpp b/3rdparty/asio/include/asio/detail/handler_cont_helpers.hpp
new file mode 100644
index 00000000000..9f8f971984f
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/handler_cont_helpers.hpp
@@ -0,0 +1,45 @@
+//
+// detail/handler_cont_helpers.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Context>
+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/3rdparty/asio/include/asio/detail/handler_tracking.hpp b/3rdparty/asio/include/asio/detail/handler_tracking.hpp
new file mode 100644
index 00000000000..f47c777a2d6
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/handler_tracking.hpp
@@ -0,0 +1,264 @@
+//
+// detail/handler_tracking.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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();
+
+ class location
+ {
+ public:
+ // Constructor adds a location to the stack.
+ ASIO_DECL explicit location(const char* file,
+ int line, const char* func);
+
+ // Destructor removes a location from the stack.
+ ASIO_DECL ~location();
+
+ private:
+ // Disallow copying and assignment.
+ location(const location&) = delete;
+ location& operator=(const location&) = delete;
+
+ friend class handler_tracking;
+ const char* file_;
+ int line_;
+ const char* func_;
+ location* next_;
+ };
+
+ // 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_LOCATION(args) \
+ asio::detail::handler_tracking::location tracked_location args
+
+# 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_LOCATION(loc) (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/3rdparty/asio/include/asio/detail/handler_type_requirements.hpp b/3rdparty/asio/include/asio/detail/handler_type_requirements.hpp
new file mode 100644
index 00000000000..54c53b9b6e3
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/handler_type_requirements.hpp
@@ -0,0 +1,553 @@
+//
+// detail/handler_type_requirements.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Handler>
+auto zero_arg_copyable_handler_test(Handler h, void*)
+ -> decltype(
+ sizeof(Handler(static_cast<const Handler&>(h))),
+ (static_cast<Handler&&>(h)()),
+ char(0));
+
+template <typename Handler>
+char (&zero_arg_copyable_handler_test(Handler, ...))[2];
+
+template <typename Handler, typename Arg1>
+auto one_arg_handler_test(Handler h, Arg1* a1)
+ -> decltype(
+ sizeof(Handler(static_cast<Handler&&>(h))),
+ (static_cast<Handler&&>(h)(*a1)),
+ char(0));
+
+template <typename Handler>
+char (&one_arg_handler_test(Handler h, ...))[2];
+
+template <typename Handler, typename Arg1, typename Arg2>
+auto two_arg_handler_test(Handler h, Arg1* a1, Arg2* a2)
+ -> decltype(
+ sizeof(Handler(static_cast<Handler&&>(h))),
+ (static_cast<Handler&&>(h)(*a1, *a2)),
+ char(0));
+
+template <typename Handler>
+char (&two_arg_handler_test(Handler, ...))[2];
+
+template <typename Handler, typename Arg1, typename Arg2>
+auto two_arg_move_handler_test(Handler h, Arg1* a1, Arg2* a2)
+ -> decltype(
+ sizeof(Handler(static_cast<Handler&&>(h))),
+ (static_cast<Handler&&>(h)(
+ *a1, static_cast<Arg2&&>(*a2))),
+ char(0));
+
+template <typename Handler>
+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 <typename T> T& lvref();
+template <typename T> T& lvref(T);
+template <typename T> const T& clvref();
+template <typename T> const T& clvref(T);
+template <typename T> T rvref();
+template <typename T> T rvref(T);
+template <typename T> T rorlvref();
+template <typename T> char argbyv(T);
+
+template <int>
+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::rorlvref< \
+ 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<const asio::error_code*>(0), \
+ static_cast<const std::size_t*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>(), \
+ asio::detail::lvref<const std::size_t>()), \
+ 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<const asio::error_code*>(0), \
+ static_cast<const std::size_t*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>(), \
+ asio::detail::lvref<const std::size_t>()), \
+ 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<const asio::error_code*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>()), \
+ 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<const asio::error_code*>(0), \
+ static_cast<socket_type*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>(), \
+ asio::detail::rvref<socket_type>()), \
+ 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<const asio::error_code*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>()), \
+ 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<const asio::error_code*>(0), \
+ static_cast<const endpoint_type*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>(), \
+ asio::detail::lvref<const endpoint_type>()), \
+ 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<const asio::error_code*>(0), \
+ static_cast<const iter_type*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>(), \
+ asio::detail::lvref<const iter_type>()), \
+ 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<const asio::error_code*>(0), \
+ static_cast<const range_type*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>(), \
+ asio::detail::lvref<const range_type>()), \
+ 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<const asio::error_code*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>()), \
+ 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<const asio::error_code*>(0), \
+ static_cast<const int*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>(), \
+ asio::detail::lvref<const int>()), \
+ 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<const asio::error_code*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>()), \
+ 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<const asio::error_code*>(0), \
+ static_cast<const std::size_t*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>(), \
+ asio::detail::lvref<const std::size_t>()), \
+ 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<const asio::error_code*>(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::rorlvref< \
+ asio_true_handler_type>()( \
+ asio::detail::lvref<const asio::error_code>()), \
+ 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/3rdparty/asio/include/asio/detail/handler_work.hpp b/3rdparty/asio/include/asio/detail/handler_work.hpp
new file mode 100644
index 00000000000..596d076327a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/handler_work.hpp
@@ -0,0 +1,511 @@
+//
+// detail/handler_work.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_allocator.hpp"
+#include "asio/associated_executor.hpp"
+#include "asio/associated_immediate_executor.hpp"
+#include "asio/detail/initiate_dispatch.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/detail/work_dispatcher.hpp"
+#include "asio/execution/allocator.hpp"
+#include "asio/execution/blocking.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/execution/outstanding_work.hpp"
+#include "asio/executor_work_guard.hpp"
+#include "asio/prefer.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+class executor;
+class io_context;
+
+#if !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+class any_completion_executor;
+class any_io_executor;
+
+#endif // !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+namespace execution {
+
+template <typename...> class any_executor;
+
+} // namespace execution
+namespace detail {
+
+template <typename Executor, typename CandidateExecutor = void,
+ typename IoContext = io_context,
+ typename PolymorphicExecutor = executor, typename = void>
+class handler_work_base
+{
+public:
+ explicit handler_work_base(int, int, const Executor& ex) noexcept
+ : executor_(asio::prefer(ex, execution::outstanding_work.tracked))
+ {
+ }
+
+ template <typename OtherExecutor>
+ handler_work_base(bool /*base1_owns_work*/, const Executor& ex,
+ const OtherExecutor& /*candidate*/) noexcept
+ : executor_(asio::prefer(ex, execution::outstanding_work.tracked))
+ {
+ }
+
+ handler_work_base(const handler_work_base& other) noexcept
+ : executor_(other.executor_)
+ {
+ }
+
+ handler_work_base(handler_work_base&& other) noexcept
+ : executor_(static_cast<executor_type&&>(other.executor_))
+ {
+ }
+
+ bool owns_work() const noexcept
+ {
+ return true;
+ }
+
+ template <typename Function, typename Handler>
+ void dispatch(Function& function, Handler& handler)
+ {
+ asio::prefer(executor_,
+ execution::allocator((get_associated_allocator)(handler))
+ ).execute(static_cast<Function&&>(function));
+ }
+
+private:
+ typedef decay_t<
+ prefer_result_t<Executor, execution::outstanding_work_t::tracked_t>
+ > executor_type;
+
+ executor_type executor_;
+};
+
+template <typename Executor, typename CandidateExecutor,
+ typename IoContext, typename PolymorphicExecutor>
+class handler_work_base<Executor, CandidateExecutor,
+ IoContext, PolymorphicExecutor,
+ enable_if_t<
+ !execution::is_executor<Executor>::value
+ && (!is_same<Executor, PolymorphicExecutor>::value
+ || !is_same<CandidateExecutor, void>::value)
+ >
+ >
+{
+public:
+ explicit handler_work_base(int, int, const Executor& ex) noexcept
+ : executor_(ex),
+ owns_work_(true)
+ {
+ executor_.on_work_started();
+ }
+
+ handler_work_base(bool /*base1_owns_work*/, const Executor& ex,
+ const Executor& candidate) noexcept
+ : executor_(ex),
+ owns_work_(ex != candidate)
+ {
+ if (owns_work_)
+ executor_.on_work_started();
+ }
+
+ template <typename OtherExecutor>
+ handler_work_base(bool /*base1_owns_work*/, const Executor& ex,
+ const OtherExecutor& /*candidate*/) noexcept
+ : executor_(ex),
+ owns_work_(true)
+ {
+ executor_.on_work_started();
+ }
+
+ handler_work_base(const handler_work_base& other) noexcept
+ : executor_(other.executor_),
+ owns_work_(other.owns_work_)
+ {
+ if (owns_work_)
+ executor_.on_work_started();
+ }
+
+ handler_work_base(handler_work_base&& other) noexcept
+ : executor_(static_cast<Executor&&>(other.executor_)),
+ owns_work_(other.owns_work_)
+ {
+ other.owns_work_ = false;
+ }
+
+ ~handler_work_base()
+ {
+ if (owns_work_)
+ executor_.on_work_finished();
+ }
+
+ bool owns_work() const noexcept
+ {
+ return owns_work_;
+ }
+
+ template <typename Function, typename Handler>
+ void dispatch(Function& function, Handler& handler)
+ {
+ executor_.dispatch(static_cast<Function&&>(function),
+ asio::get_associated_allocator(handler));
+ }
+
+private:
+ Executor executor_;
+ bool owns_work_;
+};
+
+template <typename Executor, typename IoContext, typename PolymorphicExecutor>
+class handler_work_base<Executor, void, IoContext, PolymorphicExecutor,
+ enable_if_t<
+ is_same<
+ Executor,
+ typename IoContext::executor_type
+ >::value
+ >
+ >
+{
+public:
+ explicit handler_work_base(int, int, const Executor&)
+ {
+ }
+
+ bool owns_work() const noexcept
+ {
+ return false;
+ }
+
+ template <typename Function, typename Handler>
+ void dispatch(Function& function, Handler&)
+ {
+ // When using a native implementation, I/O completion handlers are
+ // already dispatched according to the execution context's executor's
+ // rules. We can call the function directly.
+ static_cast<Function&&>(function)();
+ }
+};
+
+template <typename Executor, typename IoContext>
+class handler_work_base<Executor, void, IoContext, Executor>
+{
+public:
+ explicit handler_work_base(int, int, const Executor& ex) noexcept
+#if !defined(ASIO_NO_TYPEID)
+ : executor_(
+ ex.target_type() == typeid(typename IoContext::executor_type)
+ ? Executor() : ex)
+#else // !defined(ASIO_NO_TYPEID)
+ : executor_(ex)
+#endif // !defined(ASIO_NO_TYPEID)
+ {
+ if (executor_)
+ executor_.on_work_started();
+ }
+
+ handler_work_base(bool /*base1_owns_work*/, const Executor& ex,
+ const Executor& candidate) noexcept
+ : executor_(ex != candidate ? ex : Executor())
+ {
+ if (executor_)
+ executor_.on_work_started();
+ }
+
+ template <typename OtherExecutor>
+ handler_work_base(const Executor& ex,
+ const OtherExecutor&) noexcept
+ : executor_(ex)
+ {
+ executor_.on_work_started();
+ }
+
+ handler_work_base(const handler_work_base& other) noexcept
+ : executor_(other.executor_)
+ {
+ if (executor_)
+ executor_.on_work_started();
+ }
+
+ handler_work_base(handler_work_base&& other) noexcept
+ : executor_(static_cast<Executor&&>(other.executor_))
+ {
+ }
+
+ ~handler_work_base()
+ {
+ if (executor_)
+ executor_.on_work_finished();
+ }
+
+ bool owns_work() const noexcept
+ {
+ return !!executor_;
+ }
+
+ template <typename Function, typename Handler>
+ void dispatch(Function& function, Handler& handler)
+ {
+ executor_.dispatch(static_cast<Function&&>(function),
+ asio::get_associated_allocator(handler));
+ }
+
+private:
+ Executor executor_;
+};
+
+template <typename... SupportableProperties, typename CandidateExecutor,
+ typename IoContext, typename PolymorphicExecutor>
+class handler_work_base<execution::any_executor<SupportableProperties...>,
+ CandidateExecutor, IoContext, PolymorphicExecutor>
+{
+public:
+ typedef execution::any_executor<SupportableProperties...> executor_type;
+
+ explicit handler_work_base(int, int, const executor_type& ex) noexcept
+#if !defined(ASIO_NO_TYPEID)
+ : executor_(
+ ex.target_type() == typeid(typename IoContext::executor_type)
+ ? executor_type()
+ : asio::prefer(ex, execution::outstanding_work.tracked))
+#else // !defined(ASIO_NO_TYPEID)
+ : executor_(asio::prefer(ex, execution::outstanding_work.tracked))
+#endif // !defined(ASIO_NO_TYPEID)
+ {
+ }
+
+ handler_work_base(bool base1_owns_work, const executor_type& ex,
+ const executor_type& candidate) noexcept
+ : executor_(
+ !base1_owns_work && ex == candidate
+ ? executor_type()
+ : asio::prefer(ex, execution::outstanding_work.tracked))
+ {
+ }
+
+ template <typename OtherExecutor>
+ handler_work_base(bool /*base1_owns_work*/, const executor_type& ex,
+ const OtherExecutor& /*candidate*/) noexcept
+ : executor_(asio::prefer(ex, execution::outstanding_work.tracked))
+ {
+ }
+
+ handler_work_base(const handler_work_base& other) noexcept
+ : executor_(other.executor_)
+ {
+ }
+
+ handler_work_base(handler_work_base&& other) noexcept
+ : executor_(static_cast<executor_type&&>(other.executor_))
+ {
+ }
+
+ bool owns_work() const noexcept
+ {
+ return !!executor_;
+ }
+
+ template <typename Function, typename Handler>
+ void dispatch(Function& function, Handler&)
+ {
+ executor_.execute(static_cast<Function&&>(function));
+ }
+
+private:
+ executor_type executor_;
+};
+
+#if !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+template <typename Executor, typename CandidateExecutor,
+ typename IoContext, typename PolymorphicExecutor>
+class handler_work_base<
+ Executor, CandidateExecutor,
+ IoContext, PolymorphicExecutor,
+ enable_if_t<
+ is_same<Executor, any_completion_executor>::value
+ || is_same<Executor, any_io_executor>::value
+ >
+ >
+{
+public:
+ typedef Executor executor_type;
+
+ explicit handler_work_base(int, int,
+ const executor_type& ex) noexcept
+#if !defined(ASIO_NO_TYPEID)
+ : executor_(
+ ex.target_type() == typeid(typename IoContext::executor_type)
+ ? executor_type()
+ : asio::prefer(ex, execution::outstanding_work.tracked))
+#else // !defined(ASIO_NO_TYPEID)
+ : executor_(asio::prefer(ex, execution::outstanding_work.tracked))
+#endif // !defined(ASIO_NO_TYPEID)
+ {
+ }
+
+ handler_work_base(bool base1_owns_work, const executor_type& ex,
+ const executor_type& candidate) noexcept
+ : executor_(
+ !base1_owns_work && ex == candidate
+ ? executor_type()
+ : asio::prefer(ex, execution::outstanding_work.tracked))
+ {
+ }
+
+ template <typename OtherExecutor>
+ handler_work_base(bool /*base1_owns_work*/, const executor_type& ex,
+ const OtherExecutor& /*candidate*/) noexcept
+ : executor_(asio::prefer(ex, execution::outstanding_work.tracked))
+ {
+ }
+
+ handler_work_base(const handler_work_base& other) noexcept
+ : executor_(other.executor_)
+ {
+ }
+
+ handler_work_base(handler_work_base&& other) noexcept
+ : executor_(static_cast<executor_type&&>(other.executor_))
+ {
+ }
+
+ bool owns_work() const noexcept
+ {
+ return !!executor_;
+ }
+
+ template <typename Function, typename Handler>
+ void dispatch(Function& function, Handler&)
+ {
+ executor_.execute(static_cast<Function&&>(function));
+ }
+
+private:
+ executor_type executor_;
+};
+
+#endif // !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+template <typename Handler, typename IoExecutor, typename = void>
+class handler_work :
+ handler_work_base<IoExecutor>,
+ handler_work_base<associated_executor_t<Handler, IoExecutor>, IoExecutor>
+{
+public:
+ typedef handler_work_base<IoExecutor> base1_type;
+ typedef handler_work_base<associated_executor_t<Handler, IoExecutor>,
+ IoExecutor> base2_type;
+
+ handler_work(Handler& handler, const IoExecutor& io_ex) noexcept
+ : base1_type(0, 0, io_ex),
+ base2_type(base1_type::owns_work(),
+ asio::get_associated_executor(handler, io_ex), io_ex)
+ {
+ }
+
+ template <typename Function>
+ void complete(Function& function, Handler& handler)
+ {
+ if (!base1_type::owns_work() && !base2_type::owns_work())
+ {
+ // When using a native implementation, I/O completion handlers are
+ // already dispatched according to the execution context's executor's
+ // rules. We can call the function directly.
+ static_cast<Function&&>(function)();
+ }
+ else
+ {
+ base2_type::dispatch(function, handler);
+ }
+ }
+};
+
+template <typename Handler, typename IoExecutor>
+class handler_work<
+ Handler, IoExecutor,
+ enable_if_t<
+ is_same<
+ typename associated_executor<Handler,
+ IoExecutor>::asio_associated_executor_is_unspecialised,
+ void
+ >::value
+ >
+ > : handler_work_base<IoExecutor>
+{
+public:
+ typedef handler_work_base<IoExecutor> base1_type;
+
+ handler_work(Handler&, const IoExecutor& io_ex) noexcept
+ : base1_type(0, 0, io_ex)
+ {
+ }
+
+ template <typename Function>
+ void complete(Function& function, Handler& handler)
+ {
+ if (!base1_type::owns_work())
+ {
+ // When using a native implementation, I/O completion handlers are
+ // already dispatched according to the execution context's executor's
+ // rules. We can call the function directly.
+ static_cast<Function&&>(function)();
+ }
+ else
+ {
+ base1_type::dispatch(function, handler);
+ }
+ }
+};
+
+template <typename Handler, typename IoExecutor>
+class immediate_handler_work
+{
+public:
+ typedef handler_work<Handler, IoExecutor> handler_work_type;
+
+ explicit immediate_handler_work(handler_work_type&& w)
+ : handler_work_(static_cast<handler_work_type&&>(w))
+ {
+ }
+
+ template <typename Function>
+ void complete(Function& function, Handler& handler, const void* io_ex)
+ {
+ typedef associated_immediate_executor_t<Handler, IoExecutor>
+ immediate_ex_type;
+
+ immediate_ex_type immediate_ex = (get_associated_immediate_executor)(
+ handler, *static_cast<const IoExecutor*>(io_ex));
+
+ (initiate_dispatch_with_executor<immediate_ex_type>(immediate_ex))(
+ static_cast<Function&&>(function));
+ }
+
+private:
+ handler_work_type handler_work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_HANDLER_WORK_HPP
diff --git a/3rdparty/asio/include/asio/detail/hash_map.hpp b/3rdparty/asio/include/asio/detail/hash_map.hpp
new file mode 100644
index 00000000000..e23de914a18
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/hash_map.hpp
@@ -0,0 +1,331 @@
+//
+// detail/hash_map.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <list>
+#include <utility>
+#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<std::size_t>(i);
+}
+
+inline std::size_t calculate_hash_value(void* p)
+{
+ return reinterpret_cast<std::size_t>(p)
+ + (reinterpret_cast<std::size_t>(p) >> 3);
+}
+
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+inline std::size_t calculate_hash_value(SOCKET s)
+{
+ return static_cast<std::size_t>(s);
+}
+#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+
+// Note: assumes K and V are POD types.
+template <typename K, typename V>
+class hash_map
+ : private noncopyable
+{
+public:
+ // The type of a value in the map.
+ typedef std::pair<K, V> value_type;
+
+ // The type of a non-const iterator over the hash map.
+ typedef typename std::list<value_type>::iterator iterator;
+
+ // The type of a const iterator over the hash map.
+ typedef typename std::list<value_type>::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<iterator, bool> 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<iterator, bool>(buckets_[bucket].last, true);
+ }
+ iterator end_it = buckets_[bucket].last;
+ ++end_it;
+ while (it != end_it)
+ {
+ if (it->first == v.first)
+ return std::pair<iterator, bool>(it, false);
+ ++it;
+ }
+ buckets_[bucket].last = values_insert(end_it, v);
+ ++size_;
+ return std::pair<iterator, bool>(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<value_type> values_;
+
+ // The list of spare nodes waiting to be recycled. Assumes that POD types only
+ // are stored in the hash map.
+ std::list<value_type> 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/3rdparty/asio/include/asio/detail/impl/buffer_sequence_adapter.ipp b/3rdparty/asio/include/asio/detail/impl/buffer_sequence_adapter.ipp
new file mode 100644
index 00000000000..372ce426e57
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/buffer_sequence_adapter.ipp
@@ -0,0 +1,118 @@
+//
+// detail/impl/buffer_sequence_adapter.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <robuffer.h>
+#include <windows.storage.streams.h>
+#include <wrl/implements.h>
+#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<byte*>(static_cast<const byte*>(b.data()));
+ length_ = b.size();
+ capacity_ = b.size();
+ }
+
+ explicit winrt_buffer_impl(const asio::mutable_buffer& b)
+ {
+ bytes_ = static_cast<byte*>(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<IInspectable> insp
+ = Microsoft::WRL::Make<winrt_buffer_impl>(buffer);
+ buf = reinterpret_cast<Windows::Storage::Streams::IBuffer^>(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<IInspectable> insp
+ = Microsoft::WRL::Make<winrt_buffer_impl>(buffer);
+ Platform::Object^ buf_obj = reinterpret_cast<Platform::Object^>(insp.Get());
+ buf = reinterpret_cast<Windows::Storage::Streams::IBuffer^>(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/3rdparty/asio/include/asio/detail/impl/descriptor_ops.ipp b/3rdparty/asio/include/asio/detail/impl/descriptor_ops.ipp
new file mode 100644
index 00000000000..c56a512e462
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/descriptor_ops.ipp
@@ -0,0 +1,991 @@
+//
+// detail/impl/descriptor_ops.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cerrno>
+#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)
+{
+ int result = ::open(path, flags);
+ get_last_error(ec, result < 0);
+ return result;
+}
+
+int open(const char* path, int flags,
+ unsigned mode, asio::error_code& ec)
+{
+ int result = ::open(path, flags, mode);
+ get_last_error(ec, result < 0);
+ return result;
+}
+
+int close(int d, state_type& state, asio::error_code& ec)
+{
+ int result = 0;
+ if (d != -1)
+ {
+ result = ::close(d);
+ get_last_error(ec, result < 0);
+
+ 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__) || defined(__EMSCRIPTEN__)
+ int flags = ::fcntl(d, F_GETFL, 0);
+ if (flags >= 0)
+ ::fcntl(d, F_SETFL, flags & ~O_NONBLOCK);
+#else // defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+ ioctl_arg_type arg = 0;
+# if defined(ENOTTY) || defined(ENOTCAPABLE)
+ result = ::ioctl(d, FIONBIO, &arg);
+ get_last_error(ec, result < 0);
+ if (false
+# if defined(ENOTTY)
+ || ec.value() == ENOTTY
+# endif // defined(ENOTTY)
+# if defined(ENOTCAPABLE)
+ || ec.value() == ENOTCAPABLE
+# endif // defined(ENOTCAPABLE)
+ )
+ {
+ int flags = ::fcntl(d, F_GETFL, 0);
+ if (flags >= 0)
+ ::fcntl(d, F_SETFL, flags & ~O_NONBLOCK);
+ }
+# else // defined(ENOTTY) || defined(ENOTCAPABLE)
+ ::ioctl(d, FIONBIO, &arg);
+# endif // defined(ENOTTY) || defined(ENOTCAPABLE)
+#endif // defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+ state &= ~non_blocking;
+
+ result = ::close(d);
+ get_last_error(ec, result < 0);
+ }
+ }
+
+ 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;
+ }
+
+#if defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+ int result = ::fcntl(d, F_GETFL, 0);
+ get_last_error(ec, result < 0);
+ if (result >= 0)
+ {
+ int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK));
+ result = ::fcntl(d, F_SETFL, flag);
+ get_last_error(ec, result < 0);
+ }
+#else // defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+ ioctl_arg_type arg = (value ? 1 : 0);
+ int result = ::ioctl(d, FIONBIO, &arg);
+ get_last_error(ec, result < 0);
+# if defined(ENOTTY) || defined(ENOTCAPABLE)
+ if (false
+# if defined(ENOTTY)
+ || ec.value() == ENOTTY
+# endif // defined(ENOTTY)
+# if defined(ENOTCAPABLE)
+ || ec.value() == ENOTCAPABLE
+# endif // defined(ENOTCAPABLE)
+ )
+ {
+ result = ::fcntl(d, F_GETFL, 0);
+ get_last_error(ec, result < 0);
+ if (result >= 0)
+ {
+ int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK));
+ result = ::fcntl(d, F_SETFL, flag);
+ get_last_error(ec, result < 0);
+ }
+ }
+# endif // defined(ENOTTY) || defined(ENOTCAPABLE)
+#endif // defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+
+ if (result >= 0)
+ {
+ 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;
+ }
+
+#if defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+ int result = ::fcntl(d, F_GETFL, 0);
+ get_last_error(ec, result < 0);
+ if (result >= 0)
+ {
+ int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK));
+ result = ::fcntl(d, F_SETFL, flag);
+ get_last_error(ec, result < 0);
+ }
+#else // defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+ ioctl_arg_type arg = (value ? 1 : 0);
+ int result = ::ioctl(d, FIONBIO, &arg);
+ get_last_error(ec, result < 0);
+# if defined(ENOTTY) || defined(ENOTCAPABLE)
+ if (false
+# if defined(ENOTTY)
+ || ec.value() == ENOTTY
+# endif // defined(ENOTTY)
+# if defined(ENOTCAPABLE)
+ || ec.value() == ENOTCAPABLE
+# endif // defined(ENOTCAPABLE)
+ )
+ {
+ result = ::fcntl(d, F_GETFL, 0);
+ get_last_error(ec, result < 0);
+ if (result >= 0)
+ {
+ int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK));
+ result = ::fcntl(d, F_SETFL, flag);
+ get_last_error(ec, result < 0);
+ }
+ }
+# endif // defined(ENOTTY) || defined(ENOTCAPABLE)
+#endif // defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+
+ if (result >= 0)
+ {
+ 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)
+ {
+ asio::error::clear(ec);
+ return 0;
+ }
+
+ // Read some data.
+ for (;;)
+ {
+ // Try to complete the operation without blocking.
+ signed_size_type bytes = ::readv(d, bufs, static_cast<int>(count));
+ get_last_error(ec, bytes < 0);
+
+ // 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;
+ }
+}
+
+std::size_t sync_read1(int d, state_type state, void* data,
+ std::size_t size, 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 (size == 0)
+ {
+ asio::error::clear(ec);
+ return 0;
+ }
+
+ // Read some data.
+ for (;;)
+ {
+ // Try to complete the operation without blocking.
+ signed_size_type bytes = ::read(d, data, size);
+ get_last_error(ec, bytes < 0);
+
+ // 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.
+ signed_size_type bytes = ::readv(d, bufs, static_cast<int>(count));
+ get_last_error(ec, bytes < 0);
+
+ // Check for end of stream.
+ if (bytes == 0)
+ {
+ ec = asio::error::eof;
+ return true;
+ }
+
+ // Check if operation succeeded.
+ if (bytes > 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+bool non_blocking_read1(int d, void* data, std::size_t size,
+ asio::error_code& ec, std::size_t& bytes_transferred)
+{
+ for (;;)
+ {
+ // Read some data.
+ signed_size_type bytes = ::read(d, data, size);
+ get_last_error(ec, bytes < 0);
+
+ // Check for end of stream.
+ if (bytes == 0)
+ {
+ ec = asio::error::eof;
+ return true;
+ }
+
+ // Check if operation succeeded.
+ if (bytes > 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ 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)
+ {
+ asio::error::clear(ec);
+ return 0;
+ }
+
+ // Write some data.
+ for (;;)
+ {
+ // Try to complete the operation without blocking.
+ signed_size_type bytes = ::writev(d, bufs, static_cast<int>(count));
+ get_last_error(ec, bytes < 0);
+
+ // 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;
+ }
+}
+
+std::size_t sync_write1(int d, state_type state, const void* data,
+ std::size_t size, 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 (size == 0)
+ {
+ asio::error::clear(ec);
+ return 0;
+ }
+
+ // Write some data.
+ for (;;)
+ {
+ // Try to complete the operation without blocking.
+ signed_size_type bytes = ::write(d, data, size);
+ get_last_error(ec, bytes < 0);
+
+ // 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.
+ signed_size_type bytes = ::writev(d, bufs, static_cast<int>(count));
+ get_last_error(ec, bytes < 0);
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+bool non_blocking_write1(int d, const void* data, std::size_t size,
+ asio::error_code& ec, std::size_t& bytes_transferred)
+{
+ for (;;)
+ {
+ // Write some data.
+ signed_size_type bytes = ::write(d, data, size);
+ get_last_error(ec, bytes < 0);
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+#if defined(ASIO_HAS_FILE)
+
+std::size_t sync_read_at(int d, state_type state, uint64_t offset,
+ 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)
+ {
+ asio::error::clear(ec);
+ return 0;
+ }
+
+ // Read some data.
+ for (;;)
+ {
+ // Try to complete the operation without blocking.
+ signed_size_type bytes = ::preadv(d, bufs, static_cast<int>(count), offset);
+ get_last_error(ec, bytes < 0);
+
+ // 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;
+ }
+}
+
+std::size_t sync_read_at1(int d, state_type state, uint64_t offset,
+ void* data, std::size_t size, 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 (size == 0)
+ {
+ asio::error::clear(ec);
+ return 0;
+ }
+
+ // Read some data.
+ for (;;)
+ {
+ // Try to complete the operation without blocking.
+ signed_size_type bytes = ::pread(d, data, size, offset);
+ get_last_error(ec, bytes < 0);
+
+ // 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_at(int d, uint64_t offset, buf* bufs, std::size_t count,
+ asio::error_code& ec, std::size_t& bytes_transferred)
+{
+ for (;;)
+ {
+ // Read some data.
+ signed_size_type bytes = ::preadv(d, bufs, static_cast<int>(count), offset);
+ get_last_error(ec, bytes < 0);
+
+ // Check for EOF.
+ if (bytes == 0)
+ {
+ ec = asio::error::eof;
+ return true;
+ }
+
+ // Check if operation succeeded.
+ if (bytes > 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+bool non_blocking_read_at1(int d, uint64_t offset, void* data, std::size_t size,
+ asio::error_code& ec, std::size_t& bytes_transferred)
+{
+ for (;;)
+ {
+ // Read some data.
+ signed_size_type bytes = ::pread(d, data, size, offset);
+ get_last_error(ec, bytes < 0);
+
+ // Check for EOF.
+ if (bytes == 0)
+ {
+ ec = asio::error::eof;
+ return true;
+ }
+
+ // Check if operation succeeded.
+ if (bytes > 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+std::size_t sync_write_at(int d, state_type state, uint64_t offset,
+ 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)
+ {
+ asio::error::clear(ec);
+ return 0;
+ }
+
+ // Write some data.
+ for (;;)
+ {
+ // Try to complete the operation without blocking.
+ signed_size_type bytes = ::pwritev(d,
+ bufs, static_cast<int>(count), offset);
+ get_last_error(ec, bytes < 0);
+
+ // 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;
+ }
+}
+
+std::size_t sync_write_at1(int d, state_type state, uint64_t offset,
+ const void* data, std::size_t size, 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 (size == 0)
+ {
+ asio::error::clear(ec);
+ return 0;
+ }
+
+ // Write some data.
+ for (;;)
+ {
+ // Try to complete the operation without blocking.
+ signed_size_type bytes = ::pwrite(d, data, size, offset);
+ get_last_error(ec, bytes < 0);
+
+ // 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_at(int d, uint64_t offset,
+ const buf* bufs, std::size_t count,
+ asio::error_code& ec, std::size_t& bytes_transferred)
+{
+ for (;;)
+ {
+ // Write some data.
+ signed_size_type bytes = ::pwritev(d,
+ bufs, static_cast<int>(count), offset);
+ get_last_error(ec, bytes < 0);
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+bool non_blocking_write_at1(int d, uint64_t offset,
+ const void* data, std::size_t size,
+ asio::error_code& ec, std::size_t& bytes_transferred)
+{
+ for (;;)
+ {
+ // Write some data.
+ signed_size_type bytes = ::pwrite(d, data, size, offset);
+ get_last_error(ec, bytes < 0);
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+#endif // defined(ASIO_HAS_FILE)
+
+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;
+ }
+
+ int result = ::ioctl(d, cmd, arg);
+ get_last_error(ec, result < 0);
+
+ if (result >= 0)
+ {
+ // 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<long>(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;
+ }
+
+ int result = ::fcntl(d, cmd);
+ get_last_error(ec, result < 0);
+ return result;
+}
+
+int fcntl(int d, int cmd, long arg, asio::error_code& ec)
+{
+ if (d == -1)
+ {
+ ec = asio::error::bad_descriptor;
+ return -1;
+ }
+
+ int result = ::fcntl(d, cmd, arg);
+ get_last_error(ec, result < 0);
+ 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;
+ int result = ::poll(&fds, 1, timeout);
+ get_last_error(ec, result < 0);
+ if (result == 0)
+ if (state & user_set_non_blocking)
+ ec = asio::error::would_block;
+ 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;
+ int result = ::poll(&fds, 1, timeout);
+ get_last_error(ec, result < 0);
+ if (result == 0)
+ if (state & user_set_non_blocking)
+ ec = asio::error::would_block;
+ 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;
+ int result = ::poll(&fds, 1, timeout);
+ get_last_error(ec, result < 0);
+ if (result == 0)
+ if (state & user_set_non_blocking)
+ ec = asio::error::would_block;
+ 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/3rdparty/asio/include/asio/detail/impl/dev_poll_reactor.hpp b/3rdparty/asio/include/asio/detail/impl/dev_poll_reactor.hpp
new file mode 100644
index 00000000000..b483e44fd1c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/dev_poll_reactor.hpp
@@ -0,0 +1,111 @@
+//
+// detail/impl/dev_poll_reactor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/scheduler.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+inline void dev_poll_reactor::post_immediate_completion(
+ operation* op, bool is_continuation) const
+{
+ scheduler_.post_immediate_completion(op, is_continuation);
+}
+
+template <typename Time_Traits>
+void dev_poll_reactor::add_timer_queue(timer_queue<Time_Traits>& queue)
+{
+ do_add_timer_queue(queue);
+}
+
+template <typename Time_Traits>
+void dev_poll_reactor::remove_timer_queue(timer_queue<Time_Traits>& queue)
+{
+ do_remove_timer_queue(queue);
+}
+
+template <typename Time_Traits>
+void dev_poll_reactor::schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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 <typename Time_Traits>
+std::size_t dev_poll_reactor::cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled)
+{
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ std::size_t n = queue.cancel_timer(timer, ops, max_cancelled);
+ lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+ return n;
+}
+
+template <typename Time_Traits>
+void dev_poll_reactor::cancel_timer_by_key(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data* timer,
+ void* cancellation_key)
+{
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ queue.cancel_timer_by_key(timer, ops, cancellation_key);
+ lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+}
+
+template <typename Time_Traits>
+void dev_poll_reactor::move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& target,
+ typename timer_queue<Time_Traits>::per_timer_data& source)
+{
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ op_queue<operation> 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/3rdparty/asio/include/asio/detail/impl/dev_poll_reactor.ipp b/3rdparty/asio/include/asio/detail/impl/dev_poll_reactor.ipp
new file mode 100644
index 00000000000..c9c53fbeafd
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/dev_poll_reactor.ipp
@@ -0,0 +1,469 @@
+//
+// detail/impl/dev_poll_reactor.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/scheduler.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<dev_poll_reactor>(ctx),
+ scheduler_(use_service<scheduler>(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<operation> 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<socket_type>::iterator iter = op_queue_[i].begin();
+ reactor_op_queue<socket_type>::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::call_post_immediate_completion(
+ operation* op, bool is_continuation, const void* self)
+{
+ static_cast<const dev_poll_reactor*>(self)->post_immediate_completion(
+ op, is_continuation);
+}
+
+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,
+ void (*on_immediate)(operation*, bool, const void*),
+ const void* immediate_arg)
+{
+ asio::detail::mutex::scoped_lock lock(mutex_);
+
+ if (shutdown_)
+ {
+ on_immediate(op, is_continuation, immediate_arg);
+ 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();
+ on_immediate(op, is_continuation, immediate_arg);
+ 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::cancel_ops_by_key(socket_type descriptor,
+ dev_poll_reactor::per_descriptor_data&,
+ int op_type, void* cancellation_key)
+{
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ bool need_interrupt = op_queue_[op_type].cancel_operations_by_key(
+ descriptor, ops, cancellation_key, asio::error::operation_aborted);
+ scheduler_.post_deferred_completions(ops);
+ if (need_interrupt)
+ interrupter_.interrupt();
+}
+
+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<operation> 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<operation>& 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<int>(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<operation> 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<int, std::size_t>::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/3rdparty/asio/include/asio/detail/impl/epoll_reactor.hpp b/3rdparty/asio/include/asio/detail/impl/epoll_reactor.hpp
new file mode 100644
index 00000000000..4fffeb75924
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/epoll_reactor.hpp
@@ -0,0 +1,109 @@
+//
+// detail/impl/epoll_reactor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/scheduler.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+inline void epoll_reactor::post_immediate_completion(
+ operation* op, bool is_continuation) const
+{
+ scheduler_.post_immediate_completion(op, is_continuation);
+}
+
+template <typename Time_Traits>
+void epoll_reactor::add_timer_queue(timer_queue<Time_Traits>& queue)
+{
+ do_add_timer_queue(queue);
+}
+
+template <typename Time_Traits>
+void epoll_reactor::remove_timer_queue(timer_queue<Time_Traits>& queue)
+{
+ do_remove_timer_queue(queue);
+}
+
+template <typename Time_Traits>
+void epoll_reactor::schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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 <typename Time_Traits>
+std::size_t epoll_reactor::cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled)
+{
+ mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ std::size_t n = queue.cancel_timer(timer, ops, max_cancelled);
+ lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+ return n;
+}
+
+template <typename Time_Traits>
+void epoll_reactor::cancel_timer_by_key(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data* timer,
+ void* cancellation_key)
+{
+ mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ queue.cancel_timer_by_key(timer, ops, cancellation_key);
+ lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+}
+
+template <typename Time_Traits>
+void epoll_reactor::move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& target,
+ typename timer_queue<Time_Traits>::per_timer_data& source)
+{
+ mutex::scoped_lock lock(mutex_);
+ op_queue<operation> 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/3rdparty/asio/include/asio/detail/impl/epoll_reactor.ipp b/3rdparty/asio/include/asio/detail/impl/epoll_reactor.ipp
new file mode 100644
index 00000000000..51795bda40c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/epoll_reactor.ipp
@@ -0,0 +1,826 @@
+//
+// detail/impl/epoll_reactor.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <sys/epoll.h>
+#include "asio/detail/epoll_reactor.hpp"
+#include "asio/detail/scheduler.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+
+#if defined(ASIO_HAS_TIMERFD)
+# include <sys/timerfd.h>
+#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<epoll_reactor>(ctx),
+ scheduler_(use_service<scheduler>(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<operation> 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<uintmax_t>(descriptor),
+ reinterpret_cast<uintmax_t>(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<uintmax_t>(descriptor),
+ reinterpret_cast<uintmax_t>(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::call_post_immediate_completion(
+ operation* op, bool is_continuation, const void* self)
+{
+ static_cast<const epoll_reactor*>(self)->post_immediate_completion(
+ op, is_continuation);
+}
+
+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,
+ void (*on_immediate)(operation*, bool, const void*),
+ const void* immediate_arg)
+{
+ if (!descriptor_data)
+ {
+ op->ec_ = asio::error::bad_descriptor;
+ on_immediate(op, is_continuation, immediate_arg);
+ return;
+ }
+
+ mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
+
+ if (descriptor_data->shutdown_)
+ {
+ on_immediate(op, is_continuation, immediate_arg);
+ 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();
+ on_immediate(op, is_continuation, immediate_arg);
+ return;
+ }
+ }
+
+ if (descriptor_data->registered_events_ == 0)
+ {
+ op->ec_ = asio::error::operation_not_supported;
+ on_immediate(op, is_continuation, immediate_arg);
+ 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());
+ on_immediate(op, is_continuation, immediate_arg);
+ return;
+ }
+ }
+ }
+ }
+ else if (descriptor_data->registered_events_ == 0)
+ {
+ op->ec_ = asio::error::operation_not_supported;
+ on_immediate(op, is_continuation, immediate_arg);
+ 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<operation> 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::cancel_ops_by_key(socket_type,
+ epoll_reactor::per_descriptor_data& descriptor_data,
+ int op_type, void* cancellation_key)
+{
+ if (!descriptor_data)
+ return;
+
+ mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
+
+ op_queue<operation> ops;
+ op_queue<reactor_op> other_ops;
+ while (reactor_op* op = descriptor_data->op_queue_[op_type].front())
+ {
+ descriptor_data->op_queue_[op_type].pop();
+ if (op->cancellation_key_ == cancellation_key)
+ {
+ op->ec_ = asio::error::operation_aborted;
+ ops.push(op);
+ }
+ else
+ other_ops.push(op);
+ }
+ descriptor_data->op_queue_[op_type].push(other_ops);
+
+ 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<operation> 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<uintmax_t>(descriptor),
+ reinterpret_cast<uintmax_t>(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<operation> 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<uintmax_t>(descriptor),
+ reinterpret_cast<uintmax_t>(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<operation>& 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<uintmax_t>(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<descriptor_state*>(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<operation> 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<descriptor_state*>(base);
+ uint32_t events = static_cast<uint32_t>(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/3rdparty/asio/include/asio/detail/impl/eventfd_select_interrupter.ipp b/3rdparty/asio/include/asio/detail/impl/eventfd_select_interrupter.ipp
new file mode 100644
index 00000000000..2e970d8850b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/eventfd_select_interrupter.ipp
@@ -0,0 +1,171 @@
+//
+// detail/impl/eventfd_select_interrupter.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 && !defined(__UCLIBC__)
+# include <asm/unistd.h>
+#else // __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 && !defined(__UCLIBC__)
+# include <sys/eventfd.h>
+#endif // __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 && !defined(__UCLIBC__)
+#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 && !defined(__UCLIBC__)
+ 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 && !defined(__UCLIBC__)
+# 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 && !defined(__UCLIBC__)
+
+ 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;
+ return true;
+ }
+ }
+ else
+ {
+ for (;;)
+ {
+ // Clear all data from the pipe.
+ char data[1024];
+ int bytes_read = ::read(read_descriptor_, data, sizeof(data));
+ if (bytes_read == sizeof(data))
+ continue;
+ if (bytes_read > 0)
+ return true;
+ if (bytes_read == 0)
+ return false;
+ if (errno == EINTR)
+ continue;
+ if (errno == EWOULDBLOCK)
+ return true;
+ if (errno == EAGAIN)
+ return true;
+ return false;
+ }
+ }
+}
+
+} // 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/3rdparty/asio/include/asio/detail/impl/handler_tracking.ipp b/3rdparty/asio/include/asio/detail/impl/handler_tracking.ipp
new file mode 100644
index 00000000000..f4e3e3b501a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/handler_tracking.ipp
@@ -0,0 +1,398 @@
+//
+// detail/impl/handler_tracking.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstdarg>
+#include <cstdio>
+#include "asio/detail/handler_tracking.hpp"
+
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+# include "asio/time_traits.hpp"
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
+# 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 <unistd.h>
+#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;
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
+ typedef chrono_time_traits<chrono::system_clock,
+ asio::wait_traits<chrono::system_clock>> traits_helper;
+ traits_helper::posix_time_duration now(
+ chrono::system_clock::now().time_since_epoch());
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+ seconds = static_cast<uint64_t>(now.total_seconds());
+ microseconds = static_cast<uint64_t>(now.total_microseconds() % 1000000);
+ }
+};
+
+struct handler_tracking::tracking_state
+{
+ static_mutex mutex_;
+ uint64_t next_id_;
+ tss_ptr<completion>* current_completion_;
+ tss_ptr<location>* current_location_;
+};
+
+handler_tracking::tracking_state* handler_tracking::get_state()
+{
+ static tracking_state state = { ASIO_STATIC_MUTEX_INIT, 1, 0, 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<completion>;
+ if (state->current_location_ == 0)
+ state->current_location_ = new tss_ptr<location>;
+}
+
+handler_tracking::location::location(
+ const char* file, int line, const char* func)
+ : file_(file),
+ line_(line),
+ func_(func),
+ next_(*get_state()->current_location_)
+{
+ if (file_)
+ *get_state()->current_location_ = this;
+}
+
+handler_tracking::location::~location()
+{
+ if (file_)
+ *get_state()->current_location_ = next_;
+}
+
+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_;
+
+ for (location* current_location = *state->current_location_;
+ current_location; current_location = current_location->next_)
+ {
+ write_line(
+#if defined(ASIO_WINDOWS)
+ "@asio|%I64u.%06I64u|%I64u^%I64u|%s%s%.80s%s(%.80s:%d)\n",
+#else // defined(ASIO_WINDOWS)
+ "@asio|%llu.%06llu|%llu^%llu|%s%s%.80s%s(%.80s:%d)\n",
+#endif // defined(ASIO_WINDOWS)
+ timestamp.seconds, timestamp.microseconds,
+ current_id, h.id_,
+ current_location == *state->current_location_ ? "in " : "called from ",
+ current_location->func_ ? "'" : "",
+ current_location->func_ ? current_location->func_ : "",
+ current_location->func_ ? "' " : "",
+ current_location->file_, current_location->line_);
+ }
+
+ 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<uint64_t>(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<uint64_t>(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_SNPRINTF)
+ int length = vsnprintf(line, sizeof(line), format, args);
+#elif 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/3rdparty/asio/include/asio/detail/impl/io_uring_descriptor_service.ipp b/3rdparty/asio/include/asio/detail/impl/io_uring_descriptor_service.ipp
new file mode 100644
index 00000000000..21b9e232cfb
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/io_uring_descriptor_service.ipp
@@ -0,0 +1,205 @@
+//
+// detail/impl/io_uring_descriptor_service.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_IO_URING_DESCRIPTOR_SERVICE_IPP
+#define ASIO_DETAIL_IMPL_IO_URING_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_HAS_IO_URING)
+
+#include "asio/error.hpp"
+#include "asio/detail/io_uring_descriptor_service.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+io_uring_descriptor_service::io_uring_descriptor_service(
+ execution_context& context)
+ : execution_context_service_base<io_uring_descriptor_service>(context),
+ io_uring_service_(asio::use_service<io_uring_service>(context))
+{
+ io_uring_service_.init_task();
+}
+
+void io_uring_descriptor_service::shutdown()
+{
+}
+
+void io_uring_descriptor_service::construct(
+ io_uring_descriptor_service::implementation_type& impl)
+{
+ impl.descriptor_ = -1;
+ impl.state_ = 0;
+ impl.io_object_data_ = 0;
+}
+
+void io_uring_descriptor_service::move_construct(
+ io_uring_descriptor_service::implementation_type& impl,
+ io_uring_descriptor_service::implementation_type& other_impl)
+ noexcept
+{
+ impl.descriptor_ = other_impl.descriptor_;
+ other_impl.descriptor_ = -1;
+
+ impl.state_ = other_impl.state_;
+ other_impl.state_ = 0;
+
+ impl.io_object_data_ = other_impl.io_object_data_;
+ other_impl.io_object_data_ = 0;
+}
+
+void io_uring_descriptor_service::move_assign(
+ io_uring_descriptor_service::implementation_type& impl,
+ io_uring_descriptor_service& /*other_service*/,
+ io_uring_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;
+
+ impl.io_object_data_ = other_impl.io_object_data_;
+ other_impl.io_object_data_ = 0;
+}
+
+void io_uring_descriptor_service::destroy(
+ io_uring_descriptor_service::implementation_type& impl)
+{
+ if (is_open(impl))
+ {
+ ASIO_HANDLER_OPERATION((io_uring_service_.context(),
+ "descriptor", &impl, impl.descriptor_, "close"));
+
+ io_uring_service_.deregister_io_object(impl.io_object_data_);
+ asio::error_code ignored_ec;
+ descriptor_ops::close(impl.descriptor_, impl.state_, ignored_ec);
+ io_uring_service_.cleanup_io_object(impl.io_object_data_);
+ }
+}
+
+asio::error_code io_uring_descriptor_service::assign(
+ io_uring_descriptor_service::implementation_type& impl,
+ const native_handle_type& native_descriptor, asio::error_code& ec)
+{
+ if (is_open(impl))
+ {
+ ec = asio::error::already_open;
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ io_uring_service_.register_io_object(impl.io_object_data_);
+
+ impl.descriptor_ = native_descriptor;
+ impl.state_ = descriptor_ops::possible_dup;
+ ec = success_ec_;
+ return ec;
+}
+
+asio::error_code io_uring_descriptor_service::close(
+ io_uring_descriptor_service::implementation_type& impl,
+ asio::error_code& ec)
+{
+ if (is_open(impl))
+ {
+ ASIO_HANDLER_OPERATION((io_uring_service_.context(),
+ "descriptor", &impl, impl.descriptor_, "close"));
+
+ io_uring_service_.deregister_io_object(impl.io_object_data_);
+ descriptor_ops::close(impl.descriptor_, impl.state_, ec);
+ io_uring_service_.cleanup_io_object(impl.io_object_data_);
+ }
+ else
+ {
+ ec = success_ec_;
+ }
+
+ // 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
+ construct(impl);
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+}
+
+io_uring_descriptor_service::native_handle_type
+io_uring_descriptor_service::release(
+ io_uring_descriptor_service::implementation_type& impl)
+{
+ native_handle_type descriptor = impl.descriptor_;
+
+ if (is_open(impl))
+ {
+ ASIO_HANDLER_OPERATION((io_uring_service_.context(),
+ "descriptor", &impl, impl.descriptor_, "release"));
+
+ io_uring_service_.deregister_io_object(impl.io_object_data_);
+ io_uring_service_.cleanup_io_object(impl.io_object_data_);
+ construct(impl);
+ }
+
+ return descriptor;
+}
+
+asio::error_code io_uring_descriptor_service::cancel(
+ io_uring_descriptor_service::implementation_type& impl,
+ asio::error_code& ec)
+{
+ if (!is_open(impl))
+ {
+ ec = asio::error::bad_descriptor;
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ ASIO_HANDLER_OPERATION((io_uring_service_.context(),
+ "descriptor", &impl, impl.descriptor_, "cancel"));
+
+ io_uring_service_.cancel_ops(impl.io_object_data_);
+ ec = success_ec_;
+ return ec;
+}
+
+void io_uring_descriptor_service::start_op(
+ io_uring_descriptor_service::implementation_type& impl,
+ int op_type, io_uring_operation* op, bool is_continuation, bool noop)
+{
+ if (!noop)
+ {
+ io_uring_service_.start_op(op_type,
+ impl.io_object_data_, op, is_continuation);
+ }
+ else
+ {
+ io_uring_service_.post_immediate_completion(op, is_continuation);
+ }
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IMPL_IO_URING_DESCRIPTOR_SERVICE_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/io_uring_file_service.ipp b/3rdparty/asio/include/asio/detail/impl/io_uring_file_service.ipp
new file mode 100644
index 00000000000..4742a7190d3
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/io_uring_file_service.ipp
@@ -0,0 +1,140 @@
+//
+// detail/impl/io_uring_file_service.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_IO_URING_FILE_SERVICE_IPP
+#define ASIO_DETAIL_IMPL_IO_URING_FILE_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_FILE) \
+ && defined(ASIO_HAS_IO_URING)
+
+#include <cstring>
+#include <sys/stat.h>
+#include "asio/detail/io_uring_file_service.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+io_uring_file_service::io_uring_file_service(
+ execution_context& context)
+ : execution_context_service_base<io_uring_file_service>(context),
+ descriptor_service_(context)
+{
+}
+
+void io_uring_file_service::shutdown()
+{
+ descriptor_service_.shutdown();
+}
+
+asio::error_code io_uring_file_service::open(
+ io_uring_file_service::implementation_type& impl,
+ const char* path, file_base::flags open_flags,
+ asio::error_code& ec)
+{
+ if (is_open(impl))
+ {
+ ec = asio::error::already_open;
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ descriptor_ops::state_type state = 0;
+ int fd = descriptor_ops::open(path, static_cast<int>(open_flags), 0777, ec);
+ if (fd < 0)
+ {
+ ASIO_ERROR_LOCATION(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);
+ }
+
+ (void)::posix_fadvise(native_handle(impl), 0, 0,
+ impl.is_stream_ ? POSIX_FADV_SEQUENTIAL : POSIX_FADV_RANDOM);
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+}
+
+uint64_t io_uring_file_service::size(
+ const io_uring_file_service::implementation_type& impl,
+ asio::error_code& ec) const
+{
+ struct stat s;
+ int result = ::fstat(native_handle(impl), &s);
+ descriptor_ops::get_last_error(ec, result != 0);
+ ASIO_ERROR_LOCATION(ec);
+ return !ec ? s.st_size : 0;
+}
+
+asio::error_code io_uring_file_service::resize(
+ io_uring_file_service::implementation_type& impl,
+ uint64_t n, asio::error_code& ec)
+{
+ int result = ::ftruncate(native_handle(impl), n);
+ descriptor_ops::get_last_error(ec, result != 0);
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+}
+
+asio::error_code io_uring_file_service::sync_all(
+ io_uring_file_service::implementation_type& impl,
+ asio::error_code& ec)
+{
+ int result = ::fsync(native_handle(impl));
+ descriptor_ops::get_last_error(ec, result != 0);
+ return ec;
+}
+
+asio::error_code io_uring_file_service::sync_data(
+ io_uring_file_service::implementation_type& impl,
+ asio::error_code& ec)
+{
+#if defined(_POSIX_SYNCHRONIZED_IO)
+ int result = ::fdatasync(native_handle(impl));
+#else // defined(_POSIX_SYNCHRONIZED_IO)
+ int result = ::fsync(native_handle(impl));
+#endif // defined(_POSIX_SYNCHRONIZED_IO)
+ descriptor_ops::get_last_error(ec, result != 0);
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+}
+
+uint64_t io_uring_file_service::seek(
+ io_uring_file_service::implementation_type& impl, int64_t offset,
+ file_base::seek_basis whence, asio::error_code& ec)
+{
+ int64_t result = ::lseek(native_handle(impl), offset, whence);
+ descriptor_ops::get_last_error(ec, result < 0);
+ ASIO_ERROR_LOCATION(ec);
+ return !ec ? static_cast<uint64_t>(result) : 0;
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_FILE)
+ // && defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IMPL_IO_URING_FILE_SERVICE_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/io_uring_service.hpp b/3rdparty/asio/include/asio/detail/impl/io_uring_service.hpp
new file mode 100644
index 00000000000..8dfab1e6d1d
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/io_uring_service.hpp
@@ -0,0 +1,112 @@
+//
+// detail/impl/io_uring_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_IO_URING_SERVICE_HPP
+#define ASIO_DETAIL_IMPL_IO_URING_SERVICE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#if defined(ASIO_HAS_IO_URING)
+
+#include "asio/detail/scheduler.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+inline void io_uring_service::post_immediate_completion(
+ operation* op, bool is_continuation)
+{
+ scheduler_.post_immediate_completion(op, is_continuation);
+}
+
+template <typename Time_Traits>
+void io_uring_service::add_timer_queue(timer_queue<Time_Traits>& queue)
+{
+ do_add_timer_queue(queue);
+}
+
+template <typename Time_Traits>
+void io_uring_service::remove_timer_queue(timer_queue<Time_Traits>& queue)
+{
+ do_remove_timer_queue(queue);
+}
+
+template <typename Time_Traits>
+void io_uring_service::schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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();
+ post_submit_sqes_op(lock);
+ }
+}
+
+template <typename Time_Traits>
+std::size_t io_uring_service::cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled)
+{
+ mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ std::size_t n = queue.cancel_timer(timer, ops, max_cancelled);
+ lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+ return n;
+}
+
+template <typename Time_Traits>
+void io_uring_service::cancel_timer_by_key(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data* timer,
+ void* cancellation_key)
+{
+ mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ queue.cancel_timer_by_key(timer, ops, cancellation_key);
+ lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+}
+
+template <typename Time_Traits>
+void io_uring_service::move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& target,
+ typename timer_queue<Time_Traits>::per_timer_data& source)
+{
+ mutex::scoped_lock lock(mutex_);
+ op_queue<operation> 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_IO_URING)
+
+#endif // ASIO_DETAIL_IMPL_IO_URING_SERVICE_HPP
diff --git a/3rdparty/asio/include/asio/detail/impl/io_uring_service.ipp b/3rdparty/asio/include/asio/detail/impl/io_uring_service.ipp
new file mode 100644
index 00000000000..740010cda11
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/io_uring_service.ipp
@@ -0,0 +1,914 @@
+//
+// detail/impl/io_uring_service.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_IO_URING_SERVICE_IPP
+#define ASIO_DETAIL_IMPL_IO_URING_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_IO_URING)
+
+#include <cstddef>
+#include <sys/eventfd.h>
+#include "asio/detail/io_uring_service.hpp"
+#include "asio/detail/reactor_op.hpp"
+#include "asio/detail/scheduler.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+io_uring_service::io_uring_service(asio::execution_context& ctx)
+ : execution_context_service_base<io_uring_service>(ctx),
+ scheduler_(use_service<scheduler>(ctx)),
+ mutex_(ASIO_CONCURRENCY_HINT_IS_LOCKING(
+ REACTOR_REGISTRATION, scheduler_.concurrency_hint())),
+ outstanding_work_(0),
+ submit_sqes_op_(this),
+ pending_sqes_(0),
+ pending_submit_sqes_op_(false),
+ shutdown_(false),
+ timeout_(),
+ registration_mutex_(mutex_.enabled()),
+ reactor_(use_service<reactor>(ctx)),
+ reactor_data_(),
+ event_fd_(-1)
+{
+ reactor_.init_task();
+ init_ring();
+ register_with_reactor();
+}
+
+io_uring_service::~io_uring_service()
+{
+ if (ring_.ring_fd != -1)
+ ::io_uring_queue_exit(&ring_);
+ if (event_fd_ != -1)
+ ::close(event_fd_);
+}
+
+void io_uring_service::shutdown()
+{
+ mutex::scoped_lock lock(mutex_);
+ shutdown_ = true;
+ lock.unlock();
+
+ op_queue<operation> ops;
+
+ // Cancel all outstanding operations.
+ while (io_object* io_obj = registered_io_objects_.first())
+ {
+ for (int i = 0; i < max_ops; ++i)
+ {
+ if (!io_obj->queues_[i].op_queue_.empty())
+ {
+ ops.push(io_obj->queues_[i].op_queue_);
+ if (::io_uring_sqe* sqe = get_sqe())
+ ::io_uring_prep_cancel(sqe, &io_obj->queues_[i], 0);
+ }
+ }
+ io_obj->shutdown_ = true;
+ registered_io_objects_.free(io_obj);
+ }
+
+ // Cancel the timeout operation.
+ if (::io_uring_sqe* sqe = get_sqe())
+ ::io_uring_prep_cancel(sqe, &timeout_, IOSQE_IO_DRAIN);
+ submit_sqes();
+
+ // Wait for all completions to come back.
+ for (; outstanding_work_ > 0; --outstanding_work_)
+ {
+ ::io_uring_cqe* cqe = 0;
+ if (::io_uring_wait_cqe(&ring_, &cqe) != 0)
+ break;
+ }
+
+ timer_queues_.get_all_timers(ops);
+
+ scheduler_.abandon_operations(ops);
+}
+
+void io_uring_service::notify_fork(
+ asio::execution_context::fork_event fork_ev)
+{
+ switch (fork_ev)
+ {
+ case asio::execution_context::fork_prepare:
+ {
+ // Cancel all outstanding operations. They will be restarted
+ // after the fork completes.
+ mutex::scoped_lock registration_lock(registration_mutex_);
+ for (io_object* io_obj = registered_io_objects_.first();
+ io_obj != 0; io_obj = io_obj->next_)
+ {
+ mutex::scoped_lock io_object_lock(io_obj->mutex_);
+ for (int i = 0; i < max_ops; ++i)
+ {
+ if (!io_obj->queues_[i].op_queue_.empty()
+ && !io_obj->queues_[i].cancel_requested_)
+ {
+ mutex::scoped_lock lock(mutex_);
+ if (::io_uring_sqe* sqe = get_sqe())
+ ::io_uring_prep_cancel(sqe, &io_obj->queues_[i], 0);
+ }
+ }
+ }
+
+ // Cancel the timeout operation.
+ {
+ mutex::scoped_lock lock(mutex_);
+ if (::io_uring_sqe* sqe = get_sqe())
+ ::io_uring_prep_cancel(sqe, &timeout_, IOSQE_IO_DRAIN);
+ submit_sqes();
+ }
+
+ // Wait for all completions to come back, and post all completed I/O
+ // queues to the scheduler. Note that some operations may have already
+ // completed, or were explicitly cancelled. All others will be
+ // automatically restarted.
+ op_queue<operation> ops;
+ for (; outstanding_work_ > 0; --outstanding_work_)
+ {
+ ::io_uring_cqe* cqe = 0;
+ if (::io_uring_wait_cqe(&ring_, &cqe) != 0)
+ break;
+ if (void* ptr = ::io_uring_cqe_get_data(cqe))
+ {
+ if (ptr != this && ptr != &timer_queues_ && ptr != &timeout_)
+ {
+ io_queue* io_q = static_cast<io_queue*>(ptr);
+ io_q->set_result(cqe->res);
+ ops.push(io_q);
+ }
+ }
+ }
+ scheduler_.post_deferred_completions(ops);
+
+ // Restart and eventfd operation.
+ register_with_reactor();
+ }
+ break;
+
+ case asio::execution_context::fork_parent:
+ // Restart the timeout and eventfd operations.
+ update_timeout();
+ register_with_reactor();
+ break;
+
+ case asio::execution_context::fork_child:
+ {
+ // The child process gets a new io_uring instance.
+ ::io_uring_queue_exit(&ring_);
+ init_ring();
+ register_with_reactor();
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void io_uring_service::init_task()
+{
+ scheduler_.init_task();
+}
+
+void io_uring_service::register_io_object(
+ io_uring_service::per_io_object_data& io_obj)
+{
+ io_obj = allocate_io_object();
+
+ mutex::scoped_lock io_object_lock(io_obj->mutex_);
+
+ io_obj->service_ = this;
+ io_obj->shutdown_ = false;
+ for (int i = 0; i < max_ops; ++i)
+ {
+ io_obj->queues_[i].io_object_ = io_obj;
+ io_obj->queues_[i].cancel_requested_ = false;
+ }
+}
+
+void io_uring_service::register_internal_io_object(
+ io_uring_service::per_io_object_data& io_obj,
+ int op_type, io_uring_operation* op)
+{
+ io_obj = allocate_io_object();
+
+ mutex::scoped_lock io_object_lock(io_obj->mutex_);
+
+ io_obj->service_ = this;
+ io_obj->shutdown_ = false;
+ for (int i = 0; i < max_ops; ++i)
+ {
+ io_obj->queues_[i].io_object_ = io_obj;
+ io_obj->queues_[i].cancel_requested_ = false;
+ }
+
+ io_obj->queues_[op_type].op_queue_.push(op);
+ io_object_lock.unlock();
+ mutex::scoped_lock lock(mutex_);
+ if (::io_uring_sqe* sqe = get_sqe())
+ {
+ op->prepare(sqe);
+ ::io_uring_sqe_set_data(sqe, &io_obj->queues_[op_type]);
+ post_submit_sqes_op(lock);
+ }
+ else
+ {
+ asio::error_code ec(ENOBUFS,
+ asio::error::get_system_category());
+ asio::detail::throw_error(ec, "io_uring_get_sqe");
+ }
+}
+
+void io_uring_service::register_buffers(const ::iovec* v, unsigned n)
+{
+ int result = ::io_uring_register_buffers(&ring_, v, n);
+ if (result < 0)
+ {
+ asio::error_code ec(-result,
+ asio::error::get_system_category());
+ asio::detail::throw_error(ec, "io_uring_register_buffers");
+ }
+}
+
+void io_uring_service::unregister_buffers()
+{
+ (void)::io_uring_unregister_buffers(&ring_);
+}
+
+void io_uring_service::start_op(int op_type,
+ io_uring_service::per_io_object_data& io_obj,
+ io_uring_operation* op, bool is_continuation)
+{
+ if (!io_obj)
+ {
+ op->ec_ = asio::error::bad_descriptor;
+ post_immediate_completion(op, is_continuation);
+ return;
+ }
+
+ mutex::scoped_lock io_object_lock(io_obj->mutex_);
+
+ if (io_obj->shutdown_)
+ {
+ io_object_lock.unlock();
+ post_immediate_completion(op, is_continuation);
+ return;
+ }
+
+ if (io_obj->queues_[op_type].op_queue_.empty())
+ {
+ if (op->perform(false))
+ {
+ io_object_lock.unlock();
+ scheduler_.post_immediate_completion(op, is_continuation);
+ }
+ else
+ {
+ io_obj->queues_[op_type].op_queue_.push(op);
+ io_object_lock.unlock();
+ mutex::scoped_lock lock(mutex_);
+ if (::io_uring_sqe* sqe = get_sqe())
+ {
+ op->prepare(sqe);
+ ::io_uring_sqe_set_data(sqe, &io_obj->queues_[op_type]);
+ scheduler_.work_started();
+ post_submit_sqes_op(lock);
+ }
+ else
+ {
+ lock.unlock();
+ io_obj->queues_[op_type].set_result(-ENOBUFS);
+ post_immediate_completion(&io_obj->queues_[op_type], is_continuation);
+ }
+ }
+ }
+ else
+ {
+ io_obj->queues_[op_type].op_queue_.push(op);
+ scheduler_.work_started();
+ }
+}
+
+void io_uring_service::cancel_ops(io_uring_service::per_io_object_data& io_obj)
+{
+ if (!io_obj)
+ return;
+
+ mutex::scoped_lock io_object_lock(io_obj->mutex_);
+ op_queue<operation> ops;
+ do_cancel_ops(io_obj, ops);
+ io_object_lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+}
+
+void io_uring_service::cancel_ops_by_key(
+ io_uring_service::per_io_object_data& io_obj,
+ int op_type, void* cancellation_key)
+{
+ if (!io_obj)
+ return;
+
+ mutex::scoped_lock io_object_lock(io_obj->mutex_);
+
+ bool first = true;
+ op_queue<operation> ops;
+ op_queue<io_uring_operation> other_ops;
+ while (io_uring_operation* op = io_obj->queues_[op_type].op_queue_.front())
+ {
+ io_obj->queues_[op_type].op_queue_.pop();
+ if (op->cancellation_key_ == cancellation_key)
+ {
+ if (first)
+ {
+ other_ops.push(op);
+ if (!io_obj->queues_[op_type].cancel_requested_)
+ {
+ io_obj->queues_[op_type].cancel_requested_ = true;
+ mutex::scoped_lock lock(mutex_);
+ if (::io_uring_sqe* sqe = get_sqe())
+ {
+ ::io_uring_prep_cancel(sqe, &io_obj->queues_[op_type], 0);
+ submit_sqes();
+ }
+ }
+ }
+ else
+ {
+ op->ec_ = asio::error::operation_aborted;
+ ops.push(op);
+ }
+ }
+ else
+ other_ops.push(op);
+ first = false;
+ }
+ io_obj->queues_[op_type].op_queue_.push(other_ops);
+
+ io_object_lock.unlock();
+
+ scheduler_.post_deferred_completions(ops);
+}
+
+void io_uring_service::deregister_io_object(
+ io_uring_service::per_io_object_data& io_obj)
+{
+ if (!io_obj)
+ return;
+
+ mutex::scoped_lock io_object_lock(io_obj->mutex_);
+ if (!io_obj->shutdown_)
+ {
+ op_queue<operation> ops;
+ bool pending_cancelled_ops = do_cancel_ops(io_obj, ops);
+ io_obj->shutdown_ = true;
+ io_object_lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+ if (pending_cancelled_ops)
+ {
+ // There are still pending operations. Prevent cleanup_io_object from
+ // freeing the I/O object and let the last operation to complete free it.
+ io_obj = 0;
+ }
+ else
+ {
+ // Leave io_obj set so that it will be freed by the subsequent call to
+ // cleanup_io_object.
+ }
+ }
+ else
+ {
+ // We are shutting down, so prevent cleanup_io_object from freeing
+ // the I/O object and let the destructor free it instead.
+ io_obj = 0;
+ }
+}
+
+void io_uring_service::cleanup_io_object(
+ io_uring_service::per_io_object_data& io_obj)
+{
+ if (io_obj)
+ {
+ free_io_object(io_obj);
+ io_obj = 0;
+ }
+}
+
+void io_uring_service::run(long usec, op_queue<operation>& ops)
+{
+ __kernel_timespec ts;
+ int local_ops = 0;
+
+ if (usec > 0)
+ {
+ ts.tv_sec = usec / 1000000;
+ ts.tv_nsec = (usec % 1000000) * 1000;
+ mutex::scoped_lock lock(mutex_);
+ if (::io_uring_sqe* sqe = get_sqe())
+ {
+ ++local_ops;
+ ::io_uring_prep_timeout(sqe, &ts, 0, 0);
+ ::io_uring_sqe_set_data(sqe, &ts);
+ submit_sqes();
+ }
+ }
+
+ ::io_uring_cqe* cqe = 0;
+ int result = (usec == 0)
+ ? ::io_uring_peek_cqe(&ring_, &cqe)
+ : ::io_uring_wait_cqe(&ring_, &cqe);
+
+ if (local_ops > 0)
+ {
+ if (result != 0 || ::io_uring_cqe_get_data(cqe) != &ts)
+ {
+ mutex::scoped_lock lock(mutex_);
+ if (::io_uring_sqe* sqe = get_sqe())
+ {
+ ++local_ops;
+ ::io_uring_prep_timeout_remove(sqe, reinterpret_cast<__u64>(&ts), 0);
+ ::io_uring_sqe_set_data(sqe, &ts);
+ submit_sqes();
+ }
+ }
+ }
+
+ bool check_timers = false;
+ int count = 0;
+ while (result == 0 || local_ops > 0)
+ {
+ if (result == 0)
+ {
+ if (void* ptr = ::io_uring_cqe_get_data(cqe))
+ {
+ if (ptr == this)
+ {
+ // The io_uring service was interrupted.
+ }
+ else if (ptr == &timer_queues_)
+ {
+ check_timers = true;
+ }
+ else if (ptr == &timeout_)
+ {
+ check_timers = true;
+ timeout_.tv_sec = 0;
+ timeout_.tv_nsec = 0;
+ }
+ else if (ptr == &ts)
+ {
+ --local_ops;
+ }
+ else
+ {
+ io_queue* io_q = static_cast<io_queue*>(ptr);
+ io_q->set_result(cqe->res);
+ ops.push(io_q);
+ }
+ }
+ ::io_uring_cqe_seen(&ring_, cqe);
+ ++count;
+ }
+ result = (count < complete_batch_size || local_ops > 0)
+ ? ::io_uring_peek_cqe(&ring_, &cqe) : -EAGAIN;
+ }
+
+ decrement(outstanding_work_, count);
+
+ if (check_timers)
+ {
+ mutex::scoped_lock lock(mutex_);
+ timer_queues_.get_ready_timers(ops);
+ if (timeout_.tv_sec == 0 && timeout_.tv_nsec == 0)
+ {
+ timeout_ = get_timeout();
+ if (::io_uring_sqe* sqe = get_sqe())
+ {
+ ::io_uring_prep_timeout(sqe, &timeout_, 0, 0);
+ ::io_uring_sqe_set_data(sqe, &timeout_);
+ push_submit_sqes_op(ops);
+ }
+ }
+ }
+}
+
+void io_uring_service::interrupt()
+{
+ mutex::scoped_lock lock(mutex_);
+ if (::io_uring_sqe* sqe = get_sqe())
+ {
+ ::io_uring_prep_nop(sqe);
+ ::io_uring_sqe_set_data(sqe, this);
+ }
+ submit_sqes();
+}
+
+void io_uring_service::init_ring()
+{
+ int result = ::io_uring_queue_init(ring_size, &ring_, 0);
+ if (result < 0)
+ {
+ ring_.ring_fd = -1;
+ asio::error_code ec(-result,
+ asio::error::get_system_category());
+ asio::detail::throw_error(ec, "io_uring_queue_init");
+ }
+
+#if !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ event_fd_ = ::eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK);
+ if (event_fd_ < 0)
+ {
+ asio::error_code ec(-result,
+ asio::error::get_system_category());
+ ::io_uring_queue_exit(&ring_);
+ asio::detail::throw_error(ec, "eventfd");
+ }
+
+ result = ::io_uring_register_eventfd(&ring_, event_fd_);
+ if (result < 0)
+ {
+ ::close(event_fd_);
+ ::io_uring_queue_exit(&ring_);
+ asio::error_code ec(-result,
+ asio::error::get_system_category());
+ asio::detail::throw_error(ec, "io_uring_queue_init");
+ }
+#endif // !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+}
+
+#if !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+class io_uring_service::event_fd_read_op :
+ public reactor_op
+{
+public:
+ event_fd_read_op(io_uring_service* s)
+ : reactor_op(asio::error_code(),
+ &event_fd_read_op::do_perform, event_fd_read_op::do_complete),
+ service_(s)
+ {
+ }
+
+ static status do_perform(reactor_op* base)
+ {
+ event_fd_read_op* o(static_cast<event_fd_read_op*>(base));
+
+ for (;;)
+ {
+ // Only perform one read. The kernel maintains an atomic counter.
+ uint64_t counter(0);
+ errno = 0;
+ int bytes_read = ::read(o->service_->event_fd_,
+ &counter, sizeof(uint64_t));
+ if (bytes_read < 0 && errno == EINTR)
+ continue;
+ break;
+ }
+
+ op_queue<operation> ops;
+ o->service_->run(0, ops);
+ o->service_->scheduler_.post_deferred_completions(ops);
+
+ return not_done;
+ }
+
+ static void do_complete(void* /*owner*/, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ event_fd_read_op* o(static_cast<event_fd_read_op*>(base));
+ delete o;
+ }
+
+private:
+ io_uring_service* service_;
+};
+#endif // !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+void io_uring_service::register_with_reactor()
+{
+#if !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ reactor_.register_internal_descriptor(reactor::read_op,
+ event_fd_, reactor_data_, new event_fd_read_op(this));
+#endif // !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+}
+
+io_uring_service::io_object* io_uring_service::allocate_io_object()
+{
+ mutex::scoped_lock registration_lock(registration_mutex_);
+ return registered_io_objects_.alloc(
+ ASIO_CONCURRENCY_HINT_IS_LOCKING(
+ REACTOR_IO, scheduler_.concurrency_hint()));
+}
+
+void io_uring_service::free_io_object(io_uring_service::io_object* io_obj)
+{
+ mutex::scoped_lock registration_lock(registration_mutex_);
+ registered_io_objects_.free(io_obj);
+}
+
+bool io_uring_service::do_cancel_ops(
+ per_io_object_data& io_obj, op_queue<operation>& ops)
+{
+ bool cancel_op = false;
+
+ for (int i = 0; i < max_ops; ++i)
+ {
+ if (io_uring_operation* first_op = io_obj->queues_[i].op_queue_.front())
+ {
+ cancel_op = true;
+ io_obj->queues_[i].op_queue_.pop();
+ while (io_uring_operation* op = io_obj->queues_[i].op_queue_.front())
+ {
+ op->ec_ = asio::error::operation_aborted;
+ io_obj->queues_[i].op_queue_.pop();
+ ops.push(op);
+ }
+ io_obj->queues_[i].op_queue_.push(first_op);
+ }
+ }
+
+ if (cancel_op)
+ {
+ mutex::scoped_lock lock(mutex_);
+ for (int i = 0; i < max_ops; ++i)
+ {
+ if (!io_obj->queues_[i].op_queue_.empty()
+ && !io_obj->queues_[i].cancel_requested_)
+ {
+ io_obj->queues_[i].cancel_requested_ = true;
+ if (::io_uring_sqe* sqe = get_sqe())
+ ::io_uring_prep_cancel(sqe, &io_obj->queues_[i], 0);
+ }
+ }
+ submit_sqes();
+ }
+
+ return cancel_op;
+}
+
+void io_uring_service::do_add_timer_queue(timer_queue_base& queue)
+{
+ mutex::scoped_lock lock(mutex_);
+ timer_queues_.insert(&queue);
+}
+
+void io_uring_service::do_remove_timer_queue(timer_queue_base& queue)
+{
+ mutex::scoped_lock lock(mutex_);
+ timer_queues_.erase(&queue);
+}
+
+void io_uring_service::update_timeout()
+{
+ if (::io_uring_sqe* sqe = get_sqe())
+ {
+ ::io_uring_prep_timeout_remove(sqe, reinterpret_cast<__u64>(&timeout_), 0);
+ ::io_uring_sqe_set_data(sqe, &timer_queues_);
+ }
+}
+
+__kernel_timespec io_uring_service::get_timeout() const
+{
+ __kernel_timespec ts;
+ long usec = timer_queues_.wait_duration_usec(5 * 60 * 1000 * 1000);
+ ts.tv_sec = usec / 1000000;
+ ts.tv_nsec = usec ? (usec % 1000000) * 1000 : 1;
+ return ts;
+}
+
+::io_uring_sqe* io_uring_service::get_sqe()
+{
+ ::io_uring_sqe* sqe = ::io_uring_get_sqe(&ring_);
+ if (!sqe)
+ {
+ submit_sqes();
+ sqe = ::io_uring_get_sqe(&ring_);
+ }
+ if (sqe)
+ {
+ ::io_uring_sqe_set_data(sqe, 0);
+ ++pending_sqes_;
+ }
+ return sqe;
+}
+
+void io_uring_service::submit_sqes()
+{
+ if (pending_sqes_ != 0)
+ {
+ int result = ::io_uring_submit(&ring_);
+ if (result > 0)
+ {
+ pending_sqes_ -= result;
+ increment(outstanding_work_, result);
+ }
+ }
+}
+
+void io_uring_service::post_submit_sqes_op(mutex::scoped_lock& lock)
+{
+ if (pending_sqes_ >= submit_batch_size)
+ {
+ submit_sqes();
+ }
+ else if (pending_sqes_ != 0 && !pending_submit_sqes_op_)
+ {
+ pending_submit_sqes_op_ = true;
+ lock.unlock();
+ scheduler_.post_immediate_completion(&submit_sqes_op_, false);
+ }
+}
+
+void io_uring_service::push_submit_sqes_op(op_queue<operation>& ops)
+{
+ if (pending_sqes_ != 0 && !pending_submit_sqes_op_)
+ {
+ pending_submit_sqes_op_ = true;
+ ops.push(&submit_sqes_op_);
+ scheduler_.compensating_work_started();
+ }
+}
+
+io_uring_service::submit_sqes_op::submit_sqes_op(io_uring_service* s)
+ : operation(&io_uring_service::submit_sqes_op::do_complete),
+ service_(s)
+{
+}
+
+void io_uring_service::submit_sqes_op::do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/)
+{
+ if (owner)
+ {
+ submit_sqes_op* o = static_cast<submit_sqes_op*>(base);
+ mutex::scoped_lock lock(o->service_->mutex_);
+ o->service_->submit_sqes();
+ if (o->service_->pending_sqes_ != 0)
+ o->service_->scheduler_.post_immediate_completion(o, true);
+ else
+ o->service_->pending_submit_sqes_op_ = false;
+ }
+}
+
+io_uring_service::io_queue::io_queue()
+ : operation(&io_uring_service::io_queue::do_complete)
+{
+}
+
+struct io_uring_service::perform_io_cleanup_on_block_exit
+{
+ explicit perform_io_cleanup_on_block_exit(io_uring_service* s)
+ : service_(s), io_object_to_free_(0), first_op_(0)
+ {
+ }
+
+ ~perform_io_cleanup_on_block_exit()
+ {
+ if (io_object_to_free_)
+ {
+ mutex::scoped_lock lock(service_->mutex_);
+ service_->free_io_object(io_object_to_free_);
+ }
+
+ if (first_op_)
+ {
+ // Post the remaining completed operations for invocation.
+ if (!ops_.empty())
+ service_->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.
+ service_->scheduler_.compensating_work_started();
+ }
+ }
+
+ io_uring_service* service_;
+ io_object* io_object_to_free_;
+ op_queue<operation> ops_;
+ operation* first_op_;
+};
+
+operation* io_uring_service::io_queue::perform_io(int result)
+{
+ perform_io_cleanup_on_block_exit io_cleanup(io_object_->service_);
+ mutex::scoped_lock io_object_lock(io_object_->mutex_);
+
+ if (result != -ECANCELED || cancel_requested_)
+ {
+ if (io_uring_operation* op = op_queue_.front())
+ {
+ if (result < 0)
+ {
+ op->ec_.assign(-result, asio::error::get_system_category());
+ op->bytes_transferred_ = 0;
+ }
+ else
+ {
+ op->ec_.assign(0, op->ec_.category());
+ op->bytes_transferred_ = static_cast<std::size_t>(result);
+ }
+ }
+
+ while (io_uring_operation* op = op_queue_.front())
+ {
+ if (op->perform(io_cleanup.ops_.empty()))
+ {
+ op_queue_.pop();
+ io_cleanup.ops_.push(op);
+ }
+ else
+ break;
+ }
+ }
+
+ cancel_requested_ = false;
+
+ if (!op_queue_.empty())
+ {
+ io_uring_service* service = io_object_->service_;
+ mutex::scoped_lock lock(service->mutex_);
+ if (::io_uring_sqe* sqe = service->get_sqe())
+ {
+ op_queue_.front()->prepare(sqe);
+ ::io_uring_sqe_set_data(sqe, this);
+ service->post_submit_sqes_op(lock);
+ }
+ else
+ {
+ lock.unlock();
+ while (io_uring_operation* op = op_queue_.front())
+ {
+ op->ec_ = asio::error::no_buffer_space;
+ op_queue_.pop();
+ io_cleanup.ops_.push(op);
+ }
+ }
+ }
+
+ // The last operation to complete on a shut down object must free it.
+ if (io_object_->shutdown_)
+ {
+ io_cleanup.io_object_to_free_ = io_object_;
+ for (int i = 0; i < max_ops; ++i)
+ if (!io_object_->queues_[i].op_queue_.empty())
+ io_cleanup.io_object_to_free_ = 0;
+ }
+
+ // 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 io_uring_service::io_queue::do_complete(void* owner, operation* base,
+ const asio::error_code& ec, std::size_t bytes_transferred)
+{
+ if (owner)
+ {
+ io_queue* io_q = static_cast<io_queue*>(base);
+ int result = static_cast<int>(bytes_transferred);
+ if (operation* op = io_q->perform_io(result))
+ {
+ op->complete(owner, ec, 0);
+ }
+ }
+}
+
+io_uring_service::io_object::io_object(bool locking)
+ : mutex_(locking)
+{
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IMPL_IO_URING_SERVICE_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/io_uring_socket_service_base.ipp b/3rdparty/asio/include/asio/detail/impl/io_uring_socket_service_base.ipp
new file mode 100644
index 00000000000..79302fdc6f6
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/io_uring_socket_service_base.ipp
@@ -0,0 +1,249 @@
+//
+// detail/io_uring_socket_service_base.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_IO_URING_SOCKET_SERVICE_BASE_IPP
+#define ASIO_DETAIL_IMPL_IO_URING_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_IO_URING)
+
+#include "asio/detail/io_uring_socket_service_base.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+io_uring_socket_service_base::io_uring_socket_service_base(
+ execution_context& context)
+ : io_uring_service_(asio::use_service<io_uring_service>(context))
+{
+ io_uring_service_.init_task();
+}
+
+void io_uring_socket_service_base::base_shutdown()
+{
+}
+
+void io_uring_socket_service_base::construct(
+ io_uring_socket_service_base::base_implementation_type& impl)
+{
+ impl.socket_ = invalid_socket;
+ impl.state_ = 0;
+ impl.io_object_data_ = 0;
+}
+
+void io_uring_socket_service_base::base_move_construct(
+ io_uring_socket_service_base::base_implementation_type& impl,
+ io_uring_socket_service_base::base_implementation_type& other_impl)
+ noexcept
+{
+ impl.socket_ = other_impl.socket_;
+ other_impl.socket_ = invalid_socket;
+
+ impl.state_ = other_impl.state_;
+ other_impl.state_ = 0;
+
+ impl.io_object_data_ = other_impl.io_object_data_;
+ other_impl.io_object_data_ = 0;
+}
+
+void io_uring_socket_service_base::base_move_assign(
+ io_uring_socket_service_base::base_implementation_type& impl,
+ io_uring_socket_service_base& /*other_service*/,
+ io_uring_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;
+
+ impl.io_object_data_ = other_impl.io_object_data_;
+ other_impl.io_object_data_ = 0;
+}
+
+void io_uring_socket_service_base::destroy(
+ io_uring_socket_service_base::base_implementation_type& impl)
+{
+ if (impl.socket_ != invalid_socket)
+ {
+ ASIO_HANDLER_OPERATION((io_uring_service_.context(),
+ "socket", &impl, impl.socket_, "close"));
+
+ io_uring_service_.deregister_io_object(impl.io_object_data_);
+ asio::error_code ignored_ec;
+ socket_ops::close(impl.socket_, impl.state_, true, ignored_ec);
+ io_uring_service_.cleanup_io_object(impl.io_object_data_);
+ }
+}
+
+asio::error_code io_uring_socket_service_base::close(
+ io_uring_socket_service_base::base_implementation_type& impl,
+ asio::error_code& ec)
+{
+ if (is_open(impl))
+ {
+ ASIO_HANDLER_OPERATION((io_uring_service_.context(),
+ "socket", &impl, impl.socket_, "close"));
+
+ io_uring_service_.deregister_io_object(impl.io_object_data_);
+ socket_ops::close(impl.socket_, impl.state_, false, ec);
+ io_uring_service_.cleanup_io_object(impl.io_object_data_);
+ }
+ else
+ {
+ ec = success_ec_;
+ }
+
+ // 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
+ construct(impl);
+
+ return ec;
+}
+
+socket_type io_uring_socket_service_base::release(
+ io_uring_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((io_uring_service_.context(),
+ "socket", &impl, impl.socket_, "release"));
+
+ io_uring_service_.deregister_io_object(impl.io_object_data_);
+ io_uring_service_.cleanup_io_object(impl.io_object_data_);
+ socket_type sock = impl.socket_;
+ construct(impl);
+ ec = success_ec_;
+ return sock;
+}
+
+asio::error_code io_uring_socket_service_base::cancel(
+ io_uring_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((io_uring_service_.context(),
+ "socket", &impl, impl.socket_, "cancel"));
+
+ io_uring_service_.cancel_ops(impl.io_object_data_);
+ ec = success_ec_;
+ return ec;
+}
+
+asio::error_code io_uring_socket_service_base::do_open(
+ io_uring_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;
+
+ io_uring_service_.register_io_object(impl.io_object_data_);
+
+ 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 = success_ec_;
+ return ec;
+}
+
+asio::error_code io_uring_socket_service_base::do_assign(
+ io_uring_socket_service_base::base_implementation_type& impl, int type,
+ const io_uring_socket_service_base::native_handle_type& native_socket,
+ asio::error_code& ec)
+{
+ if (is_open(impl))
+ {
+ ec = asio::error::already_open;
+ return ec;
+ }
+
+ io_uring_service_.register_io_object(impl.io_object_data_);
+
+ 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 = success_ec_;
+ return ec;
+}
+
+void io_uring_socket_service_base::start_op(
+ io_uring_socket_service_base::base_implementation_type& impl,
+ int op_type, io_uring_operation* op, bool is_continuation, bool noop)
+{
+ if (!noop)
+ {
+ io_uring_service_.start_op(op_type,
+ impl.io_object_data_, op, is_continuation);
+ }
+ else
+ {
+ io_uring_service_.post_immediate_completion(op, is_continuation);
+ }
+}
+
+void io_uring_socket_service_base::start_accept_op(
+ io_uring_socket_service_base::base_implementation_type& impl,
+ io_uring_operation* op, bool is_continuation, bool peer_is_open)
+{
+ if (!peer_is_open)
+ start_op(impl, io_uring_service::read_op, op, is_continuation, false);
+ else
+ {
+ op->ec_ = asio::error::already_open;
+ io_uring_service_.post_immediate_completion(op, is_continuation);
+ }
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IMPL_IO_URING_SOCKET_SERVICE_BASE_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/kqueue_reactor.hpp b/3rdparty/asio/include/asio/detail/impl/kqueue_reactor.hpp
new file mode 100644
index 00000000000..3f79e9f7217
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/kqueue_reactor.hpp
@@ -0,0 +1,113 @@
+//
+// detail/impl/kqueue_reactor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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/scheduler.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+inline void kqueue_reactor::post_immediate_completion(
+ operation* op, bool is_continuation) const
+{
+ scheduler_.post_immediate_completion(op, is_continuation);
+}
+
+template <typename Time_Traits>
+void kqueue_reactor::add_timer_queue(timer_queue<Time_Traits>& queue)
+{
+ do_add_timer_queue(queue);
+}
+
+// Remove a timer queue from the reactor.
+template <typename Time_Traits>
+void kqueue_reactor::remove_timer_queue(timer_queue<Time_Traits>& queue)
+{
+ do_remove_timer_queue(queue);
+}
+
+template <typename Time_Traits>
+void kqueue_reactor::schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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 <typename Time_Traits>
+std::size_t kqueue_reactor::cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled)
+{
+ mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ std::size_t n = queue.cancel_timer(timer, ops, max_cancelled);
+ lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+ return n;
+}
+
+template <typename Time_Traits>
+void kqueue_reactor::cancel_timer_by_key(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data* timer,
+ void* cancellation_key)
+{
+ mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ queue.cancel_timer_by_key(timer, ops, cancellation_key);
+ lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+}
+
+template <typename Time_Traits>
+void kqueue_reactor::move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& target,
+ typename timer_queue<Time_Traits>::per_timer_data& source)
+{
+ mutex::scoped_lock lock(mutex_);
+ op_queue<operation> 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/3rdparty/asio/include/asio/detail/impl/kqueue_reactor.ipp b/3rdparty/asio/include/asio/detail/impl/kqueue_reactor.ipp
new file mode 100644
index 00000000000..210a89dd49e
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/kqueue_reactor.ipp
@@ -0,0 +1,608 @@
+//
+// detail/impl/kqueue_reactor.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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"
+
+#if defined(__NetBSD__)
+# include <sys/param.h>
+#endif
+
+#include "asio/detail/push_options.hpp"
+
+#if defined(__NetBSD__) && __NetBSD_Version__ < 999001500
+# define ASIO_KQUEUE_EV_SET(ev, ident, filt, flags, fflags, data, udata) \
+ EV_SET(ev, ident, filt, flags, fflags, data, \
+ reinterpret_cast<intptr_t>(static_cast<void*>(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<kqueue_reactor>(ctx),
+ scheduler_(use_service<scheduler>(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<operation> 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<uintmax_t>(descriptor),
+ reinterpret_cast<uintmax_t>(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<uintmax_t>(descriptor),
+ reinterpret_cast<uintmax_t>(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::call_post_immediate_completion(
+ operation* op, bool is_continuation, const void* self)
+{
+ static_cast<const kqueue_reactor*>(self)->post_immediate_completion(
+ op, is_continuation);
+}
+
+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,
+ void (*on_immediate)(operation*, bool, const void*),
+ const void* immediate_arg)
+{
+ if (!descriptor_data)
+ {
+ op->ec_ = asio::error::bad_descriptor;
+ on_immediate(op, is_continuation, immediate_arg);
+ return;
+ }
+
+ mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
+
+ if (descriptor_data->shutdown_)
+ {
+ on_immediate(op, is_continuation, immediate_arg);
+ 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();
+ on_immediate(op, is_continuation, immediate_arg);
+ 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());
+ on_immediate(op, is_continuation, immediate_arg);
+ 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<operation> 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::cancel_ops_by_key(socket_type,
+ kqueue_reactor::per_descriptor_data& descriptor_data,
+ int op_type, void* cancellation_key)
+{
+ if (!descriptor_data)
+ return;
+
+ mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);
+
+ op_queue<operation> ops;
+ op_queue<reactor_op> other_ops;
+ while (reactor_op* op = descriptor_data->op_queue_[op_type].front())
+ {
+ descriptor_data->op_queue_[op_type].pop();
+ if (op->cancellation_key_ == cancellation_key)
+ {
+ op->ec_ = asio::error::operation_aborted;
+ ops.push(op);
+ }
+ else
+ other_ops.push(op);
+ }
+ descriptor_data->op_queue_[op_type].push(other_ops);
+
+ 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<operation> 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<uintmax_t>(descriptor),
+ reinterpret_cast<uintmax_t>(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<operation> 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<uintmax_t>(descriptor),
+ reinterpret_cast<uintmax_t>(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<operation>& 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<void*>(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<uintmax_t>(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<void*>(events[i].udata);
+ if (ptr == &interrupter_)
+ {
+ interrupter_.reset();
+ }
+ else
+ {
+ descriptor_state* descriptor_data = static_cast<descriptor_state*>(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<int>(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/3rdparty/asio/include/asio/detail/impl/null_event.ipp b/3rdparty/asio/include/asio/detail/impl/null_event.ipp
new file mode 100644
index 00000000000..1c9f5684298
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/null_event.ipp
@@ -0,0 +1,74 @@
+//
+// detail/impl/null_event.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <thread>
+#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+# include "asio/detail/socket_types.hpp"
+#else
+# include <unistd.h>
+# if defined(__hpux)
+# include <sys/time.h>
+# endif
+# if !defined(__hpux) || defined(__SELECT)
+# include <sys/select.h>
+# 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/3rdparty/asio/include/asio/detail/impl/pipe_select_interrupter.ipp b/3rdparty/asio/include/asio/detail/impl/pipe_select_interrupter.ipp
new file mode 100644
index 00000000000..75138312d9d
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/pipe_select_interrupter.ipp
@@ -0,0 +1,129 @@
+//
+// detail/impl/pipe_select_interrupter.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <fcntl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#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 == sizeof(data))
+ continue;
+ if (bytes_read > 0)
+ return true;
+ if (bytes_read == 0)
+ return false;
+ if (errno == EINTR)
+ continue;
+ if (errno == EWOULDBLOCK || errno == EAGAIN)
+ return true;
+ return false;
+ }
+}
+
+} // 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/3rdparty/asio/include/asio/detail/impl/posix_event.ipp b/3rdparty/asio/include/asio/detail/impl/posix_event.ipp
new file mode 100644
index 00000000000..76d5c468cbf
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/posix_event.ipp
@@ -0,0 +1,63 @@
+//
+// detail/impl/posix_event.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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;
+ int error = ::pthread_condattr_init(&attr);
+ if (error == 0)
+ {
+ error = ::pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
+ if (error == 0)
+ error = ::pthread_cond_init(&cond_, &attr);
+ ::pthread_condattr_destroy(&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/3rdparty/asio/include/asio/detail/impl/posix_mutex.ipp b/3rdparty/asio/include/asio/detail/impl/posix_mutex.ipp
new file mode 100644
index 00000000000..5fd832f9821
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/posix_mutex.ipp
@@ -0,0 +1,46 @@
+//
+// detail/impl/posix_mutex.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/impl/posix_serial_port_service.ipp b/3rdparty/asio/include/asio/detail/impl/posix_serial_port_service.ipp
new file mode 100644
index 00000000000..98ed5822877
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/posix_serial_port_service.ipp
@@ -0,0 +1,168 @@
+//
+// detail/impl/posix_serial_port_service.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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_POSIX_SERIAL_PORT_SERVICE_IPP
+#define ASIO_DETAIL_IMPL_POSIX_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 <cstring>
+#include "asio/detail/posix_serial_port_service.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+posix_serial_port_service::posix_serial_port_service(
+ execution_context& context)
+ : execution_context_service_base<posix_serial_port_service>(context),
+ descriptor_service_(context)
+{
+}
+
+void posix_serial_port_service::shutdown()
+{
+ descriptor_service_.shutdown();
+}
+
+asio::error_code posix_serial_port_service::open(
+ posix_serial_port_service::implementation_type& impl,
+ const std::string& device, asio::error_code& ec)
+{
+ if (is_open(impl))
+ {
+ ec = asio::error::already_open;
+ ASIO_ERROR_LOCATION(ec);
+ 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)
+ {
+ ASIO_ERROR_LOCATION(ec);
+ 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);
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Set up default serial port options.
+ termios ios;
+ s = ::tcgetattr(fd, &ios);
+ descriptor_ops::get_last_error(ec, s < 0);
+ 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;
+ s = ::tcsetattr(fd, TCSANOW, &ios);
+ descriptor_ops::get_last_error(ec, s < 0);
+ }
+ if (s < 0)
+ {
+ asio::error_code ignored_ec;
+ descriptor_ops::close(fd, state, ignored_ec);
+ ASIO_ERROR_LOCATION(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);
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+}
+
+asio::error_code posix_serial_port_service::do_set_option(
+ posix_serial_port_service::implementation_type& impl,
+ posix_serial_port_service::store_function_type store,
+ const void* option, asio::error_code& ec)
+{
+ termios ios;
+ int s = ::tcgetattr(descriptor_service_.native_handle(impl), &ios);
+ descriptor_ops::get_last_error(ec, s < 0);
+ if (s < 0)
+ {
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ if (store(option, ios, ec))
+ {
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ s = ::tcsetattr(descriptor_service_.native_handle(impl), TCSANOW, &ios);
+ descriptor_ops::get_last_error(ec, s < 0);
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+}
+
+asio::error_code posix_serial_port_service::do_get_option(
+ const posix_serial_port_service::implementation_type& impl,
+ posix_serial_port_service::load_function_type load,
+ void* option, asio::error_code& ec) const
+{
+ termios ios;
+ int s = ::tcgetattr(descriptor_service_.native_handle(impl), &ios);
+ descriptor_ops::get_last_error(ec, s < 0);
+ if (s < 0)
+ {
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ load(option, ios, ec);
+ ASIO_ERROR_LOCATION(ec);
+ return 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_POSIX_SERIAL_PORT_SERVICE_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/posix_thread.ipp b/3rdparty/asio/include/asio/detail/impl/posix_thread.ipp
new file mode 100644
index 00000000000..7602377336e
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/posix_thread.ipp
@@ -0,0 +1,84 @@
+//
+// detail/impl/posix_thread.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<posix_thread::func_base*>(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/3rdparty/asio/include/asio/detail/impl/posix_tss_ptr.ipp b/3rdparty/asio/include/asio/detail/impl/posix_tss_ptr.ipp
new file mode 100644
index 00000000000..099274b2779
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/posix_tss_ptr.ipp
@@ -0,0 +1,46 @@
+//
+// detail/impl/posix_tss_ptr.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/impl/reactive_descriptor_service.ipp b/3rdparty/asio/include/asio/detail/impl/reactive_descriptor_service.ipp
new file mode 100644
index 00000000000..829aefb01bf
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/reactive_descriptor_service.ipp
@@ -0,0 +1,230 @@
+//
+// detail/impl/reactive_descriptor_service.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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__) \
+ && !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#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(
+ execution_context& context)
+ : execution_context_service_base<reactive_descriptor_service>(context),
+ reactor_(asio::use_service<reactor>(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;
+ impl.reactor_data_ = reactor::per_descriptor_data();
+}
+
+void reactive_descriptor_service::move_construct(
+ reactive_descriptor_service::implementation_type& impl,
+ reactive_descriptor_service::implementation_type& other_impl)
+ noexcept
+{
+ 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;
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ if (int err = reactor_.register_descriptor(
+ native_descriptor, impl.reactor_data_))
+ {
+ ec = asio::error_code(err,
+ asio::error::get_system_category());
+ ASIO_ERROR_LOCATION(ec);
+ 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);
+
+ ASIO_ERROR_LOCATION(ec);
+ 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;
+ ASIO_ERROR_LOCATION(ec);
+ 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::do_start_op(implementation_type& impl,
+ int op_type, reactor_op* op, bool is_continuation, bool is_non_blocking,
+ bool noop, void (*on_immediate)(operation* op, bool, const void*),
+ const void* immediate_arg)
+{
+ 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, on_immediate, immediate_arg);
+ return;
+ }
+ }
+
+ on_immediate(op, is_continuation, immediate_arg);
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // !defined(ASIO_WINDOWS)
+ // && !defined(ASIO_WINDOWS_RUNTIME)
+ // && !defined(__CYGWIN__)
+ // && !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#endif // ASIO_DETAIL_IMPL_REACTIVE_DESCRIPTOR_SERVICE_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/reactive_socket_service_base.ipp b/3rdparty/asio/include/asio/detail/impl/reactive_socket_service_base.ipp
new file mode 100644
index 00000000000..a02001b421f
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/reactive_socket_service_base.ipp
@@ -0,0 +1,310 @@
+//
+// detail/reactive_socket_service_base.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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) \
+ && !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#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(
+ execution_context& context)
+ : reactor_(use_service<reactor>(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;
+ impl.reactor_data_ = reactor::per_descriptor_data();
+}
+
+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)
+ noexcept
+{
+ 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::do_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,
+ void (*on_immediate)(operation* op, bool, const void*),
+ const void* immediate_arg)
+{
+ 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, on_immediate, immediate_arg);
+ return;
+ }
+ }
+
+ on_immediate(op, is_continuation, immediate_arg);
+}
+
+void reactive_socket_service_base::do_start_accept_op(
+ reactive_socket_service_base::base_implementation_type& impl,
+ reactor_op* op, bool is_continuation, bool peer_is_open,
+ void (*on_immediate)(operation* op, bool, const void*),
+ const void* immediate_arg)
+{
+ if (!peer_is_open)
+ {
+ do_start_op(impl, reactor::read_op, op, is_continuation,
+ true, false, on_immediate, immediate_arg);
+ }
+ else
+ {
+ op->ec_ = asio::error::already_open;
+ on_immediate(op, is_continuation, immediate_arg);
+ }
+}
+
+void reactive_socket_service_base::do_start_connect_op(
+ reactive_socket_service_base::base_implementation_type& impl,
+ reactor_op* op, bool is_continuation, const void* addr, size_t addrlen,
+ void (*on_immediate)(operation* op, bool, const void*),
+ const void* immediate_arg)
+{
+ 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, on_immediate, immediate_arg);
+ return;
+ }
+ }
+ }
+
+ on_immediate(op, is_continuation, immediate_arg);
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // !defined(ASIO_HAS_IOCP)
+ // && !defined(ASIO_WINDOWS_RUNTIME)
+ // && !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#endif // ASIO_DETAIL_IMPL_REACTIVE_SOCKET_SERVICE_BASE_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/resolver_service_base.ipp b/3rdparty/asio/include/asio/detail/impl/resolver_service_base.ipp
new file mode 100644
index 00000000000..8d9e944ddde
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/resolver_service_base.ipp
@@ -0,0 +1,158 @@
+//
+// detail/impl/resolver_service_base.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_scheduler_runner
+{
+public:
+ work_scheduler_runner(scheduler_impl& work_scheduler)
+ : work_scheduler_(work_scheduler)
+ {
+ }
+
+ void operator()()
+ {
+ asio::error_code ec;
+ work_scheduler_.run(ec);
+ }
+
+private:
+ scheduler_impl& work_scheduler_;
+};
+
+resolver_service_base::resolver_service_base(execution_context& context)
+ : scheduler_(asio::use_service<scheduler_impl>(context)),
+ work_scheduler_(new scheduler_impl(context, -1, false)),
+ work_thread_(0)
+{
+ work_scheduler_->work_started();
+}
+
+resolver_service_base::~resolver_service_base()
+{
+ base_shutdown();
+}
+
+void resolver_service_base::base_shutdown()
+{
+ if (work_scheduler_.get())
+ {
+ work_scheduler_->work_finished();
+ work_scheduler_->stop();
+ if (work_thread_.get())
+ {
+ work_thread_->join();
+ work_thread_.reset();
+ }
+ work_scheduler_.reset();
+ }
+}
+
+void resolver_service_base::base_notify_fork(
+ execution_context::fork_event fork_ev)
+{
+ if (work_thread_.get())
+ {
+ if (fork_ev == execution_context::fork_prepare)
+ {
+ work_scheduler_->stop();
+ work_thread_->join();
+ work_thread_.reset();
+ }
+ }
+ else if (fork_ev != execution_context::fork_prepare)
+ {
+ work_scheduler_->restart();
+ }
+}
+
+void resolver_service_base::construct(
+ resolver_service_base::implementation_type& impl)
+{
+ impl.reset(static_cast<void*>(0), socket_ops::noop_deleter());
+}
+
+void resolver_service_base::destroy(
+ resolver_service_base::implementation_type& impl)
+{
+ ASIO_HANDLER_OPERATION((scheduler_.context(),
+ "resolver", &impl, 0, "cancel"));
+
+ impl.reset();
+}
+
+void resolver_service_base::move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+{
+ impl = static_cast<implementation_type&&>(other_impl);
+}
+
+void resolver_service_base::move_assign(implementation_type& impl,
+ resolver_service_base&, implementation_type& other_impl)
+{
+ destroy(impl);
+ impl = static_cast<implementation_type&&>(other_impl);
+}
+
+void resolver_service_base::cancel(
+ resolver_service_base::implementation_type& impl)
+{
+ ASIO_HANDLER_OPERATION((scheduler_.context(),
+ "resolver", &impl, 0, "cancel"));
+
+ impl.reset(static_cast<void*>(0), socket_ops::noop_deleter());
+}
+
+void resolver_service_base::start_resolve_op(resolve_op* op)
+{
+ if (ASIO_CONCURRENCY_HINT_IS_LOCKING(SCHEDULER,
+ scheduler_.concurrency_hint()))
+ {
+ start_work_thread();
+ scheduler_.work_started();
+ work_scheduler_->post_immediate_completion(op, false);
+ }
+ else
+ {
+ op->ec_ = asio::error::operation_not_supported;
+ scheduler_.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_scheduler_runner(*work_scheduler_)));
+ }
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/scheduler.ipp b/3rdparty/asio/include/asio/detail/impl/scheduler.ipp
new file mode 100644
index 00000000000..eccc80322d1
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/scheduler.ipp
@@ -0,0 +1,675 @@
+//
+// detail/impl/scheduler.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/scheduler.hpp"
+#include "asio/detail/scheduler_thread_info.hpp"
+#include "asio/detail/signal_blocker.hpp"
+
+#if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/io_uring_service.hpp"
+#else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/reactor.hpp"
+#endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class scheduler::thread_function
+{
+public:
+ explicit thread_function(scheduler* s)
+ : this_(s)
+ {
+ }
+
+ void operator()()
+ {
+ asio::error_code ec;
+ this_->run(ec);
+ }
+
+private:
+ scheduler* this_;
+};
+
+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, bool own_thread, get_task_func_type get_task)
+ : asio::detail::execution_context_service_base<scheduler>(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),
+ get_task_(get_task),
+ task_interrupted_(true),
+ outstanding_work_(0),
+ stopped_(false),
+ shutdown_(false),
+ concurrency_hint_(concurrency_hint),
+ thread_(0)
+{
+ ASIO_HANDLER_TRACKING_INIT;
+
+ if (own_thread)
+ {
+ ++outstanding_work_;
+ asio::detail::signal_blocker sb;
+ thread_ = new asio::detail::thread(thread_function(this));
+ }
+}
+
+scheduler::~scheduler()
+{
+ if (thread_)
+ {
+ mutex::scoped_lock lock(mutex_);
+ shutdown_ = true;
+ stop_all_threads(lock);
+ lock.unlock();
+ thread_->join();
+ delete thread_;
+ }
+}
+
+void scheduler::shutdown()
+{
+ mutex::scoped_lock lock(mutex_);
+ shutdown_ = true;
+ if (thread_)
+ stop_all_threads(lock);
+ lock.unlock();
+
+ // Join thread to ensure task operation is returned to queue.
+ if (thread_)
+ {
+ thread_->join();
+ delete thread_;
+ thread_ = 0;
+ }
+
+ // 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_ = get_task_(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<std::size_t>::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<thread_info*>(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<std::size_t>::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<thread_info*>(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);
+ ASIO_ASSUME(this_thread != 0); // Only called from inside scheduler.
+ ++static_cast<thread_info*>(this_thread)->private_outstanding_work;
+}
+
+bool scheduler::can_dispatch()
+{
+ return thread_call_stack::contains(this) != 0;
+}
+
+void scheduler::capture_current_exception()
+{
+ if (thread_info_base* this_thread = thread_call_stack::contains(this))
+ this_thread->capture_current_exception();
+}
+
+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<thread_info*>(this_thread)->private_outstanding_work;
+ static_cast<thread_info*>(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_immediate_completions(std::size_t n,
+ op_queue<scheduler::operation>& ops, 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<thread_info*>(this_thread)->private_outstanding_work
+ += static_cast<long>(n);
+ static_cast<thread_info*>(this_thread)->private_op_queue.push(ops);
+ return;
+ }
+ }
+#else // defined(ASIO_HAS_THREADS)
+ (void)is_continuation;
+#endif // defined(ASIO_HAS_THREADS)
+
+ increment(outstanding_work_, static_cast<long>(n));
+ mutex::scoped_lock lock(mutex_);
+ op_queue_.push(ops);
+ 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<thread_info*>(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<scheduler::operation>& 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<thread_info*>(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<scheduler::operation>& ops)
+{
+ op_queue<scheduler::operation> 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);
+ this_thread.rethrow_pending_exception();
+
+ 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);
+ this_thread.rethrow_pending_exception();
+
+ 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);
+ this_thread.rethrow_pending_exception();
+
+ 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();
+ }
+}
+
+scheduler_task* scheduler::get_default_task(asio::execution_context& ctx)
+{
+#if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ return &use_service<io_uring_service>(ctx);
+#else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ return &use_service<reactor>(ctx);
+#endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_IMPL_SCHEDULER_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/select_reactor.hpp b/3rdparty/asio/include/asio/detail/impl/select_reactor.hpp
new file mode 100644
index 00000000000..933b02cddc5
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/select_reactor.hpp
@@ -0,0 +1,124 @@
+//
+// detail/impl/select_reactor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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))
+
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_io_context.hpp"
+#else // defined(ASIO_HAS_IOCP)
+# include "asio/detail/scheduler.hpp"
+#endif // defined(ASIO_HAS_IOCP)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+inline void select_reactor::post_immediate_completion(
+ operation* op, bool is_continuation) const
+{
+ scheduler_.post_immediate_completion(op, is_continuation);
+}
+
+template <typename Time_Traits>
+void select_reactor::add_timer_queue(timer_queue<Time_Traits>& queue)
+{
+ do_add_timer_queue(queue);
+}
+
+// Remove a timer queue from the reactor.
+template <typename Time_Traits>
+void select_reactor::remove_timer_queue(timer_queue<Time_Traits>& queue)
+{
+ do_remove_timer_queue(queue);
+}
+
+template <typename Time_Traits>
+void select_reactor::schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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 <typename Time_Traits>
+std::size_t select_reactor::cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled)
+{
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ std::size_t n = queue.cancel_timer(timer, ops, max_cancelled);
+ lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+ return n;
+}
+
+template <typename Time_Traits>
+void select_reactor::cancel_timer_by_key(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data* timer,
+ void* cancellation_key)
+{
+ mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ queue.cancel_timer_by_key(timer, ops, cancellation_key);
+ lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+}
+
+template <typename Time_Traits>
+void select_reactor::move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& target,
+ typename timer_queue<Time_Traits>::per_timer_data& source)
+{
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ op_queue<operation> 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/3rdparty/asio/include/asio/detail/impl/select_reactor.ipp b/3rdparty/asio/include/asio/detail/impl/select_reactor.ipp
new file mode 100644
index 00000000000..5e5946bb84b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/select_reactor.ipp
@@ -0,0 +1,400 @@
+//
+// detail/impl/select_reactor.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_io_context.hpp"
+#else // defined(ASIO_HAS_IOCP)
+# include "asio/detail/scheduler.hpp"
+#endif // defined(ASIO_HAS_IOCP)
+
+#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<select_reactor>(ctx),
+ scheduler_(use_service<scheduler_type>(ctx)),
+ mutex_(),
+ interrupter_(),
+#if defined(ASIO_HAS_IOCP)
+ stop_thread_(false),
+ thread_(0),
+ restart_reactor_(this),
+#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;
+ if (thread_)
+ interrupter_.interrupt();
+#endif // defined(ASIO_HAS_IOCP)
+ lock.unlock();
+
+#if defined(ASIO_HAS_IOCP)
+ if (thread_)
+ {
+ thread_->join();
+ delete thread_;
+ thread_ = 0;
+ }
+#endif // defined(ASIO_HAS_IOCP)
+
+ op_queue<operation> 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 defined(ASIO_HAS_IOCP)
+ (void)fork_ev;
+#else // defined(ASIO_HAS_IOCP)
+ if (fork_ev == asio::execution_context::fork_child)
+ interrupter_.recreate();
+#endif // defined(ASIO_HAS_IOCP)
+}
+
+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::call_post_immediate_completion(
+ operation* op, bool is_continuation, const void* self)
+{
+ static_cast<const select_reactor*>(self)->post_immediate_completion(
+ op, is_continuation);
+}
+
+void select_reactor::start_op(int op_type, socket_type descriptor,
+ select_reactor::per_descriptor_data&, reactor_op* op, bool is_continuation,
+ bool, void (*on_immediate)(operation*, bool, const void*),
+ const void* immediate_arg)
+{
+ asio::detail::mutex::scoped_lock lock(mutex_);
+
+ if (shutdown_)
+ {
+ on_immediate(op, is_continuation, immediate_arg);
+ 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::cancel_ops_by_key(socket_type descriptor,
+ select_reactor::per_descriptor_data&,
+ int op_type, void* cancellation_key)
+{
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ bool need_interrupt = op_queue_[op_type].cancel_operations_by_key(
+ descriptor, ops, cancellation_key, asio::error::operation_aborted);
+ scheduler_.post_deferred_completions(ops);
+ if (need_interrupt)
+ interrupter_.interrupt();
+}
+
+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<operation> 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<operation>& 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<int>(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()))
+ {
+ if (!interrupter_.reset())
+ {
+ lock.lock();
+#if defined(ASIO_HAS_IOCP)
+ stop_thread_ = true;
+ scheduler_.post_immediate_completion(&restart_reactor_, false);
+#else // defined(ASIO_HAS_IOCP)
+ interrupter_.recreate();
+#endif // defined(ASIO_HAS_IOCP)
+ }
+ --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<operation> ops;
+ run(-1, ops);
+ scheduler_.post_deferred_completions(ops);
+ lock.lock();
+ }
+}
+
+void select_reactor::restart_reactor::do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/, std::size_t /*bytes_transferred*/)
+{
+ if (owner)
+ {
+ select_reactor* reactor = static_cast<restart_reactor*>(base)->reactor_;
+
+ if (reactor->thread_)
+ {
+ reactor->thread_->join();
+ delete reactor->thread_;
+ reactor->thread_ = 0;
+ }
+
+ asio::detail::mutex::scoped_lock lock(reactor->mutex_);
+ reactor->interrupter_.recreate();
+ reactor->stop_thread_ = false;
+ lock.unlock();
+
+ asio::detail::signal_blocker sb;
+ reactor->thread_ =
+ new asio::detail::thread(thread_function(reactor));
+ }
+}
+#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<operation> 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/3rdparty/asio/include/asio/detail/impl/service_registry.hpp b/3rdparty/asio/include/asio/detail/impl/service_registry.hpp
new file mode 100644
index 00000000000..2490636c0ad
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/service_registry.hpp
@@ -0,0 +1,93 @@
+//
+// detail/impl/service_registry.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Service>
+Service& service_registry::use_service()
+{
+ execution_context::service::key key;
+ init_key<Service>(key, 0);
+ factory_type factory = &service_registry::create<Service, execution_context>;
+ return *static_cast<Service*>(do_use_service(key, factory, &owner_));
+}
+
+template <typename Service>
+Service& service_registry::use_service(io_context& owner)
+{
+ execution_context::service::key key;
+ init_key<Service>(key, 0);
+ factory_type factory = &service_registry::create<Service, io_context>;
+ return *static_cast<Service*>(do_use_service(key, factory, &owner));
+}
+
+template <typename Service>
+void service_registry::add_service(Service* new_service)
+{
+ execution_context::service::key key;
+ init_key<Service>(key, 0);
+ return do_add_service(key, new_service);
+}
+
+template <typename Service>
+bool service_registry::has_service() const
+{
+ execution_context::service::key key;
+ init_key<Service>(key, 0);
+ return do_has_service(key);
+}
+
+template <typename Service>
+inline void service_registry::init_key(
+ execution_context::service::key& key, ...)
+{
+ init_key_from_id(key, Service::id);
+}
+
+#if !defined(ASIO_NO_TYPEID)
+template <typename Service>
+void service_registry::init_key(execution_context::service::key& key,
+ enable_if_t<is_base_of<typename Service::key_type, Service>::value>*)
+{
+ key.type_info_ = &typeid(typeid_wrapper<Service>);
+ key.id_ = 0;
+}
+
+template <typename Service>
+void service_registry::init_key_from_id(execution_context::service::key& key,
+ const service_id<Service>& /*id*/)
+{
+ key.type_info_ = &typeid(typeid_wrapper<Service>);
+ key.id_ = 0;
+}
+#endif // !defined(ASIO_NO_TYPEID)
+
+template <typename Service, typename Owner>
+execution_context::service* service_registry::create(void* owner)
+{
+ return new Service(*static_cast<Owner*>(owner));
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP
diff --git a/3rdparty/asio/include/asio/detail/impl/service_registry.ipp b/3rdparty/asio/include/asio/detail/impl/service_registry.ipp
new file mode 100644
index 00000000000..b0133421d25
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/service_registry.ipp
@@ -0,0 +1,197 @@
+//
+// detail/impl/service_registry.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <vector>
+#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<execution_context::service*> 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/3rdparty/asio/include/asio/detail/impl/signal_set_service.ipp b/3rdparty/asio/include/asio/detail/impl/signal_set_service.ipp
new file mode 100644
index 00000000000..7f6be8b71a9
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/signal_set_service.ipp
@@ -0,0 +1,826 @@
+//
+// detail/impl/signal_set_service.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstring>
+#include <stdexcept>
+#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"
+
+#if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/io_uring_service.hpp"
+#else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/reactor.hpp"
+#endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#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];
+
+ // The flags used for each registered signal.
+ signal_set_base::flags_t flags_[max_signal_number];
+};
+
+signal_state* get_signal_state()
+{
+ static signal_state state = {
+ ASIO_STATIC_MUTEX_INIT, -1, -1, false, 0,
+ { 0 }, { signal_set_base::flags_t() } };
+ 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 :
+# if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ public io_uring_operation
+# else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ public reactor_op
+# endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+{
+public:
+# if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ pipe_read_op()
+ : io_uring_operation(asio::error_code(), &pipe_read_op::do_prepare,
+ &pipe_read_op::do_perform, pipe_read_op::do_complete)
+ {
+ }
+
+ static void do_prepare(io_uring_operation*, ::io_uring_sqe* sqe)
+ {
+ signal_state* state = get_signal_state();
+
+ int fd = state->read_descriptor_;
+ ::io_uring_prep_poll_add(sqe, fd, POLLIN);
+ }
+
+ static bool do_perform(io_uring_operation*, bool)
+ {
+ 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 false;
+ }
+# else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ pipe_read_op()
+ : reactor_op(asio::error_code(),
+ &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;
+ }
+# endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+ static void do_complete(void* /*owner*/, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ pipe_read_op* o(static_cast<pipe_read_op*>(base));
+ delete o;
+ }
+};
+#endif // !defined(ASIO_WINDOWS)
+ // && !defined(ASIO_WINDOWS_RUNTIME)
+ // && !defined(__CYGWIN__)
+
+signal_set_service::signal_set_service(execution_context& context)
+ : execution_context_service_base<signal_set_service>(context),
+ scheduler_(asio::use_service<scheduler_impl>(context)),
+#if !defined(ASIO_WINDOWS) \
+ && !defined(ASIO_WINDOWS_RUNTIME) \
+ && !defined(__CYGWIN__)
+# if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ io_uring_service_(asio::use_service<io_uring_service>(context)),
+# else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ reactor_(asio::use_service<reactor>(context)),
+# endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+#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__)
+# if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ io_uring_service_.init_task();
+# else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ reactor_.init_task();
+# endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+#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<operation> 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_;
+ }
+ }
+
+ scheduler_.abandon_operations(ops);
+}
+
+void signal_set_service::notify_fork(execution_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 execution_context::fork_prepare:
+ {
+ int read_descriptor = state->read_descriptor_;
+ state->fork_prepared_ = true;
+ lock.unlock();
+# if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ (void)read_descriptor;
+ io_uring_service_.deregister_io_object(io_object_data_);
+ io_uring_service_.cleanup_io_object(io_object_data_);
+# else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ reactor_.deregister_internal_descriptor(read_descriptor, reactor_data_);
+ reactor_.cleanup_descriptor_data(reactor_data_);
+# endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ }
+ break;
+ case execution_context::fork_parent:
+ if (state->fork_prepared_)
+ {
+ int read_descriptor = state->read_descriptor_;
+ state->fork_prepared_ = false;
+ lock.unlock();
+# if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ (void)read_descriptor;
+ io_uring_service_.register_internal_io_object(io_object_data_,
+ io_uring_service::read_op, new pipe_read_op);
+# else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ reactor_.register_internal_descriptor(reactor::read_op,
+ read_descriptor, reactor_data_, new pipe_read_op);
+# endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ }
+ break;
+ case execution_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();
+# if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ (void)read_descriptor;
+ io_uring_service_.register_internal_io_object(io_object_data_,
+ io_uring_service::read_op, new pipe_read_op);
+# else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ reactor_.register_internal_descriptor(reactor::read_op,
+ read_descriptor, reactor_data_, new pipe_read_op);
+# endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ }
+ 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,
+ signal_set_base::flags_t f, 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;
+ }
+
+ // Check that the specified flags are supported.
+#if !defined(ASIO_HAS_SIGACTION)
+ if (f != signal_set_base::flags::dont_care)
+ {
+ ec = asio::error::operation_not_supported;
+ return ec;
+ }
+#endif // !defined(ASIO_HAS_SIGACTION)
+
+ 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 (f != signal_set_base::flags::dont_care)
+ sa.sa_flags = static_cast<int>(f);
+ 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;
+ }
+# if defined(ASIO_HAS_SIGACTION)
+ state->flags_[signal_number] = f;
+# endif // defined(ASIO_HAS_SIGACTION)
+ }
+# if defined(ASIO_HAS_SIGACTION)
+ // Otherwise check to see if the flags have changed.
+ else if (f != signal_set_base::flags::dont_care)
+ {
+ if (f != state->flags_[signal_number])
+ {
+ using namespace std; // For memset.
+ if (state->flags_[signal_number] != signal_set_base::flags::dont_care)
+ {
+ ec = asio::error::invalid_argument;
+ delete new_registration;
+ return ec;
+ }
+ struct sigaction sa;
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_handler = asio_signal_handler;
+ sigfillset(&sa.sa_mask);
+ sa.sa_flags = static_cast<int>(f);
+ if (::sigaction(signal_number, &sa, 0) == -1)
+ {
+ ec = asio::error_code(errno,
+ asio::error::get_system_category());
+ delete new_registration;
+ return ec;
+ }
+ state->flags_[signal_number] = f;
+ }
+ }
+# endif // defined(ASIO_HAS_SIGACTION)
+#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 = &reg->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;
+ }
+# if defined(ASIO_HAS_SIGACTION)
+ state->flags_[signal_number] = signal_set_base::flags_t();
+# endif // defined(ASIO_HAS_SIGACTION)
+ }
+#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;
+ }
+# if defined(ASIO_HAS_SIGACTION)
+ state->flags_[reg->signal_number_] = signal_set_base::flags_t();
+# endif // defined(ASIO_HAS_SIGACTION)
+ }
+#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((scheduler_.context(),
+ "signal_set", &impl, 0, "cancel"));
+
+ op_queue<operation> 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);
+ }
+ }
+
+ scheduler_.post_deferred_completions(ops);
+
+ ec = asio::error_code();
+ return ec;
+}
+
+void signal_set_service::cancel_ops_by_key(
+ signal_set_service::implementation_type& impl, void* cancellation_key)
+{
+ op_queue<operation> ops;
+ {
+ op_queue<signal_op> other_ops;
+ signal_state* state = get_signal_state();
+ static_mutex::scoped_lock lock(state->mutex_);
+
+ while (signal_op* op = impl.queue_.front())
+ {
+ impl.queue_.pop();
+ if (op->cancellation_key_ == cancellation_key)
+ {
+ op->ec_ = asio::error::operation_aborted;
+ ops.push(op);
+ }
+ else
+ other_ops.push(op);
+ }
+
+ impl.queue_.push(other_ops);
+ }
+
+ scheduler_.post_deferred_completions(ops);
+}
+
+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<operation> 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->scheduler_.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 a scheduler_ object is thread-unsafe then it must be the only
+ // scheduler used to create signal_set objects.
+ if (state->service_list_ != 0)
+ {
+ if (!ASIO_CONCURRENCY_HINT_IS_LOCKING(SCHEDULER,
+ service->scheduler_.concurrency_hint())
+ || !ASIO_CONCURRENCY_HINT_IS_LOCKING(SCHEDULER,
+ state->service_list_->scheduler_.concurrency_hint()))
+ {
+ std::logic_error ex(
+ "Thread-unsafe execution 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();
+# if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ (void)read_descriptor;
+ service->io_uring_service_.register_internal_io_object(
+ service->io_object_data_, io_uring_service::read_op, new pipe_read_op);
+# else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ service->reactor_.register_internal_descriptor(reactor::read_op,
+ read_descriptor, service->reactor_data_, new pipe_read_op);
+# endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+#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();
+# if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ (void)read_descriptor;
+ service->io_uring_service_.deregister_io_object(service->io_object_data_);
+ service->io_uring_service_.cleanup_io_object(service->io_object_data_);
+ lock.lock();
+# else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ service->reactor_.deregister_internal_descriptor(
+ read_descriptor, service->reactor_data_);
+ service->reactor_.cleanup_descriptor_data(service->reactor_data_);
+ lock.lock();
+# endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+#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)
+{
+ scheduler_.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_;
+ scheduler_.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/3rdparty/asio/include/asio/detail/impl/socket_ops.ipp b/3rdparty/asio/include/asio/detail/impl/socket_ops.ipp
new file mode 100644
index 00000000000..7feb7ca02df
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/socket_ops.ipp
@@ -0,0 +1,4035 @@
+//
+// detail/impl/socket_ops.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cctype>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <cerrno>
+#include <new>
+#include "asio/detail/assert.hpp"
+#include "asio/detail/socket_ops.hpp"
+#include "asio/error.hpp"
+
+#if defined(ASIO_WINDOWS_RUNTIME)
+# include <codecvt>
+# include <locale>
+# include <string>
+#endif // defined(ASIO_WINDOWS_RUNTIME)
+
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) \
+ || defined(__MACH__) && defined(__APPLE__)
+# if defined(ASIO_HAS_PTHREADS)
+# include <pthread.h>
+# 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)
+
+inline void get_last_error(
+ asio::error_code& ec, bool is_error_condition)
+{
+ if (!is_error_condition)
+ {
+ asio::error::clear(ec);
+ }
+ else
+ {
+#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
+ }
+}
+
+template <typename SockLenType>
+inline socket_type call_accept(SockLenType msghdr::*,
+ socket_type s, void* addr, std::size_t* addrlen)
+{
+ SockLenType tmp_addrlen = addrlen ? (SockLenType)*addrlen : 0;
+ socket_type result = ::accept(s,
+ static_cast<socket_addr_type*>(addr),
+ addrlen ? &tmp_addrlen : 0);
+ if (addrlen)
+ *addrlen = (std::size_t)tmp_addrlen;
+ return result;
+}
+
+socket_type accept(socket_type s, void* addr,
+ std::size_t* addrlen, asio::error_code& ec)
+{
+ if (s == invalid_socket)
+ {
+ ec = asio::error::bad_descriptor;
+ return invalid_socket;
+ }
+
+ socket_type new_s = call_accept(&msghdr::msg_namelen, s, addr, addrlen);
+ get_last_error(ec, new_s == invalid_socket);
+ if (new_s == invalid_socket)
+ return new_s;
+
+#if defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__)
+ int optval = 1;
+ int result = ::setsockopt(new_s, SOL_SOCKET,
+ SO_NOSIGPIPE, &optval, sizeof(optval));
+ get_last_error(ec, result != 0);
+ if (result != 0)
+ {
+ ::close(new_s);
+ return invalid_socket;
+ }
+#endif
+
+ asio::error::clear(ec);
+ return new_s;
+}
+
+socket_type sync_accept(socket_type s, state_type state,
+ void* 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, void* 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<std::size_t>(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<std::size_t>(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, void* 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 <typename SockLenType>
+inline int call_bind(SockLenType msghdr::*,
+ socket_type s, const void* addr, std::size_t addrlen)
+{
+ return ::bind(s, static_cast<const socket_addr_type*>(addr),
+ (SockLenType)addrlen);
+}
+
+int bind(socket_type s, const void* addr,
+ std::size_t addrlen, asio::error_code& ec)
+{
+ if (s == invalid_socket)
+ {
+ ec = asio::error::bad_descriptor;
+ return socket_error_retval;
+ }
+
+ int result = call_bind(&msghdr::msg_namelen, s, addr, addrlen);
+ get_last_error(ec, result != 0);
+ 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);
+ }
+
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ result = ::closesocket(s);
+#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ result = ::close(s);
+#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ get_last_error(ec, result != 0);
+
+ 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__) || defined(__EMSCRIPTEN__)
+ int flags = ::fcntl(s, F_GETFL, 0);
+ if (flags >= 0)
+ ::fcntl(s, F_SETFL, flags & ~O_NONBLOCK);
+# else // defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+ ioctl_arg_type arg = 0;
+# if defined(ENOTTY) || defined(ENOTCAPABLE)
+ result = ::ioctl(s, FIONBIO, &arg);
+ get_last_error(ec, result < 0);
+ if (false
+# if defined(ENOTTY)
+ || ec.value() == ENOTTY
+# endif // defined(ENOTTY)
+# if defined(ENOTCAPABLE)
+ || ec.value() == ENOTCAPABLE
+# endif // defined(ENOTCAPABLE)
+ )
+ {
+ int flags = ::fcntl(s, F_GETFL, 0);
+ if (flags >= 0)
+ ::fcntl(s, F_SETFL, flags & ~O_NONBLOCK);
+ }
+# else // defined(ENOTTY) || defined(ENOTCAPABLE)
+ ::ioctl(s, FIONBIO, &arg);
+# endif // defined(ENOTTY) || defined(ENOTCAPABLE)
+# endif // defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ state &= ~non_blocking;
+
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ result = ::closesocket(s);
+#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ result = ::close(s);
+#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ get_last_error(ec, result != 0);
+ }
+ }
+
+ 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;
+ }
+
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ ioctl_arg_type arg = (value ? 1 : 0);
+ int result = ::ioctlsocket(s, FIONBIO, &arg);
+ get_last_error(ec, result < 0);
+#elif defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+ int result = ::fcntl(s, F_GETFL, 0);
+ get_last_error(ec, result < 0);
+ if (result >= 0)
+ {
+ int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK));
+ result = ::fcntl(s, F_SETFL, flag);
+ get_last_error(ec, result < 0);
+ }
+#else // defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+ ioctl_arg_type arg = (value ? 1 : 0);
+ int result = ::ioctl(s, FIONBIO, &arg);
+ get_last_error(ec, result < 0);
+# if defined(ENOTTY) || defined(ENOTCAPABLE)
+ if (false
+# if defined(ENOTTY)
+ || ec.value() == ENOTTY
+# endif // defined(ENOTTY)
+# if defined(ENOTCAPABLE)
+ || ec.value() == ENOTCAPABLE
+# endif // defined(ENOTCAPABLE)
+ )
+ {
+ result = ::fcntl(s, F_GETFL, 0);
+ get_last_error(ec, result < 0);
+ if (result >= 0)
+ {
+ int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK));
+ result = ::fcntl(s, F_SETFL, flag);
+ get_last_error(ec, result < 0);
+ }
+ }
+# endif // defined(ENOTTY) || defined(ENOTCAPABLE)
+#endif // defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+
+ if (result >= 0)
+ {
+ 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;
+ }
+
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ ioctl_arg_type arg = (value ? 1 : 0);
+ int result = ::ioctlsocket(s, FIONBIO, &arg);
+ get_last_error(ec, result < 0);
+#elif defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+ int result = ::fcntl(s, F_GETFL, 0);
+ get_last_error(ec, result < 0);
+ if (result >= 0)
+ {
+ int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK));
+ result = ::fcntl(s, F_SETFL, flag);
+ get_last_error(ec, result < 0);
+ }
+#else // defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+ ioctl_arg_type arg = (value ? 1 : 0);
+ int result = ::ioctl(s, FIONBIO, &arg);
+ get_last_error(ec, result < 0);
+# if defined(ENOTTY) || defined(ENOTCAPABLE)
+ if (false
+# if defined(ENOTTY)
+ || ec.value() == ENOTTY
+# endif // defined(ENOTTY)
+# if defined(ENOTCAPABLE)
+ || ec.value() == ENOTCAPABLE
+# endif // defined(ENOTCAPABLE)
+ )
+ {
+ result = ::fcntl(s, F_GETFL, 0);
+ get_last_error(ec, result < 0);
+ if (result >= 0)
+ {
+ int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK));
+ result = ::fcntl(s, F_SETFL, flag);
+ get_last_error(ec, result < 0);
+ }
+ }
+# endif // defined(ENOTTY) || defined(ENOTCAPABLE)
+#endif // defined(__SYMBIAN32__) || defined(__EMSCRIPTEN__)
+
+ if (result >= 0)
+ {
+ 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;
+ }
+
+ int result = ::shutdown(s, what);
+ get_last_error(ec, result != 0);
+ return result;
+}
+
+template <typename SockLenType>
+inline int call_connect(SockLenType msghdr::*,
+ socket_type s, const void* addr, std::size_t addrlen)
+{
+ return ::connect(s, static_cast<const socket_addr_type*>(addr),
+ (SockLenType)addrlen);
+}
+
+int connect(socket_type s, const void* addr,
+ std::size_t addrlen, asio::error_code& ec)
+{
+ if (s == invalid_socket)
+ {
+ ec = asio::error::bad_descriptor;
+ return socket_error_retval;
+ }
+
+ int result = call_connect(&msghdr::msg_namelen, s, addr, addrlen);
+ get_last_error(ec, result != 0);
+#if defined(__linux__)
+ if (result != 0 && ec == asio::error::try_again)
+ {
+ if (static_cast<const socket_addr_type*>(addr)->sa_family == AF_UNIX)
+ ec = asio::error::in_progress;
+ else
+ ec = asio::error::no_buffer_space;
+ }
+#endif // defined(__linux__)
+ return result;
+}
+
+void sync_connect(socket_type s, const void* 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
+ asio::error::clear(ec);
+ }
+
+ 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
+ int result = ::socketpair(af, type, protocol, sv);
+ get_last_error(ec, result != 0);
+ 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 = ::ioctlsocket(s, SIOCATMARK, &value);
+# else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ int result = ::ioctl(s, SIOCATMARK, &value);
+# endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ get_last_error(ec, result < 0);
+# if defined(ENOTTY)
+ if (ec.value() == ENOTTY)
+ ec = asio::error::not_socket;
+# endif // defined(ENOTTY)
+#else // defined(SIOCATMARK)
+ int value = ::sockatmark(s);
+ get_last_error(ec, value < 0);
+#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 = ::ioctlsocket(s, FIONREAD, &value);
+#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ int result = ::ioctl(s, FIONREAD, &value);
+#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ get_last_error(ec, result < 0);
+#if defined(ENOTTY)
+ if (ec.value() == ENOTTY)
+ ec = asio::error::not_socket;
+#endif // defined(ENOTTY)
+
+ return ec ? static_cast<size_t>(0) : static_cast<size_t>(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;
+ }
+
+ int result = ::listen(s, backlog);
+ get_last_error(ec, result != 0);
+ return result;
+}
+
+inline void init_buf_iov_base(void*& base, void* addr)
+{
+ base = addr;
+}
+
+template <typename T>
+inline void init_buf_iov_base(T& base, void* addr)
+{
+ base = static_cast<T>(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<char*>(data);
+ b.len = static_cast<u_long>(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<char*>(const_cast<void*>(data));
+ b.len = static_cast<u_long>(size);
+#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ init_buf_iov_base(b.iov_base, const_cast<void*>(data));
+ b.iov_len = size;
+#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+}
+
+inline void init_msghdr_msg_name(void*& name, void* addr)
+{
+ name = static_cast<socket_addr_type*>(addr);
+}
+
+inline void init_msghdr_msg_name(void*& name, const socket_addr_type* addr)
+{
+ name = const_cast<socket_addr_type*>(addr);
+}
+
+template <typename T>
+inline void init_msghdr_msg_name(T& name, void* addr)
+{
+ name = static_cast<T>(addr);
+}
+
+template <typename T>
+inline void init_msghdr_msg_name(T& name, const void* addr)
+{
+ name = static_cast<T>(const_cast<void*>(addr));
+}
+
+signed_size_type recv(socket_type s, buf* bufs, size_t count,
+ int flags, asio::error_code& ec)
+{
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ // Receive some data.
+ DWORD recv_buf_count = static_cast<DWORD>(count);
+ DWORD bytes_transferred = 0;
+ DWORD recv_flags = flags;
+ int result = ::WSARecv(s, bufs, recv_buf_count,
+ &bytes_transferred, &recv_flags, 0, 0);
+ get_last_error(ec, true);
+ 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)
+ result = 0;
+ if (result != 0)
+ return socket_error_retval;
+ asio::error::clear(ec);
+ return bytes_transferred;
+#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ msghdr msg = msghdr();
+ msg.msg_iov = bufs;
+ msg.msg_iovlen = static_cast<int>(count);
+ signed_size_type result = ::recvmsg(s, &msg, flags);
+ get_last_error(ec, result < 0);
+ return result;
+#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+}
+
+signed_size_type recv1(socket_type s, void* data, size_t size,
+ int flags, asio::error_code& ec)
+{
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ // Receive some data.
+ WSABUF buf;
+ buf.buf = const_cast<char*>(static_cast<const char*>(data));
+ buf.len = static_cast<ULONG>(size);
+ DWORD bytes_transferred = 0;
+ DWORD recv_flags = flags;
+ int result = ::WSARecv(s, &buf, 1,
+ &bytes_transferred, &recv_flags, 0, 0);
+ get_last_error(ec, true);
+ 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)
+ result = 0;
+ if (result != 0)
+ return socket_error_retval;
+ asio::error::clear(ec);
+ return bytes_transferred;
+#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ signed_size_type result = ::recv(s, static_cast<char*>(data), size, flags);
+ get_last_error(ec, result < 0);
+ 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))
+ {
+ asio::error::clear(ec);
+ 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 for EOF.
+ if ((state & stream_oriented) && bytes == 0)
+ {
+ ec = asio::error::eof;
+ return 0;
+ }
+
+ // 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;
+ }
+}
+
+size_t sync_recv1(socket_type s, state_type state, void* data,
+ size_t size, int flags, 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 (size == 0 && (state & stream_oriented))
+ {
+ asio::error::clear(ec);
+ return 0;
+ }
+
+ // Read some data.
+ for (;;)
+ {
+ // Try to complete the operation without blocking.
+ signed_size_type bytes = socket_ops::recv1(s, data, size, flags, ec);
+
+ // Check for EOF.
+ if ((state & stream_oriented) && bytes == 0)
+ {
+ ec = asio::error::eof;
+ return 0;
+ }
+
+ // 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_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)
+ {
+ asio::error::clear(ec);
+ }
+
+ // 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;
+ }
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+bool non_blocking_recv1(socket_type s,
+ void* data, size_t size, int flags, bool is_stream,
+ asio::error_code& ec, size_t& bytes_transferred)
+{
+ for (;;)
+ {
+ // Read some data.
+ signed_size_type bytes = socket_ops::recv1(s, data, size, flags, ec);
+
+ // Check for end of stream.
+ if (is_stream && bytes == 0)
+ {
+ ec = asio::error::eof;
+ return true;
+ }
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+#endif // defined(ASIO_HAS_IOCP)
+
+signed_size_type recvfrom(socket_type s, buf* bufs, size_t count,
+ int flags, void* addr, std::size_t* addrlen, asio::error_code& ec)
+{
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ // Receive some data.
+ DWORD recv_buf_count = static_cast<DWORD>(count);
+ DWORD bytes_transferred = 0;
+ DWORD recv_flags = flags;
+ int tmp_addrlen = (int)*addrlen;
+ int result = ::WSARecvFrom(s, bufs, recv_buf_count, &bytes_transferred,
+ &recv_flags, static_cast<socket_addr_type*>(addr), &tmp_addrlen, 0, 0);
+ get_last_error(ec, true);
+ *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)
+ result = 0;
+ if (result != 0)
+ return socket_error_retval;
+ asio::error::clear(ec);
+ 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<int>(*addrlen);
+ msg.msg_iov = bufs;
+ msg.msg_iovlen = static_cast<int>(count);
+ signed_size_type result = ::recvmsg(s, &msg, flags);
+ get_last_error(ec, result < 0);
+ *addrlen = msg.msg_namelen;
+ return result;
+#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+}
+
+template <typename SockLenType>
+inline signed_size_type call_recvfrom(SockLenType msghdr::*, socket_type s,
+ void* data, size_t size, int flags, void* addr, std::size_t* addrlen)
+{
+ SockLenType tmp_addrlen = addrlen ? (SockLenType)*addrlen : 0;
+ signed_size_type result = ::recvfrom(s, static_cast<char*>(data), size,
+ flags, static_cast<socket_addr_type*>(addr), addrlen ? &tmp_addrlen : 0);
+ if (addrlen)
+ *addrlen = (std::size_t)tmp_addrlen;
+ return result;
+}
+
+signed_size_type recvfrom1(socket_type s, void* data, size_t size,
+ int flags, void* addr, std::size_t* addrlen, asio::error_code& ec)
+{
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ // Receive some data.
+ WSABUF buf;
+ buf.buf = static_cast<char*>(data);
+ buf.len = static_cast<ULONG>(size);
+ DWORD bytes_transferred = 0;
+ DWORD recv_flags = flags;
+ int tmp_addrlen = (int)*addrlen;
+ int result = ::WSARecvFrom(s, &buf, 1, &bytes_transferred, &recv_flags,
+ static_cast<socket_addr_type*>(addr), &tmp_addrlen, 0, 0);
+ get_last_error(ec, true);
+ *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)
+ result = 0;
+ if (result != 0)
+ return socket_error_retval;
+ asio::error::clear(ec);
+ return bytes_transferred;
+#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ signed_size_type result = call_recvfrom(&msghdr::msg_namelen,
+ s, data, size, flags, addr, addrlen);
+ get_last_error(ec, result < 0);
+ 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, void* 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;
+ }
+}
+
+size_t sync_recvfrom1(socket_type s, state_type state, void* data, size_t size,
+ int flags, void* 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::recvfrom1(
+ s, data, size, 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)
+ {
+ asio::error::clear(ec);
+ }
+}
+
+#else // defined(ASIO_HAS_IOCP)
+
+bool non_blocking_recvfrom(socket_type s, buf* bufs,
+ size_t count, int flags, void* 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);
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+bool non_blocking_recvfrom1(socket_type s, void* data,
+ size_t size, int flags, void* addr, std::size_t* addrlen,
+ asio::error_code& ec, size_t& bytes_transferred)
+{
+ for (;;)
+ {
+ // Read some data.
+ signed_size_type bytes = socket_ops::recvfrom1(
+ s, data, size, flags, addr, addrlen, ec);
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ 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)
+{
+#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<int>(count);
+ signed_size_type result = ::recvmsg(s, &msg, in_flags);
+ get_last_error(ec, result < 0);
+ if (result >= 0)
+ 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)
+ {
+ asio::error::clear(ec);
+ }
+}
+
+#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);
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ 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)
+{
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ // Send the data.
+ DWORD send_buf_count = static_cast<DWORD>(count);
+ DWORD bytes_transferred = 0;
+ DWORD send_flags = flags;
+ int result = ::WSASend(s, const_cast<buf*>(bufs),
+ send_buf_count, &bytes_transferred, send_flags, 0, 0);
+ get_last_error(ec, true);
+ 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;
+ asio::error::clear(ec);
+ return bytes_transferred;
+#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ msghdr msg = msghdr();
+ msg.msg_iov = const_cast<buf*>(bufs);
+ msg.msg_iovlen = static_cast<int>(count);
+#if defined(ASIO_HAS_MSG_NOSIGNAL)
+ flags |= MSG_NOSIGNAL;
+#endif // defined(ASIO_HAS_MSG_NOSIGNAL)
+ signed_size_type result = ::sendmsg(s, &msg, flags);
+ get_last_error(ec, result < 0);
+ return result;
+#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+}
+
+signed_size_type send1(socket_type s, const void* data, size_t size,
+ int flags, asio::error_code& ec)
+{
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ // Send the data.
+ WSABUF buf;
+ buf.buf = const_cast<char*>(static_cast<const char*>(data));
+ buf.len = static_cast<ULONG>(size);
+ DWORD bytes_transferred = 0;
+ DWORD send_flags = flags;
+ int result = ::WSASend(s, &buf, 1,
+ &bytes_transferred, send_flags, 0, 0);
+ get_last_error(ec, true);
+ 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;
+ asio::error::clear(ec);
+ return bytes_transferred;
+#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+#if defined(ASIO_HAS_MSG_NOSIGNAL)
+ flags |= MSG_NOSIGNAL;
+#endif // defined(ASIO_HAS_MSG_NOSIGNAL)
+ signed_size_type result = ::send(s,
+ static_cast<const char*>(data), size, flags);
+ get_last_error(ec, result < 0);
+ 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))
+ {
+ asio::error::clear(ec);
+ 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;
+ }
+}
+
+size_t sync_send1(socket_type s, state_type state, const void* data,
+ size_t size, int flags, 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 (size == 0 && (state & stream_oriented))
+ {
+ asio::error::clear(ec);
+ return 0;
+ }
+
+ // Read some data.
+ for (;;)
+ {
+ // Try to complete the operation without blocking.
+ signed_size_type bytes = socket_ops::send1(s, data, size, 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);
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+bool non_blocking_send1(socket_type s,
+ const void* data, size_t size, int flags,
+ asio::error_code& ec, size_t& bytes_transferred)
+{
+ for (;;)
+ {
+ // Write some data.
+ signed_size_type bytes = socket_ops::send1(s, data, size, flags, ec);
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ 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 void* addr,
+ std::size_t addrlen, asio::error_code& ec)
+{
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ // Send the data.
+ DWORD send_buf_count = static_cast<DWORD>(count);
+ DWORD bytes_transferred = 0;
+ int result = ::WSASendTo(s, const_cast<buf*>(bufs),
+ send_buf_count, &bytes_transferred, flags,
+ static_cast<const socket_addr_type*>(addr),
+ static_cast<int>(addrlen), 0, 0);
+ get_last_error(ec, true);
+ 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;
+ asio::error::clear(ec);
+ 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<int>(addrlen);
+ msg.msg_iov = const_cast<buf*>(bufs);
+ msg.msg_iovlen = static_cast<int>(count);
+#if defined(ASIO_HAS_MSG_NOSIGNAL)
+ flags |= MSG_NOSIGNAL;
+#endif // defined(ASIO_HAS_MSG_NOSIGNAL)
+ signed_size_type result = ::sendmsg(s, &msg, flags);
+ get_last_error(ec, result < 0);
+ return result;
+#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+}
+
+template <typename SockLenType>
+inline signed_size_type call_sendto(SockLenType msghdr::*,
+ socket_type s, const void* data, size_t size, int flags,
+ const void* addr, std::size_t addrlen)
+{
+ return ::sendto(s, static_cast<char*>(const_cast<void*>(data)), size, flags,
+ static_cast<const socket_addr_type*>(addr), (SockLenType)addrlen);
+}
+
+signed_size_type sendto1(socket_type s, const void* data,
+ size_t size, int flags, const void* addr,
+ std::size_t addrlen, asio::error_code& ec)
+{
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ // Send the data.
+ WSABUF buf;
+ buf.buf = const_cast<char*>(static_cast<const char*>(data));
+ buf.len = static_cast<ULONG>(size);
+ DWORD bytes_transferred = 0;
+ int result = ::WSASendTo(s, &buf, 1, &bytes_transferred, flags,
+ static_cast<const socket_addr_type*>(addr),
+ static_cast<int>(addrlen), 0, 0);
+ get_last_error(ec, true);
+ 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;
+ asio::error::clear(ec);
+ return bytes_transferred;
+#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+#if defined(ASIO_HAS_MSG_NOSIGNAL)
+ flags |= MSG_NOSIGNAL;
+#endif // defined(ASIO_HAS_MSG_NOSIGNAL)
+ signed_size_type result = call_sendto(&msghdr::msg_namelen,
+ s, data, size, flags, addr, addrlen);
+ get_last_error(ec, result < 0);
+ 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 void* 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;
+ }
+}
+
+size_t sync_sendto1(socket_type s, state_type state,
+ const void* data, size_t size, int flags, const void* 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::sendto1(
+ s, data, size, 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 void* 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);
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+bool non_blocking_sendto1(socket_type s,
+ const void* data, size_t size, int flags,
+ const void* addr, std::size_t addrlen,
+ asio::error_code& ec, size_t& bytes_transferred)
+{
+ for (;;)
+ {
+ // Write some data.
+ signed_size_type bytes = socket_ops::sendto1(
+ s, data, size, flags, addr, addrlen, ec);
+
+ // Check if operation succeeded.
+ if (bytes >= 0)
+ {
+ bytes_transferred = bytes;
+ 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 failed.
+ bytes_transferred = 0;
+ return true;
+ }
+}
+
+#endif // !defined(ASIO_HAS_IOCP)
+
+socket_type socket(int af, int type, int protocol,
+ asio::error_code& ec)
+{
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ socket_type s = ::WSASocketW(af, type, protocol, 0, 0, WSA_FLAG_OVERLAPPED);
+ get_last_error(ec, s == invalid_socket);
+ 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<const char*>(&optval), sizeof(optval));
+ }
+
+ return s;
+#elif defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__)
+ socket_type s = ::socket(af, type, protocol);
+ get_last_error(ec, s == invalid_socket);
+ if (s == invalid_socket)
+ return s;
+
+ int optval = 1;
+ int result = ::setsockopt(s, SOL_SOCKET,
+ SO_NOSIGPIPE, &optval, sizeof(optval));
+ get_last_error(ec, result != 0);
+ if (result != 0)
+ {
+ ::close(s);
+ return invalid_socket;
+ }
+
+ return s;
+#else
+ int s = ::socket(af, type, protocol);
+ get_last_error(ec, s < 0);
+ return s;
+#endif
+}
+
+template <typename SockLenType>
+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<const int*>(optval))
+ state |= enable_connection_aborted;
+ else
+ state &= ~enable_connection_aborted;
+ asio::error::clear(ec);
+ 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"))
+ {
+ int result = sso(s, level, optname,
+ reinterpret_cast<const char*>(optval),
+ static_cast<int>(optlen));
+ get_last_error(ec, result != 0);
+ return result;
+ }
+ }
+ ec = asio::error::fault;
+ return socket_error_retval;
+#else // defined(__BORLANDC__)
+ int result = call_setsockopt(&msghdr::msg_namelen,
+ s, level, optname, optval, optlen);
+ get_last_error(ec, result != 0);
+ if (result == 0)
+ {
+#if defined(__MACH__) && defined(__APPLE__) \
+ || defined(__NetBSD__) || defined(__FreeBSD__) \
+ || defined(__OpenBSD__) || defined(__QNX__)
+ // 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 <typename SockLenType>
+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<int*>(optval) = (state & enable_connection_aborted) ? 1 : 0;
+ asio::error::clear(ec);
+ 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"))
+ {
+ int tmp_optlen = static_cast<int>(*optlen);
+ int result = gso(s, level, optname,
+ reinterpret_cast<char*>(optval), &tmp_optlen);
+ get_last_error(ec, result != 0);
+ *optlen = static_cast<size_t>(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<DWORD*>(optval) = 1;
+ asio::error::clear(ec);
+ }
+ return result;
+ }
+ }
+ ec = asio::error::fault;
+ return socket_error_retval;
+#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ int result = call_getsockopt(&msghdr::msg_namelen,
+ s, level, optname, optval, optlen);
+ get_last_error(ec, result != 0);
+ 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<DWORD*>(optval) = 1;
+ asio::error::clear(ec);
+ }
+ return result;
+#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ int result = call_getsockopt(&msghdr::msg_namelen,
+ s, level, optname, optval, optlen);
+ get_last_error(ec, result != 0);
+#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<int*>(optval) /= 2;
+ }
+#endif // defined(__linux__)
+ return result;
+#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+}
+
+template <typename SockLenType>
+inline int call_getpeername(SockLenType msghdr::*,
+ socket_type s, void* addr, std::size_t* addrlen)
+{
+ SockLenType tmp_addrlen = (SockLenType)*addrlen;
+ int result = ::getpeername(s,
+ static_cast<socket_addr_type*>(addr), &tmp_addrlen);
+ *addrlen = (std::size_t)tmp_addrlen;
+ return result;
+}
+
+int getpeername(socket_type s, void* 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.
+ asio::error::clear(ec);
+ return 0;
+ }
+#else // defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP)
+ // || defined(__CYGWIN__)
+ (void)cached;
+#endif // defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP)
+ // || defined(__CYGWIN__)
+
+ int result = call_getpeername(&msghdr::msg_namelen, s, addr, addrlen);
+ get_last_error(ec, result != 0);
+ return result;
+}
+
+template <typename SockLenType>
+inline int call_getsockname(SockLenType msghdr::*,
+ socket_type s, void* addr, std::size_t* addrlen)
+{
+ SockLenType tmp_addrlen = (SockLenType)*addrlen;
+ int result = ::getsockname(s,
+ static_cast<socket_addr_type*>(addr), &tmp_addrlen);
+ *addrlen = (std::size_t)tmp_addrlen;
+ return result;
+}
+
+int getsockname(socket_type s, void* addr,
+ std::size_t* addrlen, asio::error_code& ec)
+{
+ if (s == invalid_socket)
+ {
+ ec = asio::error::bad_descriptor;
+ return socket_error_retval;
+ }
+
+ int result = call_getsockname(&msghdr::msg_namelen, s, addr, addrlen);
+ get_last_error(ec, result != 0);
+ 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;
+ }
+
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ int result = ::ioctlsocket(s, cmd, arg);
+#elif defined(__MACH__) && defined(__APPLE__) \
+ || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
+ int result = ::ioctl(s, static_cast<unsigned int>(cmd), arg);
+#else
+ int result = ::ioctl(s, cmd, arg);
+#endif
+ get_last_error(ec, result < 0);
+ if (result >= 0)
+ {
+ // 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<int>(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)
+{
+#if defined(__EMSCRIPTEN__)
+ exceptfds = 0;
+#endif // defined(__EMSCRIPTEN__)
+#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);
+ asio::error::clear(ec);
+ 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;
+ int result = ::pselect(nfds, readfds,
+ writefds, exceptfds, timeout ? &ts : 0, 0);
+#else
+ int result = ::select(nfds, readfds, writefds, exceptfds, timeout);
+#endif
+ get_last_error(ec, result < 0);
+ return result;
+}
+
+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;
+ int result = ::select(s + 1, &fds, 0, 0, timeout);
+ get_last_error(ec, result < 0);
+#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;
+ int result = ::poll(&fds, 1, timeout);
+ get_last_error(ec, result < 0);
+#endif // defined(ASIO_WINDOWS)
+ // || defined(__CYGWIN__)
+ // || defined(__SYMBIAN32__)
+ if (result == 0)
+ if (state & user_set_non_blocking)
+ ec = asio::error::would_block;
+ 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;
+ int result = ::select(s + 1, 0, &fds, 0, timeout);
+ get_last_error(ec, result < 0);
+#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;
+ int result = ::poll(&fds, 1, timeout);
+ get_last_error(ec, result < 0);
+#endif // defined(ASIO_WINDOWS)
+ // || defined(__CYGWIN__)
+ // || defined(__SYMBIAN32__)
+ if (result == 0)
+ if (state & user_set_non_blocking)
+ ec = asio::error::would_block;
+ 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;
+ int result = ::select(s + 1, 0, 0, &fds, timeout);
+ get_last_error(ec, result < 0);
+#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;
+ int result = ::poll(&fds, 1, timeout);
+ get_last_error(ec, result < 0);
+#endif // defined(ASIO_WINDOWS)
+ // || defined(__CYGWIN__)
+ // || defined(__SYMBIAN32__)
+ if (result == 0)
+ if (state & user_set_non_blocking)
+ ec = asio::error::would_block;
+ 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;
+ int result = ::select(s + 1, 0, &write_fds, &except_fds, timeout);
+ get_last_error(ec, result < 0);
+ return result;
+#else // defined(ASIO_WINDOWS)
+ // || defined(__CYGWIN__)
+ // || defined(__SYMBIAN32__)
+ pollfd fds;
+ fds.fd = s;
+ fds.events = POLLOUT;
+ fds.revents = 0;
+ int result = ::poll(&fds, 1, msec);
+ get_last_error(ec, result < 0);
+ 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<const unsigned char*>(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<u_long_type>(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<DWORD>(length);
+#if defined(BOOST_NO_ANSI_APIS) || (defined(_MSC_VER) && (_MSC_VER >= 1800))
+ LPWSTR string_buffer = (LPWSTR)_alloca(length * sizeof(WCHAR));
+ int result = ::WSAAddressToStringW(&address.base,
+ address_length, 0, string_buffer, &string_length);
+ get_last_error(ec, true);
+ ::WideCharToMultiByte(CP_ACP, 0, string_buffer, -1,
+ dest, static_cast<int>(length), 0, 0);
+#else
+ int result = ::WSAAddressToStringA(&address.base,
+ address_length, 0, dest, &string_length);
+ get_last_error(ec, true);
+#endif
+
+ // Windows may set error code on success.
+ if (result != socket_error_retval)
+ asio::error::clear(ec);
+
+ // 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 = ::inet_ntop(af, src, dest, static_cast<int>(length));
+ get_last_error(ec, true);
+ 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 > 21 ? IF_NAMESIZE : 21) + 1] = "%";
+ const in6_addr_type* ipv6_address = static_cast<const in6_addr_type*>(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<unsigned>(scope_id), if_name + 1) == 0)
+#if defined(ASIO_HAS_SNPRINTF)
+ snprintf(if_name + 1, sizeof(if_name) - 1, "%lu", scope_id);
+#else // defined(ASIO_HAS_SNPRINTF)
+ sprintf(if_name + 1, "%lu", scope_id);
+#endif // defined(ASIO_HAS_SNPRINTF)
+ 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<unsigned char*>(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<unsigned char>(b0);
+ bytes[1] = static_cast<unsigned char>(b1);
+ bytes[2] = static_cast<unsigned char>(b2);
+ bytes[3] = static_cast<unsigned char>(b3);
+ asio::error::clear(ec);
+ return 1;
+ }
+ else if (af == ASIO_OS_DEF(AF_INET6))
+ {
+ unsigned char* bytes = static_cast<unsigned char*>(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];
+
+ asio::error::clear(ec);
+ 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<int>(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 = ::WSAStringToAddressW(wide_buffer,
+ af, 0, &address.base, &address_length);
+ get_last_error(ec, true);
+#else
+ int result = ::WSAStringToAddressA(const_cast<char*>(src),
+ af, 0, &address.base, &address_length);
+ get_last_error(ec, true);
+#endif
+
+ if (af == ASIO_OS_DEF(AF_INET))
+ {
+ if (result != socket_error_retval)
+ {
+ memcpy(dest, &address.v4.sin_addr, sizeof(in4_addr_type));
+ asio::error::clear(ec);
+ }
+ else if (strcmp(src, "255.255.255.255") == 0)
+ {
+ static_cast<in4_addr_type*>(dest)->s_addr = INADDR_NONE;
+ asio::error::clear(ec);
+ }
+ }
+ 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;
+ asio::error::clear(ec);
+ }
+ }
+
+ // 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)
+ asio::error::clear(ec);
+
+ 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 = ::inet_pton(af, src_ptr, dest);
+ get_last_error(ec, true);
+ 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<in6_addr_type*>(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)
+{
+#if defined(ASIO_WINDOWS_RUNTIME)
+ try
+ {
+ using namespace Windows::Foundation::Collections;
+ using namespace Windows::Networking;
+ using namespace Windows::Networking::Connectivity;
+ IVectorView<HostName^>^ hostnames = NetworkInformation::GetHostNames();
+ for (unsigned i = 0; i < hostnames->Size; ++i)
+ {
+ HostName^ hostname = hostnames->GetAt(i);
+ if (hostname->Type == HostNameType::DomainName)
+ {
+ std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
+ std::string raw_name = converter.to_bytes(hostname->RawName->Data());
+ if (namelen > 0 && raw_name.size() < static_cast<std::size_t>(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 = ::gethostname(name, namelen);
+ get_last_error(ec, result != 0);
+ 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)
+{
+#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ (void)(buffer);
+ (void)(buflength);
+ hostent* retval = ::gethostbyaddr(addr, length, af);
+ get_last_error(ec, !retval);
+ if (!retval)
+ return 0;
+ *result = *retval;
+ return retval;
+#elif defined(__sun) || defined(__QNX__)
+ int error = 0;
+ hostent* retval = ::gethostbyaddr_r(addr, length,
+ af, result, buffer, buflength, &error);
+ get_last_error(ec, !retval);
+ if (error)
+ ec = translate_netdb_error(error);
+ return retval;
+#elif defined(__MACH__) && defined(__APPLE__)
+ (void)(buffer);
+ (void)(buflength);
+ int error = 0;
+ hostent* retval = ::getipnodebyaddr(addr, length, af, &error);
+ get_last_error(ec, !retval);
+ if (error)
+ ec = translate_netdb_error(error);
+ if (!retval)
+ return 0;
+ *result = *retval;
+ return retval;
+#else
+ hostent* retval = 0;
+ int error = 0;
+ clear_last_error();
+ ::gethostbyaddr_r(addr, length, af, result,
+ buffer, buflength, &retval, &error);
+ get_last_error(ec, true);
+ 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)
+{
+#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 = ::gethostbyname(name);
+ get_last_error(ec, !retval);
+ if (!retval)
+ return 0;
+ *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 = ::gethostbyname_r(name, result, buffer, buflength, &error);
+ get_last_error(ec, !retval);
+ if (error)
+ ec = translate_netdb_error(error);
+ return retval;
+#elif defined(__MACH__) && defined(__APPLE__)
+ (void)(buffer);
+ (void)(buflength);
+ int error = 0;
+ hostent* retval = ::getipnodebyname(name, af, ai_flags, &error);
+ get_last_error(ec, !retval);
+ 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;
+ clear_last_error();
+ ::gethostbyname_r(name, result, buffer, buflength, &retval, &error);
+ get_last_error(ec, true);
+ 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 <typename T>
+inline T* gai_alloc(std::size_t size = sizeof(T))
+{
+ using namespace std;
+ T* p = static_cast<T*>(::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<addrinfo_type>();
+ 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<sockaddr_in4_type>();
+ 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<sockaddr*>(sinptr);
+ ai->ai_addrlen = sizeof(sockaddr_in4_type);
+ break;
+ }
+ case ASIO_OS_DEF(AF_INET6):
+ {
+ sockaddr_in6_type* sin6ptr = gai_alloc<sockaddr_in6_type>();
+ 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<sockaddr*>(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<addrinfo_type>();
+ 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<sockaddr>(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<sockaddr_in4_type*>(ai->ai_addr);
+ sinptr->sin_port = port;
+ ++num_found;
+ break;
+ }
+ case ASIO_OS_DEF(AF_INET6):
+ {
+ sockaddr_in6_type* sin6ptr =
+ reinterpret_cast<sockaddr_in6_type*>(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<unsigned char>(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<char>(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<char>(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<const char*>(
+ &reinterpret_cast<const sockaddr_in4_type*>(sa)->sin_addr);
+ addr_len = sizeof(in4_addr_type);
+ port = reinterpret_cast<const sockaddr_in4_type*>(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<const char*>(
+ &reinterpret_cast<const sockaddr_in6_type*>(sa)->sin6_addr);
+ addr_len = sizeof(in6_addr_type);
+ port = reinterpret_cast<const sockaddr_in6_type*>(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<int>(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_SNPRINTF)
+ snprintf(serv, servlen, "%u", ntohs(port));
+#elif 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_SNPRINTF)
+ snprintf(serv, servlen, "%u", ntohs(port));
+#elif 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)
+ }
+ }
+
+ asio::error::clear(ec);
+ 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<unsigned char>(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<sockaddr_in4_type*>(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<sockaddr_in6_type*>(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 void* 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(static_cast<const socket_addr_type*>(addr),
+ static_cast<socklen_t>(addrlen), host, static_cast<DWORD>(hostlen),
+ serv, static_cast<DWORD>(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(static_cast<const socket_addr_type*>(addr),
+ static_cast<int>(addrlen), host, static_cast<DWORD>(hostlen),
+ serv, static_cast<DWORD>(servlen), flags);
+ return ec = translate_addrinfo_error(error);
+ }
+ }
+ clear_last_error();
+ return getnameinfo_emulation(static_cast<const socket_addr_type*>(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 = &tmp_addr;
+ clear_last_error();
+ return getnameinfo_emulation(static_cast<const socket_addr_type*>(addr),
+ addrlen, host, hostlen, serv, servlen, flags, ec);
+#else
+ clear_last_error();
+ int error = ::getnameinfo(static_cast<const socket_addr_type*>(addr),
+ addrlen, host, hostlen, serv, servlen, flags);
+ return ec = translate_addrinfo_error(error);
+#endif
+}
+
+asio::error_code sync_getnameinfo(const void* 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 void* 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<unsigned char*>(&value);
+ u_long_type result = (static_cast<u_long_type>(value_p[0]) << 24)
+ | (static_cast<u_long_type>(value_p[1]) << 16)
+ | (static_cast<u_long_type>(value_p[2]) << 8)
+ | static_cast<u_long_type>(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<unsigned char*>(&result);
+ result_p[0] = static_cast<unsigned char>((value >> 24) & 0xFF);
+ result_p[1] = static_cast<unsigned char>((value >> 16) & 0xFF);
+ result_p[2] = static_cast<unsigned char>((value >> 8) & 0xFF);
+ result_p[3] = static_cast<unsigned char>(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<unsigned char*>(&value);
+ u_short_type result = (static_cast<u_short_type>(value_p[0]) << 8)
+ | static_cast<u_short_type>(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<unsigned char*>(&result);
+ result_p[0] = static_cast<unsigned char>((value >> 8) & 0xFF);
+ result_p[1] = static_cast<unsigned char>(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/3rdparty/asio/include/asio/detail/impl/socket_select_interrupter.ipp b/3rdparty/asio/include/asio/detail/impl/socket_select_interrupter.ipp
new file mode 100644
index 00000000000..a5b29581eb0
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/socket_select_interrupter.ipp
@@ -0,0 +1,185 @@
+//
+// detail/impl/socket_select_interrupter.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstdlib>
+#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(), &addr,
+ addr_len, ec) == socket_error_retval)
+ asio::detail::throw_error(ec, "socket_select_interrupter");
+
+ if (socket_ops::getsockname(acceptor.get(), &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(), &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;
+ for (;;)
+ {
+ int bytes_read = socket_ops::recv(read_descriptor_, &b, 1, 0, ec);
+ if (bytes_read == sizeof(data))
+ continue;
+ if (bytes_read > 0)
+ return true;
+ if (bytes_read == 0)
+ return false;
+ if (ec == asio::error::would_block
+ || ec == asio::error::try_again)
+ return true;
+ return false;
+ }
+}
+
+} // 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/3rdparty/asio/include/asio/detail/impl/strand_executor_service.hpp b/3rdparty/asio/include/asio/detail/impl/strand_executor_service.hpp
new file mode 100644
index 00000000000..3ffb398dcf6
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/strand_executor_service.hpp
@@ -0,0 +1,346 @@
+//
+// detail/impl/strand_executor_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/fenced_block.hpp"
+#include "asio/detail/recycling_allocator.hpp"
+#include "asio/executor_work_guard.hpp"
+#include "asio/defer.hpp"
+#include "asio/dispatch.hpp"
+#include "asio/post.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename F, typename Allocator>
+class strand_executor_service::allocator_binder
+{
+public:
+ typedef Allocator allocator_type;
+
+ allocator_binder(F&& f, const Allocator& a)
+ : f_(static_cast<F&&>(f)),
+ allocator_(a)
+ {
+ }
+
+ allocator_binder(const allocator_binder& other)
+ : f_(other.f_),
+ allocator_(other.allocator_)
+ {
+ }
+
+ allocator_binder(allocator_binder&& other)
+ : f_(static_cast<F&&>(other.f_)),
+ allocator_(static_cast<allocator_type&&>(other.allocator_))
+ {
+ }
+
+ allocator_type get_allocator() const noexcept
+ {
+ return allocator_;
+ }
+
+ void operator()()
+ {
+ f_();
+ }
+
+private:
+ F f_;
+ allocator_type allocator_;
+};
+
+template <typename Executor>
+class strand_executor_service::invoker<Executor,
+ enable_if_t<
+ execution::is_executor<Executor>::value
+ >>
+{
+public:
+ invoker(const implementation_type& impl, Executor& ex)
+ : impl_(impl),
+ executor_(asio::prefer(ex, execution::outstanding_work.tracked))
+ {
+ }
+
+ invoker(const invoker& other)
+ : impl_(other.impl_),
+ executor_(other.executor_)
+ {
+ }
+
+ invoker(invoker&& other)
+ : impl_(static_cast<implementation_type&&>(other.impl_)),
+ executor_(static_cast<executor_type&&>(other.executor_))
+ {
+ }
+
+ struct on_invoker_exit
+ {
+ invoker* this_;
+
+ ~on_invoker_exit()
+ {
+ if (push_waiting_to_ready(this_->impl_))
+ {
+ recycling_allocator<void> allocator;
+ executor_type ex = this_->executor_;
+ asio::prefer(
+ asio::require(
+ static_cast<executor_type&&>(ex),
+ execution::blocking.never),
+ execution::allocator(allocator)
+ ).execute(static_cast<invoker&&>(*this_));
+ }
+ }
+ };
+
+ void operator()()
+ {
+ // Ensure the next handler, if any, is scheduled on block exit.
+ on_invoker_exit on_exit = { this };
+ (void)on_exit;
+
+ run_ready_handlers(impl_);
+ }
+
+private:
+ typedef decay_t<
+ prefer_result_t<
+ Executor,
+ execution::outstanding_work_t::tracked_t
+ >
+ > executor_type;
+
+ implementation_type impl_;
+ executor_type executor_;
+};
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Executor>
+class strand_executor_service::invoker<Executor,
+ enable_if_t<
+ !execution::is_executor<Executor>::value
+ >>
+{
+public:
+ invoker(const implementation_type& impl, Executor& ex)
+ : impl_(impl),
+ work_(ex)
+ {
+ }
+
+ invoker(const invoker& other)
+ : impl_(other.impl_),
+ work_(other.work_)
+ {
+ }
+
+ invoker(invoker&& other)
+ : impl_(static_cast<implementation_type&&>(other.impl_)),
+ work_(static_cast<executor_work_guard<Executor>&&>(other.work_))
+ {
+ }
+
+ struct on_invoker_exit
+ {
+ invoker* this_;
+
+ ~on_invoker_exit()
+ {
+ if (push_waiting_to_ready(this_->impl_))
+ {
+ Executor ex(this_->work_.get_executor());
+ recycling_allocator<void> allocator;
+ ex.post(static_cast<invoker&&>(*this_), allocator);
+ }
+ }
+ };
+
+ void operator()()
+ {
+ // Ensure the next handler, if any, is scheduled on block exit.
+ on_invoker_exit on_exit = { this };
+ (void)on_exit;
+
+ run_ready_handlers(impl_);
+ }
+
+private:
+ implementation_type impl_;
+ executor_work_guard<Executor> work_;
+};
+
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Executor, typename Function>
+inline void strand_executor_service::execute(const implementation_type& impl,
+ Executor& ex, Function&& function,
+ enable_if_t<
+ can_query<Executor, execution::allocator_t<void>>::value
+ >*)
+{
+ return strand_executor_service::do_execute(impl, ex,
+ static_cast<Function&&>(function),
+ asio::query(ex, execution::allocator));
+}
+
+template <typename Executor, typename Function>
+inline void strand_executor_service::execute(const implementation_type& impl,
+ Executor& ex, Function&& function,
+ enable_if_t<
+ !can_query<Executor, execution::allocator_t<void>>::value
+ >*)
+{
+ return strand_executor_service::do_execute(impl, ex,
+ static_cast<Function&&>(function),
+ std::allocator<void>());
+}
+
+template <typename Executor, typename Function, typename Allocator>
+void strand_executor_service::do_execute(const implementation_type& impl,
+ Executor& ex, Function&& function, const Allocator& a)
+{
+ typedef decay_t<Function> function_type;
+
+ // If the executor is not never-blocking, and we are already in the strand,
+ // then the function can run immediately.
+ if (asio::query(ex, execution::blocking) != execution::blocking.never
+ && running_in_this_thread(impl))
+ {
+ // Make a local, non-const copy of the function.
+ function_type tmp(static_cast<Function&&>(function));
+
+ fenced_block b(fenced_block::full);
+ static_cast<function_type&&>(tmp)();
+ return;
+ }
+
+ // Allocate and construct an operation to wrap the function.
+ typedef executor_op<function_type, Allocator> op;
+ typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
+ p.p = new (p.v) op(static_cast<Function&&>(function), a);
+
+ ASIO_HANDLER_CREATION((impl->service_->context(), *p.p,
+ "strand_executor", impl.get(), 0, "execute"));
+
+ // 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.execute(invoker<Executor>(impl, ex));
+ }
+}
+
+template <typename Executor, typename Function, typename Allocator>
+void strand_executor_service::dispatch(const implementation_type& impl,
+ Executor& ex, Function&& function, const Allocator& a)
+{
+ typedef decay_t<Function> function_type;
+
+ // If we are already in the strand then the function can run immediately.
+ if (running_in_this_thread(impl))
+ {
+ // Make a local, non-const copy of the function.
+ function_type tmp(static_cast<Function&&>(function));
+
+ fenced_block b(fenced_block::full);
+ static_cast<function_type&&>(tmp)();
+ return;
+ }
+
+ // Allocate and construct an operation to wrap the function.
+ typedef executor_op<function_type, Allocator> op;
+ typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
+ p.p = new (p.v) op(static_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)
+ {
+ asio::dispatch(ex,
+ allocator_binder<invoker<Executor>, Allocator>(
+ invoker<Executor>(impl, ex), a));
+ }
+}
+
+// Request invocation of the given function and return immediately.
+template <typename Executor, typename Function, typename Allocator>
+void strand_executor_service::post(const implementation_type& impl,
+ Executor& ex, Function&& function, const Allocator& a)
+{
+ typedef decay_t<Function> function_type;
+
+ // Allocate and construct an operation to wrap the function.
+ typedef executor_op<function_type, Allocator> op;
+ typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
+ p.p = new (p.v) op(static_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)
+ {
+ asio::post(ex,
+ allocator_binder<invoker<Executor>, Allocator>(
+ invoker<Executor>(impl, ex), a));
+ }
+}
+
+// Request invocation of the given function and return immediately.
+template <typename Executor, typename Function, typename Allocator>
+void strand_executor_service::defer(const implementation_type& impl,
+ Executor& ex, Function&& function, const Allocator& a)
+{
+ typedef decay_t<Function> function_type;
+
+ // Allocate and construct an operation to wrap the function.
+ typedef executor_op<function_type, Allocator> op;
+ typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
+ p.p = new (p.v) op(static_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)
+ {
+ asio::defer(ex,
+ allocator_binder<invoker<Executor>, Allocator>(
+ invoker<Executor>(impl, ex), a));
+ }
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_HPP
diff --git a/3rdparty/asio/include/asio/detail/impl/strand_executor_service.ipp b/3rdparty/asio/include/asio/detail/impl/strand_executor_service.ipp
new file mode 100644
index 00000000000..a2dff894cca
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/strand_executor_service.ipp
@@ -0,0 +1,158 @@
+//
+// detail/impl/strand_executor_service.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<strand_executor_service>(ctx),
+ mutex_(),
+ salt_(0),
+ impl_list_(0)
+{
+}
+
+void strand_executor_service::shutdown()
+{
+ op_queue<scheduler_operation> 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<std::size_t>(new_impl.get());
+ mutex_index += (reinterpret_cast<std::size_t>(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<strand_impl>::contains(impl.get());
+}
+
+bool strand_executor_service::push_waiting_to_ready(implementation_type& impl)
+{
+ impl->mutex_->lock();
+ impl->ready_queue_.push(impl->waiting_queue_);
+ bool more_handlers = impl->locked_ = !impl->ready_queue_.empty();
+ impl->mutex_->unlock();
+ return more_handlers;
+}
+
+void strand_executor_service::run_ready_handlers(implementation_type& impl)
+{
+ // Indicate that this strand is executing on the current thread.
+ call_stack<strand_impl>::context ctx(impl.get());
+
+ // 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);
+ }
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/strand_service.hpp b/3rdparty/asio/include/asio/detail/impl/strand_service.hpp
new file mode 100644
index 00000000000..8249c9eb8d5
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/strand_service.hpp
@@ -0,0 +1,86 @@
+//
+// detail/impl/strand_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/completion_handler.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/handler_alloc_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)
+{
+}
+
+template <typename Handler>
+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 (running_in_this_thread(impl))
+ {
+ fenced_block b(fenced_block::full);
+ static_cast<Handler&&>(handler)();
+ return;
+ }
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef completion_handler<Handler, io_context::executor_type> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(handler, io_context_.get_executor());
+
+ ASIO_HANDLER_CREATION((this->context(),
+ *p.p, "strand", impl, 0, "dispatch"));
+
+ operation* o = p.p;
+ p.v = p.p = 0;
+ do_dispatch(impl, o);
+}
+
+// Request the io_context to invoke the given handler and return immediately.
+template <typename Handler>
+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<Handler, io_context::executor_type> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(handler, io_context_.get_executor());
+
+ 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/3rdparty/asio/include/asio/detail/impl/strand_service.ipp b/3rdparty/asio/include/asio/detail/impl/strand_service.ipp
new file mode 100644
index 00000000000..af8929a00c6
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/strand_service.ipp
@@ -0,0 +1,202 @@
+//
+// detail/impl/strand_service.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<strand_service>(io_context),
+ io_context_(io_context),
+ io_context_impl_(asio::use_service<io_context_impl>(io_context)),
+ mutex_(),
+ salt_(0)
+{
+}
+
+void strand_service::shutdown()
+{
+ op_queue<operation> 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<std::size_t>(&impl);
+ index += (reinterpret_cast<std::size_t>(&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<strand_impl>::contains(impl) != 0;
+}
+
+struct strand_service::on_dispatch_exit
+{
+ io_context_impl* io_context_impl_;
+ 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_impl_->post_immediate_completion(impl_, false);
+ }
+};
+
+void 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_impl_.can_dispatch();
+ impl->mutex_.lock();
+ if (can_dispatch && !impl->locked_)
+ {
+ // Immediate invocation is allowed.
+ impl->locked_ = true;
+ impl->mutex_.unlock();
+
+ // Indicate that this strand is executing on the current thread.
+ call_stack<strand_impl>::context ctx(impl);
+
+ // Ensure the next handler, if any, is scheduled on block exit.
+ on_dispatch_exit on_exit = { &io_context_impl_, impl };
+ (void)on_exit;
+
+ op->complete(&io_context_impl_, asio::error_code(), 0);
+ return;
+ }
+
+ 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_impl_.post_immediate_completion(impl, 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_impl_.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<strand_impl*>(base);
+
+ // Indicate that this strand is executing on the current thread.
+ call_stack<strand_impl>::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<io_context_impl*>(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/3rdparty/asio/include/asio/detail/impl/thread_context.ipp b/3rdparty/asio/include/asio/detail/impl/thread_context.ipp
new file mode 100644
index 00000000000..8e729776362
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/thread_context.ipp
@@ -0,0 +1,35 @@
+//
+// detail/impl/thread_context.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_THREAD_CONTEXT_IPP
+#define ASIO_DETAIL_IMPL_THREAD_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/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+thread_info_base* thread_context::top_of_thread_call_stack()
+{
+ return thread_call_stack::top();
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_IMPL_THREAD_CONTEXT_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/throw_error.ipp b/3rdparty/asio/include/asio/detail/impl/throw_error.ipp
new file mode 100644
index 00000000000..7baf3e729e5
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/throw_error.ipp
@@ -0,0 +1,49 @@
+//
+// detail/impl/throw_error.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/system_error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+void do_throw_error(
+ const asio::error_code& err
+ ASIO_SOURCE_LOCATION_PARAM)
+{
+ asio::system_error e(err);
+ asio::detail::throw_exception(e ASIO_SOURCE_LOCATION_ARG);
+}
+
+void do_throw_error(
+ const asio::error_code& err,
+ const char* location
+ ASIO_SOURCE_LOCATION_PARAM)
+{
+ asio::system_error e(err, location);
+ asio::detail::throw_exception(e ASIO_SOURCE_LOCATION_ARG);
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_IMPL_THROW_ERROR_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/timer_queue_ptime.ipp b/3rdparty/asio/include/asio/detail/impl/timer_queue_ptime.ipp
new file mode 100644
index 00000000000..bdf994e3a41
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/timer_queue_ptime.ipp
@@ -0,0 +1,97 @@
+//
+// detail/impl/timer_queue_ptime.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<time_traits<boost::posix_time::ptime>>::timer_queue()
+{
+}
+
+timer_queue<time_traits<boost::posix_time::ptime>>::~timer_queue()
+{
+}
+
+bool timer_queue<time_traits<boost::posix_time::ptime>>::enqueue_timer(
+ const time_type& time, per_timer_data& timer, wait_op* op)
+{
+ return impl_.enqueue_timer(time, timer, op);
+}
+
+bool timer_queue<time_traits<boost::posix_time::ptime>>::empty() const
+{
+ return impl_.empty();
+}
+
+long timer_queue<time_traits<boost::posix_time::ptime>>::wait_duration_msec(
+ long max_duration) const
+{
+ return impl_.wait_duration_msec(max_duration);
+}
+
+long timer_queue<time_traits<boost::posix_time::ptime>>::wait_duration_usec(
+ long max_duration) const
+{
+ return impl_.wait_duration_usec(max_duration);
+}
+
+void timer_queue<time_traits<boost::posix_time::ptime>>::get_ready_timers(
+ op_queue<operation>& ops)
+{
+ impl_.get_ready_timers(ops);
+}
+
+void timer_queue<time_traits<boost::posix_time::ptime>>::get_all_timers(
+ op_queue<operation>& ops)
+{
+ impl_.get_all_timers(ops);
+}
+
+std::size_t timer_queue<time_traits<boost::posix_time::ptime>>::cancel_timer(
+ per_timer_data& timer, op_queue<operation>& ops, std::size_t max_cancelled)
+{
+ return impl_.cancel_timer(timer, ops, max_cancelled);
+}
+
+void timer_queue<time_traits<boost::posix_time::ptime>>::cancel_timer_by_key(
+ per_timer_data* timer, op_queue<operation>& ops, void* cancellation_key)
+{
+ impl_.cancel_timer_by_key(timer, ops, cancellation_key);
+}
+
+void timer_queue<time_traits<boost::posix_time::ptime>>::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/3rdparty/asio/include/asio/detail/impl/timer_queue_set.ipp b/3rdparty/asio/include/asio/detail/impl/timer_queue_set.ipp
new file mode 100644
index 00000000000..66420e98a7c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/timer_queue_set.ipp
@@ -0,0 +1,101 @@
+//
+// detail/impl/timer_queue_set.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<operation>& 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<operation>& 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/3rdparty/asio/include/asio/detail/impl/win_event.ipp b/3rdparty/asio/include/asio/detail/impl/win_event.ipp
new file mode 100644
index 00000000000..9827e339769
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/win_event.ipp
@@ -0,0 +1,76 @@
+//
+// detail/win_event.ipp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/impl/win_iocp_file_service.ipp b/3rdparty/asio/include/asio/detail/impl/win_iocp_file_service.ipp
new file mode 100644
index 00000000000..faaab48ad52
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/win_iocp_file_service.ipp
@@ -0,0 +1,280 @@
+//
+// detail/impl/win_iocp_file_service.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_FILE_SERVICE_IPP
+#define ASIO_DETAIL_IMPL_WIN_IOCP_FILE_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_FILE) \
+ && defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE)
+
+#include <cstring>
+#include <sys/stat.h>
+#include "asio/detail/win_iocp_file_service.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+win_iocp_file_service::win_iocp_file_service(
+ execution_context& context)
+ : execution_context_service_base<win_iocp_file_service>(context),
+ handle_service_(context),
+ nt_flush_buffers_file_ex_(0)
+{
+ if (FARPROC nt_flush_buffers_file_ex_ptr = ::GetProcAddress(
+ ::GetModuleHandleA("NTDLL"), "NtFlushBuffersFileEx"))
+ {
+ nt_flush_buffers_file_ex_ = reinterpret_cast<nt_flush_buffers_file_ex_fn>(
+ reinterpret_cast<void*>(nt_flush_buffers_file_ex_ptr));
+ }
+}
+
+void win_iocp_file_service::shutdown()
+{
+ handle_service_.shutdown();
+}
+
+asio::error_code win_iocp_file_service::open(
+ win_iocp_file_service::implementation_type& impl,
+ const char* path, file_base::flags open_flags,
+ asio::error_code& ec)
+{
+ if (is_open(impl))
+ {
+ ec = asio::error::already_open;
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ DWORD access = 0;
+ if ((open_flags & file_base::read_only) != 0)
+ access = GENERIC_READ;
+ else if ((open_flags & file_base::write_only) != 0)
+ access = GENERIC_WRITE;
+ else if ((open_flags & file_base::read_write) != 0)
+ access = GENERIC_READ | GENERIC_WRITE;
+
+ DWORD share = FILE_SHARE_READ | FILE_SHARE_WRITE;
+
+ DWORD disposition = 0;
+ if ((open_flags & file_base::create) != 0)
+ {
+ if ((open_flags & file_base::exclusive) != 0)
+ disposition = CREATE_NEW;
+ else
+ disposition = OPEN_ALWAYS;
+ }
+ else
+ {
+ if ((open_flags & file_base::truncate) != 0)
+ disposition = TRUNCATE_EXISTING;
+ else
+ disposition = OPEN_EXISTING;
+ }
+
+ DWORD flags = FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED;
+ if (impl.is_stream_)
+ flags |= FILE_FLAG_SEQUENTIAL_SCAN;
+ else
+ flags |= FILE_FLAG_RANDOM_ACCESS;
+ if ((open_flags & file_base::sync_all_on_write) != 0)
+ flags |= FILE_FLAG_WRITE_THROUGH;
+
+ HANDLE handle = ::CreateFileA(path, access, share, 0, disposition, flags, 0);
+ if (handle != INVALID_HANDLE_VALUE)
+ {
+ if (disposition == OPEN_ALWAYS)
+ {
+ if ((open_flags & file_base::truncate) != 0)
+ {
+ if (!::SetEndOfFile(handle))
+ {
+ DWORD last_error = ::GetLastError();
+ ::CloseHandle(handle);
+ ec.assign(last_error, asio::error::get_system_category());
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+ }
+ else if ((open_flags & file_base::append) != 0)
+ {
+ if (::SetFilePointer(handle, 0, 0, FILE_END)
+ == INVALID_SET_FILE_POINTER)
+ {
+ DWORD last_error = ::GetLastError();
+ ::CloseHandle(handle);
+ ec.assign(last_error, asio::error::get_system_category());
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+ }
+ }
+
+ handle_service_.assign(impl, handle, ec);
+ if (ec)
+ ::CloseHandle(handle);
+ impl.offset_ = 0;
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+ else
+ {
+ DWORD last_error = ::GetLastError();
+ ec.assign(last_error, asio::error::get_system_category());
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+}
+
+uint64_t win_iocp_file_service::size(
+ const win_iocp_file_service::implementation_type& impl,
+ asio::error_code& ec) const
+{
+ LARGE_INTEGER result;
+ if (::GetFileSizeEx(native_handle(impl), &result))
+ {
+ asio::error::clear(ec);
+ return static_cast<uint64_t>(result.QuadPart);
+ }
+ else
+ {
+ DWORD last_error = ::GetLastError();
+ ec.assign(last_error, asio::error::get_system_category());
+ ASIO_ERROR_LOCATION(ec);
+ return 0;
+ }
+}
+
+asio::error_code win_iocp_file_service::resize(
+ win_iocp_file_service::implementation_type& impl,
+ uint64_t n, asio::error_code& ec)
+{
+ LARGE_INTEGER distance;
+ distance.QuadPart = n;
+ if (::SetFilePointerEx(native_handle(impl), distance, 0, FILE_BEGIN))
+ {
+ BOOL result = ::SetEndOfFile(native_handle(impl));
+ DWORD last_error = ::GetLastError();
+
+ distance.QuadPart = static_cast<LONGLONG>(impl.offset_);
+ if (!::SetFilePointerEx(native_handle(impl), distance, 0, FILE_BEGIN))
+ {
+ result = FALSE;
+ last_error = ::GetLastError();
+ }
+
+ if (result)
+ asio::error::clear(ec);
+ else
+ ec.assign(last_error, asio::error::get_system_category());
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+ else
+ {
+ DWORD last_error = ::GetLastError();
+ ec.assign(last_error, asio::error::get_system_category());
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+}
+
+asio::error_code win_iocp_file_service::sync_all(
+ win_iocp_file_service::implementation_type& impl,
+ asio::error_code& ec)
+{
+ BOOL result = ::FlushFileBuffers(native_handle(impl));
+ if (result)
+ {
+ asio::error::clear(ec);
+ return ec;
+ }
+ else
+ {
+ DWORD last_error = ::GetLastError();
+ ec.assign(last_error, asio::error::get_system_category());
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+}
+
+asio::error_code win_iocp_file_service::sync_data(
+ win_iocp_file_service::implementation_type& impl,
+ asio::error_code& ec)
+{
+ if (nt_flush_buffers_file_ex_)
+ {
+ io_status_block status = {};
+ if (!nt_flush_buffers_file_ex_(native_handle(impl),
+ flush_flags_file_data_sync_only, 0, 0, &status))
+ {
+ asio::error::clear(ec);
+ return ec;
+ }
+ }
+ return sync_all(impl, ec);
+}
+
+uint64_t win_iocp_file_service::seek(
+ win_iocp_file_service::implementation_type& impl, int64_t offset,
+ file_base::seek_basis whence, asio::error_code& ec)
+{
+ DWORD method;
+ switch (whence)
+ {
+ case file_base::seek_set:
+ method = FILE_BEGIN;
+ break;
+ case file_base::seek_cur:
+ method = FILE_BEGIN;
+ offset = static_cast<int64_t>(impl.offset_) + offset;
+ break;
+ case file_base::seek_end:
+ method = FILE_END;
+ break;
+ default:
+ ec = asio::error::invalid_argument;
+ ASIO_ERROR_LOCATION(ec);
+ return 0;
+ }
+
+ LARGE_INTEGER distance, new_offset;
+ distance.QuadPart = offset;
+ if (::SetFilePointerEx(native_handle(impl), distance, &new_offset, method))
+ {
+ impl.offset_ = new_offset.QuadPart;
+ asio::error::clear(ec);
+ return impl.offset_;
+ }
+ else
+ {
+ DWORD last_error = ::GetLastError();
+ ec.assign(last_error, asio::error::get_system_category());
+ ASIO_ERROR_LOCATION(ec);
+ return 0;
+ }
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_FILE)
+ // && defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE)
+
+#endif // ASIO_DETAIL_IMPL_WIN_IOCP_FILE_SERVICE_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/win_iocp_handle_service.ipp b/3rdparty/asio/include/asio/detail/impl/win_iocp_handle_service.ipp
new file mode 100644
index 00000000000..6136e27fb32
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/win_iocp_handle_service.ipp
@@ -0,0 +1,619 @@
+//
+// detail/impl/win_iocp_handle_service.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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<DWORD_PTR>(hEvent);
+ hEvent = reinterpret_cast<HANDLE>(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(execution_context& context)
+ : execution_context_service_base<win_iocp_handle_service>(context),
+ iocp_service_(asio::use_service<win_iocp_io_context>(context)),
+ nt_set_info_(0),
+ 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;
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ if (iocp_service_.register_handle(handle, ec))
+ {
+ ASIO_ERROR_LOCATION(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<uintmax_t>(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();
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+}
+
+win_iocp_handle_service::native_handle_type win_iocp_handle_service::release(
+ win_iocp_handle_service::implementation_type& impl,
+ asio::error_code& ec)
+{
+ if (!is_open(impl))
+ return INVALID_HANDLE_VALUE;
+
+ cancel(impl, ec);
+ if (ec)
+ {
+ ASIO_ERROR_LOCATION(ec);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ nt_set_info_fn fn = get_nt_set_info();
+ if (fn == 0)
+ {
+ ec = asio::error::operation_not_supported;
+ ASIO_ERROR_LOCATION(ec);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ ULONG_PTR iosb[2] = { 0, 0 };
+ void* info[2] = { 0, 0 };
+ if (fn(impl.handle_, iosb, &info, sizeof(info),
+ 61 /* FileReplaceCompletionInformation */))
+ {
+ ec = asio::error::operation_not_supported;
+ ASIO_ERROR_LOCATION(ec);
+ return INVALID_HANDLE_VALUE;
+ }
+
+ native_handle_type tmp = impl.handle_;
+ impl.handle_ = INVALID_HANDLE_VALUE;
+ return tmp;
+}
+
+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;
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ ASIO_HANDLER_OPERATION((iocp_service_.context(), "handle",
+ &impl, reinterpret_cast<uintmax_t>(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 = reinterpret_cast<cancel_io_ex_t>(
+ reinterpret_cast<void*>(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;
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ 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;
+ ASIO_ERROR_LOCATION(ec);
+ 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)
+ {
+ ASIO_ERROR_LOCATION(ec);
+ return 0;
+ }
+
+ // Write the data.
+ overlapped.Offset = offset & 0xFFFFFFFF;
+ overlapped.OffsetHigh = (offset >> 32) & 0xFFFFFFFF;
+ BOOL ok = ::WriteFile(impl.handle_, buffer.data(),
+ static_cast<DWORD>(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());
+ ASIO_ERROR_LOCATION(ec);
+ 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());
+ ASIO_ERROR_LOCATION(ec);
+ 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<DWORD>(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;
+ ASIO_ERROR_LOCATION(ec);
+ 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)
+ {
+ ASIO_ERROR_LOCATION(ec);
+ return 0;
+ }
+
+ // Read some data.
+ overlapped.Offset = offset & 0xFFFFFFFF;
+ overlapped.OffsetHigh = (offset >> 32) & 0xFFFFFFFF;
+ BOOL ok = ::ReadFile(impl.handle_, buffer.data(),
+ static_cast<DWORD>(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());
+ }
+ ASIO_ERROR_LOCATION(ec);
+ 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());
+ }
+ ASIO_ERROR_LOCATION(ec);
+ 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<DWORD>(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<uintmax_t>(impl.handle_), "close"));
+
+ ::CloseHandle(impl.handle_);
+ impl.handle_ = INVALID_HANDLE_VALUE;
+ impl.safe_cancellation_thread_id_ = 0;
+ }
+}
+
+win_iocp_handle_service::nt_set_info_fn
+win_iocp_handle_service::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<void*>(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<nt_set_info_fn>(ptr == this ? 0 : ptr);
+}
+
+void* win_iocp_handle_service::interlocked_compare_exchange_pointer(
+ void** dest, void* exch, void* cmp)
+{
+#if defined(_M_IX86)
+ return reinterpret_cast<void*>(InterlockedCompareExchange(
+ reinterpret_cast<PLONG>(dest), reinterpret_cast<LONG>(exch),
+ reinterpret_cast<LONG>(cmp)));
+#else
+ return InterlockedCompareExchangePointer(dest, exch, cmp);
+#endif
+}
+
+void* win_iocp_handle_service::interlocked_exchange_pointer(
+ void** dest, void* val)
+{
+#if defined(_M_IX86)
+ return reinterpret_cast<void*>(InterlockedExchange(
+ reinterpret_cast<PLONG>(dest), reinterpret_cast<LONG>(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_HANDLE_SERVICE_IPP
diff --git a/3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.hpp b/3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.hpp
new file mode 100644
index 00000000000..6479500184a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.hpp
@@ -0,0 +1,119 @@
+//
+// detail/impl/win_iocp_io_context.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Time_Traits>
+void win_iocp_io_context::add_timer_queue(
+ timer_queue<Time_Traits>& queue)
+{
+ do_add_timer_queue(queue);
+}
+
+template <typename Time_Traits>
+void win_iocp_io_context::remove_timer_queue(
+ timer_queue<Time_Traits>& queue)
+{
+ do_remove_timer_queue(queue);
+}
+
+template <typename Time_Traits>
+void win_iocp_io_context::schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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 <typename Time_Traits>
+std::size_t win_iocp_io_context::cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::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<win_iocp_operation> ops;
+ std::size_t n = queue.cancel_timer(timer, ops, max_cancelled);
+ lock.unlock();
+ post_deferred_completions(ops);
+ return n;
+}
+
+template <typename Time_Traits>
+void win_iocp_io_context::cancel_timer_by_key(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data* timer,
+ void* cancellation_key)
+{
+ // If the service has been shut down we silently ignore the cancellation.
+ if (::InterlockedExchangeAdd(&shutdown_, 0) != 0)
+ return;
+
+ mutex::scoped_lock lock(dispatch_mutex_);
+ op_queue<win_iocp_operation> ops;
+ queue.cancel_timer_by_key(timer, ops, cancellation_key);
+ lock.unlock();
+ post_deferred_completions(ops);
+}
+
+template <typename Time_Traits>
+void win_iocp_io_context::move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& to,
+ typename timer_queue<Time_Traits>::per_timer_data& from)
+{
+ asio::detail::mutex::scoped_lock lock(dispatch_mutex_);
+ op_queue<operation> 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/3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.ipp b/3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.ipp
new file mode 100644
index 00000000000..1c7fb28b2d6
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.ipp
@@ -0,0 +1,614 @@
+//
+// detail/impl/win_iocp_io_context.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/limits.hpp"
+#include "asio/detail/thread.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::thread_function
+{
+ explicit thread_function(win_iocp_io_context* s)
+ : this_(s)
+ {
+ }
+
+ void operator()()
+ {
+ asio::error_code ec;
+ this_->run(ec);
+ }
+
+ win_iocp_io_context* this_;
+};
+
+struct win_iocp_io_context::work_finished_on_block_exit
+{
+ ~work_finished_on_block_exit() noexcept(false)
+ {
+ 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, bool own_thread)
+ : execution_context_service_base<win_iocp_io_context>(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<DWORD>(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");
+ }
+
+ if (own_thread)
+ {
+ ::InterlockedIncrement(&outstanding_work_);
+ thread_.reset(new asio::detail::thread(thread_function(this)));
+ }
+}
+
+win_iocp_io_context::~win_iocp_io_context()
+{
+ if (thread_.get())
+ {
+ stop();
+ thread_->join();
+ thread_.reset();
+ }
+}
+
+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);
+ }
+
+ if (thread_.get())
+ {
+ stop();
+ thread_->join();
+ thread_.reset();
+ ::InterlockedDecrement(&outstanding_work_);
+ }
+
+ while (::InterlockedExchangeAdd(&outstanding_work_, 0) > 0)
+ {
+ op_queue<win_iocp_operation> 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<win_iocp_operation*>(overlapped)->destroy();
+ }
+ }
+ }
+
+ if (timer_thread_.get())
+ {
+ timer_thread_->join();
+ timer_thread_.reset();
+ }
+}
+
+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, this_thread, ec))
+ if (n != (std::numeric_limits<size_t>::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, this_thread, 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), this_thread, 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, this_thread, ec))
+ if (n != (std::numeric_limits<size_t>::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, this_thread, 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");
+ }
+ }
+ }
+}
+
+bool win_iocp_io_context::can_dispatch()
+{
+ return thread_call_stack::contains(this) != 0;
+}
+
+void win_iocp_io_context::capture_current_exception()
+{
+ if (thread_info_base* this_thread = thread_call_stack::contains(this))
+ this_thread->capture_current_exception();
+}
+
+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<win_iocp_operation>& 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<win_iocp_operation>& 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<ulong_ptr_t>(
+ &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<ulong_ptr_t>(&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,
+ win_iocp_thread_info& this_thread, 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<win_iocp_operation> 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<win_iocp_operation*>(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<int>(op->Offset),
+ *reinterpret_cast<asio::error_category*>(op->Internal));
+ bytes_transferred = op->OffsetHigh;
+ }
+
+ // Otherwise ensure any result has been saved into the OVERLAPPED
+ // structure.
+ else
+ {
+ op->Internal = reinterpret_cast<ulong_ptr_t>(&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);
+ this_thread.rethrow_pending_exception();
+ 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()
+{
+#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0600)
+ 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;
+#else // !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0600)
+ return INFINITE;
+#endif // !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0600)
+}
+
+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/3rdparty/asio/include/asio/detail/impl/win_iocp_serial_port_service.ipp b/3rdparty/asio/include/asio/detail/impl/win_iocp_serial_port_service.ipp
new file mode 100644
index 00000000000..abeb3cecb0a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/win_iocp_serial_port_service.ipp
@@ -0,0 +1,200 @@
+//
+// detail/impl/win_iocp_serial_port_service.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <cstring>
+#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(
+ execution_context& context)
+ : execution_context_service_base<win_iocp_serial_port_service>(context),
+ handle_service_(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;
+ ASIO_ERROR_LOCATION(ec);
+ 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());
+ ASIO_ERROR_LOCATION(ec);
+ 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());
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Set some default serial port parameters. This implementation does not
+ // support changing all of these, so they might as well be in a known state.
+ dcb.fBinary = TRUE; // Win32 only supports binary mode.
+ dcb.fNull = FALSE; // Do not ignore NULL characters.
+ dcb.fAbortOnError = FALSE; // Ignore serial framing errors.
+ dcb.BaudRate = CBR_9600; // 9600 baud by default
+ dcb.ByteSize = 8; // 8 bit bytes
+ dcb.fOutxCtsFlow = FALSE; // No flow control
+ dcb.fOutxDsrFlow = FALSE;
+ dcb.fDtrControl = DTR_CONTROL_DISABLE;
+ dcb.fDsrSensitivity = FALSE;
+ dcb.fOutX = FALSE;
+ dcb.fInX = FALSE;
+ dcb.fRtsControl = RTS_CONTROL_DISABLE;
+ dcb.fParity = FALSE; // No parity
+ dcb.Parity = NOPARITY;
+ dcb.StopBits = ONESTOPBIT; // One stop bit
+ if (!::SetCommState(handle, &dcb))
+ {
+ DWORD last_error = ::GetLastError();
+ ::CloseHandle(handle);
+ ec = asio::error_code(last_error,
+ asio::error::get_system_category());
+ ASIO_ERROR_LOCATION(ec);
+ 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());
+ ASIO_ERROR_LOCATION(ec);
+ 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());
+ ASIO_ERROR_LOCATION(ec);
+ 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());
+ ASIO_ERROR_LOCATION(ec);
+ 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());
+ ASIO_ERROR_LOCATION(ec);
+ 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/3rdparty/asio/include/asio/detail/impl/win_iocp_socket_service_base.ipp b/3rdparty/asio/include/asio/detail/impl/win_iocp_socket_service_base.ipp
new file mode 100644
index 00000000000..af28718c905
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/win_iocp_socket_service_base.ipp
@@ -0,0 +1,821 @@
+//
+// detail/impl/win_iocp_socket_service_base.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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(
+ execution_context& context)
+ : context_(context),
+ iocp_service_(use_service<win_iocp_io_context>(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)
+ noexcept
+{
+ 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<select_reactor*>(
+ interlocked_compare_exchange_pointer(
+ reinterpret_cast<void**>(&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<HANDLE>(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 = reinterpret_cast<cancel_io_ex_t>(
+ reinterpret_cast<void*>(cancel_io_ex_ptr));
+ socket_type sock = impl.socket_;
+ HANDLE sock_as_handle = reinterpret_cast<HANDLE>(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<HANDLE>(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<select_reactor*>(
+ interlocked_compare_exchange_pointer(
+ reinterpret_cast<void**>(&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<HANDLE>(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<void*>(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<HANDLE>(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<void*>(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<DWORD>(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 void* 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<DWORD>(buffer_count), &bytes_transferred, flags,
+ static_cast<const socket_addr_type*>(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<DWORD>(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);
+ }
+}
+
+int 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, operation* iocp_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, iocp_op);
+ return -1;
+ }
+ else
+ {
+ int op_type = (flags & socket_base::message_out_of_band)
+ ? select_reactor::except_op : select_reactor::read_op;
+ start_reactor_op(impl, op_type, op);
+ return op_type;
+ }
+}
+
+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, void* 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<DWORD>(buffer_count), &bytes_transferred, &recv_flags,
+ static_cast<socket_addr_type*>(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,
+ long* cancel_requested, operation* op)
+{
+ new_socket.reset();
+ iocp_service_.work_started();
+
+ // Check if we were cancelled after the first AcceptEx completed.
+ if (cancel_requested)
+ if (::InterlockedExchangeAdd(cancel_requested, 0) == 1)
+ iocp_service_.on_completion(op, asio::error::operation_aborted);
+
+ 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
+ {
+#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ if (cancel_requested)
+ {
+ if (::InterlockedExchangeAdd(cancel_requested, 0) == 1)
+ {
+ HANDLE sock_as_handle = reinterpret_cast<HANDLE>(s);
+ ::CancelIoEx(sock_as_handle, op);
+ }
+ }
+#endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ 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);
+}
+
+int win_iocp_socket_service_base::start_connect_op(
+ win_iocp_socket_service_base::base_implementation_type& impl,
+ int family, int type, const void* addr, std::size_t addrlen,
+ win_iocp_socket_connect_op_base* op, operation* iocp_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 -1;
+ }
+
+ op->connect_ex_ = true;
+ update_cancellation_thread_id(impl);
+ iocp_service_.work_started();
+
+ BOOL result = connect_ex(impl.socket_,
+ static_cast<const socket_addr_type*>(addr),
+ static_cast<int>(addrlen), 0, 0, 0, iocp_op);
+ DWORD last_error = ::WSAGetLastError();
+ if (!result && last_error != WSA_IO_PENDING)
+ iocp_service_.on_completion(iocp_op, last_error);
+ else
+ iocp_service_.on_pending(iocp_op);
+ return -1;
+ }
+ }
+
+ // 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 select_reactor::connect_op;
+ }
+ }
+ }
+
+ r.post_immediate_completion(op, false);
+ return -1;
+}
+
+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<select_reactor*>(
+ interlocked_compare_exchange_pointer(
+ reinterpret_cast<void**>(&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<select_reactor*>(
+ interlocked_compare_exchange_pointer(
+ reinterpret_cast<void**>(&reactor_), 0, 0));
+ if (!r)
+ {
+ r = &(use_service<select_reactor>(context_));
+ interlocked_exchange_pointer(reinterpret_cast<void**>(&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<connect_ex_fn>(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<void*>(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<nt_set_info_fn>(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<void*>(InterlockedCompareExchange(
+ reinterpret_cast<PLONG>(dest), reinterpret_cast<LONG>(exch),
+ reinterpret_cast<LONG>(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<void*>(InterlockedExchange(
+ reinterpret_cast<PLONG>(dest), reinterpret_cast<LONG>(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/3rdparty/asio/include/asio/detail/impl/win_mutex.ipp b/3rdparty/asio/include/asio/detail/impl/win_mutex.ipp
new file mode 100644
index 00000000000..6340b6e1256
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/win_mutex.ipp
@@ -0,0 +1,84 @@
+//
+// detail/impl/win_mutex.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/impl/win_object_handle_service.ipp b/3rdparty/asio/include/asio/detail/impl/win_object_handle_service.ipp
new file mode 100644
index 00000000000..d7db3e3f3a1
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/win_object_handle_service.ipp
@@ -0,0 +1,452 @@
+//
+// detail/impl/win_object_handle_service.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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(execution_context& context)
+ : execution_context_service_base<win_object_handle_service>(context),
+ scheduler_(asio::use_service<scheduler_impl>(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<operation> ops;
+ for (implementation_type* impl = impl_list_; impl; impl = impl->next_)
+ ops.push(impl->op_queue_);
+
+ lock.unlock();
+
+ scheduler_.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((scheduler_.context(), "object_handle",
+ &impl, reinterpret_cast<uintmax_t>(impl.wait_handle_), "close"));
+
+ HANDLE wait_handle = impl.wait_handle_;
+ impl.wait_handle_ = INVALID_HANDLE_VALUE;
+
+ op_queue<operation> 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;
+
+ scheduler_.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;
+ ASIO_ERROR_LOCATION(ec);
+ 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((scheduler_.context(), "object_handle",
+ &impl, reinterpret_cast<uintmax_t>(impl.wait_handle_), "close"));
+
+ mutex::scoped_lock lock(mutex_);
+
+ HANDLE wait_handle = impl.wait_handle_;
+ impl.wait_handle_ = INVALID_HANDLE_VALUE;
+
+ op_queue<operation> 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());
+ }
+
+ scheduler_.post_deferred_completions(completed_ops);
+ }
+ else
+ {
+ ec = asio::error_code();
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ 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((scheduler_.context(), "object_handle",
+ &impl, reinterpret_cast<uintmax_t>(impl.wait_handle_), "cancel"));
+
+ mutex::scoped_lock lock(mutex_);
+
+ HANDLE wait_handle = impl.wait_handle_;
+ impl.wait_handle_ = INVALID_HANDLE_VALUE;
+
+ op_queue<operation> 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();
+
+ scheduler_.post_deferred_completions(completed_ops);
+ }
+ else
+ {
+ ec = asio::error::bad_descriptor;
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ 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());
+ ASIO_ERROR_LOCATION(ec);
+ 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)
+{
+ scheduler_.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();
+ scheduler_.post_deferred_completion(op);
+ }
+ }
+ else
+ {
+ op->ec_ = asio::error::bad_descriptor;
+ scheduler_.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<operation> completed_ops;
+ while (wait_op* op = impl.op_queue_.front())
+ {
+ op->ec_ = ec;
+ impl.op_queue_.pop();
+ completed_ops.push(op);
+ }
+
+ lock.unlock();
+ scheduler_.post_deferred_completions(completed_ops);
+ }
+}
+
+void win_object_handle_service::wait_callback(PVOID param, BOOLEAN)
+{
+ implementation_type* impl = static_cast<implementation_type*>(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<operation> 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);
+ }
+ }
+ }
+
+ scheduler_impl& sched = impl->owner_->scheduler_;
+ lock.unlock();
+ sched.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/3rdparty/asio/include/asio/detail/impl/win_static_mutex.ipp b/3rdparty/asio/include/asio/detail/impl/win_static_mutex.ipp
new file mode 100644
index 00000000000..5b459843338
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/win_static_mutex.ipp
@@ -0,0 +1,136 @@
+//
+// detail/impl/win_static_mutex.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstdio>
+#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<unsigned int>(::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/3rdparty/asio/include/asio/detail/impl/win_thread.ipp b/3rdparty/asio/include/asio/detail/impl/win_thread.ipp
new file mode 100644
index 00000000000..0ebc5db86b4
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/win_thread.ipp
@@ -0,0 +1,150 @@
+//
+// detail/impl/win_thread.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <process.h>
+#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<HANDLE>(::_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<win_thread::func_base*>(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/3rdparty/asio/include/asio/detail/impl/win_tss_ptr.ipp b/3rdparty/asio/include/asio/detail/impl/win_tss_ptr.ipp
new file mode 100644
index 00000000000..5bc9de2c308
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/win_tss_ptr.ipp
@@ -0,0 +1,57 @@
+//
+// detail/impl/win_tss_ptr.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/impl/winrt_ssocket_service_base.ipp b/3rdparty/asio/include/asio/detail/impl/winrt_ssocket_service_base.ipp
new file mode 100644
index 00000000000..90a03542a9c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/winrt_ssocket_service_base.ipp
@@ -0,0 +1,626 @@
+//
+// detail/impl/winrt_ssocket_service_base.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstring>
+#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(
+ execution_context& context)
+ : scheduler_(use_service<scheduler_impl>(context)),
+ async_manager_(use_service<winrt_async_manager>(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)
+ noexcept
+{
+ 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)
+{
+ 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 (static_cast<const socket_addr_type*>(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<sockaddr_in4_type*>(addr)->sin_addr, &scope, ec);
+ reinterpret_cast<sockaddr_in4_type*>(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<sockaddr_in6_type*>(addr)->sin6_addr, &scope, ec);
+ reinterpret_cast<sockaddr_in6_type*>(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 (static_cast<const socket_addr_type*>(addr)->sa_family)
+ {
+ case ASIO_OS_DEF(AF_INET):
+ socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET),
+ &reinterpret_cast<const sockaddr_in4_type*>(addr)->sin_addr,
+ addr_string, sizeof(addr_string), 0, ec);
+ port = socket_ops::network_to_host_short(
+ reinterpret_cast<const sockaddr_in4_type*>(addr)->sin_port);
+ break;
+ case ASIO_OS_DEF(AF_INET6):
+ socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET6),
+ &reinterpret_cast<const sockaddr_in6_type*>(addr)->sin6_addr,
+ addr_string, sizeof(addr_string), 0, ec);
+ port = socket_ops::network_to_host_short(
+ reinterpret_cast<const sockaddr_in6_type*>(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<void>* op, bool is_continuation)
+{
+ if (!is_open(impl))
+ {
+ op->ec_ = asio::error::bad_descriptor;
+ scheduler_.post_immediate_completion(op, is_continuation);
+ return;
+ }
+
+ char addr_string[max_addr_v6_str_len];
+ unsigned short port = 0;
+ switch (static_cast<const socket_addr_type*>(addr)->sa_family)
+ {
+ case ASIO_OS_DEF(AF_INET):
+ socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET),
+ &reinterpret_cast<const sockaddr_in4_type*>(addr)->sin_addr,
+ addr_string, sizeof(addr_string), 0, op->ec_);
+ port = socket_ops::network_to_host_short(
+ reinterpret_cast<const sockaddr_in4_type*>(addr)->sin_port);
+ break;
+ case ASIO_OS_DEF(AF_INET6):
+ socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET6),
+ &reinterpret_cast<const sockaddr_in6_type*>(addr)->sin6_addr,
+ addr_string, sizeof(addr_string), 0, op->ec_);
+ port = socket_ops::network_to_host_short(
+ reinterpret_cast<const sockaddr_in6_type*>(addr)->sin6_port);
+ break;
+ default:
+ op->ec_ = asio::error::address_family_not_supported;
+ break;
+ }
+
+ if (op->ec_)
+ {
+ scheduler_.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());
+ scheduler_.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<asio::const_buffer,
+ asio::const_buffer> 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<unsigned int>* op, bool is_continuation)
+{
+ if (flags)
+ {
+ op->ec_ = asio::error::operation_not_supported;
+ scheduler_.post_immediate_completion(op, is_continuation);
+ return;
+ }
+
+ if (!is_open(impl))
+ {
+ op->ec_ = asio::error::bad_descriptor;
+ scheduler_.post_immediate_completion(op, is_continuation);
+ return;
+ }
+
+ try
+ {
+ buffer_sequence_adapter<asio::const_buffer,
+ asio::const_buffer> bufs(asio::buffer(data));
+
+ if (bufs.all_empty())
+ {
+ scheduler_.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());
+ scheduler_.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<asio::mutable_buffer,
+ asio::mutable_buffer> 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<Windows::Storage::Streams::IBuffer^>* op,
+ bool is_continuation)
+{
+ if (flags)
+ {
+ op->ec_ = asio::error::operation_not_supported;
+ scheduler_.post_immediate_completion(op, is_continuation);
+ return;
+ }
+
+ if (!is_open(impl))
+ {
+ op->ec_ = asio::error::bad_descriptor;
+ scheduler_.post_immediate_completion(op, is_continuation);
+ return;
+ }
+
+ try
+ {
+ buffer_sequence_adapter<asio::mutable_buffer,
+ asio::mutable_buffer> bufs(asio::buffer(data));
+
+ if (bufs.all_empty())
+ {
+ scheduler_.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());
+ scheduler_.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/3rdparty/asio/include/asio/detail/impl/winrt_timer_scheduler.hpp b/3rdparty/asio/include/asio/detail/impl/winrt_timer_scheduler.hpp
new file mode 100644
index 00000000000..9c967508e4f
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/winrt_timer_scheduler.hpp
@@ -0,0 +1,92 @@
+//
+// detail/impl/winrt_timer_scheduler.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Time_Traits>
+void winrt_timer_scheduler::add_timer_queue(timer_queue<Time_Traits>& queue)
+{
+ do_add_timer_queue(queue);
+}
+
+// Remove a timer queue from the reactor.
+template <typename Time_Traits>
+void winrt_timer_scheduler::remove_timer_queue(timer_queue<Time_Traits>& queue)
+{
+ do_remove_timer_queue(queue);
+}
+
+template <typename Time_Traits>
+void winrt_timer_scheduler::schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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)
+ event_.signal(lock);
+}
+
+template <typename Time_Traits>
+std::size_t winrt_timer_scheduler::cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled)
+{
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ op_queue<operation> ops;
+ std::size_t n = queue.cancel_timer(timer, ops, max_cancelled);
+ lock.unlock();
+ scheduler_.post_deferred_completions(ops);
+ return n;
+}
+
+template <typename Time_Traits>
+void winrt_timer_scheduler::move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& to,
+ typename timer_queue<Time_Traits>::per_timer_data& from)
+{
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ op_queue<operation> 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/3rdparty/asio/include/asio/detail/impl/winrt_timer_scheduler.ipp b/3rdparty/asio/include/asio/detail/impl/winrt_timer_scheduler.ipp
new file mode 100644
index 00000000000..028b5f9f3cb
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/winrt_timer_scheduler.ipp
@@ -0,0 +1,121 @@
+//
+// detail/impl/winrt_timer_scheduler.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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(execution_context& context)
+ : execution_context_service_base<winrt_timer_scheduler>(context),
+ scheduler_(use_service<scheduler_impl>(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<operation> ops;
+ timer_queues_.get_all_timers(ops);
+ scheduler_.abandon_operations(ops);
+}
+
+void winrt_timer_scheduler::notify_fork(execution_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<operation> ops;
+ timer_queues_.get_ready_timers(ops);
+ if (!ops.empty())
+ {
+ lock.unlock();
+ scheduler_.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/3rdparty/asio/include/asio/detail/impl/winsock_init.ipp b/3rdparty/asio/include/asio/detail/impl/winsock_init.ipp
new file mode 100644
index 00000000000..5b5f56037ea
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/impl/winsock_init.ipp
@@ -0,0 +1,82 @@
+//
+// detail/impl/winsock_init.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/initiate_defer.hpp b/3rdparty/asio/include/asio/detail/initiate_defer.hpp
new file mode 100644
index 00000000000..92abb0aa2f0
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/initiate_defer.hpp
@@ -0,0 +1,207 @@
+//
+// detail/initiate_defer.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_INITIATE_DEFER_HPP
+#define ASIO_DETAIL_INITIATE_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/execution/allocator.hpp"
+#include "asio/execution/blocking.hpp"
+#include "asio/execution/relationship.hpp"
+#include "asio/prefer.hpp"
+#include "asio/require.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class initiate_defer
+{
+public:
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ execution::is_executor<
+ associated_executor_t<decay_t<CompletionHandler>>
+ >::value
+ >* = 0) const
+ {
+ associated_executor_t<decay_t<CompletionHandler>> ex(
+ (get_associated_executor)(handler));
+
+ associated_allocator_t<decay_t<CompletionHandler>> alloc(
+ (get_associated_allocator)(handler));
+
+ asio::prefer(
+ asio::require(ex, execution::blocking.never),
+ execution::relationship.continuation,
+ execution::allocator(alloc)
+ ).execute(
+ asio::detail::bind_handler(
+ static_cast<CompletionHandler&&>(handler)));
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ !execution::is_executor<
+ associated_executor_t<decay_t<CompletionHandler>>
+ >::value
+ >* = 0) const
+ {
+ associated_executor_t<decay_t<CompletionHandler>> ex(
+ (get_associated_executor)(handler));
+
+ associated_allocator_t<decay_t<CompletionHandler>> alloc(
+ (get_associated_allocator)(handler));
+
+ ex.defer(asio::detail::bind_handler(
+ static_cast<CompletionHandler&&>(handler)), alloc);
+ }
+};
+
+template <typename Executor>
+class initiate_defer_with_executor
+{
+public:
+ typedef Executor executor_type;
+
+ explicit initiate_defer_with_executor(const Executor& ex)
+ : ex_(ex)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return ex_;
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ execution::is_executor<
+ conditional_t<true, executor_type, CompletionHandler>
+ >::value
+ >* = 0,
+ enable_if_t<
+ !detail::is_work_dispatcher_required<
+ decay_t<CompletionHandler>,
+ Executor
+ >::value
+ >* = 0) const
+ {
+ associated_allocator_t<decay_t<CompletionHandler>> alloc(
+ (get_associated_allocator)(handler));
+
+ asio::prefer(
+ asio::require(ex_, execution::blocking.never),
+ execution::relationship.continuation,
+ execution::allocator(alloc)
+ ).execute(
+ asio::detail::bind_handler(
+ static_cast<CompletionHandler&&>(handler)));
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ execution::is_executor<
+ conditional_t<true, executor_type, CompletionHandler>
+ >::value
+ >* = 0,
+ enable_if_t<
+ detail::is_work_dispatcher_required<
+ decay_t<CompletionHandler>,
+ Executor
+ >::value
+ >* = 0) const
+ {
+ typedef decay_t<CompletionHandler> handler_t;
+
+ typedef associated_executor_t<handler_t, Executor> handler_ex_t;
+ handler_ex_t handler_ex((get_associated_executor)(handler, ex_));
+
+ associated_allocator_t<handler_t> alloc(
+ (get_associated_allocator)(handler));
+
+ asio::prefer(
+ asio::require(ex_, execution::blocking.never),
+ execution::relationship.continuation,
+ execution::allocator(alloc)
+ ).execute(
+ detail::work_dispatcher<handler_t, handler_ex_t>(
+ static_cast<CompletionHandler&&>(handler), handler_ex));
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ !execution::is_executor<
+ conditional_t<true, executor_type, CompletionHandler>
+ >::value
+ >* = 0,
+ enable_if_t<
+ !detail::is_work_dispatcher_required<
+ decay_t<CompletionHandler>,
+ Executor
+ >::value
+ >* = 0) const
+ {
+ associated_allocator_t<decay_t<CompletionHandler>> alloc(
+ (get_associated_allocator)(handler));
+
+ ex_.defer(asio::detail::bind_handler(
+ static_cast<CompletionHandler&&>(handler)), alloc);
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ !execution::is_executor<
+ conditional_t<true, executor_type, CompletionHandler>
+ >::value
+ >* = 0,
+ enable_if_t<
+ detail::is_work_dispatcher_required<
+ decay_t<CompletionHandler>,
+ Executor
+ >::value
+ >* = 0) const
+ {
+ typedef decay_t<CompletionHandler> handler_t;
+
+ typedef associated_executor_t<handler_t, Executor> handler_ex_t;
+ handler_ex_t handler_ex((get_associated_executor)(handler, ex_));
+
+ associated_allocator_t<handler_t> alloc(
+ (get_associated_allocator)(handler));
+
+ ex_.defer(detail::work_dispatcher<handler_t, handler_ex_t>(
+ static_cast<CompletionHandler&&>(handler), handler_ex), alloc);
+ }
+
+private:
+ Executor ex_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_INITIATE_DEFER_HPP
diff --git a/3rdparty/asio/include/asio/detail/initiate_dispatch.hpp b/3rdparty/asio/include/asio/detail/initiate_dispatch.hpp
new file mode 100644
index 00000000000..ba2f68f0579
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/initiate_dispatch.hpp
@@ -0,0 +1,193 @@
+//
+// detail/initiate_dispatch.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_INITIATE_DISPATCH_HPP
+#define ASIO_DETAIL_INITIATE_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/execution/allocator.hpp"
+#include "asio/execution/blocking.hpp"
+#include "asio/prefer.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class initiate_dispatch
+{
+public:
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ execution::is_executor<
+ associated_executor_t<decay_t<CompletionHandler>>
+ >::value
+ >* = 0) const
+ {
+ associated_executor_t<decay_t<CompletionHandler>> ex(
+ (get_associated_executor)(handler));
+
+ associated_allocator_t<decay_t<CompletionHandler>> alloc(
+ (get_associated_allocator)(handler));
+
+ asio::prefer(ex, execution::allocator(alloc)).execute(
+ asio::detail::bind_handler(
+ static_cast<CompletionHandler&&>(handler)));
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ !execution::is_executor<
+ associated_executor_t<decay_t<CompletionHandler>>
+ >::value
+ >* = 0) const
+ {
+ associated_executor_t<decay_t<CompletionHandler>> ex(
+ (get_associated_executor)(handler));
+
+ associated_allocator_t<decay_t<CompletionHandler>> alloc(
+ (get_associated_allocator)(handler));
+
+ ex.dispatch(asio::detail::bind_handler(
+ static_cast<CompletionHandler&&>(handler)), alloc);
+ }
+};
+
+template <typename Executor>
+class initiate_dispatch_with_executor
+{
+public:
+ typedef Executor executor_type;
+
+ explicit initiate_dispatch_with_executor(const Executor& ex)
+ : ex_(ex)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return ex_;
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ execution::is_executor<
+ conditional_t<true, executor_type, CompletionHandler>
+ >::value
+ >* = 0,
+ enable_if_t<
+ !detail::is_work_dispatcher_required<
+ decay_t<CompletionHandler>,
+ Executor
+ >::value
+ >* = 0) const
+ {
+ associated_allocator_t<decay_t<CompletionHandler>> alloc(
+ (get_associated_allocator)(handler));
+
+ asio::prefer(ex_, execution::allocator(alloc)).execute(
+ asio::detail::bind_handler(
+ static_cast<CompletionHandler&&>(handler)));
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ execution::is_executor<
+ conditional_t<true, executor_type, CompletionHandler>
+ >::value
+ >* = 0,
+ enable_if_t<
+ detail::is_work_dispatcher_required<
+ decay_t<CompletionHandler>,
+ Executor
+ >::value
+ >* = 0) const
+ {
+ typedef decay_t<CompletionHandler> handler_t;
+
+ typedef associated_executor_t<handler_t, Executor> handler_ex_t;
+ handler_ex_t handler_ex((get_associated_executor)(handler, ex_));
+
+ associated_allocator_t<handler_t> alloc(
+ (get_associated_allocator)(handler));
+
+ asio::prefer(ex_, execution::allocator(alloc)).execute(
+ detail::work_dispatcher<handler_t, handler_ex_t>(
+ static_cast<CompletionHandler&&>(handler), handler_ex));
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ !execution::is_executor<
+ conditional_t<true, executor_type, CompletionHandler>
+ >::value
+ >* = 0,
+ enable_if_t<
+ !detail::is_work_dispatcher_required<
+ decay_t<CompletionHandler>,
+ Executor
+ >::value
+ >* = 0) const
+ {
+ associated_allocator_t<decay_t<CompletionHandler>> alloc(
+ (get_associated_allocator)(handler));
+
+ ex_.dispatch(asio::detail::bind_handler(
+ static_cast<CompletionHandler&&>(handler)), alloc);
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ !execution::is_executor<
+ conditional_t<true, executor_type, CompletionHandler>
+ >::value
+ >* = 0,
+ enable_if_t<
+ detail::is_work_dispatcher_required<
+ decay_t<CompletionHandler>,
+ Executor
+ >::value
+ >* = 0) const
+ {
+ typedef decay_t<CompletionHandler> handler_t;
+
+ typedef associated_executor_t<handler_t, Executor> handler_ex_t;
+ handler_ex_t handler_ex((get_associated_executor)(handler, ex_));
+
+ associated_allocator_t<handler_t> alloc(
+ (get_associated_allocator)(handler));
+
+ ex_.dispatch(detail::work_dispatcher<handler_t, handler_ex_t>(
+ static_cast<CompletionHandler&&>(handler), handler_ex), alloc);
+ }
+
+private:
+ Executor ex_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_INITIATE_DISPATCH_HPP
diff --git a/3rdparty/asio/include/asio/detail/initiate_post.hpp b/3rdparty/asio/include/asio/detail/initiate_post.hpp
new file mode 100644
index 00000000000..f73c8ee0b81
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/initiate_post.hpp
@@ -0,0 +1,207 @@
+//
+// detail/initiate_post.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_INITIATE_POST_HPP
+#define ASIO_DETAIL_INITIATE_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/execution/allocator.hpp"
+#include "asio/execution/blocking.hpp"
+#include "asio/execution/relationship.hpp"
+#include "asio/prefer.hpp"
+#include "asio/require.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class initiate_post
+{
+public:
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ execution::is_executor<
+ associated_executor_t<decay_t<CompletionHandler>>
+ >::value
+ >* = 0) const
+ {
+ associated_executor_t<decay_t<CompletionHandler>> ex(
+ (get_associated_executor)(handler));
+
+ associated_allocator_t<decay_t<CompletionHandler>> alloc(
+ (get_associated_allocator)(handler));
+
+ asio::prefer(
+ asio::require(ex, execution::blocking.never),
+ execution::relationship.fork,
+ execution::allocator(alloc)
+ ).execute(
+ asio::detail::bind_handler(
+ static_cast<CompletionHandler&&>(handler)));
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ !execution::is_executor<
+ associated_executor_t<decay_t<CompletionHandler>>
+ >::value
+ >* = 0) const
+ {
+ associated_executor_t<decay_t<CompletionHandler>> ex(
+ (get_associated_executor)(handler));
+
+ associated_allocator_t<decay_t<CompletionHandler>> alloc(
+ (get_associated_allocator)(handler));
+
+ ex.post(asio::detail::bind_handler(
+ static_cast<CompletionHandler&&>(handler)), alloc);
+ }
+};
+
+template <typename Executor>
+class initiate_post_with_executor
+{
+public:
+ typedef Executor executor_type;
+
+ explicit initiate_post_with_executor(const Executor& ex)
+ : ex_(ex)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return ex_;
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ execution::is_executor<
+ conditional_t<true, executor_type, CompletionHandler>
+ >::value
+ >* = 0,
+ enable_if_t<
+ !detail::is_work_dispatcher_required<
+ decay_t<CompletionHandler>,
+ Executor
+ >::value
+ >* = 0) const
+ {
+ associated_allocator_t<decay_t<CompletionHandler>> alloc(
+ (get_associated_allocator)(handler));
+
+ asio::prefer(
+ asio::require(ex_, execution::blocking.never),
+ execution::relationship.fork,
+ execution::allocator(alloc)
+ ).execute(
+ asio::detail::bind_handler(
+ static_cast<CompletionHandler&&>(handler)));
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ execution::is_executor<
+ conditional_t<true, executor_type, CompletionHandler>
+ >::value
+ >* = 0,
+ enable_if_t<
+ detail::is_work_dispatcher_required<
+ decay_t<CompletionHandler>,
+ Executor
+ >::value
+ >* = 0) const
+ {
+ typedef decay_t<CompletionHandler> handler_t;
+
+ typedef associated_executor_t<handler_t, Executor> handler_ex_t;
+ handler_ex_t handler_ex((get_associated_executor)(handler, ex_));
+
+ associated_allocator_t<handler_t> alloc(
+ (get_associated_allocator)(handler));
+
+ asio::prefer(
+ asio::require(ex_, execution::blocking.never),
+ execution::relationship.fork,
+ execution::allocator(alloc)
+ ).execute(
+ detail::work_dispatcher<handler_t, handler_ex_t>(
+ static_cast<CompletionHandler&&>(handler), handler_ex));
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ !execution::is_executor<
+ conditional_t<true, executor_type, CompletionHandler>
+ >::value
+ >* = 0,
+ enable_if_t<
+ !detail::is_work_dispatcher_required<
+ decay_t<CompletionHandler>,
+ Executor
+ >::value
+ >* = 0) const
+ {
+ associated_allocator_t<decay_t<CompletionHandler>> alloc(
+ (get_associated_allocator)(handler));
+
+ ex_.post(asio::detail::bind_handler(
+ static_cast<CompletionHandler&&>(handler)), alloc);
+ }
+
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& handler,
+ enable_if_t<
+ !execution::is_executor<
+ conditional_t<true, executor_type, CompletionHandler>
+ >::value
+ >* = 0,
+ enable_if_t<
+ detail::is_work_dispatcher_required<
+ decay_t<CompletionHandler>,
+ Executor
+ >::value
+ >* = 0) const
+ {
+ typedef decay_t<CompletionHandler> handler_t;
+
+ typedef associated_executor_t<handler_t, Executor> handler_ex_t;
+ handler_ex_t handler_ex((get_associated_executor)(handler, ex_));
+
+ associated_allocator_t<handler_t> alloc(
+ (get_associated_allocator)(handler));
+
+ ex_.post(detail::work_dispatcher<handler_t, handler_ex_t>(
+ static_cast<CompletionHandler&&>(handler), handler_ex), alloc);
+ }
+
+private:
+ Executor ex_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_INITIATE_POST_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_control.hpp b/3rdparty/asio/include/asio/detail/io_control.hpp
new file mode 100644
index 00000000000..14daf85730a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_control.hpp
@@ -0,0 +1,84 @@
+//
+// detail/io_control.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#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<detail::ioctl_arg_type>(value))
+ {
+ }
+
+ // Get the name of the IO control command.
+ int name() const
+ {
+ return static_cast<int>(ASIO_OS_DEF(FIONREAD));
+ }
+
+ // Set the value of the I/O control command.
+ void set(std::size_t value)
+ {
+ value_ = static_cast<detail::ioctl_arg_type>(value);
+ }
+
+ // Get the current value of the I/O control command.
+ std::size_t get() const
+ {
+ return static_cast<std::size_t>(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/3rdparty/asio/include/asio/detail/io_object_impl.hpp b/3rdparty/asio/include/asio/detail/io_object_impl.hpp
new file mode 100644
index 00000000000..bd7312b8491
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_object_impl.hpp
@@ -0,0 +1,177 @@
+//
+// detail/io_object_impl.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_OBJECT_IMPL_HPP
+#define ASIO_DETAIL_IO_OBJECT_IMPL_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include <new>
+#include "asio/detail/config.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/execution/context.hpp"
+#include "asio/io_context.hpp"
+#include "asio/query.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename IoObjectService,
+ typename Executor = io_context::executor_type>
+class io_object_impl
+{
+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;
+
+ // The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ // Construct an I/O object using an executor.
+ explicit io_object_impl(int, const executor_type& ex)
+ : service_(&asio::use_service<IoObjectService>(
+ io_object_impl::get_context(ex))),
+ executor_(ex)
+ {
+ service_->construct(implementation_);
+ }
+
+ // Construct an I/O object using an execution context.
+ template <typename ExecutionContext>
+ explicit io_object_impl(int, int, ExecutionContext& context)
+ : service_(&asio::use_service<IoObjectService>(context)),
+ executor_(context.get_executor())
+ {
+ service_->construct(implementation_);
+ }
+
+ // Move-construct an I/O object.
+ io_object_impl(io_object_impl&& other)
+ : service_(&other.get_service()),
+ executor_(other.get_executor())
+ {
+ service_->move_construct(implementation_, other.implementation_);
+ }
+
+ // Perform converting move-construction of an I/O object on the same service.
+ template <typename Executor1>
+ io_object_impl(io_object_impl<IoObjectService, Executor1>&& other)
+ : service_(&other.get_service()),
+ executor_(other.get_executor())
+ {
+ service_->move_construct(implementation_, other.get_implementation());
+ }
+
+ // Perform converting move-construction of an I/O object on another service.
+ template <typename IoObjectService1, typename Executor1>
+ io_object_impl(io_object_impl<IoObjectService1, Executor1>&& other)
+ : service_(&asio::use_service<IoObjectService>(
+ io_object_impl::get_context(other.get_executor()))),
+ executor_(other.get_executor())
+ {
+ service_->converting_move_construct(implementation_,
+ other.get_service(), other.get_implementation());
+ }
+
+ // Destructor.
+ ~io_object_impl()
+ {
+ service_->destroy(implementation_);
+ }
+
+ // Move-assign an I/O object.
+ io_object_impl& operator=(io_object_impl&& other)
+ {
+ if (this != &other)
+ {
+ service_->move_assign(implementation_,
+ *other.service_, other.implementation_);
+ executor_.~executor_type();
+ new (&executor_) executor_type(other.executor_);
+ service_ = other.service_;
+ }
+ return *this;
+ }
+
+ // Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return executor_;
+ }
+
+ // 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:
+ // Helper function to get an executor's context.
+ template <typename T>
+ static execution_context& get_context(const T& t,
+ enable_if_t<execution::is_executor<T>::value>* = 0)
+ {
+ return asio::query(t, execution::context);
+ }
+
+ // Helper function to get an executor's context.
+ template <typename T>
+ static execution_context& get_context(const T& t,
+ enable_if_t<!execution::is_executor<T>::value>* = 0)
+ {
+ return t.context();
+ }
+
+ // Disallow copying and copy assignment.
+ io_object_impl(const io_object_impl&);
+ io_object_impl& operator=(const io_object_impl&);
+
+ // The service associated with the I/O object.
+ service_type* service_;
+
+ // The underlying implementation of the I/O object.
+ implementation_type implementation_;
+
+ // The associated executor.
+ executor_type executor_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_IO_OBJECT_IMPL_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_descriptor_read_at_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_descriptor_read_at_op.hpp
new file mode 100644
index 00000000000..114bdb54297
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_descriptor_read_at_op.hpp
@@ -0,0 +1,195 @@
+//
+// detail/io_uring_descriptor_read_at_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_DESCRIPTOR_READ_AT_OP_HPP
+#define ASIO_DETAIL_IO_URING_DESCRIPTOR_READ_AT_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_IO_URING)
+
+#include "asio/detail/bind_handler.hpp"
+#include "asio/detail/buffer_sequence_adapter.hpp"
+#include "asio/detail/cstdint.hpp"
+#include "asio/detail/descriptor_ops.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/handler_work.hpp"
+#include "asio/detail/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename MutableBufferSequence>
+class io_uring_descriptor_read_at_op_base : public io_uring_operation
+{
+public:
+ io_uring_descriptor_read_at_op_base(
+ const asio::error_code& success_ec, int descriptor,
+ descriptor_ops::state_type state, uint64_t offset,
+ const MutableBufferSequence& buffers, func_type complete_func)
+ : io_uring_operation(success_ec,
+ &io_uring_descriptor_read_at_op_base::do_prepare,
+ &io_uring_descriptor_read_at_op_base::do_perform, complete_func),
+ descriptor_(descriptor),
+ state_(state),
+ offset_(offset),
+ buffers_(buffers),
+ bufs_(buffers)
+ {
+ }
+
+ static void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_descriptor_read_at_op_base* o(
+ static_cast<io_uring_descriptor_read_at_op_base*>(base));
+
+ if ((o->state_ & descriptor_ops::internal_non_blocking) != 0)
+ {
+ ::io_uring_prep_poll_add(sqe, o->descriptor_, POLLIN);
+ }
+ else if (o->bufs_.is_single_buffer && o->bufs_.is_registered_buffer)
+ {
+ ::io_uring_prep_read_fixed(sqe, o->descriptor_,
+ o->bufs_.buffers()->iov_base, o->bufs_.buffers()->iov_len,
+ o->offset_, o->bufs_.registered_id().native_handle());
+ }
+ else
+ {
+ ::io_uring_prep_readv(sqe, o->descriptor_,
+ o->bufs_.buffers(), o->bufs_.count(), o->offset_);
+ }
+ }
+
+ static bool do_perform(io_uring_operation* base, bool after_completion)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_descriptor_read_at_op_base* o(
+ static_cast<io_uring_descriptor_read_at_op_base*>(base));
+
+ if ((o->state_ & descriptor_ops::internal_non_blocking) != 0)
+ {
+ if (o->bufs_.is_single_buffer)
+ {
+ return descriptor_ops::non_blocking_read_at1(o->descriptor_,
+ o->offset_, o->bufs_.first(o->buffers_).data(),
+ o->bufs_.first(o->buffers_).size(), o->ec_,
+ o->bytes_transferred_);
+ }
+ else
+ {
+ return descriptor_ops::non_blocking_read_at(o->descriptor_,
+ o->offset_, o->bufs_.buffers(), o->bufs_.count(),
+ o->ec_, o->bytes_transferred_);
+ }
+ }
+ else if (after_completion)
+ {
+ if (!o->ec_ && o->bytes_transferred_ == 0)
+ o->ec_ = asio::error::eof;
+ }
+
+ if (o->ec_ && o->ec_ == asio::error::would_block)
+ {
+ o->state_ |= descriptor_ops::internal_non_blocking;
+ return false;
+ }
+
+ return after_completion;
+ }
+
+private:
+ int descriptor_;
+ descriptor_ops::state_type state_;
+ uint64_t offset_;
+ MutableBufferSequence buffers_;
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_;
+};
+
+template <typename MutableBufferSequence, typename Handler, typename IoExecutor>
+class io_uring_descriptor_read_at_op
+ : public io_uring_descriptor_read_at_op_base<MutableBufferSequence>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_descriptor_read_at_op);
+
+ io_uring_descriptor_read_at_op(const asio::error_code& success_ec,
+ int descriptor, descriptor_ops::state_type state, uint64_t offset,
+ const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ : io_uring_descriptor_read_at_op_base<MutableBufferSequence>(
+ success_ec, descriptor, state, offset, buffers,
+ &io_uring_descriptor_read_at_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_descriptor_read_at_op* o
+ (static_cast<io_uring_descriptor_read_at_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_DESCRIPTOR_READ_AT_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_descriptor_read_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_descriptor_read_op.hpp
new file mode 100644
index 00000000000..9f8cf70bca3
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_descriptor_read_op.hpp
@@ -0,0 +1,190 @@
+//
+// detail/io_uring_descriptor_read_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_DESCRIPTOR_READ_OP_HPP
+#define ASIO_DETAIL_IO_URING_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_HAS_IO_URING)
+
+#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/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename MutableBufferSequence>
+class io_uring_descriptor_read_op_base : public io_uring_operation
+{
+public:
+ io_uring_descriptor_read_op_base(const asio::error_code& success_ec,
+ int descriptor, descriptor_ops::state_type state,
+ const MutableBufferSequence& buffers, func_type complete_func)
+ : io_uring_operation(success_ec,
+ &io_uring_descriptor_read_op_base::do_prepare,
+ &io_uring_descriptor_read_op_base::do_perform, complete_func),
+ descriptor_(descriptor),
+ state_(state),
+ buffers_(buffers),
+ bufs_(buffers)
+ {
+ }
+
+ static void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_descriptor_read_op_base* o(
+ static_cast<io_uring_descriptor_read_op_base*>(base));
+
+ if ((o->state_ & descriptor_ops::internal_non_blocking) != 0)
+ {
+ ::io_uring_prep_poll_add(sqe, o->descriptor_, POLLIN);
+ }
+ else if (o->bufs_.is_single_buffer && o->bufs_.is_registered_buffer)
+ {
+ ::io_uring_prep_read_fixed(sqe, o->descriptor_,
+ o->bufs_.buffers()->iov_base, o->bufs_.buffers()->iov_len,
+ 0, o->bufs_.registered_id().native_handle());
+ }
+ else
+ {
+ ::io_uring_prep_readv(sqe, o->descriptor_,
+ o->bufs_.buffers(), o->bufs_.count(), -1);
+ }
+ }
+
+ static bool do_perform(io_uring_operation* base, bool after_completion)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_descriptor_read_op_base* o(
+ static_cast<io_uring_descriptor_read_op_base*>(base));
+
+ if ((o->state_ & descriptor_ops::internal_non_blocking) != 0)
+ {
+ if (o->bufs_.is_single_buffer)
+ {
+ return descriptor_ops::non_blocking_read1(
+ o->descriptor_, o->bufs_.first(o->buffers_).data(),
+ o->bufs_.first(o->buffers_).size(), o->ec_,
+ o->bytes_transferred_);
+ }
+ else
+ {
+ return descriptor_ops::non_blocking_read(
+ o->descriptor_, o->bufs_.buffers(), o->bufs_.count(),
+ o->ec_, o->bytes_transferred_);
+ }
+ }
+ else if (after_completion)
+ {
+ if (!o->ec_ && o->bytes_transferred_ == 0)
+ o->ec_ = asio::error::eof;
+ }
+
+ if (o->ec_ && o->ec_ == asio::error::would_block)
+ {
+ o->state_ |= descriptor_ops::internal_non_blocking;
+ return false;
+ }
+
+ return after_completion;
+ }
+
+private:
+ int descriptor_;
+ descriptor_ops::state_type state_;
+ MutableBufferSequence buffers_;
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_;
+};
+
+template <typename MutableBufferSequence, typename Handler, typename IoExecutor>
+class io_uring_descriptor_read_op
+ : public io_uring_descriptor_read_op_base<MutableBufferSequence>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_descriptor_read_op);
+
+ io_uring_descriptor_read_op(const asio::error_code& success_ec,
+ int descriptor, descriptor_ops::state_type state,
+ const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ : io_uring_descriptor_read_op_base<MutableBufferSequence>(success_ec,
+ descriptor, state, buffers, &io_uring_descriptor_read_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_descriptor_read_op* o
+ (static_cast<io_uring_descriptor_read_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_DESCRIPTOR_READ_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_descriptor_service.hpp b/3rdparty/asio/include/asio/detail/io_uring_descriptor_service.hpp
new file mode 100644
index 00000000000..04d1e36edd8
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_descriptor_service.hpp
@@ -0,0 +1,687 @@
+//
+// detail/io_uring_descriptor_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_DESCRIPTOR_SERVICE_HPP
+#define ASIO_DETAIL_IO_URING_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_HAS_IO_URING)
+
+#include "asio/associated_cancellation_slot.hpp"
+#include "asio/buffer.hpp"
+#include "asio/cancellation_type.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/detail/buffer_sequence_adapter.hpp"
+#include "asio/detail/descriptor_ops.hpp"
+#include "asio/detail/io_uring_descriptor_read_at_op.hpp"
+#include "asio/detail/io_uring_descriptor_read_op.hpp"
+#include "asio/detail/io_uring_descriptor_write_at_op.hpp"
+#include "asio/detail/io_uring_descriptor_write_op.hpp"
+#include "asio/detail/io_uring_null_buffers_op.hpp"
+#include "asio/detail/io_uring_service.hpp"
+#include "asio/detail/io_uring_wait_op.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/noncopyable.hpp"
+#include "asio/posix/descriptor_base.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class io_uring_descriptor_service :
+ public execution_context_service_base<io_uring_descriptor_service>
+{
+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 io_uring_descriptor_service;
+
+ // The native descriptor representation.
+ int descriptor_;
+
+ // The current state of the descriptor.
+ descriptor_ops::state_type state_;
+
+ // Per I/O object data used by the io_uring_service.
+ io_uring_service::per_io_object_data io_object_data_;
+ };
+
+ // Constructor.
+ ASIO_DECL io_uring_descriptor_service(execution_context& 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) noexcept;
+
+ // Move-assign from another descriptor implementation.
+ ASIO_DECL void move_assign(implementation_type& impl,
+ io_uring_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);
+
+ // Release ownership of the native descriptor representation.
+ native_handle_type release(implementation_type& impl,
+ asio::error_code& ec)
+ {
+ ec = success_ec_;
+ return release(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 <typename IO_Control_Command>
+ 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<ioctl_arg_type*>(command.data()), ec);
+ ASIO_ERROR_LOCATION(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);
+ ASIO_ERROR_LOCATION(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);
+ ASIO_ERROR_LOCATION(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;
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Asynchronously wait for the descriptor to become ready to read, ready to
+ // write, or to have pending error conditions.
+ template <typename Handler, typename IoExecutor>
+ void async_wait(implementation_type& impl,
+ posix::descriptor_base::wait_type w,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ int op_type;
+ int poll_flags;
+ switch (w)
+ {
+ case posix::descriptor_base::wait_read:
+ op_type = io_uring_service::read_op;
+ poll_flags = POLLIN;
+ break;
+ case posix::descriptor_base::wait_write:
+ op_type = io_uring_service::write_op;
+ poll_flags = POLLOUT;
+ break;
+ case posix::descriptor_base::wait_error:
+ op_type = io_uring_service::except_op;
+ poll_flags = POLLPRI | POLLERR | POLLHUP;
+ break;
+ default:
+ op_type = -1;
+ poll_flags = -1;
+ return;
+ }
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_wait_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.descriptor_,
+ poll_flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected() && op_type != -1)
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(
+ &io_uring_service_, &impl.io_object_data_, op_type);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "descriptor", &impl, impl.descriptor_, "async_wait"));
+
+ start_op(impl, op_type, p.p, is_continuation, op_type == -1);
+ p.v = p.p = 0;
+ }
+
+ // Write some data to the descriptor.
+ template <typename ConstBufferSequence>
+ size_t write_some(implementation_type& impl,
+ const ConstBufferSequence& buffers, asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs_type;
+
+ size_t n;
+ if (bufs_type::is_single_buffer)
+ {
+ n = descriptor_ops::sync_write1(impl.descriptor_,
+ impl.state_, bufs_type::first(buffers).data(),
+ bufs_type::first(buffers).size(), ec);
+ }
+ else
+ {
+ bufs_type bufs(buffers);
+
+ n = descriptor_ops::sync_write(impl.descriptor_, impl.state_,
+ bufs.buffers(), bufs.count(), bufs.all_empty(), ec);
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return n;
+ }
+
+ // 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);
+
+ ASIO_ERROR_LOCATION(ec);
+ return 0;
+ }
+
+ // Start an asynchronous write. The data being sent must be valid for the
+ // lifetime of the asynchronous operation.
+ template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_write_some(implementation_type& impl,
+ const ConstBufferSequence& buffers, Handler& handler,
+ const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_descriptor_write_op<
+ ConstBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.descriptor_,
+ impl.state_, buffers, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::write_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "descriptor", &impl, impl.descriptor_, "async_write_some"));
+
+ start_op(impl, io_uring_service::write_op, p.p, is_continuation,
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence>::all_empty(buffers));
+ p.v = p.p = 0;
+ }
+
+ // Start an asynchronous wait until data can be written without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_write_some(implementation_type& impl,
+ const null_buffers&, Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.descriptor_, POLLOUT, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::write_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(),
+ *p.p, "descriptor", &impl, impl.descriptor_,
+ "async_write_some(null_buffers)"));
+
+ start_op(impl, io_uring_service::write_op, p.p, is_continuation, false);
+ p.v = p.p = 0;
+ }
+
+ // Write some data to the descriptor at the specified offset.
+ template <typename ConstBufferSequence>
+ size_t write_some_at(implementation_type& impl, uint64_t offset,
+ const ConstBufferSequence& buffers, asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs_type;
+
+ size_t n;
+ if (bufs_type::is_single_buffer)
+ {
+ n = descriptor_ops::sync_write_at1(impl.descriptor_,
+ impl.state_, offset, bufs_type::first(buffers).data(),
+ bufs_type::first(buffers).size(), ec);
+ }
+ else
+ {
+ bufs_type bufs(buffers);
+
+ n = descriptor_ops::sync_write_at(impl.descriptor_, impl.state_,
+ offset, bufs.buffers(), bufs.count(), bufs.all_empty(), ec);
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return n;
+ }
+
+ // Wait until data can be written without blocking.
+ size_t write_some_at(implementation_type& impl, uint64_t,
+ const null_buffers& buffers, asio::error_code& ec)
+ {
+ return write_some(impl, buffers, ec);
+ }
+
+ // Start an asynchronous write at the specified offset. The data being sent
+ // must be valid for the lifetime of the asynchronous operation.
+ template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_write_some_at(implementation_type& impl, uint64_t offset,
+ const ConstBufferSequence& buffers, Handler& handler,
+ const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_descriptor_write_at_op<
+ ConstBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.descriptor_,
+ impl.state_, offset, buffers, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::write_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "descriptor", &impl, impl.descriptor_, "async_write_some"));
+
+ start_op(impl, io_uring_service::write_op, p.p, is_continuation,
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence>::all_empty(buffers));
+ p.v = p.p = 0;
+ }
+
+ // Start an asynchronous wait until data can be written without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_write_some_at(implementation_type& impl,
+ const null_buffers& buffers, Handler& handler, const IoExecutor& io_ex)
+ {
+ return async_write_some(impl, buffers, handler, io_ex);
+ }
+
+ // Read some data from the stream. Returns the number of bytes read.
+ template <typename MutableBufferSequence>
+ size_t read_some(implementation_type& impl,
+ const MutableBufferSequence& buffers, asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_type;
+
+ size_t n;
+ if (bufs_type::is_single_buffer)
+ {
+ n = descriptor_ops::sync_read1(impl.descriptor_,
+ impl.state_, bufs_type::first(buffers).data(),
+ bufs_type::first(buffers).size(), ec);
+ }
+ else
+ {
+ bufs_type bufs(buffers);
+
+ n = descriptor_ops::sync_read(impl.descriptor_, impl.state_,
+ bufs.buffers(), bufs.count(), bufs.all_empty(), ec);
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return n;
+ }
+
+ // 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);
+
+ ASIO_ERROR_LOCATION(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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_read_some(implementation_type& impl,
+ const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_descriptor_read_op<
+ MutableBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.descriptor_,
+ impl.state_, buffers, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::read_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "descriptor", &impl, impl.descriptor_, "async_read_some"));
+
+ start_op(impl, io_uring_service::read_op, p.p, is_continuation,
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence>::all_empty(buffers));
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be read without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_read_some(implementation_type& impl,
+ const null_buffers&, Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.descriptor_, POLLIN, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::read_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(),
+ *p.p, "descriptor", &impl, impl.descriptor_,
+ "async_read_some(null_buffers)"));
+
+ start_op(impl, io_uring_service::read_op, p.p, is_continuation, false);
+ p.v = p.p = 0;
+ }
+
+ // Read some data at the specified offset. Returns the number of bytes read.
+ template <typename MutableBufferSequence>
+ size_t read_some_at(implementation_type& impl, uint64_t offset,
+ const MutableBufferSequence& buffers, asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_type;
+
+ if (bufs_type::is_single_buffer)
+ {
+ return descriptor_ops::sync_read_at1(impl.descriptor_,
+ impl.state_, offset, bufs_type::first(buffers).data(),
+ bufs_type::first(buffers).size(), ec);
+ }
+ else
+ {
+ bufs_type bufs(buffers);
+
+ return descriptor_ops::sync_read_at(impl.descriptor_, impl.state_,
+ offset, bufs.buffers(), bufs.count(), bufs.all_empty(), ec);
+ }
+ }
+
+ // Wait until data can be read without blocking.
+ size_t read_some_at(implementation_type& impl, uint64_t,
+ const null_buffers& buffers, asio::error_code& ec)
+ {
+ return read_some(impl, buffers, ec);
+ }
+
+ // Start an asynchronous read. The buffer for the data being read must be
+ // valid for the lifetime of the asynchronous operation.
+ template <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_read_some_at(implementation_type& impl,
+ uint64_t offset, const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_descriptor_read_at_op<
+ MutableBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.descriptor_,
+ impl.state_, offset, buffers, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::read_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "descriptor", &impl, impl.descriptor_, "async_read_some"));
+
+ start_op(impl, io_uring_service::read_op, p.p, is_continuation,
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence>::all_empty(buffers));
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be read without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_read_some_at(implementation_type& impl, uint64_t,
+ const null_buffers& buffers, Handler& handler, const IoExecutor& io_ex)
+ {
+ return async_read_some(impl, buffers, handler, io_ex);
+ }
+
+private:
+ // Start the asynchronous operation.
+ ASIO_DECL void start_op(implementation_type& impl, int op_type,
+ io_uring_operation* op, bool is_continuation, bool noop);
+
+ // Helper class used to implement per-operation cancellation
+ class io_uring_op_cancellation
+ {
+ public:
+ io_uring_op_cancellation(io_uring_service* s,
+ io_uring_service::per_io_object_data* p, int o)
+ : io_uring_service_(s),
+ io_object_data_(p),
+ op_type_(o)
+ {
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ if (!!(type &
+ (cancellation_type::terminal
+ | cancellation_type::partial
+ | cancellation_type::total)))
+ {
+ io_uring_service_->cancel_ops_by_key(*io_object_data_, op_type_, this);
+ }
+ }
+
+ private:
+ io_uring_service* io_uring_service_;
+ io_uring_service::per_io_object_data* io_object_data_;
+ int op_type_;
+ };
+
+ // The io_uring_service that performs event demultiplexing for the service.
+ io_uring_service& io_uring_service_;
+
+ // Cached success value to avoid accessing category singleton.
+ const asio::error_code success_ec_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#if defined(ASIO_HEADER_ONLY)
+# include "asio/detail/impl/io_uring_descriptor_service.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_DESCRIPTOR_SERVICE_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_descriptor_write_at_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_descriptor_write_at_op.hpp
new file mode 100644
index 00000000000..10a3f7a6c3d
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_descriptor_write_at_op.hpp
@@ -0,0 +1,189 @@
+//
+// detail/io_uring_descriptor_write_at_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_DESCRIPTOR_WRITE_AT_OP_HPP
+#define ASIO_DETAIL_IO_URING_DESCRIPTOR_WRITE_AT_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_IO_URING)
+
+#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/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename ConstBufferSequence>
+class io_uring_descriptor_write_at_op_base : public io_uring_operation
+{
+public:
+ io_uring_descriptor_write_at_op_base(
+ const asio::error_code& success_ec, int descriptor,
+ descriptor_ops::state_type state, uint64_t offset,
+ const ConstBufferSequence& buffers, func_type complete_func)
+ : io_uring_operation(success_ec,
+ &io_uring_descriptor_write_at_op_base::do_prepare,
+ &io_uring_descriptor_write_at_op_base::do_perform, complete_func),
+ descriptor_(descriptor),
+ state_(state),
+ offset_(offset),
+ buffers_(buffers),
+ bufs_(buffers)
+ {
+ }
+
+ static void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_descriptor_write_at_op_base* o(
+ static_cast<io_uring_descriptor_write_at_op_base*>(base));
+
+ if ((o->state_ & descriptor_ops::internal_non_blocking) != 0)
+ {
+ ::io_uring_prep_poll_add(sqe, o->descriptor_, POLLOUT);
+ }
+ else if (o->bufs_.is_single_buffer && o->bufs_.is_registered_buffer)
+ {
+ ::io_uring_prep_write_fixed(sqe, o->descriptor_,
+ o->bufs_.buffers()->iov_base, o->bufs_.buffers()->iov_len,
+ o->offset_, o->bufs_.registered_id().native_handle());
+ }
+ else
+ {
+ ::io_uring_prep_writev(sqe, o->descriptor_,
+ o->bufs_.buffers(), o->bufs_.count(), o->offset_);
+ }
+ }
+
+ static bool do_perform(io_uring_operation* base, bool after_completion)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_descriptor_write_at_op_base* o(
+ static_cast<io_uring_descriptor_write_at_op_base*>(base));
+
+ if ((o->state_ & descriptor_ops::internal_non_blocking) != 0)
+ {
+ if (o->bufs_.is_single_buffer)
+ {
+ return descriptor_ops::non_blocking_write_at1(o->descriptor_,
+ o->offset_, o->bufs_.first(o->buffers_).data(),
+ o->bufs_.first(o->buffers_).size(), o->ec_,
+ o->bytes_transferred_);
+ }
+ else
+ {
+ return descriptor_ops::non_blocking_write_at(o->descriptor_,
+ o->offset_, o->bufs_.buffers(), o->bufs_.count(),
+ o->ec_, o->bytes_transferred_);
+ }
+ }
+
+ if (o->ec_ && o->ec_ == asio::error::would_block)
+ {
+ o->state_ |= descriptor_ops::internal_non_blocking;
+ return false;
+ }
+
+ return after_completion;
+ }
+
+private:
+ int descriptor_;
+ descriptor_ops::state_type state_;
+ uint64_t offset_;
+ ConstBufferSequence buffers_;
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs_;
+};
+
+template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+class io_uring_descriptor_write_at_op
+ : public io_uring_descriptor_write_at_op_base<ConstBufferSequence>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_descriptor_write_at_op);
+
+ io_uring_descriptor_write_at_op(const asio::error_code& success_ec,
+ int descriptor, descriptor_ops::state_type state, uint64_t offset,
+ const ConstBufferSequence& buffers, Handler& handler,
+ const IoExecutor& io_ex)
+ : io_uring_descriptor_write_at_op_base<ConstBufferSequence>(
+ success_ec, descriptor, state, offset, buffers,
+ &io_uring_descriptor_write_at_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_descriptor_write_at_op* o
+ (static_cast<io_uring_descriptor_write_at_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_DESCRIPTOR_WRITE_AT_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_descriptor_write_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_descriptor_write_op.hpp
new file mode 100644
index 00000000000..090d644c7c8
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_descriptor_write_op.hpp
@@ -0,0 +1,185 @@
+//
+// detail/io_uring_descriptor_write_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_DESCRIPTOR_WRITE_OP_HPP
+#define ASIO_DETAIL_IO_URING_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_HAS_IO_URING)
+
+#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/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename ConstBufferSequence>
+class io_uring_descriptor_write_op_base : public io_uring_operation
+{
+public:
+ io_uring_descriptor_write_op_base(const asio::error_code& success_ec,
+ int descriptor, descriptor_ops::state_type state,
+ const ConstBufferSequence& buffers, func_type complete_func)
+ : io_uring_operation(success_ec,
+ &io_uring_descriptor_write_op_base::do_prepare,
+ &io_uring_descriptor_write_op_base::do_perform, complete_func),
+ descriptor_(descriptor),
+ state_(state),
+ buffers_(buffers),
+ bufs_(buffers)
+ {
+ }
+
+ static void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_descriptor_write_op_base* o(
+ static_cast<io_uring_descriptor_write_op_base*>(base));
+
+ if ((o->state_ & descriptor_ops::internal_non_blocking) != 0)
+ {
+ ::io_uring_prep_poll_add(sqe, o->descriptor_, POLLOUT);
+ }
+ else if (o->bufs_.is_single_buffer && o->bufs_.is_registered_buffer)
+ {
+ ::io_uring_prep_write_fixed(sqe, o->descriptor_,
+ o->bufs_.buffers()->iov_base, o->bufs_.buffers()->iov_len,
+ 0, o->bufs_.registered_id().native_handle());
+ }
+ else
+ {
+ ::io_uring_prep_writev(sqe, o->descriptor_,
+ o->bufs_.buffers(), o->bufs_.count(), -1);
+ }
+ }
+
+ static bool do_perform(io_uring_operation* base, bool after_completion)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_descriptor_write_op_base* o(
+ static_cast<io_uring_descriptor_write_op_base*>(base));
+
+ if ((o->state_ & descriptor_ops::internal_non_blocking) != 0)
+ {
+ if (o->bufs_.is_single_buffer)
+ {
+ return descriptor_ops::non_blocking_write1(
+ o->descriptor_, o->bufs_.first(o->buffers_).data(),
+ o->bufs_.first(o->buffers_).size(), o->ec_,
+ o->bytes_transferred_);
+ }
+ else
+ {
+ return descriptor_ops::non_blocking_write(
+ o->descriptor_, o->bufs_.buffers(), o->bufs_.count(),
+ o->ec_, o->bytes_transferred_);
+ }
+ }
+
+ if (o->ec_ && o->ec_ == asio::error::would_block)
+ {
+ o->state_ |= descriptor_ops::internal_non_blocking;
+ return false;
+ }
+
+ return after_completion;
+ }
+
+private:
+ int descriptor_;
+ descriptor_ops::state_type state_;
+ ConstBufferSequence buffers_;
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs_;
+};
+
+template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+class io_uring_descriptor_write_op
+ : public io_uring_descriptor_write_op_base<ConstBufferSequence>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_descriptor_write_op);
+
+ io_uring_descriptor_write_op(const asio::error_code& success_ec,
+ int descriptor, descriptor_ops::state_type state,
+ const ConstBufferSequence& buffers, Handler& handler,
+ const IoExecutor& io_ex)
+ : io_uring_descriptor_write_op_base<ConstBufferSequence>(success_ec,
+ descriptor, state, buffers, &io_uring_descriptor_write_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_descriptor_write_op* o
+ (static_cast<io_uring_descriptor_write_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_DESCRIPTOR_WRITE_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_file_service.hpp b/3rdparty/asio/include/asio/detail/io_uring_file_service.hpp
new file mode 100644
index 00000000000..3a0a4538623
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_file_service.hpp
@@ -0,0 +1,261 @@
+//
+// detail/io_uring_file_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_FILE_SERVICE_HPP
+#define ASIO_DETAIL_IO_URING_FILE_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_FILE) \
+ && defined(ASIO_HAS_IO_URING)
+
+#include <string>
+#include "asio/detail/cstdint.hpp"
+#include "asio/detail/descriptor_ops.hpp"
+#include "asio/detail/io_uring_descriptor_service.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/file_base.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Extend the io_uring_descriptor_service to provide file support.
+class io_uring_file_service :
+ public execution_context_service_base<io_uring_file_service>
+{
+public:
+ typedef io_uring_descriptor_service descriptor_service;
+
+ // The native type of a file.
+ typedef descriptor_service::native_handle_type native_handle_type;
+
+ // The implementation type of the file.
+ class implementation_type : descriptor_service::implementation_type
+ {
+ private:
+ // Only this service will have access to the internal values.
+ friend class io_uring_file_service;
+
+ bool is_stream_;
+ };
+
+ ASIO_DECL io_uring_file_service(execution_context& context);
+
+ // Destroy all user-defined handler objects owned by the service.
+ ASIO_DECL void shutdown();
+
+ // Construct a new file implementation.
+ void construct(implementation_type& impl)
+ {
+ descriptor_service_.construct(impl);
+ impl.is_stream_ = false;
+ }
+
+ // Move-construct a new file implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ descriptor_service_.move_construct(impl, other_impl);
+ impl.is_stream_ = other_impl.is_stream_;
+ }
+
+ // Move-assign from another file implementation.
+ void move_assign(implementation_type& impl,
+ io_uring_file_service& other_service,
+ implementation_type& other_impl)
+ {
+ descriptor_service_.move_assign(impl,
+ other_service.descriptor_service_, other_impl);
+ impl.is_stream_ = other_impl.is_stream_;
+ }
+
+ // Destroy a file implementation.
+ void destroy(implementation_type& impl)
+ {
+ descriptor_service_.destroy(impl);
+ }
+
+ // Open the file using the specified path name.
+ ASIO_DECL asio::error_code open(implementation_type& impl,
+ const char* path, file_base::flags open_flags,
+ asio::error_code& ec);
+
+ // Assign a native descriptor to a file 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);
+ }
+
+ // Set whether the implementation is stream-oriented.
+ void set_is_stream(implementation_type& impl, bool is_stream)
+ {
+ impl.is_stream_ = is_stream;
+ }
+
+ // Determine whether the file is open.
+ bool is_open(const implementation_type& impl) const
+ {
+ return descriptor_service_.is_open(impl);
+ }
+
+ // Destroy a file implementation.
+ asio::error_code close(implementation_type& impl,
+ asio::error_code& ec)
+ {
+ return descriptor_service_.close(impl, ec);
+ }
+
+ // Get the native file representation.
+ native_handle_type native_handle(const implementation_type& impl) const
+ {
+ return descriptor_service_.native_handle(impl);
+ }
+
+ // Release ownership of the native descriptor representation.
+ native_handle_type release(implementation_type& impl,
+ asio::error_code& ec)
+ {
+ return descriptor_service_.release(impl, ec);
+ }
+
+ // Cancel all operations associated with the file.
+ asio::error_code cancel(implementation_type& impl,
+ asio::error_code& ec)
+ {
+ return descriptor_service_.cancel(impl, ec);
+ }
+
+ // Get the size of the file.
+ ASIO_DECL uint64_t size(const implementation_type& impl,
+ asio::error_code& ec) const;
+
+ // Alter the size of the file.
+ ASIO_DECL asio::error_code resize(implementation_type& impl,
+ uint64_t n, asio::error_code& ec);
+
+ // Synchronise the file to disk.
+ ASIO_DECL asio::error_code sync_all(implementation_type& impl,
+ asio::error_code& ec);
+
+ // Synchronise the file data to disk.
+ ASIO_DECL asio::error_code sync_data(implementation_type& impl,
+ asio::error_code& ec);
+
+ // Seek to a position in the file.
+ ASIO_DECL uint64_t seek(implementation_type& impl, int64_t offset,
+ file_base::seek_basis whence, asio::error_code& ec);
+
+ // Write the given data. Returns the number of bytes written.
+ template <typename ConstBufferSequence>
+ 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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_write_some(implementation_type& impl,
+ const ConstBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ descriptor_service_.async_write_some(impl, buffers, handler, io_ex);
+ }
+
+ // Write the given data at the specified location. Returns the number of
+ // bytes written.
+ template <typename ConstBufferSequence>
+ size_t write_some_at(implementation_type& impl, uint64_t offset,
+ const ConstBufferSequence& buffers, asio::error_code& ec)
+ {
+ return descriptor_service_.write_some_at(impl, offset, buffers, ec);
+ }
+
+ // Start an asynchronous write at the specified location. The data being
+ // written must be valid for the lifetime of the asynchronous operation.
+ template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_write_some_at(implementation_type& impl,
+ uint64_t offset, const ConstBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ descriptor_service_.async_write_some_at(
+ impl, offset, buffers, handler, io_ex);
+ }
+
+ // Read some data. Returns the number of bytes read.
+ template <typename MutableBufferSequence>
+ 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 read must be
+ // valid for the lifetime of the asynchronous operation.
+ template <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_read_some(implementation_type& impl,
+ const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ descriptor_service_.async_read_some(impl, buffers, handler, io_ex);
+ }
+
+ // Read some data. Returns the number of bytes read.
+ template <typename MutableBufferSequence>
+ size_t read_some_at(implementation_type& impl, uint64_t offset,
+ const MutableBufferSequence& buffers, asio::error_code& ec)
+ {
+ return descriptor_service_.read_some_at(impl, offset, buffers, ec);
+ }
+
+ // Start an asynchronous read. The buffer for the data being read must be
+ // valid for the lifetime of the asynchronous operation.
+ template <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_read_some_at(implementation_type& impl,
+ uint64_t offset, const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ descriptor_service_.async_read_some_at(
+ impl, offset, buffers, handler, io_ex);
+ }
+
+private:
+ // The implementation used for initiating asynchronous operations.
+ descriptor_service descriptor_service_;
+
+ // Cached success value to avoid accessing category singleton.
+ const asio::error_code success_ec_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#if defined(ASIO_HEADER_ONLY)
+# include "asio/detail/impl/io_uring_file_service.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // defined(ASIO_HAS_FILE)
+ // && defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_FILE_SERVICE_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_null_buffers_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_null_buffers_op.hpp
new file mode 100644
index 00000000000..61fe6a6aafb
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_null_buffers_op.hpp
@@ -0,0 +1,114 @@
+//
+// detail/io_uring_null_buffers_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_NULL_BUFFERS_OP_HPP
+#define ASIO_DETAIL_IO_URING_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/bind_handler.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/handler_alloc_helpers.hpp"
+#include "asio/detail/handler_work.hpp"
+#include "asio/detail/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Handler, typename IoExecutor>
+class io_uring_null_buffers_op : public io_uring_operation
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_null_buffers_op);
+
+ io_uring_null_buffers_op(const asio::error_code& success_ec,
+ int descriptor, int poll_flags, Handler& handler, const IoExecutor& io_ex)
+ : io_uring_operation(success_ec,
+ &io_uring_null_buffers_op::do_prepare,
+ &io_uring_null_buffers_op::do_perform,
+ &io_uring_null_buffers_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex),
+ descriptor_(descriptor),
+ poll_flags_(poll_flags)
+ {
+ }
+
+ static void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_null_buffers_op* o(static_cast<io_uring_null_buffers_op*>(base));
+
+ ::io_uring_prep_poll_add(sqe, o->descriptor_, o->poll_flags_);
+ }
+
+ static bool do_perform(io_uring_operation*, bool after_completion)
+ {
+ return after_completion;
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_null_buffers_op* o(static_cast<io_uring_null_buffers_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+ int descriptor_;
+ int poll_flags_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_IO_URING_NULL_BUFFERS_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_operation.hpp b/3rdparty/asio/include/asio/detail/io_uring_operation.hpp
new file mode 100644
index 00000000000..f2635cc4074
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_operation.hpp
@@ -0,0 +1,84 @@
+//
+// detail/io_uring_operation.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_OPERATION_HPP
+#define ASIO_DETAIL_IO_URING_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_IO_URING)
+
+#include <liburing.h>
+#include "asio/detail/cstdint.hpp"
+#include "asio/detail/operation.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class io_uring_operation
+ : 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_;
+
+ // The operation key used for targeted cancellation.
+ void* cancellation_key_;
+
+ // Prepare the operation.
+ void prepare(::io_uring_sqe* sqe)
+ {
+ return prepare_func_(this, sqe);
+ }
+
+ // Perform actions associated with the operation. Returns true when complete.
+ bool perform(bool after_completion)
+ {
+ return perform_func_(this, after_completion);
+ }
+
+protected:
+ typedef void (*prepare_func_type)(io_uring_operation*, ::io_uring_sqe*);
+ typedef bool (*perform_func_type)(io_uring_operation*, bool);
+
+ io_uring_operation(const asio::error_code& success_ec,
+ prepare_func_type prepare_func, perform_func_type perform_func,
+ func_type complete_func)
+ : operation(complete_func),
+ ec_(success_ec),
+ bytes_transferred_(0),
+ cancellation_key_(0),
+ prepare_func_(prepare_func),
+ perform_func_(perform_func)
+ {
+ }
+
+private:
+ prepare_func_type prepare_func_;
+ perform_func_type perform_func_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_OPERATION_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_service.hpp b/3rdparty/asio/include/asio/detail/io_uring_service.hpp
new file mode 100644
index 00000000000..2dd3c0bf14d
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_service.hpp
@@ -0,0 +1,319 @@
+//
+// detail/io_uring_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_SERVICE_HPP
+#define ASIO_DETAIL_IO_URING_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_IO_URING)
+
+#include <liburing.h>
+#include "asio/detail/atomic_count.hpp"
+#include "asio/detail/buffer_sequence_adapter.hpp"
+#include "asio/detail/conditionally_enabled_mutex.hpp"
+#include "asio/detail/io_uring_operation.hpp"
+#include "asio/detail/limits.hpp"
+#include "asio/detail/object_pool.hpp"
+#include "asio/detail/op_queue.hpp"
+#include "asio/detail/reactor.hpp"
+#include "asio/detail/scheduler_task.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 io_uring_service
+ : public execution_context_service_base<io_uring_service>,
+ public scheduler_task
+{
+private:
+ // The mutex type used by this reactor.
+ typedef conditionally_enabled_mutex mutex;
+
+public:
+ enum op_types { read_op = 0, write_op = 1, except_op = 2, max_ops = 3 };
+
+ class io_object;
+
+ // An I/O queue stores operations that must run serially.
+ class io_queue : operation
+ {
+ friend class io_uring_service;
+
+ io_object* io_object_;
+ op_queue<io_uring_operation> op_queue_;
+ bool cancel_requested_;
+
+ ASIO_DECL io_queue();
+ void set_result(int r) { task_result_ = static_cast<unsigned>(r); }
+ ASIO_DECL operation* perform_io(int result);
+ ASIO_DECL static void do_complete(void* owner, operation* base,
+ const asio::error_code& ec, std::size_t bytes_transferred);
+ };
+
+ // Per I/O object state.
+ class io_object
+ {
+ friend class io_uring_service;
+ friend class object_pool_access;
+
+ io_object* next_;
+ io_object* prev_;
+
+ mutex mutex_;
+ io_uring_service* service_;
+ io_queue queues_[max_ops];
+ bool shutdown_;
+
+ ASIO_DECL io_object(bool locking);
+ };
+
+ // Per I/O object data.
+ typedef io_object* per_io_object_data;
+
+ // Constructor.
+ ASIO_DECL io_uring_service(asio::execution_context& ctx);
+
+ // Destructor.
+ ASIO_DECL ~io_uring_service();
+
+ // Destroy all user-defined handler objects owned by the service.
+ ASIO_DECL void shutdown();
+
+ // Recreate internal state following a fork.
+ ASIO_DECL void notify_fork(
+ asio::execution_context::fork_event fork_ev);
+
+ // Initialise the task.
+ ASIO_DECL void init_task();
+
+ // Register an I/O object with io_uring.
+ ASIO_DECL void register_io_object(io_object*& io_obj);
+
+ // Register an internal I/O object with io_uring.
+ ASIO_DECL void register_internal_io_object(
+ io_object*& io_obj, int op_type, io_uring_operation* op);
+
+ // Register buffers with io_uring.
+ ASIO_DECL void register_buffers(const ::iovec* v, unsigned n);
+
+ // Unregister buffers from io_uring.
+ ASIO_DECL void unregister_buffers();
+
+ // Post an operation for immediate completion.
+ void post_immediate_completion(operation* op, bool is_continuation);
+
+ // Start a new operation. The operation will be prepared and submitted to the
+ // io_uring when it is at the head of its I/O operation queue.
+ ASIO_DECL void start_op(int op_type, per_io_object_data& io_obj,
+ io_uring_operation* op, bool is_continuation);
+
+ // Cancel all operations associated with the given I/O object. The handlers
+ // associated with the I/O object will be invoked with the operation_aborted
+ // error.
+ ASIO_DECL void cancel_ops(per_io_object_data& io_obj);
+
+ // Cancel all operations associated with the given I/O object and key. The
+ // handlers associated with the object and key will be invoked with the
+ // operation_aborted error.
+ ASIO_DECL void cancel_ops_by_key(per_io_object_data& io_obj,
+ int op_type, void* cancellation_key);
+
+ // Cancel any operations that are running against the I/O object and remove
+ // its registration from the service. The service resources associated with
+ // the I/O object must be released by calling cleanup_io_object.
+ ASIO_DECL void deregister_io_object(per_io_object_data& io_obj);
+
+ // Perform any post-deregistration cleanup tasks associated with the I/O
+ // object.
+ ASIO_DECL void cleanup_io_object(per_io_object_data& io_obj);
+
+ // Add a new timer queue to the reactor.
+ template <typename Time_Traits>
+ void add_timer_queue(timer_queue<Time_Traits>& timer_queue);
+
+ // Remove a timer queue from the reactor.
+ template <typename Time_Traits>
+ void remove_timer_queue(timer_queue<Time_Traits>& timer_queue);
+
+ // Schedule a new operation in the given timer queue to expire at the
+ // specified absolute time.
+ template <typename Time_Traits>
+ void schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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 <typename Time_Traits>
+ std::size_t cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled = (std::numeric_limits<std::size_t>::max)());
+
+ // Cancel the timer operations associated with the given key.
+ template <typename Time_Traits>
+ void cancel_timer_by_key(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data* timer,
+ void* cancellation_key);
+
+ // Move the timer operations associated with the given timer.
+ template <typename Time_Traits>
+ void move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& target,
+ typename timer_queue<Time_Traits>::per_timer_data& source);
+
+ // Wait on io_uring once until interrupted or events are ready to be
+ // dispatched.
+ ASIO_DECL void run(long usec, op_queue<operation>& ops);
+
+ // Interrupt the io_uring wait.
+ ASIO_DECL void interrupt();
+
+private:
+ // The hint to pass to io_uring_queue_init to size its data structures.
+ enum { ring_size = 16384 };
+
+ // The number of operations to submit in a batch.
+ enum { submit_batch_size = 128 };
+
+ // The number of operations to complete in a batch.
+ enum { complete_batch_size = 128 };
+
+ // The type used for processing eventfd readiness notifications.
+ class event_fd_read_op;
+
+ // Initialise the ring.
+ ASIO_DECL void init_ring();
+
+ // Register the eventfd descriptor for readiness notifications.
+ ASIO_DECL void register_with_reactor();
+
+ // Allocate a new I/O object.
+ ASIO_DECL io_object* allocate_io_object();
+
+ // Free an existing I/O object.
+ ASIO_DECL void free_io_object(io_object* s);
+
+ // Helper function to cancel all operations associated with the given I/O
+ // object. This function must be called while the I/O object's mutex is held.
+ // Returns true if there are operations for which cancellation is pending.
+ ASIO_DECL bool do_cancel_ops(
+ per_io_object_data& io_obj, op_queue<operation>& ops);
+
+ // 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 current timeout value.
+ ASIO_DECL __kernel_timespec get_timeout() const;
+
+ // Get a new submission queue entry, flushing the queue if necessary.
+ ASIO_DECL ::io_uring_sqe* get_sqe();
+
+ // Submit pending submission queue entries.
+ ASIO_DECL void submit_sqes();
+
+ // Post an operation to submit the pending submission queue entries.
+ ASIO_DECL void post_submit_sqes_op(mutex::scoped_lock& lock);
+
+ // Push an operation to submit the pending submission queue entries.
+ ASIO_DECL void push_submit_sqes_op(op_queue<operation>& ops);
+
+ // Helper operation to submit pending submission queue entries.
+ class submit_sqes_op : operation
+ {
+ friend class io_uring_service;
+
+ io_uring_service* service_;
+
+ ASIO_DECL submit_sqes_op(io_uring_service* s);
+ ASIO_DECL static void do_complete(void* owner, operation* base,
+ const asio::error_code& ec, std::size_t bytes_transferred);
+ };
+
+ // The scheduler implementation used to post completions.
+ scheduler& scheduler_;
+
+ // Mutex to protect access to internal data.
+ mutex mutex_;
+
+ // The ring.
+ ::io_uring ring_;
+
+ // The count of unfinished work.
+ atomic_count outstanding_work_;
+
+ // The operation used to submit the pending submission queue entries.
+ submit_sqes_op submit_sqes_op_;
+
+ // The number of pending submission queue entries_.
+ int pending_sqes_;
+
+ // Whether there is a pending submission operation.
+ bool pending_submit_sqes_op_;
+
+ // Whether the service has been shut down.
+ bool shutdown_;
+
+ // The timer queues.
+ timer_queue_set timer_queues_;
+
+ // The timespec for the pending timeout operation. Must remain valid while the
+ // operation is outstanding.
+ __kernel_timespec timeout_;
+
+ // Mutex to protect access to the registered I/O objects.
+ mutex registration_mutex_;
+
+ // Keep track of all registered I/O objects.
+ object_pool<io_object> registered_io_objects_;
+
+ // Helper class to do post-perform_io cleanup.
+ struct perform_io_cleanup_on_block_exit;
+ friend struct perform_io_cleanup_on_block_exit;
+
+ // The reactor used to register for eventfd readiness.
+ reactor& reactor_;
+
+ // The per-descriptor reactor data used for the eventfd.
+ reactor::per_descriptor_data reactor_data_;
+
+ // The eventfd descriptor used to wait for readiness.
+ int event_fd_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/detail/impl/io_uring_service.hpp"
+#if defined(ASIO_HEADER_ONLY)
+# include "asio/detail/impl/io_uring_service.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_SERVICE_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_socket_accept_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_socket_accept_op.hpp
new file mode 100644
index 00000000000..dbf1a98b536
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_socket_accept_op.hpp
@@ -0,0 +1,280 @@
+//
+// detail/io_uring_socket_accept_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_SOCKET_ACCEPT_OP_HPP
+#define ASIO_DETAIL_IO_URING_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_IO_URING)
+
+#include "asio/detail/bind_handler.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/handler_alloc_helpers.hpp"
+#include "asio/detail/handler_work.hpp"
+#include "asio/detail/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/socket_holder.hpp"
+#include "asio/detail/socket_ops.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Socket, typename Protocol>
+class io_uring_socket_accept_op_base : public io_uring_operation
+{
+public:
+ io_uring_socket_accept_op_base(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state, Socket& peer,
+ const Protocol& protocol, typename Protocol::endpoint* peer_endpoint,
+ func_type complete_func)
+ : io_uring_operation(success_ec,
+ &io_uring_socket_accept_op_base::do_prepare,
+ &io_uring_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 void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_accept_op_base* o(
+ static_cast<io_uring_socket_accept_op_base*>(base));
+
+ if ((o->state_ & socket_ops::internal_non_blocking) != 0)
+ {
+ ::io_uring_prep_poll_add(sqe, o->socket_, POLLIN);
+ }
+ else
+ {
+ ::io_uring_prep_accept(sqe, o->socket_,
+ o->peer_endpoint_ ? o->peer_endpoint_->data() : 0,
+ o->peer_endpoint_ ? &o->addrlen_ : 0, 0);
+ }
+ }
+
+ static bool do_perform(io_uring_operation* base, bool after_completion)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_accept_op_base* o(
+ static_cast<io_uring_socket_accept_op_base*>(base));
+
+ if ((o->state_ & socket_ops::internal_non_blocking) != 0)
+ {
+ socket_type new_socket = invalid_socket;
+ std::size_t addrlen = static_cast<std::size_t>(o->addrlen_);
+ bool result = socket_ops::non_blocking_accept(o->socket_,
+ o->state_, o->peer_endpoint_ ? o->peer_endpoint_->data() : 0,
+ o->peer_endpoint_ ? &addrlen : 0, o->ec_, new_socket);
+ o->new_socket_.reset(new_socket);
+ o->addrlen_ = static_cast<socklen_t>(addrlen);
+ return result;
+ }
+
+ if (o->ec_ && o->ec_ == asio::error::would_block)
+ {
+ o->state_ |= socket_ops::internal_non_blocking;
+ return false;
+ }
+
+ if (after_completion && !o->ec_)
+ o->new_socket_.reset(static_cast<int>(o->bytes_transferred_));
+
+ return after_completion;
+ }
+
+ 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_;
+ socklen_t addrlen_;
+};
+
+template <typename Socket, typename Protocol,
+ typename Handler, typename IoExecutor>
+class io_uring_socket_accept_op :
+ public io_uring_socket_accept_op_base<Socket, Protocol>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_socket_accept_op);
+
+ io_uring_socket_accept_op(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state, Socket& peer,
+ const Protocol& protocol, typename Protocol::endpoint* peer_endpoint,
+ Handler& handler, const IoExecutor& io_ex)
+ : io_uring_socket_accept_op_base<Socket, Protocol>(
+ success_ec, socket, state, peer, protocol, peer_endpoint,
+ &io_uring_socket_accept_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_accept_op* o(static_cast<io_uring_socket_accept_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ // On success, assign new connection to peer socket object.
+ if (owner)
+ o->do_assign();
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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::binder1<Handler, asio::error_code>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+template <typename Protocol, typename PeerIoExecutor,
+ typename Handler, typename IoExecutor>
+class io_uring_socket_move_accept_op :
+ private Protocol::socket::template rebind_executor<PeerIoExecutor>::other,
+ public io_uring_socket_accept_op_base<
+ typename Protocol::socket::template rebind_executor<PeerIoExecutor>::other,
+ Protocol>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_socket_move_accept_op);
+
+ io_uring_socket_move_accept_op(const asio::error_code& success_ec,
+ const PeerIoExecutor& peer_io_ex, socket_type socket,
+ socket_ops::state_type state, const Protocol& protocol,
+ typename Protocol::endpoint* peer_endpoint, Handler& handler,
+ const IoExecutor& io_ex)
+ : peer_socket_type(peer_io_ex),
+ io_uring_socket_accept_op_base<peer_socket_type, Protocol>(
+ success_ec, socket, state, *this, protocol, peer_endpoint,
+ &io_uring_socket_move_accept_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_move_accept_op* o(
+ static_cast<io_uring_socket_move_accept_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ // On success, assign new connection to peer socket object.
+ if (owner)
+ o->do_assign();
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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::move_binder2<Handler,
+ asio::error_code, peer_socket_type>
+ handler(0, static_cast<Handler&&>(o->handler_), o->ec_,
+ static_cast<peer_socket_type&&>(*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:
+ typedef typename Protocol::socket::template
+ rebind_executor<PeerIoExecutor>::other peer_socket_type;
+
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_SOCKET_ACCEPT_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_socket_connect_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_socket_connect_op.hpp
new file mode 100644
index 00000000000..45d30c6bb0a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_socket_connect_op.hpp
@@ -0,0 +1,140 @@
+//
+// detail/io_uring_socket_connect_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_SOCKET_CONNECT_OP_HPP
+#define ASIO_DETAIL_IO_URING_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_IO_URING)
+
+#include "asio/detail/bind_handler.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/handler_alloc_helpers.hpp"
+#include "asio/detail/handler_work.hpp"
+#include "asio/detail/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/socket_ops.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Protocol>
+class io_uring_socket_connect_op_base : public io_uring_operation
+{
+public:
+ io_uring_socket_connect_op_base(const asio::error_code& success_ec,
+ socket_type socket, const typename Protocol::endpoint& endpoint,
+ func_type complete_func)
+ : io_uring_operation(success_ec,
+ &io_uring_socket_connect_op_base::do_prepare,
+ &io_uring_socket_connect_op_base::do_perform, complete_func),
+ socket_(socket),
+ endpoint_(endpoint)
+ {
+ }
+
+ static void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_connect_op_base* o(
+ static_cast<io_uring_socket_connect_op_base*>(base));
+
+ ::io_uring_prep_connect(sqe, o->socket_,
+ static_cast<sockaddr*>(o->endpoint_.data()),
+ static_cast<socklen_t>(o->endpoint_.size()));
+ }
+
+ static bool do_perform(io_uring_operation*, bool after_completion)
+ {
+ return after_completion;
+ }
+
+private:
+ socket_type socket_;
+ typename Protocol::endpoint endpoint_;
+};
+
+template <typename Protocol, typename Handler, typename IoExecutor>
+class io_uring_socket_connect_op :
+ public io_uring_socket_connect_op_base<Protocol>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_socket_connect_op);
+
+ io_uring_socket_connect_op(const asio::error_code& success_ec,
+ socket_type socket, const typename Protocol::endpoint& endpoint,
+ Handler& handler, const IoExecutor& io_ex)
+ : io_uring_socket_connect_op_base<Protocol>(success_ec, socket,
+ endpoint, &io_uring_socket_connect_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_connect_op* o
+ (static_cast<io_uring_socket_connect_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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::binder1<Handler, asio::error_code>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_SOCKET_CONNECT_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_socket_recv_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_socket_recv_op.hpp
new file mode 100644
index 00000000000..b1936c1ab93
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_socket_recv_op.hpp
@@ -0,0 +1,205 @@
+//
+// detail/io_uring_socket_recv_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_SOCKET_RECV_OP_HPP
+#define ASIO_DETAIL_IO_URING_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_IO_URING)
+
+#include "asio/detail/bind_handler.hpp"
+#include "asio/detail/buffer_sequence_adapter.hpp"
+#include "asio/detail/socket_ops.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/handler_work.hpp"
+#include "asio/detail/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename MutableBufferSequence>
+class io_uring_socket_recv_op_base : public io_uring_operation
+{
+public:
+ io_uring_socket_recv_op_base(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state,
+ const MutableBufferSequence& buffers,
+ socket_base::message_flags flags, func_type complete_func)
+ : io_uring_operation(success_ec,
+ &io_uring_socket_recv_op_base::do_prepare,
+ &io_uring_socket_recv_op_base::do_perform, complete_func),
+ socket_(socket),
+ state_(state),
+ buffers_(buffers),
+ flags_(flags),
+ bufs_(buffers),
+ msghdr_()
+ {
+ msghdr_.msg_iov = bufs_.buffers();
+ msghdr_.msg_iovlen = static_cast<int>(bufs_.count());
+ }
+
+ static void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_recv_op_base* o(
+ static_cast<io_uring_socket_recv_op_base*>(base));
+
+ if ((o->state_ & socket_ops::internal_non_blocking) != 0)
+ {
+ bool except_op = (o->flags_ & socket_base::message_out_of_band) != 0;
+ ::io_uring_prep_poll_add(sqe, o->socket_, except_op ? POLLPRI : POLLIN);
+ }
+ else if (o->bufs_.is_single_buffer
+ && o->bufs_.is_registered_buffer && o->flags_ == 0)
+ {
+ ::io_uring_prep_read_fixed(sqe, o->socket_,
+ o->bufs_.buffers()->iov_base, o->bufs_.buffers()->iov_len,
+ 0, o->bufs_.registered_id().native_handle());
+ }
+ else
+ {
+ ::io_uring_prep_recvmsg(sqe, o->socket_, &o->msghdr_, o->flags_);
+ }
+ }
+
+ static bool do_perform(io_uring_operation* base, bool after_completion)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_recv_op_base* o(
+ static_cast<io_uring_socket_recv_op_base*>(base));
+
+ if ((o->state_ & socket_ops::internal_non_blocking) != 0)
+ {
+ bool except_op = (o->flags_ & socket_base::message_out_of_band) != 0;
+ if (after_completion || !except_op)
+ {
+ if (o->bufs_.is_single_buffer)
+ {
+ return socket_ops::non_blocking_recv1(o->socket_,
+ o->bufs_.first(o->buffers_).data(),
+ o->bufs_.first(o->buffers_).size(), o->flags_,
+ (o->state_ & socket_ops::stream_oriented) != 0,
+ o->ec_, o->bytes_transferred_);
+ }
+ else
+ {
+ return socket_ops::non_blocking_recv(o->socket_,
+ o->bufs_.buffers(), o->bufs_.count(), o->flags_,
+ (o->state_ & socket_ops::stream_oriented) != 0,
+ o->ec_, o->bytes_transferred_);
+ }
+ }
+ }
+ else if (after_completion)
+ {
+ if (!o->ec_ && o->bytes_transferred_ == 0)
+ if ((o->state_ & socket_ops::stream_oriented) != 0)
+ o->ec_ = asio::error::eof;
+ }
+
+ if (o->ec_ && o->ec_ == asio::error::would_block)
+ {
+ o->state_ |= socket_ops::internal_non_blocking;
+ return false;
+ }
+
+ return after_completion;
+ }
+
+private:
+ socket_type socket_;
+ socket_ops::state_type state_;
+ MutableBufferSequence buffers_;
+ socket_base::message_flags flags_;
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_;
+ msghdr msghdr_;
+};
+
+template <typename MutableBufferSequence, typename Handler, typename IoExecutor>
+class io_uring_socket_recv_op
+ : public io_uring_socket_recv_op_base<MutableBufferSequence>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_socket_recv_op);
+
+ io_uring_socket_recv_op(const asio::error_code& success_ec,
+ int socket, socket_ops::state_type state,
+ const MutableBufferSequence& buffers, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ : io_uring_socket_recv_op_base<MutableBufferSequence>(success_ec,
+ socket, state, buffers, flags, &io_uring_socket_recv_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_recv_op* o
+ (static_cast<io_uring_socket_recv_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_SOCKET_RECV_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_socket_recvfrom_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_socket_recvfrom_op.hpp
new file mode 100644
index 00000000000..dfd30e4f2a1
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_socket_recvfrom_op.hpp
@@ -0,0 +1,206 @@
+//
+// detail/io_uring_socket_recvfrom_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_SOCKET_RECVFROM_OP_HPP
+#define ASIO_DETAIL_IO_URING_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_IO_URING)
+
+#include "asio/detail/bind_handler.hpp"
+#include "asio/detail/buffer_sequence_adapter.hpp"
+#include "asio/detail/socket_ops.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/handler_work.hpp"
+#include "asio/detail/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename MutableBufferSequence, typename Endpoint>
+class io_uring_socket_recvfrom_op_base : public io_uring_operation
+{
+public:
+ io_uring_socket_recvfrom_op_base(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state,
+ const MutableBufferSequence& buffers, Endpoint& endpoint,
+ socket_base::message_flags flags, func_type complete_func)
+ : io_uring_operation(success_ec,
+ &io_uring_socket_recvfrom_op_base::do_prepare,
+ &io_uring_socket_recvfrom_op_base::do_perform, complete_func),
+ socket_(socket),
+ state_(state),
+ buffers_(buffers),
+ sender_endpoint_(endpoint),
+ flags_(flags),
+ bufs_(buffers),
+ msghdr_()
+ {
+ msghdr_.msg_iov = bufs_.buffers();
+ msghdr_.msg_iovlen = static_cast<int>(bufs_.count());
+ msghdr_.msg_name = static_cast<sockaddr*>(
+ static_cast<void*>(sender_endpoint_.data()));
+ msghdr_.msg_namelen = sender_endpoint_.capacity();
+ }
+
+ static void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_recvfrom_op_base* o(
+ static_cast<io_uring_socket_recvfrom_op_base*>(base));
+
+ if ((o->state_ & socket_ops::internal_non_blocking) != 0)
+ {
+ bool except_op = (o->flags_ & socket_base::message_out_of_band) != 0;
+ ::io_uring_prep_poll_add(sqe, o->socket_, except_op ? POLLPRI : POLLIN);
+ }
+ else
+ {
+ ::io_uring_prep_recvmsg(sqe, o->socket_, &o->msghdr_, o->flags_);
+ }
+ }
+
+ static bool do_perform(io_uring_operation* base, bool after_completion)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_recvfrom_op_base* o(
+ static_cast<io_uring_socket_recvfrom_op_base*>(base));
+
+ if ((o->state_ & socket_ops::internal_non_blocking) != 0)
+ {
+ bool except_op = (o->flags_ & socket_base::message_out_of_band) != 0;
+ if (after_completion || !except_op)
+ {
+ std::size_t addr_len = o->sender_endpoint_.capacity();
+ bool result;
+ if (o->bufs_.is_single_buffer)
+ {
+ result = socket_ops::non_blocking_recvfrom1(o->socket_,
+ o->bufs_.first(o->buffers_).data(),
+ o->bufs_.first(o->buffers_).size(), o->flags_,
+ o->sender_endpoint_.data(), &addr_len,
+ o->ec_, o->bytes_transferred_);
+ }
+ else
+ {
+ result = socket_ops::non_blocking_recvfrom(o->socket_,
+ o->bufs_.buffers(), o->bufs_.count(), o->flags_,
+ o->sender_endpoint_.data(), &addr_len,
+ o->ec_, o->bytes_transferred_);
+ }
+ if (result && !o->ec_)
+ o->sender_endpoint_.resize(addr_len);
+ }
+ }
+ else if (after_completion && !o->ec_)
+ o->sender_endpoint_.resize(o->msghdr_.msg_namelen);
+
+ if (o->ec_ && o->ec_ == asio::error::would_block)
+ {
+ o->state_ |= socket_ops::internal_non_blocking;
+ return false;
+ }
+
+ return after_completion;
+ }
+
+private:
+ socket_type socket_;
+ socket_ops::state_type state_;
+ MutableBufferSequence buffers_;
+ Endpoint& sender_endpoint_;
+ socket_base::message_flags flags_;
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_;
+ msghdr msghdr_;
+};
+
+template <typename MutableBufferSequence, typename Endpoint,
+ typename Handler, typename IoExecutor>
+class io_uring_socket_recvfrom_op
+ : public io_uring_socket_recvfrom_op_base<MutableBufferSequence, Endpoint>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_socket_recvfrom_op);
+
+ io_uring_socket_recvfrom_op(const asio::error_code& success_ec,
+ int socket, socket_ops::state_type state,
+ const MutableBufferSequence& buffers, Endpoint& endpoint,
+ socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ : io_uring_socket_recvfrom_op_base<MutableBufferSequence, Endpoint>(
+ success_ec, socket, state, buffers, endpoint, flags,
+ &io_uring_socket_recvfrom_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_recvfrom_op* o
+ (static_cast<io_uring_socket_recvfrom_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_SOCKET_RECVFROM_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_socket_recvmsg_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_socket_recvmsg_op.hpp
new file mode 100644
index 00000000000..778d0fa3acf
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_socket_recvmsg_op.hpp
@@ -0,0 +1,192 @@
+//
+// detail/io_uring_socket_recvmsg_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_SOCKET_RECVMSG_OP_HPP
+#define ASIO_DETAIL_IO_URING_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_IO_URING)
+
+#include "asio/detail/bind_handler.hpp"
+#include "asio/detail/buffer_sequence_adapter.hpp"
+#include "asio/detail/socket_ops.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/handler_work.hpp"
+#include "asio/detail/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename MutableBufferSequence>
+class io_uring_socket_recvmsg_op_base : public io_uring_operation
+{
+public:
+ io_uring_socket_recvmsg_op_base(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state,
+ const MutableBufferSequence& buffers, socket_base::message_flags in_flags,
+ socket_base::message_flags& out_flags, func_type complete_func)
+ : io_uring_operation(success_ec,
+ &io_uring_socket_recvmsg_op_base::do_prepare,
+ &io_uring_socket_recvmsg_op_base::do_perform, complete_func),
+ socket_(socket),
+ state_(state),
+ buffers_(buffers),
+ in_flags_(in_flags),
+ out_flags_(out_flags),
+ bufs_(buffers),
+ msghdr_()
+ {
+ msghdr_.msg_iov = bufs_.buffers();
+ msghdr_.msg_iovlen = static_cast<int>(bufs_.count());
+ }
+
+ static void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_recvmsg_op_base* o(
+ static_cast<io_uring_socket_recvmsg_op_base*>(base));
+
+ if ((o->state_ & socket_ops::internal_non_blocking) != 0)
+ {
+ bool except_op = (o->in_flags_ & socket_base::message_out_of_band) != 0;
+ ::io_uring_prep_poll_add(sqe, o->socket_, except_op ? POLLPRI : POLLIN);
+ }
+ else
+ {
+ ::io_uring_prep_recvmsg(sqe, o->socket_, &o->msghdr_, o->in_flags_);
+ }
+ }
+
+ static bool do_perform(io_uring_operation* base, bool after_completion)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_recvmsg_op_base* o(
+ static_cast<io_uring_socket_recvmsg_op_base*>(base));
+
+ if ((o->state_ & socket_ops::internal_non_blocking) != 0)
+ {
+ bool except_op = (o->in_flags_ & socket_base::message_out_of_band) != 0;
+ if (after_completion || !except_op)
+ {
+ return socket_ops::non_blocking_recvmsg(o->socket_,
+ o->bufs_.buffers(), o->bufs_.count(), o->in_flags_,
+ o->out_flags_, o->ec_, o->bytes_transferred_);
+ }
+ }
+ else if (after_completion)
+ {
+ if (!o->ec_)
+ o->out_flags_ = o->msghdr_.msg_flags;
+ else
+ o->out_flags_ = 0;
+ }
+
+ if (o->ec_ && o->ec_ == asio::error::would_block)
+ {
+ o->state_ |= socket_ops::internal_non_blocking;
+ return false;
+ }
+
+ return after_completion;
+ }
+
+private:
+ socket_type socket_;
+ socket_ops::state_type state_;
+ MutableBufferSequence buffers_;
+ socket_base::message_flags in_flags_;
+ socket_base::message_flags& out_flags_;
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_;
+ msghdr msghdr_;
+};
+
+template <typename MutableBufferSequence, typename Handler, typename IoExecutor>
+class io_uring_socket_recvmsg_op
+ : public io_uring_socket_recvmsg_op_base<MutableBufferSequence>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_socket_recvmsg_op);
+
+ io_uring_socket_recvmsg_op(const asio::error_code& success_ec,
+ int socket, socket_ops::state_type state,
+ const MutableBufferSequence& buffers,
+ socket_base::message_flags in_flags,
+ socket_base::message_flags& out_flags,
+ Handler& handler, const IoExecutor& io_ex)
+ : io_uring_socket_recvmsg_op_base<MutableBufferSequence>(success_ec,
+ socket, state, buffers, in_flags, out_flags,
+ &io_uring_socket_recvmsg_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_recvmsg_op* o
+ (static_cast<io_uring_socket_recvmsg_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_SOCKET_RECVMSG_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_socket_send_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_socket_send_op.hpp
new file mode 100644
index 00000000000..2f57dae920d
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_socket_send_op.hpp
@@ -0,0 +1,191 @@
+//
+// detail/io_uring_socket_send_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_SOCKET_SEND_OP_HPP
+#define ASIO_DETAIL_IO_URING_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_IO_URING)
+
+#include "asio/detail/bind_handler.hpp"
+#include "asio/detail/buffer_sequence_adapter.hpp"
+#include "asio/detail/socket_ops.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/handler_work.hpp"
+#include "asio/detail/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename ConstBufferSequence>
+class io_uring_socket_send_op_base : public io_uring_operation
+{
+public:
+ io_uring_socket_send_op_base(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state,
+ const ConstBufferSequence& buffers,
+ socket_base::message_flags flags, func_type complete_func)
+ : io_uring_operation(success_ec,
+ &io_uring_socket_send_op_base::do_prepare,
+ &io_uring_socket_send_op_base::do_perform, complete_func),
+ socket_(socket),
+ state_(state),
+ buffers_(buffers),
+ flags_(flags),
+ bufs_(buffers),
+ msghdr_()
+ {
+ msghdr_.msg_iov = bufs_.buffers();
+ msghdr_.msg_iovlen = static_cast<int>(bufs_.count());
+ }
+
+ static void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_send_op_base* o(
+ static_cast<io_uring_socket_send_op_base*>(base));
+
+ if ((o->state_ & socket_ops::internal_non_blocking) != 0)
+ {
+ ::io_uring_prep_poll_add(sqe, o->socket_, POLLOUT);
+ }
+ else if (o->bufs_.is_single_buffer
+ && o->bufs_.is_registered_buffer && o->flags_ == 0)
+ {
+ ::io_uring_prep_write_fixed(sqe, o->socket_,
+ o->bufs_.buffers()->iov_base, o->bufs_.buffers()->iov_len,
+ 0, o->bufs_.registered_id().native_handle());
+ }
+ else
+ {
+ ::io_uring_prep_sendmsg(sqe, o->socket_, &o->msghdr_, o->flags_);
+ }
+ }
+
+ static bool do_perform(io_uring_operation* base, bool after_completion)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_send_op_base* o(
+ static_cast<io_uring_socket_send_op_base*>(base));
+
+ if ((o->state_ & socket_ops::internal_non_blocking) != 0)
+ {
+ if (o->bufs_.is_single_buffer)
+ {
+ return socket_ops::non_blocking_send1(o->socket_,
+ o->bufs_.first(o->buffers_).data(),
+ o->bufs_.first(o->buffers_).size(), o->flags_,
+ o->ec_, o->bytes_transferred_);
+ }
+ else
+ {
+ return socket_ops::non_blocking_send(o->socket_,
+ o->bufs_.buffers(), o->bufs_.count(), o->flags_,
+ o->ec_, o->bytes_transferred_);
+ }
+ }
+
+ if (o->ec_ && o->ec_ == asio::error::would_block)
+ {
+ o->state_ |= socket_ops::internal_non_blocking;
+ return false;
+ }
+
+ return after_completion;
+ }
+
+private:
+ socket_type socket_;
+ socket_ops::state_type state_;
+ ConstBufferSequence buffers_;
+ socket_base::message_flags flags_;
+ buffer_sequence_adapter<asio::const_buffer, ConstBufferSequence> bufs_;
+ msghdr msghdr_;
+};
+
+template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+class io_uring_socket_send_op
+ : public io_uring_socket_send_op_base<ConstBufferSequence>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_socket_send_op);
+
+ io_uring_socket_send_op(const asio::error_code& success_ec,
+ int socket, socket_ops::state_type state,
+ const ConstBufferSequence& buffers, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ : io_uring_socket_send_op_base<ConstBufferSequence>(success_ec,
+ socket, state, buffers, flags, &io_uring_socket_send_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_send_op* o
+ (static_cast<io_uring_socket_send_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_SOCKET_SEND_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_socket_sendto_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_socket_sendto_op.hpp
new file mode 100644
index 00000000000..1866938a4b4
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_socket_sendto_op.hpp
@@ -0,0 +1,194 @@
+//
+// detail/io_uring_socket_sendto_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_SOCKET_SENDTO_OP_HPP
+#define ASIO_DETAIL_IO_URING_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"
+
+#if defined(ASIO_HAS_IO_URING)
+
+#include "asio/detail/bind_handler.hpp"
+#include "asio/detail/buffer_sequence_adapter.hpp"
+#include "asio/detail/socket_ops.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/handler_work.hpp"
+#include "asio/detail/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename ConstBufferSequence, typename Endpoint>
+class io_uring_socket_sendto_op_base : public io_uring_operation
+{
+public:
+ io_uring_socket_sendto_op_base(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state,
+ const ConstBufferSequence& buffers, const Endpoint& endpoint,
+ socket_base::message_flags flags, func_type complete_func)
+ : io_uring_operation(success_ec,
+ &io_uring_socket_sendto_op_base::do_prepare,
+ &io_uring_socket_sendto_op_base::do_perform, complete_func),
+ socket_(socket),
+ state_(state),
+ buffers_(buffers),
+ destination_(endpoint),
+ flags_(flags),
+ bufs_(buffers),
+ msghdr_()
+ {
+ msghdr_.msg_iov = bufs_.buffers();
+ msghdr_.msg_iovlen = static_cast<int>(bufs_.count());
+ msghdr_.msg_name = static_cast<sockaddr*>(
+ static_cast<void*>(destination_.data()));
+ msghdr_.msg_namelen = destination_.size();
+ }
+
+ static void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_sendto_op_base* o(
+ static_cast<io_uring_socket_sendto_op_base*>(base));
+
+ if ((o->state_ & socket_ops::internal_non_blocking) != 0)
+ {
+ ::io_uring_prep_poll_add(sqe, o->socket_, POLLOUT);
+ }
+ else
+ {
+ ::io_uring_prep_sendmsg(sqe, o->socket_, &o->msghdr_, o->flags_);
+ }
+ }
+
+ static bool do_perform(io_uring_operation* base, bool after_completion)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_sendto_op_base* o(
+ static_cast<io_uring_socket_sendto_op_base*>(base));
+
+ if ((o->state_ & socket_ops::internal_non_blocking) != 0)
+ {
+ if (o->bufs_.is_single_buffer)
+ {
+ return socket_ops::non_blocking_sendto1(o->socket_,
+ o->bufs_.first(o->buffers_).data(),
+ o->bufs_.first(o->buffers_).size(), o->flags_,
+ o->destination_.data(), o->destination_.size(),
+ o->ec_, o->bytes_transferred_);
+ }
+ else
+ {
+ return socket_ops::non_blocking_sendto(o->socket_,
+ o->bufs_.buffers(), o->bufs_.count(), o->flags_,
+ o->destination_.data(), o->destination_.size(),
+ o->ec_, o->bytes_transferred_);
+ }
+ }
+
+ if (o->ec_ && o->ec_ == asio::error::would_block)
+ {
+ o->state_ |= socket_ops::internal_non_blocking;
+ return false;
+ }
+
+ return after_completion;
+ }
+
+private:
+ socket_type socket_;
+ socket_ops::state_type state_;
+ ConstBufferSequence buffers_;
+ Endpoint destination_;
+ socket_base::message_flags flags_;
+ buffer_sequence_adapter<asio::const_buffer, ConstBufferSequence> bufs_;
+ msghdr msghdr_;
+};
+
+template <typename ConstBufferSequence, typename Endpoint,
+ typename Handler, typename IoExecutor>
+class io_uring_socket_sendto_op
+ : public io_uring_socket_sendto_op_base<ConstBufferSequence, Endpoint>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_socket_sendto_op);
+
+ io_uring_socket_sendto_op(const asio::error_code& success_ec,
+ int socket, socket_ops::state_type state,
+ const ConstBufferSequence& buffers, const Endpoint& endpoint,
+ socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ : io_uring_socket_sendto_op_base<ConstBufferSequence, Endpoint>(
+ success_ec, socket, state, buffers, endpoint, flags,
+ &io_uring_socket_sendto_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_socket_sendto_op* o
+ (static_cast<io_uring_socket_sendto_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_SOCKET_SENDTO_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_socket_service.hpp b/3rdparty/asio/include/asio/detail/io_uring_socket_service.hpp
new file mode 100644
index 00000000000..3daa22ef797
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_socket_service.hpp
@@ -0,0 +1,629 @@
+//
+// detail/io_uring_socket_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_SOCKET_SERVICE_HPP
+#define ASIO_DETAIL_IO_URING_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_IO_URING)
+
+#include "asio/buffer.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_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/io_uring_null_buffers_op.hpp"
+#include "asio/detail/io_uring_service.hpp"
+#include "asio/detail/io_uring_socket_accept_op.hpp"
+#include "asio/detail/io_uring_socket_connect_op.hpp"
+#include "asio/detail/io_uring_socket_recvfrom_op.hpp"
+#include "asio/detail/io_uring_socket_sendto_op.hpp"
+#include "asio/detail/io_uring_socket_service_base.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 <typename Protocol>
+class io_uring_socket_service :
+ public execution_context_service_base<io_uring_socket_service<Protocol>>,
+ public io_uring_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 :
+ io_uring_socket_service_base::base_implementation_type
+ {
+ // Default constructor.
+ implementation_type()
+ : protocol_(endpoint_type().protocol())
+ {
+ }
+
+ // The protocol associated with the socket.
+ protocol_type protocol_;
+ };
+
+ // Constructor.
+ io_uring_socket_service(execution_context& context)
+ : execution_context_service_base<
+ io_uring_socket_service<Protocol>>(context),
+ io_uring_socket_service_base(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) noexcept
+ {
+ 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,
+ io_uring_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 <typename Protocol1>
+ void converting_move_construct(implementation_type& impl,
+ io_uring_socket_service<Protocol1>&,
+ typename io_uring_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;
+ ASIO_ERROR_LOCATION(ec);
+ 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;
+ ASIO_ERROR_LOCATION(ec);
+ 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);
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Set a socket option.
+ template <typename Option>
+ 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);
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Set a socket option.
+ template <typename Option>
+ 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);
+ ASIO_ERROR_LOCATION(ec);
+ 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))
+ {
+ ASIO_ERROR_LOCATION(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))
+ {
+ ASIO_ERROR_LOCATION(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);
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Send a datagram to the specified endpoint. Returns the number of bytes
+ // sent.
+ template <typename ConstBufferSequence>
+ size_t send_to(implementation_type& impl, const ConstBufferSequence& buffers,
+ const endpoint_type& destination, socket_base::message_flags flags,
+ asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs_type;
+
+ size_t n;
+ if (bufs_type::is_single_buffer)
+ {
+ n = socket_ops::sync_sendto1(impl.socket_, impl.state_,
+ bufs_type::first(buffers).data(),
+ bufs_type::first(buffers).size(), flags,
+ destination.data(), destination.size(), ec);
+ }
+ else
+ {
+ bufs_type bufs(buffers);
+ n = socket_ops::sync_sendto(impl.socket_, impl.state_,
+ bufs.buffers(), bufs.count(), flags,
+ destination.data(), destination.size(), ec);
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return n;
+ }
+
+ // 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);
+ ASIO_ERROR_LOCATION(ec);
+ return 0;
+ }
+
+ // Start an asynchronous send. The data being sent must be valid for the
+ // lifetime of the asynchronous operation.
+ template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_send_to(implementation_type& impl,
+ const ConstBufferSequence& buffers,
+ const endpoint_type& destination, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_socket_sendto_op<ConstBufferSequence,
+ endpoint_type, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_, impl.state_,
+ buffers, destination, flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::write_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "socket", &impl, impl.socket_, "async_send_to"));
+
+ start_op(impl, io_uring_service::write_op, p.p, is_continuation, false);
+ p.v = p.p = 0;
+ }
+
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_send_to(implementation_type& impl, const null_buffers&,
+ const endpoint_type&, socket_base::message_flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_, POLLOUT, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::write_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p, "socket",
+ &impl, impl.socket_, "async_send_to(null_buffers)"));
+
+ start_op(impl, io_uring_service::write_op, p.p, is_continuation, false);
+ p.v = p.p = 0;
+ }
+
+ // Receive a datagram with the endpoint of the sender. Returns the number of
+ // bytes received.
+ template <typename MutableBufferSequence>
+ size_t receive_from(implementation_type& impl,
+ const MutableBufferSequence& buffers,
+ endpoint_type& sender_endpoint, socket_base::message_flags flags,
+ asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_type;
+
+ std::size_t addr_len = sender_endpoint.capacity();
+ std::size_t n;
+ if (bufs_type::is_single_buffer)
+ {
+ n = socket_ops::sync_recvfrom1(impl.socket_, impl.state_,
+ bufs_type::first(buffers).data(), bufs_type::first(buffers).size(),
+ flags, sender_endpoint.data(), &addr_len, ec);
+ }
+ else
+ {
+ bufs_type bufs(buffers);
+ n = 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);
+
+ ASIO_ERROR_LOCATION(ec);
+ return n;
+ }
+
+ // 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();
+
+ ASIO_ERROR_LOCATION(ec);
+ 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_receive_from(implementation_type& impl,
+ const MutableBufferSequence& buffers, endpoint_type& sender_endpoint,
+ socket_base::message_flags flags, Handler& handler,
+ const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ int op_type = (flags & socket_base::message_out_of_band)
+ ? io_uring_service::except_op : io_uring_service::read_op;
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_socket_recvfrom_op<MutableBufferSequence,
+ endpoint_type, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_, impl.state_,
+ buffers, sender_endpoint, flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(
+ &io_uring_service_, &impl.io_object_data_, op_type);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "socket", &impl, impl.socket_, "async_receive_from"));
+
+ start_op(impl, op_type, p.p, is_continuation, false);
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_receive_from(implementation_type& impl, const null_buffers&,
+ endpoint_type& sender_endpoint, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ int op_type;
+ int poll_flags;
+ if ((flags & socket_base::message_out_of_band) != 0)
+ {
+ op_type = io_uring_service::except_op;
+ poll_flags = POLLPRI;
+ }
+ else
+ {
+ op_type = io_uring_service::read_op;
+ poll_flags = POLLIN;
+ }
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_, poll_flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(
+ &io_uring_service_, &impl.io_object_data_, op_type);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.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, op_type, p.p, is_continuation, false);
+ p.v = p.p = 0;
+ }
+
+ // Accept a new connection.
+ template <typename Socket>
+ 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;
+ ASIO_ERROR_LOCATION(ec);
+ 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();
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Start an asynchronous accept. The peer and peer_endpoint objects must be
+ // valid until the accept's handler is invoked.
+ template <typename Socket, typename Handler, typename IoExecutor>
+ void async_accept(implementation_type& impl, Socket& peer,
+ endpoint_type* peer_endpoint, Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_socket_accept_op<Socket, Protocol, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_, impl.state_,
+ peer, impl.protocol_, peer_endpoint, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected() && !peer.is_open())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::read_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.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;
+ }
+
+ // Start an asynchronous accept. The peer_endpoint object must be valid until
+ // the accept's handler is invoked.
+ template <typename PeerIoExecutor, typename Handler, typename IoExecutor>
+ void async_move_accept(implementation_type& impl,
+ const PeerIoExecutor& peer_io_ex, endpoint_type* peer_endpoint,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_socket_move_accept_op<Protocol,
+ PeerIoExecutor, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, peer_io_ex, impl.socket_,
+ impl.state_, impl.protocol_, peer_endpoint, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::read_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "socket", &impl, impl.socket_, "async_accept"));
+
+ start_accept_op(impl, p.p, is_continuation, false);
+ p.v = p.p = 0;
+ }
+
+ // 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 <typename Handler, typename IoExecutor>
+ void async_connect(implementation_type& impl,
+ const endpoint_type& peer_endpoint,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_socket_connect_op<Protocol, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_,
+ peer_endpoint, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::write_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "socket", &impl, impl.socket_, "async_connect"));
+
+ start_op(impl, io_uring_service::write_op, p.p, is_continuation, false);
+ p.v = p.p = 0;
+ }
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_SOCKET_SERVICE_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_socket_service_base.hpp b/3rdparty/asio/include/asio/detail/io_uring_socket_service_base.hpp
new file mode 100644
index 00000000000..99b075c9fe5
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_socket_service_base.hpp
@@ -0,0 +1,663 @@
+//
+// detail/io_uring_socket_service_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_SOCKET_SERVICE_BASE_HPP
+#define ASIO_DETAIL_IO_URING_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_IO_URING)
+
+#include "asio/associated_cancellation_slot.hpp"
+#include "asio/buffer.hpp"
+#include "asio/cancellation_type.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/socket_base.hpp"
+#include "asio/detail/buffer_sequence_adapter.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/io_uring_null_buffers_op.hpp"
+#include "asio/detail/io_uring_service.hpp"
+#include "asio/detail/io_uring_socket_recv_op.hpp"
+#include "asio/detail/io_uring_socket_recvmsg_op.hpp"
+#include "asio/detail/io_uring_socket_send_op.hpp"
+#include "asio/detail/io_uring_wait_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 io_uring_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 I/O object data used by the io_uring_service.
+ io_uring_service::per_io_object_data io_object_data_;
+ };
+
+ // Constructor.
+ ASIO_DECL io_uring_socket_service_base(execution_context& 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) noexcept;
+
+ // Move-assign from another socket implementation.
+ ASIO_DECL void base_move_assign(base_implementation_type& impl,
+ io_uring_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 <typename IO_Control_Command>
+ 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<ioctl_arg_type*>(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 <typename Handler, typename IoExecutor>
+ void async_wait(base_implementation_type& impl,
+ socket_base::wait_type w, Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ int op_type;
+ int poll_flags;
+ switch (w)
+ {
+ case socket_base::wait_read:
+ op_type = io_uring_service::read_op;
+ poll_flags = POLLIN;
+ break;
+ case socket_base::wait_write:
+ op_type = io_uring_service::write_op;
+ poll_flags = POLLOUT;
+ break;
+ case socket_base::wait_error:
+ op_type = io_uring_service::except_op;
+ poll_flags = POLLPRI | POLLERR | POLLHUP;
+ break;
+ default:
+ op_type = -1;
+ poll_flags = -1;
+ return;
+ }
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_wait_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_,
+ poll_flags, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "socket", &impl, impl.socket_, "async_wait"));
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(
+ &io_uring_service_, &impl.io_object_data_, op_type);
+ }
+
+ start_op(impl, op_type, p.p, is_continuation, op_type == -1);
+ p.v = p.p = 0;
+ }
+
+ // Send the given data to the peer.
+ template <typename ConstBufferSequence>
+ size_t send(base_implementation_type& impl,
+ const ConstBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs_type;
+
+ if (bufs_type::is_single_buffer)
+ {
+ return socket_ops::sync_send1(impl.socket_,
+ impl.state_, bufs_type::first(buffers).data(),
+ bufs_type::first(buffers).size(), flags, ec);
+ }
+ else
+ {
+ bufs_type 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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_send(base_implementation_type& impl,
+ const ConstBufferSequence& buffers, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_socket_send_op<
+ ConstBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_,
+ impl.state_, buffers, flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::write_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "socket", &impl, impl.socket_, "async_send"));
+
+ start_op(impl, io_uring_service::write_op, p.p, is_continuation,
+ ((impl.state_ & socket_ops::stream_oriented)
+ && buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence>::all_empty(buffers)));
+ p.v = p.p = 0;
+ }
+
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_send(base_implementation_type& impl, const null_buffers&,
+ socket_base::message_flags, Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_, POLLOUT, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(&io_uring_service_,
+ &impl.io_object_data_, io_uring_service::write_op);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "socket", &impl, impl.socket_, "async_send(null_buffers)"));
+
+ start_op(impl, io_uring_service::write_op, p.p, is_continuation, false);
+ p.v = p.p = 0;
+ }
+
+ // Receive some data from the peer. Returns the number of bytes received.
+ template <typename MutableBufferSequence>
+ size_t receive(base_implementation_type& impl,
+ const MutableBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_type;
+
+ if (bufs_type::is_single_buffer)
+ {
+ return socket_ops::sync_recv1(impl.socket_,
+ impl.state_, bufs_type::first(buffers).data(),
+ bufs_type::first(buffers).size(), flags, ec);
+ }
+ else
+ {
+ bufs_type 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_receive(base_implementation_type& impl,
+ const MutableBufferSequence& buffers, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ int op_type = (flags & socket_base::message_out_of_band)
+ ? io_uring_service::except_op : io_uring_service::read_op;
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_socket_recv_op<
+ MutableBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_,
+ impl.state_, buffers, flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(
+ &io_uring_service_, &impl.io_object_data_, op_type);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "socket", &impl, impl.socket_, "async_receive"));
+
+ start_op(impl, op_type, p.p, is_continuation,
+ ((impl.state_ & socket_ops::stream_oriented)
+ && buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence>::all_empty(buffers)));
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_receive(base_implementation_type& impl,
+ const null_buffers&, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ int op_type;
+ int poll_flags;
+ if ((flags & socket_base::message_out_of_band) != 0)
+ {
+ op_type = io_uring_service::except_op;
+ poll_flags = POLLPRI;
+ }
+ else
+ {
+ op_type = io_uring_service::read_op;
+ poll_flags = POLLIN;
+ }
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_, poll_flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(
+ &io_uring_service_, &impl.io_object_data_, op_type);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "socket", &impl, impl.socket_, "async_receive(null_buffers)"));
+
+ start_op(impl, op_type, p.p, is_continuation, false);
+ p.v = p.p = 0;
+ }
+
+ // Receive some data with associated flags. Returns the number of bytes
+ // received.
+ template <typename MutableBufferSequence>
+ 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<asio::mutable_buffer,
+ MutableBufferSequence> 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ 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,
+ const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ int op_type = (in_flags & socket_base::message_out_of_band)
+ ? io_uring_service::except_op : io_uring_service::read_op;
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_socket_recvmsg_op<
+ MutableBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_, impl.state_,
+ buffers, in_flags, out_flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(
+ &io_uring_service_, &impl.io_object_data_, op_type);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.context(), *p.p,
+ "socket", &impl, impl.socket_, "async_receive_with_flags"));
+
+ start_op(impl, op_type, p.p, is_continuation, false);
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ 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,
+ const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ int op_type;
+ int poll_flags;
+ if ((in_flags & socket_base::message_out_of_band) != 0)
+ {
+ op_type = io_uring_service::except_op;
+ poll_flags = POLLPRI;
+ }
+ else
+ {
+ op_type = io_uring_service::read_op;
+ poll_flags = POLLIN;
+ }
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef io_uring_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_, poll_flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<io_uring_op_cancellation>(
+ &io_uring_service_, &impl.io_object_data_, op_type);
+ }
+
+ ASIO_HANDLER_CREATION((io_uring_service_.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, op_type, p.p, is_continuation, 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,
+ io_uring_operation* op, bool is_continuation, bool noop);
+
+ // Start the asynchronous accept operation.
+ ASIO_DECL void start_accept_op(base_implementation_type& impl,
+ io_uring_operation* op, bool is_continuation, bool peer_is_open);
+
+ // Helper class used to implement per-operation cancellation
+ class io_uring_op_cancellation
+ {
+ public:
+ io_uring_op_cancellation(io_uring_service* s,
+ io_uring_service::per_io_object_data* p, int o)
+ : io_uring_service_(s),
+ io_object_data_(p),
+ op_type_(o)
+ {
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ if (!!(type &
+ (cancellation_type::terminal
+ | cancellation_type::partial
+ | cancellation_type::total)))
+ {
+ io_uring_service_->cancel_ops_by_key(*io_object_data_, op_type_, this);
+ }
+ }
+
+ private:
+ io_uring_service* io_uring_service_;
+ io_uring_service::per_io_object_data* io_object_data_;
+ int op_type_;
+ };
+
+ // The io_uring_service that performs event demultiplexing for the service.
+ io_uring_service& io_uring_service_;
+
+ // Cached success value to avoid accessing category singleton.
+ const asio::error_code success_ec_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#if defined(ASIO_HEADER_ONLY)
+# include "asio/detail/impl/io_uring_socket_service_base.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // defined(ASIO_HAS_IO_URING)
+
+#endif // ASIO_DETAIL_IO_URING_SOCKET_SERVICE_BASE_HPP
diff --git a/3rdparty/asio/include/asio/detail/io_uring_wait_op.hpp b/3rdparty/asio/include/asio/detail/io_uring_wait_op.hpp
new file mode 100644
index 00000000000..4dec72ce42c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/io_uring_wait_op.hpp
@@ -0,0 +1,112 @@
+//
+// detail/io_uring_wait_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_URING_WAIT_OP_HPP
+#define ASIO_DETAIL_IO_URING_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/bind_handler.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/handler_alloc_helpers.hpp"
+#include "asio/detail/handler_work.hpp"
+#include "asio/detail/io_uring_operation.hpp"
+#include "asio/detail/memory.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Handler, typename IoExecutor>
+class io_uring_wait_op : public io_uring_operation
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(io_uring_wait_op);
+
+ io_uring_wait_op(const asio::error_code& success_ec, int descriptor,
+ int poll_flags, Handler& handler, const IoExecutor& io_ex)
+ : io_uring_operation(success_ec, &io_uring_wait_op::do_prepare,
+ &io_uring_wait_op::do_perform, &io_uring_wait_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex),
+ descriptor_(descriptor),
+ poll_flags_(poll_flags)
+ {
+ }
+
+ static void do_prepare(io_uring_operation* base, ::io_uring_sqe* sqe)
+ {
+ ASIO_ASSUME(base != 0);
+ io_uring_wait_op* o(static_cast<io_uring_wait_op*>(base));
+
+ ::io_uring_prep_poll_add(sqe, o->descriptor_, o->poll_flags_);
+ }
+
+ static bool do_perform(io_uring_operation*, bool after_completion)
+ {
+ return after_completion;
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ io_uring_wait_op* o(static_cast<io_uring_wait_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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::binder1<Handler, asio::error_code>
+ 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_, handler.arg2_));
+ w.complete(handler, handler.handler_);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+ }
+
+private:
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+ int descriptor_;
+ int poll_flags_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_IO_URING_WAIT_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/is_buffer_sequence.hpp b/3rdparty/asio/include/asio/detail/is_buffer_sequence.hpp
new file mode 100644
index 00000000000..c64e7b16824
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/is_buffer_sequence.hpp
@@ -0,0 +1,296 @@
+//
+// detail/is_buffer_sequence.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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;
+class mutable_registered_buffer;
+class const_registered_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();
+ void grow();
+ void shrink();
+};
+
+template <typename T>
+struct buffer_sequence_memfns_derived
+ : T, buffer_sequence_memfns_base
+{
+};
+
+template <typename T, T>
+struct buffer_sequence_memfns_check
+{
+};
+
+template <typename>
+char buffer_sequence_begin_helper(...);
+
+template <typename T>
+char (&buffer_sequence_begin_helper(T* t,
+ enable_if_t<!is_same<
+ decltype(asio::buffer_sequence_begin(*t)),
+ void>::value>*))[2];
+
+template <typename>
+char buffer_sequence_end_helper(...);
+
+template <typename T>
+char (&buffer_sequence_end_helper(T* t,
+ enable_if_t<!is_same<
+ decltype(asio::buffer_sequence_end(*t)),
+ void>::value>*))[2];
+
+template <typename>
+char (&size_memfn_helper(...))[2];
+
+template <typename T>
+char size_memfn_helper(
+ buffer_sequence_memfns_check<
+ void (buffer_sequence_memfns_base::*)(),
+ &buffer_sequence_memfns_derived<T>::size>*);
+
+template <typename>
+char (&max_size_memfn_helper(...))[2];
+
+template <typename T>
+char max_size_memfn_helper(
+ buffer_sequence_memfns_check<
+ void (buffer_sequence_memfns_base::*)(),
+ &buffer_sequence_memfns_derived<T>::max_size>*);
+
+template <typename>
+char (&capacity_memfn_helper(...))[2];
+
+template <typename T>
+char capacity_memfn_helper(
+ buffer_sequence_memfns_check<
+ void (buffer_sequence_memfns_base::*)(),
+ &buffer_sequence_memfns_derived<T>::capacity>*);
+
+template <typename>
+char (&data_memfn_helper(...))[2];
+
+template <typename T>
+char data_memfn_helper(
+ buffer_sequence_memfns_check<
+ void (buffer_sequence_memfns_base::*)(),
+ &buffer_sequence_memfns_derived<T>::data>*);
+
+template <typename>
+char (&prepare_memfn_helper(...))[2];
+
+template <typename T>
+char prepare_memfn_helper(
+ buffer_sequence_memfns_check<
+ void (buffer_sequence_memfns_base::*)(),
+ &buffer_sequence_memfns_derived<T>::prepare>*);
+
+template <typename>
+char (&commit_memfn_helper(...))[2];
+
+template <typename T>
+char commit_memfn_helper(
+ buffer_sequence_memfns_check<
+ void (buffer_sequence_memfns_base::*)(),
+ &buffer_sequence_memfns_derived<T>::commit>*);
+
+template <typename>
+char (&consume_memfn_helper(...))[2];
+
+template <typename T>
+char consume_memfn_helper(
+ buffer_sequence_memfns_check<
+ void (buffer_sequence_memfns_base::*)(),
+ &buffer_sequence_memfns_derived<T>::consume>*);
+
+template <typename>
+char (&grow_memfn_helper(...))[2];
+
+template <typename T>
+char grow_memfn_helper(
+ buffer_sequence_memfns_check<
+ void (buffer_sequence_memfns_base::*)(),
+ &buffer_sequence_memfns_derived<T>::grow>*);
+
+template <typename>
+char (&shrink_memfn_helper(...))[2];
+
+template <typename T>
+char shrink_memfn_helper(
+ buffer_sequence_memfns_check<
+ void (buffer_sequence_memfns_base::*)(),
+ &buffer_sequence_memfns_derived<T>::shrink>*);
+
+template <typename, typename>
+char (&buffer_sequence_element_type_helper(...))[2];
+
+template <typename T, typename Buffer>
+char buffer_sequence_element_type_helper(T* t,
+ enable_if_t<is_convertible<
+ decltype(*asio::buffer_sequence_begin(*t)),
+ Buffer>::value>*);
+
+template <typename>
+char (&const_buffers_type_typedef_helper(...))[2];
+
+template <typename T>
+char const_buffers_type_typedef_helper(
+ typename T::const_buffers_type*);
+
+template <typename>
+char (&mutable_buffers_type_typedef_helper(...))[2];
+
+template <typename T>
+char mutable_buffers_type_typedef_helper(
+ typename T::mutable_buffers_type*);
+
+template <typename T, typename Buffer>
+struct is_buffer_sequence_class
+ : integral_constant<bool,
+ sizeof(buffer_sequence_begin_helper<T>(0, 0)) != 1 &&
+ sizeof(buffer_sequence_end_helper<T>(0, 0)) != 1 &&
+ sizeof(buffer_sequence_element_type_helper<T, Buffer>(0, 0)) == 1>
+{
+};
+
+template <typename T, typename Buffer>
+struct is_buffer_sequence
+ : conditional<is_class<T>::value,
+ is_buffer_sequence_class<T, Buffer>,
+ false_type>::type
+{
+};
+
+template <>
+struct is_buffer_sequence<mutable_buffer, mutable_buffer>
+ : true_type
+{
+};
+
+template <>
+struct is_buffer_sequence<mutable_buffer, const_buffer>
+ : true_type
+{
+};
+
+template <>
+struct is_buffer_sequence<const_buffer, const_buffer>
+ : true_type
+{
+};
+
+template <>
+struct is_buffer_sequence<const_buffer, mutable_buffer>
+ : false_type
+{
+};
+
+template <>
+struct is_buffer_sequence<mutable_registered_buffer, mutable_buffer>
+ : true_type
+{
+};
+
+template <>
+struct is_buffer_sequence<mutable_registered_buffer, const_buffer>
+ : true_type
+{
+};
+
+template <>
+struct is_buffer_sequence<const_registered_buffer, const_buffer>
+ : true_type
+{
+};
+
+template <>
+struct is_buffer_sequence<const_registered_buffer, mutable_buffer>
+ : false_type
+{
+};
+
+template <typename T>
+struct is_dynamic_buffer_class_v1
+ : integral_constant<bool,
+ sizeof(size_memfn_helper<T>(0)) != 1 &&
+ sizeof(max_size_memfn_helper<T>(0)) != 1 &&
+ sizeof(capacity_memfn_helper<T>(0)) != 1 &&
+ sizeof(data_memfn_helper<T>(0)) != 1 &&
+ sizeof(consume_memfn_helper<T>(0)) != 1 &&
+ sizeof(prepare_memfn_helper<T>(0)) != 1 &&
+ sizeof(commit_memfn_helper<T>(0)) != 1 &&
+ sizeof(const_buffers_type_typedef_helper<T>(0)) == 1 &&
+ sizeof(mutable_buffers_type_typedef_helper<T>(0)) == 1>
+{
+};
+
+template <typename T>
+struct is_dynamic_buffer_v1
+ : conditional<is_class<T>::value,
+ is_dynamic_buffer_class_v1<T>,
+ false_type>::type
+{
+};
+
+template <typename T>
+struct is_dynamic_buffer_class_v2
+ : integral_constant<bool,
+ sizeof(size_memfn_helper<T>(0)) != 1 &&
+ sizeof(max_size_memfn_helper<T>(0)) != 1 &&
+ sizeof(capacity_memfn_helper<T>(0)) != 1 &&
+ sizeof(data_memfn_helper<T>(0)) != 1 &&
+ sizeof(consume_memfn_helper<T>(0)) != 1 &&
+ sizeof(grow_memfn_helper<T>(0)) != 1 &&
+ sizeof(shrink_memfn_helper<T>(0)) != 1 &&
+ sizeof(const_buffers_type_typedef_helper<T>(0)) == 1 &&
+ sizeof(mutable_buffers_type_typedef_helper<T>(0)) == 1>
+{
+};
+
+template <typename T>
+struct is_dynamic_buffer_v2
+ : conditional<is_class<T>::value,
+ is_dynamic_buffer_class_v2<T>,
+ false_type>::type
+{
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP
diff --git a/3rdparty/asio/include/asio/detail/is_executor.hpp b/3rdparty/asio/include/asio/detail/is_executor.hpp
new file mode 100644
index 00000000000..2636f9c66f3
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/is_executor.hpp
@@ -0,0 +1,126 @@
+//
+// detail/is_executor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename T>
+struct executor_memfns_derived
+ : T, executor_memfns_base
+{
+};
+
+template <typename T, T>
+struct executor_memfns_check
+{
+};
+
+template <typename>
+char (&context_memfn_helper(...))[2];
+
+template <typename T>
+char context_memfn_helper(
+ executor_memfns_check<
+ void (executor_memfns_base::*)(),
+ &executor_memfns_derived<T>::context>*);
+
+template <typename>
+char (&on_work_started_memfn_helper(...))[2];
+
+template <typename T>
+char on_work_started_memfn_helper(
+ executor_memfns_check<
+ void (executor_memfns_base::*)(),
+ &executor_memfns_derived<T>::on_work_started>*);
+
+template <typename>
+char (&on_work_finished_memfn_helper(...))[2];
+
+template <typename T>
+char on_work_finished_memfn_helper(
+ executor_memfns_check<
+ void (executor_memfns_base::*)(),
+ &executor_memfns_derived<T>::on_work_finished>*);
+
+template <typename>
+char (&dispatch_memfn_helper(...))[2];
+
+template <typename T>
+char dispatch_memfn_helper(
+ executor_memfns_check<
+ void (executor_memfns_base::*)(),
+ &executor_memfns_derived<T>::dispatch>*);
+
+template <typename>
+char (&post_memfn_helper(...))[2];
+
+template <typename T>
+char post_memfn_helper(
+ executor_memfns_check<
+ void (executor_memfns_base::*)(),
+ &executor_memfns_derived<T>::post>*);
+
+template <typename>
+char (&defer_memfn_helper(...))[2];
+
+template <typename T>
+char defer_memfn_helper(
+ executor_memfns_check<
+ void (executor_memfns_base::*)(),
+ &executor_memfns_derived<T>::defer>*);
+
+template <typename T>
+struct is_executor_class
+ : integral_constant<bool,
+ sizeof(context_memfn_helper<T>(0)) != 1 &&
+ sizeof(on_work_started_memfn_helper<T>(0)) != 1 &&
+ sizeof(on_work_finished_memfn_helper<T>(0)) != 1 &&
+ sizeof(dispatch_memfn_helper<T>(0)) != 1 &&
+ sizeof(post_memfn_helper<T>(0)) != 1 &&
+ sizeof(defer_memfn_helper<T>(0)) != 1>
+{
+};
+
+template <typename T>
+struct is_executor
+ : conditional<is_class<T>::value,
+ is_executor_class<T>,
+ false_type>::type
+{
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_IS_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/detail/keyword_tss_ptr.hpp b/3rdparty/asio/include/asio/detail/keyword_tss_ptr.hpp
new file mode 100644
index 00000000000..2e42df8b358
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/keyword_tss_ptr.hpp
@@ -0,0 +1,70 @@
+//
+// detail/keyword_tss_ptr.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename T>
+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 <typename T>
+ASIO_THREAD_KEYWORD T* keyword_tss_ptr<T>::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/3rdparty/asio/include/asio/detail/kqueue_reactor.hpp b/3rdparty/asio/include/asio/detail/kqueue_reactor.hpp
new file mode 100644
index 00000000000..f034410d6d5
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/kqueue_reactor.hpp
@@ -0,0 +1,271 @@
+//
+// detail/kqueue_reactor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <cstddef>
+#include <sys/types.h>
+#include <sys/event.h>
+#include <sys/time.h>
+#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/scheduler_task.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<kqueue_reactor>,
+ public scheduler_task
+{
+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<reactor_op> 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(operation* op, bool is_continuation) const;
+
+ // Post a reactor operation for immediate completion.
+ ASIO_DECL static void call_post_immediate_completion(
+ operation* op, bool is_continuation, const void* self);
+
+ // 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,
+ void (*on_immediate)(operation*, bool, const void*),
+ const void* immediate_arg);
+
+ // Start a new operation. The reactor operation will be performed when the
+ // given descriptor is flagged as ready, or an error has occurred.
+ void start_op(int op_type, socket_type descriptor,
+ per_descriptor_data& descriptor_data, reactor_op* op,
+ bool is_continuation, bool allow_speculative)
+ {
+ start_op(op_type, descriptor, descriptor_data,
+ op, is_continuation, allow_speculative,
+ &kqueue_reactor::call_post_immediate_completion, this);
+ }
+
+ // 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 all operations associated with the given descriptor and key. The
+ // handlers associated with the descriptor will be invoked with the
+ // operation_aborted error.
+ ASIO_DECL void cancel_ops_by_key(socket_type descriptor,
+ per_descriptor_data& descriptor_data,
+ int op_type, void* cancellation_key);
+
+ // 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 <typename Time_Traits>
+ void add_timer_queue(timer_queue<Time_Traits>& queue);
+
+ // Remove a timer queue from the reactor.
+ template <typename Time_Traits>
+ void remove_timer_queue(timer_queue<Time_Traits>& queue);
+
+ // Schedule a new operation in the given timer queue to expire at the
+ // specified absolute time.
+ template <typename Time_Traits>
+ void schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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 <typename Time_Traits>
+ std::size_t cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled = (std::numeric_limits<std::size_t>::max)());
+
+ // Cancel the timer operations associated with the given key.
+ template <typename Time_Traits>
+ void cancel_timer_by_key(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data* timer,
+ void* cancellation_key);
+
+ // Move the timer operations associated with the given timer.
+ template <typename Time_Traits>
+ void move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& target,
+ typename timer_queue<Time_Traits>::per_timer_data& source);
+
+ // Run the kqueue loop.
+ ASIO_DECL void run(long usec, op_queue<operation>& 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<descriptor_state> 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/3rdparty/asio/include/asio/detail/limits.hpp b/3rdparty/asio/include/asio/detail/limits.hpp
new file mode 100644
index 00000000000..323af22b300
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/limits.hpp
@@ -0,0 +1,21 @@
+//
+// 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"
+#include <limits>
+
+#endif // ASIO_DETAIL_LIMITS_HPP
diff --git a/3rdparty/asio/include/asio/detail/local_free_on_block_exit.hpp b/3rdparty/asio/include/asio/detail/local_free_on_block_exit.hpp
new file mode 100644
index 00000000000..212f9c1bcd2
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/local_free_on_block_exit.hpp
@@ -0,0 +1,59 @@
+//
+// detail/local_free_on_block_exit.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/memory.hpp b/3rdparty/asio/include/asio/detail/memory.hpp
new file mode 100644
index 00000000000..173e49fe065
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/memory.hpp
@@ -0,0 +1,126 @@
+//
+// detail/memory.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <cstdlib>
+#include <memory>
+#include <new>
+#include "asio/detail/cstdint.hpp"
+#include "asio/detail/throw_exception.hpp"
+
+#if !defined(ASIO_HAS_STD_ALIGNED_ALLOC) \
+ && defined(ASIO_HAS_BOOST_ALIGN)
+# include <boost/align/aligned_alloc.hpp>
+#endif // !defined(ASIO_HAS_STD_ALIGNED_ALLOC)
+ // && defined(ASIO_HAS_BOOST_ALIGN)
+
+namespace asio {
+namespace detail {
+
+using std::allocate_shared;
+using std::make_shared;
+using std::shared_ptr;
+using std::weak_ptr;
+using std::addressof;
+
+#if defined(ASIO_HAS_STD_TO_ADDRESS)
+using std::to_address;
+#else // defined(ASIO_HAS_STD_TO_ADDRESS)
+template <typename T>
+inline T* to_address(T* p) { return p; }
+template <typename T>
+inline const T* to_address(const T* p) { return p; }
+template <typename T>
+inline volatile T* to_address(volatile T* p) { return p; }
+template <typename T>
+inline const volatile T* to_address(const volatile T* p) { return p; }
+#endif // defined(ASIO_HAS_STD_TO_ADDRESS)
+
+inline void* align(std::size_t alignment,
+ std::size_t size, void*& ptr, std::size_t& space)
+{
+ return std::align(alignment, size, ptr, space);
+}
+
+} // namespace detail
+
+using std::allocator_arg_t;
+# define ASIO_USES_ALLOCATOR(t) \
+ namespace std { \
+ template <typename Allocator> \
+ struct uses_allocator<t, Allocator> : true_type {}; \
+ } \
+ /**/
+# define ASIO_REBIND_ALLOC(alloc, t) \
+ typename std::allocator_traits<alloc>::template rebind_alloc<t>
+ /**/
+
+inline void* aligned_new(std::size_t align, std::size_t size)
+{
+#if defined(ASIO_HAS_STD_ALIGNED_ALLOC)
+ align = (align < ASIO_DEFAULT_ALIGN) ? ASIO_DEFAULT_ALIGN : align;
+ size = (size % align == 0) ? size : size + (align - size % align);
+ void* ptr = std::aligned_alloc(align, size);
+ if (!ptr)
+ {
+ std::bad_alloc ex;
+ asio::detail::throw_exception(ex);
+ }
+ return ptr;
+#elif defined(ASIO_HAS_BOOST_ALIGN)
+ align = (align < ASIO_DEFAULT_ALIGN) ? ASIO_DEFAULT_ALIGN : align;
+ size = (size % align == 0) ? size : size + (align - size % align);
+ void* ptr = boost::alignment::aligned_alloc(align, size);
+ if (!ptr)
+ {
+ std::bad_alloc ex;
+ asio::detail::throw_exception(ex);
+ }
+ return ptr;
+#elif defined(ASIO_MSVC)
+ align = (align < ASIO_DEFAULT_ALIGN) ? ASIO_DEFAULT_ALIGN : align;
+ size = (size % align == 0) ? size : size + (align - size % align);
+ void* ptr = _aligned_malloc(size, align);
+ if (!ptr)
+ {
+ std::bad_alloc ex;
+ asio::detail::throw_exception(ex);
+ }
+ return ptr;
+#else // defined(ASIO_MSVC)
+ (void)align;
+ return ::operator new(size);
+#endif // defined(ASIO_MSVC)
+}
+
+inline void aligned_delete(void* ptr)
+{
+#if defined(ASIO_HAS_STD_ALIGNED_ALLOC)
+ std::free(ptr);
+#elif defined(ASIO_HAS_BOOST_ALIGN)
+ boost::alignment::aligned_free(ptr);
+#elif defined(ASIO_MSVC)
+ _aligned_free(ptr);
+#else // defined(ASIO_MSVC)
+ ::operator delete(ptr);
+#endif // defined(ASIO_MSVC)
+}
+
+} // namespace asio
+
+#endif // ASIO_DETAIL_MEMORY_HPP
diff --git a/3rdparty/asio/include/asio/detail/mutex.hpp b/3rdparty/asio/include/asio/detail/mutex.hpp
new file mode 100644
index 00000000000..e701c238296
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/mutex.hpp
@@ -0,0 +1,46 @@
+//
+// detail/mutex.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#else
+# include "asio/detail/std_mutex.hpp"
+#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;
+#else
+typedef std_mutex mutex;
+#endif
+
+} // namespace detail
+} // namespace asio
+
+#endif // ASIO_DETAIL_MUTEX_HPP
diff --git a/3rdparty/asio/include/asio/detail/non_const_lvalue.hpp b/3rdparty/asio/include/asio/detail/non_const_lvalue.hpp
new file mode 100644
index 00000000000..940bf251b71
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/non_const_lvalue.hpp
@@ -0,0 +1,43 @@
+//
+// detail/non_const_lvalue.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_NON_CONST_LVALUE_HPP
+#define ASIO_DETAIL_NON_CONST_LVALUE_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 {
+
+template <typename T>
+struct non_const_lvalue
+{
+ explicit non_const_lvalue(T& t)
+ : value(static_cast<conditional_t<
+ is_same<T, decay_t<T>>::value, decay_t<T>&, T&&>>(t))
+ {
+ }
+
+ conditional_t<is_same<T, decay_t<T>>::value, decay_t<T>&, decay_t<T>> value;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_NON_CONST_LVALUE_HPP
diff --git a/3rdparty/asio/include/asio/detail/noncopyable.hpp b/3rdparty/asio/include/asio/detail/noncopyable.hpp
new file mode 100644
index 00000000000..7b80a89457a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/noncopyable.hpp
@@ -0,0 +1,43 @@
+//
+// detail/noncopyable.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/null_event.hpp b/3rdparty/asio/include/asio/detail/null_event.hpp
new file mode 100644
index 00000000000..d50724c9e5b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/null_event.hpp
@@ -0,0 +1,106 @@
+//
+// detail/null_event.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Lock>
+ void signal(Lock&)
+ {
+ }
+
+ // Signal all waiters.
+ template <typename Lock>
+ void signal_all(Lock&)
+ {
+ }
+
+ // Unlock the mutex and signal one waiter.
+ template <typename Lock>
+ void unlock_and_signal_one(Lock&)
+ {
+ }
+
+ // Unlock the mutex and signal one waiter who may destroy us.
+ template <typename Lock>
+ void unlock_and_signal_one_for_destruction(Lock&)
+ {
+ }
+
+ // If there's a waiter, unlock the mutex and signal it.
+ template <typename Lock>
+ bool maybe_unlock_and_signal_one(Lock&)
+ {
+ return false;
+ }
+
+ // Reset the event.
+ template <typename Lock>
+ void clear(Lock&)
+ {
+ }
+
+ // Wait for the event to become signalled.
+ template <typename Lock>
+ void wait(Lock&)
+ {
+ do_wait();
+ }
+
+ // Timed wait for the event to become signalled.
+ template <typename Lock>
+ 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/3rdparty/asio/include/asio/detail/null_fenced_block.hpp b/3rdparty/asio/include/asio/detail/null_fenced_block.hpp
new file mode 100644
index 00000000000..ccf65c3ca78
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/null_fenced_block.hpp
@@ -0,0 +1,47 @@
+//
+// detail/null_fenced_block.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/null_global.hpp b/3rdparty/asio/include/asio/detail/null_global.hpp
new file mode 100644
index 00000000000..ab8b9c87e61
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/null_global.hpp
@@ -0,0 +1,59 @@
+//
+// detail/null_global.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename T>
+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 <typename T>
+null_global_impl<T> null_global_impl<T>::instance_;
+
+template <typename T>
+T& null_global()
+{
+ if (null_global_impl<T>::instance_.ptr_ == 0)
+ null_global_impl<T>::instance_.ptr_ = new T;
+ return *null_global_impl<T>::instance_.ptr_;
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_NULL_GLOBAL_HPP
diff --git a/3rdparty/asio/include/asio/detail/null_mutex.hpp b/3rdparty/asio/include/asio/detail/null_mutex.hpp
new file mode 100644
index 00000000000..77e759473f5
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/null_mutex.hpp
@@ -0,0 +1,60 @@
+//
+// detail/null_mutex.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#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<null_mutex> 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 // ASIO_DETAIL_NULL_MUTEX_HPP
diff --git a/3rdparty/asio/include/asio/detail/null_reactor.hpp b/3rdparty/asio/include/asio/detail/null_reactor.hpp
new file mode 100644
index 00000000000..128f2b45329
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/null_reactor.hpp
@@ -0,0 +1,83 @@
+//
+// detail/null_reactor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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) \
+ || defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#include "asio/detail/scheduler_operation.hpp"
+#include "asio/detail/scheduler_task.hpp"
+#include "asio/execution_context.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class null_reactor
+ : public execution_context_service_base<null_reactor>,
+ public scheduler_task
+{
+public:
+ struct per_descriptor_data
+ {
+ };
+
+ // Constructor.
+ null_reactor(asio::execution_context& ctx)
+ : execution_context_service_base<null_reactor>(ctx)
+ {
+ }
+
+ // Destructor.
+ ~null_reactor()
+ {
+ }
+
+ // Initialise the task.
+ void init_task()
+ {
+ }
+
+ // 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<scheduler_operation>& /*ops*/)
+ {
+ }
+
+ // No-op.
+ void interrupt()
+ {
+ }
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_IOCP)
+ // || defined(ASIO_WINDOWS_RUNTIME)
+ // || defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#endif // ASIO_DETAIL_NULL_REACTOR_HPP
diff --git a/3rdparty/asio/include/asio/detail/null_signal_blocker.hpp b/3rdparty/asio/include/asio/detail/null_signal_blocker.hpp
new file mode 100644
index 00000000000..1c4030799fa
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/null_signal_blocker.hpp
@@ -0,0 +1,69 @@
+//
+// detail/null_signal_blocker.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/null_socket_service.hpp b/3rdparty/asio/include/asio/detail/null_socket_service.hpp
new file mode 100644
index 00000000000..84e21295f63
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/null_socket_service.hpp
@@ -0,0 +1,519 @@
+//
+// detail/null_socket_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/execution_context.hpp"
+#include "asio/post.hpp"
+#include "asio/socket_base.hpp"
+#include "asio/detail/bind_handler.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Protocol>
+class null_socket_service :
+ public execution_context_service_base<null_socket_service<Protocol>>
+{
+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(execution_context& context)
+ : execution_context_service_base<null_socket_service<Protocol>>(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 <typename Protocol1>
+ void converting_move_construct(implementation_type&,
+ null_socket_service<Protocol1>&,
+ typename null_socket_service<Protocol1>::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 <typename IO_Control_Command>
+ 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 <typename Option>
+ 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 <typename Option>
+ 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 <typename ConstBufferSequence>
+ 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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_send(implementation_type&, const ConstBufferSequence&,
+ socket_base::message_flags, Handler& handler, const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ const std::size_t bytes_transferred = 0;
+ asio::post(io_ex, detail::bind_handler(
+ handler, ec, bytes_transferred));
+ }
+
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_send(implementation_type&, const null_buffers&,
+ socket_base::message_flags, Handler& handler, const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ const std::size_t bytes_transferred = 0;
+ asio::post(io_ex, detail::bind_handler(
+ handler, ec, bytes_transferred));
+ }
+
+ // Receive some data from the peer. Returns the number of bytes received.
+ template <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_receive(implementation_type&, const MutableBufferSequence&,
+ socket_base::message_flags, Handler& handler, const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ const std::size_t bytes_transferred = 0;
+ asio::post(io_ex, detail::bind_handler(
+ handler, ec, bytes_transferred));
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_receive(implementation_type&, const null_buffers&,
+ socket_base::message_flags, Handler& handler, const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ const std::size_t bytes_transferred = 0;
+ asio::post(io_ex, detail::bind_handler(
+ handler, ec, bytes_transferred));
+ }
+
+ // Receive some data with associated flags. Returns the number of bytes
+ // received.
+ template <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_receive_with_flags(implementation_type&,
+ const MutableBufferSequence&, socket_base::message_flags,
+ socket_base::message_flags&, Handler& handler, const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ const std::size_t bytes_transferred = 0;
+ asio::post(io_ex, detail::bind_handler(
+ handler, ec, bytes_transferred));
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_receive_with_flags(implementation_type&, const null_buffers&,
+ socket_base::message_flags, socket_base::message_flags&,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ const std::size_t bytes_transferred = 0;
+ asio::post(io_ex, detail::bind_handler(
+ handler, ec, bytes_transferred));
+ }
+
+ // Send a datagram to the specified endpoint. Returns the number of bytes
+ // sent.
+ template <typename ConstBufferSequence>
+ 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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ 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;
+ asio::post(io_ex, detail::bind_handler(
+ handler, ec, bytes_transferred));
+ }
+
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_send_to(implementation_type&, const null_buffers&,
+ const endpoint_type&, socket_base::message_flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ const std::size_t bytes_transferred = 0;
+ asio::post(io_ex, detail::bind_handler(
+ handler, ec, bytes_transferred));
+ }
+
+ // Receive a datagram with the endpoint of the sender. Returns the number of
+ // bytes received.
+ template <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_receive_from(implementation_type&, const MutableBufferSequence&,
+ endpoint_type&, socket_base::message_flags, Handler& handler,
+ const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ const std::size_t bytes_transferred = 0;
+ asio::post(io_ex, detail::bind_handler(
+ handler, ec, bytes_transferred));
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_receive_from(implementation_type&, const null_buffers&,
+ endpoint_type&, socket_base::message_flags, Handler& handler,
+ const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ const std::size_t bytes_transferred = 0;
+ asio::post(io_ex, detail::bind_handler(
+ handler, ec, bytes_transferred));
+ }
+
+ // Accept a new connection.
+ template <typename Socket>
+ 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 <typename Socket, typename Handler, typename IoExecutor>
+ void async_accept(implementation_type&, Socket&, endpoint_type*,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ asio::post(io_ex, 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 <typename Handler, typename IoExecutor>
+ void async_connect(implementation_type&, const endpoint_type&,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ asio::post(io_ex, detail::bind_handler(handler, ec));
+ }
+};
+
+} // 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/3rdparty/asio/include/asio/detail/null_static_mutex.hpp b/3rdparty/asio/include/asio/detail/null_static_mutex.hpp
new file mode 100644
index 00000000000..15d649bb0da
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/null_static_mutex.hpp
@@ -0,0 +1,60 @@
+//
+// detail/null_static_mutex.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<null_static_mutex> 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/3rdparty/asio/include/asio/detail/null_thread.hpp b/3rdparty/asio/include/asio/detail/null_thread.hpp
new file mode 100644
index 00000000000..aca261671c5
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/null_thread.hpp
@@ -0,0 +1,67 @@
+//
+// detail/null_thread.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Function>
+ 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/3rdparty/asio/include/asio/detail/null_tss_ptr.hpp b/3rdparty/asio/include/asio/detail/null_tss_ptr.hpp
new file mode 100644
index 00000000000..cf64a2bcdda
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/null_tss_ptr.hpp
@@ -0,0 +1,68 @@
+//
+// detail/null_tss_ptr.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename T>
+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/3rdparty/asio/include/asio/detail/object_pool.hpp b/3rdparty/asio/include/asio/detail/object_pool.hpp
new file mode 100644
index 00000000000..41254ce52ee
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/object_pool.hpp
@@ -0,0 +1,171 @@
+//
+// detail/object_pool.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Object>
+class object_pool;
+
+class object_pool_access
+{
+public:
+ template <typename Object>
+ static Object* create()
+ {
+ return new Object;
+ }
+
+ template <typename Object, typename Arg>
+ static Object* create(Arg arg)
+ {
+ return new Object(arg);
+ }
+
+ template <typename Object>
+ static void destroy(Object* o)
+ {
+ delete o;
+ }
+
+ template <typename Object>
+ static Object*& next(Object* o)
+ {
+ return o->next_;
+ }
+
+ template <typename Object>
+ static Object*& prev(Object* o)
+ {
+ return o->prev_;
+ }
+};
+
+template <typename Object>
+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>();
+
+ 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 <typename Arg>
+ Object* alloc(Arg arg)
+ {
+ Object* o = free_list_;
+ if (o)
+ free_list_ = object_pool_access::next(free_list_);
+ else
+ o = object_pool_access::create<Object>(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/3rdparty/asio/include/asio/detail/old_win_sdk_compat.hpp b/3rdparty/asio/include/asio/detail/old_win_sdk_compat.hpp
new file mode 100644
index 00000000000..2c43c1dab80
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/old_win_sdk_compat.hpp
@@ -0,0 +1,214 @@
+//
+// detail/old_win_sdk_compat.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/op_queue.hpp b/3rdparty/asio/include/asio/detail/op_queue.hpp
new file mode 100644
index 00000000000..db6335f40f6
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/op_queue.hpp
@@ -0,0 +1,162 @@
+//
+// detail/op_queue.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Operation>
+class op_queue;
+
+class op_queue_access
+{
+public:
+ template <typename Operation>
+ static Operation* next(Operation* o)
+ {
+ return static_cast<Operation*>(o->next_);
+ }
+
+ template <typename Operation1, typename Operation2>
+ static void next(Operation1*& o1, Operation2* o2)
+ {
+ o1->next_ = o2;
+ }
+
+ template <typename Operation>
+ static void destroy(Operation* o)
+ {
+ o->destroy();
+ }
+
+ template <typename Operation>
+ static Operation*& front(op_queue<Operation>& q)
+ {
+ return q.front_;
+ }
+
+ template <typename Operation>
+ static Operation*& back(op_queue<Operation>& q)
+ {
+ return q.back_;
+ }
+};
+
+template <typename Operation>
+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<Operation*>(0));
+ }
+ }
+
+ // Push an operation on to the back of the queue.
+ void push(Operation* h)
+ {
+ op_queue_access::next(h, static_cast<Operation*>(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 <typename OtherOperation>
+ void push(op_queue<OtherOperation>& 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/3rdparty/asio/include/asio/detail/operation.hpp b/3rdparty/asio/include/asio/detail/operation.hpp
new file mode 100644
index 00000000000..8721f397a5c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/operation.hpp
@@ -0,0 +1,38 @@
+//
+// detail/operation.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/pipe_select_interrupter.hpp b/3rdparty/asio/include/asio/detail/pipe_select_interrupter.hpp
new file mode 100644
index 00000000000..f7b219644e4
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/pipe_select_interrupter.hpp
@@ -0,0 +1,89 @@
+//
+// detail/pipe_select_interrupter.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 interrupter. Returns true if the reset was successful.
+ 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/3rdparty/asio/include/asio/detail/pop_options.hpp b/3rdparty/asio/include/asio/detail/pop_options.hpp
new file mode 100644
index 00000000000..93cdb5abb4d
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/pop_options.hpp
@@ -0,0 +1,157 @@
+//
+// detail/pop_options.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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)
+# if !defined(ASIO_DISABLE_VISIBILITY)
+# pragma GCC visibility pop
+# endif // !defined(ASIO_DISABLE_VISIBILITY)
+# endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+
+# pragma pop_macro ("emit")
+# pragma pop_macro ("signal")
+# pragma pop_macro ("slot")
+
+#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)
+# if !defined(ASIO_DISABLE_VISIBILITY)
+# pragma GCC visibility pop
+# endif // !defined(ASIO_DISABLE_VISIBILITY)
+# endif // !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32)
+
+# pragma GCC diagnostic pop
+
+# pragma pop_macro ("emit")
+# pragma pop_macro ("signal")
+# pragma pop_macro ("slot")
+
+#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)
+# if !defined(ASIO_DISABLE_VISIBILITY)
+# pragma GCC visibility pop
+# endif // !defined(ASIO_DISABLE_VISIBILITY)
+# endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+
+# pragma GCC diagnostic pop
+
+# pragma pop_macro ("emit")
+# pragma pop_macro ("signal")
+# pragma pop_macro ("slot")
+
+#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__) && !defined(__clang__)
+
+// 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
+
+# pragma pop_macro ("emit")
+# pragma pop_macro ("signal")
+# pragma pop_macro ("slot")
+
+#endif
diff --git a/3rdparty/asio/include/asio/detail/posix_event.hpp b/3rdparty/asio/include/asio/detail/posix_event.hpp
new file mode 100644
index 00000000000..0c83bd31a30
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/posix_event.hpp
@@ -0,0 +1,175 @@
+//
+// detail/posix_event.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <pthread.h>
+#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 <typename Lock>
+ void signal(Lock& lock)
+ {
+ this->signal_all(lock);
+ }
+
+ // Signal all waiters.
+ template <typename Lock>
+ 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 <typename Lock>
+ 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.
+ }
+
+ // Unlock the mutex and signal one waiter who may destroy us.
+ template <typename Lock>
+ void unlock_and_signal_one_for_destruction(Lock& lock)
+ {
+ ASIO_ASSERT(lock.locked());
+ state_ |= 1;
+ bool have_waiters = (state_ > 1);
+ if (have_waiters)
+ ::pthread_cond_signal(&cond_); // Ignore EINVAL.
+ lock.unlock();
+ }
+
+ // If there's a waiter, unlock the mutex and signal it.
+ template <typename Lock>
+ 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 <typename Lock>
+ void clear(Lock& lock)
+ {
+ ASIO_ASSERT(lock.locked());
+ (void)lock;
+ state_ &= ~std::size_t(1);
+ }
+
+ // Wait for the event to become signalled.
+ template <typename Lock>
+ 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 <typename Lock>
+ 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/3rdparty/asio/include/asio/detail/posix_fd_set_adapter.hpp b/3rdparty/asio/include/asio/detail/posix_fd_set_adapter.hpp
new file mode 100644
index 00000000000..bd28a13fb2c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/posix_fd_set_adapter.hpp
@@ -0,0 +1,118 @@
+//
+// detail/posix_fd_set_adapter.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstring>
+#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<socket_type>& operations, op_queue<operation>& ops)
+ {
+ reactor_op_queue<socket_type>::iterator i = operations.begin();
+ while (i != operations.end())
+ {
+ reactor_op_queue<socket_type>::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<socket_type>& operations,
+ op_queue<operation>& ops) const
+ {
+ reactor_op_queue<socket_type>::iterator i = operations.begin();
+ while (i != operations.end())
+ {
+ reactor_op_queue<socket_type>::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/3rdparty/asio/include/asio/detail/posix_global.hpp b/3rdparty/asio/include/asio/detail/posix_global.hpp
new file mode 100644
index 00000000000..aea71e15c82
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/posix_global.hpp
@@ -0,0 +1,80 @@
+//
+// detail/posix_global.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <exception>
+#include <pthread.h>
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename T>
+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 <typename T>
+::pthread_once_t posix_global_impl<T>::init_once_ = PTHREAD_ONCE_INIT;
+
+template <typename T>
+T* posix_global_impl<T>::static_ptr_ = 0;
+
+template <typename T>
+posix_global_impl<T> posix_global_impl<T>::instance_;
+
+template <typename T>
+T& posix_global()
+{
+ int result = ::pthread_once(
+ &posix_global_impl<T>::init_once_,
+ &posix_global_impl<T>::do_init);
+
+ if (result != 0)
+ std::terminate();
+
+ return *posix_global_impl<T>::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/3rdparty/asio/include/asio/detail/posix_mutex.hpp b/3rdparty/asio/include/asio/detail/posix_mutex.hpp
new file mode 100644
index 00000000000..38ce2867ff5
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/posix_mutex.hpp
@@ -0,0 +1,76 @@
+//
+// detail/posix_mutex.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <pthread.h>
+#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<posix_mutex> 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/3rdparty/asio/include/asio/detail/posix_serial_port_service.hpp b/3rdparty/asio/include/asio/detail/posix_serial_port_service.hpp
new file mode 100644
index 00000000000..79309549845
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/posix_serial_port_service.hpp
@@ -0,0 +1,249 @@
+//
+// detail/posix_serial_port_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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_POSIX_SERIAL_PORT_SERVICE_HPP
+#define ASIO_DETAIL_POSIX_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 <string>
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/serial_port_base.hpp"
+#include "asio/detail/descriptor_ops.hpp"
+
+#if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/io_uring_descriptor_service.hpp"
+#else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/reactive_descriptor_service.hpp"
+#endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Extend a descriptor_service to provide serial port support.
+class posix_serial_port_service :
+ public execution_context_service_base<posix_serial_port_service>
+{
+public:
+#if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ typedef io_uring_descriptor_service descriptor_service;
+#else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ typedef reactive_descriptor_service descriptor_service;
+#endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+ // The native type of a serial port.
+ typedef descriptor_service::native_handle_type native_handle_type;
+
+ // The implementation type of the serial port.
+ typedef descriptor_service::implementation_type implementation_type;
+
+ ASIO_DECL posix_serial_port_service(execution_context& 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,
+ posix_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 <typename SettableSerialPortOption>
+ asio::error_code set_option(implementation_type& impl,
+ const SettableSerialPortOption& option, asio::error_code& ec)
+ {
+ return do_set_option(impl,
+ &posix_serial_port_service::store_option<SettableSerialPortOption>,
+ &option, ec);
+ }
+
+ // Get an option from the serial port.
+ template <typename GettableSerialPortOption>
+ asio::error_code get_option(const implementation_type& impl,
+ GettableSerialPortOption& option, asio::error_code& ec) const
+ {
+ return do_get_option(impl,
+ &posix_serial_port_service::load_option<GettableSerialPortOption>,
+ &option, ec);
+ }
+
+ // Send a break sequence to the serial port.
+ asio::error_code send_break(implementation_type& impl,
+ asio::error_code& ec)
+ {
+ int result = ::tcsendbreak(descriptor_service_.native_handle(impl), 0);
+ descriptor_ops::get_last_error(ec, result < 0);
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Write the given data. Returns the number of bytes sent.
+ template <typename ConstBufferSequence>
+ 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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_write_some(implementation_type& impl,
+ const ConstBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ descriptor_service_.async_write_some(impl, buffers, handler, io_ex);
+ }
+
+ // Read some data. Returns the number of bytes received.
+ template <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_read_some(implementation_type& impl,
+ const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ descriptor_service_.async_read_some(impl, buffers, handler, io_ex);
+ }
+
+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 <typename SettableSerialPortOption>
+ static asio::error_code store_option(const void* option,
+ termios& storage, asio::error_code& ec)
+ {
+ static_cast<const SettableSerialPortOption*>(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 <typename GettableSerialPortOption>
+ static asio::error_code load_option(void* option,
+ const termios& storage, asio::error_code& ec)
+ {
+ static_cast<GettableSerialPortOption*>(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.
+ descriptor_service descriptor_service_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#if defined(ASIO_HEADER_ONLY)
+# include "asio/detail/impl/posix_serial_port_service.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__)
+#endif // defined(ASIO_HAS_SERIAL_PORT)
+
+#endif // ASIO_DETAIL_POSIX_SERIAL_PORT_SERVICE_HPP
diff --git a/3rdparty/asio/include/asio/detail/posix_signal_blocker.hpp b/3rdparty/asio/include/asio/detail/posix_signal_blocker.hpp
new file mode 100644
index 00000000000..a57c09687b8
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/posix_signal_blocker.hpp
@@ -0,0 +1,85 @@
+//
+// detail/posix_signal_blocker.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <csignal>
+#include <pthread.h>
+#include <signal.h>
+#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/3rdparty/asio/include/asio/detail/posix_static_mutex.hpp b/3rdparty/asio/include/asio/detail/posix_static_mutex.hpp
new file mode 100644
index 00000000000..38a44c0327a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/posix_static_mutex.hpp
@@ -0,0 +1,64 @@
+//
+// detail/posix_static_mutex.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <pthread.h>
+#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<posix_static_mutex> 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/3rdparty/asio/include/asio/detail/posix_thread.hpp b/3rdparty/asio/include/asio/detail/posix_thread.hpp
new file mode 100644
index 00000000000..9085a0b4a7b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/posix_thread.hpp
@@ -0,0 +1,109 @@
+//
+// detail/posix_thread.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <pthread.h>
+#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 <typename Function>
+ posix_thread(Function f, unsigned int = 0)
+ : joined_(false)
+ {
+ start_thread(new func<Function>(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 <typename Function>
+ 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/3rdparty/asio/include/asio/detail/posix_tss_ptr.hpp b/3rdparty/asio/include/asio/detail/posix_tss_ptr.hpp
new file mode 100644
index 00000000000..b0d0653bed5
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/posix_tss_ptr.hpp
@@ -0,0 +1,79 @@
+//
+// detail/posix_tss_ptr.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <pthread.h>
+#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 <typename T>
+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<T*>(::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/3rdparty/asio/include/asio/detail/push_options.hpp b/3rdparty/asio/include/asio/detail/push_options.hpp
new file mode 100644
index 00000000000..d270e9ae13c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/push_options.hpp
@@ -0,0 +1,228 @@
+//
+// detail/push_options.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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)
+# if !defined(ASIO_DISABLE_VISIBILITY)
+# pragma GCC visibility push (default)
+# endif // !defined(ASIO_DISABLE_VISIBILITY)
+# endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+
+# pragma push_macro ("emit")
+# undef emit
+
+# pragma push_macro ("signal")
+# undef signal
+
+# pragma push_macro ("slot")
+# undef slot
+
+#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)
+# if !defined(ASIO_DISABLE_VISIBILITY)
+# pragma GCC visibility push (default)
+# endif // !defined(ASIO_DISABLE_VISIBILITY)
+# endif // !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32)
+
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
+# if (__clang_major__ >= 6)
+# pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
+# endif // (__clang_major__ >= 6)
+
+# pragma push_macro ("emit")
+# undef emit
+
+# pragma push_macro ("signal")
+# undef signal
+
+# pragma push_macro ("slot")
+# undef slot
+
+#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)
+# if !defined(ASIO_DISABLE_VISIBILITY)
+# pragma GCC visibility push (default)
+# endif // !defined(ASIO_DISABLE_VISIBILITY)
+# endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
+
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
+# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) || (__GNUC__ > 4)
+# pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant"
+# endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 7) || (__GNUC__ > 4)
+# if (__GNUC__ >= 7)
+# pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
+# endif // (__GNUC__ >= 7)
+
+# pragma push_macro ("emit")
+# undef emit
+
+# pragma push_macro ("signal")
+# undef signal
+
+# pragma push_macro ("slot")
+# undef slot
+
+#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__) && !defined(__clang__)
+
+// 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:4619) // suppress 'there is no warning number XXXX'
+# pragma warning (disable:4127)
+# pragma warning (disable:4180)
+# pragma warning (disable:4244)
+# pragma warning (disable:4265)
+# 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
+
+# pragma push_macro ("emit")
+# undef emit
+
+# pragma push_macro ("signal")
+# undef signal
+
+# pragma push_macro ("slot")
+# undef slot
+
+#endif
diff --git a/3rdparty/asio/include/asio/detail/reactive_descriptor_service.hpp b/3rdparty/asio/include/asio/detail/reactive_descriptor_service.hpp
new file mode 100644
index 00000000000..f7c7e86916d
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactive_descriptor_service.hpp
@@ -0,0 +1,566 @@
+//
+// detail/reactive_descriptor_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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__) \
+ && !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#include "asio/associated_cancellation_slot.hpp"
+#include "asio/associated_immediate_executor.hpp"
+#include "asio/buffer.hpp"
+#include "asio/cancellation_type.hpp"
+#include "asio/execution_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 execution_context_service_base<reactive_descriptor_service>
+{
+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(execution_context& 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) noexcept;
+
+ // 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);
+
+ // Release ownership of the native descriptor representation.
+ native_handle_type release(implementation_type& impl,
+ asio::error_code& ec)
+ {
+ ec = success_ec_;
+ return release(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 <typename IO_Control_Command>
+ 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<ioctl_arg_type*>(command.data()), ec);
+ ASIO_ERROR_LOCATION(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);
+ ASIO_ERROR_LOCATION(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;
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Asynchronously wait for the descriptor to become ready to read, ready to
+ // write, or to have pending error conditions.
+ template <typename Handler, typename IoExecutor>
+ void async_wait(implementation_type& impl,
+ posix::descriptor_base::wait_type w,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_wait_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, handler, io_ex);
+
+ 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;
+ start_op(impl, reactor::read_op, p.p,
+ is_continuation, false, true, &io_ex, 0);
+ p.v = p.p = 0;
+ return;
+ }
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.descriptor_, op_type);
+ }
+
+ start_op(impl, op_type, p.p, is_continuation, false, false, &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Write some data to the descriptor.
+ template <typename ConstBufferSequence>
+ size_t write_some(implementation_type& impl,
+ const ConstBufferSequence& buffers, asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs_type;
+
+ size_t n;
+ if (bufs_type::is_single_buffer)
+ {
+ n = descriptor_ops::sync_write1(impl.descriptor_,
+ impl.state_, bufs_type::first(buffers).data(),
+ bufs_type::first(buffers).size(), ec);
+ }
+ else
+ {
+ bufs_type bufs(buffers);
+
+ n = descriptor_ops::sync_write(impl.descriptor_, impl.state_,
+ bufs.buffers(), bufs.count(), bufs.all_empty(), ec);
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return n;
+ }
+
+ // 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);
+ ASIO_ERROR_LOCATION(ec);
+ return 0;
+ }
+
+ // Start an asynchronous write. The data being sent must be valid for the
+ // lifetime of the asynchronous operation.
+ template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_write_some(implementation_type& impl,
+ const ConstBufferSequence& buffers, Handler& handler,
+ const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef descriptor_write_op<ConstBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.descriptor_, buffers, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_,
+ impl.descriptor_, reactor::write_op);
+ }
+
+ 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<asio::const_buffer,
+ ConstBufferSequence>::all_empty(buffers), &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Start an asynchronous wait until data can be written without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_write_some(implementation_type& impl,
+ const null_buffers&, Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_,
+ impl.descriptor_, reactor::write_op);
+ }
+
+ 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, &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Read some data from the stream. Returns the number of bytes read.
+ template <typename MutableBufferSequence>
+ size_t read_some(implementation_type& impl,
+ const MutableBufferSequence& buffers, asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_type;
+
+ size_t n;
+ if (bufs_type::is_single_buffer)
+ {
+ n = descriptor_ops::sync_read1(impl.descriptor_,
+ impl.state_, bufs_type::first(buffers).data(),
+ bufs_type::first(buffers).size(), ec);
+ }
+ else
+ {
+ bufs_type bufs(buffers);
+
+ n = descriptor_ops::sync_read(impl.descriptor_, impl.state_,
+ bufs.buffers(), bufs.count(), bufs.all_empty(), ec);
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return n;
+ }
+
+ // 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);
+ ASIO_ERROR_LOCATION(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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_read_some(implementation_type& impl,
+ const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef descriptor_read_op<MutableBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.descriptor_, buffers, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_,
+ impl.descriptor_, reactor::read_op);
+ }
+
+ 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<asio::mutable_buffer,
+ MutableBufferSequence>::all_empty(buffers), &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be read without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_read_some(implementation_type& impl,
+ const null_buffers&, Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_,
+ impl.descriptor_, reactor::read_op);
+ }
+
+ 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, &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+private:
+ // Start the asynchronous operation.
+ ASIO_DECL void do_start_op(implementation_type& impl, int op_type,
+ reactor_op* op, bool is_continuation, bool is_non_blocking, bool noop,
+ void (*on_immediate)(operation* op, bool, const void*),
+ const void* immediate_arg);
+
+ // Start the asynchronous operation for handlers that are specialised for
+ // immediate completion.
+ template <typename Op>
+ void start_op(implementation_type& impl, int op_type, Op* op,
+ bool is_continuation, bool is_non_blocking, bool noop,
+ const void* io_ex, ...)
+ {
+ return do_start_op(impl, op_type, op, is_continuation,
+ is_non_blocking, noop, &Op::do_immediate, io_ex);
+ }
+
+ // Start the asynchronous operation for handlers that are not specialised for
+ // immediate completion.
+ template <typename Op>
+ void start_op(implementation_type& impl, int op_type, Op* op,
+ bool is_continuation, bool is_non_blocking, bool noop, const void*,
+ enable_if_t<
+ is_same<
+ typename associated_immediate_executor<
+ typename Op::handler_type,
+ typename Op::io_executor_type
+ >::asio_associated_immediate_executor_is_unspecialised,
+ void
+ >::value
+ >*)
+ {
+ return do_start_op(impl, op_type, op, is_continuation, is_non_blocking,
+ noop, &reactor::call_post_immediate_completion, &reactor_);
+ }
+
+ // Helper class used to implement per-operation cancellation
+ class reactor_op_cancellation
+ {
+ public:
+ reactor_op_cancellation(reactor* r,
+ reactor::per_descriptor_data* p, int d, int o)
+ : reactor_(r),
+ reactor_data_(p),
+ descriptor_(d),
+ op_type_(o)
+ {
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ if (!!(type &
+ (cancellation_type::terminal
+ | cancellation_type::partial
+ | cancellation_type::total)))
+ {
+ reactor_->cancel_ops_by_key(descriptor_,
+ *reactor_data_, op_type_, this);
+ }
+ }
+
+ private:
+ reactor* reactor_;
+ reactor::per_descriptor_data* reactor_data_;
+ int descriptor_;
+ int op_type_;
+ };
+
+ // The selector that performs event demultiplexing for the service.
+ reactor& reactor_;
+
+ // Cached success value to avoid accessing category singleton.
+ const asio::error_code success_ec_;
+};
+
+} // 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__)
+ // && !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#endif // ASIO_DETAIL_REACTIVE_DESCRIPTOR_SERVICE_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactive_null_buffers_op.hpp b/3rdparty/asio/include/asio/detail/reactive_null_buffers_op.hpp
new file mode 100644
index 00000000000..b9a32a91217
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactive_null_buffers_op.hpp
@@ -0,0 +1,131 @@
+//
+// detail/reactive_null_buffers_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/bind_handler.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/reactor_op.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Handler, typename IoExecutor>
+class reactive_null_buffers_op : public reactor_op
+{
+public:
+ typedef Handler handler_type;
+ typedef IoExecutor io_executor_type;
+
+ ASIO_DEFINE_HANDLER_PTR(reactive_null_buffers_op);
+
+ reactive_null_buffers_op(const asio::error_code& success_ec,
+ Handler& handler, const IoExecutor& io_ex)
+ : reactor_op(success_ec, &reactive_null_buffers_op::do_perform,
+ &reactive_null_buffers_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ reactive_null_buffers_op* o(static_cast<reactive_null_buffers_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ // 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, asio::error_code, std::size_t>
+ 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;
+ }
+ }
+
+ static void do_immediate(operation* base, bool, const void* io_ex)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_null_buffers_op* o(static_cast<reactive_null_buffers_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ immediate_handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ // 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, asio::error_code, std::size_t>
+ handler(o->handler_, o->ec_, o->bytes_transferred_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_));
+ w.complete(handler, handler.handler_, io_ex);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+
+private:
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_REACTIVE_NULL_BUFFERS_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactive_socket_accept_op.hpp b/3rdparty/asio/include/asio/detail/reactive_socket_accept_op.hpp
new file mode 100644
index 00000000000..5ae84fd9966
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactive_socket_accept_op.hpp
@@ -0,0 +1,323 @@
+//
+// detail/reactive_socket_accept_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/fenced_block.hpp"
+#include "asio/detail/handler_alloc_helpers.hpp"
+#include "asio/detail/handler_work.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 <typename Socket, typename Protocol>
+class reactive_socket_accept_op_base : public reactor_op
+{
+public:
+ reactive_socket_accept_op_base(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state, Socket& peer,
+ const Protocol& protocol, typename Protocol::endpoint* peer_endpoint,
+ func_type complete_func)
+ : reactor_op(success_ec,
+ &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)
+ {
+ ASIO_ASSUME(base != 0);
+ reactive_socket_accept_op_base* o(
+ static_cast<reactive_socket_accept_op_base*>(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 <typename Socket, typename Protocol,
+ typename Handler, typename IoExecutor>
+class reactive_socket_accept_op :
+ public reactive_socket_accept_op_base<Socket, Protocol>
+{
+public:
+ typedef Handler handler_type;
+ typedef IoExecutor io_executor_type;
+
+ ASIO_DEFINE_HANDLER_PTR(reactive_socket_accept_op);
+
+ reactive_socket_accept_op(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state, Socket& peer,
+ const Protocol& protocol, typename Protocol::endpoint* peer_endpoint,
+ Handler& handler, const IoExecutor& io_ex)
+ : reactive_socket_accept_op_base<Socket, Protocol>(
+ success_ec, socket, state, peer, protocol, peer_endpoint,
+ &reactive_socket_accept_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_accept_op* o(static_cast<reactive_socket_accept_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ // On success, assign new connection to peer socket object.
+ if (owner)
+ o->do_assign();
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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::binder1<Handler, asio::error_code>
+ 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;
+ }
+ }
+
+ static void do_immediate(operation* base, bool, const void* io_ex)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_accept_op* o(static_cast<reactive_socket_accept_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ // On success, assign new connection to peer socket object.
+ o->do_assign();
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ immediate_handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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::binder1<Handler, asio::error_code>
+ handler(o->handler_, o->ec_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_));
+ w.complete(handler, handler.handler_, io_ex);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+
+private:
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+template <typename Protocol, typename PeerIoExecutor,
+ typename Handler, typename IoExecutor>
+class reactive_socket_move_accept_op :
+ private Protocol::socket::template rebind_executor<PeerIoExecutor>::other,
+ public reactive_socket_accept_op_base<
+ typename Protocol::socket::template rebind_executor<PeerIoExecutor>::other,
+ Protocol>
+{
+public:
+ typedef Handler handler_type;
+ typedef IoExecutor io_executor_type;
+
+ ASIO_DEFINE_HANDLER_PTR(reactive_socket_move_accept_op);
+
+ reactive_socket_move_accept_op(const asio::error_code& success_ec,
+ const PeerIoExecutor& peer_io_ex, socket_type socket,
+ socket_ops::state_type state, const Protocol& protocol,
+ typename Protocol::endpoint* peer_endpoint, Handler& handler,
+ const IoExecutor& io_ex)
+ : peer_socket_type(peer_io_ex),
+ reactive_socket_accept_op_base<peer_socket_type, Protocol>(
+ success_ec, socket, state, *this, protocol, peer_endpoint,
+ &reactive_socket_move_accept_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_move_accept_op* o(
+ static_cast<reactive_socket_move_accept_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ // On success, assign new connection to peer socket object.
+ if (owner)
+ o->do_assign();
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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::move_binder2<Handler,
+ asio::error_code, peer_socket_type>
+ handler(0, static_cast<Handler&&>(o->handler_), o->ec_,
+ static_cast<peer_socket_type&&>(*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;
+ }
+ }
+
+ static void do_immediate(operation* base, bool, const void* io_ex)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_move_accept_op* o(
+ static_cast<reactive_socket_move_accept_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ // On success, assign new connection to peer socket object.
+ o->do_assign();
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ immediate_handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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::move_binder2<Handler,
+ asio::error_code, peer_socket_type>
+ handler(0, static_cast<Handler&&>(o->handler_), o->ec_,
+ static_cast<peer_socket_type&&>(*o));
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, "..."));
+ w.complete(handler, handler.handler_, io_ex);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+
+private:
+ typedef typename Protocol::socket::template
+ rebind_executor<PeerIoExecutor>::other peer_socket_type;
+
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_REACTIVE_SOCKET_ACCEPT_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactive_socket_connect_op.hpp b/3rdparty/asio/include/asio/detail/reactive_socket_connect_op.hpp
new file mode 100644
index 00000000000..03c0db2e7dd
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactive_socket_connect_op.hpp
@@ -0,0 +1,162 @@
+//
+// detail/reactive_socket_connect_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/fenced_block.hpp"
+#include "asio/detail/handler_alloc_helpers.hpp"
+#include "asio/detail/handler_work.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(const asio::error_code& success_ec,
+ socket_type socket, func_type complete_func)
+ : reactor_op(success_ec,
+ &reactive_socket_connect_op_base::do_perform, complete_func),
+ socket_(socket)
+ {
+ }
+
+ static status do_perform(reactor_op* base)
+ {
+ ASIO_ASSUME(base != 0);
+ reactive_socket_connect_op_base* o(
+ static_cast<reactive_socket_connect_op_base*>(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 <typename Handler, typename IoExecutor>
+class reactive_socket_connect_op : public reactive_socket_connect_op_base
+{
+public:
+ typedef Handler handler_type;
+ typedef IoExecutor io_executor_type;
+
+ ASIO_DEFINE_HANDLER_PTR(reactive_socket_connect_op);
+
+ reactive_socket_connect_op(const asio::error_code& success_ec,
+ socket_type socket, Handler& handler, const IoExecutor& io_ex)
+ : reactive_socket_connect_op_base(success_ec, socket,
+ &reactive_socket_connect_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_connect_op* o
+ (static_cast<reactive_socket_connect_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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::binder1<Handler, asio::error_code>
+ 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;
+ }
+ }
+
+ static void do_immediate(operation* base, bool, const void* io_ex)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_connect_op* o
+ (static_cast<reactive_socket_connect_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ immediate_handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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::binder1<Handler, asio::error_code>
+ handler(o->handler_, o->ec_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_));
+ w.complete(handler, handler.handler_, io_ex);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+
+private:
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_REACTIVE_SOCKET_CONNECT_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactive_socket_recv_op.hpp b/3rdparty/asio/include/asio/detail/reactive_socket_recv_op.hpp
new file mode 100644
index 00000000000..b6533655674
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactive_socket_recv_op.hpp
@@ -0,0 +1,197 @@
+//
+// detail/reactive_socket_recv_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/handler_alloc_helpers.hpp"
+#include "asio/detail/handler_work.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 <typename MutableBufferSequence>
+class reactive_socket_recv_op_base : public reactor_op
+{
+public:
+ reactive_socket_recv_op_base(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state,
+ const MutableBufferSequence& buffers,
+ socket_base::message_flags flags, func_type complete_func)
+ : reactor_op(success_ec,
+ &reactive_socket_recv_op_base::do_perform, complete_func),
+ socket_(socket),
+ state_(state),
+ buffers_(buffers),
+ flags_(flags)
+ {
+ }
+
+ static status do_perform(reactor_op* base)
+ {
+ ASIO_ASSUME(base != 0);
+ reactive_socket_recv_op_base* o(
+ static_cast<reactive_socket_recv_op_base*>(base));
+
+ typedef buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_type;
+
+ status result;
+ if (bufs_type::is_single_buffer)
+ {
+ result = socket_ops::non_blocking_recv1(o->socket_,
+ bufs_type::first(o->buffers_).data(),
+ bufs_type::first(o->buffers_).size(), o->flags_,
+ (o->state_ & socket_ops::stream_oriented) != 0,
+ o->ec_, o->bytes_transferred_) ? done : not_done;
+ }
+ else
+ {
+ bufs_type bufs(o->buffers_);
+ 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 <typename MutableBufferSequence, typename Handler, typename IoExecutor>
+class reactive_socket_recv_op :
+ public reactive_socket_recv_op_base<MutableBufferSequence>
+{
+public:
+ typedef Handler handler_type;
+ typedef IoExecutor io_executor_type;
+
+ ASIO_DEFINE_HANDLER_PTR(reactive_socket_recv_op);
+
+ reactive_socket_recv_op(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state,
+ const MutableBufferSequence& buffers, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ : reactive_socket_recv_op_base<MutableBufferSequence>(success_ec, socket,
+ state, buffers, flags, &reactive_socket_recv_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_recv_op* o(static_cast<reactive_socket_recv_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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;
+ }
+ }
+
+ static void do_immediate(operation* base, bool, const void* io_ex)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_recv_op* o(static_cast<reactive_socket_recv_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ immediate_handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ handler(o->handler_, o->ec_, o->bytes_transferred_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_));
+ w.complete(handler, handler.handler_, io_ex);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+
+private:
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_REACTIVE_SOCKET_RECV_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactive_socket_recvfrom_op.hpp b/3rdparty/asio/include/asio/detail/reactive_socket_recvfrom_op.hpp
new file mode 100644
index 00000000000..b84ea61794f
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactive_socket_recvfrom_op.hpp
@@ -0,0 +1,203 @@
+//
+// detail/reactive_socket_recvfrom_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/handler_alloc_helpers.hpp"
+#include "asio/detail/handler_work.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 <typename MutableBufferSequence, typename Endpoint>
+class reactive_socket_recvfrom_op_base : public reactor_op
+{
+public:
+ reactive_socket_recvfrom_op_base(const asio::error_code& success_ec,
+ socket_type socket, int protocol_type,
+ const MutableBufferSequence& buffers, Endpoint& endpoint,
+ socket_base::message_flags flags, func_type complete_func)
+ : reactor_op(success_ec,
+ &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)
+ {
+ ASIO_ASSUME(base != 0);
+ reactive_socket_recvfrom_op_base* o(
+ static_cast<reactive_socket_recvfrom_op_base*>(base));
+
+ typedef buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_type;
+
+ std::size_t addr_len = o->sender_endpoint_.capacity();
+ status result;
+ if (bufs_type::is_single_buffer)
+ {
+ result = socket_ops::non_blocking_recvfrom1(
+ o->socket_, bufs_type::first(o->buffers_).data(),
+ bufs_type::first(o->buffers_).size(), o->flags_,
+ o->sender_endpoint_.data(), &addr_len,
+ o->ec_, o->bytes_transferred_) ? done : not_done;
+ }
+ else
+ {
+ bufs_type bufs(o->buffers_);
+ 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 <typename MutableBufferSequence, typename Endpoint,
+ typename Handler, typename IoExecutor>
+class reactive_socket_recvfrom_op :
+ public reactive_socket_recvfrom_op_base<MutableBufferSequence, Endpoint>
+{
+public:
+ typedef Handler handler_type;
+ typedef IoExecutor io_executor_type;
+
+ ASIO_DEFINE_HANDLER_PTR(reactive_socket_recvfrom_op);
+
+ reactive_socket_recvfrom_op(const asio::error_code& success_ec,
+ socket_type socket, int protocol_type,
+ const MutableBufferSequence& buffers, Endpoint& endpoint,
+ socket_base::message_flags flags, Handler& handler,
+ const IoExecutor& io_ex)
+ : reactive_socket_recvfrom_op_base<MutableBufferSequence, Endpoint>(
+ success_ec, socket, protocol_type, buffers, endpoint, flags,
+ &reactive_socket_recvfrom_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_recvfrom_op* o(
+ static_cast<reactive_socket_recvfrom_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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;
+ }
+ }
+
+ static void do_immediate(operation* base, bool, const void* io_ex)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_recvfrom_op* o(
+ static_cast<reactive_socket_recvfrom_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ immediate_handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ handler(o->handler_, o->ec_, o->bytes_transferred_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_));
+ w.complete(handler, handler.handler_, io_ex);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+
+private:
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_REACTIVE_SOCKET_RECVFROM_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactive_socket_recvmsg_op.hpp b/3rdparty/asio/include/asio/detail/reactive_socket_recvmsg_op.hpp
new file mode 100644
index 00000000000..e4c8117b675
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactive_socket_recvmsg_op.hpp
@@ -0,0 +1,184 @@
+//
+// detail/reactive_socket_recvmsg_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/handler_alloc_helpers.hpp"
+#include "asio/detail/handler_work.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 <typename MutableBufferSequence>
+class reactive_socket_recvmsg_op_base : public reactor_op
+{
+public:
+ reactive_socket_recvmsg_op_base(const asio::error_code& success_ec,
+ socket_type socket, const MutableBufferSequence& buffers,
+ socket_base::message_flags in_flags,
+ socket_base::message_flags& out_flags, func_type complete_func)
+ : reactor_op(success_ec,
+ &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)
+ {
+ ASIO_ASSUME(base != 0);
+ reactive_socket_recvmsg_op_base* o(
+ static_cast<reactive_socket_recvmsg_op_base*>(base));
+
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> 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 <typename MutableBufferSequence, typename Handler, typename IoExecutor>
+class reactive_socket_recvmsg_op :
+ public reactive_socket_recvmsg_op_base<MutableBufferSequence>
+{
+public:
+ typedef Handler handler_type;
+ typedef IoExecutor io_executor_type;
+
+ ASIO_DEFINE_HANDLER_PTR(reactive_socket_recvmsg_op);
+
+ reactive_socket_recvmsg_op(const asio::error_code& success_ec,
+ socket_type socket, const MutableBufferSequence& buffers,
+ socket_base::message_flags in_flags,
+ socket_base::message_flags& out_flags, Handler& handler,
+ const IoExecutor& io_ex)
+ : reactive_socket_recvmsg_op_base<MutableBufferSequence>(
+ success_ec, socket, buffers, in_flags, out_flags,
+ &reactive_socket_recvmsg_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_recvmsg_op* o(
+ static_cast<reactive_socket_recvmsg_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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;
+ }
+ }
+
+ static void do_immediate(operation* base, bool, const void* io_ex)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_recvmsg_op* o(
+ static_cast<reactive_socket_recvmsg_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ immediate_handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ handler(o->handler_, o->ec_, o->bytes_transferred_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_));
+ w.complete(handler, handler.handler_, io_ex);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+
+private:
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_REACTIVE_SOCKET_RECVMSG_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactive_socket_send_op.hpp b/3rdparty/asio/include/asio/detail/reactive_socket_send_op.hpp
new file mode 100644
index 00000000000..ef7ec69933b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactive_socket_send_op.hpp
@@ -0,0 +1,201 @@
+//
+// detail/reactive_socket_send_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/handler_alloc_helpers.hpp"
+#include "asio/detail/handler_work.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 <typename ConstBufferSequence>
+class reactive_socket_send_op_base : public reactor_op
+{
+public:
+ reactive_socket_send_op_base(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state,
+ const ConstBufferSequence& buffers,
+ socket_base::message_flags flags, func_type complete_func)
+ : reactor_op(success_ec,
+ &reactive_socket_send_op_base::do_perform, complete_func),
+ socket_(socket),
+ state_(state),
+ buffers_(buffers),
+ flags_(flags)
+ {
+ }
+
+ static status do_perform(reactor_op* base)
+ {
+ ASIO_ASSUME(base != 0);
+ reactive_socket_send_op_base* o(
+ static_cast<reactive_socket_send_op_base*>(base));
+
+ typedef buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs_type;
+
+ status result;
+ if (bufs_type::is_single_buffer)
+ {
+ result = socket_ops::non_blocking_send1(o->socket_,
+ bufs_type::first(o->buffers_).data(),
+ bufs_type::first(o->buffers_).size(), 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_type::first(o->buffers_).size())
+ result = done_and_exhausted;
+ }
+ else
+ {
+ bufs_type bufs(o->buffers_);
+ 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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+class reactive_socket_send_op :
+ public reactive_socket_send_op_base<ConstBufferSequence>
+{
+public:
+ typedef Handler handler_type;
+ typedef IoExecutor io_executor_type;
+
+ ASIO_DEFINE_HANDLER_PTR(reactive_socket_send_op);
+
+ reactive_socket_send_op(const asio::error_code& success_ec,
+ socket_type socket, socket_ops::state_type state,
+ const ConstBufferSequence& buffers, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ : reactive_socket_send_op_base<ConstBufferSequence>(success_ec, socket,
+ state, buffers, flags, &reactive_socket_send_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_send_op* o(static_cast<reactive_socket_send_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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;
+ }
+ }
+
+ static void do_immediate(operation* base, bool, const void* io_ex)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_send_op* o(static_cast<reactive_socket_send_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ immediate_handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ handler(o->handler_, o->ec_, o->bytes_transferred_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_));
+ w.complete(handler, handler.handler_, io_ex);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+
+
+private:
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_REACTIVE_SOCKET_SEND_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactive_socket_sendto_op.hpp b/3rdparty/asio/include/asio/detail/reactive_socket_sendto_op.hpp
new file mode 100644
index 00000000000..e1bbb70389c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactive_socket_sendto_op.hpp
@@ -0,0 +1,194 @@
+//
+// detail/reactive_socket_sendto_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/handler_alloc_helpers.hpp"
+#include "asio/detail/handler_work.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 <typename ConstBufferSequence, typename Endpoint>
+class reactive_socket_sendto_op_base : public reactor_op
+{
+public:
+ reactive_socket_sendto_op_base(const asio::error_code& success_ec,
+ socket_type socket, const ConstBufferSequence& buffers,
+ const Endpoint& endpoint, socket_base::message_flags flags,
+ func_type complete_func)
+ : reactor_op(success_ec,
+ &reactive_socket_sendto_op_base::do_perform, complete_func),
+ socket_(socket),
+ buffers_(buffers),
+ destination_(endpoint),
+ flags_(flags)
+ {
+ }
+
+ static status do_perform(reactor_op* base)
+ {
+ ASIO_ASSUME(base != 0);
+ reactive_socket_sendto_op_base* o(
+ static_cast<reactive_socket_sendto_op_base*>(base));
+
+ typedef buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs_type;
+
+ status result;
+ if (bufs_type::is_single_buffer)
+ {
+ result = socket_ops::non_blocking_sendto1(o->socket_,
+ bufs_type::first(o->buffers_).data(),
+ bufs_type::first(o->buffers_).size(), o->flags_,
+ o->destination_.data(), o->destination_.size(),
+ o->ec_, o->bytes_transferred_) ? done : not_done;
+ }
+ else
+ {
+ bufs_type bufs(o->buffers_);
+ 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 <typename ConstBufferSequence, typename Endpoint,
+ typename Handler, typename IoExecutor>
+class reactive_socket_sendto_op :
+ public reactive_socket_sendto_op_base<ConstBufferSequence, Endpoint>
+{
+public:
+ typedef Handler handler_type;
+ typedef IoExecutor io_executor_type;
+
+ ASIO_DEFINE_HANDLER_PTR(reactive_socket_sendto_op);
+
+ reactive_socket_sendto_op(const asio::error_code& success_ec,
+ socket_type socket, const ConstBufferSequence& buffers,
+ const Endpoint& endpoint, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ : reactive_socket_sendto_op_base<ConstBufferSequence, Endpoint>(
+ success_ec, socket, buffers, endpoint, flags,
+ &reactive_socket_sendto_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_sendto_op* o(static_cast<reactive_socket_sendto_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ 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;
+ }
+ }
+
+ static void do_immediate(operation* base, bool, const void* io_ex)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_socket_sendto_op* o(static_cast<reactive_socket_sendto_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ immediate_handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(o->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, asio::error_code, std::size_t>
+ handler(o->handler_, o->ec_, o->bytes_transferred_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_));
+ w.complete(handler, handler.handler_, io_ex);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+
+private:
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_REACTIVE_SOCKET_SENDTO_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactive_socket_service.hpp b/3rdparty/asio/include/asio/detail/reactive_socket_service.hpp
new file mode 100644
index 00000000000..c828e7f1f2a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactive_socket_service.hpp
@@ -0,0 +1,633 @@
+//
+// detail/reactive_socket_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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) \
+ && !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#include "asio/buffer.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_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 <typename Protocol>
+class reactive_socket_service :
+ public execution_context_service_base<reactive_socket_service<Protocol>>,
+ 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(execution_context& context)
+ : execution_context_service_base<
+ reactive_socket_service<Protocol>>(context),
+ reactive_socket_service_base(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) noexcept
+ {
+ 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 <typename Protocol1>
+ void converting_move_construct(implementation_type& impl,
+ reactive_socket_service<Protocol1>&,
+ 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;
+
+ ASIO_ERROR_LOCATION(ec);
+ 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;
+
+ ASIO_ERROR_LOCATION(ec);
+ 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);
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Set a socket option.
+ template <typename Option>
+ 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);
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Set a socket option.
+ template <typename Option>
+ 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);
+
+ ASIO_ERROR_LOCATION(ec);
+ 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))
+ {
+ ASIO_ERROR_LOCATION(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))
+ {
+ ASIO_ERROR_LOCATION(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);
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Send a datagram to the specified endpoint. Returns the number of bytes
+ // sent.
+ template <typename ConstBufferSequence>
+ size_t send_to(implementation_type& impl, const ConstBufferSequence& buffers,
+ const endpoint_type& destination, socket_base::message_flags flags,
+ asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs_type;
+
+ size_t n;
+ if (bufs_type::is_single_buffer)
+ {
+ n = socket_ops::sync_sendto1(impl.socket_, impl.state_,
+ bufs_type::first(buffers).data(),
+ bufs_type::first(buffers).size(), flags,
+ destination.data(), destination.size(), ec);
+ }
+ else
+ {
+ bufs_type bufs(buffers);
+ n = socket_ops::sync_sendto(impl.socket_, impl.state_,
+ bufs.buffers(), bufs.count(), flags,
+ destination.data(), destination.size(), ec);
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return n;
+ }
+
+ // 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);
+
+ ASIO_ERROR_LOCATION(ec);
+ return 0;
+ }
+
+ // Start an asynchronous send. The data being sent must be valid for the
+ // lifetime of the asynchronous operation.
+ template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_send_to(implementation_type& impl,
+ const ConstBufferSequence& buffers,
+ const endpoint_type& destination, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_socket_sendto_op<ConstBufferSequence,
+ endpoint_type, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_,
+ buffers, destination, flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::write_op);
+ }
+
+ 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, &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_send_to(implementation_type& impl, const null_buffers&,
+ const endpoint_type&, socket_base::message_flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::write_op);
+ }
+
+ 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, &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Receive a datagram with the endpoint of the sender. Returns the number of
+ // bytes received.
+ template <typename MutableBufferSequence>
+ size_t receive_from(implementation_type& impl,
+ const MutableBufferSequence& buffers,
+ endpoint_type& sender_endpoint, socket_base::message_flags flags,
+ asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_type;
+
+ std::size_t addr_len = sender_endpoint.capacity();
+ std::size_t n;
+ if (bufs_type::is_single_buffer)
+ {
+ n = socket_ops::sync_recvfrom1(impl.socket_, impl.state_,
+ bufs_type::first(buffers).data(), bufs_type::first(buffers).size(),
+ flags, sender_endpoint.data(), &addr_len, ec);
+ }
+ else
+ {
+ bufs_type bufs(buffers);
+ n = 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);
+
+ ASIO_ERROR_LOCATION(ec);
+ return n;
+ }
+
+ // 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();
+
+ ASIO_ERROR_LOCATION(ec);
+ 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_receive_from(implementation_type& impl,
+ const MutableBufferSequence& buffers, endpoint_type& sender_endpoint,
+ socket_base::message_flags flags, Handler& handler,
+ const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_socket_recvfrom_op<MutableBufferSequence,
+ endpoint_type, Handler, IoExecutor> 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(success_ec_, impl.socket_, protocol,
+ buffers, sender_endpoint, flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::read_op);
+ }
+
+ 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, &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_receive_from(implementation_type& impl, const null_buffers&,
+ endpoint_type& sender_endpoint, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::read_op);
+ }
+
+ 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, &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Accept a new connection.
+ template <typename Socket>
+ 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;
+ ASIO_ERROR_LOCATION(ec);
+ 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();
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Start an asynchronous accept. The peer and peer_endpoint objects must be
+ // valid until the accept's handler is invoked.
+ template <typename Socket, typename Handler, typename IoExecutor>
+ void async_accept(implementation_type& impl, Socket& peer,
+ endpoint_type* peer_endpoint, Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_socket_accept_op<Socket, Protocol, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_, impl.state_,
+ peer, impl.protocol_, peer_endpoint, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected() && !peer.is_open())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::read_op);
+ }
+
+ ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket",
+ &impl, impl.socket_, "async_accept"));
+
+ start_accept_op(impl, p.p, is_continuation, peer.is_open(), &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Start an asynchronous accept. The peer_endpoint object must be valid until
+ // the accept's handler is invoked.
+ template <typename PeerIoExecutor, typename Handler, typename IoExecutor>
+ void async_move_accept(implementation_type& impl,
+ const PeerIoExecutor& peer_io_ex, endpoint_type* peer_endpoint,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_socket_move_accept_op<Protocol,
+ PeerIoExecutor, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, peer_io_ex, impl.socket_,
+ impl.state_, impl.protocol_, peer_endpoint, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::read_op);
+ }
+
+ ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket",
+ &impl, impl.socket_, "async_accept"));
+
+ start_accept_op(impl, p.p, is_continuation, false, &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // 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);
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Start an asynchronous connect.
+ template <typename Handler, typename IoExecutor>
+ void async_connect(implementation_type& impl,
+ const endpoint_type& peer_endpoint,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_socket_connect_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::connect_op);
+ }
+
+ 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(), &io_ex, 0);
+ p.v = p.p = 0;
+ }
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // !defined(ASIO_HAS_IOCP)
+ // && !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#endif // ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactive_socket_service_base.hpp b/3rdparty/asio/include/asio/detail/reactive_socket_service_base.hpp
new file mode 100644
index 00000000000..63dcacad582
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactive_socket_service_base.hpp
@@ -0,0 +1,750 @@
+//
+// detail/reactive_socket_service_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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) \
+ && !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#include "asio/associated_cancellation_slot.hpp"
+#include "asio/buffer.hpp"
+#include "asio/cancellation_type.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_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(execution_context& 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) noexcept;
+
+ // 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 <typename IO_Control_Command>
+ 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<ioctl_arg_type*>(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 <typename Handler, typename IoExecutor>
+ void async_wait(base_implementation_type& impl,
+ socket_base::wait_type w, Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_wait_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, handler, io_ex);
+
+ 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;
+ start_op(impl, reactor::read_op, p.p,
+ is_continuation, false, true, &io_ex, 0);
+ p.v = p.p = 0;
+ return;
+ }
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, op_type);
+ }
+
+ start_op(impl, op_type, p.p, is_continuation, false, false, &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Send the given data to the peer.
+ template <typename ConstBufferSequence>
+ size_t send(base_implementation_type& impl,
+ const ConstBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs_type;
+
+ if (bufs_type::is_single_buffer)
+ {
+ return socket_ops::sync_send1(impl.socket_,
+ impl.state_, bufs_type::first(buffers).data(),
+ bufs_type::first(buffers).size(), flags, ec);
+ }
+ else
+ {
+ bufs_type 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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_send(base_implementation_type& impl,
+ const ConstBufferSequence& buffers, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_socket_send_op<
+ ConstBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_,
+ impl.state_, buffers, flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::write_op);
+ }
+
+ 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<asio::const_buffer,
+ ConstBufferSequence>::all_empty(buffers)), &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_send(base_implementation_type& impl, const null_buffers&,
+ socket_base::message_flags, Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::write_op);
+ }
+
+ 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, &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Receive some data from the peer. Returns the number of bytes received.
+ template <typename MutableBufferSequence>
+ size_t receive(base_implementation_type& impl,
+ const MutableBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ typedef buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs_type;
+
+ if (bufs_type::is_single_buffer)
+ {
+ return socket_ops::sync_recv1(impl.socket_,
+ impl.state_, bufs_type::first(buffers).data(),
+ bufs_type::first(buffers).size(), flags, ec);
+ }
+ else
+ {
+ bufs_type 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_receive(base_implementation_type& impl,
+ const MutableBufferSequence& buffers, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_socket_recv_op<
+ MutableBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_,
+ impl.state_, buffers, flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::read_op);
+ }
+
+ 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<asio::mutable_buffer,
+ MutableBufferSequence>::all_empty(buffers)), &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_receive(base_implementation_type& impl,
+ const null_buffers&, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::read_op);
+ }
+
+ 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, &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Receive some data with associated flags. Returns the number of bytes
+ // received.
+ template <typename MutableBufferSequence>
+ 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<asio::mutable_buffer,
+ MutableBufferSequence> 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ 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,
+ const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_socket_recvmsg_op<
+ MutableBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, impl.socket_,
+ buffers, in_flags, out_flags, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::read_op);
+ }
+
+ 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, &io_ex, 0);
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ 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,
+ const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef reactive_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(success_ec_, handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<reactor_op_cancellation>(
+ &reactor_, &impl.reactor_data_, impl.socket_, reactor::read_op);
+ }
+
+ 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, &io_ex, 0);
+ 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 do_start_op(base_implementation_type& impl, int op_type,
+ reactor_op* op, bool is_continuation, bool is_non_blocking, bool noop,
+ void (*on_immediate)(operation* op, bool, const void*),
+ const void* immediate_arg);
+
+ // Start the asynchronous operation for handlers that are specialised for
+ // immediate completion.
+ template <typename Op>
+ void start_op(base_implementation_type& impl, int op_type, Op* op,
+ bool is_continuation, bool is_non_blocking, bool noop,
+ const void* io_ex, ...)
+ {
+ return do_start_op(impl, op_type, op, is_continuation,
+ is_non_blocking, noop, &Op::do_immediate, io_ex);
+ }
+
+ // Start the asynchronous operation for handlers that are not specialised for
+ // immediate completion.
+ template <typename Op>
+ void start_op(base_implementation_type& impl, int op_type, Op* op,
+ bool is_continuation, bool is_non_blocking, bool noop, const void*,
+ enable_if_t<
+ is_same<
+ typename associated_immediate_executor<
+ typename Op::handler_type,
+ typename Op::io_executor_type
+ >::asio_associated_immediate_executor_is_unspecialised,
+ void
+ >::value
+ >*)
+ {
+ return do_start_op(impl, op_type, op, is_continuation, is_non_blocking,
+ noop, &reactor::call_post_immediate_completion, &reactor_);
+ }
+
+ // Start the asynchronous accept operation.
+ ASIO_DECL void do_start_accept_op(base_implementation_type& impl,
+ reactor_op* op, bool is_continuation, bool peer_is_open,
+ void (*on_immediate)(operation* op, bool, const void*),
+ const void* immediate_arg);
+
+ // Start the asynchronous accept operation for handlers that are specialised
+ // for immediate completion.
+ template <typename Op>
+ void start_accept_op(base_implementation_type& impl, Op* op,
+ bool is_continuation, bool peer_is_open, const void* io_ex, ...)
+ {
+ return do_start_accept_op(impl, op, is_continuation,
+ peer_is_open, &Op::do_immediate, io_ex);
+ }
+
+ // Start the asynchronous operation for handlers that are not specialised for
+ // immediate completion.
+ template <typename Op>
+ void start_accept_op(base_implementation_type& impl, Op* op,
+ bool is_continuation, bool peer_is_open, const void*,
+ enable_if_t<
+ is_same<
+ typename associated_immediate_executor<
+ typename Op::handler_type,
+ typename Op::io_executor_type
+ >::asio_associated_immediate_executor_is_unspecialised,
+ void
+ >::value
+ >*)
+ {
+ return do_start_accept_op(impl, op, is_continuation, peer_is_open,
+ &reactor::call_post_immediate_completion, &reactor_);
+ }
+
+ // Start the asynchronous connect operation.
+ ASIO_DECL void do_start_connect_op(base_implementation_type& impl,
+ reactor_op* op, bool is_continuation, const void* addr, size_t addrlen,
+ void (*on_immediate)(operation* op, bool, const void*),
+ const void* immediate_arg);
+
+ // Start the asynchronous operation for handlers that are specialised for
+ // immediate completion.
+ template <typename Op>
+ void start_connect_op(base_implementation_type& impl,
+ Op* op, bool is_continuation, const void* addr,
+ size_t addrlen, const void* io_ex, ...)
+ {
+ return do_start_connect_op(impl, op, is_continuation,
+ addr, addrlen, &Op::do_immediate, io_ex);
+ }
+
+ // Start the asynchronous operation for handlers that are not specialised for
+ // immediate completion.
+ template <typename Op>
+ void start_connect_op(base_implementation_type& impl, Op* op,
+ bool is_continuation, const void* addr, size_t addrlen, const void*,
+ enable_if_t<
+ is_same<
+ typename associated_immediate_executor<
+ typename Op::handler_type,
+ typename Op::io_executor_type
+ >::asio_associated_immediate_executor_is_unspecialised,
+ void
+ >::value
+ >*)
+ {
+ return do_start_connect_op(impl, op, is_continuation, addr,
+ addrlen, &reactor::call_post_immediate_completion, &reactor_);
+ }
+
+ // Helper class used to implement per-operation cancellation
+ class reactor_op_cancellation
+ {
+ public:
+ reactor_op_cancellation(reactor* r,
+ reactor::per_descriptor_data* p, socket_type d, int o)
+ : reactor_(r),
+ reactor_data_(p),
+ descriptor_(d),
+ op_type_(o)
+ {
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ if (!!(type &
+ (cancellation_type::terminal
+ | cancellation_type::partial
+ | cancellation_type::total)))
+ {
+ reactor_->cancel_ops_by_key(descriptor_,
+ *reactor_data_, op_type_, this);
+ }
+ }
+
+ private:
+ reactor* reactor_;
+ reactor::per_descriptor_data* reactor_data_;
+ socket_type descriptor_;
+ int op_type_;
+ };
+
+ // The selector that performs event demultiplexing for the service.
+ reactor& reactor_;
+
+ // Cached success value to avoid accessing category singleton.
+ const asio::error_code success_ec_;
+};
+
+} // 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)
+ // && !defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#endif // ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_BASE_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactive_wait_op.hpp b/3rdparty/asio/include/asio/detail/reactive_wait_op.hpp
new file mode 100644
index 00000000000..62938e2d83e
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactive_wait_op.hpp
@@ -0,0 +1,131 @@
+//
+// detail/reactive_wait_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/bind_handler.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/reactor_op.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Handler, typename IoExecutor>
+class reactive_wait_op : public reactor_op
+{
+public:
+ typedef Handler handler_type;
+ typedef IoExecutor io_executor_type;
+
+ ASIO_DEFINE_HANDLER_PTR(reactive_wait_op);
+
+ reactive_wait_op(const asio::error_code& success_ec,
+ Handler& handler, const IoExecutor& io_ex)
+ : reactor_op(success_ec, &reactive_wait_op::do_perform,
+ &reactive_wait_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ reactive_wait_op* o(static_cast<reactive_wait_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ // 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, asio::error_code>
+ 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;
+ }
+ }
+
+ static void do_immediate(operation* base, bool, const void* io_ex)
+ {
+ // Take ownership of the handler object.
+ ASIO_ASSUME(base != 0);
+ reactive_wait_op* o(static_cast<reactive_wait_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ immediate_handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ // 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, asio::error_code>
+ handler(o->handler_, o->ec_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_));
+ w.complete(handler, handler.handler_, io_ex);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+
+private:
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_REACTIVE_WAIT_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactor.hpp b/3rdparty/asio/include/asio/detail/reactor.hpp
new file mode 100644
index 00000000000..054acfdab00
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactor.hpp
@@ -0,0 +1,54 @@
+//
+// detail/reactor.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/config.hpp"
+
+#if defined(ASIO_HAS_IOCP) || defined(ASIO_WINDOWS_RUNTIME)
+# include "asio/detail/null_reactor.hpp"
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/null_reactor.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
+
+namespace asio {
+namespace detail {
+
+#if defined(ASIO_HAS_IOCP) || defined(ASIO_WINDOWS_RUNTIME)
+typedef null_reactor reactor;
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+typedef null_reactor reactor;
+#elif defined(ASIO_HAS_EPOLL)
+typedef epoll_reactor reactor;
+#elif defined(ASIO_HAS_KQUEUE)
+typedef kqueue_reactor reactor;
+#elif defined(ASIO_HAS_DEV_POLL)
+typedef dev_poll_reactor reactor;
+#else
+typedef select_reactor reactor;
+#endif
+
+} // namespace detail
+} // namespace asio
+
+#endif // ASIO_DETAIL_REACTOR_HPP
diff --git a/3rdparty/asio/include/asio/detail/reactor_op.hpp b/3rdparty/asio/include/asio/detail/reactor_op.hpp
new file mode 100644
index 00000000000..54d6cd964eb
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactor_op.hpp
@@ -0,0 +1,71 @@
+//
+// detail/reactor_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 operation key used for targeted cancellation.
+ void* cancellation_key_;
+
+ // 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(const asio::error_code& success_ec,
+ perform_func_type perform_func, func_type complete_func)
+ : operation(complete_func),
+ ec_(success_ec),
+ cancellation_key_(0),
+ 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/3rdparty/asio/include/asio/detail/reactor_op_queue.hpp b/3rdparty/asio/include/asio/detail/reactor_op_queue.hpp
new file mode 100644
index 00000000000..fae1a52d9e7
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/reactor_op_queue.hpp
@@ -0,0 +1,212 @@
+//
+// detail/reactor_op_queue.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Descriptor>
+class reactor_op_queue
+ : private noncopyable
+{
+public:
+ typedef Descriptor key_type;
+
+ struct mapped_type : op_queue<reactor_op>
+ {
+ mapped_type() {}
+ mapped_type(const mapped_type&) {}
+ void operator=(const mapped_type&) {}
+ };
+
+ typedef typename hash_map<key_type, mapped_type>::value_type value_type;
+ typedef typename hash_map<key_type, mapped_type>::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<iterator, bool> 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<operation>& 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<operation>& ops,
+ const asio::error_code& ec =
+ asio::error::operation_aborted)
+ {
+ return this->cancel_operations(operations_.find(descriptor), ops, ec);
+ }
+
+ // Cancel operations associated with the descriptor identified by the
+ // supplied iterator, and the specified cancellation key. Any operations
+ // pending for the descriptor with the key 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_by_key(iterator i, op_queue<operation>& ops,
+ void* cancellation_key, const asio::error_code& ec =
+ asio::error::operation_aborted)
+ {
+ bool result = false;
+ if (i != operations_.end())
+ {
+ op_queue<reactor_op> other_ops;
+ while (reactor_op* op = i->second.front())
+ {
+ i->second.pop();
+ if (op->cancellation_key_ == cancellation_key)
+ {
+ op->ec_ = ec;
+ ops.push(op);
+ result = true;
+ }
+ else
+ other_ops.push(op);
+ }
+ i->second.push(other_ops);
+ if (i->second.empty())
+ operations_.erase(i);
+ }
+ return result;
+ }
+
+ // 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_by_key(Descriptor descriptor, op_queue<operation>& ops,
+ void* cancellation_key, const asio::error_code& ec =
+ asio::error::operation_aborted)
+ {
+ return this->cancel_operations_by_key(
+ operations_.find(descriptor), ops, cancellation_key, 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<operation>& 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<operation>& ops)
+ {
+ return this->perform_operations(operations_.find(descriptor), ops);
+ }
+
+ // Get all operations owned by the queue.
+ void get_all_operations(op_queue<operation>& 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<key_type, mapped_type> operations_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_REACTOR_OP_QUEUE_HPP
diff --git a/3rdparty/asio/include/asio/detail/recycling_allocator.hpp b/3rdparty/asio/include/asio/detail/recycling_allocator.hpp
new file mode 100644
index 00000000000..d556f22a399
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/recycling_allocator.hpp
@@ -0,0 +1,105 @@
+//
+// detail/recycling_allocator.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename T, typename Purpose = thread_info_base::default_tag>
+class recycling_allocator
+{
+public:
+ typedef T value_type;
+
+ template <typename U>
+ struct rebind
+ {
+ typedef recycling_allocator<U, Purpose> other;
+ };
+
+ recycling_allocator()
+ {
+ }
+
+ template <typename U>
+ recycling_allocator(const recycling_allocator<U, Purpose>&)
+ {
+ }
+
+ T* allocate(std::size_t n)
+ {
+ void* p = thread_info_base::allocate(Purpose(),
+ thread_context::top_of_thread_call_stack(),
+ sizeof(T) * n, alignof(T));
+ return static_cast<T*>(p);
+ }
+
+ void deallocate(T* p, std::size_t n)
+ {
+ thread_info_base::deallocate(Purpose(),
+ thread_context::top_of_thread_call_stack(), p, sizeof(T) * n);
+ }
+};
+
+template <typename Purpose>
+class recycling_allocator<void, Purpose>
+{
+public:
+ typedef void value_type;
+
+ template <typename U>
+ struct rebind
+ {
+ typedef recycling_allocator<U, Purpose> other;
+ };
+
+ recycling_allocator()
+ {
+ }
+
+ template <typename U>
+ recycling_allocator(const recycling_allocator<U, Purpose>&)
+ {
+ }
+};
+
+template <typename Allocator, typename Purpose>
+struct get_recycling_allocator
+{
+ typedef Allocator type;
+ static type get(const Allocator& a) { return a; }
+};
+
+template <typename T, typename Purpose>
+struct get_recycling_allocator<std::allocator<T>, Purpose>
+{
+ typedef recycling_allocator<T, Purpose> type;
+ static type get(const std::allocator<T>&) { return type(); }
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_RECYCLING_ALLOCATOR_HPP
diff --git a/3rdparty/asio/include/asio/detail/regex_fwd.hpp b/3rdparty/asio/include/asio/detail/regex_fwd.hpp
new file mode 100644
index 00000000000..a5c6c0a9428
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/regex_fwd.hpp
@@ -0,0 +1,35 @@
+//
+// detail/regex_fwd.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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)
+
+namespace boost {
+
+template <class BidiIterator>
+struct sub_match;
+
+template <class BidiIterator, class Allocator>
+class match_results;
+
+template <class CharT, class Traits>
+class basic_regex;
+
+} // namespace boost
+
+#endif // defined(ASIO_HAS_BOOST_REGEX)
+
+#endif // ASIO_DETAIL_REGEX_FWD_HPP
diff --git a/3rdparty/asio/include/asio/detail/resolve_endpoint_op.hpp b/3rdparty/asio/include/asio/detail/resolve_endpoint_op.hpp
new file mode 100644
index 00000000000..c7cb2c4c101
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/resolve_endpoint_op.hpp
@@ -0,0 +1,140 @@
+//
+// detail/resolve_endpoint_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/detail/bind_handler.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/resolve_op.hpp"
+#include "asio/detail/socket_ops.hpp"
+#include "asio/error.hpp"
+#include "asio/ip/basic_resolver_results.hpp"
+
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_io_context.hpp"
+#else // defined(ASIO_HAS_IOCP)
+# include "asio/detail/scheduler.hpp"
+#endif // defined(ASIO_HAS_IOCP)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Protocol, typename Handler, typename IoExecutor>
+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<Protocol> results_type;
+
+#if defined(ASIO_HAS_IOCP)
+ typedef class win_iocp_io_context scheduler_impl;
+#else
+ typedef class scheduler scheduler_impl;
+#endif
+
+ resolve_endpoint_op(socket_ops::weak_cancel_token_type cancel_token,
+ const endpoint_type& endpoint, scheduler_impl& sched,
+ Handler& handler, const IoExecutor& io_ex)
+ : resolve_op(&resolve_endpoint_op::do_complete),
+ cancel_token_(cancel_token),
+ endpoint_(endpoint),
+ scheduler_(sched),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& /*ec*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ // Take ownership of the operation object.
+ ASIO_ASSUME(base != 0);
+ resolve_endpoint_op* o(static_cast<resolve_endpoint_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ if (owner && owner != &o->scheduler_)
+ {
+ // 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->scheduler_.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));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ // 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, asio::error_code, results_type>
+ 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_;
+ scheduler_impl& scheduler_;
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+ results_type results_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_RESOLVER_ENDPOINT_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/resolve_op.hpp b/3rdparty/asio/include/asio/detail/resolve_op.hpp
new file mode 100644
index 00000000000..5b41ad2fe68
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/resolve_op.hpp
@@ -0,0 +1,45 @@
+//
+// detail/resolve_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/resolve_query_op.hpp b/3rdparty/asio/include/asio/detail/resolve_query_op.hpp
new file mode 100644
index 00000000000..b7f9e35cef0
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/resolve_query_op.hpp
@@ -0,0 +1,150 @@
+//
+// detail/resolve_query_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/detail/bind_handler.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/resolve_op.hpp"
+#include "asio/detail/socket_ops.hpp"
+#include "asio/error.hpp"
+#include "asio/ip/basic_resolver_query.hpp"
+#include "asio/ip/basic_resolver_results.hpp"
+
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_io_context.hpp"
+#else // defined(ASIO_HAS_IOCP)
+# include "asio/detail/scheduler.hpp"
+#endif // defined(ASIO_HAS_IOCP)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Protocol, typename Handler, typename IoExecutor>
+class resolve_query_op : public resolve_op
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(resolve_query_op);
+
+ typedef asio::ip::basic_resolver_query<Protocol> query_type;
+ typedef asio::ip::basic_resolver_results<Protocol> results_type;
+
+#if defined(ASIO_HAS_IOCP)
+ typedef class win_iocp_io_context scheduler_impl;
+#else
+ typedef class scheduler scheduler_impl;
+#endif
+
+ resolve_query_op(socket_ops::weak_cancel_token_type cancel_token,
+ const query_type& qry, scheduler_impl& sched,
+ Handler& handler, const IoExecutor& io_ex)
+ : resolve_op(&resolve_query_op::do_complete),
+ cancel_token_(cancel_token),
+ query_(qry),
+ scheduler_(sched),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex),
+ addrinfo_(0)
+ {
+ }
+
+ ~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.
+ ASIO_ASSUME(base != 0);
+ resolve_query_op* o(static_cast<resolve_query_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ if (owner && owner != &o->scheduler_)
+ {
+ // 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->scheduler_.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));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ // 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, asio::error_code, results_type>
+ 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_;
+ scheduler_impl& scheduler_;
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+ 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/3rdparty/asio/include/asio/detail/resolver_service.hpp b/3rdparty/asio/include/asio/detail/resolver_service.hpp
new file mode 100644
index 00000000000..2d1fe22b62a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/resolver_service.hpp
@@ -0,0 +1,147 @@
+//
+// detail/resolver_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Protocol>
+class resolver_service :
+ public execution_context_service_base<resolver_service<Protocol>>,
+ 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<Protocol> query_type;
+
+ // The results type.
+ typedef asio::ip::basic_resolver_results<Protocol> results_type;
+
+ // Constructor.
+ resolver_service(execution_context& context)
+ : execution_context_service_base<resolver_service<Protocol>>(context),
+ resolver_service_base(context)
+ {
+ }
+
+ // Destroy all user-defined handler objects owned by the service.
+ void shutdown()
+ {
+ this->base_shutdown();
+ }
+
+ // Perform any fork-related housekeeping.
+ void notify_fork(execution_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& qry,
+ asio::error_code& ec)
+ {
+ asio::detail::addrinfo_type* address_info = 0;
+
+ socket_ops::getaddrinfo(qry.host_name().c_str(),
+ qry.service_name().c_str(), qry.hints(), &address_info, ec);
+ auto_addrinfo auto_address_info(address_info);
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec ? results_type() : results_type::create(
+ address_info, qry.host_name(), qry.service_name());
+ }
+
+ // Asynchronously resolve a query to a list of entries.
+ template <typename Handler, typename IoExecutor>
+ void async_resolve(implementation_type& impl, const query_type& qry,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ // Allocate and construct an operation to wrap the handler.
+ typedef resolve_query_op<Protocol, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(impl, qry, scheduler_, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((scheduler_.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);
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec ? results_type() : results_type::create(
+ endpoint, host_name, service_name);
+ }
+
+ // Asynchronously resolve an endpoint to a list of entries.
+ template <typename Handler, typename IoExecutor>
+ void async_resolve(implementation_type& impl, const endpoint_type& endpoint,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ // Allocate and construct an operation to wrap the handler.
+ typedef resolve_endpoint_op<Protocol, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(impl, endpoint, scheduler_, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((scheduler_.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/3rdparty/asio/include/asio/detail/resolver_service_base.hpp b/3rdparty/asio/include/asio/detail/resolver_service_base.hpp
new file mode 100644
index 00000000000..160793c89cb
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/resolver_service_base.hpp
@@ -0,0 +1,158 @@
+//
+// detail/resolver_service_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/execution_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"
+
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_io_context.hpp"
+#else // defined(ASIO_HAS_IOCP)
+# include "asio/detail/scheduler.hpp"
+#endif // defined(ASIO_HAS_IOCP)
+
+#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(execution_context& 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(
+ execution_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);
+
+ // Move-construct a new timer implementation.
+ void converting_move_construct(implementation_type& impl,
+ resolver_service_base&, implementation_type& other_impl)
+ {
+ move_construct(impl, other_impl);
+ }
+
+ // Move-assign from another timer implementation.
+ void converting_move_assign(implementation_type& impl,
+ resolver_service_base& other_service,
+ implementation_type& other_impl)
+ {
+ move_assign(impl, other_service, 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 scheduler in a thread.
+ class work_scheduler_runner;
+
+ // Start the work scheduler if it's not already running.
+ ASIO_DECL void start_work_thread();
+
+ // The scheduler implementation used to post completions.
+#if defined(ASIO_HAS_IOCP)
+ typedef class win_iocp_io_context scheduler_impl;
+#else
+ typedef class scheduler scheduler_impl;
+#endif
+ scheduler_impl& scheduler_;
+
+private:
+ // Mutex to protect access to internal data.
+ asio::detail::mutex mutex_;
+
+ // Private scheduler used for performing asynchronous host resolution.
+ asio::detail::scoped_ptr<scheduler_impl> work_scheduler_;
+
+ // Thread used for running the work io_context's run loop.
+ asio::detail::scoped_ptr<asio::detail::thread> 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/3rdparty/asio/include/asio/detail/scheduler.hpp b/3rdparty/asio/include/asio/detail/scheduler.hpp
new file mode 100644
index 00000000000..a73ec141ebc
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/scheduler.hpp
@@ -0,0 +1,241 @@
+//
+// detail/scheduler.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/scheduler_operation.hpp"
+#include "asio/detail/scheduler_task.hpp"
+#include "asio/detail/thread.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<scheduler>,
+ public thread_context
+{
+public:
+ typedef scheduler_operation operation;
+
+ // The type of a function used to obtain a task instance.
+ typedef scheduler_task* (*get_task_func_type)(
+ asio::execution_context&);
+
+ // 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, bool own_thread = true,
+ get_task_func_type get_task = &scheduler::get_default_task);
+
+ // Destructor.
+ ASIO_DECL ~scheduler();
+
+ // 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.
+ ASIO_DECL bool can_dispatch();
+
+ /// Capture the current exception so it can be rethrown from a run function.
+ ASIO_DECL void capture_current_exception();
+
+ // 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 operations and return immediately. Assumes
+ // that work_started() has not yet been called for the operations.
+ ASIO_DECL void post_immediate_completions(std::size_t n,
+ op_queue<operation>& ops, 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<operation>& 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<operation>& 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);
+
+ // Get the default task.
+ ASIO_DECL static scheduler_task* get_default_task(
+ asio::execution_context& ctx);
+
+ // Helper class to run the scheduler in its own thread.
+ class thread_function;
+ friend class thread_function;
+
+ // 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.
+ scheduler_task* task_;
+
+ // The function used to get the task.
+ get_task_func_type get_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<operation> 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_;
+
+ // The thread that is running the scheduler.
+ asio::detail::thread* thread_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/scheduler_operation.hpp b/3rdparty/asio/include/asio/detail/scheduler_operation.hpp
new file mode 100644
index 00000000000..1b4ceb36f5c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/scheduler_operation.hpp
@@ -0,0 +1,78 @@
+//
+// detail/scheduler_operation.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/scheduler_task.hpp b/3rdparty/asio/include/asio/detail/scheduler_task.hpp
new file mode 100644
index 00000000000..a1a4ec1c85f
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/scheduler_task.hpp
@@ -0,0 +1,49 @@
+//
+// detail/scheduler_task.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_TASK_HPP
+#define ASIO_DETAIL_SCHEDULER_TASK_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/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class scheduler_operation;
+
+// Base class for all tasks that may be run by a scheduler.
+class scheduler_task
+{
+public:
+ // Run the task once until interrupted or events are ready to be dispatched.
+ virtual void run(long usec, op_queue<scheduler_operation>& ops) = 0;
+
+ // Interrupt the task.
+ virtual void interrupt() = 0;
+
+protected:
+ // Prevent deletion through this type.
+ ~scheduler_task()
+ {
+ }
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_SCHEDULER_TASK_HPP
diff --git a/3rdparty/asio/include/asio/detail/scheduler_thread_info.hpp b/3rdparty/asio/include/asio/detail/scheduler_thread_info.hpp
new file mode 100644
index 00000000000..410d2866b59
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/scheduler_thread_info.hpp
@@ -0,0 +1,40 @@
+//
+// detail/scheduler_thread_info.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<scheduler_operation> 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/3rdparty/asio/include/asio/detail/scoped_lock.hpp b/3rdparty/asio/include/asio/detail/scoped_lock.hpp
new file mode 100644
index 00000000000..778832d6350
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/scoped_lock.hpp
@@ -0,0 +1,101 @@
+//
+// detail/scoped_lock.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Mutex>
+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/3rdparty/asio/include/asio/detail/scoped_ptr.hpp b/3rdparty/asio/include/asio/detail/scoped_ptr.hpp
new file mode 100644
index 00000000000..a517c2b947c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/scoped_ptr.hpp
@@ -0,0 +1,87 @@
+//
+// detail/scoped_ptr.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename T>
+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/3rdparty/asio/include/asio/detail/select_interrupter.hpp b/3rdparty/asio/include/asio/detail/select_interrupter.hpp
new file mode 100644
index 00000000000..57cb4ce8d71
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/select_interrupter.hpp
@@ -0,0 +1,46 @@
+//
+// detail/select_interrupter.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/select_reactor.hpp b/3rdparty/asio/include/asio/detail/select_reactor.hpp
new file mode 100644
index 00000000000..7fe647b7e63
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/select_reactor.hpp
@@ -0,0 +1,291 @@
+//
+// detail/select_reactor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#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/scheduler_task.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<select_reactor>
+#if !defined(ASIO_HAS_IOCP)
+ , public scheduler_task
+#endif // !defined(ASIO_HAS_IOCP)
+{
+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(operation* op, bool is_continuation) const;
+
+ // Post a reactor operation for immediate completion.
+ ASIO_DECL static void call_post_immediate_completion(
+ operation* op, bool is_continuation, const void* self);
+
+ // 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,
+ void (*on_immediate)(operation*, bool, const void*),
+ const void* immediate_arg);
+
+ // Start a new operation. The reactor operation will be performed when the
+ // given descriptor is flagged as ready, or an error has occurred.
+ void start_op(int op_type, socket_type descriptor,
+ per_descriptor_data& descriptor_data, reactor_op* op,
+ bool is_continuation, bool allow_speculative)
+ {
+ start_op(op_type, descriptor, descriptor_data,
+ op, is_continuation, allow_speculative,
+ &select_reactor::call_post_immediate_completion, this);
+ }
+
+ // 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 all operations associated with the given descriptor and key. The
+ // handlers associated with the descriptor will be invoked with the
+ // operation_aborted error.
+ ASIO_DECL void cancel_ops_by_key(socket_type descriptor,
+ per_descriptor_data& descriptor_data,
+ int op_type, void* cancellation_key);
+
+ // 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 <typename Time_Traits>
+ void add_timer_queue(timer_queue<Time_Traits>& queue);
+
+ // Remove a timer queue from the reactor.
+ template <typename Time_Traits>
+ void remove_timer_queue(timer_queue<Time_Traits>& queue);
+
+ // Schedule a new operation in the given timer queue to expire at the
+ // specified absolute time.
+ template <typename Time_Traits>
+ void schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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 <typename Time_Traits>
+ std::size_t cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled = (std::numeric_limits<std::size_t>::max)());
+
+ // Cancel the timer operations associated with the given key.
+ template <typename Time_Traits>
+ void cancel_timer_by_key(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data* timer,
+ void* cancellation_key);
+
+ // Move the timer operations associated with the given timer.
+ template <typename Time_Traits>
+ void move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& target,
+ typename timer_queue<Time_Traits>::per_timer_data& source);
+
+ // Run select once until interrupted or events are ready to be dispatched.
+ ASIO_DECL void run(long usec, op_queue<operation>& 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<socket_type> 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_;
+
+ // Helper class to join and restart the reactor thread.
+ class restart_reactor : public operation
+ {
+ public:
+ restart_reactor(select_reactor* r)
+ : operation(&restart_reactor::do_complete),
+ reactor_(r)
+ {
+ }
+
+ ASIO_DECL static void do_complete(void* owner, operation* base,
+ const asio::error_code& ec, std::size_t bytes_transferred);
+
+ private:
+ select_reactor* reactor_;
+ };
+
+ friend class restart_reactor;
+
+ // Operation used to join and restart the reactor thread.
+ restart_reactor restart_reactor_;
+#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/3rdparty/asio/include/asio/detail/service_registry.hpp b/3rdparty/asio/include/asio/detail/service_registry.hpp
new file mode 100644
index 00000000000..991b32a4980
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/service_registry.hpp
@@ -0,0 +1,163 @@
+//
+// detail/service_registry.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typeinfo>
+#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 <typename T>
+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 <typename Service>
+ 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 <typename Service>
+ 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 <typename Service>
+ void add_service(Service* new_service);
+
+ // Check whether a service object of the specified type already exists.
+ template <typename Service>
+ bool has_service() const;
+
+private:
+ // Initalise a service's key when the key_type typedef is not available.
+ template <typename Service>
+ 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 <typename Service>
+ static void init_key(execution_context::service::key& key,
+ enable_if_t<is_base_of<typename Service::key_type, Service>::value>*);
+#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 <typename Service>
+ static void init_key_from_id(execution_context::service::key& key,
+ const service_id<Service>& /*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 <typename Service, typename Owner>
+ 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/3rdparty/asio/include/asio/detail/signal_blocker.hpp b/3rdparty/asio/include/asio/detail/signal_blocker.hpp
new file mode 100644
index 00000000000..11d0b0e9633
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/signal_blocker.hpp
@@ -0,0 +1,44 @@
+//
+// detail/signal_blocker.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/signal_handler.hpp b/3rdparty/asio/include/asio/detail/signal_handler.hpp
new file mode 100644
index 00000000000..6d43f578cb9
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/signal_handler.hpp
@@ -0,0 +1,90 @@
+//
+// detail/signal_handler.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_work.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/signal_op.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Handler, typename IoExecutor>
+class signal_handler : public signal_op
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(signal_handler);
+
+ signal_handler(Handler& h, const IoExecutor& io_ex)
+ : signal_op(&signal_handler::do_complete),
+ handler_(static_cast<Handler&&>(h)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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<signal_handler*>(base));
+ ptr p = { asio::detail::addressof(h->handler_), h, h };
+
+ ASIO_HANDLER_COMPLETION((*h));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ h->work_));
+
+ // 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, asio::error_code, int>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_SIGNAL_HANDLER_HPP
diff --git a/3rdparty/asio/include/asio/detail/signal_init.hpp b/3rdparty/asio/include/asio/detail/signal_init.hpp
new file mode 100644
index 00000000000..6f2c7c867e2
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/signal_init.hpp
@@ -0,0 +1,47 @@
+//
+// detail/signal_init.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <csignal>
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <int Signal = SIGPIPE>
+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/3rdparty/asio/include/asio/detail/signal_op.hpp b/3rdparty/asio/include/asio/detail/signal_op.hpp
new file mode 100644
index 00000000000..5e0071a5d62
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/signal_op.hpp
@@ -0,0 +1,53 @@
+//
+// detail/signal_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 operation key used for targeted cancellation.
+ void* cancellation_key_;
+
+ // The signal number to be passed to the completion handler.
+ int signal_number_;
+
+protected:
+ signal_op(func_type func)
+ : operation(func),
+ cancellation_key_(0),
+ signal_number_(0)
+ {
+ }
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_SIGNAL_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/signal_set_service.hpp b/3rdparty/asio/include/asio/detail/signal_set_service.hpp
new file mode 100644
index 00000000000..142ff43851a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/signal_set_service.hpp
@@ -0,0 +1,292 @@
+//
+// detail/signal_set_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <signal.h>
+#include "asio/associated_cancellation_slot.hpp"
+#include "asio/cancellation_type.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/signal_set_base.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_HAS_IOCP)
+# include "asio/detail/win_iocp_io_context.hpp"
+#else // defined(ASIO_HAS_IOCP)
+# include "asio/detail/scheduler.hpp"
+#endif // defined(ASIO_HAS_IOCP)
+
+#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__)
+# if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/io_uring_service.hpp"
+# else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/reactor.hpp"
+# endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+#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 execution_context_service_base<signal_set_service>
+{
+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<signal_op>* 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<signal_op> queue_;
+
+ // Linked list of registered signals.
+ registration* signals_;
+ };
+
+ // Constructor.
+ ASIO_DECL signal_set_service(execution_context& 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::execution_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::error_code add(implementation_type& impl,
+ int signal_number, asio::error_code& ec)
+ {
+ return add(impl, signal_number, signal_set_base::flags::dont_care, ec);
+ }
+
+ // Add a signal to a signal_set with the specified flags.
+ ASIO_DECL asio::error_code add(implementation_type& impl,
+ int signal_number, signal_set_base::flags_t f,
+ 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);
+
+ // Cancel a specific operation associated with the signal set.
+ ASIO_DECL void cancel_ops_by_key(implementation_type& impl,
+ void* cancellation_key);
+
+ // Start an asynchronous operation to wait for a signal to be delivered.
+ template <typename Handler, typename IoExecutor>
+ void async_wait(implementation_type& impl,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef signal_handler<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<signal_op_cancellation>(this, &impl);
+ }
+
+ ASIO_HANDLER_CREATION((scheduler_.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);
+
+ // Helper class used to implement per-operation cancellation
+ class signal_op_cancellation
+ {
+ public:
+ signal_op_cancellation(signal_set_service* s, implementation_type* i)
+ : service_(s),
+ implementation_(i)
+ {
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ if (!!(type &
+ (cancellation_type::terminal
+ | cancellation_type::partial
+ | cancellation_type::total)))
+ {
+ service_->cancel_ops_by_key(*implementation_, this);
+ }
+ }
+
+ private:
+ signal_set_service* service_;
+ implementation_type* implementation_;
+ };
+
+ // The scheduler used for dispatching handlers.
+#if defined(ASIO_HAS_IOCP)
+ typedef class win_iocp_io_context scheduler_impl;
+#else
+ typedef class scheduler scheduler_impl;
+#endif
+ scheduler_impl& scheduler_;
+
+#if !defined(ASIO_WINDOWS) \
+ && !defined(ASIO_WINDOWS_RUNTIME) \
+ && !defined(__CYGWIN__)
+ // The type used for processing pipe readiness notifications.
+ class pipe_read_op;
+
+# if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ // The io_uring service used for waiting for pipe readiness.
+ io_uring_service& io_uring_service_;
+
+ // The per I/O object data used for the pipe.
+ io_uring_service::per_io_object_data io_object_data_;
+# else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ // 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_HAS_IO_URING_AS_DEFAULT)
+#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/3rdparty/asio/include/asio/detail/socket_holder.hpp b/3rdparty/asio/include/asio/detail/socket_holder.hpp
new file mode 100644
index 00000000000..300e3736636
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/socket_holder.hpp
@@ -0,0 +1,98 @@
+//
+// detail/socket_holder.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/socket_ops.hpp b/3rdparty/asio/include/asio/detail/socket_ops.hpp
new file mode 100644
index 00000000000..fd2dc09c094
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/socket_ops.hpp
@@ -0,0 +1,375 @@
+//
+// detail/socket_ops.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<void> shared_cancel_token_type;
+typedef weak_ptr<void> weak_cancel_token_type;
+
+#if !defined(ASIO_WINDOWS_RUNTIME)
+
+ASIO_DECL socket_type accept(socket_type s, void* addr,
+ std::size_t* addrlen, asio::error_code& ec);
+
+ASIO_DECL socket_type sync_accept(socket_type s, state_type state,
+ void* 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, void* 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, void* 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 void* 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 void* addr,
+ std::size_t addrlen, asio::error_code& ec);
+
+ASIO_DECL void sync_connect(socket_type s, const void* 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 signed_size_type recv1(socket_type s,
+ void* data, size_t size, 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);
+
+ASIO_DECL size_t sync_recv1(socket_type s, state_type state,
+ void* data, size_t size, int flags, 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);
+
+ASIO_DECL bool non_blocking_recv1(socket_type s,
+ void* data, size_t size, 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, void* addr,
+ std::size_t* addrlen, asio::error_code& ec);
+
+ASIO_DECL signed_size_type recvfrom1(socket_type s,
+ void* data, size_t size, int flags, void* 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, void* addr,
+ std::size_t* addrlen, asio::error_code& ec);
+
+ASIO_DECL size_t sync_recvfrom1(socket_type s, state_type state,
+ void* data, size_t size, int flags, void* 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, void* addr, std::size_t* addrlen,
+ asio::error_code& ec, size_t& bytes_transferred);
+
+ASIO_DECL bool non_blocking_recvfrom1(socket_type s, void* data,
+ size_t size, int flags, void* 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 signed_size_type send1(socket_type s,
+ const void* data, size_t size, 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);
+
+ASIO_DECL size_t sync_send1(socket_type s, state_type state,
+ const void* data, size_t size, int flags, 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);
+
+ASIO_DECL bool non_blocking_send1(socket_type s,
+ const void* data, size_t size, 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 void* addr,
+ std::size_t addrlen, asio::error_code& ec);
+
+ASIO_DECL signed_size_type sendto1(socket_type s,
+ const void* data, size_t size, int flags, const void* 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 void* addr,
+ std::size_t addrlen, asio::error_code& ec);
+
+ASIO_DECL size_t sync_sendto1(socket_type s, state_type state,
+ const void* data, size_t size, int flags, const void* 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 void* addr, std::size_t addrlen,
+ asio::error_code& ec, size_t& bytes_transferred);
+
+ASIO_DECL bool non_blocking_sendto1(socket_type s, const void* data,
+ size_t size, int flags, const void* 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, void* addr,
+ std::size_t* addrlen, bool cached, asio::error_code& ec);
+
+ASIO_DECL int getsockname(socket_type s, void* 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 void* 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 void* 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 void* 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/3rdparty/asio/include/asio/detail/socket_option.hpp b/3rdparty/asio/include/asio/detail/socket_option.hpp
new file mode 100644
index 00000000000..760713daad8
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/socket_option.hpp
@@ -0,0 +1,316 @@
+//
+// detail/socket_option.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <stdexcept>
+#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 <int Level, int Name>
+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 <typename Protocol>
+ int level(const Protocol&) const
+ {
+ return Level;
+ }
+
+ // Get the name of the socket option.
+ template <typename Protocol>
+ int name(const Protocol&) const
+ {
+ return Name;
+ }
+
+ // Get the address of the boolean data.
+ template <typename Protocol>
+ int* data(const Protocol&)
+ {
+ return &value_;
+ }
+
+ // Get the address of the boolean data.
+ template <typename Protocol>
+ const int* data(const Protocol&) const
+ {
+ return &value_;
+ }
+
+ // Get the size of the boolean data.
+ template <typename Protocol>
+ std::size_t size(const Protocol&) const
+ {
+ return sizeof(value_);
+ }
+
+ // Set the size of the boolean data.
+ template <typename Protocol>
+ 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<char*>(&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 <int Level, int Name>
+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 <typename Protocol>
+ int level(const Protocol&) const
+ {
+ return Level;
+ }
+
+ // Get the name of the socket option.
+ template <typename Protocol>
+ int name(const Protocol&) const
+ {
+ return Name;
+ }
+
+ // Get the address of the int data.
+ template <typename Protocol>
+ int* data(const Protocol&)
+ {
+ return &value_;
+ }
+
+ // Get the address of the int data.
+ template <typename Protocol>
+ const int* data(const Protocol&) const
+ {
+ return &value_;
+ }
+
+ // Get the size of the int data.
+ template <typename Protocol>
+ std::size_t size(const Protocol&) const
+ {
+ return sizeof(value_);
+ }
+
+ // Set the size of the int data.
+ template <typename Protocol>
+ 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 <int Level, int Name>
+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<u_short>(value);
+#else
+ value_.l_linger = value;
+#endif
+ }
+
+ // Get the value for the linger timeout.
+ int timeout ASIO_PREVENT_MACRO_SUBSTITUTION() const
+ {
+ return static_cast<int>(value_.l_linger);
+ }
+
+ // Get the level of the socket option.
+ template <typename Protocol>
+ int level(const Protocol&) const
+ {
+ return Level;
+ }
+
+ // Get the name of the socket option.
+ template <typename Protocol>
+ int name(const Protocol&) const
+ {
+ return Name;
+ }
+
+ // Get the address of the linger data.
+ template <typename Protocol>
+ detail::linger_type* data(const Protocol&)
+ {
+ return &value_;
+ }
+
+ // Get the address of the linger data.
+ template <typename Protocol>
+ const detail::linger_type* data(const Protocol&) const
+ {
+ return &value_;
+ }
+
+ // Get the size of the linger data.
+ template <typename Protocol>
+ std::size_t size(const Protocol&) const
+ {
+ return sizeof(value_);
+ }
+
+ // Set the size of the int data.
+ template <typename Protocol>
+ 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/3rdparty/asio/include/asio/detail/socket_select_interrupter.hpp b/3rdparty/asio/include/asio/detail/socket_select_interrupter.hpp
new file mode 100644
index 00000000000..e2432622e47
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/socket_select_interrupter.hpp
@@ -0,0 +1,91 @@
+//
+// detail/socket_select_interrupter.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 interrupter. Returns true if the reset was successful.
+ 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/3rdparty/asio/include/asio/detail/socket_types.hpp b/3rdparty/asio/include/asio/detail/socket_types.hpp
new file mode 100644
index 00000000000..cf4f746a44b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/socket_types.hpp
@@ -0,0 +1,427 @@
+//
+// detail/socket_types.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <stdlib.h> // Needed for __errno
+# if !defined(_WSPIAPI_H_)
+# define _WSPIAPI_H_
+# define ASIO_WSPIAPI_H_DEFINED
+# endif // !defined(_WSPIAPI_H_)
+# endif // defined(__BORLANDC__)
+# include <winsock2.h>
+# include <ws2tcpip.h>
+# if defined(WINAPI_FAMILY)
+# if ((WINAPI_FAMILY & WINAPI_PARTITION_DESKTOP) != 0)
+# include <windows.h>
+# endif // ((WINAPI_FAMILY & WINAPI_PARTITION_DESKTOP) != 0)
+# endif // defined(WINAPI_FAMILY)
+# if !defined(ASIO_WINDOWS_APP)
+# include <mswsock.h>
+# 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 <sys/ioctl.h>
+# if (defined(__MACH__) && defined(__APPLE__)) \
+ || defined(__FreeBSD__) || defined(__NetBSD__) \
+ || defined(__OpenBSD__) || defined(__linux__) \
+ || defined(__EMSCRIPTEN__)
+# include <poll.h>
+# elif !defined(__SYMBIAN32__)
+# include <sys/poll.h>
+# endif
+# include <sys/types.h>
+# include <sys/stat.h>
+# include <fcntl.h>
+# if defined(__hpux)
+# include <sys/time.h>
+# endif
+# if !defined(__hpux) || defined(__SELECT)
+# include <sys/select.h>
+# endif
+# include <sys/socket.h>
+# include <sys/uio.h>
+# include <sys/un.h>
+# include <netinet/in.h>
+# if !defined(__SYMBIAN32__)
+# include <netinet/tcp.h>
+# endif
+# include <arpa/inet.h>
+# include <netdb.h>
+# include <net/if.h>
+# include <limits.h>
+# if defined(__sun)
+# include <sys/filio.h>
+# include <sys/sockio.h>
+# endif
+# include <signal.h>
+#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
+# define ASIO_OS_DEF_SA_RESTART 0x1
+# define ASIO_OS_DEF_SA_NOCLDSTOP 0x2
+# define ASIO_OS_DEF_SA_NOCLDWAIT 0x4
+#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;
+struct sockaddr_un_type { u_short sun_family; char sun_path[108]; };
+# 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
+# define ASIO_OS_DEF_SA_RESTART 0x1
+# define ASIO_OS_DEF_SA_NOCLDSTOP 0x2
+# define ASIO_OS_DEF_SA_NOCLDWAIT 0x4
+#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
+# define ASIO_OS_DEF_SA_RESTART SA_RESTART
+# define ASIO_OS_DEF_SA_NOCLDSTOP SA_NOCLDSTOP
+# define ASIO_OS_DEF_SA_NOCLDWAIT SA_NOCLDWAIT
+#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/3rdparty/asio/include/asio/detail/source_location.hpp b/3rdparty/asio/include/asio/detail/source_location.hpp
new file mode 100644
index 00000000000..14b74f91435
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/source_location.hpp
@@ -0,0 +1,45 @@
+//
+// detail/source_location.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_SOURCE_LOCATION_HPP
+#define ASIO_DETAIL_SOURCE_LOCATION_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_SOURCE_LOCATION)
+
+#if defined(ASIO_HAS_STD_SOURCE_LOCATION)
+# include <source_location>
+#elif defined(ASIO_HAS_STD_EXPERIMENTAL_SOURCE_LOCATION)
+# include <experimental/source_location>
+#else // defined(ASIO_HAS_STD_EXPERIMENTAL_SOURCE_LOCATION)
+# error ASIO_HAS_SOURCE_LOCATION is set \
+ but no source_location is available
+#endif // defined(ASIO_HAS_STD_EXPERIMENTAL_SOURCE_LOCATION)
+
+namespace asio {
+namespace detail {
+
+#if defined(ASIO_HAS_STD_SOURCE_LOCATION)
+using std::source_location;
+#elif defined(ASIO_HAS_STD_EXPERIMENTAL_SOURCE_LOCATION)
+using std::experimental::source_location;
+#endif // defined(ASIO_HAS_STD_EXPERIMENTAL_SOURCE_LOCATION)
+
+} // namespace detail
+} // namespace asio
+
+#endif // defined(ASIO_HAS_SOURCE_LOCATION)
+
+#endif // ASIO_DETAIL_SOURCE_LOCATION_HPP
diff --git a/3rdparty/asio/include/asio/detail/static_mutex.hpp b/3rdparty/asio/include/asio/detail/static_mutex.hpp
new file mode 100644
index 00000000000..b47d087bf4a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/static_mutex.hpp
@@ -0,0 +1,50 @@
+//
+// detail/static_mutex.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#else
+# include "asio/detail/std_static_mutex.hpp"
+#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
+#else
+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/3rdparty/asio/include/asio/detail/std_event.hpp b/3rdparty/asio/include/asio/detail/std_event.hpp
new file mode 100644
index 00000000000..97a347ed725
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/std_event.hpp
@@ -0,0 +1,183 @@
+//
+// detail/std_event.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include <chrono>
+#include <condition_variable>
+#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 <typename Lock>
+ void signal(Lock& lock)
+ {
+ this->signal_all(lock);
+ }
+
+ // Signal all waiters.
+ template <typename Lock>
+ void signal_all(Lock& lock)
+ {
+ ASIO_ASSERT(lock.locked());
+ (void)lock;
+ state_ |= 1;
+ cond_.notify_all();
+ }
+
+ // Unlock the mutex and signal one waiter.
+ template <typename Lock>
+ 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();
+ }
+
+ // Unlock the mutex and signal one waiter who may destroy us.
+ template <typename Lock>
+ void unlock_and_signal_one_for_destruction(Lock& lock)
+ {
+ ASIO_ASSERT(lock.locked());
+ state_ |= 1;
+ bool have_waiters = (state_ > 1);
+ if (have_waiters)
+ cond_.notify_one();
+ lock.unlock();
+ }
+
+ // If there's a waiter, unlock the mutex and signal it.
+ template <typename Lock>
+ 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 <typename Lock>
+ void clear(Lock& lock)
+ {
+ ASIO_ASSERT(lock.locked());
+ (void)lock;
+ state_ &= ~std::size_t(1);
+ }
+
+ // Wait for the event to become signalled.
+ template <typename Lock>
+ 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 <typename Lock>
+ 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 <typename Lock>
+ explicit unique_lock_adapter(Lock& lock)
+ : unique_lock_(lock.mutex().mutex_, std::adopt_lock)
+ {
+ }
+
+ ~unique_lock_adapter()
+ {
+ unique_lock_.release();
+ }
+
+ std::unique_lock<std::mutex> 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 // ASIO_DETAIL_STD_EVENT_HPP
diff --git a/3rdparty/asio/include/asio/detail/std_fenced_block.hpp b/3rdparty/asio/include/asio/detail/std_fenced_block.hpp
new file mode 100644
index 00000000000..d1e0c603cbc
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/std_fenced_block.hpp
@@ -0,0 +1,57 @@
+//
+// detail/std_fenced_block.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include <atomic>
+#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 // ASIO_DETAIL_STD_FENCED_BLOCK_HPP
diff --git a/3rdparty/asio/include/asio/detail/std_global.hpp b/3rdparty/asio/include/asio/detail/std_global.hpp
new file mode 100644
index 00000000000..49ae055ea7d
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/std_global.hpp
@@ -0,0 +1,65 @@
+//
+// detail/std_global.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include <exception>
+#include <mutex>
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename T>
+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 <typename T>
+std::once_flag std_global_impl<T>::init_once_;
+
+template <typename T>
+std_global_impl<T> std_global_impl<T>::instance_;
+
+template <typename T>
+T& std_global()
+{
+ std::call_once(std_global_impl<T>::init_once_, &std_global_impl<T>::do_init);
+ return *std_global_impl<T>::instance_.ptr_;
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_STD_GLOBAL_HPP
diff --git a/3rdparty/asio/include/asio/detail/std_mutex.hpp b/3rdparty/asio/include/asio/detail/std_mutex.hpp
new file mode 100644
index 00000000000..06839d69ca3
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/std_mutex.hpp
@@ -0,0 +1,68 @@
+//
+// detail/std_mutex.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include <mutex>
+#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<std_mutex> 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 // ASIO_DETAIL_STD_MUTEX_HPP
diff --git a/3rdparty/asio/include/asio/detail/std_static_mutex.hpp b/3rdparty/asio/include/asio/detail/std_static_mutex.hpp
new file mode 100644
index 00000000000..302b729037d
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/std_static_mutex.hpp
@@ -0,0 +1,76 @@
+//
+// detail/std_static_mutex.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include <mutex>
+#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<std_static_mutex> 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 // ASIO_DETAIL_STD_STATIC_MUTEX_HPP
diff --git a/3rdparty/asio/include/asio/detail/std_thread.hpp b/3rdparty/asio/include/asio/detail/std_thread.hpp
new file mode 100644
index 00000000000..78bbab9ea10
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/std_thread.hpp
@@ -0,0 +1,66 @@
+//
+// detail/std_thread.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include <thread>
+#include "asio/detail/noncopyable.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class std_thread
+ : private noncopyable
+{
+public:
+ // Constructor.
+ template <typename Function>
+ 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 // ASIO_DETAIL_STD_THREAD_HPP
diff --git a/3rdparty/asio/include/asio/detail/strand_executor_service.hpp b/3rdparty/asio/include/asio/detail/strand_executor_service.hpp
new file mode 100644
index 00000000000..45536ed5368
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/strand_executor_service.hpp
@@ -0,0 +1,173 @@
+//
+// detail/strand_executor_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/detail/type_traits.hpp"
+#include "asio/execution.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<strand_executor_service>
+{
+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<scheduler_operation> 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<scheduler_operation> 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<strand_impl> 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 <typename Executor, typename Function>
+ static void execute(const implementation_type& impl, Executor& ex,
+ Function&& function,
+ enable_if_t<
+ can_query<Executor, execution::allocator_t<void>>::value
+ >* = 0);
+
+ // Request invocation of the given function.
+ template <typename Executor, typename Function>
+ static void execute(const implementation_type& impl, Executor& ex,
+ Function&& function,
+ enable_if_t<
+ !can_query<Executor, execution::allocator_t<void>>::value
+ >* = 0);
+
+ // Request invocation of the given function.
+ template <typename Executor, typename Function, typename Allocator>
+ static void dispatch(const implementation_type& impl, Executor& ex,
+ Function&& function, const Allocator& a);
+
+ // Request invocation of the given function and return immediately.
+ template <typename Executor, typename Function, typename Allocator>
+ static void post(const implementation_type& impl, Executor& ex,
+ Function&& function, const Allocator& a);
+
+ // Request invocation of the given function and return immediately.
+ template <typename Executor, typename Function, typename Allocator>
+ static void defer(const implementation_type& impl, Executor& ex,
+ 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 <typename F, typename Allocator> class allocator_binder;
+ template <typename Executor, typename = void> 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);
+
+ // Transfers waiting handlers to the ready queue. Returns true if one or more
+ // handlers were transferred.
+ ASIO_DECL static bool push_waiting_to_ready(implementation_type& impl);
+
+ // Invokes all ready-to-run handlers.
+ ASIO_DECL static void run_ready_handlers(implementation_type& impl);
+
+ // Helper function to request invocation of the given function.
+ template <typename Executor, typename Function, typename Allocator>
+ static void do_execute(const implementation_type& impl, Executor& ex,
+ Function&& function, const Allocator& a);
+
+ // 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<mutex> 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/3rdparty/asio/include/asio/detail/strand_service.hpp b/3rdparty/asio/include/asio/detail/strand_service.hpp
new file mode 100644
index 00000000000..084eb0b3066
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/strand_service.hpp
@@ -0,0 +1,144 @@
+//
+// detail/strand_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<strand_service>
+{
+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<operation> 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<operation> 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 <typename Handler>
+ void dispatch(implementation_type& impl, Handler& handler);
+
+ // Request the io_context to invoke the given handler and return immediately.
+ template <typename Handler>
+ 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.
+ ASIO_DECL void do_dispatch(implementation_type& impl, operation* op);
+
+ // Helper function 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 used to obtain an I/O executor.
+ io_context& io_context_;
+
+ // The io_context implementation used to post completions.
+ io_context_impl& io_context_impl_;
+
+ // 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<strand_impl> 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/3rdparty/asio/include/asio/detail/string_view.hpp b/3rdparty/asio/include/asio/detail/string_view.hpp
new file mode 100644
index 00000000000..a4470f1e580
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/string_view.hpp
@@ -0,0 +1,47 @@
+//
+// detail/string_view.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <string_view>
+#elif defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+# include <experimental/string_view>
+#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/3rdparty/asio/include/asio/detail/thread.hpp b/3rdparty/asio/include/asio/detail/thread.hpp
new file mode 100644
index 00000000000..faa7fad2438
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/thread.hpp
@@ -0,0 +1,58 @@
+//
+// detail/thread.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_HAS_PTHREADS)
+# include "asio/detail/posix_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
+#else
+# include "asio/detail/std_thread.hpp"
+#endif
+
+namespace asio {
+namespace detail {
+
+#if !defined(ASIO_HAS_THREADS)
+typedef null_thread thread;
+#elif defined(ASIO_HAS_PTHREADS)
+typedef posix_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
+#else
+typedef std_thread thread;
+#endif
+
+} // namespace detail
+} // namespace asio
+
+#endif // ASIO_DETAIL_THREAD_HPP
diff --git a/3rdparty/asio/include/asio/detail/thread_context.hpp b/3rdparty/asio/include/asio/detail/thread_context.hpp
new file mode 100644
index 00000000000..bebfc4a43a2
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/thread_context.hpp
@@ -0,0 +1,51 @@
+//
+// detail/thread_context.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <climits>
+#include <cstddef>
+#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:
+ // Obtain a pointer to the top of the thread call stack. Returns null when
+ // not running inside a thread context.
+ ASIO_DECL static thread_info_base* top_of_thread_call_stack();
+
+protected:
+ // Per-thread call stack to track the state of each thread in the context.
+ typedef call_stack<thread_context, thread_info_base> thread_call_stack;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#if defined(ASIO_HEADER_ONLY)
+# include "asio/detail/impl/thread_context.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // ASIO_DETAIL_THREAD_CONTEXT_HPP
diff --git a/3rdparty/asio/include/asio/detail/thread_group.hpp b/3rdparty/asio/include/asio/detail/thread_group.hpp
new file mode 100644
index 00000000000..5ebff5e185f
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/thread_group.hpp
@@ -0,0 +1,99 @@
+//
+// detail/thread_group.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#include "asio/detail/push_options.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 <typename Function>
+ void create_thread(Function f)
+ {
+ first_ = new item(f, first_);
+ }
+
+ // Create new threads in the group.
+ template <typename Function>
+ 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;
+ }
+ }
+
+ // Test whether the group is empty.
+ bool empty() const
+ {
+ return first_ == 0;
+ }
+
+private:
+ // Structure used to track a single thread in the group.
+ struct item
+ {
+ template <typename Function>
+ 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
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_THREAD_GROUP_HPP
diff --git a/3rdparty/asio/include/asio/detail/thread_info_base.hpp b/3rdparty/asio/include/asio/detail/thread_info_base.hpp
new file mode 100644
index 00000000000..5a74cef776a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/thread_info_base.hpp
@@ -0,0 +1,250 @@
+//
+// detail/thread_info_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 "asio/detail/config.hpp"
+#include <climits>
+#include <cstddef>
+#include "asio/detail/memory.hpp"
+#include "asio/detail/noncopyable.hpp"
+
+#if !defined(ASIO_NO_EXCEPTIONS)
+# include <exception>
+# include "asio/multiple_exceptions.hpp"
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+#ifndef ASIO_RECYCLING_ALLOCATOR_CACHE_SIZE
+# define ASIO_RECYCLING_ALLOCATOR_CACHE_SIZE 2
+#endif // ASIO_RECYCLING_ALLOCATOR_CACHE_SIZE
+
+class thread_info_base
+ : private noncopyable
+{
+public:
+ struct default_tag
+ {
+ enum
+ {
+ cache_size = ASIO_RECYCLING_ALLOCATOR_CACHE_SIZE,
+ begin_mem_index = 0,
+ end_mem_index = cache_size
+ };
+ };
+
+ struct awaitable_frame_tag
+ {
+ enum
+ {
+ cache_size = ASIO_RECYCLING_ALLOCATOR_CACHE_SIZE,
+ begin_mem_index = default_tag::end_mem_index,
+ end_mem_index = begin_mem_index + cache_size
+ };
+ };
+
+ struct executor_function_tag
+ {
+ enum
+ {
+ cache_size = ASIO_RECYCLING_ALLOCATOR_CACHE_SIZE,
+ begin_mem_index = awaitable_frame_tag::end_mem_index,
+ end_mem_index = begin_mem_index + cache_size
+ };
+ };
+
+ struct cancellation_signal_tag
+ {
+ enum
+ {
+ cache_size = ASIO_RECYCLING_ALLOCATOR_CACHE_SIZE,
+ begin_mem_index = executor_function_tag::end_mem_index,
+ end_mem_index = begin_mem_index + cache_size
+ };
+ };
+
+ struct parallel_group_tag
+ {
+ enum
+ {
+ cache_size = ASIO_RECYCLING_ALLOCATOR_CACHE_SIZE,
+ begin_mem_index = cancellation_signal_tag::end_mem_index,
+ end_mem_index = begin_mem_index + cache_size
+ };
+ };
+
+ enum { max_mem_index = parallel_group_tag::end_mem_index };
+
+ thread_info_base()
+#if !defined(ASIO_NO_EXCEPTIONS)
+ : has_pending_exception_(0)
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ {
+ 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)
+ {
+ // The following test for non-null pointers is technically redundant, but
+ // it is significantly faster when using a tight io_context::poll() loop
+ // in latency sensitive applications.
+ if (reusable_memory_[i])
+ aligned_delete(reusable_memory_[i]);
+ }
+ }
+
+ static void* allocate(thread_info_base* this_thread,
+ std::size_t size, std::size_t align = ASIO_DEFAULT_ALIGN)
+ {
+ return allocate(default_tag(), this_thread, size, align);
+ }
+
+ static void deallocate(thread_info_base* this_thread,
+ void* pointer, std::size_t size)
+ {
+ deallocate(default_tag(), this_thread, pointer, size);
+ }
+
+ template <typename Purpose>
+ static void* allocate(Purpose, thread_info_base* this_thread,
+ std::size_t size, std::size_t align = ASIO_DEFAULT_ALIGN)
+ {
+ std::size_t chunks = (size + chunk_size - 1) / chunk_size;
+
+ if (this_thread)
+ {
+ for (int mem_index = Purpose::begin_mem_index;
+ mem_index < Purpose::end_mem_index; ++mem_index)
+ {
+ if (this_thread->reusable_memory_[mem_index])
+ {
+ void* const pointer = this_thread->reusable_memory_[mem_index];
+ unsigned char* const mem = static_cast<unsigned char*>(pointer);
+ if (static_cast<std::size_t>(mem[0]) >= chunks
+ && reinterpret_cast<std::size_t>(pointer) % align == 0)
+ {
+ this_thread->reusable_memory_[mem_index] = 0;
+ mem[size] = mem[0];
+ return pointer;
+ }
+ }
+ }
+
+ for (int mem_index = Purpose::begin_mem_index;
+ mem_index < Purpose::end_mem_index; ++mem_index)
+ {
+ if (this_thread->reusable_memory_[mem_index])
+ {
+ void* const pointer = this_thread->reusable_memory_[mem_index];
+ this_thread->reusable_memory_[mem_index] = 0;
+ aligned_delete(pointer);
+ break;
+ }
+ }
+ }
+
+ void* const pointer = aligned_new(align, chunks * chunk_size + 1);
+ unsigned char* const mem = static_cast<unsigned char*>(pointer);
+ mem[size] = (chunks <= UCHAR_MAX) ? static_cast<unsigned char>(chunks) : 0;
+ return pointer;
+ }
+
+ template <typename Purpose>
+ static void deallocate(Purpose, thread_info_base* this_thread,
+ void* pointer, std::size_t size)
+ {
+ if (size <= chunk_size * UCHAR_MAX)
+ {
+ if (this_thread)
+ {
+ for (int mem_index = Purpose::begin_mem_index;
+ mem_index < Purpose::end_mem_index; ++mem_index)
+ {
+ if (this_thread->reusable_memory_[mem_index] == 0)
+ {
+ unsigned char* const mem = static_cast<unsigned char*>(pointer);
+ mem[0] = mem[size];
+ this_thread->reusable_memory_[mem_index] = pointer;
+ return;
+ }
+ }
+ }
+ }
+
+ aligned_delete(pointer);
+ }
+
+ void capture_current_exception()
+ {
+#if !defined(ASIO_NO_EXCEPTIONS)
+ switch (has_pending_exception_)
+ {
+ case 0:
+ has_pending_exception_ = 1;
+ pending_exception_ = std::current_exception();
+ break;
+ case 1:
+ has_pending_exception_ = 2;
+ pending_exception_ =
+ std::make_exception_ptr<multiple_exceptions>(
+ multiple_exceptions(pending_exception_));
+ break;
+ default:
+ break;
+ }
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ }
+
+ void rethrow_pending_exception()
+ {
+#if !defined(ASIO_NO_EXCEPTIONS)
+ if (has_pending_exception_ > 0)
+ {
+ has_pending_exception_ = 0;
+ std::exception_ptr ex(
+ static_cast<std::exception_ptr&&>(
+ pending_exception_));
+ std::rethrow_exception(ex);
+ }
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ }
+
+private:
+#if defined(ASIO_HAS_IO_URING)
+ enum { chunk_size = 8 };
+#else // defined(ASIO_HAS_IO_URING)
+ enum { chunk_size = 4 };
+#endif // defined(ASIO_HAS_IO_URING)
+ void* reusable_memory_[max_mem_index];
+
+#if !defined(ASIO_NO_EXCEPTIONS)
+ int has_pending_exception_;
+ std::exception_ptr pending_exception_;
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_THREAD_INFO_BASE_HPP
diff --git a/3rdparty/asio/include/asio/detail/throw_error.hpp b/3rdparty/asio/include/asio/detail/throw_error.hpp
new file mode 100644
index 00000000000..881c3128576
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/throw_error.hpp
@@ -0,0 +1,62 @@
+//
+// detail/throw_error.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/detail/throw_exception.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_SOURCE_LOCATION_PARAM);
+
+ASIO_DECL void do_throw_error(
+ const asio::error_code& err,
+ const char* location
+ ASIO_SOURCE_LOCATION_PARAM);
+
+inline void throw_error(
+ const asio::error_code& err
+ ASIO_SOURCE_LOCATION_DEFAULTED_PARAM)
+{
+ if (err)
+ do_throw_error(err ASIO_SOURCE_LOCATION_ARG);
+}
+
+inline void throw_error(
+ const asio::error_code& err,
+ const char* location
+ ASIO_SOURCE_LOCATION_DEFAULTED_PARAM)
+{
+ if (err)
+ do_throw_error(err, location ASIO_SOURCE_LOCATION_ARG);
+}
+
+} // 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/3rdparty/asio/include/asio/detail/throw_exception.hpp b/3rdparty/asio/include/asio/detail/throw_exception.hpp
new file mode 100644
index 00000000000..e939c1093f6
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/throw_exception.hpp
@@ -0,0 +1,55 @@
+//
+// detail/throw_exception.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <boost/throw_exception.hpp>
+#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 <typename Exception>
+void throw_exception(
+ const Exception& e
+ ASIO_SOURCE_LOCATION_DEFAULTED_PARAM);
+
+// 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 <typename Exception>
+void throw_exception(
+ const Exception& e
+ ASIO_SOURCE_LOCATION_PARAM)
+{
+ 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/3rdparty/asio/include/asio/detail/timer_queue.hpp b/3rdparty/asio/include/asio/detail/timer_queue.hpp
new file mode 100644
index 00000000000..843f3614da0
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/timer_queue.hpp
@@ -0,0 +1,389 @@
+//
+// detail/timer_queue.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <vector>
+#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 <typename Time_Traits>
+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<std::size_t>::max)()),
+ next_(0), prev_(0)
+ {
+ }
+
+ private:
+ friend class timer_queue;
+
+ // The operations waiting on the timer.
+ op_queue<wait_op> 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<std::size_t>::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<operation>& 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_;
+ while (wait_op* op = timer->op_queue_.front())
+ {
+ timer->op_queue_.pop();
+ op->ec_ = asio::error_code();
+ ops.push(op);
+ }
+ remove_timer(*timer);
+ }
+ }
+ }
+
+ // Dequeue all timers.
+ virtual void get_all_timers(op_queue<operation>& 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<operation>& ops,
+ std::size_t max_cancelled = (std::numeric_limits<std::size_t>::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;
+ }
+
+ // Cancel and dequeue a specific operation for the given timer.
+ void cancel_timer_by_key(per_timer_data* timer,
+ op_queue<operation>& ops, void* cancellation_key)
+ {
+ if (timer->prev_ != 0 || timer == timers_)
+ {
+ op_queue<wait_op> other_ops;
+ while (wait_op* op = timer->op_queue_.front())
+ {
+ timer->op_queue_.pop();
+ if (op->cancellation_key_ == cancellation_key)
+ {
+ op->ec_ = asio::error::operation_aborted;
+ ops.push(op);
+ }
+ else
+ other_ops.push(op);
+ }
+ timer->op_queue_.push(other_ops);
+ if (timer->op_queue_.empty())
+ remove_timer(*timer);
+ }
+ }
+
+ // 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<std::size_t>::max)();
+
+ if (target.heap_index_ < heap_.size())
+ heap_[target.heap_index_].timer_ = &target;
+
+ if (timers_ == &source)
+ timers_ = &target;
+ if (source.prev_)
+ source.prev_->next_ = &target;
+ if (source.next_)
+ source.next_->prev_= &target;
+ 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)
+ {
+ timer.heap_index_ = (std::numeric_limits<std::size_t>::max)();
+ heap_.pop_back();
+ }
+ else
+ {
+ swap_heap(index, heap_.size() - 1);
+ timer.heap_index_ = (std::numeric_limits<std::size_t>::max)();
+ 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 <typename Time_Type>
+ static bool is_positive_infinity(const Time_Type&)
+ {
+ return false;
+ }
+
+ // Determine if the specified absolute time is positive infinity.
+ template <typename T, typename TimeSystem>
+ static bool is_positive_infinity(
+ const boost::date_time::base_time<T, TimeSystem>& time)
+ {
+ return time.is_pos_infinity();
+ }
+
+ // Helper function to convert a duration into milliseconds.
+ template <typename Duration>
+ 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<long>(msec);
+ }
+
+ // Helper function to convert a duration into microseconds.
+ template <typename Duration>
+ 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<long>(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_entry> heap_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_TIMER_QUEUE_HPP
diff --git a/3rdparty/asio/include/asio/detail/timer_queue_base.hpp b/3rdparty/asio/include/asio/detail/timer_queue_base.hpp
new file mode 100644
index 00000000000..ddcf41c1371
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/timer_queue_base.hpp
@@ -0,0 +1,68 @@
+//
+// detail/timer_queue_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<operation>& ops) = 0;
+
+ // Dequeue all timers.
+ virtual void get_all_timers(op_queue<operation>& ops) = 0;
+
+private:
+ friend class timer_queue_set;
+
+ // Next timer queue in the set.
+ timer_queue_base* next_;
+};
+
+template <typename Time_Traits>
+class timer_queue;
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_TIMER_QUEUE_BASE_HPP
diff --git a/3rdparty/asio/include/asio/detail/timer_queue_ptime.hpp b/3rdparty/asio/include/asio/detail/timer_queue_ptime.hpp
new file mode 100644
index 00000000000..937a4ad85fa
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/timer_queue_ptime.hpp
@@ -0,0 +1,103 @@
+//
+// detail/timer_queue_ptime.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<boost::posix_time::ptime> {};
+
+// Template specialisation for the commonly used instantation.
+template <>
+class timer_queue<time_traits<boost::posix_time::ptime>>
+ : 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<forwarding_posix_time_traits>::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<operation>& ops);
+
+ // Dequeue all timers.
+ ASIO_DECL virtual void get_all_timers(op_queue<operation>& ops);
+
+ // Cancel and dequeue operations for the given timer.
+ ASIO_DECL std::size_t cancel_timer(
+ per_timer_data& timer, op_queue<operation>& ops,
+ std::size_t max_cancelled = (std::numeric_limits<std::size_t>::max)());
+
+ // Cancel and dequeue operations for the given timer and key.
+ ASIO_DECL void cancel_timer_by_key(per_timer_data* timer,
+ op_queue<operation>& ops, void* cancellation_key);
+
+ // 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<forwarding_posix_time_traits> 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/3rdparty/asio/include/asio/detail/timer_queue_set.hpp b/3rdparty/asio/include/asio/detail/timer_queue_set.hpp
new file mode 100644
index 00000000000..7bf50747be1
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/timer_queue_set.hpp
@@ -0,0 +1,66 @@
+//
+// detail/timer_queue_set.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<operation>& ops);
+
+ // Dequeue all timers.
+ ASIO_DECL void get_all_timers(op_queue<operation>& 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/3rdparty/asio/include/asio/detail/timer_scheduler.hpp b/3rdparty/asio/include/asio/detail/timer_scheduler.hpp
new file mode 100644
index 00000000000..dd34d328c84
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/timer_scheduler.hpp
@@ -0,0 +1,37 @@
+//
+// detail/timer_scheduler.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_IO_URING_AS_DEFAULT)
+# include "asio/detail/io_uring_service.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/3rdparty/asio/include/asio/detail/timer_scheduler_fwd.hpp b/3rdparty/asio/include/asio/detail/timer_scheduler_fwd.hpp
new file mode 100644
index 00000000000..bbb8a4e8ded
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/timer_scheduler_fwd.hpp
@@ -0,0 +1,42 @@
+//
+// detail/timer_scheduler_fwd.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_IO_URING_AS_DEFAULT)
+typedef class io_uring_service 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/3rdparty/asio/include/asio/detail/tss_ptr.hpp b/3rdparty/asio/include/asio/detail/tss_ptr.hpp
new file mode 100644
index 00000000000..f7aaa2ec29c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/tss_ptr.hpp
@@ -0,0 +1,69 @@
+//
+// detail/tss_ptr.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename T>
+class tss_ptr
+#if !defined(ASIO_HAS_THREADS)
+ : public null_tss_ptr<T>
+#elif defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION)
+ : public keyword_tss_ptr<T>
+#elif defined(ASIO_WINDOWS)
+ : public win_tss_ptr<T>
+#elif defined(ASIO_HAS_PTHREADS)
+ : public posix_tss_ptr<T>
+#endif
+{
+public:
+ void operator=(T* value)
+ {
+#if !defined(ASIO_HAS_THREADS)
+ null_tss_ptr<T>::operator=(value);
+#elif defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION)
+ keyword_tss_ptr<T>::operator=(value);
+#elif defined(ASIO_WINDOWS)
+ win_tss_ptr<T>::operator=(value);
+#elif defined(ASIO_HAS_PTHREADS)
+ posix_tss_ptr<T>::operator=(value);
+#endif
+ }
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_TSS_PTR_HPP
diff --git a/3rdparty/asio/include/asio/detail/type_traits.hpp b/3rdparty/asio/include/asio/detail/type_traits.hpp
new file mode 100644
index 00000000000..a4706a5ff1c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/type_traits.hpp
@@ -0,0 +1,178 @@
+//
+// detail/type_traits.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include <type_traits>
+
+namespace asio {
+
+using std::add_const;
+
+template <typename T>
+using add_const_t = typename std::add_const<T>::type;
+
+using std::add_lvalue_reference;
+
+template <typename T>
+using add_lvalue_reference_t = typename std::add_lvalue_reference<T>::type;
+
+template <std::size_t N, std::size_t A>
+struct aligned_storage
+{
+ struct type
+ {
+ alignas(A) unsigned char data[N];
+ };
+};
+
+template <std::size_t N, std::size_t A>
+using aligned_storage_t = typename aligned_storage<N, A>::type;
+
+using std::alignment_of;
+
+using std::conditional;
+
+template <bool C, typename T, typename U>
+using conditional_t = typename std::conditional<C, T, U>::type;
+
+using std::decay;
+
+template <typename T>
+using decay_t = typename std::decay<T>::type;
+
+using std::declval;
+
+using std::enable_if;
+
+template <bool C, typename T = void>
+using enable_if_t = typename std::enable_if<C, T>::type;
+
+using std::false_type;
+
+using std::integral_constant;
+
+using std::is_base_of;
+
+using std::is_class;
+
+using std::is_const;
+
+using std::is_constructible;
+
+using std::is_convertible;
+
+using std::is_copy_constructible;
+
+using std::is_destructible;
+
+using std::is_function;
+
+using std::is_move_constructible;
+
+using std::is_nothrow_copy_constructible;
+
+using std::is_nothrow_destructible;
+
+using std::is_object;
+
+using std::is_pointer;
+
+using std::is_reference;
+
+using std::is_same;
+
+using std::is_scalar;
+
+using std::remove_cv;
+
+template <typename T>
+using remove_cv_t = typename std::remove_cv<T>::type;
+
+template <typename T>
+struct remove_cvref :
+ std::remove_cv<typename std::remove_reference<T>::type> {};
+
+template <typename T>
+using remove_cvref_t = typename remove_cvref<T>::type;
+
+using std::remove_pointer;
+
+template <typename T>
+using remove_pointer_t = typename std::remove_pointer<T>::type;
+
+using std::remove_reference;
+
+template <typename T>
+using remove_reference_t = typename std::remove_reference<T>::type;
+
+#if defined(ASIO_HAS_STD_INVOKE_RESULT)
+
+template <typename> struct result_of;
+
+template <typename F, typename... Args>
+struct result_of<F(Args...)> : std::invoke_result<F, Args...> {};
+
+template <typename T>
+using result_of_t = typename result_of<T>::type;
+
+#else // defined(ASIO_HAS_STD_INVOKE_RESULT)
+
+using std::result_of;
+
+template <typename T>
+using result_of_t = typename std::result_of<T>::type;
+
+#endif // defined(ASIO_HAS_STD_INVOKE_RESULT)
+
+using std::true_type;
+
+template <typename> struct void_type
+{
+ typedef void type;
+};
+
+template <typename T>
+using void_t = typename void_type<T>::type;
+
+template <typename...> struct conjunction : true_type {};
+
+template <typename T> struct conjunction<T> : T {};
+
+template <typename Head, typename... Tail>
+struct conjunction<Head, Tail...> :
+ conditional_t<Head::value, conjunction<Tail...>, Head> {};
+
+struct defaulted_constraint
+{
+ constexpr defaulted_constraint() {}
+};
+
+template <bool Condition, typename Type = int>
+struct constraint : std::enable_if<Condition, Type> {};
+
+template <bool Condition, typename Type = int>
+using constraint_t = typename constraint<Condition, Type>::type;
+
+template <typename T>
+struct type_identity { typedef T type; };
+
+template <typename T>
+using type_identity_t = typename type_identity<T>::type;
+
+} // namespace asio
+
+#endif // ASIO_DETAIL_TYPE_TRAITS_HPP
diff --git a/3rdparty/asio/include/asio/detail/utility.hpp b/3rdparty/asio/include/asio/detail/utility.hpp
new file mode 100644
index 00000000000..72dd4d43190
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/utility.hpp
@@ -0,0 +1,83 @@
+//
+// detail/utility.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_UTILITY_HPP
+#define ASIO_DETAIL_UTILITY_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <utility>
+
+namespace asio {
+namespace detail {
+
+#if defined(ASIO_HAS_STD_INDEX_SEQUENCE)
+
+using std::index_sequence;
+using std::index_sequence_for;
+using std::make_index_sequence;
+
+#else // defined(ASIO_HAS_STD_INDEX_SEQUENCE)
+
+template <std::size_t...>
+struct index_sequence
+{
+};
+
+template <typename T, typename U>
+struct join_index_sequences;
+
+template <std::size_t... I, std::size_t... J>
+struct join_index_sequences<index_sequence<I...>, index_sequence<J...>>
+{
+ using type = index_sequence<I..., J...>;
+};
+
+template <std::size_t First, std::size_t Last>
+struct index_pack :
+ join_index_sequences<
+ typename index_pack<First, First + (Last - First + 1) / 2 - 1>::type,
+ typename index_pack<First + (Last - First + 1) / 2, Last>::type
+ >
+{
+};
+
+template <std::size_t N>
+struct index_pack<N, N>
+{
+ using type = index_sequence<N>;
+};
+
+template <std::size_t Begin, std::size_t End>
+struct index_range : index_pack<Begin, End - 1>
+{
+};
+
+template <std::size_t N>
+struct index_range<N, N>
+{
+ using type = index_sequence<>;
+};
+
+template <typename... T>
+using index_sequence_for = typename index_range<0, sizeof...(T)>::type;
+
+template <std::size_t N>
+using make_index_sequence = typename index_range<0, N>::type;
+
+#endif // defined(ASIO_HAS_STD_INDEX_SEQUENCE)
+
+} // namespace detail
+} // namespace asio
+
+#endif // ASIO_DETAIL_UTILITY_HPP
diff --git a/3rdparty/asio/include/asio/detail/wait_handler.hpp b/3rdparty/asio/include/asio/detail/wait_handler.hpp
new file mode 100644
index 00000000000..489a968cd77
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/wait_handler.hpp
@@ -0,0 +1,90 @@
+//
+// detail/wait_handler.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/bind_handler.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/wait_op.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Handler, typename IoExecutor>
+class wait_handler : public wait_op
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(wait_handler);
+
+ wait_handler(Handler& h, const IoExecutor& io_ex)
+ : wait_op(&wait_handler::do_complete),
+ handler_(static_cast<Handler&&>(h)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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<wait_handler*>(base));
+ ptr p = { asio::detail::addressof(h->handler_), h, h };
+
+ ASIO_HANDLER_COMPLETION((*h));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ h->work_));
+
+ // 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, asio::error_code>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_WAIT_HANDLER_HPP
diff --git a/3rdparty/asio/include/asio/detail/wait_op.hpp b/3rdparty/asio/include/asio/detail/wait_op.hpp
new file mode 100644
index 00000000000..548232c1c55
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/wait_op.hpp
@@ -0,0 +1,49 @@
+//
+// detail/wait_op.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_;
+
+ // The operation key used for targeted cancellation.
+ void* cancellation_key_;
+
+protected:
+ wait_op(func_type func)
+ : operation(func),
+ cancellation_key_(0)
+ {
+ }
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_WAIT_OP_HPP
diff --git a/3rdparty/asio/include/asio/detail/win_event.hpp b/3rdparty/asio/include/asio/detail/win_event.hpp
new file mode 100644
index 00000000000..e61843e5b9d
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_event.hpp
@@ -0,0 +1,164 @@
+//
+// detail/win_event.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#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 <typename Lock>
+ void signal(Lock& lock)
+ {
+ this->signal_all(lock);
+ }
+
+ // Signal all waiters.
+ template <typename Lock>
+ void signal_all(Lock& lock)
+ {
+ ASIO_ASSERT(lock.locked());
+ (void)lock;
+ state_ |= 1;
+ ::SetEvent(events_[0]);
+ }
+
+ // Unlock the mutex and signal one waiter.
+ template <typename Lock>
+ 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]);
+ }
+
+ // Unlock the mutex and signal one waiter who may destroy us.
+ template <typename Lock>
+ void unlock_and_signal_one_for_destruction(Lock& lock)
+ {
+ ASIO_ASSERT(lock.locked());
+ state_ |= 1;
+ bool have_waiters = (state_ > 1);
+ if (have_waiters)
+ ::SetEvent(events_[1]);
+ lock.unlock();
+ }
+
+ // If there's a waiter, unlock the mutex and signal it.
+ template <typename Lock>
+ 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 <typename Lock>
+ 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 <typename Lock>
+ 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 <typename Lock>
+ 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/3rdparty/asio/include/asio/detail/win_fd_set_adapter.hpp b/3rdparty/asio/include/asio/detail/win_fd_set_adapter.hpp
new file mode 100644
index 00000000000..0e3e63f0c25
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_fd_set_adapter.hpp
@@ -0,0 +1,149 @@
+//
+// detail/win_fd_set_adapter.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<win_fd_set*>(::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<socket_type>& operations, op_queue<operation>&)
+ {
+ reactor_op_queue<socket_type>::iterator i = operations.begin();
+ while (i != operations.end())
+ {
+ reactor_op_queue<socket_type>::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<fd_set*>(reinterpret_cast<const fd_set*>(fd_set_)));
+ }
+
+ operator fd_set*()
+ {
+ return reinterpret_cast<fd_set*>(fd_set_);
+ }
+
+ socket_type max_descriptor() const
+ {
+ return max_descriptor_;
+ }
+
+ void perform(reactor_op_queue<socket_type>& operations,
+ op_queue<operation>& 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<win_fd_set*>(::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/3rdparty/asio/include/asio/detail/win_global.hpp b/3rdparty/asio/include/asio/detail/win_global.hpp
new file mode 100644
index 00000000000..771f3fcba4b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_global.hpp
@@ -0,0 +1,71 @@
+//
+// detail/win_global.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename T>
+struct win_global_impl
+{
+ // Destructor automatically cleans up the global.
+ ~win_global_impl()
+ {
+ delete ptr_;
+ }
+
+ static win_global_impl instance_;
+ static static_mutex mutex_;
+ T* ptr_;
+ static tss_ptr<T> tss_ptr_;
+};
+
+template <typename T>
+win_global_impl<T> win_global_impl<T>::instance_ = { 0 };
+
+template <typename T>
+static_mutex win_global_impl<T>::mutex_ = ASIO_STATIC_MUTEX_INIT;
+
+template <typename T>
+tss_ptr<T> win_global_impl<T>::tss_ptr_;
+
+template <typename T>
+T& win_global()
+{
+ if (static_cast<T*>(win_global_impl<T>::tss_ptr_) == 0)
+ {
+ win_global_impl<T>::mutex_.init();
+ static_mutex::scoped_lock lock(win_global_impl<T>::mutex_);
+ if (win_global_impl<T>::instance_.ptr_ == 0)
+ win_global_impl<T>::instance_.ptr_ = new T;
+ win_global_impl<T>::tss_ptr_ = win_global_impl<T>::instance_.ptr_;
+ }
+
+ return *win_global_impl<T>::tss_ptr_;
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_WIN_GLOBAL_HPP
diff --git a/3rdparty/asio/include/asio/detail/win_iocp_file_service.hpp b/3rdparty/asio/include/asio/detail/win_iocp_file_service.hpp
new file mode 100644
index 00000000000..f10a8d3cdf4
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_file_service.hpp
@@ -0,0 +1,287 @@
+//
+// detail/win_iocp_file_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_FILE_SERVICE_HPP
+#define ASIO_DETAIL_WIN_IOCP_FILE_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_FILE)
+
+#include <string>
+#include "asio/detail/cstdint.hpp"
+#include "asio/detail/win_iocp_handle_service.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/file_base.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Extend win_iocp_handle_service to provide file support.
+class win_iocp_file_service :
+ public execution_context_service_base<win_iocp_file_service>
+{
+public:
+ // The native type of a file.
+ typedef win_iocp_handle_service::native_handle_type native_handle_type;
+
+ // The implementation type of the file.
+ class implementation_type : win_iocp_handle_service::implementation_type
+ {
+ private:
+ // Only this service will have access to the internal values.
+ friend class win_iocp_file_service;
+
+ uint64_t offset_;
+ bool is_stream_;
+ };
+
+ // Constructor.
+ ASIO_DECL win_iocp_file_service(execution_context& context);
+
+ // Destroy all user-defined handler objects owned by the service.
+ ASIO_DECL void shutdown();
+
+ // Construct a new file implementation.
+ void construct(implementation_type& impl)
+ {
+ handle_service_.construct(impl);
+ impl.offset_ = 0;
+ impl.is_stream_ = false;
+ }
+
+ // Move-construct a new file implementation.
+ void move_construct(implementation_type& impl,
+ implementation_type& other_impl)
+ {
+ handle_service_.move_construct(impl, other_impl);
+ impl.offset_ = other_impl.offset_;
+ impl.is_stream_ = other_impl.is_stream_;
+ other_impl.offset_ = 0;
+ }
+
+ // Move-assign from another file implementation.
+ void move_assign(implementation_type& impl,
+ win_iocp_file_service& other_service,
+ implementation_type& other_impl)
+ {
+ handle_service_.move_assign(impl,
+ other_service.handle_service_, other_impl);
+ impl.offset_ = other_impl.offset_;
+ impl.is_stream_ = other_impl.is_stream_;
+ other_impl.offset_ = 0;
+ }
+
+ // Destroy a file implementation.
+ void destroy(implementation_type& impl)
+ {
+ handle_service_.destroy(impl);
+ }
+
+ // Set whether the implementation is stream-oriented.
+ void set_is_stream(implementation_type& impl, bool is_stream)
+ {
+ impl.is_stream_ = is_stream;
+ }
+
+ // Open the file using the specified path name.
+ ASIO_DECL asio::error_code open(implementation_type& impl,
+ const char* path, file_base::flags open_flags,
+ asio::error_code& ec);
+
+ // Assign a native handle to a file implementation.
+ asio::error_code assign(implementation_type& impl,
+ const native_handle_type& native_handle,
+ asio::error_code& ec)
+ {
+ return handle_service_.assign(impl, native_handle, ec);
+ }
+
+ // Determine whether the file is open.
+ bool is_open(const implementation_type& impl) const
+ {
+ return handle_service_.is_open(impl);
+ }
+
+ // Destroy a file implementation.
+ asio::error_code close(implementation_type& impl,
+ asio::error_code& ec)
+ {
+ return handle_service_.close(impl, ec);
+ }
+
+ // Get the native file representation.
+ native_handle_type native_handle(const implementation_type& impl) const
+ {
+ return handle_service_.native_handle(impl);
+ }
+
+ // Release ownership of a file.
+ native_handle_type release(implementation_type& impl,
+ asio::error_code& ec)
+ {
+ return handle_service_.release(impl, ec);
+ }
+
+ // Cancel all operations associated with the file.
+ asio::error_code cancel(implementation_type& impl,
+ asio::error_code& ec)
+ {
+ return handle_service_.cancel(impl, ec);
+ }
+
+ // Get the size of the file.
+ ASIO_DECL uint64_t size(const implementation_type& impl,
+ asio::error_code& ec) const;
+
+ // Alter the size of the file.
+ ASIO_DECL asio::error_code resize(implementation_type& impl,
+ uint64_t n, asio::error_code& ec);
+
+ // Synchronise the file to disk.
+ ASIO_DECL asio::error_code sync_all(implementation_type& impl,
+ asio::error_code& ec);
+
+ // Synchronise the file data to disk.
+ ASIO_DECL asio::error_code sync_data(implementation_type& impl,
+ asio::error_code& ec);
+
+ // Seek to a position in the file.
+ ASIO_DECL uint64_t seek(implementation_type& impl, int64_t offset,
+ file_base::seek_basis whence, asio::error_code& ec);
+
+ // Write the given data. Returns the number of bytes written.
+ template <typename ConstBufferSequence>
+ size_t write_some(implementation_type& impl,
+ const ConstBufferSequence& buffers, asio::error_code& ec)
+ {
+ uint64_t offset = impl.offset_;
+ impl.offset_ += asio::buffer_size(buffers);
+ return handle_service_.write_some_at(impl, offset, buffers, ec);
+ }
+
+ // Start an asynchronous write. The data being written must be valid for the
+ // lifetime of the asynchronous operation.
+ template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_write_some(implementation_type& impl,
+ const ConstBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ uint64_t offset = impl.offset_;
+ impl.offset_ += asio::buffer_size(buffers);
+ handle_service_.async_write_some_at(impl, offset, buffers, handler, io_ex);
+ }
+
+ // Write the given data at the specified location. Returns the number of
+ // bytes written.
+ template <typename ConstBufferSequence>
+ size_t write_some_at(implementation_type& impl, uint64_t offset,
+ const ConstBufferSequence& buffers, asio::error_code& ec)
+ {
+ return handle_service_.write_some_at(impl, offset, buffers, ec);
+ }
+
+ // Start an asynchronous write at the specified location. The data being
+ // written must be valid for the lifetime of the asynchronous operation.
+ template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_write_some_at(implementation_type& impl,
+ uint64_t offset, const ConstBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ handle_service_.async_write_some_at(impl, offset, buffers, handler, io_ex);
+ }
+
+ // Read some data. Returns the number of bytes read.
+ template <typename MutableBufferSequence>
+ size_t read_some(implementation_type& impl,
+ const MutableBufferSequence& buffers, asio::error_code& ec)
+ {
+ uint64_t offset = impl.offset_;
+ impl.offset_ += asio::buffer_size(buffers);
+ return handle_service_.read_some_at(impl, offset, buffers, ec);
+ }
+
+ // Start an asynchronous read. The buffer for the data being read must be
+ // valid for the lifetime of the asynchronous operation.
+ template <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_read_some(implementation_type& impl,
+ const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ uint64_t offset = impl.offset_;
+ impl.offset_ += asio::buffer_size(buffers);
+ handle_service_.async_read_some_at(impl, offset, buffers, handler, io_ex);
+ }
+
+ // Read some data. Returns the number of bytes read.
+ template <typename MutableBufferSequence>
+ size_t read_some_at(implementation_type& impl, uint64_t offset,
+ const MutableBufferSequence& buffers, asio::error_code& ec)
+ {
+ return handle_service_.read_some_at(impl, offset, buffers, ec);
+ }
+
+ // Start an asynchronous read. The buffer for the data being read must be
+ // valid for the lifetime of the asynchronous operation.
+ template <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_read_some_at(implementation_type& impl,
+ uint64_t offset, const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ handle_service_.async_read_some_at(impl, offset, buffers, handler, io_ex);
+ }
+
+private:
+ // The implementation used for initiating asynchronous operations.
+ win_iocp_handle_service handle_service_;
+
+ // Emulation of Windows IO_STATUS_BLOCK structure.
+ struct io_status_block
+ {
+ union u
+ {
+ LONG Status;
+ void* Pointer;
+ };
+ ULONG_PTR Information;
+ };
+
+ // Emulation of flag passed to NtFlushBuffersFileEx.
+ enum { flush_flags_file_data_sync_only = 4 };
+
+ // The type of a NtFlushBuffersFileEx function pointer.
+ typedef LONG (NTAPI *nt_flush_buffers_file_ex_fn)(
+ HANDLE, ULONG, void*, ULONG, io_status_block*);
+
+ // The NTFlushBuffersFileEx function pointer.
+ nt_flush_buffers_file_ex_fn nt_flush_buffers_file_ex_;
+};
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#if defined(ASIO_HEADER_ONLY)
+# include "asio/detail/impl/win_iocp_file_service.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // defined(ASIO_HAS_IOCP) && defined(ASIO_HAS_FILE)
+
+#endif // ASIO_DETAIL_WIN_IOCP_FILE_SERVICE_HPP
diff --git a/3rdparty/asio/include/asio/detail/win_iocp_handle_read_op.hpp b/3rdparty/asio/include/asio/detail/win_iocp_handle_read_op.hpp
new file mode 100644
index 00000000000..9721bda1c21
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_handle_read_op.hpp
@@ -0,0 +1,119 @@
+//
+// detail/win_iocp_handle_read_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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/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_work.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/operation.hpp"
+#include "asio/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename MutableBufferSequence, typename Handler, typename IoExecutor>
+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, const IoExecutor& io_ex)
+ : operation(&win_iocp_handle_read_op::do_complete),
+ buffers_(buffers),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ win_iocp_handle_read_op* o(static_cast<win_iocp_handle_read_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ if (owner)
+ {
+ // Check whether buffers are still valid.
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence>::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;
+
+ ASIO_ERROR_LOCATION(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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_iocp_handle_service.hpp b/3rdparty/asio/include/asio/detail/win_iocp_handle_service.hpp
new file mode 100644
index 00000000000..9e2486b4b79
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_handle_service.hpp
@@ -0,0 +1,431 @@
+//
+// detail/win_iocp_handle_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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/associated_cancellation_slot.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_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 execution_context_service_base<win_iocp_handle_service>
+{
+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(execution_context& 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);
+
+ // Release ownership of a handle.
+ ASIO_DECL native_handle_type release(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 <typename ConstBufferSequence>
+ 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 <typename ConstBufferSequence>
+ 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<asio::const_buffer,
+ ConstBufferSequence>::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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_write_some(implementation_type& impl,
+ const ConstBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_handle_write_op<
+ ConstBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ operation* o = p.p = new (p.v) op(buffers, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((iocp_service_.context(), *p.p, "handle", &impl,
+ reinterpret_cast<uintmax_t>(impl.handle_), "async_write_some"));
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ o = &slot.template emplace<iocp_op_cancellation>(impl.handle_, o);
+
+ start_write_op(impl, 0,
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence>::first(buffers), o);
+ 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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_write_some_at(implementation_type& impl,
+ uint64_t offset, const ConstBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_handle_write_op<
+ ConstBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ operation* o = p.p = new (p.v) op(buffers, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((iocp_service_.context(), *p.p, "handle", &impl,
+ reinterpret_cast<uintmax_t>(impl.handle_), "async_write_some_at"));
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ o = &slot.template emplace<iocp_op_cancellation>(impl.handle_, o);
+
+ start_write_op(impl, offset,
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence>::first(buffers), o);
+ p.v = p.p = 0;
+ }
+
+ // Read some data. Returns the number of bytes received.
+ template <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence>
+ 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<asio::mutable_buffer,
+ MutableBufferSequence>::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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_read_some(implementation_type& impl,
+ const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_handle_read_op<
+ MutableBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ operation* o = p.p = new (p.v) op(buffers, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((iocp_service_.context(), *p.p, "handle", &impl,
+ reinterpret_cast<uintmax_t>(impl.handle_), "async_read_some"));
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ o = &slot.template emplace<iocp_op_cancellation>(impl.handle_, o);
+
+ start_read_op(impl, 0,
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence>::first(buffers), o);
+ 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_read_some_at(implementation_type& impl,
+ uint64_t offset, const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_handle_read_op<
+ MutableBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ operation* o = p.p = new (p.v) op(buffers, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((iocp_service_.context(), *p.p, "handle", &impl,
+ reinterpret_cast<uintmax_t>(impl.handle_), "async_read_some_at"));
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ o = &slot.template emplace<iocp_op_cancellation>(impl.handle_, o);
+
+ start_read_op(impl, offset,
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence>::first(buffers), o);
+ 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 <typename Handler, typename IoExecutor>
+ void async_write_some(implementation_type& impl,
+ const null_buffers& buffers, Handler& handler,
+ const IoExecutor& io_ex);
+ template <typename Handler, typename IoExecutor>
+ void async_write_some_at(implementation_type& impl, uint64_t offset,
+ const null_buffers& buffers, Handler& handler, const IoExecutor& io_ex);
+ 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 <typename Handler, typename IoExecutor>
+ void async_read_some(implementation_type& impl,
+ const null_buffers& buffers, Handler& handler,
+ const IoExecutor& io_ex);
+ template <typename Handler, typename IoExecutor>
+ void async_read_some_at(implementation_type& impl, uint64_t offset,
+ const null_buffers& buffers, Handler& handler, const IoExecutor& io_ex);
+
+ // 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 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);
+
+ // Helper class used to implement per operation cancellation.
+ class iocp_op_cancellation : public operation
+ {
+ public:
+ iocp_op_cancellation(HANDLE h, operation* target)
+ : operation(&iocp_op_cancellation::do_complete),
+ handle_(h),
+ target_(target)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& result_ec,
+ std::size_t bytes_transferred)
+ {
+ iocp_op_cancellation* o = static_cast<iocp_op_cancellation*>(base);
+ o->target_->complete(owner, result_ec, bytes_transferred);
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ if (!!(type &
+ (cancellation_type::terminal
+ | cancellation_type::partial
+ | cancellation_type::total)))
+ {
+ ::CancelIoEx(handle_, this);
+ }
+#else // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ (void)type;
+#endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ }
+
+ private:
+ HANDLE handle_;
+ operation* target_;
+ };
+
+ // The IOCP service used for running asynchronous operations and dispatching
+ // handlers.
+ win_iocp_io_context& iocp_service_;
+
+ // Pointer to NtSetInformationFile implementation.
+ void* nt_set_info_;
+
+ // 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/3rdparty/asio/include/asio/detail/win_iocp_handle_write_op.hpp b/3rdparty/asio/include/asio/detail/win_iocp_handle_write_op.hpp
new file mode 100644
index 00000000000..6a5b7e78338
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_handle_write_op.hpp
@@ -0,0 +1,114 @@
+//
+// detail/win_iocp_handle_write_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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/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_work.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/operation.hpp"
+#include "asio/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+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, const IoExecutor& io_ex)
+ : operation(&win_iocp_handle_write_op::do_complete),
+ buffers_(buffers),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ win_iocp_handle_write_op* o(static_cast<win_iocp_handle_write_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ if (owner)
+ {
+ // Check whether buffers are still valid.
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence>::validate(o->buffers_);
+ }
+#endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+
+ ASIO_ERROR_LOCATION(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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_iocp_io_context.hpp b/3rdparty/asio/include/asio/detail/win_iocp_io_context.hpp
new file mode 100644
index 00000000000..1de94df7854
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_io_context.hpp
@@ -0,0 +1,347 @@
+//
+// detail/win_iocp_io_context.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<win_iocp_io_context>,
+ 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, bool own_thread = true);
+
+ // Destructor.
+ ASIO_DECL ~win_iocp_io_context();
+
+ // 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.
+ ASIO_DECL bool can_dispatch();
+
+ /// Capture the current exception so it can be rethrown from a run function.
+ ASIO_DECL void capture_current_exception();
+
+ // 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<win_iocp_operation>& 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<operation>& 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 <typename Time_Traits>
+ void add_timer_queue(timer_queue<Time_Traits>& timer_queue);
+
+ // Remove a timer queue from the service.
+ template <typename Time_Traits>
+ void remove_timer_queue(timer_queue<Time_Traits>& timer_queue);
+
+ // Schedule a new operation in the given timer queue to expire at the
+ // specified absolute time.
+ template <typename Time_Traits>
+ void schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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 <typename Time_Traits>
+ std::size_t cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled = (std::numeric_limits<std::size_t>::max)());
+
+ // Cancel the timer operations associated with the given key.
+ template <typename Time_Traits>
+ void cancel_timer_by_key(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data* timer,
+ void* cancellation_key);
+
+ // Move the timer operations associated with the given timer.
+ template <typename Time_Traits>
+ void move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& to,
+ typename timer_queue<Time_Traits>::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,
+ win_iocp_thread_info& this_thread, 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
+ {
+#if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0600)
+ // 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,
+#endif // !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0600)
+
+ // 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_;
+
+ // Helper class to run the scheduler in its own thread.
+ struct thread_function;
+ friend struct thread_function;
+
+ // 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<thread> 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<win_iocp_operation> completed_ops_;
+
+ // The concurrency hint used to initialise the io_context.
+ const int concurrency_hint_;
+
+ // The thread that is running the io_context.
+ scoped_ptr<thread> thread_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_iocp_null_buffers_op.hpp b/3rdparty/asio/include/asio/detail/win_iocp_null_buffers_op.hpp
new file mode 100644
index 00000000000..07751b9234b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_null_buffers_op.hpp
@@ -0,0 +1,129 @@
+//
+// detail/win_iocp_null_buffers_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/fenced_block.hpp"
+#include "asio/detail/handler_alloc_helpers.hpp"
+#include "asio/detail/handler_work.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 <typename Handler, typename IoExecutor>
+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, const IoExecutor& io_ex)
+ : reactor_op(asio::error_code(),
+ &win_iocp_null_buffers_op::do_perform,
+ &win_iocp_null_buffers_op::do_complete),
+ cancel_token_(cancel_token),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ win_iocp_null_buffers_op* o(static_cast<win_iocp_null_buffers_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ // 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;
+ }
+
+ ASIO_ERROR_LOCATION(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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_iocp_operation.hpp b/3rdparty/asio/include/asio/detail/win_iocp_operation.hpp
new file mode 100644
index 00000000000..a935f87b882
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_operation.hpp
@@ -0,0 +1,96 @@
+//
+// detail/win_iocp_operation.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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);
+ }
+
+ void reset()
+ {
+ Internal = 0;
+ InternalHigh = 0;
+ Offset = 0;
+ OffsetHigh = 0;
+ hEvent = 0;
+ ready_ = 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()
+ {
+ }
+
+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/3rdparty/asio/include/asio/detail/win_iocp_overlapped_op.hpp b/3rdparty/asio/include/asio/detail/win_iocp_overlapped_op.hpp
new file mode 100644
index 00000000000..dc65ad08311
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_overlapped_op.hpp
@@ -0,0 +1,100 @@
+//
+// detail/win_iocp_overlapped_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/detail/bind_handler.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/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Handler, typename IoExecutor>
+class win_iocp_overlapped_op : public operation
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(win_iocp_overlapped_op);
+
+ win_iocp_overlapped_op(Handler& handler, const IoExecutor& io_ex)
+ : operation(&win_iocp_overlapped_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ win_iocp_overlapped_op* o(static_cast<win_iocp_overlapped_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp b/3rdparty/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp
new file mode 100644
index 00000000000..596705a38c6
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp
@@ -0,0 +1,171 @@
+//
+// detail/win_iocp_overlapped_ptr.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/query.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 <typename Executor, typename Handler>
+ explicit win_iocp_overlapped_ptr(const Executor& ex,
+ Handler&& handler)
+ : ptr_(0),
+ iocp_service_(0)
+ {
+ this->reset(ex, static_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 <typename Executor, typename Handler>
+ void reset(const Executor& ex, Handler handler)
+ {
+ win_iocp_io_context* iocp_service = this->get_iocp_service(ex);
+
+ typedef win_iocp_overlapped_op<Handler, Executor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(handler, ex);
+
+ ASIO_HANDLER_CREATION((ex.context(), *p.p,
+ "iocp_service", iocp_service, 0, "overlapped"));
+
+ iocp_service->work_started();
+ reset();
+ ptr_ = p.p;
+ p.v = p.p = 0;
+ iocp_service_ = iocp_service;
+ }
+
+ // 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<DWORD>(bytes_transferred));
+ ptr_ = 0;
+ iocp_service_ = 0;
+ }
+ }
+
+private:
+ template <typename Executor>
+ static win_iocp_io_context* get_iocp_service(const Executor& ex,
+ enable_if_t<
+ can_query<const Executor&, execution::context_t>::value
+ >* = 0)
+ {
+ return &use_service<win_iocp_io_context>(
+ asio::query(ex, execution::context));
+ }
+
+ template <typename Executor>
+ static win_iocp_io_context* get_iocp_service(const Executor& ex,
+ enable_if_t<
+ !can_query<const Executor&, execution::context_t>::value
+ >* = 0)
+ {
+ return &use_service<win_iocp_io_context>(ex.context());
+ }
+
+ static win_iocp_io_context* get_iocp_service(
+ const io_context::executor_type& ex)
+ {
+ return &asio::query(ex, execution::context).impl_;
+ }
+
+ 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/3rdparty/asio/include/asio/detail/win_iocp_serial_port_service.hpp b/3rdparty/asio/include/asio/detail/win_iocp_serial_port_service.hpp
new file mode 100644
index 00000000000..e0e12e91d5f
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_serial_port_service.hpp
@@ -0,0 +1,233 @@
+//
+// detail/win_iocp_serial_port_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <string>
+#include "asio/error.hpp"
+#include "asio/execution_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 execution_context_service_base<win_iocp_serial_port_service>
+{
+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(execution_context& 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 <typename SettableSerialPortOption>
+ 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<SettableSerialPortOption>,
+ &option, ec);
+ }
+
+ // Get an option from the serial port.
+ template <typename GettableSerialPortOption>
+ 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<GettableSerialPortOption>,
+ &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;
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Write the given data. Returns the number of bytes sent.
+ template <typename ConstBufferSequence>
+ 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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_write_some(implementation_type& impl,
+ const ConstBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ handle_service_.async_write_some(impl, buffers, handler, io_ex);
+ }
+
+ // Read some data. Returns the number of bytes received.
+ template <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_read_some(implementation_type& impl,
+ const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ handle_service_.async_read_some(impl, buffers, handler, io_ex);
+ }
+
+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 <typename SettableSerialPortOption>
+ static asio::error_code store_option(const void* option,
+ ::DCB& storage, asio::error_code& ec)
+ {
+ static_cast<const SettableSerialPortOption*>(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 <typename GettableSerialPortOption>
+ static asio::error_code load_option(void* option,
+ const ::DCB& storage, asio::error_code& ec)
+ {
+ static_cast<GettableSerialPortOption*>(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/3rdparty/asio/include/asio/detail/win_iocp_socket_accept_op.hpp b/3rdparty/asio/include/asio/detail/win_iocp_socket_accept_op.hpp
new file mode 100644
index 00000000000..f4aa850be80
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_socket_accept_op.hpp
@@ -0,0 +1,339 @@
+//
+// detail/win_iocp_socket_accept_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/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/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 <typename Socket, typename Protocol,
+ typename Handler, typename IoExecutor>
+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, const IoExecutor& io_ex)
+ : 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),
+ proxy_op_(0),
+ cancel_requested_(0),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ socket_holder& new_socket()
+ {
+ return new_socket_;
+ }
+
+ void* output_buffer()
+ {
+ return output_buffer_;
+ }
+
+ DWORD address_length()
+ {
+ return sizeof(sockaddr_storage_type) + 16;
+ }
+
+ void enable_cancellation(long* cancel_requested, operation* proxy_op)
+ {
+ cancel_requested_ = cancel_requested;
+ proxy_op_ = proxy_op;
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ win_iocp_socket_accept_op* o(static_cast<win_iocp_socket_accept_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ 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();
+ if (o->proxy_op_)
+ o->proxy_op_->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->cancel_requested_, o->proxy_op_ ? o->proxy_op_ : 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));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(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::binder1<Handler, asio::error_code>
+ 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_;
+ operation* proxy_op_;
+ long* cancel_requested_;
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+template <typename Protocol, typename PeerIoExecutor,
+ typename Handler, typename IoExecutor>
+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, const PeerIoExecutor& peer_io_ex,
+ typename Protocol::endpoint* peer_endpoint,
+ bool enable_connection_aborted, Handler& handler, const IoExecutor& io_ex)
+ : operation(&win_iocp_socket_move_accept_op::do_complete),
+ socket_service_(socket_service),
+ socket_(socket),
+ peer_(peer_io_ex),
+ protocol_(protocol),
+ peer_endpoint_(peer_endpoint),
+ enable_connection_aborted_(enable_connection_aborted),
+ cancel_requested_(0),
+ proxy_op_(0),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ socket_holder& new_socket()
+ {
+ return new_socket_;
+ }
+
+ void* output_buffer()
+ {
+ return output_buffer_;
+ }
+
+ DWORD address_length()
+ {
+ return sizeof(sockaddr_storage_type) + 16;
+ }
+
+ void enable_cancellation(long* cancel_requested, operation* proxy_op)
+ {
+ cancel_requested_ = cancel_requested;
+ proxy_op_ = proxy_op;
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ win_iocp_socket_move_accept_op* o(
+ static_cast<win_iocp_socket_move_accept_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ 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();
+ if (o->proxy_op_)
+ o->proxy_op_->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->cancel_requested_, o->proxy_op_ ? o->proxy_op_ : 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));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(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::move_binder2<Handler,
+ asio::error_code, peer_socket_type>
+ handler(0, static_cast<Handler&&>(o->handler_), ec,
+ static_cast<peer_socket_type&&>(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:
+ typedef typename Protocol::socket::template
+ rebind_executor<PeerIoExecutor>::other peer_socket_type;
+
+ win_iocp_socket_service_base& socket_service_;
+ socket_type socket_;
+ socket_holder new_socket_;
+ peer_socket_type peer_;
+ Protocol protocol_;
+ typename Protocol::endpoint* peer_endpoint_;
+ unsigned char output_buffer_[(sizeof(sockaddr_storage_type) + 16) * 2];
+ bool enable_connection_aborted_;
+ long* cancel_requested_;
+ operation* proxy_op_;
+ Handler handler_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_iocp_socket_connect_op.hpp b/3rdparty/asio/include/asio/detail/win_iocp_socket_connect_op.hpp
new file mode 100644
index 00000000000..104ee87bb24
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_socket_connect_op.hpp
@@ -0,0 +1,138 @@
+//
+// detail/win_iocp_socket_connect_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_work.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(asio::error_code(),
+ &win_iocp_socket_connect_op_base::do_perform, complete_func),
+ socket_(socket),
+ connect_ex_(false)
+ {
+ }
+
+ static status do_perform(reactor_op* base)
+ {
+ ASIO_ASSUME(base != 0);
+ win_iocp_socket_connect_op_base* o(
+ static_cast<win_iocp_socket_connect_op_base*>(base));
+
+ return socket_ops::non_blocking_connect(
+ o->socket_, o->ec_) ? done : not_done;
+ }
+
+ socket_type socket_;
+ bool connect_ex_;
+};
+
+template <typename Handler, typename IoExecutor>
+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, const IoExecutor& io_ex)
+ : win_iocp_socket_connect_op_base(socket,
+ &win_iocp_socket_connect_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ win_iocp_socket_connect_op* o(
+ static_cast<win_iocp_socket_connect_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ if (owner)
+ {
+ if (o->connect_ex_)
+ socket_ops::complete_iocp_connect(o->socket_, ec);
+ else
+ ec = o->ec_;
+ }
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ ASIO_ERROR_LOCATION(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::binder1<Handler, asio::error_code>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_iocp_socket_recv_op.hpp b/3rdparty/asio/include/asio/detail/win_iocp_socket_recv_op.hpp
new file mode 100644
index 00000000000..874a12aa7d0
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_socket_recv_op.hpp
@@ -0,0 +1,126 @@
+//
+// detail/win_iocp_socket_recv_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_work.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 <typename MutableBufferSequence, typename Handler, typename IoExecutor>
+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,
+ const IoExecutor& io_ex)
+ : operation(&win_iocp_socket_recv_op::do_complete),
+ state_(state),
+ cancel_token_(cancel_token),
+ buffers_(buffers),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ win_iocp_socket_recv_op* o(static_cast<win_iocp_socket_recv_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ // Check whether buffers are still valid.
+ if (owner)
+ {
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence>::validate(o->buffers_);
+ }
+#endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+
+ socket_ops::complete_iocp_recv(o->state_, o->cancel_token_,
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence>::all_empty(o->buffers_),
+ ec, bytes_transferred);
+
+ ASIO_ERROR_LOCATION(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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_iocp_socket_recvfrom_op.hpp b/3rdparty/asio/include/asio/detail/win_iocp_socket_recvfrom_op.hpp
new file mode 100644
index 00000000000..b4b98aa0148
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_socket_recvfrom_op.hpp
@@ -0,0 +1,135 @@
+//
+// detail/win_iocp_socket_recvfrom_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_work.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 <typename MutableBufferSequence, typename Endpoint,
+ typename Handler, typename IoExecutor>
+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,
+ const IoExecutor& io_ex)
+ : operation(&win_iocp_socket_recvfrom_op::do_complete),
+ endpoint_(endpoint),
+ endpoint_size_(static_cast<int>(endpoint.capacity())),
+ cancel_token_(cancel_token),
+ buffers_(buffers),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ win_iocp_socket_recvfrom_op* o(
+ static_cast<win_iocp_socket_recvfrom_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ // Check whether buffers are still valid.
+ if (owner)
+ {
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence>::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_);
+
+ ASIO_ERROR_LOCATION(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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_iocp_socket_recvmsg_op.hpp b/3rdparty/asio/include/asio/detail/win_iocp_socket_recvmsg_op.hpp
new file mode 100644
index 00000000000..85e4b78dc20
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_socket_recvmsg_op.hpp
@@ -0,0 +1,127 @@
+//
+// detail/win_iocp_socket_recvmsg_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_work.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 <typename MutableBufferSequence, typename Handler, typename IoExecutor>
+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, const IoExecutor& io_ex)
+ : operation(&win_iocp_socket_recvmsg_op::do_complete),
+ cancel_token_(cancel_token),
+ buffers_(buffers),
+ out_flags_(out_flags),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ win_iocp_socket_recvmsg_op* o(
+ static_cast<win_iocp_socket_recvmsg_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ // Check whether buffers are still valid.
+ if (owner)
+ {
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence>::validate(o->buffers_);
+ }
+#endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+
+ socket_ops::complete_iocp_recvmsg(o->cancel_token_, ec);
+ o->out_flags_ = 0;
+
+ ASIO_ERROR_LOCATION(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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_iocp_socket_send_op.hpp b/3rdparty/asio/include/asio/detail/win_iocp_socket_send_op.hpp
new file mode 100644
index 00000000000..c7043c4875e
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_socket_send_op.hpp
@@ -0,0 +1,120 @@
+//
+// detail/win_iocp_socket_send_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_work.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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+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,
+ const IoExecutor& io_ex)
+ : operation(&win_iocp_socket_send_op::do_complete),
+ cancel_token_(cancel_token),
+ buffers_(buffers),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ win_iocp_socket_send_op* o(static_cast<win_iocp_socket_send_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ // Check whether buffers are still valid.
+ if (owner)
+ {
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence>::validate(o->buffers_);
+ }
+#endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+
+ socket_ops::complete_iocp_send(o->cancel_token_, ec);
+
+ ASIO_ERROR_LOCATION(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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_iocp_socket_service.hpp b/3rdparty/asio/include/asio/detail/win_iocp_socket_service.hpp
new file mode 100644
index 00000000000..faeaffa4c36
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_socket_service.hpp
@@ -0,0 +1,680 @@
+//
+// detail/win_iocp_socket_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstring>
+#include "asio/error.hpp"
+#include "asio/execution_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/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 <typename Protocol>
+class win_iocp_socket_service :
+ public execution_context_service_base<win_iocp_socket_service<Protocol>>,
+ 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(execution_context& context)
+ : execution_context_service_base<
+ win_iocp_socket_service<Protocol>>(context),
+ win_iocp_socket_service_base(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) noexcept
+ {
+ 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 <typename Protocol1>
+ void converting_move_construct(implementation_type& impl,
+ win_iocp_socket_service<Protocol1>&,
+ 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();
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ 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();
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ 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);
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Set a socket option.
+ template <typename Option>
+ 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);
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Set a socket option.
+ template <typename Option>
+ 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);
+
+ ASIO_ERROR_LOCATION(ec);
+ 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))
+ {
+ ASIO_ERROR_LOCATION(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))
+ {
+ ASIO_ERROR_LOCATION(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 <typename ConstBufferSequence>
+ 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<asio::const_buffer,
+ ConstBufferSequence> bufs(buffers);
+
+ size_t n = socket_ops::sync_sendto(impl.socket_,
+ impl.state_, bufs.buffers(), bufs.count(), flags,
+ destination.data(), destination.size(), ec);
+
+ ASIO_ERROR_LOCATION(ec);
+ return n;
+ }
+
+ // 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);
+ ASIO_ERROR_LOCATION(ec);
+ return 0;
+ }
+
+ // Start an asynchronous send. The data being sent must be valid for the
+ // lifetime of the asynchronous operation.
+ template <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_send_to(implementation_type& impl,
+ const ConstBufferSequence& buffers, const endpoint_type& destination,
+ socket_base::message_flags flags, Handler& handler,
+ const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_socket_send_op<
+ ConstBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ operation* o = p.p = new (p.v) op(
+ impl.cancel_token_, buffers, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((context_, *p.p, "socket",
+ &impl, impl.socket_, "async_send_to"));
+
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs(buffers);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ o = &slot.template emplace<iocp_op_cancellation>(impl.socket_, o);
+
+ start_send_to_op(impl, bufs.buffers(), bufs.count(),
+ destination.data(), static_cast<int>(destination.size()),
+ flags, o);
+ p.v = p.p = 0;
+ }
+
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_send_to(implementation_type& impl, const null_buffers&,
+ const endpoint_type&, socket_base::message_flags, Handler& handler,
+ const IoExecutor& io_ex)
+ {
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ reactor_op* o = p.p = new (p.v) op(impl.cancel_token_, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((context_, *p.p, "socket",
+ &impl, impl.socket_, "async_send_to(null_buffers)"));
+
+ start_reactor_op(impl, select_reactor::write_op, o);
+ p.v = p.p = 0;
+ }
+
+ // Receive a datagram with the endpoint of the sender. Returns the number of
+ // bytes received.
+ template <typename MutableBufferSequence>
+ 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<asio::mutable_buffer,
+ MutableBufferSequence> bufs(buffers);
+
+ std::size_t addr_len = sender_endpoint.capacity();
+ std::size_t n = 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);
+
+ ASIO_ERROR_LOCATION(ec);
+ return n;
+ }
+
+ // 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();
+
+ ASIO_ERROR_LOCATION(ec);
+ 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_receive_from(implementation_type& impl,
+ const MutableBufferSequence& buffers, endpoint_type& sender_endp,
+ socket_base::message_flags flags, Handler& handler,
+ const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_socket_recvfrom_op<MutableBufferSequence,
+ endpoint_type, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ operation* o = p.p = new (p.v) op(sender_endp,
+ impl.cancel_token_, buffers, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((context_, *p.p, "socket",
+ &impl, impl.socket_, "async_receive_from"));
+
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs(buffers);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ o = &slot.template emplace<iocp_op_cancellation>(impl.socket_, o);
+
+ start_receive_from_op(impl, bufs.buffers(), bufs.count(),
+ sender_endp.data(), flags, &p.p->endpoint_size(), o);
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_receive_from(implementation_type& impl, const null_buffers&,
+ endpoint_type& sender_endpoint, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(impl.cancel_token_, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((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();
+
+ // Optionally register for per-operation cancellation.
+ operation* iocp_op = p.p;
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ = iocp_op =
+ &slot.template emplace<reactor_op_cancellation>(
+ impl.socket_, iocp_op);
+ }
+
+ int op_type = start_null_buffers_receive_op(impl, flags, p.p, iocp_op);
+ p.v = p.p = 0;
+
+ // Update cancellation method if the reactor was used.
+ if (slot.is_connected() && op_type != -1)
+ {
+ static_cast<reactor_op_cancellation*>(iocp_op)->use_reactor(
+ &get_reactor(), &impl.reactor_data_, op_type);
+ }
+ }
+
+ // Accept a new connection.
+ template <typename Socket>
+ 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;
+ ASIO_ERROR_LOCATION(ec);
+ 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();
+ }
+
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Start an asynchronous accept. The peer and peer_endpoint objects
+ // must be valid until the accept's handler is invoked.
+ template <typename Socket, typename Handler, typename IoExecutor>
+ void async_accept(implementation_type& impl, Socket& peer,
+ endpoint_type* peer_endpoint, Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_socket_accept_op<Socket,
+ protocol_type, Handler, IoExecutor> 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;
+ operation* o = p.p = new (p.v) op(*this, impl.socket_, peer, impl.protocol_,
+ peer_endpoint, enable_connection_aborted, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((context_, *p.p, "socket",
+ &impl, impl.socket_, "async_accept"));
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ accept_op_cancellation* c =
+ &slot.template emplace<accept_op_cancellation>(impl.socket_, o);
+ p.p->enable_cancellation(c->get_cancel_requested(), c);
+ o = c;
+ }
+
+ 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(), o);
+ p.v = p.p = 0;
+ }
+
+ // Start an asynchronous accept. The peer and peer_endpoint objects
+ // must be valid until the accept's handler is invoked.
+ template <typename PeerIoExecutor, typename Handler, typename IoExecutor>
+ void async_move_accept(implementation_type& impl,
+ const PeerIoExecutor& peer_io_ex, endpoint_type* peer_endpoint,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_socket_move_accept_op<
+ protocol_type, PeerIoExecutor, Handler, IoExecutor> 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;
+ operation* o = p.p = new (p.v) op(*this, impl.socket_, impl.protocol_,
+ peer_io_ex, peer_endpoint, enable_connection_aborted,
+ handler, io_ex);
+
+ ASIO_HANDLER_CREATION((context_, *p.p, "socket",
+ &impl, impl.socket_, "async_accept"));
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ accept_op_cancellation* c =
+ &slot.template emplace<accept_op_cancellation>(impl.socket_, o);
+ p.p->enable_cancellation(c->get_cancel_requested(), c);
+ o = c;
+ }
+
+ 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(), o);
+ p.v = p.p = 0;
+ }
+
+ // 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);
+ ASIO_ERROR_LOCATION(ec);
+ return ec;
+ }
+
+ // Start an asynchronous connect.
+ template <typename Handler, typename IoExecutor>
+ void async_connect(implementation_type& impl,
+ const endpoint_type& peer_endpoint, Handler& handler,
+ const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_socket_connect_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(impl.socket_, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((context_, *p.p, "socket",
+ &impl, impl.socket_, "async_connect"));
+
+ // Optionally register for per-operation cancellation.
+ operation* iocp_op = p.p;
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ = iocp_op =
+ &slot.template emplace<reactor_op_cancellation>(
+ impl.socket_, iocp_op);
+ }
+
+ int op_type = start_connect_op(impl, impl.protocol_.family(),
+ impl.protocol_.type(), peer_endpoint.data(),
+ static_cast<int>(peer_endpoint.size()), p.p, iocp_op);
+ p.v = p.p = 0;
+
+ // Update cancellation method if the reactor was used.
+ if (slot.is_connected() && op_type != -1)
+ {
+ static_cast<reactor_op_cancellation*>(iocp_op)->use_reactor(
+ &get_reactor(), &impl.reactor_data_, op_type);
+ }
+ }
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_iocp_socket_service_base.hpp b/3rdparty/asio/include/asio/detail/win_iocp_socket_service_base.hpp
new file mode 100644
index 00000000000..a157143e35b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_socket_service_base.hpp
@@ -0,0 +1,829 @@
+//
+// detail/win_iocp_socket_service_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/associated_cancellation_slot.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_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/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(execution_context& 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) noexcept;
+
+ // 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 <typename IO_Control_Command>
+ 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<ioctl_arg_type*>(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 <typename Handler, typename IoExecutor>
+ void async_wait(base_implementation_type& impl,
+ socket_base::wait_type w, Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(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<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(impl.cancel_token_, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((context_, *p.p, "socket",
+ &impl, impl.socket_, "async_wait"));
+
+ // Optionally register for per-operation cancellation.
+ operation* iocp_op = p.p;
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ = iocp_op =
+ &slot.template emplace<reactor_op_cancellation>(
+ impl.socket_, iocp_op);
+ }
+
+ int op_type = -1;
+ switch (w)
+ {
+ case socket_base::wait_read:
+ op_type = start_null_buffers_receive_op(impl, 0, p.p, iocp_op);
+ break;
+ case socket_base::wait_write:
+ op_type = select_reactor::write_op;
+ start_reactor_op(impl, select_reactor::write_op, p.p);
+ break;
+ case socket_base::wait_error:
+ op_type = select_reactor::read_op;
+ 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;
+
+ // Update cancellation method if the reactor was used.
+ if (slot.is_connected() && op_type != -1)
+ {
+ static_cast<reactor_op_cancellation*>(iocp_op)->use_reactor(
+ &get_reactor(), &impl.reactor_data_, op_type);
+ }
+ }
+
+ // Send the given data to the peer. Returns the number of bytes sent.
+ template <typename ConstBufferSequence>
+ size_t send(base_implementation_type& impl,
+ const ConstBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> 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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_send(base_implementation_type& impl,
+ const ConstBufferSequence& buffers, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_socket_send_op<
+ ConstBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ operation* o = p.p = new (p.v) op(
+ impl.cancel_token_, buffers, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((context_, *p.p, "socket",
+ &impl, impl.socket_, "async_send"));
+
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence> bufs(buffers);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ o = &slot.template emplace<iocp_op_cancellation>(impl.socket_, o);
+
+ start_send_op(impl, bufs.buffers(), bufs.count(), flags,
+ (impl.state_ & socket_ops::stream_oriented) != 0 && bufs.all_empty(),
+ o);
+ p.v = p.p = 0;
+ }
+
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_send(base_implementation_type& impl, const null_buffers&,
+ socket_base::message_flags, Handler& handler, const IoExecutor& io_ex)
+ {
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(impl.cancel_token_, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((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 <typename MutableBufferSequence>
+ size_t receive(base_implementation_type& impl,
+ const MutableBufferSequence& buffers,
+ socket_base::message_flags flags, asio::error_code& ec)
+ {
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_receive(base_implementation_type& impl,
+ const MutableBufferSequence& buffers, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_socket_recv_op<
+ MutableBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ operation* o = p.p = new (p.v) op(impl.state_,
+ impl.cancel_token_, buffers, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((context_, *p.p, "socket",
+ &impl, impl.socket_, "async_receive"));
+
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs(buffers);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ o = &slot.template emplace<iocp_op_cancellation>(impl.socket_, o);
+
+ start_receive_op(impl, bufs.buffers(), bufs.count(), flags,
+ (impl.state_ & socket_ops::stream_oriented) != 0 && bufs.all_empty(),
+ o);
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_receive(base_implementation_type& impl,
+ const null_buffers&, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(impl.cancel_token_, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((context_, *p.p, "socket",
+ &impl, impl.socket_, "async_receive(null_buffers)"));
+
+ // Optionally register for per-operation cancellation.
+ operation* iocp_op = p.p;
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ = iocp_op =
+ &slot.template emplace<reactor_op_cancellation>(
+ impl.socket_, iocp_op);
+ }
+
+ int op_type = start_null_buffers_receive_op(impl, flags, p.p, iocp_op);
+ p.v = p.p = 0;
+
+ // Update cancellation method if the reactor was used.
+ if (slot.is_connected() && op_type != -1)
+ {
+ static_cast<reactor_op_cancellation*>(iocp_op)->use_reactor(
+ &get_reactor(), &impl.reactor_data_, op_type);
+ }
+ }
+
+ // Receive some data with associated flags. Returns the number of bytes
+ // received.
+ template <typename MutableBufferSequence>
+ 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<asio::mutable_buffer,
+ MutableBufferSequence> 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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ 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,
+ const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_socket_recvmsg_op<
+ MutableBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ operation* o = p.p = new (p.v) op(impl.cancel_token_,
+ buffers, out_flags, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((context_, *p.p, "socket",
+ &impl, impl.socket_, "async_receive_with_flags"));
+
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence> bufs(buffers);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ o = &slot.template emplace<iocp_op_cancellation>(impl.socket_, o);
+
+ start_receive_op(impl, bufs.buffers(), bufs.count(), in_flags, false, o);
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ 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,
+ const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef win_iocp_null_buffers_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(impl.cancel_token_, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((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;
+
+ // Optionally register for per-operation cancellation.
+ operation* iocp_op = p.p;
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ = iocp_op =
+ &slot.template emplace<reactor_op_cancellation>(
+ impl.socket_, iocp_op);
+ }
+
+ int op_type = start_null_buffers_receive_op(impl, in_flags, p.p, iocp_op);
+ p.v = p.p = 0;
+
+ // Update cancellation method if the reactor was used.
+ if (slot.is_connected() && op_type != -1)
+ {
+ static_cast<reactor_op_cancellation*>(iocp_op)->use_reactor(
+ &get_reactor(), &impl.reactor_data_, op_type);
+ }
+ }
+
+ // 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,
+ long* cancel_requested, 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 void* 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 int start_null_buffers_receive_op(
+ base_implementation_type& impl, socket_base::message_flags flags,
+ reactor_op* op, operation* iocp_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, void* 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 int start_connect_op(base_implementation_type& impl,
+ int family, int type, const void* remote_addr, std::size_t remote_addrlen,
+ win_iocp_socket_connect_op_base* op, operation* iocp_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 execution 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);
+
+ // Helper class used to implement per operation cancellation.
+ class iocp_op_cancellation : public operation
+ {
+ public:
+ iocp_op_cancellation(SOCKET s, operation* target)
+ : operation(&iocp_op_cancellation::do_complete),
+ socket_(s),
+ target_(target)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& result_ec,
+ std::size_t bytes_transferred)
+ {
+ iocp_op_cancellation* o = static_cast<iocp_op_cancellation*>(base);
+ o->target_->complete(owner, result_ec, bytes_transferred);
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ if (!!(type &
+ (cancellation_type::terminal
+ | cancellation_type::partial
+ | cancellation_type::total)))
+ {
+ HANDLE sock_as_handle = reinterpret_cast<HANDLE>(socket_);
+ ::CancelIoEx(sock_as_handle, this);
+ }
+#else // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ (void)type;
+#endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ }
+
+ private:
+ SOCKET socket_;
+ operation* target_;
+ };
+
+ // Helper class used to implement per operation cancellation.
+ class accept_op_cancellation : public operation
+ {
+ public:
+ accept_op_cancellation(SOCKET s, operation* target)
+ : operation(&iocp_op_cancellation::do_complete),
+ socket_(s),
+ target_(target),
+ cancel_requested_(0)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& result_ec,
+ std::size_t bytes_transferred)
+ {
+ accept_op_cancellation* o = static_cast<accept_op_cancellation*>(base);
+ o->target_->complete(owner, result_ec, bytes_transferred);
+ }
+
+ long* get_cancel_requested()
+ {
+ return &cancel_requested_;
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ if (!!(type &
+ (cancellation_type::terminal
+ | cancellation_type::partial
+ | cancellation_type::total)))
+ {
+ HANDLE sock_as_handle = reinterpret_cast<HANDLE>(socket_);
+ ::CancelIoEx(sock_as_handle, this);
+ }
+#else // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ (void)type;
+#endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ }
+
+ private:
+ SOCKET socket_;
+ operation* target_;
+ long cancel_requested_;
+ };
+
+ // Helper class used to implement per operation cancellation.
+ class reactor_op_cancellation : public operation
+ {
+ public:
+ reactor_op_cancellation(SOCKET s, operation* base)
+ : operation(&reactor_op_cancellation::do_complete),
+ socket_(s),
+ target_(base),
+ reactor_(0),
+ reactor_data_(0),
+ op_type_(-1)
+ {
+ }
+
+ void use_reactor(select_reactor* r,
+ select_reactor::per_descriptor_data* p, int o)
+ {
+ reactor_ = r;
+ reactor_data_ = p;
+ op_type_ = o;
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code& result_ec,
+ std::size_t bytes_transferred)
+ {
+ reactor_op_cancellation* o = static_cast<reactor_op_cancellation*>(base);
+ o->target_->complete(owner, result_ec, bytes_transferred);
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ if (!!(type &
+ (cancellation_type::terminal
+ | cancellation_type::partial
+ | cancellation_type::total)))
+ {
+ if (reactor_)
+ {
+ reactor_->cancel_ops_by_key(socket_,
+ *reactor_data_, op_type_, this);
+ }
+ else
+ {
+#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ HANDLE sock_as_handle = reinterpret_cast<HANDLE>(socket_);
+ ::CancelIoEx(sock_as_handle, this);
+#endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600)
+ }
+ }
+ }
+
+ private:
+ SOCKET socket_;
+ operation* target_;
+ select_reactor* reactor_;
+ select_reactor::per_descriptor_data* reactor_data_;
+ int op_type_;
+ };
+
+ // The execution context used to obtain the reactor, if required.
+ execution_context& 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/3rdparty/asio/include/asio/detail/win_iocp_thread_info.hpp b/3rdparty/asio/include/asio/detail/win_iocp_thread_info.hpp
new file mode 100644
index 00000000000..3f1e0126779
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_thread_info.hpp
@@ -0,0 +1,34 @@
+//
+// detail/win_iocp_thread_info.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/detail/win_iocp_wait_op.hpp b/3rdparty/asio/include/asio/detail/win_iocp_wait_op.hpp
new file mode 100644
index 00000000000..882f16e73cf
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_iocp_wait_op.hpp
@@ -0,0 +1,130 @@
+//
+// detail/win_iocp_wait_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_work.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 <typename Handler, typename IoExecutor>
+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, const IoExecutor& io_ex)
+ : reactor_op(asio::error_code(),
+ &win_iocp_wait_op::do_perform,
+ &win_iocp_wait_op::do_complete),
+ cancel_token_(cancel_token),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ 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.
+ ASIO_ASSUME(base != 0);
+ win_iocp_wait_op* o(static_cast<win_iocp_wait_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ // 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;
+ }
+
+ ASIO_ERROR_LOCATION(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::binder1<Handler, asio::error_code>
+ 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_;
+ handler_work<Handler, IoExecutor> work_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/win_mutex.hpp b/3rdparty/asio/include/asio/detail/win_mutex.hpp
new file mode 100644
index 00000000000..77603ec9750
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_mutex.hpp
@@ -0,0 +1,78 @@
+//
+// detail/win_mutex.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<win_mutex> 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/3rdparty/asio/include/asio/detail/win_object_handle_service.hpp b/3rdparty/asio/include/asio/detail/win_object_handle_service.hpp
new file mode 100644
index 00000000000..8e01b72f4f6
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_object_handle_service.hpp
@@ -0,0 +1,194 @@
+//
+// detail/win_object_handle_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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/memory.hpp"
+#include "asio/detail/wait_handler.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_io_context.hpp"
+#else // defined(ASIO_HAS_IOCP)
+# include "asio/detail/scheduler.hpp"
+#endif // defined(ASIO_HAS_IOCP)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class win_object_handle_service :
+ public execution_context_service_base<win_object_handle_service>
+{
+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<wait_op> 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(execution_context& 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 <typename Handler, typename IoExecutor>
+ void async_wait(implementation_type& impl,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ // Allocate and construct an operation to wrap the handler.
+ typedef wait_handler<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(handler, io_ex);
+
+ ASIO_HANDLER_CREATION((scheduler_.context(), *p.p, "object_handle",
+ &impl, reinterpret_cast<uintmax_t>(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 scheduler used to post completions.
+#if defined(ASIO_HAS_IOCP)
+ typedef class win_iocp_io_context scheduler_impl;
+#else
+ typedef class scheduler scheduler_impl;
+#endif
+ scheduler_impl& scheduler_;
+
+ // 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/3rdparty/asio/include/asio/detail/win_static_mutex.hpp b/3rdparty/asio/include/asio/detail/win_static_mutex.hpp
new file mode 100644
index 00000000000..736ef0e3f2c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_static_mutex.hpp
@@ -0,0 +1,74 @@
+//
+// detail/win_static_mutex.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<win_static_mutex> 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/3rdparty/asio/include/asio/detail/win_thread.hpp b/3rdparty/asio/include/asio/detail/win_thread.hpp
new file mode 100644
index 00000000000..c1e7b8e618a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_thread.hpp
@@ -0,0 +1,147 @@
+//
+// detail/win_thread.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#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 <typename T>
+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 <typename T>
+long win_thread_base<T>::terminate_threads_ = 0;
+
+class win_thread
+ : private noncopyable,
+ public win_thread_base<win_thread>
+{
+public:
+ // Constructor.
+ template <typename Function>
+ win_thread(Function f, unsigned int stack_size = 0)
+ : thread_(0),
+ exit_event_(0)
+ {
+ start_thread(new func<Function>(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 <typename Function>
+ 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/3rdparty/asio/include/asio/detail/win_tss_ptr.hpp b/3rdparty/asio/include/asio/detail/win_tss_ptr.hpp
new file mode 100644
index 00000000000..95a87717bad
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/win_tss_ptr.hpp
@@ -0,0 +1,79 @@
+//
+// detail/win_tss_ptr.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename T>
+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<T*>(::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/3rdparty/asio/include/asio/detail/winapp_thread.hpp b/3rdparty/asio/include/asio/detail/winapp_thread.hpp
new file mode 100644
index 00000000000..efa662dfe6f
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winapp_thread.hpp
@@ -0,0 +1,124 @@
+//
+// detail/winapp_thread.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Function>
+ winapp_thread(Function f, unsigned int = 0)
+ {
+ scoped_ptr<func_base> arg(new func<Function>(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 <typename Function>
+ 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<winapp_thread::func_base> func(
+ static_cast<winapp_thread::func_base*>(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/3rdparty/asio/include/asio/detail/wince_thread.hpp b/3rdparty/asio/include/asio/detail/wince_thread.hpp
new file mode 100644
index 00000000000..3c6b8543c21
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/wince_thread.hpp
@@ -0,0 +1,124 @@
+//
+// detail/wince_thread.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Function>
+ wince_thread(Function f, unsigned int = 0)
+ {
+ scoped_ptr<func_base> arg(new func<Function>(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 <typename Function>
+ 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<wince_thread::func_base> func(
+ static_cast<wince_thread::func_base*>(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/3rdparty/asio/include/asio/detail/winrt_async_manager.hpp b/3rdparty/asio/include/asio/detail/winrt_async_manager.hpp
new file mode 100644
index 00000000000..9d0f9023c8c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winrt_async_manager.hpp
@@ -0,0 +1,305 @@
+//
+// detail/winrt_async_manager.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <future>
+#include "asio/detail/atomic_count.hpp"
+#include "asio/detail/winrt_async_op.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_io_context.hpp"
+#else // defined(ASIO_HAS_IOCP)
+# include "asio/detail/scheduler.hpp"
+#endif // defined(ASIO_HAS_IOCP)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class winrt_async_manager
+ : public execution_context_service_base<winrt_async_manager>
+{
+public:
+ // Constructor.
+ winrt_async_manager(execution_context& context)
+ : execution_context_service_base<winrt_async_manager>(context),
+ scheduler_(use_service<scheduler_impl>(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<void> 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<std::promise<asio::error_code>>();
+ 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 <typename TResult>
+ TResult sync(Windows::Foundation::IAsyncOperation<TResult>^ operation,
+ asio::error_code& ec)
+ {
+ using namespace Windows::Foundation;
+ using Windows::Foundation::AsyncStatus;
+
+ auto promise = std::make_shared<std::promise<asio::error_code>>();
+ auto future = promise->get_future();
+
+ operation->Completed = ref new AsyncOperationCompletedHandler<TResult>(
+ [promise](IAsyncOperation<TResult>^ 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 <typename TResult, typename TProgress>
+ 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<std::promise<asio::error_code>>();
+ auto future = promise->get_future();
+
+ operation->Completed
+ = ref new AsyncOperationWithProgressCompletedHandler<TResult, TProgress>(
+ [promise](IAsyncOperationWithProgress<TResult, TProgress>^ 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<void>* 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;
+ }
+ scheduler_.post_deferred_completion(handler);
+ if (--outstanding_ops_ == 0)
+ promise_.set_value();
+ });
+
+ scheduler_.work_started();
+ ++outstanding_ops_;
+ action->Completed = on_completed;
+ }
+
+ template <typename TResult>
+ void async(Windows::Foundation::IAsyncOperation<TResult>^ operation,
+ winrt_async_op<TResult>* handler)
+ {
+ using namespace Windows::Foundation;
+ using Windows::Foundation::AsyncStatus;
+
+ auto on_completed = ref new AsyncOperationCompletedHandler<TResult>(
+ [this, handler](IAsyncOperation<TResult>^ 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;
+ }
+ scheduler_.post_deferred_completion(handler);
+ if (--outstanding_ops_ == 0)
+ promise_.set_value();
+ });
+
+ scheduler_.work_started();
+ ++outstanding_ops_;
+ operation->Completed = on_completed;
+ }
+
+ template <typename TResult, typename TProgress>
+ void async(
+ Windows::Foundation::IAsyncOperationWithProgress<
+ TResult, TProgress>^ operation,
+ winrt_async_op<TResult>* handler)
+ {
+ using namespace Windows::Foundation;
+ using Windows::Foundation::AsyncStatus;
+
+ auto on_completed
+ = ref new AsyncOperationWithProgressCompletedHandler<TResult, TProgress>(
+ [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;
+ }
+ scheduler_.post_deferred_completion(handler);
+ if (--outstanding_ops_ == 0)
+ promise_.set_value();
+ });
+
+ scheduler_.work_started();
+ ++outstanding_ops_;
+ operation->Completed = on_completed;
+ }
+
+private:
+ // The scheduler implementation used to post completed handlers.
+#if defined(ASIO_HAS_IOCP)
+ typedef class win_iocp_io_context scheduler_impl;
+#else
+ typedef class scheduler scheduler_impl;
+#endif
+ scheduler_impl& scheduler_;
+
+ // Count of outstanding operations.
+ atomic_count outstanding_ops_;
+
+ // Used to keep wait for outstanding operations to complete.
+ std::promise<void> 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/3rdparty/asio/include/asio/detail/winrt_async_op.hpp b/3rdparty/asio/include/asio/detail/winrt_async_op.hpp
new file mode 100644
index 00000000000..a34989841bc
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winrt_async_op.hpp
@@ -0,0 +1,65 @@
+//
+// detail/winrt_async_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename TResult>
+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<void>
+ : 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/3rdparty/asio/include/asio/detail/winrt_resolve_op.hpp b/3rdparty/asio/include/asio/detail/winrt_resolve_op.hpp
new file mode 100644
index 00000000000..3cbd00e61f2
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winrt_resolve_op.hpp
@@ -0,0 +1,125 @@
+//
+// detail/winrt_resolve_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_work.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 <typename Protocol, typename Handler, typename IoExecutor>
+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<Protocol> query_type;
+ typedef asio::ip::basic_resolver_results<Protocol> results_type;
+
+ winrt_resolve_op(const query_type& query,
+ Handler& handler, const IoExecutor& io_ex)
+ : winrt_async_op<
+ Windows::Foundation::Collections::IVectorView<
+ Windows::Networking::EndpointPair^>^>(
+ &winrt_resolve_op::do_complete),
+ query_(query),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code&, std::size_t)
+ {
+ // Take ownership of the operation object.
+ ASIO_ASSUME(base != 0);
+ winrt_resolve_op* o(static_cast<winrt_resolve_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ 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, asio::error_code, results_type>
+ 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_;
+ handler_work<Handler, IoExecutor> executor_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/winrt_resolver_service.hpp b/3rdparty/asio/include/asio/detail/winrt_resolver_service.hpp
new file mode 100644
index 00000000000..02dddf08226
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winrt_resolver_service.hpp
@@ -0,0 +1,212 @@
+//
+// detail/winrt_resolver_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/post.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"
+
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_io_context.hpp"
+#else // defined(ASIO_HAS_IOCP)
+# include "asio/detail/scheduler.hpp"
+#endif // defined(ASIO_HAS_IOCP)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Protocol>
+class winrt_resolver_service :
+ public execution_context_service_base<winrt_resolver_service<Protocol>>
+{
+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<Protocol> query_type;
+
+ // The results type.
+ typedef asio::ip::basic_resolver_results<Protocol> results_type;
+
+ // Constructor.
+ winrt_resolver_service(execution_context& context)
+ : execution_context_service_base<
+ winrt_resolver_service<Protocol>>(context),
+ scheduler_(use_service<scheduler_impl>(context)),
+ async_manager_(use_service<winrt_async_manager>(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(execution_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 <typename Handler, typename IoExecutor>
+ void async_resolve(implementation_type& impl, const query_type& query,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef winrt_resolve_op<Protocol, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(query, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((scheduler_.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());
+ scheduler_.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 <typename Handler, typename IoExecutor>
+ void async_resolve(implementation_type&, const endpoint_type&,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ const results_type results;
+ asio::post(io_ex, detail::bind_handler(handler, ec, results));
+ }
+
+private:
+ // The scheduler implementation used for delivering completions.
+#if defined(ASIO_HAS_IOCP)
+ typedef class win_iocp_io_context scheduler_impl;
+#else
+ typedef class scheduler scheduler_impl;
+#endif
+ scheduler_impl& scheduler_;
+
+ 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/3rdparty/asio/include/asio/detail/winrt_socket_connect_op.hpp b/3rdparty/asio/include/asio/detail/winrt_socket_connect_op.hpp
new file mode 100644
index 00000000000..008062e1b6e
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winrt_socket_connect_op.hpp
@@ -0,0 +1,98 @@
+//
+// detail/winrt_socket_connect_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_work.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 <typename Handler, typename IoExecutor>
+class winrt_socket_connect_op :
+ public winrt_async_op<void>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(winrt_socket_connect_op);
+
+ winrt_socket_connect_op(Handler& handler, const IoExecutor& io_ex)
+ : winrt_async_op<void>(&winrt_socket_connect_op::do_complete),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code&, std::size_t)
+ {
+ // Take ownership of the operation object.
+ ASIO_ASSUME(base != 0);
+ winrt_socket_connect_op* o(static_cast<winrt_socket_connect_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ // 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, asio::error_code>
+ 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_;
+ handler_work<Handler, IoExecutor> executor_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/winrt_socket_recv_op.hpp b/3rdparty/asio/include/asio/detail/winrt_socket_recv_op.hpp
new file mode 100644
index 00000000000..4b1d9f895f3
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winrt_socket_recv_op.hpp
@@ -0,0 +1,119 @@
+//
+// detail/winrt_socket_recv_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_work.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 <typename MutableBufferSequence, typename Handler, typename IoExecutor>
+class winrt_socket_recv_op :
+ public winrt_async_op<Windows::Storage::Streams::IBuffer^>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(winrt_socket_recv_op);
+
+ winrt_socket_recv_op(const MutableBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ : winrt_async_op<Windows::Storage::Streams::IBuffer^>(
+ &winrt_socket_recv_op::do_complete),
+ buffers_(buffers),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code&, std::size_t)
+ {
+ // Take ownership of the operation object.
+ ASIO_ASSUME(base != 0);
+ winrt_socket_recv_op* o(static_cast<winrt_socket_recv_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ // Check whether buffers are still valid.
+ if (owner)
+ {
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence>::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<asio::mutable_buffer,
+ MutableBufferSequence>::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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> executor_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/winrt_socket_send_op.hpp b/3rdparty/asio/include/asio/detail/winrt_socket_send_op.hpp
new file mode 100644
index 00000000000..eb21ef7e902
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winrt_socket_send_op.hpp
@@ -0,0 +1,110 @@
+//
+// detail/winrt_socket_send_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_work.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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+class winrt_socket_send_op :
+ public winrt_async_op<unsigned int>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(winrt_socket_send_op);
+
+ winrt_socket_send_op(const ConstBufferSequence& buffers,
+ Handler& handler, const IoExecutor& io_ex)
+ : winrt_async_op<unsigned int>(&winrt_socket_send_op::do_complete),
+ buffers_(buffers),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_complete(void* owner, operation* base,
+ const asio::error_code&, std::size_t)
+ {
+ // Take ownership of the operation object.
+ ASIO_ASSUME(base != 0);
+ winrt_socket_send_op* o(static_cast<winrt_socket_send_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ handler_work<Handler, IoExecutor> w(
+ static_cast<handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+#if defined(ASIO_ENABLE_BUFFER_DEBUGGING)
+ // Check whether buffers are still valid.
+ if (owner)
+ {
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence>::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, asio::error_code, std::size_t>
+ 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_;
+ handler_work<Handler, IoExecutor> executor_;
+};
+
+} // 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/3rdparty/asio/include/asio/detail/winrt_ssocket_service.hpp b/3rdparty/asio/include/asio/detail/winrt_ssocket_service.hpp
new file mode 100644
index 00000000000..6b45ed4fb0c
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winrt_ssocket_service.hpp
@@ -0,0 +1,250 @@
+//
+// detail/winrt_ssocket_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/execution_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 <typename Protocol>
+class winrt_ssocket_service :
+ public execution_context_service_base<winrt_ssocket_service<Protocol>>,
+ 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(execution_context& context)
+ : execution_context_service_base<winrt_ssocket_service<Protocol>>(context),
+ winrt_ssocket_service_base(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) noexcept
+ {
+ 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 <typename Protocol1>
+ void converting_move_construct(implementation_type& impl,
+ winrt_ssocket_service<Protocol1>&,
+ 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;
+ }
+
+ // 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;
+ }
+
+ // Set a socket option.
+ template <typename Option>
+ 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 <typename Option>
+ 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 <typename Handler, typename IoExecutor>
+ void async_connect(implementation_type& impl,
+ const endpoint_type& peer_endpoint,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef winrt_socket_connect_op<Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(handler, io_ex);
+
+ ASIO_HANDLER_CREATION((scheduler_.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/3rdparty/asio/include/asio/detail/winrt_ssocket_service_base.hpp b/3rdparty/asio/include/asio/detail/winrt_ssocket_service_base.hpp
new file mode 100644
index 00000000000..c752da80e2a
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winrt_ssocket_service_base.hpp
@@ -0,0 +1,362 @@
+//
+// detail/winrt_ssocket_service_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/execution_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"
+
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_io_context.hpp"
+#else // defined(ASIO_HAS_IOCP)
+# include "asio/detail/scheduler.hpp"
+#endif // defined(ASIO_HAS_IOCP)
+
+#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(execution_context& 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) noexcept;
+
+ // 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 <typename IO_Control_Command>
+ 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;
+ }
+
+ // Send the given data to the peer.
+ template <typename ConstBufferSequence>
+ 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<asio::const_buffer,
+ ConstBufferSequence>::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 <typename ConstBufferSequence, typename Handler, typename IoExecutor>
+ void async_send(base_implementation_type& impl,
+ const ConstBufferSequence& buffers, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef winrt_socket_send_op<ConstBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(buffers, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((scheduler_.context(),
+ *p.p, "socket", &impl, 0, "async_send"));
+
+ start_send_op(impl,
+ buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence>::first(buffers),
+ flags, p.p, is_continuation);
+ p.v = p.p = 0;
+ }
+
+ // Start an asynchronous wait until data can be sent without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_send(base_implementation_type&, const null_buffers&,
+ socket_base::message_flags, Handler& handler, const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ const std::size_t bytes_transferred = 0;
+ asio::post(io_ex,
+ detail::bind_handler(handler, ec, bytes_transferred));
+ }
+
+ // Receive some data from the peer. Returns the number of bytes received.
+ template <typename MutableBufferSequence>
+ 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<asio::mutable_buffer,
+ MutableBufferSequence>::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 <typename MutableBufferSequence,
+ typename Handler, typename IoExecutor>
+ void async_receive(base_implementation_type& impl,
+ const MutableBufferSequence& buffers, socket_base::message_flags flags,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef winrt_socket_recv_op<MutableBufferSequence, Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(buffers, handler, io_ex);
+
+ ASIO_HANDLER_CREATION((scheduler_.context(),
+ *p.p, "socket", &impl, 0, "async_receive"));
+
+ start_receive_op(impl,
+ buffer_sequence_adapter<asio::mutable_buffer,
+ MutableBufferSequence>::first(buffers),
+ flags, p.p, is_continuation);
+ p.v = p.p = 0;
+ }
+
+ // Wait until data can be received without blocking.
+ template <typename Handler, typename IoExecutor>
+ void async_receive(base_implementation_type&, const null_buffers&,
+ socket_base::message_flags, Handler& handler, const IoExecutor& io_ex)
+ {
+ asio::error_code ec = asio::error::operation_not_supported;
+ const std::size_t bytes_transferred = 0;
+ asio::post(io_ex,
+ 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<void>* 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<unsigned int>* 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<Windows::Storage::Streams::IBuffer^>* op,
+ bool is_continuation);
+
+ // The scheduler implementation used for delivering completions.
+#if defined(ASIO_HAS_IOCP)
+ typedef class win_iocp_io_context scheduler_impl;
+#else
+ typedef class scheduler scheduler_impl;
+#endif
+ scheduler_impl& scheduler_;
+
+ // 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/3rdparty/asio/include/asio/detail/winrt_timer_scheduler.hpp b/3rdparty/asio/include/asio/detail/winrt_timer_scheduler.hpp
new file mode 100644
index 00000000000..aadd581f75d
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winrt_timer_scheduler.hpp
@@ -0,0 +1,147 @@
+//
+// detail/winrt_timer_scheduler.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#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/execution_context.hpp"
+
+#if defined(ASIO_HAS_IOCP)
+# include "asio/detail/win_iocp_io_context.hpp"
+#else // defined(ASIO_HAS_IOCP)
+# include "asio/detail/scheduler.hpp"
+#endif // defined(ASIO_HAS_IOCP)
+
+#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 execution_context_service_base<winrt_timer_scheduler>
+{
+public:
+ // Constructor.
+ ASIO_DECL winrt_timer_scheduler(execution_context& 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(execution_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 <typename Time_Traits>
+ void add_timer_queue(timer_queue<Time_Traits>& queue);
+
+ // Remove a timer queue from the reactor.
+ template <typename Time_Traits>
+ void remove_timer_queue(timer_queue<Time_Traits>& queue);
+
+ // Schedule a new operation in the given timer queue to expire at the
+ // specified absolute time.
+ template <typename Time_Traits>
+ void schedule_timer(timer_queue<Time_Traits>& queue,
+ const typename Time_Traits::time_type& time,
+ typename timer_queue<Time_Traits>::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 <typename Time_Traits>
+ std::size_t cancel_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& timer,
+ std::size_t max_cancelled = (std::numeric_limits<std::size_t>::max)());
+
+ // Move the timer operations associated with the given timer.
+ template <typename Time_Traits>
+ void move_timer(timer_queue<Time_Traits>& queue,
+ typename timer_queue<Time_Traits>::per_timer_data& to,
+ typename timer_queue<Time_Traits>::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 scheduler implementation used to post completions.
+#if defined(ASIO_HAS_IOCP)
+ typedef class win_iocp_io_context scheduler_impl;
+#else
+ typedef class scheduler scheduler_impl;
+#endif
+ scheduler_impl& scheduler_;
+
+ // 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/3rdparty/asio/include/asio/detail/winrt_utils.hpp b/3rdparty/asio/include/asio/detail/winrt_utils.hpp
new file mode 100644
index 00000000000..f33786ccf8b
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winrt_utils.hpp
@@ -0,0 +1,106 @@
+//
+// detail/winrt_utils.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <codecvt>
+#include <cstdlib>
+#include <future>
+#include <locale>
+#include <robuffer.h>
+#include <windows.storage.streams.h>
+#include <wrl/implements.h>
+#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<std::codecvt_utf8<wchar_t>> converter;
+ return converter.to_bytes(from->Data());
+}
+
+inline Platform::String^ string(unsigned short from)
+{
+ return string(std::to_string(from));
+}
+
+template <typename T>
+inline Platform::String^ string(const T& from)
+{
+ return string(from.to_string());
+}
+
+inline int integer(Platform::String^ from)
+{
+ return _wtoi(from->Data());
+}
+
+template <typename T>
+inline Windows::Networking::HostName^ host_name(const T& from)
+{
+ return ref new Windows::Networking::HostName((string)(from));
+}
+
+template <typename ConstBufferSequence>
+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<IInspectable> insp = reinterpret_cast<IInspectable*>(b);
+ ComPtr<Windows::Storage::Streams::IBufferByteAccess> 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/3rdparty/asio/include/asio/detail/winsock_init.hpp b/3rdparty/asio/include/asio/detail/winsock_init.hpp
new file mode 100644
index 00000000000..7914560ab64
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/winsock_init.hpp
@@ -0,0 +1,128 @@
+//
+// detail/winsock_init.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <int Major = 2, int Minor = 2>
+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 <int Major, int Minor>
+winsock_init_base::data winsock_init<Major, Minor>::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/3rdparty/asio/include/asio/detail/work_dispatcher.hpp b/3rdparty/asio/include/asio/detail/work_dispatcher.hpp
new file mode 100644
index 00000000000..2a473e45af6
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/work_dispatcher.hpp
@@ -0,0 +1,143 @@
+//
+// detail/work_dispatcher.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/detail/bind_handler.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/associated_executor.hpp"
+#include "asio/associated_allocator.hpp"
+#include "asio/executor_work_guard.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/execution/allocator.hpp"
+#include "asio/execution/blocking.hpp"
+#include "asio/execution/outstanding_work.hpp"
+#include "asio/prefer.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Handler, typename Executor, typename = void>
+struct is_work_dispatcher_required : true_type
+{
+};
+
+template <typename Handler, typename Executor>
+struct is_work_dispatcher_required<Handler, Executor,
+ enable_if_t<
+ is_same<
+ typename associated_executor<Handler,
+ Executor>::asio_associated_executor_is_unspecialised,
+ void
+ >::value
+ >> : false_type
+{
+};
+
+template <typename Handler, typename Executor, typename = void>
+class work_dispatcher
+{
+public:
+ template <typename CompletionHandler>
+ work_dispatcher(CompletionHandler&& handler,
+ const Executor& handler_ex)
+ : handler_(static_cast<CompletionHandler&&>(handler)),
+ executor_(asio::prefer(handler_ex,
+ execution::outstanding_work.tracked))
+ {
+ }
+
+ work_dispatcher(const work_dispatcher& other)
+ : handler_(other.handler_),
+ executor_(other.executor_)
+ {
+ }
+
+ work_dispatcher(work_dispatcher&& other)
+ : handler_(static_cast<Handler&&>(other.handler_)),
+ executor_(static_cast<work_executor_type&&>(other.executor_))
+ {
+ }
+
+ void operator()()
+ {
+ associated_allocator_t<Handler> alloc((get_associated_allocator)(handler_));
+ asio::prefer(executor_, execution::allocator(alloc)).execute(
+ asio::detail::bind_handler(
+ static_cast<Handler&&>(handler_)));
+ }
+
+private:
+ typedef decay_t<
+ prefer_result_t<const Executor&,
+ execution::outstanding_work_t::tracked_t
+ >
+ > work_executor_type;
+
+ Handler handler_;
+ work_executor_type executor_;
+};
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Handler, typename Executor>
+class work_dispatcher<Handler, Executor,
+ enable_if_t<!execution::is_executor<Executor>::value>>
+{
+public:
+ template <typename CompletionHandler>
+ work_dispatcher(CompletionHandler&& handler, const Executor& handler_ex)
+ : work_(handler_ex),
+ handler_(static_cast<CompletionHandler&&>(handler))
+ {
+ }
+
+ work_dispatcher(const work_dispatcher& other)
+ : work_(other.work_),
+ handler_(other.handler_)
+ {
+ }
+
+ work_dispatcher(work_dispatcher&& other)
+ : work_(static_cast<executor_work_guard<Executor>&&>(other.work_)),
+ handler_(static_cast<Handler&&>(other.handler_))
+ {
+ }
+
+ void operator()()
+ {
+ associated_allocator_t<Handler> alloc((get_associated_allocator)(handler_));
+ work_.get_executor().dispatch(
+ asio::detail::bind_handler(
+ static_cast<Handler&&>(handler_)), alloc);
+ work_.reset();
+ }
+
+private:
+ executor_work_guard<Executor> work_;
+ Handler handler_;
+};
+
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_WORK_DISPATCHER_HPP
diff --git a/3rdparty/asio/include/asio/detail/wrapped_handler.hpp b/3rdparty/asio/include/asio/detail/wrapped_handler.hpp
new file mode 100644
index 00000000000..fce9abfab43
--- /dev/null
+++ b/3rdparty/asio/include/asio/detail/wrapped_handler.hpp
@@ -0,0 +1,217 @@
+//
+// detail/wrapped_handler.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_cont_helpers.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+struct is_continuation_delegated
+{
+ template <typename Dispatcher, typename Handler>
+ bool operator()(Dispatcher&, Handler& handler) const
+ {
+ return asio_handler_cont_helpers::is_continuation(handler);
+ }
+};
+
+struct is_continuation_if_running
+{
+ template <typename Dispatcher, typename Handler>
+ bool operator()(Dispatcher& dispatcher, Handler&) const
+ {
+ return dispatcher.running_in_this_thread();
+ }
+};
+
+template <typename Dispatcher, typename Handler,
+ typename IsContinuation = is_continuation_delegated>
+class wrapped_handler
+{
+public:
+ typedef void result_type;
+
+ wrapped_handler(Dispatcher dispatcher, Handler& handler)
+ : dispatcher_(dispatcher),
+ handler_(static_cast<Handler&&>(handler))
+ {
+ }
+
+ wrapped_handler(const wrapped_handler& other)
+ : dispatcher_(other.dispatcher_),
+ handler_(other.handler_)
+ {
+ }
+
+ wrapped_handler(wrapped_handler&& other)
+ : dispatcher_(other.dispatcher_),
+ handler_(static_cast<Handler&&>(other.handler_))
+ {
+ }
+
+ void operator()()
+ {
+ dispatcher_.dispatch(static_cast<Handler&&>(handler_));
+ }
+
+ void operator()() const
+ {
+ dispatcher_.dispatch(handler_);
+ }
+
+ template <typename Arg1>
+ void operator()(const Arg1& arg1)
+ {
+ dispatcher_.dispatch(detail::bind_handler(handler_, arg1));
+ }
+
+ template <typename Arg1>
+ void operator()(const Arg1& arg1) const
+ {
+ dispatcher_.dispatch(detail::bind_handler(handler_, arg1));
+ }
+
+ template <typename Arg1, typename Arg2>
+ void operator()(const Arg1& arg1, const Arg2& arg2)
+ {
+ dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2));
+ }
+
+ template <typename Arg1, typename Arg2>
+ void operator()(const Arg1& arg1, const Arg2& arg2) const
+ {
+ dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2));
+ }
+
+ template <typename Arg1, typename Arg2, typename Arg3>
+ void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3)
+ {
+ dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2, arg3));
+ }
+
+ template <typename Arg1, typename Arg2, typename Arg3>
+ void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) const
+ {
+ dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2, arg3));
+ }
+
+ template <typename Arg1, typename Arg2, typename Arg3, typename Arg4>
+ 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 <typename Arg1, typename Arg2, typename Arg3, typename Arg4>
+ 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 <typename Arg1, typename Arg2, typename Arg3, typename Arg4,
+ typename Arg5>
+ 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 <typename Arg1, typename Arg2, typename Arg3, typename Arg4,
+ typename Arg5>
+ 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 <typename Handler, typename Context>
+class rewrapped_handler
+{
+public:
+ explicit rewrapped_handler(Handler& handler, const Context& context)
+ : context_(context),
+ handler_(static_cast<Handler&&>(handler))
+ {
+ }
+
+ explicit rewrapped_handler(const Handler& handler, const Context& context)
+ : context_(context),
+ handler_(handler)
+ {
+ }
+
+ rewrapped_handler(const rewrapped_handler& other)
+ : context_(other.context_),
+ handler_(other.handler_)
+ {
+ }
+
+ rewrapped_handler(rewrapped_handler&& other)
+ : context_(static_cast<Context&&>(other.context_)),
+ handler_(static_cast<Handler&&>(other.handler_))
+ {
+ }
+
+ void operator()()
+ {
+ handler_();
+ }
+
+ void operator()() const
+ {
+ handler_();
+ }
+
+//private:
+ Context context_;
+ Handler handler_;
+};
+
+template <typename Dispatcher, typename Handler, typename IsContinuation>
+inline bool asio_handler_is_continuation(
+ wrapped_handler<Dispatcher, Handler, IsContinuation>* this_handler)
+{
+ return IsContinuation()(this_handler->dispatcher_, this_handler->handler_);
+}
+
+template <typename Dispatcher, typename Context>
+inline bool asio_handler_is_continuation(
+ rewrapped_handler<Dispatcher, Context>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->context_);
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DETAIL_WRAPPED_HANDLER_HPP
diff --git a/3rdparty/asio/include/asio/dispatch.hpp b/3rdparty/asio/include/asio/dispatch.hpp
new file mode 100644
index 00000000000..9eb60a4103d
--- /dev/null
+++ b/3rdparty/asio/include/asio/dispatch.hpp
@@ -0,0 +1,197 @@
+//
+// dispatch.hpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/initiate_dispatch.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/execution/executor.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 may be called from the current thread prior to
+ * returning from <tt>dispatch()</tt>. Otherwise, it is queued for execution.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler. The function signature of the completion handler must be:
+ * @code void handler(); @endcode
+ *
+ * @returns This function returns <tt>async_initiate<NullaryToken,
+ * void()>(Init{}, token)</tt>, where @c Init is a function object type defined
+ * as:
+ *
+ * @code class Init
+ * {
+ * public:
+ * template <typename CompletionHandler>
+ * void operator()(CompletionHandler&& completion_handler) const;
+ * }; @endcode
+ *
+ * The function call operator of @c Init:
+ *
+ * @li Obtains the handler's associated executor object @c ex of type @c Ex by
+ * performing @code auto ex = get_associated_executor(handler); @endcode
+ *
+ * @li Obtains the handler's associated allocator object @c alloc by performing
+ * @code auto alloc = get_associated_allocator(handler); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex>::value</tt> is true, performs
+ * @code prefer(ex, execution::allocator(alloc)).execute(
+ * std::forward<CompletionHandler>(completion_handler)); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex>::value</tt> is false, performs
+ * @code ex.dispatch(
+ * std::forward<CompletionHandler>(completion_handler),
+ * alloc); @endcode
+ *
+ * @par Completion Signature
+ * @code void() @endcode
+ */
+template <ASIO_COMPLETION_TOKEN_FOR(void()) NullaryToken>
+inline auto dispatch(NullaryToken&& token)
+ -> decltype(
+ async_initiate<NullaryToken, void()>(
+ declval<detail::initiate_dispatch>(), token))
+{
+ return async_initiate<NullaryToken, void()>(
+ detail::initiate_dispatch(), token);
+}
+
+/// Submits a completion token or function object for execution.
+/**
+ * This function submits an object for execution using the specified executor.
+ * The function object may be called from the current thread prior to returning
+ * from <tt>dispatch()</tt>. Otherwise, it is queued for execution.
+ *
+ * @param ex The target executor.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler. The function signature of the completion handler must be:
+ * @code void handler(); @endcode
+ *
+ * @returns This function returns <tt>async_initiate<NullaryToken,
+ * void()>(Init{ex}, token)</tt>, where @c Init is a function object type
+ * defined as:
+ *
+ * @code class Init
+ * {
+ * public:
+ * using executor_type = Executor;
+ * explicit Init(const Executor& ex) : ex_(ex) {}
+ * executor_type get_executor() const noexcept { return ex_; }
+ * template <typename CompletionHandler>
+ * void operator()(CompletionHandler&& completion_handler) const;
+ * private:
+ * Executor ex_; // exposition only
+ * }; @endcode
+ *
+ * The function call operator of @c Init:
+ *
+ * @li Obtains the handler's associated executor object @c ex1 of type @c Ex1 by
+ * performing @code auto ex1 = get_associated_executor(handler, ex); @endcode
+ *
+ * @li Obtains the handler's associated allocator object @c alloc by performing
+ * @code auto alloc = get_associated_allocator(handler); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex1>::value</tt> is true, constructs a
+ * function object @c f with a member @c executor_ that is initialised with
+ * <tt>prefer(ex1, execution::outstanding_work.tracked)</tt>, a member @c
+ * handler_ that is a decay-copy of @c completion_handler, and a function call
+ * operator that performs:
+ * @code auto a = get_associated_allocator(handler_);
+ * prefer(executor_, execution::allocator(a)).execute(std::move(handler_));
+ * @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex1>::value</tt> is false, constructs a
+ * function object @c f with a member @c work_ that is initialised with
+ * <tt>make_work_guard(ex1)</tt>, a member @c handler_ that is a decay-copy of
+ * @c completion_handler, and a function call operator that performs:
+ * @code auto a = get_associated_allocator(handler_);
+ * work_.get_executor().dispatch(std::move(handler_), a);
+ * work_.reset(); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex>::value</tt> is true, performs
+ * @code prefer(ex, execution::allocator(alloc)).execute(std::move(f)); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex>::value</tt> is false, performs
+ * @code ex.dispatch(std::move(f), alloc); @endcode
+ *
+ * @par Completion Signature
+ * @code void() @endcode
+ */
+template <typename Executor,
+ ASIO_COMPLETION_TOKEN_FOR(void()) NullaryToken
+ = default_completion_token_t<Executor>>
+inline auto dispatch(const Executor& ex,
+ NullaryToken&& token = default_completion_token_t<Executor>(),
+ constraint_t<
+ execution::is_executor<Executor>::value || is_executor<Executor>::value
+ > = 0)
+ -> decltype(
+ async_initiate<NullaryToken, void()>(
+ declval<detail::initiate_dispatch_with_executor<Executor>>(), token))
+{
+ return async_initiate<NullaryToken, void()>(
+ detail::initiate_dispatch_with_executor<Executor>(ex), token);
+}
+
+/// Submits a completion token or function object for execution.
+/**
+ * @param ctx An execution context, from which the target executor is obtained.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler. The function signature of the completion handler must be:
+ * @code void handler(); @endcode
+ *
+ * @returns <tt>dispatch(ctx.get_executor(),
+ * forward<NullaryToken>(token))</tt>.
+ *
+ * @par Completion Signature
+ * @code void() @endcode
+ */
+template <typename ExecutionContext,
+ ASIO_COMPLETION_TOKEN_FOR(void()) NullaryToken
+ = default_completion_token_t<typename ExecutionContext::executor_type>>
+inline auto dispatch(ExecutionContext& ctx,
+ NullaryToken&& token = default_completion_token_t<
+ typename ExecutionContext::executor_type>(),
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ -> decltype(
+ async_initiate<NullaryToken, void()>(
+ declval<detail::initiate_dispatch_with_executor<
+ typename ExecutionContext::executor_type>>(), token))
+{
+ return async_initiate<NullaryToken, void()>(
+ detail::initiate_dispatch_with_executor<
+ typename ExecutionContext::executor_type>(
+ ctx.get_executor()), token);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_DISPATCH_HPP
diff --git a/3rdparty/asio/include/asio/error.hpp b/3rdparty/asio/include/asio/error.hpp
new file mode 100644
index 00000000000..d676ee8aa7d
--- /dev/null
+++ b/3rdparty/asio/include/asio/error.hpp
@@ -0,0 +1,389 @@
+//
+// error.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <winerror.h>
+#else
+# include <cerrno>
+# include <netdb.h>
+#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
+};
+
+// boostify: non-boost code starts here
+#if !defined(ASIO_ERROR_LOCATION)
+# define ASIO_ERROR_LOCATION(e) (void)0
+#endif // !defined(ASIO_ERROR_LOCATION)
+
+// boostify: non-boost code ends here
+#if !defined(ASIO_ERROR_LOCATION) \
+ && !defined(ASIO_DISABLE_ERROR_LOCATION) \
+ && defined(ASIO_HAS_BOOST_CONFIG) \
+ && (BOOST_VERSION >= 107900)
+
+# define ASIO_ERROR_LOCATION(e) \
+ do { \
+ BOOST_STATIC_CONSTEXPR boost::source_location loc \
+ = BOOST_CURRENT_LOCATION; \
+ (e).assign((e), &loc); \
+ } while (false)
+
+#else // !defined(ASIO_ERROR_LOCATION)
+ // && !defined(ASIO_DISABLE_ERROR_LOCATION)
+ // && defined(ASIO_HAS_BOOST_CONFIG)
+ // && (BOOST_VERSION >= 107900)
+
+# define ASIO_ERROR_LOCATION(e) (void)0
+
+#endif // !defined(ASIO_ERROR_LOCATION)
+ // && !defined(ASIO_DISABLE_ERROR_LOCATION)
+ // && defined(ASIO_HAS_BOOST_CONFIG)
+ // && (BOOST_VERSION >= 107900)
+
+inline void clear(asio::error_code& ec)
+{
+ ec.assign(0, ec.category());
+}
+
+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
+
+namespace std {
+
+template<> struct is_error_code_enum<asio::error::basic_errors>
+{
+ static const bool value = true;
+};
+
+template<> struct is_error_code_enum<asio::error::netdb_errors>
+{
+ static const bool value = true;
+};
+
+template<> struct is_error_code_enum<asio::error::addrinfo_errors>
+{
+ static const bool value = true;
+};
+
+template<> struct is_error_code_enum<asio::error::misc_errors>
+{
+ static const bool value = true;
+};
+
+} // namespace std
+
+namespace asio {
+namespace error {
+
+inline asio::error_code make_error_code(basic_errors e)
+{
+ return asio::error_code(
+ static_cast<int>(e), get_system_category());
+}
+
+inline asio::error_code make_error_code(netdb_errors e)
+{
+ return asio::error_code(
+ static_cast<int>(e), get_netdb_category());
+}
+
+inline asio::error_code make_error_code(addrinfo_errors e)
+{
+ return asio::error_code(
+ static_cast<int>(e), get_addrinfo_category());
+}
+
+inline asio::error_code make_error_code(misc_errors e)
+{
+ return asio::error_code(
+ static_cast<int>(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/3rdparty/asio/include/asio/error_code.hpp b/3rdparty/asio/include/asio/error_code.hpp
new file mode 100644
index 00000000000..5cb07f48c42
--- /dev/null
+++ b/3rdparty/asio/include/asio/error_code.hpp
@@ -0,0 +1,39 @@
+//
+// error_code.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include <system_error>
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+typedef std::error_category error_category;
+typedef std::error_code error_code;
+
+/// Returns the error category used for the system errors produced by asio.
+extern ASIO_DECL const error_category& system_category();
+
+} // 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/3rdparty/asio/include/asio/execution.hpp b/3rdparty/asio/include/asio/execution.hpp
new file mode 100644
index 00000000000..fa773259fad
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution.hpp
@@ -0,0 +1,33 @@
+//
+// execution.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_HPP
+#define ASIO_EXECUTION_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/execution/allocator.hpp"
+#include "asio/execution/any_executor.hpp"
+#include "asio/execution/bad_executor.hpp"
+#include "asio/execution/blocking.hpp"
+#include "asio/execution/blocking_adaptation.hpp"
+#include "asio/execution/context.hpp"
+#include "asio/execution/context_as.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/execution/invocable_archetype.hpp"
+#include "asio/execution/mapping.hpp"
+#include "asio/execution/occupancy.hpp"
+#include "asio/execution/outstanding_work.hpp"
+#include "asio/execution/prefer_only.hpp"
+#include "asio/execution/relationship.hpp"
+
+#endif // ASIO_EXECUTION_HPP
diff --git a/3rdparty/asio/include/asio/execution/allocator.hpp b/3rdparty/asio/include/asio/execution/allocator.hpp
new file mode 100644
index 00000000000..cdb6a4a9203
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/allocator.hpp
@@ -0,0 +1,278 @@
+//
+// execution/allocator.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_ALLOCATOR_HPP
+#define ASIO_EXECUTION_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/type_traits.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/is_applicable_property.hpp"
+#include "asio/traits/query_static_constexpr_member.hpp"
+#include "asio/traits/static_query.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+/// A property to describe which allocator an executor will use to allocate the
+/// memory required to store a submitted function object.
+template <typename ProtoAllocator>
+struct allocator_t
+{
+ /// The allocator_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The allocator_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The allocator_t property can be preferred.
+ static constexpr bool is_preferable = true;
+
+ /// Default constructor.
+ constexpr allocator_t();
+
+ /// Obtain the allocator stored in the allocator_t property object.
+ /**
+ * Present only if @c ProtoAllocator is non-void.
+ */
+ constexpr ProtoAllocator value() const;
+
+ /// Create an allocator_t object with a different allocator.
+ /**
+ * Present only if @c ProtoAllocator is void.
+ */
+ template <typename OtherAllocator>
+ allocator_t<OtherAllocator operator()(const OtherAllocator& a);
+};
+
+/// A special value used for accessing the allocator_t property.
+constexpr allocator_t<void> allocator;
+
+} // namespace execution
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+template <typename ProtoAllocator>
+struct allocator_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+
+ template <typename T>
+ struct static_proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ static constexpr auto query(P&& p)
+ noexcept(
+ noexcept(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ {
+ return T::query(static_cast<P&&>(p));
+ }
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename static_proxy<T>::type, allocator_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename E, typename T = decltype(allocator_t::static_query<E>())>
+ static constexpr const T static_query_v = allocator_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ constexpr ProtoAllocator value() const
+ {
+ return a_;
+ }
+
+private:
+ friend struct allocator_t<void>;
+
+ explicit constexpr allocator_t(const ProtoAllocator& a)
+ : a_(a)
+ {
+ }
+
+ ProtoAllocator a_;
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <typename ProtoAllocator> template <typename E, typename T>
+const T allocator_t<ProtoAllocator>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <>
+struct allocator_t<void>
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+
+ constexpr allocator_t()
+ {
+ }
+
+ template <typename T>
+ struct static_proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ static constexpr auto query(P&& p)
+ noexcept(
+ noexcept(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ {
+ return T::query(static_cast<P&&>(p));
+ }
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename static_proxy<T>::type, allocator_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename E, typename T = decltype(allocator_t::static_query<E>())>
+ static constexpr const T static_query_v = allocator_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ template <typename OtherProtoAllocator>
+ constexpr allocator_t<OtherProtoAllocator> operator()(
+ const OtherProtoAllocator& a) const
+ {
+ return allocator_t<OtherProtoAllocator>(a);
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <typename E, typename T>
+const T allocator_t<void>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+constexpr allocator_t<void> allocator;
+
+} // namespace execution
+
+#if !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename ProtoAllocator>
+struct is_applicable_property<T, execution::allocator_t<ProtoAllocator>>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+#endif // !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename T, typename ProtoAllocator>
+struct static_query<T, execution::allocator_t<ProtoAllocator>,
+ enable_if_t<
+ execution::allocator_t<ProtoAllocator>::template
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::allocator_t<ProtoAllocator>::template
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::allocator_t<ProtoAllocator>::template
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace traits
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_ALLOCATOR_HPP
diff --git a/3rdparty/asio/include/asio/execution/any_executor.hpp b/3rdparty/asio/include/asio/execution/any_executor.hpp
new file mode 100644
index 00000000000..a057543b139
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/any_executor.hpp
@@ -0,0 +1,1933 @@
+//
+// execution/any_executor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_ANY_EXECUTOR_HPP
+#define ASIO_EXECUTION_ANY_EXECUTOR_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <new>
+#include <typeinfo>
+#include "asio/detail/assert.hpp"
+#include "asio/detail/atomic_count.hpp"
+#include "asio/detail/cstddef.hpp"
+#include "asio/detail/executor_function.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/scoped_ptr.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/detail/throw_exception.hpp"
+#include "asio/execution/bad_executor.hpp"
+#include "asio/execution/blocking.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/prefer.hpp"
+#include "asio/query.hpp"
+#include "asio/require.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+/// Polymorphic executor wrapper.
+template <typename... SupportableProperties>
+class any_executor
+{
+public:
+ /// Default constructor.
+ any_executor() noexcept;
+
+ /// Construct in an empty state. Equivalent effects to default constructor.
+ any_executor(nullptr_t) noexcept;
+
+ /// Copy constructor.
+ any_executor(const any_executor& e) noexcept;
+
+ /// Move constructor.
+ any_executor(any_executor&& e) noexcept;
+
+ /// Construct to point to the same target as another any_executor.
+ template <class... OtherSupportableProperties>
+ any_executor(any_executor<OtherSupportableProperties...> e);
+
+ /// Construct to point to the same target as another any_executor.
+ template <class... OtherSupportableProperties>
+ any_executor(std::nothrow_t,
+ any_executor<OtherSupportableProperties...> e) noexcept;
+
+ /// Construct to point to the same target as another any_executor.
+ any_executor(std::nothrow_t, const any_executor& e) noexcept;
+
+ /// Construct to point to the same target as another any_executor.
+ any_executor(std::nothrow_t, any_executor&& e) noexcept;
+
+ /// Construct a polymorphic wrapper for the specified executor.
+ template <typename Executor>
+ any_executor(Executor e);
+
+ /// Construct a polymorphic wrapper for the specified executor.
+ template <typename Executor>
+ any_executor(std::nothrow_t, Executor e) noexcept;
+
+ /// Assignment operator.
+ any_executor& operator=(const any_executor& e) noexcept;
+
+ /// Move assignment operator.
+ any_executor& operator=(any_executor&& e) noexcept;
+
+ /// Assignment operator that sets the polymorphic wrapper to the empty state.
+ any_executor& operator=(nullptr_t);
+
+ /// Assignment operator to create a polymorphic wrapper for the specified
+ /// executor.
+ template <typename Executor>
+ any_executor& operator=(Executor e);
+
+ /// Destructor.
+ ~any_executor();
+
+ /// Swap targets with another polymorphic wrapper.
+ void swap(any_executor& other) noexcept;
+
+ /// Obtain a polymorphic wrapper with the specified property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require and asio::prefer customisation points.
+ *
+ * For example:
+ * @code execution::any_executor<execution::blocking_t::possibly_t> ex = ...;
+ * auto ex2 = asio::requre(ex, execution::blocking.possibly); @endcode
+ */
+ template <typename Property>
+ any_executor require(Property) const;
+
+ /// Obtain a polymorphic wrapper with the specified property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::prefer customisation point.
+ *
+ * For example:
+ * @code execution::any_executor<execution::blocking_t::possibly_t> ex = ...;
+ * auto ex2 = asio::prefer(ex, execution::blocking.possibly); @endcode
+ */
+ template <typename Property>
+ any_executor prefer(Property) const;
+
+ /// Obtain the value associated with the specified property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code execution::any_executor<execution::occupancy_t> ex = ...;
+ * size_t n = asio::query(ex, execution::occupancy); @endcode
+ */
+ template <typename Property>
+ typename Property::polymorphic_query_result_type query(Property) const;
+
+ /// Execute the function on the target executor.
+ /**
+ * Throws asio::bad_executor if the polymorphic wrapper has no target.
+ */
+ template <typename Function>
+ void execute(Function&& f) const;
+
+ /// Obtain the underlying execution context.
+ /**
+ * This function is provided for backward compatibility. It is automatically
+ * defined when the @c SupportableProperties... list includes a property of
+ * type <tt>execution::context_as<U></tt>, for some type <tt>U</tt>.
+ */
+ automatically_determined context() const;
+
+ /// Determine whether the wrapper has a target executor.
+ /**
+ * @returns @c true if the polymorphic wrapper has a target executor,
+ * otherwise false.
+ */
+ explicit operator bool() const noexcept;
+
+ /// Get the type of the target executor.
+ const type_info& target_type() const noexcept;
+
+ /// Get a pointer to the target executor.
+ template <typename Executor> Executor* target() noexcept;
+
+ /// Get a pointer to the target executor.
+ template <typename Executor> const Executor* target() const noexcept;
+};
+
+/// Equality operator.
+/**
+ * @relates any_executor
+ */
+template <typename... SupportableProperties>
+bool operator==(const any_executor<SupportableProperties...>& a,
+ const any_executor<SupportableProperties...>& b) noexcept;
+
+/// Equality operator.
+/**
+ * @relates any_executor
+ */
+template <typename... SupportableProperties>
+bool operator==(const any_executor<SupportableProperties...>& a,
+ nullptr_t) noexcept;
+
+/// Equality operator.
+/**
+ * @relates any_executor
+ */
+template <typename... SupportableProperties>
+bool operator==(nullptr_t,
+ const any_executor<SupportableProperties...>& b) noexcept;
+
+/// Inequality operator.
+/**
+ * @relates any_executor
+ */
+template <typename... SupportableProperties>
+bool operator!=(const any_executor<SupportableProperties...>& a,
+ const any_executor<SupportableProperties...>& b) noexcept;
+
+/// Inequality operator.
+/**
+ * @relates any_executor
+ */
+template <typename... SupportableProperties>
+bool operator!=(const any_executor<SupportableProperties...>& a,
+ nullptr_t) noexcept;
+
+/// Inequality operator.
+/**
+ * @relates any_executor
+ */
+template <typename... SupportableProperties>
+bool operator!=(nullptr_t,
+ const any_executor<SupportableProperties...>& b) noexcept;
+
+} // namespace execution
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+#if !defined(ASIO_EXECUTION_ANY_EXECUTOR_FWD_DECL)
+#define ASIO_EXECUTION_ANY_EXECUTOR_FWD_DECL
+
+template <typename... SupportableProperties>
+class any_executor;
+
+#endif // !defined(ASIO_EXECUTION_ANY_EXECUTOR_FWD_DECL)
+
+template <typename U>
+struct context_as_t;
+
+namespace detail {
+
+// Traits used to detect whether a property is requirable or preferable, taking
+// into account that T::is_requirable or T::is_preferable may not not be well
+// formed.
+
+template <typename T, typename = void>
+struct is_requirable : false_type {};
+
+template <typename T>
+struct is_requirable<T, enable_if_t<T::is_requirable>> : true_type {};
+
+template <typename T, typename = void>
+struct is_preferable : false_type {};
+
+template <typename T>
+struct is_preferable<T, enable_if_t<T::is_preferable>> : true_type {};
+
+// Trait used to detect context_as property, for backward compatibility.
+
+template <typename T>
+struct is_context_as : false_type {};
+
+template <typename U>
+struct is_context_as<context_as_t<U>> : true_type {};
+
+// Helper template to:
+// - Check if a target can supply the supportable properties.
+// - Find the first convertible-from-T property in the list.
+
+template <std::size_t I, typename Props>
+struct supportable_properties;
+
+template <std::size_t I, typename Prop>
+struct supportable_properties<I, void(Prop)>
+{
+ template <typename T>
+ struct is_valid_target : integral_constant<bool,
+ (
+ is_requirable<Prop>::value
+ ? can_require<T, Prop>::value
+ : true
+ )
+ &&
+ (
+ is_preferable<Prop>::value
+ ? can_prefer<T, Prop>::value
+ : true
+ )
+ &&
+ (
+ !is_requirable<Prop>::value && !is_preferable<Prop>::value
+ ? can_query<T, Prop>::value
+ : true
+ )
+ >
+ {
+ };
+
+ struct found
+ {
+ static constexpr bool value = true;
+ typedef Prop type;
+ typedef typename Prop::polymorphic_query_result_type query_result_type;
+ static constexpr std::size_t index = I;
+ };
+
+ struct not_found
+ {
+ static constexpr bool value = false;
+ };
+
+ template <typename T>
+ struct find_convertible_property :
+ conditional_t<
+ is_same<T, Prop>::value || is_convertible<T, Prop>::value,
+ found,
+ not_found
+ > {};
+
+ template <typename T>
+ struct find_convertible_requirable_property :
+ conditional_t<
+ is_requirable<Prop>::value
+ && (is_same<T, Prop>::value || is_convertible<T, Prop>::value),
+ found,
+ not_found
+ > {};
+
+ template <typename T>
+ struct find_convertible_preferable_property :
+ conditional_t<
+ is_preferable<Prop>::value
+ && (is_same<T, Prop>::value || is_convertible<T, Prop>::value),
+ found,
+ not_found
+ > {};
+
+ struct find_context_as_property :
+ conditional_t<
+ is_context_as<Prop>::value,
+ found,
+ not_found
+ > {};
+};
+
+template <std::size_t I, typename Head, typename... Tail>
+struct supportable_properties<I, void(Head, Tail...)>
+{
+ template <typename T>
+ struct is_valid_target : integral_constant<bool,
+ (
+ supportable_properties<I,
+ void(Head)>::template is_valid_target<T>::value
+ &&
+ supportable_properties<I + 1,
+ void(Tail...)>::template is_valid_target<T>::value
+ )
+ >
+ {
+ };
+
+ template <typename T>
+ struct find_convertible_property :
+ conditional_t<
+ is_convertible<T, Head>::value,
+ typename supportable_properties<I, void(Head)>::found,
+ typename supportable_properties<I + 1,
+ void(Tail...)>::template find_convertible_property<T>
+ > {};
+
+ template <typename T>
+ struct find_convertible_requirable_property :
+ conditional_t<
+ is_requirable<Head>::value
+ && is_convertible<T, Head>::value,
+ typename supportable_properties<I, void(Head)>::found,
+ typename supportable_properties<I + 1,
+ void(Tail...)>::template find_convertible_requirable_property<T>
+ > {};
+
+ template <typename T>
+ struct find_convertible_preferable_property :
+ conditional_t<
+ is_preferable<Head>::value
+ && is_convertible<T, Head>::value,
+ typename supportable_properties<I, void(Head)>::found,
+ typename supportable_properties<I + 1,
+ void(Tail...)>::template find_convertible_preferable_property<T>
+ > {};
+
+ struct find_context_as_property :
+ conditional_t<
+ is_context_as<Head>::value,
+ typename supportable_properties<I, void(Head)>::found,
+ typename supportable_properties<I + 1,
+ void(Tail...)>::find_context_as_property
+ > {};
+};
+
+template <typename T, typename Props>
+struct is_valid_target_executor :
+ conditional_t<
+ is_executor<T>::value,
+ typename supportable_properties<0, Props>::template is_valid_target<T>,
+ false_type
+ >
+{
+};
+
+template <typename Props>
+struct is_valid_target_executor<int, Props> : false_type
+{
+};
+
+class shared_target_executor
+{
+public:
+ template <typename E>
+ shared_target_executor(E&& e, decay_t<E>*& target)
+ {
+ impl<decay_t<E>>* i =
+ new impl<decay_t<E>>(static_cast<E&&>(e));
+ target = &i->ex_;
+ impl_ = i;
+ }
+
+ template <typename E>
+ shared_target_executor(std::nothrow_t, E&& e, decay_t<E>*& target) noexcept
+ {
+ impl<decay_t<E>>* i =
+ new (std::nothrow) impl<decay_t<E>>(static_cast<E&&>(e));
+ target = i ? &i->ex_ : 0;
+ impl_ = i;
+ }
+
+ shared_target_executor(const shared_target_executor& other) noexcept
+ : impl_(other.impl_)
+ {
+ if (impl_)
+ asio::detail::ref_count_up(impl_->ref_count_);
+ }
+
+ shared_target_executor(shared_target_executor&& other) noexcept
+ : impl_(other.impl_)
+ {
+ other.impl_ = 0;
+ }
+
+ ~shared_target_executor()
+ {
+ if (impl_)
+ if (asio::detail::ref_count_down(impl_->ref_count_))
+ delete impl_;
+ }
+
+ void* get() const noexcept
+ {
+ return impl_ ? impl_->get() : 0;
+ }
+
+private:
+ shared_target_executor& operator=(
+ const shared_target_executor& other) = delete;
+
+ shared_target_executor& operator=(
+ shared_target_executor&& other) = delete;
+
+ struct impl_base
+ {
+ impl_base() : ref_count_(1) {}
+ virtual ~impl_base() {}
+ virtual void* get() = 0;
+ asio::detail::atomic_count ref_count_;
+ };
+
+ template <typename Executor>
+ struct impl : impl_base
+ {
+ impl(Executor ex) : ex_(static_cast<Executor&&>(ex)) {}
+ virtual void* get() { return &ex_; }
+ Executor ex_;
+ };
+
+ impl_base* impl_;
+};
+
+class any_executor_base
+{
+public:
+ any_executor_base() noexcept
+ : object_fns_(0),
+ target_(0),
+ target_fns_(0)
+ {
+ }
+
+ template <ASIO_EXECUTION_EXECUTOR Executor>
+ any_executor_base(Executor ex, false_type)
+ : target_fns_(target_fns_table<Executor>(
+ any_executor_base::query_blocking(ex,
+ can_query<const Executor&, const execution::blocking_t&>())
+ == execution::blocking.always))
+ {
+ any_executor_base::construct_object(ex,
+ integral_constant<bool,
+ sizeof(Executor) <= sizeof(object_type)
+ && alignment_of<Executor>::value <= alignment_of<object_type>::value
+ >());
+ }
+
+ template <ASIO_EXECUTION_EXECUTOR Executor>
+ any_executor_base(std::nothrow_t, Executor ex, false_type) noexcept
+ : target_fns_(target_fns_table<Executor>(
+ any_executor_base::query_blocking(ex,
+ can_query<const Executor&, const execution::blocking_t&>())
+ == execution::blocking.always))
+ {
+ any_executor_base::construct_object(std::nothrow, ex,
+ integral_constant<bool,
+ sizeof(Executor) <= sizeof(object_type)
+ && alignment_of<Executor>::value <= alignment_of<object_type>::value
+ >());
+ if (target_ == 0)
+ {
+ object_fns_ = 0;
+ target_fns_ = 0;
+ }
+ }
+
+ template <ASIO_EXECUTION_EXECUTOR Executor>
+ any_executor_base(Executor other, true_type)
+ : object_fns_(object_fns_table<shared_target_executor>()),
+ target_fns_(other.target_fns_)
+ {
+ Executor* p = 0;
+ new (&object_) shared_target_executor(
+ static_cast<Executor&&>(other), p);
+ target_ = p->template target<void>();
+ }
+
+ template <ASIO_EXECUTION_EXECUTOR Executor>
+ any_executor_base(std::nothrow_t,
+ Executor other, true_type) noexcept
+ : object_fns_(object_fns_table<shared_target_executor>()),
+ target_fns_(other.target_fns_)
+ {
+ Executor* p = 0;
+ new (&object_) shared_target_executor(
+ std::nothrow, static_cast<Executor&&>(other), p);
+ if (p)
+ target_ = p->template target<void>();
+ else
+ {
+ target_ = 0;
+ object_fns_ = 0;
+ target_fns_ = 0;
+ }
+ }
+
+ any_executor_base(const any_executor_base& other) noexcept
+ {
+ if (!!other)
+ {
+ object_fns_ = other.object_fns_;
+ target_fns_ = other.target_fns_;
+ object_fns_->copy(*this, other);
+ }
+ else
+ {
+ object_fns_ = 0;
+ target_ = 0;
+ target_fns_ = 0;
+ }
+ }
+
+ ~any_executor_base() noexcept
+ {
+ if (!!*this)
+ object_fns_->destroy(*this);
+ }
+
+ any_executor_base& operator=(
+ const any_executor_base& other) noexcept
+ {
+ if (this != &other)
+ {
+ if (!!*this)
+ object_fns_->destroy(*this);
+ if (!!other)
+ {
+ object_fns_ = other.object_fns_;
+ target_fns_ = other.target_fns_;
+ object_fns_->copy(*this, other);
+ }
+ else
+ {
+ object_fns_ = 0;
+ target_ = 0;
+ target_fns_ = 0;
+ }
+ }
+ return *this;
+ }
+
+ any_executor_base& operator=(nullptr_t) noexcept
+ {
+ if (target_)
+ object_fns_->destroy(*this);
+ target_ = 0;
+ object_fns_ = 0;
+ target_fns_ = 0;
+ return *this;
+ }
+
+ any_executor_base(any_executor_base&& other) noexcept
+ {
+ if (other.target_)
+ {
+ object_fns_ = other.object_fns_;
+ target_fns_ = other.target_fns_;
+ other.object_fns_ = 0;
+ other.target_fns_ = 0;
+ object_fns_->move(*this, other);
+ other.target_ = 0;
+ }
+ else
+ {
+ object_fns_ = 0;
+ target_ = 0;
+ target_fns_ = 0;
+ }
+ }
+
+ any_executor_base& operator=(
+ any_executor_base&& other) noexcept
+ {
+ if (this != &other)
+ {
+ if (!!*this)
+ object_fns_->destroy(*this);
+ if (!!other)
+ {
+ object_fns_ = other.object_fns_;
+ target_fns_ = other.target_fns_;
+ other.object_fns_ = 0;
+ other.target_fns_ = 0;
+ object_fns_->move(*this, other);
+ other.target_ = 0;
+ }
+ else
+ {
+ object_fns_ = 0;
+ target_ = 0;
+ target_fns_ = 0;
+ }
+ }
+ return *this;
+ }
+
+ void swap(any_executor_base& other) noexcept
+ {
+ if (this != &other)
+ {
+ any_executor_base tmp(static_cast<any_executor_base&&>(other));
+ other = static_cast<any_executor_base&&>(*this);
+ *this = static_cast<any_executor_base&&>(tmp);
+ }
+ }
+
+ template <typename F>
+ void execute(F&& f) const
+ {
+ if (target_)
+ {
+ if (target_fns_->blocking_execute != 0)
+ {
+ asio::detail::non_const_lvalue<F> f2(f);
+ target_fns_->blocking_execute(*this, function_view(f2.value));
+ }
+ else
+ {
+ target_fns_->execute(*this,
+ function(static_cast<F&&>(f), std::allocator<void>()));
+ }
+ }
+ else
+ {
+ bad_executor ex;
+ asio::detail::throw_exception(ex);
+ }
+ }
+
+ template <typename Executor>
+ Executor* target()
+ {
+ return target_ && (is_same<Executor, void>::value
+ || target_fns_->target_type() == target_type_ex<Executor>())
+ ? static_cast<Executor*>(target_) : 0;
+ }
+
+ template <typename Executor>
+ const Executor* target() const
+ {
+ return target_ && (is_same<Executor, void>::value
+ || target_fns_->target_type() == target_type_ex<Executor>())
+ ? static_cast<const Executor*>(target_) : 0;
+ }
+
+#if !defined(ASIO_NO_TYPEID)
+ const std::type_info& target_type() const
+ {
+ return target_ ? target_fns_->target_type() : typeid(void);
+ }
+#else // !defined(ASIO_NO_TYPEID)
+ const void* target_type() const
+ {
+ return target_ ? target_fns_->target_type() : 0;
+ }
+#endif // !defined(ASIO_NO_TYPEID)
+
+ struct unspecified_bool_type_t {};
+ typedef void (*unspecified_bool_type)(unspecified_bool_type_t);
+ static void unspecified_bool_true(unspecified_bool_type_t) {}
+
+ operator unspecified_bool_type() const noexcept
+ {
+ return target_ ? &any_executor_base::unspecified_bool_true : 0;
+ }
+
+ bool operator!() const noexcept
+ {
+ return target_ == 0;
+ }
+
+protected:
+ bool equality_helper(const any_executor_base& other) const noexcept
+ {
+ if (target_ == other.target_)
+ return true;
+ if (target_ && !other.target_)
+ return false;
+ if (!target_ && other.target_)
+ return false;
+ if (target_fns_ != other.target_fns_)
+ return false;
+ return target_fns_->equal(*this, other);
+ }
+
+ template <typename Ex>
+ Ex& object()
+ {
+ return *static_cast<Ex*>(static_cast<void*>(&object_));
+ }
+
+ template <typename Ex>
+ const Ex& object() const
+ {
+ return *static_cast<const Ex*>(static_cast<const void*>(&object_));
+ }
+
+ struct object_fns
+ {
+ void (*destroy)(any_executor_base&);
+ void (*copy)(any_executor_base&, const any_executor_base&);
+ void (*move)(any_executor_base&, any_executor_base&);
+ const void* (*target)(const any_executor_base&);
+ };
+
+ static void destroy_shared(any_executor_base& ex)
+ {
+ typedef shared_target_executor type;
+ ex.object<type>().~type();
+ }
+
+ static void copy_shared(any_executor_base& ex1, const any_executor_base& ex2)
+ {
+ typedef shared_target_executor type;
+ new (&ex1.object_) type(ex2.object<type>());
+ ex1.target_ = ex2.target_;
+ }
+
+ static void move_shared(any_executor_base& ex1, any_executor_base& ex2)
+ {
+ typedef shared_target_executor type;
+ new (&ex1.object_) type(static_cast<type&&>(ex2.object<type>()));
+ ex1.target_ = ex2.target_;
+ ex2.object<type>().~type();
+ }
+
+ static const void* target_shared(const any_executor_base& ex)
+ {
+ typedef shared_target_executor type;
+ return ex.object<type>().get();
+ }
+
+ template <typename Obj>
+ static const object_fns* object_fns_table(
+ enable_if_t<
+ is_same<Obj, shared_target_executor>::value
+ >* = 0)
+ {
+ static const object_fns fns =
+ {
+ &any_executor_base::destroy_shared,
+ &any_executor_base::copy_shared,
+ &any_executor_base::move_shared,
+ &any_executor_base::target_shared
+ };
+ return &fns;
+ }
+
+ template <typename Obj>
+ static void destroy_object(any_executor_base& ex)
+ {
+ ex.object<Obj>().~Obj();
+ }
+
+ template <typename Obj>
+ static void copy_object(any_executor_base& ex1, const any_executor_base& ex2)
+ {
+ new (&ex1.object_) Obj(ex2.object<Obj>());
+ ex1.target_ = &ex1.object<Obj>();
+ }
+
+ template <typename Obj>
+ static void move_object(any_executor_base& ex1, any_executor_base& ex2)
+ {
+ new (&ex1.object_) Obj(static_cast<Obj&&>(ex2.object<Obj>()));
+ ex1.target_ = &ex1.object<Obj>();
+ ex2.object<Obj>().~Obj();
+ }
+
+ template <typename Obj>
+ static const void* target_object(const any_executor_base& ex)
+ {
+ return &ex.object<Obj>();
+ }
+
+ template <typename Obj>
+ static const object_fns* object_fns_table(
+ enable_if_t<
+ !is_same<Obj, void>::value
+ && !is_same<Obj, shared_target_executor>::value
+ >* = 0)
+ {
+ static const object_fns fns =
+ {
+ &any_executor_base::destroy_object<Obj>,
+ &any_executor_base::copy_object<Obj>,
+ &any_executor_base::move_object<Obj>,
+ &any_executor_base::target_object<Obj>
+ };
+ return &fns;
+ }
+
+ typedef asio::detail::executor_function function;
+ typedef asio::detail::executor_function_view function_view;
+
+ struct target_fns
+ {
+#if !defined(ASIO_NO_TYPEID)
+ const std::type_info& (*target_type)();
+#else // !defined(ASIO_NO_TYPEID)
+ const void* (*target_type)();
+#endif // !defined(ASIO_NO_TYPEID)
+ bool (*equal)(const any_executor_base&, const any_executor_base&);
+ void (*execute)(const any_executor_base&, function&&);
+ void (*blocking_execute)(const any_executor_base&, function_view);
+ };
+
+#if !defined(ASIO_NO_TYPEID)
+ template <typename Ex>
+ static const std::type_info& target_type_ex()
+ {
+ return typeid(Ex);
+ }
+#else // !defined(ASIO_NO_TYPEID)
+ template <typename Ex>
+ static const void* target_type_ex()
+ {
+ static int unique_id;
+ return &unique_id;
+ }
+#endif // !defined(ASIO_NO_TYPEID)
+
+ template <typename Ex>
+ static bool equal_ex(const any_executor_base& ex1,
+ const any_executor_base& ex2)
+ {
+ const Ex* p1 = ex1.target<Ex>();
+ const Ex* p2 = ex2.target<Ex>();
+ ASIO_ASSUME(p1 != 0 && p2 != 0);
+ return *p1 == *p2;
+ }
+
+ template <typename Ex>
+ static void execute_ex(const any_executor_base& ex, function&& f)
+ {
+ const Ex* p = ex.target<Ex>();
+ ASIO_ASSUME(p != 0);
+ p->execute(static_cast<function&&>(f));
+ }
+
+ template <typename Ex>
+ static void blocking_execute_ex(const any_executor_base& ex, function_view f)
+ {
+ const Ex* p = ex.target<Ex>();
+ ASIO_ASSUME(p != 0);
+ p->execute(f);
+ }
+
+ template <typename Ex>
+ static const target_fns* target_fns_table(bool is_always_blocking,
+ enable_if_t<
+ !is_same<Ex, void>::value
+ >* = 0)
+ {
+ static const target_fns fns_with_execute =
+ {
+ &any_executor_base::target_type_ex<Ex>,
+ &any_executor_base::equal_ex<Ex>,
+ &any_executor_base::execute_ex<Ex>,
+ 0
+ };
+
+ static const target_fns fns_with_blocking_execute =
+ {
+ &any_executor_base::target_type_ex<Ex>,
+ &any_executor_base::equal_ex<Ex>,
+ 0,
+ &any_executor_base::blocking_execute_ex<Ex>
+ };
+
+ return is_always_blocking ? &fns_with_blocking_execute : &fns_with_execute;
+ }
+
+#if defined(ASIO_MSVC)
+# pragma warning (push)
+# pragma warning (disable:4702)
+#endif // defined(ASIO_MSVC)
+
+ static void query_fn_void(void*, const void*, const void*)
+ {
+ bad_executor ex;
+ asio::detail::throw_exception(ex);
+ }
+
+ template <typename Ex, class Prop>
+ static void query_fn_non_void(void*, const void* ex, const void* prop,
+ enable_if_t<
+ asio::can_query<const Ex&, const Prop&>::value
+ && is_same<typename Prop::polymorphic_query_result_type, void>::value
+ >*)
+ {
+ asio::query(*static_cast<const Ex*>(ex),
+ *static_cast<const Prop*>(prop));
+ }
+
+ template <typename Ex, class Prop>
+ static void query_fn_non_void(void*, const void*, const void*,
+ enable_if_t<
+ !asio::can_query<const Ex&, const Prop&>::value
+ && is_same<typename Prop::polymorphic_query_result_type, void>::value
+ >*)
+ {
+ }
+
+ template <typename Ex, class Prop>
+ static void query_fn_non_void(void* result, const void* ex, const void* prop,
+ enable_if_t<
+ asio::can_query<const Ex&, const Prop&>::value
+ && !is_same<typename Prop::polymorphic_query_result_type, void>::value
+ && is_reference<typename Prop::polymorphic_query_result_type>::value
+ >*)
+ {
+ *static_cast<remove_reference_t<
+ typename Prop::polymorphic_query_result_type>**>(result)
+ = &static_cast<typename Prop::polymorphic_query_result_type>(
+ asio::query(*static_cast<const Ex*>(ex),
+ *static_cast<const Prop*>(prop)));
+ }
+
+ template <typename Ex, class Prop>
+ static void query_fn_non_void(void*, const void*, const void*,
+ enable_if_t<
+ !asio::can_query<const Ex&, const Prop&>::value
+ && !is_same<typename Prop::polymorphic_query_result_type, void>::value
+ && is_reference<typename Prop::polymorphic_query_result_type>::value
+ >*)
+ {
+ std::terminate(); // Combination should not be possible.
+ }
+
+ template <typename Ex, class Prop>
+ static void query_fn_non_void(void* result, const void* ex, const void* prop,
+ enable_if_t<
+ asio::can_query<const Ex&, const Prop&>::value
+ && !is_same<typename Prop::polymorphic_query_result_type, void>::value
+ && is_scalar<typename Prop::polymorphic_query_result_type>::value
+ >*)
+ {
+ *static_cast<typename Prop::polymorphic_query_result_type*>(result)
+ = static_cast<typename Prop::polymorphic_query_result_type>(
+ asio::query(*static_cast<const Ex*>(ex),
+ *static_cast<const Prop*>(prop)));
+ }
+
+ template <typename Ex, class Prop>
+ static void query_fn_non_void(void* result, const void*, const void*,
+ enable_if_t<
+ !asio::can_query<const Ex&, const Prop&>::value
+ && !is_same<typename Prop::polymorphic_query_result_type, void>::value
+ && is_scalar<typename Prop::polymorphic_query_result_type>::value
+ >*)
+ {
+ *static_cast<typename Prop::polymorphic_query_result_type*>(result)
+ = typename Prop::polymorphic_query_result_type();
+ }
+
+ template <typename Ex, class Prop>
+ static void query_fn_non_void(void* result, const void* ex, const void* prop,
+ enable_if_t<
+ asio::can_query<const Ex&, const Prop&>::value
+ && !is_same<typename Prop::polymorphic_query_result_type, void>::value
+ && !is_reference<typename Prop::polymorphic_query_result_type>::value
+ && !is_scalar<typename Prop::polymorphic_query_result_type>::value
+ >*)
+ {
+ *static_cast<typename Prop::polymorphic_query_result_type**>(result)
+ = new typename Prop::polymorphic_query_result_type(
+ asio::query(*static_cast<const Ex*>(ex),
+ *static_cast<const Prop*>(prop)));
+ }
+
+ template <typename Ex, class Prop>
+ static void query_fn_non_void(void* result, const void*, const void*, ...)
+ {
+ *static_cast<typename Prop::polymorphic_query_result_type**>(result)
+ = new typename Prop::polymorphic_query_result_type();
+ }
+
+ template <typename Ex, class Prop>
+ static void query_fn_impl(void* result, const void* ex, const void* prop,
+ enable_if_t<
+ is_same<Ex, void>::value
+ >*)
+ {
+ query_fn_void(result, ex, prop);
+ }
+
+ template <typename Ex, class Prop>
+ static void query_fn_impl(void* result, const void* ex, const void* prop,
+ enable_if_t<
+ !is_same<Ex, void>::value
+ >*)
+ {
+ query_fn_non_void<Ex, Prop>(result, ex, prop, 0);
+ }
+
+ template <typename Ex, class Prop>
+ static void query_fn(void* result, const void* ex, const void* prop)
+ {
+ query_fn_impl<Ex, Prop>(result, ex, prop, 0);
+ }
+
+ template <typename Poly, typename Ex, class Prop>
+ static Poly require_fn_impl(const void*, const void*,
+ enable_if_t<
+ is_same<Ex, void>::value
+ >*)
+ {
+ bad_executor ex;
+ asio::detail::throw_exception(ex);
+ return Poly();
+ }
+
+ template <typename Poly, typename Ex, class Prop>
+ static Poly require_fn_impl(const void* ex, const void* prop,
+ enable_if_t<
+ !is_same<Ex, void>::value && Prop::is_requirable
+ >*)
+ {
+ return asio::require(*static_cast<const Ex*>(ex),
+ *static_cast<const Prop*>(prop));
+ }
+
+ template <typename Poly, typename Ex, class Prop>
+ static Poly require_fn_impl(const void*, const void*, ...)
+ {
+ return Poly();
+ }
+
+ template <typename Poly, typename Ex, class Prop>
+ static Poly require_fn(const void* ex, const void* prop)
+ {
+ return require_fn_impl<Poly, Ex, Prop>(ex, prop, 0);
+ }
+
+ template <typename Poly, typename Ex, class Prop>
+ static Poly prefer_fn_impl(const void*, const void*,
+ enable_if_t<
+ is_same<Ex, void>::value
+ >*)
+ {
+ bad_executor ex;
+ asio::detail::throw_exception(ex);
+ return Poly();
+ }
+
+ template <typename Poly, typename Ex, class Prop>
+ static Poly prefer_fn_impl(const void* ex, const void* prop,
+ enable_if_t<
+ !is_same<Ex, void>::value && Prop::is_preferable
+ >*)
+ {
+ return asio::prefer(*static_cast<const Ex*>(ex),
+ *static_cast<const Prop*>(prop));
+ }
+
+ template <typename Poly, typename Ex, class Prop>
+ static Poly prefer_fn_impl(const void*, const void*, ...)
+ {
+ return Poly();
+ }
+
+ template <typename Poly, typename Ex, class Prop>
+ static Poly prefer_fn(const void* ex, const void* prop)
+ {
+ return prefer_fn_impl<Poly, Ex, Prop>(ex, prop, 0);
+ }
+
+ template <typename Poly>
+ struct prop_fns
+ {
+ void (*query)(void*, const void*, const void*);
+ Poly (*require)(const void*, const void*);
+ Poly (*prefer)(const void*, const void*);
+ };
+
+#if defined(ASIO_MSVC)
+# pragma warning (pop)
+#endif // defined(ASIO_MSVC)
+
+private:
+ template <typename Executor>
+ static execution::blocking_t query_blocking(const Executor& ex, true_type)
+ {
+ return asio::query(ex, execution::blocking);
+ }
+
+ template <typename Executor>
+ static execution::blocking_t query_blocking(const Executor&, false_type)
+ {
+ return execution::blocking_t();
+ }
+
+ template <typename Executor>
+ void construct_object(Executor& ex, true_type)
+ {
+ object_fns_ = object_fns_table<Executor>();
+ target_ = new (&object_) Executor(static_cast<Executor&&>(ex));
+ }
+
+ template <typename Executor>
+ void construct_object(Executor& ex, false_type)
+ {
+ object_fns_ = object_fns_table<shared_target_executor>();
+ Executor* p = 0;
+ new (&object_) shared_target_executor(
+ static_cast<Executor&&>(ex), p);
+ target_ = p;
+ }
+
+ template <typename Executor>
+ void construct_object(std::nothrow_t,
+ Executor& ex, true_type) noexcept
+ {
+ object_fns_ = object_fns_table<Executor>();
+ target_ = new (&object_) Executor(static_cast<Executor&&>(ex));
+ }
+
+ template <typename Executor>
+ void construct_object(std::nothrow_t,
+ Executor& ex, false_type) noexcept
+ {
+ object_fns_ = object_fns_table<shared_target_executor>();
+ Executor* p = 0;
+ new (&object_) shared_target_executor(
+ std::nothrow, static_cast<Executor&&>(ex), p);
+ target_ = p;
+ }
+
+/*private:*/public:
+// template <typename...> friend class any_executor;
+
+ typedef aligned_storage<
+ sizeof(asio::detail::shared_ptr<void>) + sizeof(void*),
+ alignment_of<asio::detail::shared_ptr<void>>::value
+ >::type object_type;
+
+ object_type object_;
+ const object_fns* object_fns_;
+ void* target_;
+ const target_fns* target_fns_;
+};
+
+template <typename Derived, typename Property, typename = void>
+struct any_executor_context
+{
+};
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Derived, typename Property>
+struct any_executor_context<Derived, Property, enable_if_t<Property::value>>
+{
+ typename Property::query_result_type context() const
+ {
+ return static_cast<const Derived*>(this)->query(typename Property::type());
+ }
+};
+
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+} // namespace detail
+
+template <>
+class any_executor<> : public detail::any_executor_base
+{
+public:
+ any_executor() noexcept
+ : detail::any_executor_base()
+ {
+ }
+
+ any_executor(nullptr_t) noexcept
+ : detail::any_executor_base()
+ {
+ }
+
+ template <typename Executor>
+ any_executor(Executor ex,
+ enable_if_t<
+ conditional_t<
+ !is_same<Executor, any_executor>::value
+ && !is_base_of<detail::any_executor_base, Executor>::value,
+ is_executor<Executor>,
+ false_type
+ >::value
+ >* = 0)
+ : detail::any_executor_base(
+ static_cast<Executor&&>(ex), false_type())
+ {
+ }
+
+ template <typename Executor>
+ any_executor(std::nothrow_t, Executor ex,
+ enable_if_t<
+ conditional_t<
+ !is_same<Executor, any_executor>::value
+ && !is_base_of<detail::any_executor_base, Executor>::value,
+ is_executor<Executor>,
+ false_type
+ >::value
+ >* = 0) noexcept
+ : detail::any_executor_base(std::nothrow,
+ static_cast<Executor&&>(ex), false_type())
+ {
+ }
+
+ template <typename... OtherSupportableProperties>
+ any_executor(any_executor<OtherSupportableProperties...> other)
+ : detail::any_executor_base(
+ static_cast<const detail::any_executor_base&>(other))
+ {
+ }
+
+ template <typename... OtherSupportableProperties>
+ any_executor(std::nothrow_t,
+ any_executor<OtherSupportableProperties...> other) noexcept
+ : detail::any_executor_base(
+ static_cast<const detail::any_executor_base&>(other))
+ {
+ }
+
+ any_executor(const any_executor& other) noexcept
+ : detail::any_executor_base(
+ static_cast<const detail::any_executor_base&>(other))
+ {
+ }
+
+ any_executor(std::nothrow_t, const any_executor& other) noexcept
+ : detail::any_executor_base(
+ static_cast<const detail::any_executor_base&>(other))
+ {
+ }
+
+ any_executor& operator=(const any_executor& other) noexcept
+ {
+ if (this != &other)
+ {
+ detail::any_executor_base::operator=(
+ static_cast<const detail::any_executor_base&>(other));
+ }
+ return *this;
+ }
+
+ any_executor& operator=(nullptr_t p) noexcept
+ {
+ detail::any_executor_base::operator=(p);
+ return *this;
+ }
+
+ any_executor(any_executor&& other) noexcept
+ : detail::any_executor_base(
+ static_cast<any_executor_base&&>(
+ static_cast<any_executor_base&>(other)))
+ {
+ }
+
+ any_executor(std::nothrow_t, any_executor&& other) noexcept
+ : detail::any_executor_base(
+ static_cast<any_executor_base&&>(
+ static_cast<any_executor_base&>(other)))
+ {
+ }
+
+ any_executor& operator=(any_executor&& other) noexcept
+ {
+ if (this != &other)
+ {
+ detail::any_executor_base::operator=(
+ static_cast<detail::any_executor_base&&>(
+ static_cast<detail::any_executor_base&>(other)));
+ }
+ return *this;
+ }
+
+ void swap(any_executor& other) noexcept
+ {
+ detail::any_executor_base::swap(
+ static_cast<detail::any_executor_base&>(other));
+ }
+
+ using detail::any_executor_base::execute;
+ using detail::any_executor_base::target;
+ using detail::any_executor_base::target_type;
+ using detail::any_executor_base::operator unspecified_bool_type;
+ using detail::any_executor_base::operator!;
+
+ bool equality_helper(const any_executor& other) const noexcept
+ {
+ return any_executor_base::equality_helper(other);
+ }
+
+ template <typename AnyExecutor1, typename AnyExecutor2>
+ friend enable_if_t<
+ is_base_of<any_executor, AnyExecutor1>::value
+ || is_base_of<any_executor, AnyExecutor2>::value,
+ bool
+ > operator==(const AnyExecutor1& a,
+ const AnyExecutor2& b) noexcept
+ {
+ return static_cast<const any_executor&>(a).equality_helper(b);
+ }
+
+ template <typename AnyExecutor>
+ friend enable_if_t<
+ is_same<AnyExecutor, any_executor>::value,
+ bool
+ > operator==(const AnyExecutor& a, nullptr_t) noexcept
+ {
+ return !a;
+ }
+
+ template <typename AnyExecutor>
+ friend enable_if_t<
+ is_same<AnyExecutor, any_executor>::value,
+ bool
+ > operator==(nullptr_t, const AnyExecutor& b) noexcept
+ {
+ return !b;
+ }
+
+ template <typename AnyExecutor1, typename AnyExecutor2>
+ friend enable_if_t<
+ is_base_of<any_executor, AnyExecutor1>::value
+ || is_base_of<any_executor, AnyExecutor2>::value,
+ bool
+ > operator!=(const AnyExecutor1& a,
+ const AnyExecutor2& b) noexcept
+ {
+ return !static_cast<const any_executor&>(a).equality_helper(b);
+ }
+
+ template <typename AnyExecutor>
+ friend enable_if_t<
+ is_same<AnyExecutor, any_executor>::value,
+ bool
+ > operator!=(const AnyExecutor& a, nullptr_t) noexcept
+ {
+ return !!a;
+ }
+
+ template <typename AnyExecutor>
+ friend enable_if_t<
+ is_same<AnyExecutor, any_executor>::value,
+ bool
+ > operator!=(nullptr_t, const AnyExecutor& b) noexcept
+ {
+ return !!b;
+ }
+};
+
+inline void swap(any_executor<>& a, any_executor<>& b) noexcept
+{
+ return a.swap(b);
+}
+
+template <typename... SupportableProperties>
+class any_executor :
+ public detail::any_executor_base,
+ public detail::any_executor_context<
+ any_executor<SupportableProperties...>,
+ typename detail::supportable_properties<
+ 0, void(SupportableProperties...)>::find_context_as_property>
+{
+public:
+ any_executor() noexcept
+ : detail::any_executor_base(),
+ prop_fns_(prop_fns_table<void>())
+ {
+ }
+
+ any_executor(nullptr_t) noexcept
+ : detail::any_executor_base(),
+ prop_fns_(prop_fns_table<void>())
+ {
+ }
+
+ template <typename Executor>
+ any_executor(Executor ex,
+ enable_if_t<
+ conditional_t<
+ !is_same<Executor, any_executor>::value
+ && !is_base_of<detail::any_executor_base, Executor>::value,
+ detail::is_valid_target_executor<
+ Executor, void(SupportableProperties...)>,
+ false_type
+ >::value
+ >* = 0)
+ : detail::any_executor_base(
+ static_cast<Executor&&>(ex), false_type()),
+ prop_fns_(prop_fns_table<Executor>())
+ {
+ }
+
+ template <typename Executor>
+ any_executor(std::nothrow_t, Executor ex,
+ enable_if_t<
+ conditional_t<
+ !is_same<Executor, any_executor>::value
+ && !is_base_of<detail::any_executor_base, Executor>::value,
+ detail::is_valid_target_executor<
+ Executor, void(SupportableProperties...)>,
+ false_type
+ >::value
+ >* = 0) noexcept
+ : detail::any_executor_base(std::nothrow,
+ static_cast<Executor&&>(ex), false_type()),
+ prop_fns_(prop_fns_table<Executor>())
+ {
+ if (this->template target<void>() == 0)
+ prop_fns_ = prop_fns_table<void>();
+ }
+
+ template <typename... OtherSupportableProperties>
+ any_executor(any_executor<OtherSupportableProperties...> other,
+ enable_if_t<
+ conditional_t<
+ !is_same<
+ any_executor<OtherSupportableProperties...>,
+ any_executor
+ >::value,
+ typename detail::supportable_properties<
+ 0, void(SupportableProperties...)>::template is_valid_target<
+ any_executor<OtherSupportableProperties...>>,
+ false_type
+ >::value
+ >* = 0)
+ : detail::any_executor_base(
+ static_cast<any_executor<OtherSupportableProperties...>&&>(other),
+ true_type()),
+ prop_fns_(prop_fns_table<any_executor<OtherSupportableProperties...>>())
+ {
+ }
+
+ template <typename... OtherSupportableProperties>
+ any_executor(std::nothrow_t,
+ any_executor<OtherSupportableProperties...> other,
+ enable_if_t<
+ conditional_t<
+ !is_same<
+ any_executor<OtherSupportableProperties...>,
+ any_executor
+ >::value,
+ typename detail::supportable_properties<
+ 0, void(SupportableProperties...)>::template is_valid_target<
+ any_executor<OtherSupportableProperties...>>,
+ false_type
+ >::value
+ >* = 0) noexcept
+ : detail::any_executor_base(std::nothrow,
+ static_cast<any_executor<OtherSupportableProperties...>&&>(other),
+ true_type()),
+ prop_fns_(prop_fns_table<any_executor<OtherSupportableProperties...>>())
+ {
+ if (this->template target<void>() == 0)
+ prop_fns_ = prop_fns_table<void>();
+ }
+
+ any_executor(const any_executor& other) noexcept
+ : detail::any_executor_base(
+ static_cast<const detail::any_executor_base&>(other)),
+ prop_fns_(other.prop_fns_)
+ {
+ }
+
+ any_executor(std::nothrow_t, const any_executor& other) noexcept
+ : detail::any_executor_base(
+ static_cast<const detail::any_executor_base&>(other)),
+ prop_fns_(other.prop_fns_)
+ {
+ }
+
+ any_executor& operator=(const any_executor& other) noexcept
+ {
+ if (this != &other)
+ {
+ prop_fns_ = other.prop_fns_;
+ detail::any_executor_base::operator=(
+ static_cast<const detail::any_executor_base&>(other));
+ }
+ return *this;
+ }
+
+ any_executor& operator=(nullptr_t p) noexcept
+ {
+ prop_fns_ = prop_fns_table<void>();
+ detail::any_executor_base::operator=(p);
+ return *this;
+ }
+
+ any_executor(any_executor&& other) noexcept
+ : detail::any_executor_base(
+ static_cast<any_executor_base&&>(
+ static_cast<any_executor_base&>(other))),
+ prop_fns_(other.prop_fns_)
+ {
+ other.prop_fns_ = prop_fns_table<void>();
+ }
+
+ any_executor(std::nothrow_t, any_executor&& other) noexcept
+ : detail::any_executor_base(
+ static_cast<any_executor_base&&>(
+ static_cast<any_executor_base&>(other))),
+ prop_fns_(other.prop_fns_)
+ {
+ other.prop_fns_ = prop_fns_table<void>();
+ }
+
+ any_executor& operator=(any_executor&& other) noexcept
+ {
+ if (this != &other)
+ {
+ prop_fns_ = other.prop_fns_;
+ detail::any_executor_base::operator=(
+ static_cast<detail::any_executor_base&&>(
+ static_cast<detail::any_executor_base&>(other)));
+ }
+ return *this;
+ }
+
+ void swap(any_executor& other) noexcept
+ {
+ if (this != &other)
+ {
+ detail::any_executor_base::swap(
+ static_cast<detail::any_executor_base&>(other));
+ const prop_fns<any_executor>* tmp_prop_fns = other.prop_fns_;
+ other.prop_fns_ = prop_fns_;
+ prop_fns_ = tmp_prop_fns;
+ }
+ }
+
+ using detail::any_executor_base::execute;
+ using detail::any_executor_base::target;
+ using detail::any_executor_base::target_type;
+ using detail::any_executor_base::operator unspecified_bool_type;
+ using detail::any_executor_base::operator!;
+
+ bool equality_helper(const any_executor& other) const noexcept
+ {
+ return any_executor_base::equality_helper(other);
+ }
+
+ template <typename AnyExecutor1, typename AnyExecutor2>
+ friend enable_if_t<
+ is_base_of<any_executor, AnyExecutor1>::value
+ || is_base_of<any_executor, AnyExecutor2>::value,
+ bool
+ > operator==(const AnyExecutor1& a,
+ const AnyExecutor2& b) noexcept
+ {
+ return static_cast<const any_executor&>(a).equality_helper(b);
+ }
+
+ template <typename AnyExecutor>
+ friend enable_if_t<
+ is_same<AnyExecutor, any_executor>::value,
+ bool
+ > operator==(const AnyExecutor& a, nullptr_t) noexcept
+ {
+ return !a;
+ }
+
+ template <typename AnyExecutor>
+ friend enable_if_t<
+ is_same<AnyExecutor, any_executor>::value,
+ bool
+ > operator==(nullptr_t, const AnyExecutor& b) noexcept
+ {
+ return !b;
+ }
+
+ template <typename AnyExecutor1, typename AnyExecutor2>
+ friend enable_if_t<
+ is_base_of<any_executor, AnyExecutor1>::value
+ || is_base_of<any_executor, AnyExecutor2>::value,
+ bool
+ > operator!=(const AnyExecutor1& a,
+ const AnyExecutor2& b) noexcept
+ {
+ return !static_cast<const any_executor&>(a).equality_helper(b);
+ }
+
+ template <typename AnyExecutor>
+ friend enable_if_t<
+ is_same<AnyExecutor, any_executor>::value,
+ bool
+ > operator!=(const AnyExecutor& a, nullptr_t) noexcept
+ {
+ return !!a;
+ }
+
+ template <typename AnyExecutor>
+ friend enable_if_t<
+ is_same<AnyExecutor, any_executor>::value,
+ bool
+ > operator!=(nullptr_t, const AnyExecutor& b) noexcept
+ {
+ return !!b;
+ }
+
+ template <typename T>
+ struct find_convertible_property :
+ detail::supportable_properties<
+ 0, void(SupportableProperties...)>::template
+ find_convertible_property<T> {};
+
+ template <typename Property>
+ void query(const Property& p,
+ enable_if_t<
+ is_same<
+ typename find_convertible_property<Property>::query_result_type,
+ void
+ >::value
+ >* = 0) const
+ {
+ if (!target_)
+ {
+ bad_executor ex;
+ asio::detail::throw_exception(ex);
+ }
+ typedef find_convertible_property<Property> found;
+ prop_fns_[found::index].query(0, object_fns_->target(*this),
+ &static_cast<const typename found::type&>(p));
+ }
+
+ template <typename Property>
+ typename find_convertible_property<Property>::query_result_type
+ query(const Property& p,
+ enable_if_t<
+ !is_same<
+ typename find_convertible_property<Property>::query_result_type,
+ void
+ >::value
+ &&
+ is_reference<
+ typename find_convertible_property<Property>::query_result_type
+ >::value
+ >* = 0) const
+ {
+ if (!target_)
+ {
+ bad_executor ex;
+ asio::detail::throw_exception(ex);
+ }
+ typedef find_convertible_property<Property> found;
+ remove_reference_t<typename found::query_result_type>* result = 0;
+ prop_fns_[found::index].query(&result, object_fns_->target(*this),
+ &static_cast<const typename found::type&>(p));
+ return *result;
+ }
+
+ template <typename Property>
+ typename find_convertible_property<Property>::query_result_type
+ query(const Property& p,
+ enable_if_t<
+ !is_same<
+ typename find_convertible_property<Property>::query_result_type,
+ void
+ >::value
+ &&
+ is_scalar<
+ typename find_convertible_property<Property>::query_result_type
+ >::value
+ >* = 0) const
+ {
+ if (!target_)
+ {
+ bad_executor ex;
+ asio::detail::throw_exception(ex);
+ }
+ typedef find_convertible_property<Property> found;
+ typename found::query_result_type result;
+ prop_fns_[found::index].query(&result, object_fns_->target(*this),
+ &static_cast<const typename found::type&>(p));
+ return result;
+ }
+
+ template <typename Property>
+ typename find_convertible_property<Property>::query_result_type
+ query(const Property& p,
+ enable_if_t<
+ !is_same<
+ typename find_convertible_property<Property>::query_result_type,
+ void
+ >::value
+ &&
+ !is_reference<
+ typename find_convertible_property<Property>::query_result_type
+ >::value
+ &&
+ !is_scalar<
+ typename find_convertible_property<Property>::query_result_type
+ >::value
+ >* = 0) const
+ {
+ if (!target_)
+ {
+ bad_executor ex;
+ asio::detail::throw_exception(ex);
+ }
+ typedef find_convertible_property<Property> found;
+ typename found::query_result_type* result;
+ prop_fns_[found::index].query(&result, object_fns_->target(*this),
+ &static_cast<const typename found::type&>(p));
+ return *asio::detail::scoped_ptr<
+ typename found::query_result_type>(result);
+ }
+
+ template <typename T>
+ struct find_convertible_requirable_property :
+ detail::supportable_properties<
+ 0, void(SupportableProperties...)>::template
+ find_convertible_requirable_property<T> {};
+
+ template <typename Property>
+ any_executor require(const Property& p,
+ enable_if_t<
+ find_convertible_requirable_property<Property>::value
+ >* = 0) const
+ {
+ if (!target_)
+ {
+ bad_executor ex;
+ asio::detail::throw_exception(ex);
+ }
+ typedef find_convertible_requirable_property<Property> found;
+ return prop_fns_[found::index].require(object_fns_->target(*this),
+ &static_cast<const typename found::type&>(p));
+ }
+
+ template <typename T>
+ struct find_convertible_preferable_property :
+ detail::supportable_properties<
+ 0, void(SupportableProperties...)>::template
+ find_convertible_preferable_property<T> {};
+
+ template <typename Property>
+ any_executor prefer(const Property& p,
+ enable_if_t<
+ find_convertible_preferable_property<Property>::value
+ >* = 0) const
+ {
+ if (!target_)
+ {
+ bad_executor ex;
+ asio::detail::throw_exception(ex);
+ }
+ typedef find_convertible_preferable_property<Property> found;
+ return prop_fns_[found::index].prefer(object_fns_->target(*this),
+ &static_cast<const typename found::type&>(p));
+ }
+
+//private:
+ template <typename Ex>
+ static const prop_fns<any_executor>* prop_fns_table()
+ {
+ static const prop_fns<any_executor> fns[] =
+ {
+ {
+ &detail::any_executor_base::query_fn<
+ Ex, SupportableProperties>,
+ &detail::any_executor_base::require_fn<
+ any_executor, Ex, SupportableProperties>,
+ &detail::any_executor_base::prefer_fn<
+ any_executor, Ex, SupportableProperties>
+ }...
+ };
+ return fns;
+ }
+
+ const prop_fns<any_executor>* prop_fns_;
+};
+
+template <typename... SupportableProperties>
+inline void swap(any_executor<SupportableProperties...>& a,
+ any_executor<SupportableProperties...>& b) noexcept
+{
+ return a.swap(b);
+}
+
+} // namespace execution
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename... SupportableProperties>
+struct equality_comparable<execution::any_executor<SupportableProperties...>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename F, typename... SupportableProperties>
+struct execute_member<execution::any_executor<SupportableProperties...>, F>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename Prop, typename... SupportableProperties>
+struct query_member<
+ execution::any_executor<SupportableProperties...>, Prop,
+ enable_if_t<
+ execution::detail::supportable_properties<
+ 0, void(SupportableProperties...)>::template
+ find_convertible_property<Prop>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef typename execution::detail::supportable_properties<
+ 0, void(SupportableProperties...)>::template
+ find_convertible_property<Prop>::query_result_type result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename Prop, typename... SupportableProperties>
+struct require_member<
+ execution::any_executor<SupportableProperties...>, Prop,
+ enable_if_t<
+ execution::detail::supportable_properties<
+ 0, void(SupportableProperties...)>::template
+ find_convertible_requirable_property<Prop>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef execution::any_executor<SupportableProperties...> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+template <typename Prop, typename... SupportableProperties>
+struct prefer_member<
+ execution::any_executor<SupportableProperties...>, Prop,
+ enable_if_t<
+ execution::detail::supportable_properties<
+ 0, void(SupportableProperties...)>::template
+ find_convertible_preferable_property<Prop>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef execution::any_executor<SupportableProperties...> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+} // namespace traits
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_ANY_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/execution/bad_executor.hpp b/3rdparty/asio/include/asio/execution/bad_executor.hpp
new file mode 100644
index 00000000000..791951684fe
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/bad_executor.hpp
@@ -0,0 +1,46 @@
+//
+// execution/bad_executor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_BAD_EXECUTOR_HPP
+#define ASIO_EXECUTION_BAD_EXECUTOR_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <exception>
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace execution {
+
+/// Exception thrown when trying to access an empty polymorphic executor.
+class bad_executor
+ : public std::exception
+{
+public:
+ /// Constructor.
+ ASIO_DECL bad_executor() noexcept;
+
+ /// Obtain message associated with exception.
+ ASIO_DECL virtual const char* what() const noexcept;
+};
+
+} // namespace execution
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#if defined(ASIO_HEADER_ONLY)
+# include "asio/execution/impl/bad_executor.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // ASIO_EXECUTION_BAD_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/execution/blocking.hpp b/3rdparty/asio/include/asio/execution/blocking.hpp
new file mode 100644
index 00000000000..e120299bded
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/blocking.hpp
@@ -0,0 +1,1360 @@
+//
+// execution/blocking.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_BLOCKING_HPP
+#define ASIO_EXECUTION_BLOCKING_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/execution/executor.hpp"
+#include "asio/is_applicable_property.hpp"
+#include "asio/prefer.hpp"
+#include "asio/query.hpp"
+#include "asio/require.hpp"
+#include "asio/traits/execute_member.hpp"
+#include "asio/traits/query_free.hpp"
+#include "asio/traits/query_member.hpp"
+#include "asio/traits/query_static_constexpr_member.hpp"
+#include "asio/traits/static_query.hpp"
+#include "asio/traits/static_require.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+/// A property to describe what guarantees an executor makes about the blocking
+/// behaviour of their execution functions.
+struct blocking_t
+{
+ /// The blocking_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The top-level blocking_t property cannot be required.
+ static constexpr bool is_requirable = false;
+
+ /// The top-level blocking_t property cannot be preferred.
+ static constexpr bool is_preferable = false;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef blocking_t polymorphic_query_result_type;
+
+ /// A sub-property that indicates that invocation of an executor's execution
+ /// function may block pending completion of one or more invocations of the
+ /// submitted function object.
+ struct possibly_t
+ {
+ /// The blocking_t::possibly_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The blocking_t::possibly_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The blocking_t::possibly_t property can be preferred.
+ static constexpr bool is_preferable = true;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef blocking_t polymorphic_query_result_type;
+
+ /// Default constructor.
+ constexpr possibly_t();
+
+ /// Get the value associated with a property object.
+ /**
+ * @returns possibly_t();
+ */
+ static constexpr blocking_t value();
+ };
+
+ /// A sub-property that indicates that invocation of an executor's execution
+ /// function shall block until completion of all invocations of the submitted
+ /// function object.
+ struct always_t
+ {
+ /// The blocking_t::always_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The blocking_t::always_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The blocking_t::always_t property can be preferred.
+ static constexpr bool is_preferable = false;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef blocking_t polymorphic_query_result_type;
+
+ /// Default constructor.
+ constexpr always_t();
+
+ /// Get the value associated with a property object.
+ /**
+ * @returns always_t();
+ */
+ static constexpr blocking_t value();
+ };
+
+ /// A sub-property that indicates that invocation of an executor's execution
+ /// function shall not block pending completion of the invocations of the
+ /// submitted function object.
+ struct never_t
+ {
+ /// The blocking_t::never_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The blocking_t::never_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The blocking_t::never_t property can be preferred.
+ static constexpr bool is_preferable = true;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef blocking_t polymorphic_query_result_type;
+
+ /// Default constructor.
+ constexpr never_t();
+
+ /// Get the value associated with a property object.
+ /**
+ * @returns never_t();
+ */
+ static constexpr blocking_t value();
+ };
+
+ /// A special value used for accessing the blocking_t::possibly_t property.
+ static constexpr possibly_t possibly;
+
+ /// A special value used for accessing the blocking_t::always_t property.
+ static constexpr always_t always;
+
+ /// A special value used for accessing the blocking_t::never_t property.
+ static constexpr never_t never;
+
+ /// Default constructor.
+ constexpr blocking_t();
+
+ /// Construct from a sub-property value.
+ constexpr blocking_t(possibly_t);
+
+ /// Construct from a sub-property value.
+ constexpr blocking_t(always_t);
+
+ /// Construct from a sub-property value.
+ constexpr blocking_t(never_t);
+
+ /// Compare property values for equality.
+ friend constexpr bool operator==(
+ const blocking_t& a, const blocking_t& b) noexcept;
+
+ /// Compare property values for inequality.
+ friend constexpr bool operator!=(
+ const blocking_t& a, const blocking_t& b) noexcept;
+};
+
+/// A special value used for accessing the blocking_t property.
+constexpr blocking_t blocking;
+
+} // namespace execution
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+namespace detail {
+namespace blocking {
+
+template <int I> struct possibly_t;
+template <int I> struct always_t;
+template <int I> struct never_t;
+
+} // namespace blocking
+namespace blocking_adaptation {
+
+template <int I> struct allowed_t;
+
+template <typename Executor, typename Function>
+void blocking_execute(
+ Executor&& ex,
+ Function&& func);
+
+} // namespace blocking_adaptation
+
+template <int I = 0>
+struct blocking_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = false;
+ static constexpr bool is_preferable = false;
+ typedef blocking_t polymorphic_query_result_type;
+
+ typedef detail::blocking::possibly_t<I> possibly_t;
+ typedef detail::blocking::always_t<I> always_t;
+ typedef detail::blocking::never_t<I> never_t;
+
+ constexpr blocking_t()
+ : value_(-1)
+ {
+ }
+
+ constexpr blocking_t(possibly_t)
+ : value_(0)
+ {
+ }
+
+ constexpr blocking_t(always_t)
+ : value_(1)
+ {
+ }
+
+ constexpr blocking_t(never_t)
+ : value_(2)
+ {
+ }
+
+ template <typename T>
+ struct proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ auto query(P&& p) const
+ noexcept(
+ noexcept(
+ declval<conditional_t<true, T, P>>().query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ declval<conditional_t<true, T, P>>().query(static_cast<P&&>(p))
+ );
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct static_proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ static constexpr auto query(P&& p)
+ noexcept(
+ noexcept(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ {
+ return T::query(static_cast<P&&>(p));
+ }
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<typename proxy<T>::type, blocking_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename static_proxy<T>::type, blocking_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr
+ typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, possibly_t>::result_type
+ static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ traits::static_query<T, possibly_t>::is_valid
+ >* = 0) noexcept
+ {
+ return traits::static_query<T, possibly_t>::value();
+ }
+
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, always_t>::result_type
+ static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::static_query<T, possibly_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ traits::static_query<T, always_t>::is_valid
+ >* = 0) noexcept
+ {
+ return traits::static_query<T, always_t>::value();
+ }
+
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, never_t>::result_type
+ static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::static_query<T, possibly_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::static_query<T, always_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ traits::static_query<T, never_t>::is_valid
+ >* = 0) noexcept
+ {
+ return traits::static_query<T, never_t>::value();
+ }
+
+ template <typename E, typename T = decltype(blocking_t::static_query<E>())>
+ static constexpr const T static_query_v
+ = blocking_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ friend constexpr bool operator==(
+ const blocking_t& a, const blocking_t& b)
+ {
+ return a.value_ == b.value_;
+ }
+
+ friend constexpr bool operator!=(
+ const blocking_t& a, const blocking_t& b)
+ {
+ return a.value_ != b.value_;
+ }
+
+ struct convertible_from_blocking_t
+ {
+ constexpr convertible_from_blocking_t(blocking_t) {}
+ };
+
+ template <typename Executor>
+ friend constexpr blocking_t query(
+ const Executor& ex, convertible_from_blocking_t,
+ enable_if_t<
+ can_query<const Executor&, possibly_t>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(is_nothrow_query<const Executor&, blocking_t<>::possibly_t>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, possibly_t>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, possibly_t());
+ }
+
+ template <typename Executor>
+ friend constexpr blocking_t query(
+ const Executor& ex, convertible_from_blocking_t,
+ enable_if_t<
+ !can_query<const Executor&, possibly_t>::value
+ >* = 0,
+ enable_if_t<
+ can_query<const Executor&, always_t>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(is_nothrow_query<const Executor&, blocking_t<>::always_t>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, always_t>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, always_t());
+ }
+
+ template <typename Executor>
+ friend constexpr blocking_t query(
+ const Executor& ex, convertible_from_blocking_t,
+ enable_if_t<
+ !can_query<const Executor&, possibly_t>::value
+ >* = 0,
+ enable_if_t<
+ !can_query<const Executor&, always_t>::value
+ >* = 0,
+ enable_if_t<
+ can_query<const Executor&, never_t>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(is_nothrow_query<const Executor&, blocking_t<>::never_t>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, never_t>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, never_t());
+ }
+
+ ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(possibly_t, possibly);
+ ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(always_t, always);
+ ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(never_t, never);
+
+private:
+ int value_;
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T blocking_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <int I>
+const typename blocking_t<I>::possibly_t blocking_t<I>::possibly;
+
+template <int I>
+const typename blocking_t<I>::always_t blocking_t<I>::always;
+
+template <int I>
+const typename blocking_t<I>::never_t blocking_t<I>::never;
+
+namespace blocking {
+
+template <int I = 0>
+struct possibly_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+ typedef blocking_t<I> polymorphic_query_result_type;
+
+ constexpr possibly_t()
+ {
+ }
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<
+ typename blocking_t<I>::template proxy<T>::type, possibly_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename blocking_t<I>::template static_proxy<T>::type, possibly_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr
+ typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename T>
+ static constexpr possibly_t static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::query_free<T, possibly_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ !can_query<T, always_t<I>>::value
+ >* = 0,
+ enable_if_t<
+ !can_query<T, never_t<I>>::value
+ >* = 0) noexcept
+ {
+ return possibly_t();
+ }
+
+ template <typename E, typename T = decltype(possibly_t::static_query<E>())>
+ static constexpr const T static_query_v
+ = possibly_t::static_query<E>();
+#endif // defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ static constexpr blocking_t<I> value()
+ {
+ return possibly_t();
+ }
+
+ friend constexpr bool operator==(
+ const possibly_t&, const possibly_t&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator!=(
+ const possibly_t&, const possibly_t&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator==(
+ const possibly_t&, const always_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(
+ const possibly_t&, const always_t<I>&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator==(
+ const possibly_t&, const never_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(
+ const possibly_t&, const never_t<I>&)
+ {
+ return true;
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T possibly_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename Executor>
+class adapter
+{
+public:
+ adapter(int, const Executor& e) noexcept
+ : executor_(e)
+ {
+ }
+
+ adapter(const adapter& other) noexcept
+ : executor_(other.executor_)
+ {
+ }
+
+ adapter(adapter&& other) noexcept
+ : executor_(static_cast<Executor&&>(other.executor_))
+ {
+ }
+
+ template <int I>
+ static constexpr always_t<I> query(blocking_t<I>) noexcept
+ {
+ return always_t<I>();
+ }
+
+ template <int I>
+ static constexpr always_t<I> query(possibly_t<I>) noexcept
+ {
+ return always_t<I>();
+ }
+
+ template <int I>
+ static constexpr always_t<I> query(always_t<I>) noexcept
+ {
+ return always_t<I>();
+ }
+
+ template <int I>
+ static constexpr always_t<I> query(never_t<I>) noexcept
+ {
+ return always_t<I>();
+ }
+
+ template <typename Property>
+ enable_if_t<
+ can_query<const Executor&, Property>::value,
+ query_result_t<const Executor&, Property>
+ > query(const Property& p) const
+ noexcept(is_nothrow_query<const Executor&, Property>::value)
+ {
+ return asio::query(executor_, p);
+ }
+
+ template <int I>
+ enable_if_t<
+ can_require<const Executor&, possibly_t<I>>::value,
+ require_result_t<const Executor&, possibly_t<I>>
+ > require(possibly_t<I>) const noexcept
+ {
+ return asio::require(executor_, possibly_t<I>());
+ }
+
+ template <int I>
+ enable_if_t<
+ can_require<const Executor&, never_t<I>>::value,
+ require_result_t<const Executor&, never_t<I>>
+ > require(never_t<I>) const noexcept
+ {
+ return asio::require(executor_, never_t<I>());
+ }
+
+ template <typename Property>
+ enable_if_t<
+ can_require<const Executor&, Property>::value,
+ adapter<decay_t<require_result_t<const Executor&, Property>>>
+ > require(const Property& p) const
+ noexcept(is_nothrow_require<const Executor&, Property>::value)
+ {
+ return adapter<decay_t<require_result_t<const Executor&, Property>>>(
+ 0, asio::require(executor_, p));
+ }
+
+ template <typename Property>
+ enable_if_t<
+ can_prefer<const Executor&, Property>::value,
+ adapter<decay_t<prefer_result_t<const Executor&, Property>>>
+ > prefer(const Property& p) const
+ noexcept(is_nothrow_prefer<const Executor&, Property>::value)
+ {
+ return adapter<decay_t<prefer_result_t<const Executor&, Property>>>(
+ 0, asio::prefer(executor_, p));
+ }
+
+ template <typename Function>
+ enable_if_t<
+ traits::execute_member<const Executor&, Function>::is_valid
+ > execute(Function&& f) const
+ {
+ blocking_adaptation::blocking_execute(
+ executor_, static_cast<Function&&>(f));
+ }
+
+ friend bool operator==(const adapter& a, const adapter& b) noexcept
+ {
+ return a.executor_ == b.executor_;
+ }
+
+ friend bool operator!=(const adapter& a, const adapter& b) noexcept
+ {
+ return a.executor_ != b.executor_;
+ }
+
+private:
+ Executor executor_;
+};
+
+template <int I = 0>
+struct always_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = false;
+ typedef blocking_t<I> polymorphic_query_result_type;
+
+ constexpr always_t()
+ {
+ }
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<
+ typename blocking_t<I>::template proxy<T>::type, always_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename blocking_t<I>::template static_proxy<T>::type, always_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename E, typename T = decltype(always_t::static_query<E>())>
+ static constexpr const T static_query_v = always_t::static_query<E>();
+#endif // defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ static constexpr blocking_t<I> value()
+ {
+ return always_t();
+ }
+
+ friend constexpr bool operator==(
+ const always_t&, const always_t&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator!=(
+ const always_t&, const always_t&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator==(
+ const always_t&, const possibly_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(
+ const always_t&, const possibly_t<I>&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator==(
+ const always_t&, const never_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(
+ const always_t&, const never_t<I>&)
+ {
+ return true;
+ }
+
+ template <typename Executor>
+ friend adapter<Executor> require(
+ const Executor& e, const always_t&,
+ enable_if_t<
+ is_executor<Executor>::value
+ >* = 0,
+ enable_if_t<
+ traits::static_require<
+ const Executor&,
+ blocking_adaptation::allowed_t<0>
+ >::is_valid
+ >* = 0)
+ {
+ return adapter<Executor>(0, e);
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T always_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <int I>
+struct never_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+ typedef blocking_t<I> polymorphic_query_result_type;
+
+ constexpr never_t()
+ {
+ }
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<
+ typename blocking_t<I>::template proxy<T>::type, never_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename blocking_t<I>::template static_proxy<T>::type, never_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr
+ typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename E, typename T = decltype(never_t::static_query<E>())>
+ static constexpr const T static_query_v
+ = never_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ static constexpr blocking_t<I> value()
+ {
+ return never_t();
+ }
+
+ friend constexpr bool operator==(const never_t&, const never_t&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator!=(const never_t&, const never_t&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator==(const never_t&, const possibly_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const never_t&, const possibly_t<I>&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator==(const never_t&, const always_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const never_t&, const always_t<I>&)
+ {
+ return true;
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T never_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace blocking
+} // namespace detail
+
+typedef detail::blocking_t<> blocking_t;
+
+constexpr blocking_t blocking;
+
+} // namespace execution
+
+#if !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct is_applicable_property<T, execution::blocking_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+template <typename T>
+struct is_applicable_property<T, execution::blocking_t::possibly_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+template <typename T>
+struct is_applicable_property<T, execution::blocking_t::always_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+template <typename T>
+struct is_applicable_property<T, execution::blocking_t::never_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+#endif // !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename T>
+struct query_free_default<T, execution::blocking_t,
+ enable_if_t<
+ can_query<T, execution::blocking_t::possibly_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<T, execution::blocking_t::possibly_t>::value;
+
+ typedef execution::blocking_t result_type;
+};
+
+template <typename T>
+struct query_free_default<T, execution::blocking_t,
+ enable_if_t<
+ !can_query<T, execution::blocking_t::possibly_t>::value
+ && can_query<T, execution::blocking_t::always_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<T, execution::blocking_t::always_t>::value;
+
+ typedef execution::blocking_t result_type;
+};
+
+template <typename T>
+struct query_free_default<T, execution::blocking_t,
+ enable_if_t<
+ !can_query<T, execution::blocking_t::possibly_t>::value
+ && !can_query<T, execution::blocking_t::always_t>::value
+ && can_query<T, execution::blocking_t::never_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<T, execution::blocking_t::never_t>::value;
+
+ typedef execution::blocking_t result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct static_query<T, execution::blocking_t,
+ enable_if_t<
+ execution::detail::blocking_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::blocking_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::blocking_t::query_static_constexpr_member<T>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::blocking_t,
+ enable_if_t<
+ !execution::detail::blocking_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::blocking_t<0>::
+ query_member<T>::is_valid
+ && traits::static_query<T, execution::blocking_t::possibly_t>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename traits::static_query<T,
+ execution::blocking_t::possibly_t>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return traits::static_query<T, execution::blocking_t::possibly_t>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::blocking_t,
+ enable_if_t<
+ !execution::detail::blocking_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::blocking_t<0>::
+ query_member<T>::is_valid
+ && !traits::static_query<T, execution::blocking_t::possibly_t>::is_valid
+ && traits::static_query<T, execution::blocking_t::always_t>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename traits::static_query<T,
+ execution::blocking_t::always_t>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return traits::static_query<T, execution::blocking_t::always_t>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::blocking_t,
+ enable_if_t<
+ !execution::detail::blocking_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::blocking_t<0>::
+ query_member<T>::is_valid
+ && !traits::static_query<T, execution::blocking_t::possibly_t>::is_valid
+ && !traits::static_query<T, execution::blocking_t::always_t>::is_valid
+ && traits::static_query<T, execution::blocking_t::never_t>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename traits::static_query<T,
+ execution::blocking_t::never_t>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return traits::static_query<T, execution::blocking_t::never_t>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::blocking_t::possibly_t,
+ enable_if_t<
+ execution::detail::blocking::possibly_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::blocking::possibly_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::blocking::possibly_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::blocking_t::possibly_t,
+ enable_if_t<
+ !execution::detail::blocking::possibly_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::blocking::possibly_t<0>::
+ query_member<T>::is_valid
+ && !traits::query_free<T, execution::blocking_t::possibly_t>::is_valid
+ && !can_query<T, execution::blocking_t::always_t>::value
+ && !can_query<T, execution::blocking_t::never_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef execution::blocking_t::possibly_t result_type;
+
+ static constexpr result_type value()
+ {
+ return result_type();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::blocking_t::always_t,
+ enable_if_t<
+ execution::detail::blocking::always_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::blocking::always_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::blocking::always_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::blocking_t::never_t,
+ enable_if_t<
+ execution::detail::blocking::never_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::blocking::never_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::blocking::never_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+template <typename T>
+struct require_free_default<T, execution::blocking_t::always_t,
+ enable_if_t<
+ is_same<T, decay_t<T>>::value
+ && execution::is_executor<T>::value
+ && traits::static_require<
+ const T&,
+ execution::detail::blocking_adaptation::allowed_t<0>
+ >::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef execution::detail::blocking::adapter<T> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename Executor>
+struct equality_comparable<
+ execution::detail::blocking::adapter<Executor>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename Executor, typename Function>
+struct execute_member<
+ execution::detail::blocking::adapter<Executor>, Function>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename Executor, int I>
+struct query_static_constexpr_member<
+ execution::detail::blocking::adapter<Executor>,
+ execution::detail::blocking_t<I>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef execution::blocking_t::always_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return result_type();
+ }
+};
+
+template <typename Executor, int I>
+struct query_static_constexpr_member<
+ execution::detail::blocking::adapter<Executor>,
+ execution::detail::blocking::always_t<I>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef execution::blocking_t::always_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return result_type();
+ }
+};
+
+template <typename Executor, int I>
+struct query_static_constexpr_member<
+ execution::detail::blocking::adapter<Executor>,
+ execution::detail::blocking::possibly_t<I>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef execution::blocking_t::always_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return result_type();
+ }
+};
+
+template <typename Executor, int I>
+struct query_static_constexpr_member<
+ execution::detail::blocking::adapter<Executor>,
+ execution::detail::blocking::never_t<I>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef execution::blocking_t::always_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return result_type();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename Executor, typename Property>
+struct query_member<
+ execution::detail::blocking::adapter<Executor>, Property,
+ enable_if_t<
+ can_query<const Executor&, Property>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<Executor, Property>::value;
+ typedef query_result_t<Executor, Property> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename Executor, int I>
+struct require_member<
+ execution::detail::blocking::adapter<Executor>,
+ execution::detail::blocking::possibly_t<I>,
+ enable_if_t<
+ can_require<
+ const Executor&,
+ execution::detail::blocking::possibly_t<I>
+ >::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_require<const Executor&,
+ execution::detail::blocking::possibly_t<I>>::value;
+ typedef require_result_t<const Executor&,
+ execution::detail::blocking::possibly_t<I>> result_type;
+};
+
+template <typename Executor, int I>
+struct require_member<
+ execution::detail::blocking::adapter<Executor>,
+ execution::detail::blocking::never_t<I>,
+ enable_if_t<
+ can_require<
+ const Executor&,
+ execution::detail::blocking::never_t<I>
+ >::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_require<const Executor&,
+ execution::detail::blocking::never_t<I>>::value;
+ typedef require_result_t<const Executor&,
+ execution::detail::blocking::never_t<I>> result_type;
+};
+
+template <typename Executor, typename Property>
+struct require_member<
+ execution::detail::blocking::adapter<Executor>, Property,
+ enable_if_t<
+ can_require<const Executor&, Property>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_require<Executor, Property>::value;
+ typedef execution::detail::blocking::adapter<
+ decay_t<require_result_t<Executor, Property>>> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+template <typename Executor, typename Property>
+struct prefer_member<
+ execution::detail::blocking::adapter<Executor>, Property,
+ enable_if_t<
+ can_prefer<const Executor&, Property>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_prefer<Executor, Property>::value;
+ typedef execution::detail::blocking::adapter<
+ decay_t<prefer_result_t<Executor, Property>>> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+} // namespace traits
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_BLOCKING_HPP
diff --git a/3rdparty/asio/include/asio/execution/blocking_adaptation.hpp b/3rdparty/asio/include/asio/execution/blocking_adaptation.hpp
new file mode 100644
index 00000000000..a2769b254a5
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/blocking_adaptation.hpp
@@ -0,0 +1,1080 @@
+//
+// execution/blocking_adaptation.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_BLOCKING_ADAPTATION_HPP
+#define ASIO_EXECUTION_BLOCKING_ADAPTATION_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/event.hpp"
+#include "asio/detail/mutex.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/is_applicable_property.hpp"
+#include "asio/prefer.hpp"
+#include "asio/query.hpp"
+#include "asio/require.hpp"
+#include "asio/traits/prefer_member.hpp"
+#include "asio/traits/query_free.hpp"
+#include "asio/traits/query_member.hpp"
+#include "asio/traits/query_static_constexpr_member.hpp"
+#include "asio/traits/require_member.hpp"
+#include "asio/traits/static_query.hpp"
+#include "asio/traits/static_require.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+/// A property to describe whether automatic adaptation of an executor is
+/// allowed in order to apply the blocking_adaptation_t::allowed_t property.
+struct blocking_adaptation_t
+{
+ /// The blocking_adaptation_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The top-level blocking_adaptation_t property cannot be required.
+ static constexpr bool is_requirable = false;
+
+ /// The top-level blocking_adaptation_t property cannot be preferred.
+ static constexpr bool is_preferable = false;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef blocking_adaptation_t polymorphic_query_result_type;
+
+ /// A sub-property that indicates that automatic adaptation is not allowed.
+ struct disallowed_t
+ {
+ /// The blocking_adaptation_t::disallowed_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The blocking_adaptation_t::disallowed_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The blocking_adaptation_t::disallowed_t property can be preferred.
+ static constexpr bool is_preferable = true;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef blocking_adaptation_t polymorphic_query_result_type;
+
+ /// Default constructor.
+ constexpr disallowed_t();
+
+ /// Get the value associated with a property object.
+ /**
+ * @returns disallowed_t();
+ */
+ static constexpr blocking_adaptation_t value();
+ };
+
+ /// A sub-property that indicates that automatic adaptation is allowed.
+ struct allowed_t
+ {
+ /// The blocking_adaptation_t::allowed_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The blocking_adaptation_t::allowed_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The blocking_adaptation_t::allowed_t property can be preferred.
+ static constexpr bool is_preferable = false;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef blocking_adaptation_t polymorphic_query_result_type;
+
+ /// Default constructor.
+ constexpr allowed_t();
+
+ /// Get the value associated with a property object.
+ /**
+ * @returns allowed_t();
+ */
+ static constexpr blocking_adaptation_t value();
+ };
+
+ /// A special value used for accessing the blocking_adaptation_t::disallowed_t
+ /// property.
+ static constexpr disallowed_t disallowed;
+
+ /// A special value used for accessing the blocking_adaptation_t::allowed_t
+ /// property.
+ static constexpr allowed_t allowed;
+
+ /// Default constructor.
+ constexpr blocking_adaptation_t();
+
+ /// Construct from a sub-property value.
+ constexpr blocking_adaptation_t(disallowed_t);
+
+ /// Construct from a sub-property value.
+ constexpr blocking_adaptation_t(allowed_t);
+
+ /// Compare property values for equality.
+ friend constexpr bool operator==(
+ const blocking_adaptation_t& a, const blocking_adaptation_t& b) noexcept;
+
+ /// Compare property values for inequality.
+ friend constexpr bool operator!=(
+ const blocking_adaptation_t& a, const blocking_adaptation_t& b) noexcept;
+};
+
+/// A special value used for accessing the blocking_adaptation_t property.
+constexpr blocking_adaptation_t blocking_adaptation;
+
+} // namespace execution
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+namespace detail {
+namespace blocking_adaptation {
+
+template <int I> struct disallowed_t;
+template <int I> struct allowed_t;
+
+} // namespace blocking_adaptation
+
+template <int I = 0>
+struct blocking_adaptation_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = false;
+ static constexpr bool is_preferable = false;
+ typedef blocking_adaptation_t polymorphic_query_result_type;
+
+ typedef detail::blocking_adaptation::disallowed_t<I> disallowed_t;
+ typedef detail::blocking_adaptation::allowed_t<I> allowed_t;
+
+ constexpr blocking_adaptation_t()
+ : value_(-1)
+ {
+ }
+
+ constexpr blocking_adaptation_t(disallowed_t)
+ : value_(0)
+ {
+ }
+
+ constexpr blocking_adaptation_t(allowed_t)
+ : value_(1)
+ {
+ }
+
+ template <typename T>
+ struct proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ auto query(P&& p) const
+ noexcept(
+ noexcept(
+ declval<conditional_t<true, T, P>>().query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ declval<conditional_t<true, T, P>>().query(static_cast<P&&>(p))
+ );
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct static_proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ static constexpr auto query(P&& p)
+ noexcept(
+ noexcept(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ {
+ return T::query(static_cast<P&&>(p));
+ }
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<typename proxy<T>::type, blocking_adaptation_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename static_proxy<T>::type, blocking_adaptation_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, disallowed_t>::result_type
+ static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ traits::static_query<T, disallowed_t>::is_valid
+ >* = 0) noexcept
+ {
+ return traits::static_query<T, disallowed_t>::value();
+ }
+
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, allowed_t>::result_type
+ static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::static_query<T, disallowed_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ traits::static_query<T, allowed_t>::is_valid
+ >* = 0) noexcept
+ {
+ return traits::static_query<T, allowed_t>::value();
+ }
+
+ template <typename E,
+ typename T = decltype(blocking_adaptation_t::static_query<E>())>
+ static constexpr const T static_query_v
+ = blocking_adaptation_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ friend constexpr bool operator==(
+ const blocking_adaptation_t& a, const blocking_adaptation_t& b)
+ {
+ return a.value_ == b.value_;
+ }
+
+ friend constexpr bool operator!=(
+ const blocking_adaptation_t& a, const blocking_adaptation_t& b)
+ {
+ return a.value_ != b.value_;
+ }
+
+ struct convertible_from_blocking_adaptation_t
+ {
+ constexpr convertible_from_blocking_adaptation_t(
+ blocking_adaptation_t)
+ {
+ }
+ };
+
+ template <typename Executor>
+ friend constexpr blocking_adaptation_t query(
+ const Executor& ex, convertible_from_blocking_adaptation_t,
+ enable_if_t<
+ can_query<const Executor&, disallowed_t>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(is_nothrow_query<const Executor&,
+ blocking_adaptation_t<>::disallowed_t>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, disallowed_t>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, disallowed_t());
+ }
+
+ template <typename Executor>
+ friend constexpr blocking_adaptation_t query(
+ const Executor& ex, convertible_from_blocking_adaptation_t,
+ enable_if_t<
+ !can_query<const Executor&, disallowed_t>::value
+ >* = 0,
+ enable_if_t<
+ can_query<const Executor&, allowed_t>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(is_nothrow_query<const Executor&,
+ blocking_adaptation_t<>::allowed_t>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, allowed_t>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, allowed_t());
+ }
+
+ ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(disallowed_t, disallowed);
+ ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(allowed_t, allowed);
+
+private:
+ int value_;
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T blocking_adaptation_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <int I>
+const typename blocking_adaptation_t<I>::disallowed_t
+blocking_adaptation_t<I>::disallowed;
+
+template <int I>
+const typename blocking_adaptation_t<I>::allowed_t
+blocking_adaptation_t<I>::allowed;
+
+namespace blocking_adaptation {
+
+template <int I = 0>
+struct disallowed_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+ typedef blocking_adaptation_t<I> polymorphic_query_result_type;
+
+ constexpr disallowed_t()
+ {
+ }
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<
+ typename blocking_adaptation_t<I>::template proxy<T>::type,
+ disallowed_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename blocking_adaptation_t<I>::template static_proxy<T>::type,
+ disallowed_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr
+ typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename T>
+ static constexpr disallowed_t static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::query_free<T, disallowed_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ !can_query<T, allowed_t<I>>::value
+ >* = 0) noexcept
+ {
+ return disallowed_t();
+ }
+
+ template <typename E, typename T = decltype(disallowed_t::static_query<E>())>
+ static constexpr const T static_query_v
+ = disallowed_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ static constexpr blocking_adaptation_t<I> value()
+ {
+ return disallowed_t();
+ }
+
+ friend constexpr bool operator==(const disallowed_t&, const disallowed_t&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator!=(const disallowed_t&, const disallowed_t&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator==(const disallowed_t&, const allowed_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const disallowed_t&, const allowed_t<I>&)
+ {
+ return true;
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T disallowed_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename Executor>
+class adapter
+{
+public:
+ adapter(int, const Executor& e) noexcept
+ : executor_(e)
+ {
+ }
+
+ adapter(const adapter& other) noexcept
+ : executor_(other.executor_)
+ {
+ }
+
+ adapter(adapter&& other) noexcept
+ : executor_(static_cast<Executor&&>(other.executor_))
+ {
+ }
+
+ template <int I>
+ static constexpr allowed_t<I> query(blocking_adaptation_t<I>) noexcept
+ {
+ return allowed_t<I>();
+ }
+
+ template <int I>
+ static constexpr allowed_t<I> query(allowed_t<I>) noexcept
+ {
+ return allowed_t<I>();
+ }
+
+ template <int I>
+ static constexpr allowed_t<I> query(disallowed_t<I>) noexcept
+ {
+ return allowed_t<I>();
+ }
+
+ template <typename Property>
+ enable_if_t<
+ can_query<const Executor&, Property>::value,
+ query_result_t<const Executor&, Property>
+ > query(const Property& p) const
+ noexcept(is_nothrow_query<const Executor&, Property>::value)
+ {
+ return asio::query(executor_, p);
+ }
+
+ template <int I>
+ Executor require(disallowed_t<I>) const noexcept
+ {
+ return executor_;
+ }
+
+ template <typename Property>
+ enable_if_t<
+ can_require<const Executor&, Property>::value,
+ adapter<decay_t<require_result_t<const Executor&, Property>>>
+ > require(const Property& p) const
+ noexcept(is_nothrow_require<const Executor&, Property>::value)
+ {
+ return adapter<decay_t<require_result_t<const Executor&, Property>>>(
+ 0, asio::require(executor_, p));
+ }
+
+ template <typename Property>
+ enable_if_t<
+ can_prefer<const Executor&, Property>::value,
+ adapter<decay_t<prefer_result_t<const Executor&, Property>>>
+ > prefer(const Property& p) const
+ noexcept(is_nothrow_prefer<const Executor&, Property>::value)
+ {
+ return adapter<decay_t<prefer_result_t<const Executor&, Property>>>(
+ 0, asio::prefer(executor_, p));
+ }
+
+ template <typename Function>
+ enable_if_t<
+ traits::execute_member<const Executor&, Function>::is_valid
+ > execute(Function&& f) const
+ {
+ executor_.execute(static_cast<Function&&>(f));
+ }
+
+ friend bool operator==(const adapter& a, const adapter& b) noexcept
+ {
+ return a.executor_ == b.executor_;
+ }
+
+ friend bool operator!=(const adapter& a, const adapter& b) noexcept
+ {
+ return a.executor_ != b.executor_;
+ }
+
+private:
+ Executor executor_;
+};
+
+template <int I = 0>
+struct allowed_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = false;
+ typedef blocking_adaptation_t<I> polymorphic_query_result_type;
+
+ constexpr allowed_t()
+ {
+ }
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<
+ typename blocking_adaptation_t<I>::template proxy<T>::type,
+ allowed_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename blocking_adaptation_t<I>::template static_proxy<T>::type,
+ allowed_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename E, typename T = decltype(allowed_t::static_query<E>())>
+ static constexpr const T static_query_v = allowed_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ static constexpr blocking_adaptation_t<I> value()
+ {
+ return allowed_t();
+ }
+
+ friend constexpr bool operator==(const allowed_t&, const allowed_t&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator!=(const allowed_t&, const allowed_t&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator==(const allowed_t&, const disallowed_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const allowed_t&, const disallowed_t<I>&)
+ {
+ return true;
+ }
+
+ template <typename Executor>
+ friend adapter<Executor> require(
+ const Executor& e, const allowed_t&,
+ enable_if_t<
+ is_executor<Executor>::value
+ >* = 0)
+ {
+ return adapter<Executor>(0, e);
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T allowed_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename Function>
+class blocking_execute_state
+{
+public:
+ template <typename F>
+ blocking_execute_state(F&& f)
+ : func_(static_cast<F&&>(f)),
+ is_complete_(false)
+ {
+ }
+
+ template <typename Executor>
+ void execute_and_wait(Executor&& ex)
+ {
+ handler h = { this };
+ ex.execute(h);
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ while (!is_complete_)
+ event_.wait(lock);
+ }
+
+ struct cleanup
+ {
+ ~cleanup()
+ {
+ asio::detail::mutex::scoped_lock lock(state_->mutex_);
+ state_->is_complete_ = true;
+ state_->event_.unlock_and_signal_one_for_destruction(lock);
+ }
+
+ blocking_execute_state* state_;
+ };
+
+ struct handler
+ {
+ void operator()()
+ {
+ cleanup c = { state_ };
+ state_->func_();
+ }
+
+ blocking_execute_state* state_;
+ };
+
+ Function func_;
+ asio::detail::mutex mutex_;
+ asio::detail::event event_;
+ bool is_complete_;
+};
+
+template <typename Executor, typename Function>
+void blocking_execute(
+ Executor&& ex,
+ Function&& func)
+{
+ typedef decay_t<Function> func_t;
+ blocking_execute_state<func_t> state(static_cast<Function&&>(func));
+ state.execute_and_wait(ex);
+}
+
+} // namespace blocking_adaptation
+} // namespace detail
+
+typedef detail::blocking_adaptation_t<> blocking_adaptation_t;
+
+constexpr blocking_adaptation_t blocking_adaptation;
+
+} // namespace execution
+
+#if !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct is_applicable_property<T, execution::blocking_adaptation_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+template <typename T>
+struct is_applicable_property<T, execution::blocking_adaptation_t::disallowed_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+template <typename T>
+struct is_applicable_property<T, execution::blocking_adaptation_t::allowed_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+#endif // !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename T>
+struct query_free_default<T, execution::blocking_adaptation_t,
+ enable_if_t<
+ can_query<T, execution::blocking_adaptation_t::disallowed_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<T, execution::blocking_adaptation_t::disallowed_t>::value;
+
+ typedef execution::blocking_adaptation_t result_type;
+};
+
+template <typename T>
+struct query_free_default<T, execution::blocking_adaptation_t,
+ enable_if_t<
+ !can_query<T, execution::blocking_adaptation_t::disallowed_t>::value
+ && can_query<T, execution::blocking_adaptation_t::allowed_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<T, execution::blocking_adaptation_t::allowed_t>::value;
+
+ typedef execution::blocking_adaptation_t result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct static_query<T, execution::blocking_adaptation_t,
+ enable_if_t<
+ execution::detail::blocking_adaptation_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::blocking_adaptation_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::blocking_adaptation_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::blocking_adaptation_t,
+ enable_if_t<
+ !execution::detail::blocking_adaptation_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::blocking_adaptation_t<0>::
+ query_member<T>::is_valid
+ && traits::static_query<T,
+ execution::blocking_adaptation_t::disallowed_t>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename traits::static_query<T,
+ execution::blocking_adaptation_t::disallowed_t>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return traits::static_query<T,
+ execution::blocking_adaptation_t::disallowed_t>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::blocking_adaptation_t,
+ enable_if_t<
+ !execution::detail::blocking_adaptation_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::blocking_adaptation_t<0>::
+ query_member<T>::is_valid
+ && !traits::static_query<T,
+ execution::blocking_adaptation_t::disallowed_t>::is_valid
+ && traits::static_query<T,
+ execution::blocking_adaptation_t::allowed_t>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename traits::static_query<T,
+ execution::blocking_adaptation_t::allowed_t>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return traits::static_query<T,
+ execution::blocking_adaptation_t::allowed_t>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::blocking_adaptation_t::disallowed_t,
+ enable_if_t<
+ execution::detail::blocking_adaptation::disallowed_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::blocking_adaptation::disallowed_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::blocking_adaptation::disallowed_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::blocking_adaptation_t::disallowed_t,
+ enable_if_t<
+ !execution::detail::blocking_adaptation::disallowed_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::blocking_adaptation::disallowed_t<0>::
+ query_member<T>::is_valid
+ && !traits::query_free<T,
+ execution::blocking_adaptation_t::disallowed_t>::is_valid
+ && !can_query<T, execution::blocking_adaptation_t::allowed_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef execution::blocking_adaptation_t::disallowed_t result_type;
+
+ static constexpr result_type value()
+ {
+ return result_type();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::blocking_adaptation_t::allowed_t,
+ enable_if_t<
+ execution::detail::blocking_adaptation::allowed_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::blocking_adaptation::allowed_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::blocking_adaptation::allowed_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+template <typename T>
+struct require_free_default<T, execution::blocking_adaptation_t::allowed_t,
+ enable_if_t<
+ is_same<T, decay_t<T>>::value
+ && execution::is_executor<T>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef execution::detail::blocking_adaptation::adapter<T> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename Executor>
+struct equality_comparable<
+ execution::detail::blocking_adaptation::adapter<Executor>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename Executor, typename Function>
+struct execute_member<
+ execution::detail::blocking_adaptation::adapter<Executor>, Function>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename Executor, int I>
+struct query_static_constexpr_member<
+ execution::detail::blocking_adaptation::adapter<Executor>,
+ execution::detail::blocking_adaptation_t<I>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef execution::blocking_adaptation_t::allowed_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return result_type();
+ }
+};
+
+template <typename Executor, int I>
+struct query_static_constexpr_member<
+ execution::detail::blocking_adaptation::adapter<Executor>,
+ execution::detail::blocking_adaptation::allowed_t<I>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef execution::blocking_adaptation_t::allowed_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return result_type();
+ }
+};
+
+template <typename Executor, int I>
+struct query_static_constexpr_member<
+ execution::detail::blocking_adaptation::adapter<Executor>,
+ execution::detail::blocking_adaptation::disallowed_t<I>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef execution::blocking_adaptation_t::allowed_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return result_type();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename Executor, typename Property>
+struct query_member<
+ execution::detail::blocking_adaptation::adapter<Executor>, Property,
+ enable_if_t<
+ can_query<const Executor&, Property>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<Executor, Property>::value;
+ typedef query_result_t<Executor, Property> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename Executor, int I>
+struct require_member<
+ execution::detail::blocking_adaptation::adapter<Executor>,
+ execution::detail::blocking_adaptation::disallowed_t<I>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef Executor result_type;
+};
+
+template <typename Executor, typename Property>
+struct require_member<
+ execution::detail::blocking_adaptation::adapter<Executor>, Property,
+ enable_if_t<
+ can_require<const Executor&, Property>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_require<Executor, Property>::value;
+ typedef execution::detail::blocking_adaptation::adapter<
+ decay_t<require_result_t<Executor, Property>>> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+template <typename Executor, typename Property>
+struct prefer_member<
+ execution::detail::blocking_adaptation::adapter<Executor>, Property,
+ enable_if_t<
+ can_prefer<const Executor&, Property>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_prefer<Executor, Property>::value;
+ typedef execution::detail::blocking_adaptation::adapter<
+ decay_t<prefer_result_t<Executor, Property>>> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+} // namespace traits
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_BLOCKING_ADAPTATION_HPP
diff --git a/3rdparty/asio/include/asio/execution/context.hpp b/3rdparty/asio/include/asio/execution/context.hpp
new file mode 100644
index 00000000000..a9df9c1c4b6
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/context.hpp
@@ -0,0 +1,191 @@
+//
+// execution/context.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CONTEXT2_HPP
+#define ASIO_EXECUTION_CONTEXT2_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/execution/executor.hpp"
+#include "asio/is_applicable_property.hpp"
+#include "asio/traits/query_static_constexpr_member.hpp"
+#include "asio/traits/static_query.hpp"
+
+#if defined(ASIO_HAS_STD_ANY)
+# include <any>
+#endif // defined(ASIO_HAS_STD_ANY)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+/// A property that is used to obtain the execution context that is associated
+/// with an executor.
+struct context_t
+{
+ /// The context_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The context_t property cannot be required.
+ static constexpr bool is_requirable = false;
+
+ /// The context_t property cannot be preferred.
+ static constexpr bool is_preferable = false;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef std::any polymorphic_query_result_type;
+};
+
+/// A special value used for accessing the context_t property.
+constexpr context_t context;
+
+} // namespace execution
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+namespace detail {
+
+template <int I = 0>
+struct context_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = false;
+ static constexpr bool is_preferable = false;
+
+#if defined(ASIO_HAS_STD_ANY)
+ typedef std::any polymorphic_query_result_type;
+#endif // defined(ASIO_HAS_STD_ANY)
+
+ constexpr context_t()
+ {
+ }
+
+ template <typename T>
+ struct static_proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ static constexpr auto query(P&& p)
+ noexcept(
+ noexcept(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ {
+ return T::query(static_cast<P&&>(p));
+ }
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename static_proxy<T>::type, context_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename E, typename T = decltype(context_t::static_query<E>())>
+ static constexpr const T static_query_v = context_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T context_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace detail
+
+typedef detail::context_t<> context_t;
+
+constexpr context_t context;
+
+} // namespace execution
+
+#if !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct is_applicable_property<T, execution::context_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+#endif // !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct static_query<T, execution::context_t,
+ enable_if_t<
+ execution::detail::context_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::context_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::context_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace traits
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_CONTEXT2_HPP
diff --git a/3rdparty/asio/include/asio/execution/context_as.hpp b/3rdparty/asio/include/asio/execution/context_as.hpp
new file mode 100644
index 00000000000..f51fb1dc4c7
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/context_as.hpp
@@ -0,0 +1,190 @@
+//
+// execution/context_as.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_AS_HPP
+#define ASIO_EXECUTION_CONTEXT_AS_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/execution/context.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/is_applicable_property.hpp"
+#include "asio/query.hpp"
+#include "asio/traits/query_static_constexpr_member.hpp"
+#include "asio/traits/static_query.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+/// A property that is used to obtain the execution context that is associated
+/// with an executor.
+template <typename U>
+struct context_as_t
+{
+ /// The context_as_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The context_t property cannot be required.
+ static constexpr bool is_requirable = false;
+
+ /// The context_t property cannot be preferred.
+ static constexpr bool is_preferable = false;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef T polymorphic_query_result_type;
+};
+
+/// A special value used for accessing the context_as_t property.
+template <typename U>
+constexpr context_as_t context_as;
+
+} // namespace execution
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+template <typename T>
+struct context_as_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename U>
+ static constexpr bool is_applicable_property_v = is_executor<U>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = false;
+ static constexpr bool is_preferable = false;
+
+ typedef T polymorphic_query_result_type;
+
+ constexpr context_as_t()
+ {
+ }
+
+ constexpr context_as_t(context_t)
+ {
+ }
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename E>
+ static constexpr
+ typename context_t::query_static_constexpr_member<E>::result_type
+ static_query()
+ noexcept(context_t::query_static_constexpr_member<E>::is_noexcept)
+ {
+ return context_t::query_static_constexpr_member<E>::value();
+ }
+
+ template <typename E, typename U = decltype(context_as_t::static_query<E>())>
+ static constexpr const U static_query_v
+ = context_as_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ template <typename Executor, typename U>
+ friend constexpr U query(
+ const Executor& ex, const context_as_t<U>&,
+ enable_if_t<
+ is_same<T, U>::value
+ >* = 0,
+ enable_if_t<
+ can_query<const Executor&, const context_t&>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(is_nothrow_query<const Executor&, const context_t&>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, const context_t&>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, context);
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <typename T> template <typename E, typename U>
+const U context_as_t<T>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES) \
+ || defined(GENERATING_DOCUMENTATION)
+template <typename T>
+constexpr context_as_t<T> context_as{};
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ // || defined(GENERATING_DOCUMENTATION)
+
+} // namespace execution
+
+#if !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename U>
+struct is_applicable_property<T, execution::context_as_t<U>>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+#endif // !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename T, typename U>
+struct static_query<T, execution::context_as_t<U>,
+ enable_if_t<
+ static_query<T, execution::context_t>::is_valid
+ >> : static_query<T, execution::context_t>
+{
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename T, typename U>
+struct query_free<T, execution::context_as_t<U>,
+ enable_if_t<
+ can_query<const T&, const execution::context_t&>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<const T&, const execution::context_t&>::value;
+
+ typedef U result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+} // namespace traits
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_CONTEXT_AS_HPP
diff --git a/3rdparty/asio/include/asio/execution/executor.hpp b/3rdparty/asio/include/asio/execution/executor.hpp
new file mode 100644
index 00000000000..1f34981fa78
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/executor.hpp
@@ -0,0 +1,116 @@
+//
+// execution/executor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_EXECUTOR_HPP
+#define ASIO_EXECUTION_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/execution/invocable_archetype.hpp"
+#include "asio/traits/equality_comparable.hpp"
+#include "asio/traits/execute_member.hpp"
+
+#if defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) \
+ && defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+# define ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT 1
+#endif // defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+ // && defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace execution {
+namespace detail {
+
+template <typename T, typename F,
+ typename = void, typename = void, typename = void, typename = void,
+ typename = void, typename = void, typename = void, typename = void>
+struct is_executor_of_impl : false_type
+{
+};
+
+template <typename T, typename F>
+struct is_executor_of_impl<T, F,
+ enable_if_t<
+ traits::execute_member<add_const_t<T>, F>::is_valid
+ >,
+ void_t<
+ result_of_t<decay_t<F>&()>
+ >,
+ enable_if_t<
+ is_constructible<decay_t<F>, F>::value
+ >,
+ enable_if_t<
+ is_move_constructible<decay_t<F>>::value
+ >,
+ enable_if_t<
+ is_nothrow_copy_constructible<T>::value
+ >,
+ enable_if_t<
+ is_nothrow_destructible<T>::value
+ >,
+ enable_if_t<
+ traits::equality_comparable<T>::is_valid
+ >,
+ enable_if_t<
+ traits::equality_comparable<T>::is_noexcept
+ >> : true_type
+{
+};
+
+} // namespace detail
+
+/// The is_executor trait detects whether a type T satisfies the
+/// execution::executor concept.
+/**
+ * Class template @c is_executor is a UnaryTypeTrait that is derived from @c
+ * true_type if the type @c T meets the concept definition for an executor,
+ * otherwise @c false_type.
+ */
+template <typename T>
+struct is_executor :
+#if defined(GENERATING_DOCUMENTATION)
+ integral_constant<bool, automatically_determined>
+#else // defined(GENERATING_DOCUMENTATION)
+ detail::is_executor_of_impl<T, invocable_archetype>
+#endif // defined(GENERATING_DOCUMENTATION)
+{
+};
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T>
+constexpr const bool is_executor_v = is_executor<T>::value;
+
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+#if defined(ASIO_HAS_CONCEPTS)
+
+template <typename T>
+ASIO_CONCEPT executor = is_executor<T>::value;
+
+#define ASIO_EXECUTION_EXECUTOR ::asio::execution::executor
+
+#else // defined(ASIO_HAS_CONCEPTS)
+
+#define ASIO_EXECUTION_EXECUTOR typename
+
+#endif // defined(ASIO_HAS_CONCEPTS)
+
+} // namespace execution
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/execution/impl/bad_executor.ipp b/3rdparty/asio/include/asio/execution/impl/bad_executor.ipp
new file mode 100644
index 00000000000..4e185acb059
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/impl/bad_executor.ipp
@@ -0,0 +1,40 @@
+//
+// exection/impl/bad_executor.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_IMPL_BAD_EXECUTOR_IPP
+#define ASIO_EXECUTION_IMPL_BAD_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/execution/bad_executor.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace execution {
+
+bad_executor::bad_executor() noexcept
+{
+}
+
+const char* bad_executor::what() const noexcept
+{
+ return "bad executor";
+}
+
+} // namespace execution
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_IMPL_BAD_EXECUTOR_IPP
diff --git a/3rdparty/asio/include/asio/execution/invocable_archetype.hpp b/3rdparty/asio/include/asio/execution/invocable_archetype.hpp
new file mode 100644
index 00000000000..50223279e1f
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/invocable_archetype.hpp
@@ -0,0 +1,43 @@
+//
+// execution/invocable_archetype.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_INVOCABLE_ARCHETYPE_HPP
+#define ASIO_EXECUTION_INVOCABLE_ARCHETYPE_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 execution {
+
+/// An archetypal function object used for determining adherence to the
+/// execution::executor concept.
+struct invocable_archetype
+{
+ /// Function call operator.
+ template <typename... Args>
+ void operator()(Args&&...)
+ {
+ }
+};
+
+} // namespace execution
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_INVOCABLE_ARCHETYPE_HPP
+
diff --git a/3rdparty/asio/include/asio/execution/mapping.hpp b/3rdparty/asio/include/asio/execution/mapping.hpp
new file mode 100644
index 00000000000..4c6e1791869
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/mapping.hpp
@@ -0,0 +1,1002 @@
+//
+// execution/mapping.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_MAPPING_HPP
+#define ASIO_EXECUTION_MAPPING_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/execution/executor.hpp"
+#include "asio/is_applicable_property.hpp"
+#include "asio/query.hpp"
+#include "asio/traits/query_free.hpp"
+#include "asio/traits/query_member.hpp"
+#include "asio/traits/query_static_constexpr_member.hpp"
+#include "asio/traits/static_query.hpp"
+#include "asio/traits/static_require.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+/// A property to describe what guarantees an executor makes about the mapping
+/// of execution agents on to threads of execution.
+struct mapping_t
+{
+ /// The mapping_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The top-level mapping_t property cannot be required.
+ static constexpr bool is_requirable = false;
+
+ /// The top-level mapping_t property cannot be preferred.
+ static constexpr bool is_preferable = false;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef mapping_t polymorphic_query_result_type;
+
+ /// A sub-property that indicates that execution agents are mapped on to
+ /// threads of execution.
+ struct thread_t
+ {
+ /// The mapping_t::thread_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The mapping_t::thread_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The mapping_t::thread_t property can be preferred.
+ static constexpr bool is_preferable = true;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef mapping_t polymorphic_query_result_type;
+
+ /// Default constructor.
+ constexpr thread_t();
+
+ /// Get the value associated with a property object.
+ /**
+ * @returns thread_t();
+ */
+ static constexpr mapping_t value();
+ };
+
+ /// A sub-property that indicates that execution agents are mapped on to
+ /// new threads of execution.
+ struct new_thread_t
+ {
+ /// The mapping_t::new_thread_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The mapping_t::new_thread_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The mapping_t::new_thread_t property can be preferred.
+ static constexpr bool is_preferable = true;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef mapping_t polymorphic_query_result_type;
+
+ /// Default constructor.
+ constexpr new_thread_t();
+
+ /// Get the value associated with a property object.
+ /**
+ * @returns new_thread_t();
+ */
+ static constexpr mapping_t value();
+ };
+
+ /// A sub-property that indicates that the mapping of execution agents is
+ /// implementation-defined.
+ struct other_t
+ {
+ /// The mapping_t::other_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The mapping_t::other_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The mapping_t::other_t property can be preferred.
+ static constexpr bool is_preferable = true;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef mapping_t polymorphic_query_result_type;
+
+ /// Default constructor.
+ constexpr other_t();
+
+ /// Get the value associated with a property object.
+ /**
+ * @returns other_t();
+ */
+ static constexpr mapping_t value();
+ };
+
+ /// A special value used for accessing the mapping_t::thread_t property.
+ static constexpr thread_t thread;
+
+ /// A special value used for accessing the mapping_t::new_thread_t property.
+ static constexpr new_thread_t new_thread;
+
+ /// A special value used for accessing the mapping_t::other_t property.
+ static constexpr other_t other;
+
+ /// Default constructor.
+ constexpr mapping_t();
+
+ /// Construct from a sub-property value.
+ constexpr mapping_t(thread_t);
+
+ /// Construct from a sub-property value.
+ constexpr mapping_t(new_thread_t);
+
+ /// Construct from a sub-property value.
+ constexpr mapping_t(other_t);
+
+ /// Compare property values for equality.
+ friend constexpr bool operator==(
+ const mapping_t& a, const mapping_t& b) noexcept;
+
+ /// Compare property values for inequality.
+ friend constexpr bool operator!=(
+ const mapping_t& a, const mapping_t& b) noexcept;
+};
+
+/// A special value used for accessing the mapping_t property.
+constexpr mapping_t mapping;
+
+} // namespace execution
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+namespace detail {
+namespace mapping {
+
+template <int I> struct thread_t;
+template <int I> struct new_thread_t;
+template <int I> struct other_t;
+
+} // namespace mapping
+
+template <int I = 0>
+struct mapping_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = false;
+ static constexpr bool is_preferable = false;
+ typedef mapping_t polymorphic_query_result_type;
+
+ typedef detail::mapping::thread_t<I> thread_t;
+ typedef detail::mapping::new_thread_t<I> new_thread_t;
+ typedef detail::mapping::other_t<I> other_t;
+
+ constexpr mapping_t()
+ : value_(-1)
+ {
+ }
+
+ constexpr mapping_t(thread_t)
+ : value_(0)
+ {
+ }
+
+ constexpr mapping_t(new_thread_t)
+ : value_(1)
+ {
+ }
+
+ constexpr mapping_t(other_t)
+ : value_(2)
+ {
+ }
+
+ template <typename T>
+ struct proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ auto query(P&& p) const
+ noexcept(
+ noexcept(
+ declval<conditional_t<true, T, P>>().query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ declval<conditional_t<true, T, P>>().query(static_cast<P&&>(p))
+ );
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct static_proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ static constexpr auto query(P&& p)
+ noexcept(
+ noexcept(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ {
+ return T::query(static_cast<P&&>(p));
+ }
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<typename proxy<T>::type, mapping_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename static_proxy<T>::type, mapping_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr
+ typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, thread_t>::result_type
+ static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ traits::static_query<T, thread_t>::is_valid
+ >* = 0) noexcept
+ {
+ return traits::static_query<T, thread_t>::value();
+ }
+
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, new_thread_t>::result_type
+ static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::static_query<T, thread_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ traits::static_query<T, new_thread_t>::is_valid
+ >* = 0) noexcept
+ {
+ return traits::static_query<T, new_thread_t>::value();
+ }
+
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, other_t>::result_type
+ static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::static_query<T, thread_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::static_query<T, new_thread_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ traits::static_query<T, other_t>::is_valid
+ >* = 0) noexcept
+ {
+ return traits::static_query<T, other_t>::value();
+ }
+
+ template <typename E, typename T = decltype(mapping_t::static_query<E>())>
+ static constexpr const T static_query_v
+ = mapping_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ friend constexpr bool operator==(
+ const mapping_t& a, const mapping_t& b)
+ {
+ return a.value_ == b.value_;
+ }
+
+ friend constexpr bool operator!=(
+ const mapping_t& a, const mapping_t& b)
+ {
+ return a.value_ != b.value_;
+ }
+
+ struct convertible_from_mapping_t
+ {
+ constexpr convertible_from_mapping_t(mapping_t) {}
+ };
+
+ template <typename Executor>
+ friend constexpr mapping_t query(
+ const Executor& ex, convertible_from_mapping_t,
+ enable_if_t<
+ can_query<const Executor&, thread_t>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(is_nothrow_query<const Executor&, mapping_t<>::thread_t>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, thread_t>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, thread_t());
+ }
+
+ template <typename Executor>
+ friend constexpr mapping_t query(
+ const Executor& ex, convertible_from_mapping_t,
+ enable_if_t<
+ !can_query<const Executor&, thread_t>::value
+ >* = 0,
+ enable_if_t<
+ can_query<const Executor&, new_thread_t>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(
+ is_nothrow_query<const Executor&, mapping_t<>::new_thread_t>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, new_thread_t>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, new_thread_t());
+ }
+
+ template <typename Executor>
+ friend constexpr mapping_t query(
+ const Executor& ex, convertible_from_mapping_t,
+ enable_if_t<
+ !can_query<const Executor&, thread_t>::value
+ >* = 0,
+ enable_if_t<
+ !can_query<const Executor&, new_thread_t>::value
+ >* = 0,
+ enable_if_t<
+ can_query<const Executor&, other_t>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(is_nothrow_query<const Executor&, mapping_t<>::other_t>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, other_t>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, other_t());
+ }
+
+ ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(thread_t, thread);
+ ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(new_thread_t, new_thread);
+ ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(other_t, other);
+
+private:
+ int value_;
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T mapping_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <int I>
+const typename mapping_t<I>::thread_t mapping_t<I>::thread;
+
+template <int I>
+const typename mapping_t<I>::new_thread_t mapping_t<I>::new_thread;
+
+template <int I>
+const typename mapping_t<I>::other_t mapping_t<I>::other;
+
+namespace mapping {
+
+template <int I = 0>
+struct thread_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+ typedef mapping_t<I> polymorphic_query_result_type;
+
+ constexpr thread_t()
+ {
+ }
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<
+ typename mapping_t<I>::template proxy<T>::type, thread_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename mapping_t<I>::template static_proxy<T>::type, thread_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr
+ typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename T>
+ static constexpr thread_t static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::query_free<T, thread_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ !can_query<T, new_thread_t<I>>::value
+ >* = 0,
+ enable_if_t<
+ !can_query<T, other_t<I>>::value
+ >* = 0) noexcept
+ {
+ return thread_t();
+ }
+
+ template <typename E, typename T = decltype(thread_t::static_query<E>())>
+ static constexpr const T static_query_v
+ = thread_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ static constexpr mapping_t<I> value()
+ {
+ return thread_t();
+ }
+
+ friend constexpr bool operator==(const thread_t&, const thread_t&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator!=(const thread_t&, const thread_t&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator==(const thread_t&, const new_thread_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const thread_t&, const new_thread_t<I>&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator==(const thread_t&, const other_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const thread_t&, const other_t<I>&)
+ {
+ return true;
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T thread_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <int I = 0>
+struct new_thread_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+ typedef mapping_t<I> polymorphic_query_result_type;
+
+ constexpr new_thread_t()
+ {
+ }
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<
+ typename mapping_t<I>::template proxy<T>::type, new_thread_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename mapping_t<I>::template static_proxy<T>::type, new_thread_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename E, typename T = decltype(new_thread_t::static_query<E>())>
+ static constexpr const T static_query_v = new_thread_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ static constexpr mapping_t<I> value()
+ {
+ return new_thread_t();
+ }
+
+ friend constexpr bool operator==(const new_thread_t&, const new_thread_t&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator!=(const new_thread_t&, const new_thread_t&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator==(const new_thread_t&, const thread_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const new_thread_t&, const thread_t<I>&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator==(const new_thread_t&, const other_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const new_thread_t&, const other_t<I>&)
+ {
+ return true;
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T new_thread_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <int I>
+struct other_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+ typedef mapping_t<I> polymorphic_query_result_type;
+
+ constexpr other_t()
+ {
+ }
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<
+ typename mapping_t<I>::template proxy<T>::type, other_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename mapping_t<I>::template static_proxy<T>::type, other_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr
+ typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename E, typename T = decltype(other_t::static_query<E>())>
+ static constexpr const T static_query_v = other_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ static constexpr mapping_t<I> value()
+ {
+ return other_t();
+ }
+
+ friend constexpr bool operator==(const other_t&, const other_t&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator!=(const other_t&, const other_t&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator==(const other_t&, const thread_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const other_t&, const thread_t<I>&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator==(const other_t&, const new_thread_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const other_t&, const new_thread_t<I>&)
+ {
+ return true;
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T other_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace mapping
+} // namespace detail
+
+typedef detail::mapping_t<> mapping_t;
+
+constexpr mapping_t mapping;
+
+} // namespace execution
+
+#if !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct is_applicable_property<T, execution::mapping_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+template <typename T>
+struct is_applicable_property<T, execution::mapping_t::thread_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+template <typename T>
+struct is_applicable_property<T, execution::mapping_t::new_thread_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+template <typename T>
+struct is_applicable_property<T, execution::mapping_t::other_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+#endif // !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename T>
+struct query_free_default<T, execution::mapping_t,
+ enable_if_t<
+ can_query<T, execution::mapping_t::thread_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<T, execution::mapping_t::thread_t>::value;
+
+ typedef execution::mapping_t result_type;
+};
+
+template <typename T>
+struct query_free_default<T, execution::mapping_t,
+ enable_if_t<
+ !can_query<T, execution::mapping_t::thread_t>::value
+ && can_query<T, execution::mapping_t::new_thread_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<T, execution::mapping_t::new_thread_t>::value;
+
+ typedef execution::mapping_t result_type;
+};
+
+template <typename T>
+struct query_free_default<T, execution::mapping_t,
+ enable_if_t<
+ !can_query<T, execution::mapping_t::thread_t>::value
+ && !can_query<T, execution::mapping_t::new_thread_t>::value
+ && can_query<T, execution::mapping_t::other_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<T, execution::mapping_t::other_t>::value;
+
+ typedef execution::mapping_t result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct static_query<T, execution::mapping_t,
+ enable_if_t<
+ execution::detail::mapping_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::mapping_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::mapping_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::mapping_t,
+ enable_if_t<
+ !execution::detail::mapping_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::mapping_t<0>::
+ query_member<T>::is_valid
+ && traits::static_query<T, execution::mapping_t::thread_t>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename traits::static_query<T,
+ execution::mapping_t::thread_t>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return traits::static_query<T, execution::mapping_t::thread_t>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::mapping_t,
+ enable_if_t<
+ !execution::detail::mapping_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::mapping_t<0>::
+ query_member<T>::is_valid
+ && !traits::static_query<T, execution::mapping_t::thread_t>::is_valid
+ && traits::static_query<T, execution::mapping_t::new_thread_t>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename traits::static_query<T,
+ execution::mapping_t::new_thread_t>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return traits::static_query<T, execution::mapping_t::new_thread_t>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::mapping_t,
+ enable_if_t<
+ !execution::detail::mapping_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::mapping_t<0>::
+ query_member<T>::is_valid
+ && !traits::static_query<T, execution::mapping_t::thread_t>::is_valid
+ && !traits::static_query<T, execution::mapping_t::new_thread_t>::is_valid
+ && traits::static_query<T, execution::mapping_t::other_t>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename traits::static_query<T,
+ execution::mapping_t::other_t>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return traits::static_query<T, execution::mapping_t::other_t>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::mapping_t::thread_t,
+ enable_if_t<
+ execution::detail::mapping::thread_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::mapping::thread_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::mapping::thread_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::mapping_t::thread_t,
+ enable_if_t<
+ !execution::detail::mapping::thread_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::mapping::thread_t<0>::
+ query_member<T>::is_valid
+ && !traits::query_free<T, execution::mapping_t::thread_t>::is_valid
+ && !can_query<T, execution::mapping_t::new_thread_t>::value
+ && !can_query<T, execution::mapping_t::other_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef execution::mapping_t::thread_t result_type;
+
+ static constexpr result_type value()
+ {
+ return result_type();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::mapping_t::new_thread_t,
+ enable_if_t<
+ execution::detail::mapping::new_thread_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::mapping::new_thread_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::mapping::new_thread_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::mapping_t::other_t,
+ enable_if_t<
+ execution::detail::mapping::other_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::mapping::other_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::mapping::other_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace traits
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_MAPPING_HPP
diff --git a/3rdparty/asio/include/asio/execution/occupancy.hpp b/3rdparty/asio/include/asio/execution/occupancy.hpp
new file mode 100644
index 00000000000..c986c88113d
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/occupancy.hpp
@@ -0,0 +1,184 @@
+//
+// execution/occupancy.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_OCCUPANCY_HPP
+#define ASIO_EXECUTION_OCCUPANCY_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/execution/executor.hpp"
+#include "asio/is_applicable_property.hpp"
+#include "asio/traits/query_static_constexpr_member.hpp"
+#include "asio/traits/static_query.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+/// A property that gives an estimate of the number of execution agents that
+/// should occupy the associated execution context.
+struct occupancy_t
+{
+ /// The occupancy_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The occupancy_t property cannot be required.
+ static constexpr bool is_requirable = false;
+
+ /// The occupancy_t property cannot be preferred.
+ static constexpr bool is_preferable = false;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef std::size_t polymorphic_query_result_type;
+};
+
+/// A special value used for accessing the occupancy_t property.
+constexpr occupancy_t occupancy;
+
+} // namespace execution
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+namespace detail {
+
+template <int I = 0>
+struct occupancy_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = false;
+ static constexpr bool is_preferable = false;
+ typedef std::size_t polymorphic_query_result_type;
+
+ constexpr occupancy_t()
+ {
+ }
+
+ template <typename T>
+ struct static_proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ static constexpr auto query(P&& p)
+ noexcept(
+ noexcept(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ {
+ return T::query(static_cast<P&&>(p));
+ }
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename static_proxy<T>::type, occupancy_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename E, typename T = decltype(occupancy_t::static_query<E>())>
+ static constexpr const T static_query_v = occupancy_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T occupancy_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace detail
+
+typedef detail::occupancy_t<> occupancy_t;
+
+constexpr occupancy_t occupancy;
+
+} // namespace execution
+
+#if !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct is_applicable_property<T, execution::occupancy_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+#endif // !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct static_query<T, execution::occupancy_t,
+ enable_if_t<
+ execution::detail::occupancy_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::occupancy_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::occupancy_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace traits
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_OCCUPANCY_HPP
diff --git a/3rdparty/asio/include/asio/execution/outstanding_work.hpp b/3rdparty/asio/include/asio/execution/outstanding_work.hpp
new file mode 100644
index 00000000000..600792b95b4
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/outstanding_work.hpp
@@ -0,0 +1,753 @@
+//
+// execution/outstanding_work.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_OUTSTANDING_WORK_HPP
+#define ASIO_EXECUTION_OUTSTANDING_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/detail/type_traits.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/is_applicable_property.hpp"
+#include "asio/query.hpp"
+#include "asio/traits/query_free.hpp"
+#include "asio/traits/query_member.hpp"
+#include "asio/traits/query_static_constexpr_member.hpp"
+#include "asio/traits/static_query.hpp"
+#include "asio/traits/static_require.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+/// A property to describe whether task submission is likely in the future.
+struct outstanding_work_t
+{
+ /// The outstanding_work_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The top-level outstanding_work_t property cannot be required.
+ static constexpr bool is_requirable = false;
+
+ /// The top-level outstanding_work_t property cannot be preferred.
+ static constexpr bool is_preferable = false;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef outstanding_work_t polymorphic_query_result_type;
+
+ /// A sub-property that indicates that the executor does not represent likely
+ /// future submission of a function object.
+ struct untracked_t
+ {
+ /// The outstanding_work_t::untracked_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The outstanding_work_t::untracked_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The outstanding_work_t::untracked_t property can be preferred.
+ static constexpr bool is_preferable = true;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef outstanding_work_t polymorphic_query_result_type;
+
+ /// Default constructor.
+ constexpr untracked_t();
+
+ /// Get the value associated with a property object.
+ /**
+ * @returns untracked_t();
+ */
+ static constexpr outstanding_work_t value();
+ };
+
+ /// A sub-property that indicates that the executor represents likely
+ /// future submission of a function object.
+ struct tracked_t
+ {
+ /// The outstanding_work_t::untracked_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The outstanding_work_t::tracked_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The outstanding_work_t::tracked_t property can be preferred.
+ static constexpr bool is_preferable = true;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef outstanding_work_t polymorphic_query_result_type;
+
+ /// Default constructor.
+ constexpr tracked_t();
+
+ /// Get the value associated with a property object.
+ /**
+ * @returns tracked_t();
+ */
+ static constexpr outstanding_work_t value();
+ };
+
+ /// A special value used for accessing the outstanding_work_t::untracked_t
+ /// property.
+ static constexpr untracked_t untracked;
+
+ /// A special value used for accessing the outstanding_work_t::tracked_t
+ /// property.
+ static constexpr tracked_t tracked;
+
+ /// Default constructor.
+ constexpr outstanding_work_t();
+
+ /// Construct from a sub-property value.
+ constexpr outstanding_work_t(untracked_t);
+
+ /// Construct from a sub-property value.
+ constexpr outstanding_work_t(tracked_t);
+
+ /// Compare property values for equality.
+ friend constexpr bool operator==(
+ const outstanding_work_t& a, const outstanding_work_t& b) noexcept;
+
+ /// Compare property values for inequality.
+ friend constexpr bool operator!=(
+ const outstanding_work_t& a, const outstanding_work_t& b) noexcept;
+};
+
+/// A special value used for accessing the outstanding_work_t property.
+constexpr outstanding_work_t outstanding_work;
+
+} // namespace execution
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+namespace detail {
+namespace outstanding_work {
+
+template <int I> struct untracked_t;
+template <int I> struct tracked_t;
+
+} // namespace outstanding_work
+
+template <int I = 0>
+struct outstanding_work_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = false;
+ static constexpr bool is_preferable = false;
+ typedef outstanding_work_t polymorphic_query_result_type;
+
+ typedef detail::outstanding_work::untracked_t<I> untracked_t;
+ typedef detail::outstanding_work::tracked_t<I> tracked_t;
+
+ constexpr outstanding_work_t()
+ : value_(-1)
+ {
+ }
+
+ constexpr outstanding_work_t(untracked_t)
+ : value_(0)
+ {
+ }
+
+ constexpr outstanding_work_t(tracked_t)
+ : value_(1)
+ {
+ }
+
+ template <typename T>
+ struct proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ auto query(P&& p) const
+ noexcept(
+ noexcept(
+ declval<conditional_t<true, T, P>>().query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ declval<conditional_t<true, T, P>>().query(static_cast<P&&>(p))
+ );
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct static_proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ static constexpr auto query(P&& p)
+ noexcept(
+ noexcept(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ {
+ return T::query(static_cast<P&&>(p));
+ }
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<typename proxy<T>::type, outstanding_work_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename static_proxy<T>::type, outstanding_work_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr
+ typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, untracked_t>::result_type
+ static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ traits::static_query<T, untracked_t>::is_valid
+ >* = 0) noexcept
+ {
+ return traits::static_query<T, untracked_t>::value();
+ }
+
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, tracked_t>::result_type
+ static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::static_query<T, untracked_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ traits::static_query<T, tracked_t>::is_valid
+ >* = 0) noexcept
+ {
+ return traits::static_query<T, tracked_t>::value();
+ }
+
+ template <typename E,
+ typename T = decltype(outstanding_work_t::static_query<E>())>
+ static constexpr const T static_query_v
+ = outstanding_work_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ friend constexpr bool operator==(
+ const outstanding_work_t& a, const outstanding_work_t& b)
+ {
+ return a.value_ == b.value_;
+ }
+
+ friend constexpr bool operator!=(
+ const outstanding_work_t& a, const outstanding_work_t& b)
+ {
+ return a.value_ != b.value_;
+ }
+
+ struct convertible_from_outstanding_work_t
+ {
+ constexpr convertible_from_outstanding_work_t(outstanding_work_t)
+ {
+ }
+ };
+
+ template <typename Executor>
+ friend constexpr outstanding_work_t query(
+ const Executor& ex, convertible_from_outstanding_work_t,
+ enable_if_t<
+ can_query<const Executor&, untracked_t>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(is_nothrow_query<const Executor&,
+ outstanding_work_t<>::untracked_t>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, untracked_t>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, untracked_t());
+ }
+
+ template <typename Executor>
+ friend constexpr outstanding_work_t query(
+ const Executor& ex, convertible_from_outstanding_work_t,
+ enable_if_t<
+ !can_query<const Executor&, untracked_t>::value
+ >* = 0,
+ enable_if_t<
+ can_query<const Executor&, tracked_t>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(is_nothrow_query<const Executor&,
+ outstanding_work_t<>::tracked_t>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, tracked_t>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, tracked_t());
+ }
+
+ ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(untracked_t, untracked);
+ ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(tracked_t, tracked);
+
+private:
+ int value_;
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T outstanding_work_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <int I>
+const typename outstanding_work_t<I>::untracked_t
+outstanding_work_t<I>::untracked;
+
+template <int I>
+const typename outstanding_work_t<I>::tracked_t
+outstanding_work_t<I>::tracked;
+
+namespace outstanding_work {
+
+template <int I = 0>
+struct untracked_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+ typedef outstanding_work_t<I> polymorphic_query_result_type;
+
+ constexpr untracked_t()
+ {
+ }
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<
+ typename outstanding_work_t<I>::template proxy<T>::type, untracked_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename outstanding_work_t<I>::template static_proxy<T>::type,
+ untracked_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr
+ typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename T>
+ static constexpr untracked_t static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::query_free<T, untracked_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ !can_query<T, tracked_t<I>>::value
+ >* = 0) noexcept
+ {
+ return untracked_t();
+ }
+
+ template <typename E, typename T = decltype(untracked_t::static_query<E>())>
+ static constexpr const T static_query_v = untracked_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ static constexpr outstanding_work_t<I> value()
+ {
+ return untracked_t();
+ }
+
+ friend constexpr bool operator==(const untracked_t&, const untracked_t&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator!=(const untracked_t&, const untracked_t&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator==(const untracked_t&, const tracked_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const untracked_t&, const tracked_t<I>&)
+ {
+ return true;
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T untracked_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <int I = 0>
+struct tracked_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+ typedef outstanding_work_t<I> polymorphic_query_result_type;
+
+ constexpr tracked_t()
+ {
+ }
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<
+ typename outstanding_work_t<I>::template proxy<T>::type, tracked_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename outstanding_work_t<I>::template static_proxy<T>::type,
+ tracked_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr
+ typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename E, typename T = decltype(tracked_t::static_query<E>())>
+ static constexpr const T static_query_v = tracked_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ static constexpr outstanding_work_t<I> value()
+ {
+ return tracked_t();
+ }
+
+ friend constexpr bool operator==(const tracked_t&, const tracked_t&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator!=(const tracked_t&, const tracked_t&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator==(const tracked_t&, const untracked_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const tracked_t&, const untracked_t<I>&)
+ {
+ return true;
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T tracked_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace outstanding_work
+} // namespace detail
+
+typedef detail::outstanding_work_t<> outstanding_work_t;
+
+constexpr outstanding_work_t outstanding_work;
+
+} // namespace execution
+
+#if !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct is_applicable_property<T, execution::outstanding_work_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+template <typename T>
+struct is_applicable_property<T, execution::outstanding_work_t::untracked_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+template <typename T>
+struct is_applicable_property<T, execution::outstanding_work_t::tracked_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+#endif // !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename T>
+struct query_free_default<T, execution::outstanding_work_t,
+ enable_if_t<
+ can_query<T, execution::outstanding_work_t::untracked_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<T, execution::outstanding_work_t::untracked_t>::value;
+
+ typedef execution::outstanding_work_t result_type;
+};
+
+template <typename T>
+struct query_free_default<T, execution::outstanding_work_t,
+ enable_if_t<
+ !can_query<T, execution::outstanding_work_t::untracked_t>::value
+ && can_query<T, execution::outstanding_work_t::tracked_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<T, execution::outstanding_work_t::tracked_t>::value;
+
+ typedef execution::outstanding_work_t result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct static_query<T, execution::outstanding_work_t,
+ enable_if_t<
+ execution::detail::outstanding_work_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::outstanding_work_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::outstanding_work_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::outstanding_work_t,
+ enable_if_t<
+ !execution::detail::outstanding_work_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::outstanding_work_t<0>::
+ query_member<T>::is_valid
+ && traits::static_query<T,
+ execution::outstanding_work_t::untracked_t>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename traits::static_query<T,
+ execution::outstanding_work_t::untracked_t>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return traits::static_query<T,
+ execution::outstanding_work_t::untracked_t>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::outstanding_work_t,
+ enable_if_t<
+ !execution::detail::outstanding_work_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::outstanding_work_t<0>::
+ query_member<T>::is_valid
+ && !traits::static_query<T,
+ execution::outstanding_work_t::untracked_t>::is_valid
+ && traits::static_query<T,
+ execution::outstanding_work_t::tracked_t>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename traits::static_query<T,
+ execution::outstanding_work_t::tracked_t>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return traits::static_query<T,
+ execution::outstanding_work_t::tracked_t>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::outstanding_work_t::untracked_t,
+ enable_if_t<
+ execution::detail::outstanding_work::untracked_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::outstanding_work::untracked_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::outstanding_work::untracked_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::outstanding_work_t::untracked_t,
+ enable_if_t<
+ !execution::detail::outstanding_work::untracked_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::outstanding_work::untracked_t<0>::
+ query_member<T>::is_valid
+ && !traits::query_free<T,
+ execution::outstanding_work_t::untracked_t>::is_valid
+ && !can_query<T, execution::outstanding_work_t::tracked_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef execution::outstanding_work_t::untracked_t result_type;
+
+ static constexpr result_type value()
+ {
+ return result_type();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::outstanding_work_t::tracked_t,
+ enable_if_t<
+ execution::detail::outstanding_work::tracked_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::outstanding_work::tracked_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::outstanding_work::tracked_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace traits
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_OUTSTANDING_WORK_HPP
diff --git a/3rdparty/asio/include/asio/execution/prefer_only.hpp b/3rdparty/asio/include/asio/execution/prefer_only.hpp
new file mode 100644
index 00000000000..1a990ebf392
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/prefer_only.hpp
@@ -0,0 +1,328 @@
+//
+// execution/prefer_only.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_PREFER_ONLY_HPP
+#define ASIO_EXECUTION_PREFER_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/type_traits.hpp"
+#include "asio/is_applicable_property.hpp"
+#include "asio/prefer.hpp"
+#include "asio/query.hpp"
+#include "asio/traits/static_query.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+/// A property adapter that is used with the polymorphic executor wrapper
+/// to mark properties as preferable, but not requirable.
+template <typename Property>
+struct prefer_only
+{
+ /// The prefer_only adapter applies to the same types as the nested property.
+ template <typename T>
+ static constexpr bool is_applicable_property_v =
+ is_applicable_property<T, Property>::value;
+
+ /// The context_t property cannot be required.
+ static constexpr bool is_requirable = false;
+
+ /// The context_t property can be preferred, it the underlying property can
+ /// be preferred.
+ /**
+ * @c true if @c Property::is_preferable is @c true, otherwise @c false.
+ */
+ static constexpr bool is_preferable = automatically_determined;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef typename Property::polymorphic_query_result_type
+ polymorphic_query_result_type;
+};
+
+} // namespace execution
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+namespace detail {
+
+template <typename InnerProperty, typename = void>
+struct prefer_only_is_preferable
+{
+ static constexpr bool is_preferable = false;
+};
+
+template <typename InnerProperty>
+struct prefer_only_is_preferable<InnerProperty,
+ enable_if_t<
+ InnerProperty::is_preferable
+ >
+ >
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <typename InnerProperty, typename = void>
+struct prefer_only_polymorphic_query_result_type
+{
+};
+
+template <typename InnerProperty>
+struct prefer_only_polymorphic_query_result_type<InnerProperty,
+ void_t<
+ typename InnerProperty::polymorphic_query_result_type
+ >
+ >
+{
+ typedef typename InnerProperty::polymorphic_query_result_type
+ polymorphic_query_result_type;
+};
+
+template <typename InnerProperty, typename = void>
+struct prefer_only_property
+{
+ InnerProperty property;
+
+ prefer_only_property(const InnerProperty& p)
+ : property(p)
+ {
+ }
+};
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+template <typename InnerProperty>
+struct prefer_only_property<InnerProperty,
+ void_t<
+ decltype(asio::declval<const InnerProperty>().value())
+ >
+ >
+{
+ InnerProperty property;
+
+ prefer_only_property(const InnerProperty& p)
+ : property(p)
+ {
+ }
+
+ constexpr auto value() const
+ noexcept(noexcept(asio::declval<const InnerProperty>().value()))
+ -> decltype(asio::declval<const InnerProperty>().value())
+ {
+ return property.value();
+ }
+};
+
+#else // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+struct prefer_only_memfns_base
+{
+ void value();
+};
+
+template <typename T>
+struct prefer_only_memfns_derived
+ : T, prefer_only_memfns_base
+{
+};
+
+template <typename T, T>
+struct prefer_only_memfns_check
+{
+};
+
+template <typename>
+char (&prefer_only_value_memfn_helper(...))[2];
+
+template <typename T>
+char prefer_only_value_memfn_helper(
+ prefer_only_memfns_check<
+ void (prefer_only_memfns_base::*)(),
+ &prefer_only_memfns_derived<T>::value>*);
+
+template <typename InnerProperty>
+struct prefer_only_property<InnerProperty,
+ enable_if_t<
+ sizeof(prefer_only_value_memfn_helper<InnerProperty>(0)) != 1
+ && !is_same<typename InnerProperty::polymorphic_query_result_type,
+ void>::value
+ >
+ >
+{
+ InnerProperty property;
+
+ prefer_only_property(const InnerProperty& p)
+ : property(p)
+ {
+ }
+
+ constexpr typename InnerProperty::polymorphic_query_result_type
+ value() const
+ {
+ return property.value();
+ }
+};
+
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+} // namespace detail
+
+template <typename InnerProperty>
+struct prefer_only :
+ detail::prefer_only_is_preferable<InnerProperty>,
+ detail::prefer_only_polymorphic_query_result_type<InnerProperty>,
+ detail::prefer_only_property<InnerProperty>
+{
+ static constexpr bool is_requirable = false;
+
+ constexpr prefer_only(const InnerProperty& p)
+ : detail::prefer_only_property<InnerProperty>(p)
+ {
+ }
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, InnerProperty>::result_type
+ static_query()
+ noexcept(traits::static_query<T, InnerProperty>::is_noexcept)
+ {
+ return traits::static_query<T, InnerProperty>::value();
+ }
+
+ template <typename E, typename T = decltype(prefer_only::static_query<E>())>
+ static constexpr const T static_query_v
+ = prefer_only::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ template <typename Executor, typename Property>
+ friend constexpr
+ prefer_result_t<const Executor&, const InnerProperty&>
+ prefer(const Executor& ex, const prefer_only<Property>& p,
+ enable_if_t<
+ is_same<Property, InnerProperty>::value
+ >* = 0,
+ enable_if_t<
+ can_prefer<const Executor&, const InnerProperty&>::value
+ >* = 0)
+#if !defined(ASIO_MSVC) \
+ && !defined(__clang__) // Clang crashes if noexcept is used here.
+ noexcept(is_nothrow_prefer<const Executor&, const InnerProperty&>::value)
+#endif // !defined(ASIO_MSVC)
+ // && !defined(__clang__)
+ {
+ return asio::prefer(ex, p.property);
+ }
+
+ template <typename Executor, typename Property>
+ friend constexpr
+ query_result_t<const Executor&, const InnerProperty&>
+ query(const Executor& ex, const prefer_only<Property>& p,
+ enable_if_t<
+ is_same<Property, InnerProperty>::value
+ >* = 0,
+ enable_if_t<
+ can_query<const Executor&, const InnerProperty&>::value
+ >* = 0)
+#if !defined(ASIO_MSVC) \
+ && !defined(__clang__) // Clang crashes if noexcept is used here.
+ noexcept(is_nothrow_query<const Executor&, const InnerProperty&>::value)
+#endif // !defined(ASIO_MSVC)
+ // && !defined(__clang__)
+ {
+ return asio::query(ex, p.property);
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <typename InnerProperty> template <typename E, typename T>
+const T prefer_only<InnerProperty>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace execution
+
+template <typename T, typename InnerProperty>
+struct is_applicable_property<T, execution::prefer_only<InnerProperty>>
+ : is_applicable_property<T, InnerProperty>
+{
+};
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename T, typename InnerProperty>
+struct static_query<T, execution::prefer_only<InnerProperty>> :
+ static_query<T, const InnerProperty&>
+{
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+#if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+template <typename T, typename InnerProperty>
+struct prefer_free_default<T, execution::prefer_only<InnerProperty>,
+ enable_if_t<
+ can_prefer<const T&, const InnerProperty&>::value
+ >
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_prefer<const T&, const InnerProperty&>::value;
+
+ typedef prefer_result_t<const T&, const InnerProperty&> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename T, typename InnerProperty>
+struct query_free<T, execution::prefer_only<InnerProperty>,
+ enable_if_t<
+ can_query<const T&, const InnerProperty&>::value
+ >
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<const T&, const InnerProperty&>::value;
+
+ typedef query_result_t<const T&, const InnerProperty&> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+} // namespace traits
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_PREFER_ONLY_HPP
diff --git a/3rdparty/asio/include/asio/execution/relationship.hpp b/3rdparty/asio/include/asio/execution/relationship.hpp
new file mode 100644
index 00000000000..e4f27555e24
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution/relationship.hpp
@@ -0,0 +1,751 @@
+//
+// execution/relationship.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_RELATIONSHIP_HPP
+#define ASIO_EXECUTION_RELATIONSHIP_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/execution/executor.hpp"
+#include "asio/is_applicable_property.hpp"
+#include "asio/query.hpp"
+#include "asio/traits/query_free.hpp"
+#include "asio/traits/query_member.hpp"
+#include "asio/traits/query_static_constexpr_member.hpp"
+#include "asio/traits/static_query.hpp"
+#include "asio/traits/static_require.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+
+/// A property to describe whether submitted tasks represent continuations of
+/// the calling context.
+struct relationship_t
+{
+ /// The relationship_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The top-level relationship_t property cannot be required.
+ static constexpr bool is_requirable = false;
+
+ /// The top-level relationship_t property cannot be preferred.
+ static constexpr bool is_preferable = false;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef relationship_t polymorphic_query_result_type;
+
+ /// A sub-property that indicates that the executor does not represent a
+ /// continuation of the calling context.
+ struct fork_t
+ {
+ /// The relationship_t::fork_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The relationship_t::fork_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The relationship_t::fork_t property can be preferred.
+ static constexpr bool is_preferable = true;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef relationship_t polymorphic_query_result_type;
+
+ /// Default constructor.
+ constexpr fork_t();
+
+ /// Get the value associated with a property object.
+ /**
+ * @returns fork_t();
+ */
+ static constexpr relationship_t value();
+ };
+
+ /// A sub-property that indicates that the executor represents a continuation
+ /// of the calling context.
+ struct continuation_t
+ {
+ /// The relationship_t::continuation_t property applies to executors.
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor_v<T>;
+
+ /// The relationship_t::continuation_t property can be required.
+ static constexpr bool is_requirable = true;
+
+ /// The relationship_t::continuation_t property can be preferred.
+ static constexpr bool is_preferable = true;
+
+ /// The type returned by queries against an @c any_executor.
+ typedef relationship_t polymorphic_query_result_type;
+
+ /// Default constructor.
+ constexpr continuation_t();
+
+ /// Get the value associated with a property object.
+ /**
+ * @returns continuation_t();
+ */
+ static constexpr relationship_t value();
+ };
+
+ /// A special value used for accessing the relationship_t::fork_t property.
+ static constexpr fork_t fork;
+
+ /// A special value used for accessing the relationship_t::continuation_t
+ /// property.
+ static constexpr continuation_t continuation;
+
+ /// Default constructor.
+ constexpr relationship_t();
+
+ /// Construct from a sub-property value.
+ constexpr relationship_t(fork_t);
+
+ /// Construct from a sub-property value.
+ constexpr relationship_t(continuation_t);
+
+ /// Compare property values for equality.
+ friend constexpr bool operator==(
+ const relationship_t& a, const relationship_t& b) noexcept;
+
+ /// Compare property values for inequality.
+ friend constexpr bool operator!=(
+ const relationship_t& a, const relationship_t& b) noexcept;
+};
+
+/// A special value used for accessing the relationship_t property.
+constexpr relationship_t relationship;
+
+} // namespace execution
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace execution {
+namespace detail {
+namespace relationship {
+
+template <int I> struct fork_t;
+template <int I> struct continuation_t;
+
+} // namespace relationship
+
+template <int I = 0>
+struct relationship_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = false;
+ static constexpr bool is_preferable = false;
+ typedef relationship_t polymorphic_query_result_type;
+
+ typedef detail::relationship::fork_t<I> fork_t;
+ typedef detail::relationship::continuation_t<I> continuation_t;
+
+ constexpr relationship_t()
+ : value_(-1)
+ {
+ }
+
+ constexpr relationship_t(fork_t)
+ : value_(0)
+ {
+ }
+
+ constexpr relationship_t(continuation_t)
+ : value_(1)
+ {
+ }
+
+ template <typename T>
+ struct proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ auto query(P&& p) const
+ noexcept(
+ noexcept(
+ declval<conditional_t<true, T, P>>().query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ declval<conditional_t<true, T, P>>().query(static_cast<P&&>(p))
+ );
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct static_proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ static constexpr auto query(P&& p)
+ noexcept(
+ noexcept(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ conditional_t<true, T, P>::query(static_cast<P&&>(p))
+ )
+ {
+ return T::query(static_cast<P&&>(p));
+ }
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+ };
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<typename proxy<T>::type, relationship_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename static_proxy<T>::type, relationship_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr
+ typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, fork_t>::result_type
+ static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ traits::static_query<T, fork_t>::is_valid
+ >* = 0) noexcept
+ {
+ return traits::static_query<T, fork_t>::value();
+ }
+
+ template <typename T>
+ static constexpr
+ typename traits::static_query<T, continuation_t>::result_type
+ static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::static_query<T, fork_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ traits::static_query<T, continuation_t>::is_valid
+ >* = 0) noexcept
+ {
+ return traits::static_query<T, continuation_t>::value();
+ }
+
+ template <typename E,
+ typename T = decltype(relationship_t::static_query<E>())>
+ static constexpr const T static_query_v
+ = relationship_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ friend constexpr bool operator==(
+ const relationship_t& a, const relationship_t& b)
+ {
+ return a.value_ == b.value_;
+ }
+
+ friend constexpr bool operator!=(
+ const relationship_t& a, const relationship_t& b)
+ {
+ return a.value_ != b.value_;
+ }
+
+ struct convertible_from_relationship_t
+ {
+ constexpr convertible_from_relationship_t(relationship_t)
+ {
+ }
+ };
+
+ template <typename Executor>
+ friend constexpr relationship_t query(
+ const Executor& ex, convertible_from_relationship_t,
+ enable_if_t<
+ can_query<const Executor&, fork_t>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(is_nothrow_query<const Executor&, relationship_t<>::fork_t>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, fork_t>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, fork_t());
+ }
+
+ template <typename Executor>
+ friend constexpr relationship_t query(
+ const Executor& ex, convertible_from_relationship_t,
+ enable_if_t<
+ !can_query<const Executor&, fork_t>::value
+ >* = 0,
+ enable_if_t<
+ can_query<const Executor&, continuation_t>::value
+ >* = 0)
+#if !defined(__clang__) // Clang crashes if noexcept is used here.
+#if defined(ASIO_MSVC) // Visual C++ wants the type to be qualified.
+ noexcept(is_nothrow_query<const Executor&,
+ relationship_t<>::continuation_t>::value)
+#else // defined(ASIO_MSVC)
+ noexcept(is_nothrow_query<const Executor&, continuation_t>::value)
+#endif // defined(ASIO_MSVC)
+#endif // !defined(__clang__)
+ {
+ return asio::query(ex, continuation_t());
+ }
+
+ ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(fork_t, fork);
+ ASIO_STATIC_CONSTEXPR_DEFAULT_INIT(continuation_t, continuation);
+
+private:
+ int value_;
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T relationship_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <int I>
+const typename relationship_t<I>::fork_t relationship_t<I>::fork;
+
+template <int I>
+const typename relationship_t<I>::continuation_t
+relationship_t<I>::continuation;
+
+namespace relationship {
+
+template <int I = 0>
+struct fork_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+ typedef relationship_t<I> polymorphic_query_result_type;
+
+ constexpr fork_t()
+ {
+ }
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<
+ typename relationship_t<I>::template proxy<T>::type, fork_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename relationship_t<I>::template static_proxy<T>::type, fork_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename T>
+ static constexpr fork_t static_query(
+ enable_if_t<
+ !query_static_constexpr_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !query_member<T>::is_valid
+ >* = 0,
+ enable_if_t<
+ !traits::query_free<T, fork_t>::is_valid
+ >* = 0,
+ enable_if_t<
+ !can_query<T, continuation_t<I>>::value
+ >* = 0) noexcept
+ {
+ return fork_t();
+ }
+
+ template <typename E, typename T = decltype(fork_t::static_query<E>())>
+ static constexpr const T static_query_v
+ = fork_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ static constexpr relationship_t<I> value()
+ {
+ return fork_t();
+ }
+
+ friend constexpr bool operator==(const fork_t&, const fork_t&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator!=(const fork_t&, const fork_t&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator==(const fork_t&, const continuation_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const fork_t&, const continuation_t<I>&)
+ {
+ return true;
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T fork_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <int I = 0>
+struct continuation_t
+{
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr bool is_applicable_property_v = is_executor<T>::value;
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+ typedef relationship_t<I> polymorphic_query_result_type;
+
+ constexpr continuation_t()
+ {
+ }
+
+ template <typename T>
+ struct query_member :
+ traits::query_member<
+ typename relationship_t<I>::template proxy<T>::type, continuation_t> {};
+
+ template <typename T>
+ struct query_static_constexpr_member :
+ traits::query_static_constexpr_member<
+ typename relationship_t<I>::template static_proxy<T>::type,
+ continuation_t> {};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+ template <typename T>
+ static constexpr typename query_static_constexpr_member<T>::result_type
+ static_query()
+ noexcept(query_static_constexpr_member<T>::is_noexcept)
+ {
+ return query_static_constexpr_member<T>::value();
+ }
+
+ template <typename E,
+ typename T = decltype(continuation_t::static_query<E>())>
+ static constexpr const T static_query_v
+ = continuation_t::static_query<E>();
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+ static constexpr relationship_t<I> value()
+ {
+ return continuation_t();
+ }
+
+ friend constexpr bool operator==(const continuation_t&, const continuation_t&)
+ {
+ return true;
+ }
+
+ friend constexpr bool operator!=(const continuation_t&, const continuation_t&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator==(const continuation_t&, const fork_t<I>&)
+ {
+ return false;
+ }
+
+ friend constexpr bool operator!=(const continuation_t&, const fork_t<I>&)
+ {
+ return true;
+ }
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+template <int I> template <typename E, typename T>
+const T continuation_t<I>::static_query_v;
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // && defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace relationship
+} // namespace detail
+
+typedef detail::relationship_t<> relationship_t;
+
+constexpr relationship_t relationship;
+
+} // namespace execution
+
+#if !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct is_applicable_property<T, execution::relationship_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+template <typename T>
+struct is_applicable_property<T, execution::relationship_t::fork_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+template <typename T>
+struct is_applicable_property<T, execution::relationship_t::continuation_t>
+ : integral_constant<bool, execution::is_executor<T>::value>
+{
+};
+
+#endif // !defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename T>
+struct query_free_default<T, execution::relationship_t,
+ enable_if_t<
+ can_query<T, execution::relationship_t::fork_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<T, execution::relationship_t::fork_t>::value;
+
+ typedef execution::relationship_t result_type;
+};
+
+template <typename T>
+struct query_free_default<T, execution::relationship_t,
+ enable_if_t<
+ !can_query<T, execution::relationship_t::fork_t>::value
+ && can_query<T, execution::relationship_t::continuation_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<T, execution::relationship_t::continuation_t>::value;
+
+ typedef execution::relationship_t result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT) \
+ || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+template <typename T>
+struct static_query<T, execution::relationship_t,
+ enable_if_t<
+ execution::detail::relationship_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::relationship_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::relationship_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::relationship_t,
+ enable_if_t<
+ !execution::detail::relationship_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::relationship_t<0>::
+ query_member<T>::is_valid
+ && traits::static_query<T,
+ execution::relationship_t::fork_t>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename traits::static_query<T,
+ execution::relationship_t::fork_t>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return traits::static_query<T,
+ execution::relationship_t::fork_t>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::relationship_t,
+ enable_if_t<
+ !execution::detail::relationship_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::relationship_t<0>::
+ query_member<T>::is_valid
+ && !traits::static_query<T,
+ execution::relationship_t::fork_t>::is_valid
+ && traits::static_query<T,
+ execution::relationship_t::continuation_t>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename traits::static_query<T,
+ execution::relationship_t::continuation_t>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return traits::static_query<T,
+ execution::relationship_t::continuation_t>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::relationship_t::fork_t,
+ enable_if_t<
+ execution::detail::relationship::fork_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::relationship::fork_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::relationship::fork_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::relationship_t::fork_t,
+ enable_if_t<
+ !execution::detail::relationship::fork_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ && !execution::detail::relationship::fork_t<0>::
+ query_member<T>::is_valid
+ && !traits::query_free<T,
+ execution::relationship_t::fork_t>::is_valid
+ && !can_query<T, execution::relationship_t::continuation_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef execution::relationship_t::fork_t result_type;
+
+ static constexpr result_type value()
+ {
+ return result_type();
+ }
+};
+
+template <typename T>
+struct static_query<T, execution::relationship_t::continuation_t,
+ enable_if_t<
+ execution::detail::relationship::continuation_t<0>::
+ query_static_constexpr_member<T>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef typename execution::detail::relationship::continuation_t<0>::
+ query_static_constexpr_member<T>::result_type result_type;
+
+ static constexpr result_type value()
+ {
+ return execution::detail::relationship::continuation_t<0>::
+ query_static_constexpr_member<T>::value();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+ // || !defined(ASIO_HAS_SFINAE_VARIABLE_TEMPLATES)
+
+} // namespace traits
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTION_RELATIONSHIP_HPP
diff --git a/3rdparty/asio/include/asio/execution_context.hpp b/3rdparty/asio/include/asio/execution_context.hpp
new file mode 100644
index 00000000000..bce8d431607
--- /dev/null
+++ b/3rdparty/asio/include/asio/execution_context.hpp
@@ -0,0 +1,388 @@
+//
+// execution_context.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <stdexcept>
+#include <typeinfo>
+#include "asio/detail/noncopyable.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+class execution_context;
+class io_context;
+
+#if !defined(GENERATING_DOCUMENTATION)
+template <typename Service> Service& use_service(execution_context&);
+template <typename Service> Service& use_service(io_context&);
+template <typename Service> void add_service(execution_context&, Service*);
+template <typename Service> 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<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>().
+ *
+ * Service objects may be explicitly added to an execution_context using the
+ * function template @c add_service<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
+ * <tt>execution_context::shutdown()</tt> followed by
+ * <tt>execution_context::destroy()</tt>.
+ *
+ * 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;
+
+public:
+ /// Constructor.
+ ASIO_DECL execution_context();
+
+ /// Destructor.
+ ASIO_DECL ~execution_context();
+
+protected:
+ /// 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
+ * <tt>delete static_cast<execution_context::service*>(svc)</tt>.
+ */
+ 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 <tt>svc->notify_fork();</tt>. 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 <typename Service>
+ 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 <typename Service>
+ friend Service& use_service(io_context& ioc);
+
+ /// 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 <typename Service, typename... Args>
+ friend Service& make_service(execution_context& e, Args&&... args);
+
+ /// (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<execution_context::service*>(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 <typename Service>
+ 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 <typename Service>
+ 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 <typename Type>
+class service_id
+ : public execution_context::id
+{
+};
+
+// Special service base class to keep classes header-file only.
+template <typename Type>
+class execution_context_service_base
+ : public execution_context::service
+{
+public:
+ static service_id<Type> id;
+
+ // Constructor.
+ execution_context_service_base(execution_context& e)
+ : execution_context::service(e)
+ {
+ }
+};
+
+template <typename Type>
+service_id<Type> execution_context_service_base<Type>::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/3rdparty/asio/include/asio/executor.hpp b/3rdparty/asio/include/asio/executor.hpp
new file mode 100644
index 00000000000..c056525460a
--- /dev/null
+++ b/3rdparty/asio/include/asio/executor.hpp
@@ -0,0 +1,363 @@
+//
+// executor.hpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
+#include <new>
+#include <typeinfo>
+#include "asio/detail/cstddef.hpp"
+#include "asio/detail/executor_function.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() noexcept;
+
+ /// Obtain message associated with exception.
+ ASIO_DECL virtual const char* what() const
+ noexcept;
+};
+
+/// Polymorphic wrapper for executors.
+class executor
+{
+public:
+ /// Default constructor.
+ executor() noexcept
+ : impl_(0)
+ {
+ }
+
+ /// Construct from nullptr.
+ executor(nullptr_t) noexcept
+ : impl_(0)
+ {
+ }
+
+ /// Copy constructor.
+ executor(const executor& other) noexcept
+ : impl_(other.clone())
+ {
+ }
+
+ /// Move constructor.
+ executor(executor&& other) noexcept
+ : impl_(other.impl_)
+ {
+ other.impl_ = 0;
+ }
+
+ /// Construct a polymorphic wrapper for the specified executor.
+ template <typename Executor>
+ executor(Executor e);
+
+ /// Construct a polymorphic executor that points to the same target as
+ /// another polymorphic executor.
+ executor(std::nothrow_t, const executor& other) noexcept
+ : impl_(other.clone())
+ {
+ }
+
+ /// Construct a polymorphic executor that moves the target from another
+ /// polymorphic executor.
+ executor(std::nothrow_t, executor&& other) noexcept
+ : impl_(other.impl_)
+ {
+ other.impl_ = 0;
+ }
+
+ /// Construct a polymorphic wrapper for the specified executor.
+ template <typename Executor>
+ executor(std::nothrow_t, Executor e) noexcept;
+
+ /// Allocator-aware constructor to create a polymorphic wrapper for the
+ /// specified executor.
+ template <typename Executor, typename Allocator>
+ executor(allocator_arg_t, const Allocator& a, Executor e);
+
+ /// Destructor.
+ ~executor()
+ {
+ destroy();
+ }
+
+ /// Assignment operator.
+ executor& operator=(const executor& other) noexcept
+ {
+ destroy();
+ impl_ = other.clone();
+ return *this;
+ }
+
+ // Move assignment operator.
+ executor& operator=(executor&& other) noexcept
+ {
+ destroy();
+ impl_ = other.impl_;
+ other.impl_ = 0;
+ return *this;
+ }
+
+ /// Assignment operator for nullptr_t.
+ executor& operator=(nullptr_t) noexcept
+ {
+ destroy();
+ impl_ = 0;
+ return *this;
+ }
+
+ /// Assignment operator to create a polymorphic wrapper for the specified
+ /// executor.
+ template <typename Executor>
+ executor& operator=(Executor&& e) noexcept
+ {
+ executor tmp(static_cast<Executor&&>(e));
+ destroy();
+ impl_ = tmp.impl_;
+ tmp.impl_ = 0;
+ return *this;
+ }
+
+ /// Obtain the underlying execution context.
+ execution_context& context() const noexcept
+ {
+ return get_impl()->context();
+ }
+
+ /// Inform the executor that it has some outstanding work to do.
+ void on_work_started() const noexcept
+ {
+ get_impl()->on_work_started();
+ }
+
+ /// Inform the executor that some work is no longer outstanding.
+ void on_work_finished() const 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 <typename Function, typename Allocator>
+ void dispatch(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 <typename Function, typename Allocator>
+ void post(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 <typename Function, typename Allocator>
+ void defer(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 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, <tt>typeid(T)</tt>;
+ * otherwise, <tt>typeid(void)</tt>.
+ */
+#if !defined(ASIO_NO_TYPEID) || defined(GENERATING_DOCUMENTATION)
+ const std::type_info& target_type() const noexcept
+ {
+ return impl_ ? impl_->target_type() : typeid(void);
+ }
+#else // !defined(ASIO_NO_TYPEID) || defined(GENERATING_DOCUMENTATION)
+ const void* target_type() const 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 <tt>target_type() == typeid(T)</tt>, a pointer to the stored
+ * executor target; otherwise, a null pointer.
+ */
+ template <typename Executor>
+ Executor* target() noexcept;
+
+ /// Obtain a pointer to the target executor object.
+ /**
+ * @returns If <tt>target_type() == typeid(T)</tt>, a pointer to the stored
+ * executor target; otherwise, a null pointer.
+ */
+ template <typename Executor>
+ const Executor* target() const noexcept;
+
+ /// Compare two executors for equality.
+ friend bool operator==(const executor& a,
+ const executor& b) 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) noexcept
+ {
+ return !(a == b);
+ }
+
+private:
+#if !defined(GENERATING_DOCUMENTATION)
+ typedef detail::executor_function function;
+ template <typename, typename> 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 <typename T>
+ 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 noexcept = 0;
+ virtual void destroy() noexcept = 0;
+ virtual execution_context& context() noexcept = 0;
+ virtual void on_work_started() noexcept = 0;
+ virtual void on_work_finished() noexcept = 0;
+ virtual void dispatch(function&&) = 0;
+ virtual void post(function&&) = 0;
+ virtual void defer(function&&) = 0;
+ virtual type_id_result_type target_type() const noexcept = 0;
+ virtual void* target() noexcept = 0;
+ virtual const void* target() const noexcept = 0;
+ virtual bool equals(const impl_base* e) const 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 noexcept
+ {
+ return impl_ ? impl_->clone() : 0;
+ }
+
+ // Helper function to destroy an implementation.
+ void destroy() 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 // !defined(ASIO_NO_TS_EXECUTORS)
+
+#endif // ASIO_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/executor_work_guard.hpp b/3rdparty/asio/include/asio/executor_work_guard.hpp
new file mode 100644
index 00000000000..72787ccdc83
--- /dev/null
+++ b/3rdparty/asio/include/asio/executor_work_guard.hpp
@@ -0,0 +1,362 @@
+//
+// executor_work_guard.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/execution.hpp"
+#include "asio/is_executor.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if !defined(ASIO_EXECUTOR_WORK_GUARD_DECL)
+#define ASIO_EXECUTOR_WORK_GUARD_DECL
+
+template <typename Executor, typename = void, typename = void>
+class executor_work_guard;
+
+#endif // !defined(ASIO_EXECUTOR_WORK_GUARD_DECL)
+
+#if defined(GENERATING_DOCUMENTATION)
+
+/// An object of type @c executor_work_guard controls ownership of outstanding
+/// executor work within a scope.
+template <typename Executor>
+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 <tt>on_work_started()</tt> on it.
+ */
+ explicit executor_work_guard(const executor_type& e) noexcept;
+
+ /// Copy constructor.
+ executor_work_guard(const executor_work_guard& other) noexcept;
+
+ /// Move constructor.
+ executor_work_guard(executor_work_guard&& other) noexcept;
+
+ /// Destructor.
+ /**
+ * Unless the object has already been reset, or is in a moved-from state,
+ * calls <tt>on_work_finished()</tt> on the stored executor.
+ */
+ ~executor_work_guard();
+
+ /// Obtain the associated executor.
+ executor_type get_executor() const noexcept;
+
+ /// Whether the executor_work_guard object owns some outstanding work.
+ bool owns_work() const noexcept;
+
+ /// Indicate that the work is no longer outstanding.
+ /**
+ * Unless the object has already been reset, or is in a moved-from state,
+ * calls <tt>on_work_finished()</tt> on the stored executor.
+ */
+ void reset() noexcept;
+};
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Executor>
+class executor_work_guard<Executor,
+ enable_if_t<
+ is_executor<Executor>::value
+ >>
+{
+public:
+ typedef Executor executor_type;
+
+ explicit executor_work_guard(const executor_type& e) noexcept
+ : executor_(e),
+ owns_(true)
+ {
+ executor_.on_work_started();
+ }
+
+ executor_work_guard(const executor_work_guard& other) noexcept
+ : executor_(other.executor_),
+ owns_(other.owns_)
+ {
+ if (owns_)
+ executor_.on_work_started();
+ }
+
+ executor_work_guard(executor_work_guard&& other) noexcept
+ : executor_(static_cast<Executor&&>(other.executor_)),
+ owns_(other.owns_)
+ {
+ other.owns_ = false;
+ }
+
+ ~executor_work_guard()
+ {
+ if (owns_)
+ executor_.on_work_finished();
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return executor_;
+ }
+
+ bool owns_work() const noexcept
+ {
+ return owns_;
+ }
+
+ void reset() 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_;
+};
+
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Executor>
+class executor_work_guard<Executor,
+ enable_if_t<
+ !is_executor<Executor>::value
+ >,
+ enable_if_t<
+ execution::is_executor<Executor>::value
+ >>
+{
+public:
+ typedef Executor executor_type;
+
+ explicit executor_work_guard(const executor_type& e) noexcept
+ : executor_(e),
+ owns_(true)
+ {
+ new (&work_) work_type(asio::prefer(executor_,
+ execution::outstanding_work.tracked));
+ }
+
+ executor_work_guard(const executor_work_guard& other) noexcept
+ : executor_(other.executor_),
+ owns_(other.owns_)
+ {
+ if (owns_)
+ {
+ new (&work_) work_type(asio::prefer(executor_,
+ execution::outstanding_work.tracked));
+ }
+ }
+
+ executor_work_guard(executor_work_guard&& other) noexcept
+ : executor_(static_cast<Executor&&>(other.executor_)),
+ owns_(other.owns_)
+ {
+ if (owns_)
+ {
+ new (&work_) work_type(
+ static_cast<work_type&&>(
+ *static_cast<work_type*>(
+ static_cast<void*>(&other.work_))));
+ other.owns_ = false;
+ }
+ }
+
+ ~executor_work_guard()
+ {
+ if (owns_)
+ static_cast<work_type*>(static_cast<void*>(&work_))->~work_type();
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return executor_;
+ }
+
+ bool owns_work() const noexcept
+ {
+ return owns_;
+ }
+
+ void reset() noexcept
+ {
+ if (owns_)
+ {
+ static_cast<work_type*>(static_cast<void*>(&work_))->~work_type();
+ owns_ = false;
+ }
+ }
+
+private:
+ // Disallow assignment.
+ executor_work_guard& operator=(const executor_work_guard&);
+
+ typedef decay_t<
+ prefer_result_t<
+ const executor_type&,
+ execution::outstanding_work_t::tracked_t
+ >
+ > work_type;
+
+ executor_type executor_;
+ aligned_storage_t<sizeof(work_type), alignment_of<work_type>::value> work_;
+ bool owns_;
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+/// Create an @ref executor_work_guard object.
+/**
+ * @param ex An executor.
+ *
+ * @returns A work guard constructed with the specified executor.
+ */
+template <typename Executor>
+ASIO_NODISCARD inline executor_work_guard<Executor>
+make_work_guard(const Executor& ex,
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0)
+{
+ return executor_work_guard<Executor>(ex);
+}
+
+/// Create an @ref executor_work_guard object.
+/**
+ * @param ctx An execution context, from which an executor will be obtained.
+ *
+ * @returns A work guard constructed with the execution context's executor,
+ * obtained by performing <tt>ctx.get_executor()</tt>.
+ */
+template <typename ExecutionContext>
+ASIO_NODISCARD inline
+executor_work_guard<typename ExecutionContext::executor_type>
+make_work_guard(ExecutionContext& ctx,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+{
+ return executor_work_guard<typename ExecutionContext::executor_type>(
+ ctx.get_executor());
+}
+
+/// Create an @ref executor_work_guard object.
+/**
+ * @param t An arbitrary object, such as a completion handler, for which the
+ * associated executor will be obtained.
+ *
+ * @returns A work guard constructed with the associated executor of the object
+ * @c t, which is obtained as if by calling <tt>get_associated_executor(t)</tt>.
+ */
+template <typename T>
+ASIO_NODISCARD inline
+executor_work_guard<
+ typename constraint_t<
+ !is_executor<T>::value
+ && !execution::is_executor<T>::value
+ && !is_convertible<T&, execution_context&>::value,
+ associated_executor<T>
+ >::type>
+make_work_guard(const T& t)
+{
+ return executor_work_guard<associated_executor_t<T>>(
+ associated_executor<T>::get(t));
+}
+
+/// Create an @ref executor_work_guard object.
+/**
+ * @param t An arbitrary object, such as a completion handler, for which the
+ * associated executor will be obtained.
+ *
+ * @param ex An executor to be used as the candidate object when determining the
+ * associated executor.
+ *
+ * @returns A work guard constructed with the associated executor of the object
+ * @c t, which is obtained as if by calling <tt>get_associated_executor(t,
+ * ex)</tt>.
+ */
+template <typename T, typename Executor>
+ASIO_NODISCARD inline
+executor_work_guard<associated_executor_t<T, Executor>>
+make_work_guard(const T& t, const Executor& ex,
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0)
+{
+ return executor_work_guard<associated_executor_t<T, Executor>>(
+ associated_executor<T, Executor>::get(t, ex));
+}
+
+/// Create an @ref executor_work_guard object.
+/**
+ * @param t An arbitrary object, such as a completion handler, for which the
+ * associated executor will be obtained.
+ *
+ * @param ctx An execution context, from which an executor is obtained to use as
+ * the candidate object for determining the associated executor.
+ *
+ * @returns A work guard constructed with the associated executor of the object
+ * @c t, which is obtained as if by calling <tt>get_associated_executor(t,
+ * ctx.get_executor())</tt>.
+ */
+template <typename T, typename ExecutionContext>
+ASIO_NODISCARD inline executor_work_guard<
+ associated_executor_t<T, typename ExecutionContext::executor_type>>
+make_work_guard(const T& t, ExecutionContext& ctx,
+ constraint_t<
+ !is_executor<T>::value
+ > = 0,
+ constraint_t<
+ !execution::is_executor<T>::value
+ > = 0,
+ constraint_t<
+ !is_convertible<T&, execution_context&>::value
+ > = 0,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+{
+ return executor_work_guard<
+ associated_executor_t<T, typename ExecutionContext::executor_type>>(
+ associated_executor<T, typename ExecutionContext::executor_type>::get(
+ t, ctx.get_executor()));
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXECUTOR_WORK_GUARD_HPP
diff --git a/3rdparty/asio/include/asio/experimental/append.hpp b/3rdparty/asio/include/asio/experimental/append.hpp
new file mode 100644
index 00000000000..6a1f280cdd9
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/append.hpp
@@ -0,0 +1,36 @@
+//
+// experimental/append.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_APPEND_HPP
+#define ASIO_EXPERIMENTAL_APPEND_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/append.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+
+#if !defined(ASIO_NO_DEPRECATED)
+using asio::append_t;
+using asio::append;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_APPEND_HPP
diff --git a/3rdparty/asio/include/asio/experimental/as_single.hpp b/3rdparty/asio/include/asio/experimental/as_single.hpp
new file mode 100644
index 00000000000..6282c14f142
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/as_single.hpp
@@ -0,0 +1,132 @@
+//
+// experimental/as_single.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_AS_SINGLE_HPP
+#define ASIO_EXPERIMENTAL_AS_SINGLE_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 experimental {
+
+/// A @ref completion_token adapter used to specify that the completion handler
+/// arguments should be combined into a single argument.
+/**
+ * The as_single_t class is used to indicate that any arguments to the
+ * completion handler should be combined and passed as a single argument.
+ * If there is already one argument, that argument is passed as-is. If
+ * there is more than argument, the arguments are first moved into a
+ * @c std::tuple and that tuple is then passed to the completion handler.
+ */
+template <typename CompletionToken>
+class as_single_t
+{
+public:
+ /// Tag type used to prevent the "default" constructor from being used for
+ /// conversions.
+ struct default_constructor_tag {};
+
+ /// Default constructor.
+ /**
+ * This constructor is only valid if the underlying completion token is
+ * default constructible and move constructible. The underlying completion
+ * token is itself defaulted as an argument to allow it to capture a source
+ * location.
+ */
+ constexpr as_single_t(
+ default_constructor_tag = default_constructor_tag(),
+ CompletionToken token = CompletionToken())
+ : token_(static_cast<CompletionToken&&>(token))
+ {
+ }
+
+ /// Constructor.
+ template <typename T>
+ constexpr explicit as_single_t(
+ T&& completion_token)
+ : token_(static_cast<T&&>(completion_token))
+ {
+ }
+
+ /// Adapts an executor to add the @c as_single_t completion token as the
+ /// default.
+ template <typename InnerExecutor>
+ struct executor_with_default : InnerExecutor
+ {
+ /// Specify @c as_single_t as the default completion token type.
+ typedef as_single_t default_completion_token_type;
+
+ /// Construct the adapted executor from the inner executor type.
+ executor_with_default(const InnerExecutor& ex) noexcept
+ : InnerExecutor(ex)
+ {
+ }
+
+ /// Convert the specified executor to the inner executor type, then use
+ /// that to construct the adapted executor.
+ template <typename OtherExecutor>
+ executor_with_default(const OtherExecutor& ex,
+ constraint_t<
+ is_convertible<OtherExecutor, InnerExecutor>::value
+ > = 0) noexcept
+ : InnerExecutor(ex)
+ {
+ }
+ };
+
+ /// Type alias to adapt an I/O object to use @c as_single_t as its
+ /// default completion token type.
+ template <typename T>
+ using as_default_on_t = typename T::template rebind_executor<
+ executor_with_default<typename T::executor_type>>::other;
+
+ /// Function helper to adapt an I/O object to use @c as_single_t as its
+ /// default completion token type.
+ template <typename T>
+ static typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other
+ as_default_on(T&& object)
+ {
+ return typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other(static_cast<T&&>(object));
+ }
+
+//private:
+ CompletionToken token_;
+};
+
+/// Adapt a @ref completion_token to specify that the completion handler
+/// arguments should be combined into a single argument.
+template <typename CompletionToken>
+ASIO_NODISCARD inline
+constexpr as_single_t<decay_t<CompletionToken>>
+as_single(CompletionToken&& completion_token)
+{
+ return as_single_t<decay_t<CompletionToken>>(
+ static_cast<CompletionToken&&>(completion_token));
+}
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/experimental/impl/as_single.hpp"
+
+#endif // ASIO_EXPERIMENTAL_AS_SINGLE_HPP
diff --git a/3rdparty/asio/include/asio/experimental/as_tuple.hpp b/3rdparty/asio/include/asio/experimental/as_tuple.hpp
new file mode 100644
index 00000000000..02f23f2909b
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/as_tuple.hpp
@@ -0,0 +1,36 @@
+//
+// experimental/as_tuple.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_AS_TUPLE_HPP
+#define ASIO_EXPERIMENTAL_AS_TUPLE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/as_tuple.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+
+#if !defined(ASIO_NO_DEPRECATED)
+using asio::as_tuple_t;
+using asio::as_tuple;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_AS_TUPLE_HPP
diff --git a/3rdparty/asio/include/asio/experimental/awaitable_operators.hpp b/3rdparty/asio/include/asio/experimental/awaitable_operators.hpp
new file mode 100644
index 00000000000..45799daaa5f
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/awaitable_operators.hpp
@@ -0,0 +1,536 @@
+//
+// experimental/awaitable_operators.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_AWAITABLE_OPERATORS_HPP
+#define ASIO_EXPERIMENTAL_AWAITABLE_OPERATORS_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <optional>
+#include <stdexcept>
+#include <tuple>
+#include <variant>
+#include "asio/awaitable.hpp"
+#include "asio/co_spawn.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/experimental/deferred.hpp"
+#include "asio/experimental/parallel_group.hpp"
+#include "asio/multiple_exceptions.hpp"
+#include "asio/this_coro.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace awaitable_operators {
+namespace detail {
+
+template <typename T, typename Executor>
+awaitable<T, Executor> awaitable_wrap(awaitable<T, Executor> a,
+ constraint_t<is_constructible<T>::value>* = 0)
+{
+ return a;
+}
+
+template <typename T, typename Executor>
+awaitable<std::optional<T>, Executor> awaitable_wrap(awaitable<T, Executor> a,
+ constraint_t<!is_constructible<T>::value>* = 0)
+{
+ co_return std::optional<T>(co_await std::move(a));
+}
+
+template <typename T>
+T& awaitable_unwrap(conditional_t<true, T, void>& r,
+ constraint_t<is_constructible<T>::value>* = 0)
+{
+ return r;
+}
+
+template <typename T>
+T& awaitable_unwrap(std::optional<conditional_t<true, T, void>>& r,
+ constraint_t<!is_constructible<T>::value>* = 0)
+{
+ return *r;
+}
+
+} // namespace detail
+
+/// Wait for both operations to succeed.
+/**
+ * If one operations fails, the other is cancelled as the AND-condition can no
+ * longer be satisfied.
+ */
+template <typename Executor>
+awaitable<void, Executor> operator&&(
+ awaitable<void, Executor> t, awaitable<void, Executor> u)
+{
+ auto ex = co_await this_coro::executor;
+
+ auto [order, ex0, ex1] =
+ co_await make_parallel_group(
+ co_spawn(ex, std::move(t), deferred),
+ co_spawn(ex, std::move(u), deferred)
+ ).async_wait(
+ wait_for_one_error(),
+ deferred
+ );
+
+ if (ex0 && ex1)
+ throw multiple_exceptions(ex0);
+ if (ex0)
+ std::rethrow_exception(ex0);
+ if (ex1)
+ std::rethrow_exception(ex1);
+ co_return;
+}
+
+/// Wait for both operations to succeed.
+/**
+ * If one operations fails, the other is cancelled as the AND-condition can no
+ * longer be satisfied.
+ */
+template <typename U, typename Executor>
+awaitable<U, Executor> operator&&(
+ awaitable<void, Executor> t, awaitable<U, Executor> u)
+{
+ auto ex = co_await this_coro::executor;
+
+ auto [order, ex0, ex1, r1] =
+ co_await make_parallel_group(
+ co_spawn(ex, std::move(t), deferred),
+ co_spawn(ex, detail::awaitable_wrap(std::move(u)), deferred)
+ ).async_wait(
+ wait_for_one_error(),
+ deferred
+ );
+
+ if (ex0 && ex1)
+ throw multiple_exceptions(ex0);
+ if (ex0)
+ std::rethrow_exception(ex0);
+ if (ex1)
+ std::rethrow_exception(ex1);
+ co_return std::move(detail::awaitable_unwrap<U>(r1));
+}
+
+/// Wait for both operations to succeed.
+/**
+ * If one operations fails, the other is cancelled as the AND-condition can no
+ * longer be satisfied.
+ */
+template <typename T, typename Executor>
+awaitable<T, Executor> operator&&(
+ awaitable<T, Executor> t, awaitable<void, Executor> u)
+{
+ auto ex = co_await this_coro::executor;
+
+ auto [order, ex0, r0, ex1] =
+ co_await make_parallel_group(
+ co_spawn(ex, detail::awaitable_wrap(std::move(t)), deferred),
+ co_spawn(ex, std::move(u), deferred)
+ ).async_wait(
+ wait_for_one_error(),
+ deferred
+ );
+
+ if (ex0 && ex1)
+ throw multiple_exceptions(ex0);
+ if (ex0)
+ std::rethrow_exception(ex0);
+ if (ex1)
+ std::rethrow_exception(ex1);
+ co_return std::move(detail::awaitable_unwrap<T>(r0));
+}
+
+/// Wait for both operations to succeed.
+/**
+ * If one operations fails, the other is cancelled as the AND-condition can no
+ * longer be satisfied.
+ */
+template <typename T, typename U, typename Executor>
+awaitable<std::tuple<T, U>, Executor> operator&&(
+ awaitable<T, Executor> t, awaitable<U, Executor> u)
+{
+ auto ex = co_await this_coro::executor;
+
+ auto [order, ex0, r0, ex1, r1] =
+ co_await make_parallel_group(
+ co_spawn(ex, detail::awaitable_wrap(std::move(t)), deferred),
+ co_spawn(ex, detail::awaitable_wrap(std::move(u)), deferred)
+ ).async_wait(
+ wait_for_one_error(),
+ deferred
+ );
+
+ if (ex0 && ex1)
+ throw multiple_exceptions(ex0);
+ if (ex0)
+ std::rethrow_exception(ex0);
+ if (ex1)
+ std::rethrow_exception(ex1);
+ co_return std::make_tuple(
+ std::move(detail::awaitable_unwrap<T>(r0)),
+ std::move(detail::awaitable_unwrap<U>(r1)));
+}
+
+/// Wait for both operations to succeed.
+/**
+ * If one operations fails, the other is cancelled as the AND-condition can no
+ * longer be satisfied.
+ */
+template <typename... T, typename Executor>
+awaitable<std::tuple<T..., std::monostate>, Executor> operator&&(
+ awaitable<std::tuple<T...>, Executor> t, awaitable<void, Executor> u)
+{
+ auto ex = co_await this_coro::executor;
+
+ auto [order, ex0, r0, ex1, r1] =
+ co_await make_parallel_group(
+ co_spawn(ex, detail::awaitable_wrap(std::move(t)), deferred),
+ co_spawn(ex, std::move(u), deferred)
+ ).async_wait(
+ wait_for_one_error(),
+ deferred
+ );
+
+ if (ex0 && ex1)
+ throw multiple_exceptions(ex0);
+ if (ex0)
+ std::rethrow_exception(ex0);
+ if (ex1)
+ std::rethrow_exception(ex1);
+ co_return std::move(detail::awaitable_unwrap<std::tuple<T...>>(r0));
+}
+
+/// Wait for both operations to succeed.
+/**
+ * If one operations fails, the other is cancelled as the AND-condition can no
+ * longer be satisfied.
+ */
+template <typename... T, typename U, typename Executor>
+awaitable<std::tuple<T..., U>, Executor> operator&&(
+ awaitable<std::tuple<T...>, Executor> t, awaitable<U, Executor> u)
+{
+ auto ex = co_await this_coro::executor;
+
+ auto [order, ex0, r0, ex1, r1] =
+ co_await make_parallel_group(
+ co_spawn(ex, detail::awaitable_wrap(std::move(t)), deferred),
+ co_spawn(ex, detail::awaitable_wrap(std::move(u)), deferred)
+ ).async_wait(
+ wait_for_one_error(),
+ deferred
+ );
+
+ if (ex0 && ex1)
+ throw multiple_exceptions(ex0);
+ if (ex0)
+ std::rethrow_exception(ex0);
+ if (ex1)
+ std::rethrow_exception(ex1);
+ co_return std::tuple_cat(
+ std::move(detail::awaitable_unwrap<std::tuple<T...>>(r0)),
+ std::make_tuple(std::move(detail::awaitable_unwrap<U>(r1))));
+}
+
+/// Wait for one operation to succeed.
+/**
+ * If one operations succeeds, the other is cancelled as the OR-condition is
+ * already satisfied.
+ */
+template <typename Executor>
+awaitable<std::variant<std::monostate, std::monostate>, Executor> operator||(
+ awaitable<void, Executor> t, awaitable<void, Executor> u)
+{
+ auto ex = co_await this_coro::executor;
+
+ auto [order, ex0, ex1] =
+ co_await make_parallel_group(
+ co_spawn(ex, std::move(t), deferred),
+ co_spawn(ex, std::move(u), deferred)
+ ).async_wait(
+ wait_for_one_success(),
+ deferred
+ );
+
+ if (order[0] == 0)
+ {
+ if (!ex0)
+ co_return std::variant<std::monostate, std::monostate>{
+ std::in_place_index<0>};
+ if (!ex1)
+ co_return std::variant<std::monostate, std::monostate>{
+ std::in_place_index<1>};
+ throw multiple_exceptions(ex0);
+ }
+ else
+ {
+ if (!ex1)
+ co_return std::variant<std::monostate, std::monostate>{
+ std::in_place_index<1>};
+ if (!ex0)
+ co_return std::variant<std::monostate, std::monostate>{
+ std::in_place_index<0>};
+ throw multiple_exceptions(ex1);
+ }
+}
+
+/// Wait for one operation to succeed.
+/**
+ * If one operations succeeds, the other is cancelled as the OR-condition is
+ * already satisfied.
+ */
+template <typename U, typename Executor>
+awaitable<std::variant<std::monostate, U>, Executor> operator||(
+ awaitable<void, Executor> t, awaitable<U, Executor> u)
+{
+ auto ex = co_await this_coro::executor;
+
+ auto [order, ex0, ex1, r1] =
+ co_await make_parallel_group(
+ co_spawn(ex, std::move(t), deferred),
+ co_spawn(ex, detail::awaitable_wrap(std::move(u)), deferred)
+ ).async_wait(
+ wait_for_one_success(),
+ deferred
+ );
+
+ if (order[0] == 0)
+ {
+ if (!ex0)
+ co_return std::variant<std::monostate, U>{
+ std::in_place_index<0>};
+ if (!ex1)
+ co_return std::variant<std::monostate, U>{
+ std::in_place_index<1>,
+ std::move(detail::awaitable_unwrap<U>(r1))};
+ throw multiple_exceptions(ex0);
+ }
+ else
+ {
+ if (!ex1)
+ co_return std::variant<std::monostate, U>{
+ std::in_place_index<1>,
+ std::move(detail::awaitable_unwrap<U>(r1))};
+ if (!ex0)
+ co_return std::variant<std::monostate, U>{
+ std::in_place_index<0>};
+ throw multiple_exceptions(ex1);
+ }
+}
+
+/// Wait for one operation to succeed.
+/**
+ * If one operations succeeds, the other is cancelled as the OR-condition is
+ * already satisfied.
+ */
+template <typename T, typename Executor>
+awaitable<std::variant<T, std::monostate>, Executor> operator||(
+ awaitable<T, Executor> t, awaitable<void, Executor> u)
+{
+ auto ex = co_await this_coro::executor;
+
+ auto [order, ex0, r0, ex1] =
+ co_await make_parallel_group(
+ co_spawn(ex, detail::awaitable_wrap(std::move(t)), deferred),
+ co_spawn(ex, std::move(u), deferred)
+ ).async_wait(
+ wait_for_one_success(),
+ deferred
+ );
+
+ if (order[0] == 0)
+ {
+ if (!ex0)
+ co_return std::variant<T, std::monostate>{
+ std::in_place_index<0>,
+ std::move(detail::awaitable_unwrap<T>(r0))};
+ if (!ex1)
+ co_return std::variant<T, std::monostate>{
+ std::in_place_index<1>};
+ throw multiple_exceptions(ex0);
+ }
+ else
+ {
+ if (!ex1)
+ co_return std::variant<T, std::monostate>{
+ std::in_place_index<1>};
+ if (!ex0)
+ co_return std::variant<T, std::monostate>{
+ std::in_place_index<0>,
+ std::move(detail::awaitable_unwrap<T>(r0))};
+ throw multiple_exceptions(ex1);
+ }
+}
+
+/// Wait for one operation to succeed.
+/**
+ * If one operations succeeds, the other is cancelled as the OR-condition is
+ * already satisfied.
+ */
+template <typename T, typename U, typename Executor>
+awaitable<std::variant<T, U>, Executor> operator||(
+ awaitable<T, Executor> t, awaitable<U, Executor> u)
+{
+ auto ex = co_await this_coro::executor;
+
+ auto [order, ex0, r0, ex1, r1] =
+ co_await make_parallel_group(
+ co_spawn(ex, detail::awaitable_wrap(std::move(t)), deferred),
+ co_spawn(ex, detail::awaitable_wrap(std::move(u)), deferred)
+ ).async_wait(
+ wait_for_one_success(),
+ deferred
+ );
+
+ if (order[0] == 0)
+ {
+ if (!ex0)
+ co_return std::variant<T, U>{
+ std::in_place_index<0>,
+ std::move(detail::awaitable_unwrap<T>(r0))};
+ if (!ex1)
+ co_return std::variant<T, U>{
+ std::in_place_index<1>,
+ std::move(detail::awaitable_unwrap<U>(r1))};
+ throw multiple_exceptions(ex0);
+ }
+ else
+ {
+ if (!ex1)
+ co_return std::variant<T, U>{
+ std::in_place_index<1>,
+ std::move(detail::awaitable_unwrap<U>(r1))};
+ if (!ex0)
+ co_return std::variant<T, U>{
+ std::in_place_index<0>,
+ std::move(detail::awaitable_unwrap<T>(r0))};
+ throw multiple_exceptions(ex1);
+ }
+}
+
+namespace detail {
+
+template <typename... T>
+struct widen_variant
+{
+ template <std::size_t I, typename SourceVariant>
+ static std::variant<T...> call(SourceVariant& source)
+ {
+ if (source.index() == I)
+ return std::variant<T...>{
+ std::in_place_index<I>, std::move(std::get<I>(source))};
+ else if constexpr (I + 1 < std::variant_size_v<SourceVariant>)
+ return call<I + 1>(source);
+ else
+ throw std::logic_error("empty variant");
+ }
+};
+
+} // namespace detail
+
+/// Wait for one operation to succeed.
+/**
+ * If one operations succeeds, the other is cancelled as the OR-condition is
+ * already satisfied.
+ */
+template <typename... T, typename Executor>
+awaitable<std::variant<T..., std::monostate>, Executor> operator||(
+ awaitable<std::variant<T...>, Executor> t, awaitable<void, Executor> u)
+{
+ auto ex = co_await this_coro::executor;
+
+ auto [order, ex0, r0, ex1] =
+ co_await make_parallel_group(
+ co_spawn(ex, detail::awaitable_wrap(std::move(t)), deferred),
+ co_spawn(ex, std::move(u), deferred)
+ ).async_wait(
+ wait_for_one_success(),
+ deferred
+ );
+
+ using widen = detail::widen_variant<T..., std::monostate>;
+ if (order[0] == 0)
+ {
+ if (!ex0)
+ co_return widen::template call<0>(
+ detail::awaitable_unwrap<std::variant<T...>>(r0));
+ if (!ex1)
+ co_return std::variant<T..., std::monostate>{
+ std::in_place_index<sizeof...(T)>};
+ throw multiple_exceptions(ex0);
+ }
+ else
+ {
+ if (!ex1)
+ co_return std::variant<T..., std::monostate>{
+ std::in_place_index<sizeof...(T)>};
+ if (!ex0)
+ co_return widen::template call<0>(
+ detail::awaitable_unwrap<std::variant<T...>>(r0));
+ throw multiple_exceptions(ex1);
+ }
+}
+
+/// Wait for one operation to succeed.
+/**
+ * If one operations succeeds, the other is cancelled as the OR-condition is
+ * already satisfied.
+ */
+template <typename... T, typename U, typename Executor>
+awaitable<std::variant<T..., U>, Executor> operator||(
+ awaitable<std::variant<T...>, Executor> t, awaitable<U, Executor> u)
+{
+ auto ex = co_await this_coro::executor;
+
+ auto [order, ex0, r0, ex1, r1] =
+ co_await make_parallel_group(
+ co_spawn(ex, detail::awaitable_wrap(std::move(t)), deferred),
+ co_spawn(ex, detail::awaitable_wrap(std::move(u)), deferred)
+ ).async_wait(
+ wait_for_one_success(),
+ deferred
+ );
+
+ using widen = detail::widen_variant<T..., U>;
+ if (order[0] == 0)
+ {
+ if (!ex0)
+ co_return widen::template call<0>(
+ detail::awaitable_unwrap<std::variant<T...>>(r0));
+ if (!ex1)
+ co_return std::variant<T..., U>{
+ std::in_place_index<sizeof...(T)>,
+ std::move(detail::awaitable_unwrap<U>(r1))};
+ throw multiple_exceptions(ex0);
+ }
+ else
+ {
+ if (!ex1)
+ co_return std::variant<T..., U>{
+ std::in_place_index<sizeof...(T)>,
+ std::move(detail::awaitable_unwrap<U>(r1))};
+ if (!ex0)
+ co_return widen::template call<0>(
+ detail::awaitable_unwrap<std::variant<T...>>(r0));
+ throw multiple_exceptions(ex1);
+ }
+}
+
+} // namespace awaitable_operators
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_AWAITABLE_OPERATORS_HPP
diff --git a/3rdparty/asio/include/asio/experimental/basic_channel.hpp b/3rdparty/asio/include/asio/experimental/basic_channel.hpp
new file mode 100644
index 00000000000..6ca1438a093
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/basic_channel.hpp
@@ -0,0 +1,513 @@
+//
+// experimental/basic_channel.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_BASIC_CHANNEL_HPP
+#define ASIO_EXPERIMENTAL_BASIC_CHANNEL_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/non_const_lvalue.hpp"
+#include "asio/detail/null_mutex.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/experimental/detail/channel_send_functions.hpp"
+#include "asio/experimental/detail/channel_service.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+} // namespace detail
+
+/// A channel for messages.
+/**
+ * The basic_channel class template is used for sending messages between
+ * different parts of the same application. A <em>message</em> is defined as a
+ * collection of arguments to be passed to a completion handler, and the set of
+ * messages supported by a channel is specified by its @c Traits and
+ * <tt>Signatures...</tt> template parameters. Messages may be sent and received
+ * using asynchronous or non-blocking synchronous operations.
+ *
+ * Unless customising the traits, applications will typically use the @c
+ * experimental::channel alias template. For example:
+ * @code void send_loop(int i, steady_timer& timer,
+ * channel<void(error_code, int)>& ch)
+ * {
+ * if (i < 10)
+ * {
+ * timer.expires_after(chrono::seconds(1));
+ * timer.async_wait(
+ * [i, &timer, &ch](error_code error)
+ * {
+ * if (!error)
+ * {
+ * ch.async_send(error_code(), i,
+ * [i, &timer, &ch](error_code error)
+ * {
+ * if (!error)
+ * {
+ * send_loop(i + 1, timer, ch);
+ * }
+ * });
+ * }
+ * });
+ * }
+ * else
+ * {
+ * ch.close();
+ * }
+ * }
+ *
+ * void receive_loop(channel<void(error_code, int)>& ch)
+ * {
+ * ch.async_receive(
+ * [&ch](error_code error, int i)
+ * {
+ * if (!error)
+ * {
+ * std::cout << "Received " << i << "\n";
+ * receive_loop(ch);
+ * }
+ * });
+ * } @endcode
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ *
+ * The basic_channel class template is not thread-safe, and would typically be
+ * used for passing messages between application code that runs on the same
+ * thread or in the same strand. Consider using @ref basic_concurrent_channel,
+ * and its alias template @c experimental::concurrent_channel, to pass messages
+ * between code running in different threads.
+ */
+template <typename Executor, typename Traits, typename... Signatures>
+class basic_channel
+#if !defined(GENERATING_DOCUMENTATION)
+ : public detail::channel_send_functions<
+ basic_channel<Executor, Traits, Signatures...>,
+ Executor, Signatures...>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+private:
+ class initiate_async_send;
+ class initiate_async_receive;
+ typedef detail::channel_service<asio::detail::null_mutex> service_type;
+ typedef typename service_type::template implementation_type<
+ Traits, Signatures...>::payload_type payload_type;
+
+ template <typename... PayloadSignatures,
+ ASIO_COMPLETION_TOKEN_FOR(PayloadSignatures...) CompletionToken>
+ auto do_async_receive(detail::channel_payload<PayloadSignatures...>*,
+ CompletionToken&& token)
+ -> decltype(
+ async_initiate<CompletionToken, PayloadSignatures...>(
+ declval<initiate_async_receive>(), token))
+ {
+ return async_initiate<CompletionToken, PayloadSignatures...>(
+ initiate_async_receive(this), token);
+ }
+
+public:
+ /// The type of the executor associated with the channel.
+ typedef Executor executor_type;
+
+ /// Rebinds the channel type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The channel type when rebound to the specified executor.
+ typedef basic_channel<Executor1, Traits, Signatures...> other;
+ };
+
+ /// The traits type associated with the channel.
+ typedef typename Traits::template rebind<Signatures...>::other traits_type;
+
+ /// Construct a basic_channel.
+ /**
+ * This constructor creates and channel.
+ *
+ * @param ex The I/O executor that the channel will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the channel.
+ *
+ * @param max_buffer_size The maximum number of messages that may be buffered
+ * in the channel.
+ */
+ basic_channel(const executor_type& ex, std::size_t max_buffer_size = 0)
+ : service_(&asio::use_service<service_type>(
+ basic_channel::get_context(ex))),
+ impl_(),
+ executor_(ex)
+ {
+ service_->construct(impl_, max_buffer_size);
+ }
+
+ /// Construct and open a basic_channel.
+ /**
+ * This constructor creates and opens a channel.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the channel will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the channel.
+ *
+ * @param max_buffer_size The maximum number of messages that may be buffered
+ * in the channel.
+ */
+ template <typename ExecutionContext>
+ basic_channel(ExecutionContext& context, std::size_t max_buffer_size = 0,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : service_(&asio::use_service<service_type>(context)),
+ impl_(),
+ executor_(context.get_executor())
+ {
+ service_->construct(impl_, max_buffer_size);
+ }
+
+ /// Move-construct a basic_channel from another.
+ /**
+ * This constructor moves a channel from one object to another.
+ *
+ * @param other The other basic_channel 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_channel(const executor_type&) constructor.
+ */
+ basic_channel(basic_channel&& other)
+ : service_(other.service_),
+ executor_(other.executor_)
+ {
+ service_->move_construct(impl_, other.impl_);
+ }
+
+ /// Move-assign a basic_channel from another.
+ /**
+ * This assignment operator moves a channel from one object to another.
+ * Cancels any outstanding asynchronous operations associated with the target
+ * object.
+ *
+ * @param other The other basic_channel 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_channel(const executor_type&)
+ * constructor.
+ */
+ basic_channel& operator=(basic_channel&& other)
+ {
+ if (this != &other)
+ {
+ service_->move_assign(impl_, *other.service_, other.impl_);
+ executor_.~executor_type();
+ new (&executor_) executor_type(other.executor_);
+ service_ = other.service_;
+ }
+ return *this;
+ }
+
+ // All channels have access to each other's implementations.
+ template <typename, typename, typename...>
+ friend class basic_channel;
+
+ /// Move-construct a basic_channel from another.
+ /**
+ * This constructor moves a channel from one object to another.
+ *
+ * @param other The other basic_channel 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_channel(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ basic_channel(
+ basic_channel<Executor1, Traits, Signatures...>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value
+ > = 0)
+ : service_(other.service_),
+ executor_(other.executor_)
+ {
+ service_->move_construct(impl_, other.impl_);
+ }
+
+ /// Move-assign a basic_channel from another.
+ /**
+ * This assignment operator moves a channel from one object to another.
+ * Cancels any outstanding asynchronous operations associated with the target
+ * object.
+ *
+ * @param other The other basic_channel 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_channel(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_channel&
+ > operator=(basic_channel<Executor1, Traits, Signatures...>&& other)
+ {
+ if (this != &other)
+ {
+ service_->move_assign(impl_, *other.service_, other.impl_);
+ executor_.~executor_type();
+ new (&executor_) executor_type(other.executor_);
+ service_ = other.service_;
+ }
+ return *this;
+ }
+
+ /// Destructor.
+ ~basic_channel()
+ {
+ service_->destroy(impl_);
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return executor_;
+ }
+
+ /// Get the capacity of the channel's buffer.
+ std::size_t capacity() noexcept
+ {
+ return service_->capacity(impl_);
+ }
+
+ /// Determine whether the channel is open.
+ bool is_open() const noexcept
+ {
+ return service_->is_open(impl_);
+ }
+
+ /// Reset the channel to its initial state.
+ void reset()
+ {
+ service_->reset(impl_);
+ }
+
+ /// Close the channel.
+ void close()
+ {
+ service_->close(impl_);
+ }
+
+ /// Cancel all asynchronous operations waiting on the channel.
+ /**
+ * All outstanding send operations will complete with the error
+ * @c asio::experimental::error::channel_cancelled. Outstanding receive
+ * operations complete with the result as determined by the channel traits.
+ */
+ void cancel()
+ {
+ service_->cancel(impl_);
+ }
+
+ /// Determine whether a message can be received without blocking.
+ bool ready() const noexcept
+ {
+ return service_->ready(impl_);
+ }
+
+#if defined(GENERATING_DOCUMENTATION)
+
+ /// Try to send a message without blocking.
+ /**
+ * Fails if the buffer is full and there are no waiting receive operations.
+ *
+ * @returns @c true on success, @c false on failure.
+ */
+ template <typename... Args>
+ bool try_send(Args&&... args);
+
+ /// Try to send a message without blocking, using dispatch semantics to call
+ /// the receive operation's completion handler.
+ /**
+ * Fails if the buffer is full and there are no waiting receive operations.
+ *
+ * The receive operation's completion handler may be called from inside this
+ * function.
+ *
+ * @returns @c true on success, @c false on failure.
+ */
+ template <typename... Args>
+ bool try_send_via_dispatch(Args&&... args);
+
+ /// Try to send a number of messages without blocking.
+ /**
+ * @returns The number of messages that were sent.
+ */
+ template <typename... Args>
+ std::size_t try_send_n(std::size_t count, Args&&... args);
+
+ /// Try to send a number of messages without blocking, using dispatch
+ /// semantics to call the receive operations' completion handlers.
+ /**
+ * The receive operations' completion handlers may be called from inside this
+ * function.
+ *
+ * @returns The number of messages that were sent.
+ */
+ template <typename... Args>
+ std::size_t try_send_n_via_dispatch(std::size_t count, Args&&... args);
+
+ /// Asynchronously send a message.
+ /**
+ * @par Completion Signature
+ * @code void(asio::error_code) @endcode
+ */
+ template <typename... Args,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ CompletionToken ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
+ auto async_send(Args&&... args,
+ CompletionToken&& token);
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+ /// Try to receive a message without blocking.
+ /**
+ * Fails if the buffer is full and there are no waiting receive operations.
+ *
+ * @returns @c true on success, @c false on failure.
+ */
+ template <typename Handler>
+ bool try_receive(Handler&& handler)
+ {
+ return service_->try_receive(impl_, static_cast<Handler&&>(handler));
+ }
+
+ /// Asynchronously receive a message.
+ /**
+ * @par Completion Signature
+ * As determined by the <tt>Signatures...</tt> template parameter and the
+ * channel traits.
+ */
+ template <typename CompletionToken
+ ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
+ auto async_receive(
+ CompletionToken&& token
+ ASIO_DEFAULT_COMPLETION_TOKEN(Executor))
+#if !defined(GENERATING_DOCUMENTATION)
+ -> decltype(
+ this->do_async_receive(static_cast<payload_type*>(0),
+ static_cast<CompletionToken&&>(token)))
+#endif // !defined(GENERATING_DOCUMENTATION)
+ {
+ return this->do_async_receive(static_cast<payload_type*>(0),
+ static_cast<CompletionToken&&>(token));
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_channel(const basic_channel&) = delete;
+ basic_channel& operator=(const basic_channel&) = delete;
+
+ template <typename, typename, typename...>
+ friend class detail::channel_send_functions;
+
+ // Helper function to get an executor's context.
+ template <typename T>
+ static execution_context& get_context(const T& t,
+ enable_if_t<execution::is_executor<T>::value>* = 0)
+ {
+ return asio::query(t, execution::context);
+ }
+
+ // Helper function to get an executor's context.
+ template <typename T>
+ static execution_context& get_context(const T& t,
+ enable_if_t<!execution::is_executor<T>::value>* = 0)
+ {
+ return t.context();
+ }
+
+ class initiate_async_send
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_send(basic_channel* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename SendHandler>
+ void operator()(SendHandler&& handler,
+ payload_type&& payload) const
+ {
+ asio::detail::non_const_lvalue<SendHandler> handler2(handler);
+ self_->service_->async_send(self_->impl_,
+ static_cast<payload_type&&>(payload),
+ handler2.value, self_->get_executor());
+ }
+
+ private:
+ basic_channel* self_;
+ };
+
+ class initiate_async_receive
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_receive(basic_channel* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReceiveHandler>
+ void operator()(ReceiveHandler&& handler) const
+ {
+ asio::detail::non_const_lvalue<ReceiveHandler> handler2(handler);
+ self_->service_->async_receive(self_->impl_,
+ handler2.value, self_->get_executor());
+ }
+
+ private:
+ basic_channel* self_;
+ };
+
+ // The service associated with the I/O object.
+ service_type* service_;
+
+ // The underlying implementation of the I/O object.
+ typename service_type::template implementation_type<
+ Traits, Signatures...> impl_;
+
+ // The associated executor.
+ Executor executor_;
+};
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_BASIC_CHANNEL_HPP
diff --git a/3rdparty/asio/include/asio/experimental/basic_concurrent_channel.hpp b/3rdparty/asio/include/asio/experimental/basic_concurrent_channel.hpp
new file mode 100644
index 00000000000..9dbfea39527
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/basic_concurrent_channel.hpp
@@ -0,0 +1,513 @@
+//
+// experimental/basic_concurrent_channel.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_BASIC_CONCURRENT_CHANNEL_HPP
+#define ASIO_EXPERIMENTAL_BASIC_CONCURRENT_CHANNEL_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/non_const_lvalue.hpp"
+#include "asio/detail/mutex.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/experimental/detail/channel_send_functions.hpp"
+#include "asio/experimental/detail/channel_service.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+} // namespace detail
+
+/// A channel for messages.
+/**
+ * The basic_concurrent_channel class template is used for sending messages
+ * between different parts of the same application. A <em>message</em> is
+ * defined as a collection of arguments to be passed to a completion handler,
+ * and the set of messages supported by a channel is specified by its @c Traits
+ * and <tt>Signatures...</tt> template parameters. Messages may be sent and
+ * received using asynchronous or non-blocking synchronous operations.
+ *
+ * Unless customising the traits, applications will typically use the @c
+ * experimental::concurrent_channel alias template. For example:
+ * @code void send_loop(int i, steady_timer& timer,
+ * concurrent_channel<void(error_code, int)>& ch)
+ * {
+ * if (i < 10)
+ * {
+ * timer.expires_after(chrono::seconds(1));
+ * timer.async_wait(
+ * [i, &timer, &ch](error_code error)
+ * {
+ * if (!error)
+ * {
+ * ch.async_send(error_code(), i,
+ * [i, &timer, &ch](error_code error)
+ * {
+ * if (!error)
+ * {
+ * send_loop(i + 1, timer, ch);
+ * }
+ * });
+ * }
+ * });
+ * }
+ * else
+ * {
+ * ch.close();
+ * }
+ * }
+ *
+ * void receive_loop(concurent_channel<void(error_code, int)>& ch)
+ * {
+ * ch.async_receive(
+ * [&ch](error_code error, int i)
+ * {
+ * if (!error)
+ * {
+ * std::cout << "Received " << i << "\n";
+ * receive_loop(ch);
+ * }
+ * });
+ * } @endcode
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Safe.
+ *
+ * The basic_concurrent_channel class template is thread-safe, and would
+ * typically be used for passing messages between application code that run on
+ * different threads. Consider using @ref basic_channel, and its alias template
+ * @c experimental::channel, to pass messages between code running in a single
+ * thread or on the same strand.
+ */
+template <typename Executor, typename Traits, typename... Signatures>
+class basic_concurrent_channel
+#if !defined(GENERATING_DOCUMENTATION)
+ : public detail::channel_send_functions<
+ basic_concurrent_channel<Executor, Traits, Signatures...>,
+ Executor, Signatures...>
+#endif // !defined(GENERATING_DOCUMENTATION)
+{
+private:
+ class initiate_async_send;
+ class initiate_async_receive;
+ typedef detail::channel_service<asio::detail::mutex> service_type;
+ typedef typename service_type::template implementation_type<
+ Traits, Signatures...>::payload_type payload_type;
+
+ template <typename... PayloadSignatures,
+ ASIO_COMPLETION_TOKEN_FOR(PayloadSignatures...) CompletionToken>
+ auto do_async_receive(detail::channel_payload<PayloadSignatures...>*,
+ CompletionToken&& token)
+ -> decltype(
+ async_initiate<CompletionToken, PayloadSignatures...>(
+ declval<initiate_async_receive>(), token))
+ {
+ return async_initiate<CompletionToken, PayloadSignatures...>(
+ initiate_async_receive(this), token);
+ }
+
+public:
+ /// The type of the executor associated with the channel.
+ typedef Executor executor_type;
+
+ /// Rebinds the channel type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The channel type when rebound to the specified executor.
+ typedef basic_concurrent_channel<Executor1, Traits, Signatures...> other;
+ };
+
+ /// The traits type associated with the channel.
+ typedef typename Traits::template rebind<Signatures...>::other traits_type;
+
+ /// Construct a basic_concurrent_channel.
+ /**
+ * This constructor creates and channel.
+ *
+ * @param ex The I/O executor that the channel will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the channel.
+ *
+ * @param max_buffer_size The maximum number of messages that may be buffered
+ * in the channel.
+ */
+ basic_concurrent_channel(const executor_type& ex,
+ std::size_t max_buffer_size = 0)
+ : service_(&asio::use_service<service_type>(
+ basic_concurrent_channel::get_context(ex))),
+ impl_(),
+ executor_(ex)
+ {
+ service_->construct(impl_, max_buffer_size);
+ }
+
+ /// Construct and open a basic_concurrent_channel.
+ /**
+ * This constructor creates and opens a channel.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the channel will use, by default, to dispatch handlers for any asynchronous
+ * operations performed on the channel.
+ *
+ * @param max_buffer_size The maximum number of messages that may be buffered
+ * in the channel.
+ */
+ template <typename ExecutionContext>
+ basic_concurrent_channel(ExecutionContext& context,
+ std::size_t max_buffer_size = 0,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : service_(&asio::use_service<service_type>(context)),
+ impl_(),
+ executor_(context.get_executor())
+ {
+ service_->construct(impl_, max_buffer_size);
+ }
+
+ /// Move-construct a basic_concurrent_channel from another.
+ /**
+ * This constructor moves a channel from one object to another.
+ *
+ * @param other The other basic_concurrent_channel 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_concurrent_channel(const executor_type&)
+ * constructor.
+ */
+ basic_concurrent_channel(basic_concurrent_channel&& other)
+ : service_(other.service_),
+ executor_(other.executor_)
+ {
+ service_->move_construct(impl_, other.impl_);
+ }
+
+ /// Move-assign a basic_concurrent_channel from another.
+ /**
+ * This assignment operator moves a channel from one object to another.
+ * Cancels any outstanding asynchronous operations associated with the target
+ * object.
+ *
+ * @param other The other basic_concurrent_channel 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_concurrent_channel(const executor_type&)
+ * constructor.
+ */
+ basic_concurrent_channel& operator=(basic_concurrent_channel&& other)
+ {
+ if (this != &other)
+ {
+ service_->move_assign(impl_, *other.service_, other.impl_);
+ executor_.~executor_type();
+ new (&executor_) executor_type(other.executor_);
+ service_ = other.service_;
+ }
+ return *this;
+ }
+
+ // All channels have access to each other's implementations.
+ template <typename, typename, typename...>
+ friend class basic_concurrent_channel;
+
+ /// Move-construct a basic_concurrent_channel from another.
+ /**
+ * This constructor moves a channel from one object to another.
+ *
+ * @param other The other basic_concurrent_channel 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_concurrent_channel(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ basic_concurrent_channel(
+ basic_concurrent_channel<Executor1, Traits, Signatures...>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value
+ > = 0)
+ : service_(other.service_),
+ executor_(other.executor_)
+ {
+ service_->move_construct(impl_, other.impl_);
+ }
+
+ /// Move-assign a basic_concurrent_channel from another.
+ /**
+ * This assignment operator moves a channel from one object to another.
+ * Cancels any outstanding asynchronous operations associated with the target
+ * object.
+ *
+ * @param other The other basic_concurrent_channel 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_concurrent_channel(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_concurrent_channel&
+ > operator=(
+ basic_concurrent_channel<Executor1, Traits, Signatures...>&& other)
+ {
+ if (this != &other)
+ {
+ service_->move_assign(impl_, *other.service_, other.impl_);
+ executor_.~executor_type();
+ new (&executor_) executor_type(other.executor_);
+ service_ = other.service_;
+ }
+ return *this;
+ }
+
+ /// Destructor.
+ ~basic_concurrent_channel()
+ {
+ service_->destroy(impl_);
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return executor_;
+ }
+
+ /// Get the capacity of the channel's buffer.
+ std::size_t capacity() noexcept
+ {
+ return service_->capacity(impl_);
+ }
+
+ /// Determine whether the channel is open.
+ bool is_open() const noexcept
+ {
+ return service_->is_open(impl_);
+ }
+
+ /// Reset the channel to its initial state.
+ void reset()
+ {
+ service_->reset(impl_);
+ }
+
+ /// Close the channel.
+ void close()
+ {
+ service_->close(impl_);
+ }
+
+ /// Cancel all asynchronous operations waiting on the channel.
+ /**
+ * All outstanding send operations will complete with the error
+ * @c asio::experimental::error::channel_cancelled. Outstanding receive
+ * operations complete with the result as determined by the channel traits.
+ */
+ void cancel()
+ {
+ service_->cancel(impl_);
+ }
+
+ /// Determine whether a message can be received without blocking.
+ bool ready() const noexcept
+ {
+ return service_->ready(impl_);
+ }
+
+#if defined(GENERATING_DOCUMENTATION)
+
+ /// Try to send a message without blocking.
+ /**
+ * Fails if the buffer is full and there are no waiting receive operations.
+ *
+ * @returns @c true on success, @c false on failure.
+ */
+ template <typename... Args>
+ bool try_send(Args&&... args);
+
+ /// Try to send a message without blocking, using dispatch semantics to call
+ /// the receive operation's completion handler.
+ /**
+ * Fails if the buffer is full and there are no waiting receive operations.
+ *
+ * The receive operation's completion handler may be called from inside this
+ * function.
+ *
+ * @returns @c true on success, @c false on failure.
+ */
+ template <typename... Args>
+ bool try_send_via_dispatch(Args&&... args);
+
+ /// Try to send a number of messages without blocking.
+ /**
+ * @returns The number of messages that were sent.
+ */
+ template <typename... Args>
+ std::size_t try_send_n(std::size_t count, Args&&... args);
+
+ /// Try to send a number of messages without blocking, using dispatch
+ /// semantics to call the receive operations' completion handlers.
+ /**
+ * The receive operations' completion handlers may be called from inside this
+ * function.
+ *
+ * @returns The number of messages that were sent.
+ */
+ template <typename... Args>
+ std::size_t try_send_n_via_dispatch(std::size_t count, Args&&... args);
+
+ /// Asynchronously send a message.
+ template <typename... Args,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ CompletionToken ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
+ auto async_send(Args&&... args,
+ CompletionToken&& token);
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+ /// Try to receive a message without blocking.
+ /**
+ * Fails if the buffer is full and there are no waiting receive operations.
+ *
+ * @returns @c true on success, @c false on failure.
+ */
+ template <typename Handler>
+ bool try_receive(Handler&& handler)
+ {
+ return service_->try_receive(impl_, static_cast<Handler&&>(handler));
+ }
+
+ /// Asynchronously receive a message.
+ template <typename CompletionToken
+ ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(executor_type)>
+ auto async_receive(
+ CompletionToken&& token
+ ASIO_DEFAULT_COMPLETION_TOKEN(Executor))
+#if !defined(GENERATING_DOCUMENTATION)
+ -> decltype(
+ this->do_async_receive(static_cast<payload_type*>(0),
+ static_cast<CompletionToken&&>(token)))
+#endif // !defined(GENERATING_DOCUMENTATION)
+ {
+ return this->do_async_receive(static_cast<payload_type*>(0),
+ static_cast<CompletionToken&&>(token));
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_concurrent_channel(
+ const basic_concurrent_channel&) = delete;
+ basic_concurrent_channel& operator=(
+ const basic_concurrent_channel&) = delete;
+
+ template <typename, typename, typename...>
+ friend class detail::channel_send_functions;
+
+ // Helper function to get an executor's context.
+ template <typename T>
+ static execution_context& get_context(const T& t,
+ enable_if_t<execution::is_executor<T>::value>* = 0)
+ {
+ return asio::query(t, execution::context);
+ }
+
+ // Helper function to get an executor's context.
+ template <typename T>
+ static execution_context& get_context(const T& t,
+ enable_if_t<!execution::is_executor<T>::value>* = 0)
+ {
+ return t.context();
+ }
+
+ class initiate_async_send
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_send(basic_concurrent_channel* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename SendHandler>
+ void operator()(SendHandler&& handler,
+ payload_type&& payload) const
+ {
+ asio::detail::non_const_lvalue<SendHandler> handler2(handler);
+ self_->service_->async_send(self_->impl_,
+ static_cast<payload_type&&>(payload),
+ handler2.value, self_->get_executor());
+ }
+
+ private:
+ basic_concurrent_channel* self_;
+ };
+
+ class initiate_async_receive
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_receive(basic_concurrent_channel* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReceiveHandler>
+ void operator()(ReceiveHandler&& handler) const
+ {
+ asio::detail::non_const_lvalue<ReceiveHandler> handler2(handler);
+ self_->service_->async_receive(self_->impl_,
+ handler2.value, self_->get_executor());
+ }
+
+ private:
+ basic_concurrent_channel* self_;
+ };
+
+ // The service associated with the I/O object.
+ service_type* service_;
+
+ // The underlying implementation of the I/O object.
+ typename service_type::template implementation_type<
+ Traits, Signatures...> impl_;
+
+ // The associated executor.
+ Executor executor_;
+};
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_BASIC_CONCURRENT_CHANNEL_HPP
diff --git a/3rdparty/asio/include/asio/experimental/cancellation_condition.hpp b/3rdparty/asio/include/asio/experimental/cancellation_condition.hpp
new file mode 100644
index 00000000000..6b1b46dd759
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/cancellation_condition.hpp
@@ -0,0 +1,152 @@
+//
+// experimental/cancellation_condition.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CANCELLATION_CONDITION_HPP
+#define ASIO_EXPERIMENTAL_CANCELLATION_CONDITION_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <exception>
+#include "asio/cancellation_type.hpp"
+#include "asio/error_code.hpp"
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+
+/// Wait for all operations to complete.
+class wait_for_all
+{
+public:
+ template <typename... Args>
+ constexpr cancellation_type_t operator()(Args&&...) const noexcept
+ {
+ return cancellation_type::none;
+ }
+};
+
+/// Wait until an operation completes, then cancel the others.
+class wait_for_one
+{
+public:
+ constexpr explicit wait_for_one(
+ cancellation_type_t cancel_type = cancellation_type::all)
+ : cancel_type_(cancel_type)
+ {
+ }
+
+ template <typename... Args>
+ constexpr cancellation_type_t operator()(Args&&...) const noexcept
+ {
+ return cancel_type_;
+ }
+
+private:
+ cancellation_type_t cancel_type_;
+};
+
+/// Wait until an operation completes without an error, then cancel the others.
+/**
+ * If no operation completes without an error, waits for completion of all
+ * operations.
+ */
+class wait_for_one_success
+{
+public:
+ constexpr explicit wait_for_one_success(
+ cancellation_type_t cancel_type = cancellation_type::all)
+ : cancel_type_(cancel_type)
+ {
+ }
+
+ constexpr cancellation_type_t
+ operator()() const noexcept
+ {
+ return cancel_type_;
+ }
+
+ template <typename E, typename... Args>
+ constexpr constraint_t<
+ !is_same<decay_t<E>, asio::error_code>::value
+ && !is_same<decay_t<E>, std::exception_ptr>::value,
+ cancellation_type_t
+ > operator()(const E&, Args&&...) const noexcept
+ {
+ return cancel_type_;
+ }
+
+ template <typename E, typename... Args>
+ constexpr constraint_t<
+ is_same<decay_t<E>, asio::error_code>::value
+ || is_same<decay_t<E>, std::exception_ptr>::value,
+ cancellation_type_t
+ > operator()(const E& e, Args&&...) const noexcept
+ {
+ return !!e ? cancellation_type::none : cancel_type_;
+ }
+
+private:
+ cancellation_type_t cancel_type_;
+};
+
+/// Wait until an operation completes with an error, then cancel the others.
+/**
+ * If no operation completes with an error, waits for completion of all
+ * operations.
+ */
+class wait_for_one_error
+{
+public:
+ constexpr explicit wait_for_one_error(
+ cancellation_type_t cancel_type = cancellation_type::all)
+ : cancel_type_(cancel_type)
+ {
+ }
+
+ constexpr cancellation_type_t operator()() const noexcept
+ {
+ return cancellation_type::none;
+ }
+
+ template <typename E, typename... Args>
+ constexpr constraint_t<
+ !is_same<decay_t<E>, asio::error_code>::value
+ && !is_same<decay_t<E>, std::exception_ptr>::value,
+ cancellation_type_t
+ > operator()(const E&, Args&&...) const noexcept
+ {
+ return cancellation_type::none;
+ }
+
+ template <typename E, typename... Args>
+ constexpr constraint_t<
+ is_same<decay_t<E>, asio::error_code>::value
+ || is_same<decay_t<E>, std::exception_ptr>::value,
+ cancellation_type_t
+ > operator()(const E& e, Args&&...) const noexcept
+ {
+ return !!e ? cancel_type_ : cancellation_type::none;
+ }
+
+private:
+ cancellation_type_t cancel_type_;
+};
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_CANCELLATION_CONDITION_HPP
diff --git a/3rdparty/asio/include/asio/experimental/channel.hpp b/3rdparty/asio/include/asio/experimental/channel.hpp
new file mode 100644
index 00000000000..c808bb4aafd
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/channel.hpp
@@ -0,0 +1,70 @@
+//
+// experimental/channel.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CHANNEL_HPP
+#define ASIO_EXPERIMENTAL_CHANNEL_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/any_io_executor.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/is_executor.hpp"
+#include "asio/experimental/basic_channel.hpp"
+#include "asio/experimental/channel_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <typename ExecutorOrSignature, typename = void>
+struct channel_type
+{
+ template <typename... Signatures>
+ struct inner
+ {
+ typedef basic_channel<any_io_executor, channel_traits<>,
+ ExecutorOrSignature, Signatures...> type;
+ };
+};
+
+template <typename ExecutorOrSignature>
+struct channel_type<ExecutorOrSignature,
+ enable_if_t<
+ is_executor<ExecutorOrSignature>::value
+ || execution::is_executor<ExecutorOrSignature>::value
+ >>
+{
+ template <typename... Signatures>
+ struct inner
+ {
+ typedef basic_channel<ExecutorOrSignature,
+ channel_traits<>, Signatures...> type;
+ };
+};
+
+} // namespace detail
+
+/// Template type alias for common use of channel.
+template <typename ExecutorOrSignature, typename... Signatures>
+using channel = typename detail::channel_type<
+ ExecutorOrSignature>::template inner<Signatures...>::type;
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_CHANNEL_HPP
diff --git a/3rdparty/asio/include/asio/experimental/channel_error.hpp b/3rdparty/asio/include/asio/experimental/channel_error.hpp
new file mode 100644
index 00000000000..dd419757cc3
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/channel_error.hpp
@@ -0,0 +1,82 @@
+//
+// experimental/channel_error.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CHANNEL_ERROR_HPP
+#define ASIO_EXPERIMENTAL_CHANNEL_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 experimental {
+namespace error {
+
+enum channel_errors
+{
+ /// The channel was closed.
+ channel_closed = 1,
+
+ /// The channel was cancelled.
+ channel_cancelled = 2
+};
+
+extern ASIO_DECL
+const asio::error_category& get_channel_category();
+
+static const asio::error_category&
+ channel_category ASIO_UNUSED_VARIABLE
+ = asio::experimental::error::get_channel_category();
+
+} // namespace error
+namespace channel_errc {
+ // Simulates a scoped enum.
+ using error::channel_closed;
+ using error::channel_cancelled;
+} // namespace channel_errc
+} // namespace experimental
+} // namespace asio
+
+namespace std {
+
+template<> struct is_error_code_enum<
+ asio::experimental::error::channel_errors>
+{
+ static const bool value = true;
+};
+
+} // namespace std
+
+namespace asio {
+namespace experimental {
+namespace error {
+
+inline asio::error_code make_error_code(channel_errors e)
+{
+ return asio::error_code(
+ static_cast<int>(e), get_channel_category());
+}
+
+} // namespace error
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#if defined(ASIO_HEADER_ONLY)
+# include "asio/experimental/impl/channel_error.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // ASIO_EXPERIMENTAL_CHANNEL_ERROR_HPP
diff --git a/3rdparty/asio/include/asio/experimental/channel_traits.hpp b/3rdparty/asio/include/asio/experimental/channel_traits.hpp
new file mode 100644
index 00000000000..bccff9876e4
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/channel_traits.hpp
@@ -0,0 +1,301 @@
+//
+// experimental/channel_traits.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CHANNEL_TRAITS_HPP
+#define ASIO_EXPERIMENTAL_CHANNEL_TRAITS_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <deque>
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+#include "asio/experimental/channel_error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+template <typename... Signatures>
+struct channel_traits
+{
+ /// Rebind the traits to a new set of signatures.
+ /**
+ * This nested structure must have a single nested type @c other that
+ * aliases a traits type with the specified set of signatures.
+ */
+ template <typename... NewSignatures>
+ struct rebind
+ {
+ typedef user_defined other;
+ };
+
+ /// Determine the container for the specified elements.
+ /**
+ * This nested structure must have a single nested type @c other that
+ * aliases a container type for the specified element type.
+ */
+ template <typename Element>
+ struct container
+ {
+ typedef user_defined type;
+ };
+
+ /// The signature of a channel cancellation notification.
+ typedef void receive_cancelled_signature(...);
+
+ /// Invoke the specified handler with a cancellation notification.
+ template <typename F>
+ static void invoke_receive_cancelled(F f);
+
+ /// The signature of a channel closed notification.
+ typedef void receive_closed_signature(...);
+
+ /// Invoke the specified handler with a closed notification.
+ template <typename F>
+ static void invoke_receive_closed(F f);
+};
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+/// Traits used for customising channel behaviour.
+template <typename... Signatures>
+struct channel_traits
+{
+ template <typename... NewSignatures>
+ struct rebind
+ {
+ typedef channel_traits<NewSignatures...> other;
+ };
+};
+
+template <typename R>
+struct channel_traits<R(asio::error_code)>
+{
+ template <typename... NewSignatures>
+ struct rebind
+ {
+ typedef channel_traits<NewSignatures...> other;
+ };
+
+ template <typename Element>
+ struct container
+ {
+ typedef std::deque<Element> type;
+ };
+
+ typedef R receive_cancelled_signature(asio::error_code);
+
+ template <typename F>
+ static void invoke_receive_cancelled(F f)
+ {
+ const asio::error_code e = error::channel_cancelled;
+ static_cast<F&&>(f)(e);
+ }
+
+ typedef R receive_closed_signature(asio::error_code);
+
+ template <typename F>
+ static void invoke_receive_closed(F f)
+ {
+ const asio::error_code e = error::channel_closed;
+ static_cast<F&&>(f)(e);
+ }
+};
+
+template <typename R, typename... Args, typename... Signatures>
+struct channel_traits<R(asio::error_code, Args...), Signatures...>
+{
+ template <typename... NewSignatures>
+ struct rebind
+ {
+ typedef channel_traits<NewSignatures...> other;
+ };
+
+ template <typename Element>
+ struct container
+ {
+ typedef std::deque<Element> type;
+ };
+
+ typedef R receive_cancelled_signature(asio::error_code, Args...);
+
+ template <typename F>
+ static void invoke_receive_cancelled(F f)
+ {
+ const asio::error_code e = error::channel_cancelled;
+ static_cast<F&&>(f)(e, decay_t<Args>()...);
+ }
+
+ typedef R receive_closed_signature(asio::error_code, Args...);
+
+ template <typename F>
+ static void invoke_receive_closed(F f)
+ {
+ const asio::error_code e = error::channel_closed;
+ static_cast<F&&>(f)(e, decay_t<Args>()...);
+ }
+};
+
+template <typename R>
+struct channel_traits<R(std::exception_ptr)>
+{
+ template <typename... NewSignatures>
+ struct rebind
+ {
+ typedef channel_traits<NewSignatures...> other;
+ };
+
+ template <typename Element>
+ struct container
+ {
+ typedef std::deque<Element> type;
+ };
+
+ typedef R receive_cancelled_signature(std::exception_ptr);
+
+ template <typename F>
+ static void invoke_receive_cancelled(F f)
+ {
+ const asio::error_code e = error::channel_cancelled;
+ static_cast<F&&>(f)(
+ std::make_exception_ptr(asio::system_error(e)));
+ }
+
+ typedef R receive_closed_signature(std::exception_ptr);
+
+ template <typename F>
+ static void invoke_receive_closed(F f)
+ {
+ const asio::error_code e = error::channel_closed;
+ static_cast<F&&>(f)(
+ std::make_exception_ptr(asio::system_error(e)));
+ }
+};
+
+template <typename R, typename... Args, typename... Signatures>
+struct channel_traits<R(std::exception_ptr, Args...), Signatures...>
+{
+ template <typename... NewSignatures>
+ struct rebind
+ {
+ typedef channel_traits<NewSignatures...> other;
+ };
+
+ template <typename Element>
+ struct container
+ {
+ typedef std::deque<Element> type;
+ };
+
+ typedef R receive_cancelled_signature(std::exception_ptr, Args...);
+
+ template <typename F>
+ static void invoke_receive_cancelled(F f)
+ {
+ const asio::error_code e = error::channel_cancelled;
+ static_cast<F&&>(f)(
+ std::make_exception_ptr(asio::system_error(e)),
+ decay_t<Args>()...);
+ }
+
+ typedef R receive_closed_signature(std::exception_ptr, Args...);
+
+ template <typename F>
+ static void invoke_receive_closed(F f)
+ {
+ const asio::error_code e = error::channel_closed;
+ static_cast<F&&>(f)(
+ std::make_exception_ptr(asio::system_error(e)),
+ decay_t<Args>()...);
+ }
+};
+
+template <typename R>
+struct channel_traits<R()>
+{
+ template <typename... NewSignatures>
+ struct rebind
+ {
+ typedef channel_traits<NewSignatures...> other;
+ };
+
+ template <typename Element>
+ struct container
+ {
+ typedef std::deque<Element> type;
+ };
+
+ typedef R receive_cancelled_signature(asio::error_code);
+
+ template <typename F>
+ static void invoke_receive_cancelled(F f)
+ {
+ const asio::error_code e = error::channel_cancelled;
+ static_cast<F&&>(f)(e);
+ }
+
+ typedef R receive_closed_signature(asio::error_code);
+
+ template <typename F>
+ static void invoke_receive_closed(F f)
+ {
+ const asio::error_code e = error::channel_closed;
+ static_cast<F&&>(f)(e);
+ }
+};
+
+template <typename R, typename T>
+struct channel_traits<R(T)>
+{
+ template <typename... NewSignatures>
+ struct rebind
+ {
+ typedef channel_traits<NewSignatures...> other;
+ };
+
+ template <typename Element>
+ struct container
+ {
+ typedef std::deque<Element> type;
+ };
+
+ typedef R receive_cancelled_signature(asio::error_code);
+
+ template <typename F>
+ static void invoke_receive_cancelled(F f)
+ {
+ const asio::error_code e = error::channel_cancelled;
+ static_cast<F&&>(f)(e);
+ }
+
+ typedef R receive_closed_signature(asio::error_code);
+
+ template <typename F>
+ static void invoke_receive_closed(F f)
+ {
+ const asio::error_code e = error::channel_closed;
+ static_cast<F&&>(f)(e);
+ }
+};
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_CHANNEL_TRAITS_HPP
diff --git a/3rdparty/asio/include/asio/experimental/co_composed.hpp b/3rdparty/asio/include/asio/experimental/co_composed.hpp
new file mode 100644
index 00000000000..dd1b82939cd
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/co_composed.hpp
@@ -0,0 +1,145 @@
+//
+// experimental/co_composed.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_COMPOSED_HPP
+#define ASIO_EXPERIMENTAL_CO_COMPOSED_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/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+
+/// Creates an initiation function object that may be used to launch a
+/// coroutine-based composed asynchronous operation.
+/**
+ * The experimental::co_composed utility simplifies the implementation of
+ * composed asynchronous operations by automatically adapting a coroutine to be
+ * an initiation function object for use with @c async_initiate. When awaiting
+ * asynchronous operations, the coroutine automatically uses a conforming
+ * intermediate completion handler.
+ *
+ * @param implementation A function object that contains the coroutine-based
+ * implementation of the composed asynchronous operation. The first argument to
+ * the function object represents the state of the operation, and may be used
+ * to test for cancellation. The remaining arguments are those passed to @c
+ * async_initiate after the completion token.
+ *
+ * @param io_objects_or_executors Zero or more I/O objects or I/O executors for
+ * which outstanding work must be maintained while the operation is incomplete.
+ *
+ * @par Per-Operation Cancellation
+ * By default, terminal per-operation cancellation is enabled for composed
+ * operations that use experimental::co_composed. To disable cancellation for
+ * the composed operation, or to alter its supported cancellation types, call
+ * the state's @c reset_cancellation_state function.
+ *
+ * @par Examples
+ * The following example illustrates manual error handling and explicit checks
+ * for cancellation. The completion handler is invoked via a @c co_yield to the
+ * state's @c complete function, which never returns.
+ *
+ * @code template <typename CompletionToken>
+ * auto async_echo(tcp::socket& socket,
+ * CompletionToken&& token)
+ * {
+ * return asio::async_initiate<
+ * CompletionToken, void(std::error_code)>(
+ * asio::experimental::co_composed(
+ * [](auto state, tcp::socket& socket) -> void
+ * {
+ * state.reset_cancellation_state(
+ * asio::enable_terminal_cancellation());
+ *
+ * while (!state.cancelled())
+ * {
+ * char data[1024];
+ * auto [e1, n1] =
+ * co_await socket.async_read_some(
+ * asio::buffer(data),
+ * asio::as_tuple(asio::deferred));
+ *
+ * if (e1)
+ * co_yield state.complete(e1);
+ *
+ * if (!!state.cancelled())
+ * co_yield state.complete(
+ * make_error_code(asio::error::operation_aborted));
+ *
+ * auto [e2, n2] =
+ * co_await asio::async_write(socket,
+ * asio::buffer(data, n1),
+ * asio::as_tuple(asio::deferred));
+ *
+ * if (e2)
+ * co_yield state.complete(e2);
+ * }
+ * }, socket),
+ * token, std::ref(socket));
+ * } @endcode
+ *
+ * This next example shows exception-based error handling and implicit checks
+ * for cancellation. The completion handler is invoked after returning from the
+ * coroutine via @c co_return. Valid @c co_return values are specified using
+ * completion signatures passed to the @c co_composed function.
+ *
+ * @code template <typename CompletionToken>
+ * auto async_echo(tcp::socket& socket,
+ * CompletionToken&& token)
+ * {
+ * return asio::async_initiate<
+ * CompletionToken, void(std::error_code)>(
+ * asio::experimental::co_composed<
+ * void(std::error_code)>(
+ * [](auto state, tcp::socket& socket) -> void
+ * {
+ * try
+ * {
+ * state.throw_if_cancelled(true);
+ * state.reset_cancellation_state(
+ * asio::enable_terminal_cancellation());
+ *
+ * for (;;)
+ * {
+ * char data[1024];
+ * std::size_t n = co_await socket.async_read_some(
+ * asio::buffer(data), asio::deferred);
+ *
+ * co_await asio::async_write(socket,
+ * asio::buffer(data, n), asio::deferred);
+ * }
+ * }
+ * catch (const std::system_error& e)
+ * {
+ * co_return {e.code()};
+ * }
+ * }, socket),
+ * token, std::ref(socket));
+ * } @endcode
+ */
+template <completion_signature... Signatures,
+ typename Implementation, typename... IoObjectsOrExecutors>
+auto co_composed(Implementation&& implementation,
+ IoObjectsOrExecutors&&... io_objects_or_executors);
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/experimental/impl/co_composed.hpp"
+
+#endif // ASIO_EXPERIMENTAL_CO_COMPOSED_HPP
diff --git a/3rdparty/asio/include/asio/experimental/co_spawn.hpp b/3rdparty/asio/include/asio/experimental/co_spawn.hpp
new file mode 100644
index 00000000000..8ef59283178
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/co_spawn.hpp
@@ -0,0 +1,187 @@
+//
+// experimental/co_spawn.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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"
+#include <utility>
+#include "asio/compose.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/experimental/coro.hpp"
+#include "asio/experimental/deferred.hpp"
+#include "asio/experimental/prepend.hpp"
+#include "asio/redirect_error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <typename T, typename U, typename Executor>
+struct coro_spawn_op
+{
+ coro<T, U, Executor> c;
+
+ void operator()(auto& self)
+ {
+ auto op = c.async_resume(deferred);
+ std::move(op)((prepend)(std::move(self), 0));
+ }
+
+ void operator()(auto& self, int, auto... res)
+ {
+ self.complete(std::move(res)...);
+ }
+};
+
+} // namespace detail
+
+/// Spawn a resumable coroutine.
+/**
+ * This function spawns the coroutine for execution on its executor. It binds
+ * the lifetime of the coroutine to the executor.
+ *
+ * @param c The coroutine
+ *
+ * @param token The completion token
+ *
+ * @returns Implementation defined
+ */
+template <typename T, typename Executor, typename CompletionToken>
+ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(std::exception_ptr, T))
+co_spawn(coro<void, T, Executor> c, CompletionToken&& token)
+{
+ auto exec = c.get_executor();
+ return async_compose<CompletionToken, void(std::exception_ptr, T)>(
+ detail::coro_spawn_op<void, T, Executor>{std::move(c)},
+ token, exec);
+}
+
+/// Spawn a resumable coroutine.
+/**
+ * This function spawns the coroutine for execution on its executor. It binds
+ * the lifetime of the coroutine to the executor.
+ *
+ * @param c The coroutine
+ *
+ * @param token The completion token
+ *
+ * @returns Implementation defined
+ */
+template <typename T, typename Executor, typename CompletionToken>
+ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(std::exception_ptr, T))
+co_spawn(coro<void(), T, Executor> c, CompletionToken&& token)
+{
+ auto exec = c.get_executor();
+ return async_compose<CompletionToken, void(std::exception_ptr, T)>(
+ detail::coro_spawn_op<void(), T, Executor>{std::move(c)},
+ token, exec);
+}
+
+/// Spawn a resumable coroutine.
+/**
+ * This function spawns the coroutine for execution on its executor. It binds
+ * the lifetime of the coroutine to the executor.
+ *
+ * @param c The coroutine
+ *
+ * @param token The completion token
+ *
+ * @returns Implementation defined
+ */
+template <typename T, typename Executor, typename CompletionToken>
+ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void(T))
+co_spawn(coro<void() noexcept, T, Executor> c, CompletionToken&& token)
+{
+ auto exec = c.get_executor();
+ return async_compose<CompletionToken, void(T)>(
+ detail::coro_spawn_op<void() noexcept, T, Executor>{std::move(c)},
+ token, exec);
+}
+
+/// Spawn a resumable coroutine.
+/**
+ * This function spawns the coroutine for execution on its executor. It binds
+ * the lifetime of the coroutine to the executor.
+ *
+ * @param c The coroutine
+ *
+ * @param token The completion token
+ *
+ * @returns Implementation defined
+ */
+template <typename Executor, typename CompletionToken>
+ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(std::exception_ptr))
+co_spawn(coro<void, void, Executor> c, CompletionToken&& token)
+{
+ auto exec = c.get_executor();
+ return async_compose<CompletionToken, void(std::exception_ptr)>(
+ detail::coro_spawn_op<void, void, Executor>{std::move(c)},
+ token, exec);
+}
+
+/// Spawn a resumable coroutine.
+/**
+ * This function spawns the coroutine for execution on its executor. It binds
+ * the lifetime of the coroutine to the executor.
+ *
+ * @param c The coroutine
+ *
+ * @param token The completion token
+ *
+ * @returns Implementation defined
+ */
+template <typename Executor, typename CompletionToken>
+ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(std::exception_ptr))
+co_spawn(coro<void(), void, Executor> c, CompletionToken&& token)
+{
+ auto exec = c.get_executor();
+ return async_compose<CompletionToken, void(std::exception_ptr)>(
+ detail::coro_spawn_op<void(), void, Executor>{std::move(c)},
+ token, exec);
+}
+
+/// Spawn a resumable coroutine.
+/**
+ * This function spawns the coroutine for execution on its executor. It binds
+ * the lifetime of the coroutine to the executor.
+ *
+ * @param c The coroutine
+ *
+ * @param token The completion token
+ *
+ * @returns Implementation defined
+ */
+template <typename Executor, typename CompletionToken>
+ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void())
+co_spawn(coro<void() noexcept, void, Executor> c, CompletionToken&& token)
+{
+ auto exec = c.get_executor();
+ return async_compose<CompletionToken, void()>(
+ detail::coro_spawn_op<void() noexcept, void, Executor>{std::move(c)},
+ token, exec);
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif //ASIO_EXPERIMENTAL_CO_SPAWN_HPP
diff --git a/3rdparty/asio/include/asio/experimental/concurrent_channel.hpp b/3rdparty/asio/include/asio/experimental/concurrent_channel.hpp
new file mode 100644
index 00000000000..b326be96d31
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/concurrent_channel.hpp
@@ -0,0 +1,70 @@
+//
+// experimental/concurrent_channel.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CONCURRENT_CHANNEL_HPP
+#define ASIO_EXPERIMENTAL_CONCURRENT_CHANNEL_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/any_io_executor.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/is_executor.hpp"
+#include "asio/experimental/basic_concurrent_channel.hpp"
+#include "asio/experimental/channel_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <typename ExecutorOrSignature, typename = void>
+struct concurrent_channel_type
+{
+ template <typename... Signatures>
+ struct inner
+ {
+ typedef basic_concurrent_channel<any_io_executor, channel_traits<>,
+ ExecutorOrSignature, Signatures...> type;
+ };
+};
+
+template <typename ExecutorOrSignature>
+struct concurrent_channel_type<ExecutorOrSignature,
+ enable_if_t<
+ is_executor<ExecutorOrSignature>::value
+ || execution::is_executor<ExecutorOrSignature>::value
+ >>
+{
+ template <typename... Signatures>
+ struct inner
+ {
+ typedef basic_concurrent_channel<ExecutorOrSignature,
+ channel_traits<>, Signatures...> type;
+ };
+};
+
+} // namespace detail
+
+/// Template type alias for common use of channel.
+template <typename ExecutorOrSignature, typename... Signatures>
+using concurrent_channel = typename detail::concurrent_channel_type<
+ ExecutorOrSignature>::template inner<Signatures...>::type;
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_CONCURRENT_CHANNEL_HPP
diff --git a/3rdparty/asio/include/asio/experimental/coro.hpp b/3rdparty/asio/include/asio/experimental/coro.hpp
new file mode 100644
index 00000000000..de909d29a6b
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/coro.hpp
@@ -0,0 +1,293 @@
+//
+// experimental/coro.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_CORO_HPP
+#define ASIO_EXPERIMENTAL_CORO_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/dispatch.hpp"
+#include "asio/error.hpp"
+#include "asio/error_code.hpp"
+#include "asio/experimental/coro_traits.hpp"
+#include "asio/experimental/detail/coro_promise_allocator.hpp"
+#include "asio/experimental/detail/partial_promise.hpp"
+#include "asio/post.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <typename Signature, typename Return,
+ typename Executor, typename Allocator>
+struct coro_promise;
+
+template <typename T, typename Coroutine>
+struct coro_with_arg;
+
+} // namespace detail
+
+/// The main type of a resumable coroutine.
+/**
+ * Template parameter @c Yield specifies type or signature used by co_yield,
+ * @c Return specifies the type used for co_return, and @c Executor specifies
+ * the underlying executor type.
+ */
+template <typename Yield = void, typename Return = void,
+ typename Executor = any_io_executor,
+ typename Allocator = std::allocator<void>>
+struct coro
+{
+ /// The traits of the coroutine. See asio::experimental::coro_traits
+ /// for details.
+ using traits = coro_traits<Yield, Return, Executor>;
+
+ /// The value that can be passed into a symmetrical cororoutine. @c void if
+ /// asymmetrical.
+ using input_type = typename traits::input_type;
+
+ /// The type that can be passed out through a co_yield.
+ using yield_type = typename traits::yield_type;
+
+ /// The type that can be passed out through a co_return.
+ using return_type = typename traits::return_type;
+
+ /// The type received by a co_await or async_resume. Its a combination of
+ /// yield and return.
+ using result_type = typename traits::result_type;
+
+ /// The signature used by the async_resume.
+ using signature_type = typename traits::signature_type;
+
+ /// Whether or not the coroutine is noexcept.
+ constexpr static bool is_noexcept = traits::is_noexcept;
+
+ /// The error type of the coroutine. Void for noexcept
+ using error_type = typename traits::error_type;
+
+ /// Completion handler type used by async_resume.
+ using completion_handler = typename traits::completion_handler;
+
+ /// The internal promise-type of the coroutine.
+ using promise_type = detail::coro_promise<Yield, Return, Executor, Allocator>;
+
+#if !defined(GENERATING_DOCUMENTATION)
+ template <typename T, typename Coroutine>
+ friend struct detail::coro_with_arg;
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ /// The executor type.
+ using executor_type = Executor;
+
+ /// The allocator type.
+ using allocator_type = Allocator;
+
+#if !defined(GENERATING_DOCUMENTATION)
+ friend struct detail::coro_promise<Yield, Return, Executor, Allocator>;
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ /// The default constructor, gives an invalid coroutine.
+ coro() = default;
+
+ /// Move constructor.
+ coro(coro&& lhs) noexcept
+ : coro_(std::exchange(lhs.coro_, nullptr))
+ {
+ }
+
+ coro(const coro&) = delete;
+
+ /// Move assignment.
+ coro& operator=(coro&& lhs) noexcept
+ {
+ std::swap(coro_, lhs.coro_);
+ return *this;
+ }
+
+ coro& operator=(const coro&) = delete;
+
+ /// Destructor. Destroys the coroutine, if it holds a valid one.
+ /**
+ * @note This does not cancel an active coroutine. Destructing a resumable
+ * coroutine, i.e. one with a call to async_resume that has not completed, is
+ * undefined behaviour.
+ */
+ ~coro()
+ {
+ if (coro_ != nullptr)
+ {
+ struct destroyer
+ {
+ detail::coroutine_handle<promise_type> handle;
+
+ destroyer(const detail::coroutine_handle<promise_type>& handle)
+ : handle(handle)
+ { }
+
+ destroyer(destroyer&& lhs)
+ : handle(std::exchange(lhs.handle, nullptr))
+ {
+ }
+
+ destroyer(const destroyer&) = delete;
+
+ void operator()() {}
+
+ ~destroyer()
+ {
+ if (handle)
+ handle.destroy();
+ }
+ };
+
+ auto handle =
+ detail::coroutine_handle<promise_type>::from_promise(*coro_);
+ if (handle)
+ asio::dispatch(coro_->get_executor(), destroyer{handle});
+ }
+ }
+
+ /// Get the used executor.
+ executor_type get_executor() const
+ {
+ if (coro_)
+ return coro_->get_executor();
+
+ if constexpr (std::is_default_constructible_v<Executor>)
+ return Executor{};
+ else
+ throw std::logic_error("Coroutine has no executor");
+ }
+
+ /// Get the used allocator.
+ allocator_type get_allocator() const
+ {
+ if (coro_)
+ return coro_->get_allocator();
+
+ if constexpr (std::is_default_constructible_v<Allocator>)
+ return Allocator{};
+ else
+ throw std::logic_error(
+ "Coroutine has no available allocator without a constructed promise");
+ }
+
+ /// Resume the coroutine.
+ /**
+ * @param token The completion token of the async resume.
+ *
+ * @attention Calling an invalid coroutine with a noexcept signature is
+ * undefined behaviour.
+ *
+ * @note This overload is only available for coroutines without an input
+ * value.
+ */
+ template <typename CompletionToken>
+ requires std::is_void_v<input_type>
+ auto async_resume(CompletionToken&& token) &
+ {
+ return async_initiate<CompletionToken,
+ typename traits::completion_handler>(
+ initiate_async_resume(this), token);
+ }
+
+ /// Resume the coroutine.
+ /**
+ * @param token The completion token of the async resume.
+ *
+ * @attention Calling an invalid coroutine with a noexcept signature is
+ * undefined behaviour.
+ *
+ * @note This overload is only available for coroutines with an input value.
+ */
+ template <typename CompletionToken, detail::convertible_to<input_type> T>
+ auto async_resume(T&& ip, CompletionToken&& token) &
+ {
+ return async_initiate<CompletionToken,
+ typename traits::completion_handler>(
+ initiate_async_resume(this), token, std::forward<T>(ip));
+ }
+
+ /// Operator used for coroutines without input value.
+ auto operator co_await() requires (std::is_void_v<input_type>)
+ {
+ return awaitable_t{*this};
+ }
+
+ /// Operator used for coroutines with input value.
+ /**
+ * @param ip The input value
+ *
+ * @returns An awaitable handle.
+ *
+ * @code
+ * coro<void> push_values(coro<double(int)> c)
+ * {
+ * std::optional<double> res = co_await c(42);
+ * }
+ * @endcode
+ */
+ template <detail::convertible_to<input_type> T>
+ auto operator()(T&& ip)
+ {
+ return detail::coro_with_arg<std::decay_t<T>, coro>{
+ std::forward<T>(ip), *this};
+ }
+
+ /// Check whether the coroutine is open, i.e. can be resumed.
+ bool is_open() const
+ {
+ if (coro_)
+ {
+ auto handle =
+ detail::coroutine_handle<promise_type>::from_promise(*coro_);
+ return handle && !handle.done();
+ }
+ else
+ return false;
+ }
+
+ /// Check whether the coroutine is open, i.e. can be resumed.
+ explicit operator bool() const { return is_open(); }
+
+private:
+ struct awaitable_t;
+
+ struct initiate_async_resume;
+
+ explicit coro(promise_type* const cr) : coro_(cr) {}
+
+ promise_type* coro_{nullptr};
+};
+
+/// A generator is a coro that returns void and yields value.
+template<typename T, typename Executor = asio::any_io_executor,
+ typename Allocator = std::allocator<void>>
+using generator = coro<T, void, Executor, Allocator>;
+
+/// A task is a coro that does not yield values
+template<typename T, typename Executor = asio::any_io_executor,
+ typename Allocator = std::allocator<void>>
+using task = coro<void(), T, Executor, Allocator>;
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/experimental/impl/coro.hpp"
+
+#endif // ASIO_EXPERIMENTAL_CORO_HPP
diff --git a/3rdparty/asio/include/asio/experimental/coro_traits.hpp b/3rdparty/asio/include/asio/experimental/coro_traits.hpp
new file mode 100644
index 00000000000..7da904b1273
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/coro_traits.hpp
@@ -0,0 +1,228 @@
+//
+// experimental/detail/coro_traits.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_DETAIL_CORO_TRAITS_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_CORO_TRAITS_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <optional>
+#include <variant>
+#include "asio/any_io_executor.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <class From, class To>
+concept convertible_to = std::is_convertible_v<From, To>;
+
+template <typename T>
+concept decays_to_executor = execution::executor<std::decay_t<T>>;
+
+template <typename T, typename Executor = any_io_executor>
+concept execution_context = requires (T& t)
+{
+ {t.get_executor()} -> convertible_to<Executor>;
+};
+
+template <typename Yield, typename Return>
+struct coro_result
+{
+ using type = std::variant<Yield, Return>;
+};
+
+template <typename Yield>
+struct coro_result<Yield, void>
+{
+ using type = std::optional<Yield>;
+};
+
+template <typename Return>
+struct coro_result<void, Return>
+{
+ using type = Return;
+};
+
+template <typename YieldReturn>
+struct coro_result<YieldReturn, YieldReturn>
+{
+ using type = YieldReturn;
+};
+
+template <>
+struct coro_result<void, void>
+{
+ using type = void;
+};
+
+template <typename Yield, typename Return>
+using coro_result_t = typename coro_result<Yield, Return>::type;
+
+template <typename Result, bool IsNoexcept>
+struct coro_handler;
+
+template <>
+struct coro_handler<void, false>
+{
+ using type = void(std::exception_ptr);
+};
+
+template <>
+struct coro_handler<void, true>
+{
+ using type = void();
+};
+
+template <typename T>
+struct coro_handler<T, false>
+{
+ using type = void(std::exception_ptr, T);
+};
+
+template <typename T>
+struct coro_handler<T, true>
+{
+ using type = void(T);
+};
+
+template <typename Result, bool IsNoexcept>
+using coro_handler_t = typename coro_handler<Result, IsNoexcept>::type;
+
+} // namespace detail
+
+#if defined(GENERATING_DOCUMENTATION)
+
+/// The traits describing the resumable coroutine behaviour.
+/**
+ * Template parameter @c Yield specifies type or signature used by co_yield,
+ * @c Return specifies the type used for co_return, and @c Executor specifies
+ * the underlying executor type.
+ */
+template <typename Yield, typename Return, typename Executor>
+struct coro_traits
+{
+ /// The value that can be passed into a symmetrical cororoutine. @c void if
+ /// asymmetrical.
+ using input_type = argument_dependent;
+
+ /// The type that can be passed out through a co_yield.
+ using yield_type = argument_dependent;
+
+ /// The type that can be passed out through a co_return.
+ using return_type = argument_dependent;
+
+ /// The type received by a co_await or async_resume. It's a combination of
+ /// yield and return.
+ using result_type = argument_dependent;
+
+ /// The signature used by the async_resume.
+ using signature_type = argument_dependent;
+
+ /// Whether or not the coroutine is noexcept.
+ constexpr static bool is_noexcept = argument_dependent;
+
+ /// The error type of the coroutine. @c void for noexcept.
+ using error_type = argument_dependent;
+
+ /// Completion handler type used by async_resume.
+ using completion_handler = argument_dependent;
+};
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+template <typename Yield, typename Return, typename Executor>
+struct coro_traits
+{
+ using input_type = void;
+ using yield_type = Yield;
+ using return_type = Return;
+ using result_type = detail::coro_result_t<yield_type, return_type>;
+ using signature_type = result_type();
+ constexpr static bool is_noexcept = false;
+ using error_type = std::conditional_t<is_noexcept, void, std::exception_ptr>;
+ using completion_handler = detail::coro_handler_t<result_type, is_noexcept>;
+};
+
+template <typename T, typename Return, typename Executor>
+struct coro_traits<T(), Return, Executor>
+{
+ using input_type = void;
+ using yield_type = T;
+ using return_type = Return;
+ using result_type = detail::coro_result_t<yield_type, return_type>;
+ using signature_type = result_type();
+ constexpr static bool is_noexcept = false;
+ using error_type = std::conditional_t<is_noexcept, void, std::exception_ptr>;
+ using completion_handler = detail::coro_handler_t<result_type, is_noexcept>;
+};
+
+template <typename T, typename Return, typename Executor>
+struct coro_traits<T() noexcept, Return, Executor>
+{
+ using input_type = void;
+ using yield_type = T;
+ using return_type = Return;
+ using result_type = detail::coro_result_t<yield_type, return_type>;
+ using signature_type = result_type();
+ constexpr static bool is_noexcept = true;
+ using error_type = std::conditional_t<is_noexcept, void, std::exception_ptr>;
+ using completion_handler = detail::coro_handler_t<result_type, is_noexcept>;
+};
+
+template <typename T, typename U, typename Return, typename Executor>
+struct coro_traits<T(U), Return, Executor>
+{
+ using input_type = U;
+ using yield_type = T;
+ using return_type = Return;
+ using result_type = detail::coro_result_t<yield_type, return_type>;
+ using signature_type = result_type(input_type);
+ constexpr static bool is_noexcept = false;
+ using error_type = std::conditional_t<is_noexcept, void, std::exception_ptr>;
+ using completion_handler = detail::coro_handler_t<result_type, is_noexcept>;
+};
+
+template <typename T, typename U, typename Return, typename Executor>
+struct coro_traits<T(U) noexcept, Return, Executor>
+{
+ using input_type = U;
+ using yield_type = T;
+ using return_type = Return;
+ using result_type = detail::coro_result_t<yield_type, return_type>;
+ using signature_type = result_type(input_type);
+ constexpr static bool is_noexcept = true;
+ using error_type = std::conditional_t<is_noexcept, void, std::exception_ptr>;
+ using completion_handler = detail::coro_handler_t<result_type, is_noexcept>;
+};
+
+template <typename Executor>
+struct coro_traits<void() noexcept, void, Executor>
+{
+ using input_type = void;
+ using yield_type = void;
+ using return_type = void;
+ using result_type = detail::coro_result_t<yield_type, return_type>;
+ using signature_type = result_type(input_type);
+ constexpr static bool is_noexcept = true;
+ using error_type = std::conditional_t<is_noexcept, void, std::exception_ptr>;
+ using completion_handler = detail::coro_handler_t<result_type, is_noexcept>;
+};
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace experimental
+} // namespace asio
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_CORO_TRAITS_HPP
diff --git a/3rdparty/asio/include/asio/experimental/deferred.hpp b/3rdparty/asio/include/asio/experimental/deferred.hpp
new file mode 100644
index 00000000000..c722ad1a2de
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/deferred.hpp
@@ -0,0 +1,36 @@
+//
+// experimental/deferred.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DEFERRED_HPP
+#define ASIO_EXPERIMENTAL_DEFERRED_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/deferred.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+
+#if !defined(ASIO_NO_DEPRECATED)
+using asio::deferred_t;
+using asio::deferred;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_DEFERRED_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/channel_handler.hpp b/3rdparty/asio/include/asio/experimental/detail/channel_handler.hpp
new file mode 100644
index 00000000000..0152c2e76ff
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/channel_handler.hpp
@@ -0,0 +1,77 @@
+//
+// experimental/detail/channel_handler.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DETAIL_CHANNEL_HANDLER_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_CHANNEL_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/associator.hpp"
+#include "asio/experimental/detail/channel_payload.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <typename Payload, typename Handler>
+class channel_handler
+{
+public:
+ channel_handler(Payload&& p, Handler& h)
+ : payload_(static_cast<Payload&&>(p)),
+ handler_(static_cast<Handler&&>(h))
+ {
+ }
+
+ void operator()()
+ {
+ payload_.receive(handler_);
+ }
+
+//private:
+ Payload payload_;
+ Handler handler_;
+};
+
+} // namespace detail
+} // namespace experimental
+
+template <template <typename, typename> class Associator,
+ typename Payload, typename Handler, typename DefaultCandidate>
+struct associator<Associator,
+ experimental::detail::channel_handler<Payload, Handler>,
+ DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const experimental::detail::channel_handler<Payload, Handler>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const experimental::detail::channel_handler<Payload, Handler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_CHANNEL_HANDLER_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/channel_message.hpp b/3rdparty/asio/include/asio/experimental/detail/channel_message.hpp
new file mode 100644
index 00000000000..16446f0c1bb
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/channel_message.hpp
@@ -0,0 +1,129 @@
+//
+// experimental/detail/channel_message.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DETAIL_CHANNEL_MESSAGE_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_CHANNEL_MESSAGE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <tuple>
+#include "asio/detail/type_traits.hpp"
+#include "asio/detail/utility.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <typename Signature>
+class channel_message;
+
+template <typename R>
+class channel_message<R()>
+{
+public:
+ channel_message(int)
+ {
+ }
+
+ template <typename Handler>
+ void receive(Handler& handler)
+ {
+ static_cast<Handler&&>(handler)();
+ }
+};
+
+template <typename R, typename Arg0>
+class channel_message<R(Arg0)>
+{
+public:
+ template <typename T0>
+ channel_message(int, T0&& t0)
+ : arg0_(static_cast<T0&&>(t0))
+ {
+ }
+
+ template <typename Handler>
+ void receive(Handler& handler)
+ {
+ static_cast<Handler&&>(handler)(
+ static_cast<arg0_type&&>(arg0_));
+ }
+
+private:
+ typedef decay_t<Arg0> arg0_type;
+ arg0_type arg0_;
+};
+
+template <typename R, typename Arg0, typename Arg1>
+class channel_message<R(Arg0, Arg1)>
+{
+public:
+ template <typename T0, typename T1>
+ channel_message(int, T0&& t0, T1&& t1)
+ : arg0_(static_cast<T0&&>(t0)),
+ arg1_(static_cast<T1&&>(t1))
+ {
+ }
+
+ template <typename Handler>
+ void receive(Handler& handler)
+ {
+ static_cast<Handler&&>(handler)(
+ static_cast<arg0_type&&>(arg0_),
+ static_cast<arg1_type&&>(arg1_));
+ }
+
+private:
+ typedef decay_t<Arg0> arg0_type;
+ arg0_type arg0_;
+ typedef decay_t<Arg1> arg1_type;
+ arg1_type arg1_;
+};
+
+template <typename R, typename... Args>
+class channel_message<R(Args...)>
+{
+public:
+ template <typename... T>
+ channel_message(int, T&&... t)
+ : args_(static_cast<T&&>(t)...)
+ {
+ }
+
+ template <typename Handler>
+ void receive(Handler& h)
+ {
+ this->do_receive(h, asio::detail::index_sequence_for<Args...>());
+ }
+
+private:
+ template <typename Handler, std::size_t... I>
+ void do_receive(Handler& h, asio::detail::index_sequence<I...>)
+ {
+ static_cast<Handler&&>(h)(
+ std::get<I>(static_cast<args_type&&>(args_))...);
+ }
+
+ typedef std::tuple<decay_t<Args>...> args_type;
+ args_type args_;
+};
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_CHANNEL_MESSAGE_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/channel_operation.hpp b/3rdparty/asio/include/asio/experimental/detail/channel_operation.hpp
new file mode 100644
index 00000000000..1231f1f87c1
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/channel_operation.hpp
@@ -0,0 +1,361 @@
+//
+// experimental/detail/channel_operation.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DETAIL_CHANNEL_OPERATION_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_CHANNEL_OPERATION_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/associated_immediate_executor.hpp"
+#include "asio/detail/initiate_post.hpp"
+#include "asio/detail/initiate_dispatch.hpp"
+#include "asio/detail/op_queue.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/execution/outstanding_work.hpp"
+#include "asio/executor_work_guard.hpp"
+#include "asio/prefer.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+// Base class for all channel operations. A function pointer is used instead of
+// virtual functions to avoid the associated overhead.
+class channel_operation ASIO_INHERIT_TRACKED_HANDLER
+{
+public:
+ template <typename Executor, typename = void, typename = void>
+ class handler_work_base;
+
+ template <typename Handler, typename IoExecutor, typename = void>
+ class handler_work;
+
+ void destroy()
+ {
+ func_(this, destroy_op, 0);
+ }
+
+protected:
+ enum action
+ {
+ destroy_op = 0,
+ immediate_op = 1,
+ post_op = 2,
+ dispatch_op = 3,
+ cancel_op = 4,
+ close_op = 5
+ };
+
+ typedef void (*func_type)(channel_operation*, action, void*);
+
+ channel_operation(func_type func)
+ : next_(0),
+ func_(func),
+ cancellation_key_(0)
+ {
+ }
+
+ // Prevents deletion through this type.
+ ~channel_operation()
+ {
+ }
+
+ friend class asio::detail::op_queue_access;
+ channel_operation* next_;
+ func_type func_;
+
+public:
+ // The operation key used for targeted cancellation.
+ void* cancellation_key_;
+};
+
+template <typename Executor, typename, typename>
+class channel_operation::handler_work_base
+{
+public:
+ typedef decay_t<
+ prefer_result_t<Executor,
+ execution::outstanding_work_t::tracked_t
+ >
+ > executor_type;
+
+ handler_work_base(int, const Executor& ex)
+ : executor_(asio::prefer(ex, execution::outstanding_work.tracked))
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return executor_;
+ }
+
+ template <typename IoExecutor, typename Function, typename Handler>
+ void post(const IoExecutor& io_exec, Function& function, Handler&)
+ {
+ (asio::detail::initiate_post_with_executor<IoExecutor>(io_exec))(
+ static_cast<Function&&>(function));
+ }
+
+ template <typename Function, typename Handler>
+ void dispatch(Function& function, Handler& handler)
+ {
+ associated_allocator_t<Handler> allocator =
+ (get_associated_allocator)(handler);
+
+ asio::prefer(executor_,
+ execution::allocator(allocator)
+ ).execute(static_cast<Function&&>(function));
+ }
+
+private:
+ executor_type executor_;
+};
+
+template <typename Executor>
+class channel_operation::handler_work_base<Executor,
+ enable_if_t<
+ execution::is_executor<Executor>::value
+ >,
+ enable_if_t<
+ can_require<Executor, execution::blocking_t::never_t>::value
+ >
+ >
+{
+public:
+ typedef decay_t<
+ prefer_result_t<Executor,
+ execution::outstanding_work_t::tracked_t
+ >
+ > executor_type;
+
+ handler_work_base(int, const Executor& ex)
+ : executor_(asio::prefer(ex, execution::outstanding_work.tracked))
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return executor_;
+ }
+
+ template <typename IoExecutor, typename Function, typename Handler>
+ void post(const IoExecutor&, Function& function, Handler& handler)
+ {
+ associated_allocator_t<Handler> allocator =
+ (get_associated_allocator)(handler);
+
+ asio::prefer(
+ asio::require(executor_, execution::blocking.never),
+ execution::allocator(allocator)
+ ).execute(static_cast<Function&&>(function));
+ }
+
+ template <typename Function, typename Handler>
+ void dispatch(Function& function, Handler& handler)
+ {
+ associated_allocator_t<Handler> allocator =
+ (get_associated_allocator)(handler);
+
+ asio::prefer(executor_,
+ execution::allocator(allocator)
+ ).execute(static_cast<Function&&>(function));
+ }
+
+private:
+ executor_type executor_;
+};
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Executor>
+class channel_operation::handler_work_base<Executor,
+ enable_if_t<
+ !execution::is_executor<Executor>::value
+ >
+ >
+{
+public:
+ typedef Executor executor_type;
+
+ handler_work_base(int, const Executor& ex)
+ : work_(ex)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return work_.get_executor();
+ }
+
+ template <typename IoExecutor, typename Function, typename Handler>
+ void post(const IoExecutor&, Function& function, Handler& handler)
+ {
+ associated_allocator_t<Handler> allocator =
+ (get_associated_allocator)(handler);
+
+ work_.get_executor().post(
+ static_cast<Function&&>(function), allocator);
+ }
+
+ template <typename Function, typename Handler>
+ void dispatch(Function& function, Handler& handler)
+ {
+ associated_allocator_t<Handler> allocator =
+ (get_associated_allocator)(handler);
+
+ work_.get_executor().dispatch(
+ static_cast<Function&&>(function), allocator);
+ }
+
+private:
+ executor_work_guard<Executor> work_;
+};
+
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Handler, typename IoExecutor, typename>
+class channel_operation::handler_work :
+ channel_operation::handler_work_base<IoExecutor>,
+ channel_operation::handler_work_base<
+ associated_executor_t<Handler, IoExecutor>, IoExecutor>
+{
+public:
+ typedef channel_operation::handler_work_base<IoExecutor> base1_type;
+
+ typedef channel_operation::handler_work_base<
+ associated_executor_t<Handler, IoExecutor>, IoExecutor>
+ base2_type;
+
+ handler_work(Handler& handler, const IoExecutor& io_ex) noexcept
+ : base1_type(0, io_ex),
+ base2_type(0, (get_associated_executor)(handler, io_ex))
+ {
+ }
+
+ template <typename Function>
+ void post(Function& function, Handler& handler)
+ {
+ base2_type::post(base1_type::get_executor(), function, handler);
+ }
+
+ template <typename Function>
+ void dispatch(Function& function, Handler& handler)
+ {
+ base2_type::dispatch(function, handler);
+ }
+
+ template <typename Function>
+ void immediate(Function& function, Handler& handler, ...)
+ {
+ typedef associated_immediate_executor_t<Handler,
+ typename base1_type::executor_type> immediate_ex_type;
+
+ immediate_ex_type immediate_ex = (get_associated_immediate_executor)(
+ handler, base1_type::get_executor());
+
+ (asio::detail::initiate_dispatch_with_executor<immediate_ex_type>(
+ immediate_ex))(static_cast<Function&&>(function));
+ }
+
+ template <typename Function>
+ void immediate(Function& function, Handler&,
+ enable_if_t<
+ is_same<
+ typename associated_immediate_executor<
+ conditional_t<false, Function, Handler>,
+ typename base1_type::executor_type>::
+ asio_associated_immediate_executor_is_unspecialised,
+ void
+ >::value
+ >*)
+ {
+ (asio::detail::initiate_post_with_executor<
+ typename base1_type::executor_type>(
+ base1_type::get_executor()))(
+ static_cast<Function&&>(function));
+ }
+};
+
+template <typename Handler, typename IoExecutor>
+class channel_operation::handler_work<
+ Handler, IoExecutor,
+ enable_if_t<
+ is_same<
+ typename associated_executor<Handler,
+ IoExecutor>::asio_associated_executor_is_unspecialised,
+ void
+ >::value
+ >
+ > : handler_work_base<IoExecutor>
+{
+public:
+ typedef channel_operation::handler_work_base<IoExecutor> base1_type;
+
+ handler_work(Handler&, const IoExecutor& io_ex) noexcept
+ : base1_type(0, io_ex)
+ {
+ }
+
+ template <typename Function>
+ void post(Function& function, Handler& handler)
+ {
+ base1_type::post(base1_type::get_executor(), function, handler);
+ }
+
+ template <typename Function>
+ void dispatch(Function& function, Handler& handler)
+ {
+ base1_type::dispatch(function, handler);
+ }
+
+ template <typename Function>
+ void immediate(Function& function, Handler& handler, ...)
+ {
+ typedef associated_immediate_executor_t<Handler,
+ typename base1_type::executor_type> immediate_ex_type;
+
+ immediate_ex_type immediate_ex = (get_associated_immediate_executor)(
+ handler, base1_type::get_executor());
+
+ (asio::detail::initiate_dispatch_with_executor<immediate_ex_type>(
+ immediate_ex))(static_cast<Function&&>(function));
+ }
+
+ template <typename Function>
+ void immediate(Function& function, Handler& handler,
+ enable_if_t<
+ is_same<
+ typename associated_immediate_executor<
+ conditional_t<false, Function, Handler>,
+ typename base1_type::executor_type>::
+ asio_associated_immediate_executor_is_unspecialised,
+ void
+ >::value
+ >*)
+ {
+ base1_type::post(base1_type::get_executor(), function, handler);
+ }
+};
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_CHANNEL_OPERATION_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/channel_payload.hpp b/3rdparty/asio/include/asio/experimental/detail/channel_payload.hpp
new file mode 100644
index 00000000000..31614cd5dbc
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/channel_payload.hpp
@@ -0,0 +1,222 @@
+//
+// experimental/detail/channel_payload.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DETAIL_CHANNEL_PAYLOAD_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_CHANNEL_PAYLOAD_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/experimental/detail/channel_message.hpp"
+
+#if defined(ASIO_HAS_STD_VARIANT)
+# include <variant>
+#else // defined(ASIO_HAS_STD_VARIANT)
+# include <new>
+#endif // defined(ASIO_HAS_STD_VARIANT)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <typename... Signatures>
+class channel_payload;
+
+template <typename R>
+class channel_payload<R()>
+{
+public:
+ explicit channel_payload(channel_message<R()>)
+ {
+ }
+
+ template <typename Handler>
+ void receive(Handler& handler)
+ {
+ static_cast<Handler&&>(handler)();
+ }
+};
+
+template <typename Signature>
+class channel_payload<Signature>
+{
+public:
+ channel_payload(channel_message<Signature>&& m)
+ : message_(static_cast<channel_message<Signature>&&>(m))
+ {
+ }
+
+ template <typename Handler>
+ void receive(Handler& handler)
+ {
+ message_.receive(handler);
+ }
+
+private:
+ channel_message<Signature> message_;
+};
+
+#if defined(ASIO_HAS_STD_VARIANT)
+
+template <typename... Signatures>
+class channel_payload
+{
+public:
+ template <typename Signature>
+ channel_payload(channel_message<Signature>&& m)
+ : message_(static_cast<channel_message<Signature>&&>(m))
+ {
+ }
+
+ template <typename Handler>
+ void receive(Handler& handler)
+ {
+ std::visit(
+ [&](auto& message)
+ {
+ message.receive(handler);
+ }, message_);
+ }
+
+private:
+ std::variant<channel_message<Signatures>...> message_;
+};
+
+#else // defined(ASIO_HAS_STD_VARIANT)
+
+template <typename R1, typename R2>
+class channel_payload<R1(), R2(asio::error_code)>
+{
+public:
+ typedef channel_message<R1()> void_message_type;
+ typedef channel_message<R2(asio::error_code)> error_message_type;
+
+ channel_payload(void_message_type&&)
+ : message_(0, asio::error_code()),
+ empty_(true)
+ {
+ }
+
+ channel_payload(error_message_type&& m)
+ : message_(static_cast<error_message_type&&>(m)),
+ empty_(false)
+ {
+ }
+
+ template <typename Handler>
+ void receive(Handler& handler)
+ {
+ if (empty_)
+ channel_message<R1()>(0).receive(handler);
+ else
+ message_.receive(handler);
+ }
+
+private:
+ error_message_type message_;
+ bool empty_;
+};
+
+template <typename Sig1, typename Sig2>
+class channel_payload<Sig1, Sig2>
+{
+public:
+ typedef channel_message<Sig1> message_1_type;
+ typedef channel_message<Sig2> message_2_type;
+
+ channel_payload(message_1_type&& m)
+ : index_(1)
+ {
+ new (&storage_.message_1_) message_1_type(static_cast<message_1_type&&>(m));
+ }
+
+ channel_payload(message_2_type&& m)
+ : index_(2)
+ {
+ new (&storage_.message_2_) message_2_type(static_cast<message_2_type&&>(m));
+ }
+
+ channel_payload(channel_payload&& other)
+ : index_(other.index_)
+ {
+ switch (index_)
+ {
+ case 1:
+ new (&storage_.message_1_) message_1_type(
+ static_cast<message_1_type&&>(other.storage_.message_1_));
+ break;
+ case 2:
+ new (&storage_.message_2_) message_2_type(
+ static_cast<message_2_type&&>(other.storage_.message_2_));
+ break;
+ default:
+ break;
+ }
+ }
+
+ ~channel_payload()
+ {
+ switch (index_)
+ {
+ case 1:
+ storage_.message_1_.~message_1_type();
+ break;
+ case 2:
+ storage_.message_2_.~message_2_type();
+ break;
+ default:
+ break;
+ }
+ }
+
+ template <typename Handler>
+ void receive(Handler& handler)
+ {
+ switch (index_)
+ {
+ case 1:
+ storage_.message_1_.receive(handler);
+ break;
+ case 2:
+ storage_.message_2_.receive(handler);
+ break;
+ default:
+ break;
+ }
+ }
+
+private:
+ union storage
+ {
+ storage() {}
+ ~storage() {}
+
+ char dummy_;
+ message_1_type message_1_;
+ message_2_type message_2_;
+ } storage_;
+ unsigned char index_;
+};
+
+#endif // defined(ASIO_HAS_STD_VARIANT)
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_CHANNEL_PAYLOAD_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/channel_receive_op.hpp b/3rdparty/asio/include/asio/experimental/detail/channel_receive_op.hpp
new file mode 100644
index 00000000000..89d8ac2a5ab
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/channel_receive_op.hpp
@@ -0,0 +1,127 @@
+//
+// experimental/detail/channel_receive_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DETAIL_CHANNEL_RECEIVE_OP_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_CHANNEL_RECEIVE_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/handler_alloc_helpers.hpp"
+#include "asio/error.hpp"
+#include "asio/experimental/detail/channel_handler.hpp"
+#include "asio/experimental/detail/channel_operation.hpp"
+#include "asio/experimental/detail/channel_payload.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <typename Payload>
+class channel_receive : public channel_operation
+{
+public:
+ void immediate(Payload payload)
+ {
+ func_(this, immediate_op, &payload);
+ }
+
+ void post(Payload payload)
+ {
+ func_(this, post_op, &payload);
+ }
+
+ void dispatch(Payload payload)
+ {
+ func_(this, dispatch_op, &payload);
+ }
+
+protected:
+ channel_receive(func_type func)
+ : channel_operation(func)
+ {
+ }
+};
+
+template <typename Payload, typename Handler, typename IoExecutor>
+class channel_receive_op : public channel_receive<Payload>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(channel_receive_op);
+
+ template <typename... Args>
+ channel_receive_op(Handler& handler, const IoExecutor& io_ex)
+ : channel_receive<Payload>(&channel_receive_op::do_action),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_action(channel_operation* base,
+ channel_operation::action a, void* v)
+ {
+ // Take ownership of the operation object.
+ channel_receive_op* o(static_cast<channel_receive_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ channel_operation::handler_work<Handler, IoExecutor> w(
+ static_cast<channel_operation::handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ // Make a copy of the handler so that the memory can be deallocated before
+ // the handler is posted. Even if we're not about to post the handler, 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.
+ if (a != channel_operation::destroy_op)
+ {
+ Payload* payload = static_cast<Payload*>(v);
+ channel_handler<Payload, Handler> handler(
+ static_cast<Payload&&>(*payload), o->handler_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+ ASIO_HANDLER_INVOCATION_BEGIN(());
+ if (a == channel_operation::immediate_op)
+ w.immediate(handler, handler.handler_, 0);
+ else if (a == channel_operation::dispatch_op)
+ w.dispatch(handler, handler.handler_);
+ else
+ w.post(handler, handler.handler_);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+ else
+ {
+ asio::detail::binder0<Handler> handler(o->handler_);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+ }
+ }
+
+private:
+ Handler handler_;
+ channel_operation::handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_CHANNEL_RECEIVE_OP_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/channel_send_functions.hpp b/3rdparty/asio/include/asio/experimental/detail/channel_send_functions.hpp
new file mode 100644
index 00000000000..108dffec934
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/channel_send_functions.hpp
@@ -0,0 +1,192 @@
+//
+// experimental/detail/channel_send_functions.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DETAIL_CHANNEL_SEND_FUNCTIONS_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_CHANNEL_SEND_FUNCTIONS_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/error_code.hpp"
+#include "asio/experimental/detail/channel_message.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <typename Derived, typename Executor, typename... Signatures>
+class channel_send_functions;
+
+template <typename Derived, typename Executor, typename R, typename... Args>
+class channel_send_functions<Derived, Executor, R(Args...)>
+{
+public:
+ template <typename... Args2>
+ enable_if_t<
+ is_constructible<detail::channel_message<R(Args...)>, int, Args2...>::value,
+ bool
+ > try_send(Args2&&... args)
+ {
+ typedef typename detail::channel_message<R(Args...)> message_type;
+ Derived* self = static_cast<Derived*>(this);
+ return self->service_->template try_send<message_type>(
+ self->impl_, false, static_cast<Args2&&>(args)...);
+ }
+
+ template <typename... Args2>
+ enable_if_t<
+ is_constructible<detail::channel_message<R(Args...)>, int, Args2...>::value,
+ bool
+ > try_send_via_dispatch(Args2&&... args)
+ {
+ typedef typename detail::channel_message<R(Args...)> message_type;
+ Derived* self = static_cast<Derived*>(this);
+ return self->service_->template try_send<message_type>(
+ self->impl_, true, static_cast<Args2&&>(args)...);
+ }
+
+ template <typename... Args2>
+ enable_if_t<
+ is_constructible<detail::channel_message<R(Args...)>, int, Args2...>::value,
+ std::size_t
+ > try_send_n(std::size_t count, Args2&&... args)
+ {
+ typedef typename detail::channel_message<R(Args...)> message_type;
+ Derived* self = static_cast<Derived*>(this);
+ return self->service_->template try_send_n<message_type>(
+ self->impl_, count, false, static_cast<Args2&&>(args)...);
+ }
+
+ template <typename... Args2>
+ enable_if_t<
+ is_constructible<detail::channel_message<R(Args...)>, int, Args2...>::value,
+ std::size_t
+ > try_send_n_via_dispatch(std::size_t count, Args2&&... args)
+ {
+ typedef typename detail::channel_message<R(Args...)> message_type;
+ Derived* self = static_cast<Derived*>(this);
+ return self->service_->template try_send_n<message_type>(
+ self->impl_, count, true, static_cast<Args2&&>(args)...);
+ }
+
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ CompletionToken ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
+ auto async_send(Args... args,
+ CompletionToken&& token
+ ASIO_DEFAULT_COMPLETION_TOKEN(Executor))
+ -> decltype(
+ async_initiate<CompletionToken, void (asio::error_code)>(
+ declval<typename conditional_t<false, CompletionToken,
+ Derived>::initiate_async_send>(), token,
+ declval<typename conditional_t<false, CompletionToken,
+ Derived>::payload_type>()))
+ {
+ typedef typename Derived::payload_type payload_type;
+ typedef typename detail::channel_message<R(Args...)> message_type;
+ Derived* self = static_cast<Derived*>(this);
+ return async_initiate<CompletionToken, void (asio::error_code)>(
+ typename Derived::initiate_async_send(self), token,
+ payload_type(message_type(0, static_cast<Args&&>(args)...)));
+ }
+};
+
+template <typename Derived, typename Executor,
+ typename R, typename... Args, typename... Signatures>
+class channel_send_functions<Derived, Executor, R(Args...), Signatures...> :
+ public channel_send_functions<Derived, Executor, Signatures...>
+{
+public:
+ using channel_send_functions<Derived, Executor, Signatures...>::try_send;
+ using channel_send_functions<Derived, Executor, Signatures...>::async_send;
+
+ template <typename... Args2>
+ enable_if_t<
+ is_constructible<detail::channel_message<R(Args...)>, int, Args2...>::value,
+ bool
+ > try_send(Args2&&... args)
+ {
+ typedef typename detail::channel_message<R(Args...)> message_type;
+ Derived* self = static_cast<Derived*>(this);
+ return self->service_->template try_send<message_type>(
+ self->impl_, false, static_cast<Args2&&>(args)...);
+ }
+
+ template <typename... Args2>
+ enable_if_t<
+ is_constructible<detail::channel_message<R(Args...)>, int, Args2...>::value,
+ bool
+ > try_send_via_dispatch(Args2&&... args)
+ {
+ typedef typename detail::channel_message<R(Args...)> message_type;
+ Derived* self = static_cast<Derived*>(this);
+ return self->service_->template try_send<message_type>(
+ self->impl_, true, static_cast<Args2&&>(args)...);
+ }
+
+ template <typename... Args2>
+ enable_if_t<
+ is_constructible<detail::channel_message<R(Args...)>, int, Args2...>::value,
+ std::size_t
+ > try_send_n(std::size_t count, Args2&&... args)
+ {
+ typedef typename detail::channel_message<R(Args...)> message_type;
+ Derived* self = static_cast<Derived*>(this);
+ return self->service_->template try_send_n<message_type>(
+ self->impl_, count, false, static_cast<Args2&&>(args)...);
+ }
+
+ template <typename... Args2>
+ enable_if_t<
+ is_constructible<detail::channel_message<R(Args...)>, int, Args2...>::value,
+ std::size_t
+ > try_send_n_via_dispatch(std::size_t count, Args2&&... args)
+ {
+ typedef typename detail::channel_message<R(Args...)> message_type;
+ Derived* self = static_cast<Derived*>(this);
+ return self->service_->template try_send_n<message_type>(
+ self->impl_, count, true, static_cast<Args2&&>(args)...);
+ }
+
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ CompletionToken ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(Executor)>
+ auto async_send(Args... args,
+ CompletionToken&& token
+ ASIO_DEFAULT_COMPLETION_TOKEN(Executor))
+ -> decltype(
+ async_initiate<CompletionToken, void (asio::error_code)>(
+ declval<typename conditional_t<false, CompletionToken,
+ Derived>::initiate_async_send>(), token,
+ declval<typename conditional_t<false, CompletionToken,
+ Derived>::payload_type>()))
+ {
+ typedef typename Derived::payload_type payload_type;
+ typedef typename detail::channel_message<R(Args...)> message_type;
+ Derived* self = static_cast<Derived*>(this);
+ return async_initiate<CompletionToken, void (asio::error_code)>(
+ typename Derived::initiate_async_send(self), token,
+ payload_type(message_type(0, static_cast<Args&&>(args)...)));
+ }
+};
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_CHANNEL_SEND_FUNCTIONS_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/channel_send_op.hpp b/3rdparty/asio/include/asio/experimental/detail/channel_send_op.hpp
new file mode 100644
index 00000000000..4326c23253e
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/channel_send_op.hpp
@@ -0,0 +1,148 @@
+//
+// experimental/detail/channel_send_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DETAIL_CHANNEL_SEND_OP_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_CHANNEL_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/handler_alloc_helpers.hpp"
+#include "asio/error.hpp"
+#include "asio/experimental/channel_error.hpp"
+#include "asio/experimental/detail/channel_operation.hpp"
+#include "asio/experimental/detail/channel_payload.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <typename Payload>
+class channel_send : public channel_operation
+{
+public:
+ Payload get_payload()
+ {
+ return static_cast<Payload&&>(payload_);
+ }
+
+ void immediate()
+ {
+ func_(this, immediate_op, 0);
+ }
+
+ void post()
+ {
+ func_(this, post_op, 0);
+ }
+
+ void cancel()
+ {
+ func_(this, cancel_op, 0);
+ }
+
+ void close()
+ {
+ func_(this, close_op, 0);
+ }
+
+protected:
+ channel_send(func_type func, Payload&& payload)
+ : channel_operation(func),
+ payload_(static_cast<Payload&&>(payload))
+ {
+ }
+
+private:
+ Payload payload_;
+};
+
+template <typename Payload, typename Handler, typename IoExecutor>
+class channel_send_op : public channel_send<Payload>
+{
+public:
+ ASIO_DEFINE_HANDLER_PTR(channel_send_op);
+
+ channel_send_op(Payload&& payload,
+ Handler& handler, const IoExecutor& io_ex)
+ : channel_send<Payload>(&channel_send_op::do_action,
+ static_cast<Payload&&>(payload)),
+ handler_(static_cast<Handler&&>(handler)),
+ work_(handler_, io_ex)
+ {
+ }
+
+ static void do_action(channel_operation* base,
+ channel_operation::action a, void*)
+ {
+ // Take ownership of the operation object.
+ channel_send_op* o(static_cast<channel_send_op*>(base));
+ ptr p = { asio::detail::addressof(o->handler_), o, o };
+
+ ASIO_HANDLER_COMPLETION((*o));
+
+ // Take ownership of the operation's outstanding work.
+ channel_operation::handler_work<Handler, IoExecutor> w(
+ static_cast<channel_operation::handler_work<Handler, IoExecutor>&&>(
+ o->work_));
+
+ asio::error_code ec;
+ switch (a)
+ {
+ case channel_operation::cancel_op:
+ ec = error::channel_cancelled;
+ break;
+ case channel_operation::close_op:
+ ec = error::channel_closed;
+ break;
+ default:
+ break;
+ }
+
+ // Make a copy of the handler so that the memory can be deallocated before
+ // the handler is posted. Even if we're not about to post the handler, 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.
+ asio::detail::binder1<Handler, asio::error_code>
+ handler(o->handler_, ec);
+ p.h = asio::detail::addressof(handler.handler_);
+ p.reset();
+
+ // Post the completion if required.
+ if (a != channel_operation::destroy_op)
+ {
+ ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_));
+ if (a == channel_operation::immediate_op)
+ w.immediate(handler, handler.handler_, 0);
+ else
+ w.post(handler, handler.handler_);
+ ASIO_HANDLER_INVOCATION_END;
+ }
+ }
+
+private:
+ Handler handler_;
+ channel_operation::handler_work<Handler, IoExecutor> work_;
+};
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_CHANNEL_SEND_OP_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/channel_service.hpp b/3rdparty/asio/include/asio/experimental/detail/channel_service.hpp
new file mode 100644
index 00000000000..12324414613
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/channel_service.hpp
@@ -0,0 +1,677 @@
+//
+// experimental/detail/channel_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DETAIL_CHANNEL_SERVICE_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_CHANNEL_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/associated_cancellation_slot.hpp"
+#include "asio/cancellation_type.hpp"
+#include "asio/detail/mutex.hpp"
+#include "asio/detail/op_queue.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/experimental/detail/channel_message.hpp"
+#include "asio/experimental/detail/channel_receive_op.hpp"
+#include "asio/experimental/detail/channel_send_op.hpp"
+#include "asio/experimental/detail/has_signature.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <typename Mutex>
+class channel_service
+ : public asio::detail::execution_context_service_base<
+ channel_service<Mutex>>
+{
+public:
+ // Possible states for a channel end.
+ enum state
+ {
+ buffer = 0,
+ waiter = 1,
+ block = 2,
+ closed = 3
+ };
+
+ // The base implementation type of all channels.
+ struct base_implementation_type
+ {
+ // Default constructor.
+ base_implementation_type()
+ : receive_state_(block),
+ send_state_(block),
+ max_buffer_size_(0),
+ next_(0),
+ prev_(0)
+ {
+ }
+
+ // The current state of the channel.
+ state receive_state_ : 16;
+ state send_state_ : 16;
+
+ // The maximum number of elements that may be buffered in the channel.
+ std::size_t max_buffer_size_;
+
+ // The operations that are waiting on the channel.
+ asio::detail::op_queue<channel_operation> waiters_;
+
+ // Pointers to adjacent channel implementations in linked list.
+ base_implementation_type* next_;
+ base_implementation_type* prev_;
+
+ // The mutex type to protect the internal implementation.
+ mutable Mutex mutex_;
+ };
+
+ // The implementation for a specific value type.
+ template <typename Traits, typename... Signatures>
+ struct implementation_type;
+
+ // Constructor.
+ channel_service(asio::execution_context& ctx);
+
+ // Destroy all user-defined handler objects owned by the service.
+ void shutdown();
+
+ // Construct a new channel implementation.
+ void construct(base_implementation_type& impl, std::size_t max_buffer_size);
+
+ // Destroy a channel implementation.
+ template <typename Traits, typename... Signatures>
+ void destroy(implementation_type<Traits, Signatures...>& impl);
+
+ // Move-construct a new channel implementation.
+ template <typename Traits, typename... Signatures>
+ void move_construct(implementation_type<Traits, Signatures...>& impl,
+ implementation_type<Traits, Signatures...>& other_impl);
+
+ // Move-assign from another channel implementation.
+ template <typename Traits, typename... Signatures>
+ void move_assign(implementation_type<Traits, Signatures...>& impl,
+ channel_service& other_service,
+ implementation_type<Traits, Signatures...>& other_impl);
+
+ // Get the capacity of the channel.
+ std::size_t capacity(
+ const base_implementation_type& impl) const noexcept;
+
+ // Determine whether the channel is open.
+ bool is_open(const base_implementation_type& impl) const noexcept;
+
+ // Reset the channel to its initial state.
+ template <typename Traits, typename... Signatures>
+ void reset(implementation_type<Traits, Signatures...>& impl);
+
+ // Close the channel.
+ template <typename Traits, typename... Signatures>
+ void close(implementation_type<Traits, Signatures...>& impl);
+
+ // Cancel all operations associated with the channel.
+ template <typename Traits, typename... Signatures>
+ void cancel(implementation_type<Traits, Signatures...>& impl);
+
+ // Cancel the operation associated with the channel that has the given key.
+ template <typename Traits, typename... Signatures>
+ void cancel_by_key(implementation_type<Traits, Signatures...>& impl,
+ void* cancellation_key);
+
+ // Determine whether a value can be read from the channel without blocking.
+ bool ready(const base_implementation_type& impl) const noexcept;
+
+ // Synchronously send a new value into the channel.
+ template <typename Message, typename Traits,
+ typename... Signatures, typename... Args>
+ bool try_send(implementation_type<Traits, Signatures...>& impl,
+ bool via_dispatch, Args&&... args);
+
+ // Synchronously send a number of new values into the channel.
+ template <typename Message, typename Traits,
+ typename... Signatures, typename... Args>
+ std::size_t try_send_n(implementation_type<Traits, Signatures...>& impl,
+ std::size_t count, bool via_dispatch, Args&&... args);
+
+ // Asynchronously send a new value into the channel.
+ template <typename Traits, typename... Signatures,
+ typename Handler, typename IoExecutor>
+ void async_send(implementation_type<Traits, Signatures...>& impl,
+ typename implementation_type<Traits,
+ Signatures...>::payload_type&& payload,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef channel_send_op<
+ typename implementation_type<Traits, Signatures...>::payload_type,
+ Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(static_cast<typename implementation_type<
+ Traits, Signatures...>::payload_type&&>(payload), handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<op_cancellation<Traits, Signatures...>>(
+ this, &impl);
+ }
+
+ ASIO_HANDLER_CREATION((this->context(), *p.p,
+ "channel", &impl, 0, "async_send"));
+
+ start_send_op(impl, p.p);
+ p.v = p.p = 0;
+ }
+
+ // Synchronously receive a value from the channel.
+ template <typename Traits, typename... Signatures, typename Handler>
+ bool try_receive(implementation_type<Traits, Signatures...>& impl,
+ Handler&& handler);
+
+ // Asynchronously receive a value from the channel.
+ template <typename Traits, typename... Signatures,
+ typename Handler, typename IoExecutor>
+ void async_receive(implementation_type<Traits, Signatures...>& impl,
+ Handler& handler, const IoExecutor& io_ex)
+ {
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef channel_receive_op<
+ typename implementation_type<Traits, Signatures...>::payload_type,
+ Handler, IoExecutor> op;
+ typename op::ptr p = { asio::detail::addressof(handler),
+ op::ptr::allocate(handler), 0 };
+ p.p = new (p.v) op(handler, io_ex);
+
+ // Optionally register for per-operation cancellation.
+ if (slot.is_connected())
+ {
+ p.p->cancellation_key_ =
+ &slot.template emplace<op_cancellation<Traits, Signatures...>>(
+ this, &impl);
+ }
+
+ ASIO_HANDLER_CREATION((this->context(), *p.p,
+ "channel", &impl, 0, "async_receive"));
+
+ start_receive_op(impl, p.p);
+ p.v = p.p = 0;
+ }
+
+private:
+ // Helper function object to handle a closed notification.
+ template <typename Payload, typename Signature>
+ struct post_receive
+ {
+ explicit post_receive(channel_receive<Payload>* op)
+ : op_(op)
+ {
+ }
+
+ template <typename... Args>
+ void operator()(Args&&... args)
+ {
+ op_->post(
+ channel_message<Signature>(0,
+ static_cast<Args&&>(args)...));
+ }
+
+ channel_receive<Payload>* op_;
+ };
+
+ // Destroy a base channel implementation.
+ void base_destroy(base_implementation_type& impl);
+
+ // Helper function to start an asynchronous put operation.
+ template <typename Traits, typename... Signatures>
+ void start_send_op(implementation_type<Traits, Signatures...>& impl,
+ channel_send<typename implementation_type<
+ Traits, Signatures...>::payload_type>* send_op);
+
+ // Helper function to start an asynchronous get operation.
+ template <typename Traits, typename... Signatures>
+ void start_receive_op(implementation_type<Traits, Signatures...>& impl,
+ channel_receive<typename implementation_type<
+ Traits, Signatures...>::payload_type>* receive_op);
+
+ // Helper class used to implement per-operation cancellation.
+ template <typename Traits, typename... Signatures>
+ class op_cancellation
+ {
+ public:
+ op_cancellation(channel_service* s,
+ implementation_type<Traits, Signatures...>* impl)
+ : service_(s),
+ impl_(impl)
+ {
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ if (!!(type &
+ (cancellation_type::terminal
+ | cancellation_type::partial
+ | cancellation_type::total)))
+ {
+ service_->cancel_by_key(*impl_, this);
+ }
+ }
+
+ private:
+ channel_service* service_;
+ implementation_type<Traits, Signatures...>* impl_;
+ };
+
+ // 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_;
+};
+
+// The implementation for a specific value type.
+template <typename Mutex>
+template <typename Traits, typename... Signatures>
+struct channel_service<Mutex>::implementation_type : base_implementation_type
+{
+ // The traits type associated with the channel.
+ typedef typename Traits::template rebind<Signatures...>::other traits_type;
+
+ // Type of an element stored in the buffer.
+ typedef conditional_t<
+ has_signature<
+ typename traits_type::receive_cancelled_signature,
+ Signatures...
+ >::value,
+ conditional_t<
+ has_signature<
+ typename traits_type::receive_closed_signature,
+ Signatures...
+ >::value,
+ channel_payload<Signatures...>,
+ channel_payload<
+ Signatures...,
+ typename traits_type::receive_closed_signature
+ >
+ >,
+ conditional_t<
+ has_signature<
+ typename traits_type::receive_closed_signature,
+ Signatures...,
+ typename traits_type::receive_cancelled_signature
+ >::value,
+ channel_payload<
+ Signatures...,
+ typename traits_type::receive_cancelled_signature
+ >,
+ channel_payload<
+ Signatures...,
+ typename traits_type::receive_cancelled_signature,
+ typename traits_type::receive_closed_signature
+ >
+ >
+ > payload_type;
+
+ // Move from another buffer.
+ void buffer_move_from(implementation_type& other)
+ {
+ buffer_ = static_cast<
+ typename traits_type::template container<payload_type>::type&&>(
+ other.buffer_);
+ other.buffer_clear();
+ }
+
+ // Get number of buffered elements.
+ std::size_t buffer_size() const
+ {
+ return buffer_.size();
+ }
+
+ // Push a new value to the back of the buffer.
+ void buffer_push(payload_type payload)
+ {
+ buffer_.push_back(static_cast<payload_type&&>(payload));
+ }
+
+ // Push new values to the back of the buffer.
+ std::size_t buffer_push_n(std::size_t count, payload_type payload)
+ {
+ std::size_t i = 0;
+ for (; i < count && buffer_.size() < this->max_buffer_size_; ++i)
+ buffer_.push_back(payload);
+ return i;
+ }
+
+ // Get the element at the front of the buffer.
+ payload_type buffer_front()
+ {
+ return static_cast<payload_type&&>(buffer_.front());
+ }
+
+ // Pop a value from the front of the buffer.
+ void buffer_pop()
+ {
+ buffer_.pop_front();
+ }
+
+ // Clear all buffered values.
+ void buffer_clear()
+ {
+ buffer_.clear();
+ }
+
+private:
+ // Buffered values.
+ typename traits_type::template container<payload_type>::type buffer_;
+};
+
+// The implementation for a void value type.
+template <typename Mutex>
+template <typename Traits, typename R>
+struct channel_service<Mutex>::implementation_type<Traits, R()>
+ : channel_service::base_implementation_type
+{
+ // The traits type associated with the channel.
+ typedef typename Traits::template rebind<R()>::other traits_type;
+
+ // Type of an element stored in the buffer.
+ typedef conditional_t<
+ has_signature<
+ typename traits_type::receive_cancelled_signature,
+ R()
+ >::value,
+ conditional_t<
+ has_signature<
+ typename traits_type::receive_closed_signature,
+ R()
+ >::value,
+ channel_payload<R()>,
+ channel_payload<
+ R(),
+ typename traits_type::receive_closed_signature
+ >
+ >,
+ conditional_t<
+ has_signature<
+ typename traits_type::receive_closed_signature,
+ R(),
+ typename traits_type::receive_cancelled_signature
+ >::value,
+ channel_payload<
+ R(),
+ typename traits_type::receive_cancelled_signature
+ >,
+ channel_payload<
+ R(),
+ typename traits_type::receive_cancelled_signature,
+ typename traits_type::receive_closed_signature
+ >
+ >
+ > payload_type;
+
+ // Construct with empty buffer.
+ implementation_type()
+ : buffer_(0)
+ {
+ }
+
+ // Move from another buffer.
+ void buffer_move_from(implementation_type& other)
+ {
+ buffer_ = other.buffer_;
+ other.buffer_ = 0;
+ }
+
+ // Get number of buffered elements.
+ std::size_t buffer_size() const
+ {
+ return buffer_;
+ }
+
+ // Push a new value to the back of the buffer.
+ void buffer_push(payload_type)
+ {
+ ++buffer_;
+ }
+
+ // Push new values to the back of the buffer.
+ std::size_t buffer_push_n(std::size_t count, payload_type)
+ {
+ std::size_t available = this->max_buffer_size_ - buffer_;
+ count = (count < available) ? count : available;
+ buffer_ += count;
+ return count;
+ }
+
+ // Get the element at the front of the buffer.
+ payload_type buffer_front()
+ {
+ return payload_type(channel_message<R()>(0));
+ }
+
+ // Pop a value from the front of the buffer.
+ void buffer_pop()
+ {
+ --buffer_;
+ }
+
+ // Clear all values from the buffer.
+ void buffer_clear()
+ {
+ buffer_ = 0;
+ }
+
+private:
+ // Number of buffered "values".
+ std::size_t buffer_;
+};
+
+// The implementation for an error_code signature.
+template <typename Mutex>
+template <typename Traits, typename R>
+struct channel_service<Mutex>::implementation_type<
+ Traits, R(asio::error_code)>
+ : channel_service::base_implementation_type
+{
+ // The traits type associated with the channel.
+ typedef typename Traits::template rebind<R(asio::error_code)>::other
+ traits_type;
+
+ // Type of an element stored in the buffer.
+ typedef conditional_t<
+ has_signature<
+ typename traits_type::receive_cancelled_signature,
+ R(asio::error_code)
+ >::value,
+ conditional_t<
+ has_signature<
+ typename traits_type::receive_closed_signature,
+ R(asio::error_code)
+ >::value,
+ channel_payload<R(asio::error_code)>,
+ channel_payload<
+ R(asio::error_code),
+ typename traits_type::receive_closed_signature
+ >
+ >,
+ conditional_t<
+ has_signature<
+ typename traits_type::receive_closed_signature,
+ R(asio::error_code),
+ typename traits_type::receive_cancelled_signature
+ >::value,
+ channel_payload<
+ R(asio::error_code),
+ typename traits_type::receive_cancelled_signature
+ >,
+ channel_payload<
+ R(asio::error_code),
+ typename traits_type::receive_cancelled_signature,
+ typename traits_type::receive_closed_signature
+ >
+ >
+ > payload_type;
+
+ // Construct with empty buffer.
+ implementation_type()
+ : size_(0)
+ {
+ first_.count_ = 0;
+ }
+
+ // Move from another buffer.
+ void buffer_move_from(implementation_type& other)
+ {
+ size_ = other.buffer_;
+ other.size_ = 0;
+ first_ = other.first_;
+ other.first.count_ = 0;
+ rest_ = static_cast<
+ typename traits_type::template container<buffered_value>::type&&>(
+ other.rest_);
+ other.buffer_clear();
+ }
+
+ // Get number of buffered elements.
+ std::size_t buffer_size() const
+ {
+ return size_;
+ }
+
+ // Push a new value to the back of the buffer.
+ void buffer_push(payload_type payload)
+ {
+ buffered_value& last = rest_.empty() ? first_ : rest_.back();
+ if (last.count_ == 0)
+ {
+ value_handler handler{last.value_};
+ payload.receive(handler);
+ last.count_ = 1;
+ }
+ else
+ {
+ asio::error_code value{last.value_};
+ value_handler handler{value};
+ payload.receive(handler);
+ if (last.value_ == value)
+ ++last.count_;
+ else
+ rest_.push_back({value, 1});
+ }
+ ++size_;
+ }
+
+ // Push new values to the back of the buffer.
+ std::size_t buffer_push_n(std::size_t count, payload_type payload)
+ {
+ std::size_t available = this->max_buffer_size_ - size_;
+ count = (count < available) ? count : available;
+ if (count > 0)
+ {
+ buffered_value& last = rest_.empty() ? first_ : rest_.back();
+ if (last.count_ == 0)
+ {
+ payload.receive(value_handler{last.value_});
+ last.count_ = count;
+ }
+ else
+ {
+ asio::error_code value{last.value_};
+ payload.receive(value_handler{value});
+ if (last.value_ == value)
+ last.count_ += count;
+ else
+ rest_.push_back({value, count});
+ }
+ size_ += count;
+ }
+ return count;
+ }
+
+ // Get the element at the front of the buffer.
+ payload_type buffer_front()
+ {
+ return payload_type({0, first_.value_});
+ }
+
+ // Pop a value from the front of the buffer.
+ void buffer_pop()
+ {
+ --size_;
+ if (--first_.count_ == 0 && !rest_.empty())
+ {
+ first_ = rest_.front();
+ rest_.pop_front();
+ }
+ }
+
+ // Clear all values from the buffer.
+ void buffer_clear()
+ {
+ size_ = 0;
+ first_.count_ == 0;
+ rest_.clear();
+ }
+
+private:
+ struct buffered_value
+ {
+ asio::error_code value_;
+ std::size_t count_;
+ };
+
+ struct value_handler
+ {
+ asio::error_code& target_;
+
+ template <typename... Args>
+ void operator()(const asio::error_code& value, Args&&...)
+ {
+ target_ = value;
+ }
+ };
+
+ buffered_value& last_value()
+ {
+ return rest_.empty() ? first_ : rest_.back();
+ }
+
+ // Total number of buffered values.
+ std::size_t size_;
+
+ // The first buffered value is maintained as a separate data member to avoid
+ // allocating space in the container in the common case.
+ buffered_value first_;
+
+ // The rest of the buffered values.
+ typename traits_type::template container<buffered_value>::type rest_;
+};
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/experimental/detail/impl/channel_service.hpp"
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_CHANNEL_SERVICE_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/coro_completion_handler.hpp b/3rdparty/asio/include/asio/experimental/detail/coro_completion_handler.hpp
new file mode 100644
index 00000000000..52809134cb0
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/coro_completion_handler.hpp
@@ -0,0 +1,169 @@
+//
+// experimental/detail/coro_completion_handler.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_DETAIL_CORO_COMPLETION_HANDLER_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_CORO_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/deferred.hpp"
+#include "asio/experimental/coro.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <typename Promise, typename... Args>
+struct coro_completion_handler
+{
+ coro_completion_handler(coroutine_handle<Promise> h,
+ std::optional<std::tuple<Args...>>& result)
+ : self(h),
+ result(result)
+ {
+ }
+
+ coro_completion_handler(coro_completion_handler&&) = default;
+
+ coroutine_handle<Promise> self;
+
+ std::optional<std::tuple<Args...>>& result;
+
+ using promise_type = Promise;
+
+ void operator()(Args... args)
+ {
+ result.emplace(std::move(args)...);
+ self.resume();
+ }
+
+ using allocator_type = typename promise_type::allocator_type;
+ allocator_type get_allocator() const noexcept
+ {
+ return self.promise().get_allocator();
+ }
+
+ using executor_type = typename promise_type::executor_type;
+ executor_type get_executor() const noexcept
+ {
+ return self.promise().get_executor();
+ }
+
+ using cancellation_slot_type = typename promise_type::cancellation_slot_type;
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return self.promise().get_cancellation_slot();
+ }
+};
+
+template <typename Signature>
+struct coro_completion_handler_type;
+
+template <typename... Args>
+struct coro_completion_handler_type<void(Args...)>
+{
+ using type = std::tuple<Args...>;
+
+ template <typename Promise>
+ using completion_handler = coro_completion_handler<Promise, Args...>;
+};
+
+template <typename Signature>
+using coro_completion_handler_type_t =
+ typename coro_completion_handler_type<Signature>::type;
+
+inline void coro_interpret_result(std::tuple<>&&)
+{
+}
+
+template <typename... Args>
+inline auto coro_interpret_result(std::tuple<Args...>&& args)
+{
+ return std::move(args);
+}
+
+template <typename... Args>
+auto coro_interpret_result(std::tuple<std::exception_ptr, Args...>&& args)
+{
+ if (std::get<0>(args))
+ std::rethrow_exception(std::get<0>(args));
+
+ return std::apply(
+ [](auto, auto&&... rest)
+ {
+ return std::make_tuple(std::move(rest)...);
+ }, std::move(args));
+}
+
+template <typename... Args>
+auto coro_interpret_result(
+ std::tuple<asio::error_code, Args...>&& args)
+{
+ if (std::get<0>(args))
+ asio::detail::throw_exception(
+ asio::system_error(std::get<0>(args)));
+
+ return std::apply(
+ [](auto, auto&&... rest)
+ {
+ return std::make_tuple(std::move(rest)...);
+ }, std::move(args));
+}
+
+template <typename Arg>
+inline auto coro_interpret_result(std::tuple<Arg>&& args)
+{
+ return std::get<0>(std::move(args));
+}
+
+template <typename Arg>
+auto coro_interpret_result(std::tuple<std::exception_ptr, Arg>&& args)
+{
+ if (std::get<0>(args))
+ std::rethrow_exception(std::get<0>(args));
+ return std::get<1>(std::move(args));
+}
+
+inline auto coro_interpret_result(
+ std::tuple<asio::error_code>&& args)
+{
+ if (std::get<0>(args))
+ asio::detail::throw_exception(
+ asio::system_error(std::get<0>(args)));
+}
+
+inline auto coro_interpret_result(std::tuple<std::exception_ptr>&& args)
+{
+ if (std::get<0>(args))
+ std::rethrow_exception(std::get<0>(args));
+}
+
+template <typename Arg>
+auto coro_interpret_result(std::tuple<asio::error_code, Arg>&& args)
+{
+ if (std::get<0>(args))
+ asio::detail::throw_exception(
+ asio::system_error(std::get<0>(args)));
+ return std::get<1>(std::move(args));
+}
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_CORO_COMPLETION_HANDLER_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/coro_promise_allocator.hpp b/3rdparty/asio/include/asio/experimental/detail/coro_promise_allocator.hpp
new file mode 100644
index 00000000000..328646968f3
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/coro_promise_allocator.hpp
@@ -0,0 +1,141 @@
+//
+// experimental/detail/coro_promise_allocator.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_DETAIL_CORO_PROMISE_ALLOCATOR_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_CORO_PROMISE_ALLOCATOR_HPP
+
+#include "asio/detail/config.hpp"
+#include "asio/experimental/coro_traits.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+/// Allocate the memory and put the allocator behind the coro memory
+template <typename AllocatorType>
+void* allocate_coroutine(const std::size_t size, AllocatorType alloc_)
+{
+ using alloc_type = typename std::allocator_traits<AllocatorType>::template
+ rebind_alloc<unsigned char>;
+ alloc_type alloc{alloc_};
+
+ const auto align_needed = size % alignof(alloc_type);
+ const auto align_offset = align_needed != 0
+ ? alignof(alloc_type) - align_needed : 0ull;
+ const auto alloc_size = size + sizeof(alloc_type) + align_offset;
+ const auto raw =
+ std::allocator_traits<alloc_type>::allocate(alloc, alloc_size);
+ new(raw + size + align_offset) alloc_type(std::move(alloc));
+
+ return raw;
+}
+
+/// Deallocate the memory and destroy the allocator in the coro memory.
+template <typename AllocatorType>
+void deallocate_coroutine(void* raw_, const std::size_t size)
+{
+ using alloc_type = typename std::allocator_traits<AllocatorType>::template
+ rebind_alloc<unsigned char>;
+
+ const auto raw = static_cast<unsigned char *>(raw_);
+
+ const auto align_needed = size % alignof(alloc_type);
+ const auto align_offset = align_needed != 0
+ ? alignof(alloc_type) - align_needed : 0ull;
+ const auto alloc_size = size + sizeof(alloc_type) + align_offset;
+
+ auto alloc_p = reinterpret_cast<alloc_type *>(raw + size + align_offset);
+ auto alloc = std::move(*alloc_p);
+ alloc_p->~alloc_type();
+ std::allocator_traits<alloc_type>::deallocate(alloc, raw, alloc_size);
+}
+
+template <typename T>
+constexpr std::size_t variadic_first(std::size_t = 0u)
+{
+ return std::numeric_limits<std::size_t>::max();
+}
+
+
+template <typename T, typename First, typename... Args>
+constexpr std::size_t variadic_first(std::size_t pos = 0u)
+{
+ if constexpr (std::is_same_v<std::decay_t<First>, T>)
+ return pos;
+ else
+ return variadic_first<T, Args...>(pos+1);
+}
+
+template <std::size_t Idx, typename First, typename... Args>
+ requires (Idx <= sizeof...(Args))
+constexpr decltype(auto) get_variadic(First&& first, Args&&... args)
+{
+ if constexpr (Idx == 0u)
+ return static_cast<First>(first);
+ else
+ return get_variadic<Idx-1u>(static_cast<Args>(args)...);
+}
+
+template <std::size_t Idx>
+constexpr decltype(auto) get_variadic();
+
+template <typename Allocator>
+struct coro_promise_allocator
+{
+ using allocator_type = Allocator;
+ allocator_type get_allocator() const {return alloc_;}
+
+ template <typename... Args>
+ void* operator new(const std::size_t size, Args & ... args)
+ {
+ return allocate_coroutine(size,
+ get_variadic<variadic_first<std::allocator_arg_t,
+ std::decay_t<Args>...>() + 1u>(args...));
+ }
+
+ void operator delete(void* raw, const std::size_t size)
+ {
+ deallocate_coroutine<allocator_type>(raw, size);
+ }
+
+ template <typename... Args>
+ coro_promise_allocator(Args&& ... args)
+ : alloc_(
+ get_variadic<variadic_first<std::allocator_arg_t,
+ std::decay_t<Args>...>() + 1u>(args...))
+ {
+ }
+
+private:
+ allocator_type alloc_;
+};
+
+template <>
+struct coro_promise_allocator<std::allocator<void>>
+{
+ using allocator_type = std::allocator<void>;
+
+ template <typename... Args>
+ coro_promise_allocator(Args&&...)
+ {
+ }
+
+ allocator_type get_allocator() const
+ {
+ return {};
+ }
+};
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_CORO_PROMISE_ALLOCATOR_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/has_signature.hpp b/3rdparty/asio/include/asio/experimental/detail/has_signature.hpp
new file mode 100644
index 00000000000..ea5dac8c69b
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/has_signature.hpp
@@ -0,0 +1,54 @@
+//
+// experimental/detail/has_signature.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DETAIL_HAS_SIGNATURE_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_HAS_SIGNATURE_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 experimental {
+namespace detail {
+
+template <typename S, typename... Signatures>
+struct has_signature;
+
+template <typename S, typename... Signatures>
+struct has_signature;
+
+template <typename S>
+struct has_signature<S> : false_type
+{
+};
+
+template <typename S, typename... Signatures>
+struct has_signature<S, S, Signatures...> : true_type
+{
+};
+
+template <typename S, typename Head, typename... Tail>
+struct has_signature<S, Head, Tail...> : has_signature<S, Tail...>
+{
+};
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_HAS_SIGNATURE_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/impl/channel_service.hpp b/3rdparty/asio/include/asio/experimental/detail/impl/channel_service.hpp
new file mode 100644
index 00000000000..797c9f433c7
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/impl/channel_service.hpp
@@ -0,0 +1,621 @@
+//
+// experimental/detail/impl/channel_service.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DETAIL_IMPL_CHANNEL_SERVICE_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_IMPL_CHANNEL_SERVICE_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 experimental {
+namespace detail {
+
+template <typename Mutex>
+inline channel_service<Mutex>::channel_service(
+ asio::execution_context& ctx)
+ : asio::detail::execution_context_service_base<channel_service>(ctx),
+ mutex_(),
+ impl_list_(0)
+{
+}
+
+template <typename Mutex>
+inline void channel_service<Mutex>::shutdown()
+{
+ // Abandon all pending operations.
+ asio::detail::op_queue<channel_operation> ops;
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ base_implementation_type* impl = impl_list_;
+ while (impl)
+ {
+ ops.push(impl->waiters_);
+ impl = impl->next_;
+ }
+}
+
+template <typename Mutex>
+inline void channel_service<Mutex>::construct(
+ channel_service<Mutex>::base_implementation_type& impl,
+ std::size_t max_buffer_size)
+{
+ impl.max_buffer_size_ = max_buffer_size;
+ impl.receive_state_ = block;
+ impl.send_state_ = max_buffer_size ? buffer : block;
+
+ // 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;
+}
+
+template <typename Mutex>
+template <typename Traits, typename... Signatures>
+void channel_service<Mutex>::destroy(
+ channel_service<Mutex>::implementation_type<Traits, Signatures...>& impl)
+{
+ cancel(impl);
+ base_destroy(impl);
+}
+
+template <typename Mutex>
+template <typename Traits, typename... Signatures>
+void channel_service<Mutex>::move_construct(
+ channel_service<Mutex>::implementation_type<Traits, Signatures...>& impl,
+ channel_service<Mutex>::implementation_type<
+ Traits, Signatures...>& other_impl)
+{
+ impl.max_buffer_size_ = other_impl.max_buffer_size_;
+ impl.receive_state_ = other_impl.receive_state_;
+ other_impl.receive_state_ = block;
+ impl.send_state_ = other_impl.send_state_;
+ other_impl.send_state_ = other_impl.max_buffer_size_ ? buffer : block;
+ impl.buffer_move_from(other_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;
+}
+
+template <typename Mutex>
+template <typename Traits, typename... Signatures>
+void channel_service<Mutex>::move_assign(
+ channel_service<Mutex>::implementation_type<Traits, Signatures...>& impl,
+ channel_service& other_service,
+ channel_service<Mutex>::implementation_type<
+ Traits, Signatures...>& other_impl)
+{
+ cancel(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.max_buffer_size_ = other_impl.max_buffer_size_;
+ impl.receive_state_ = other_impl.receive_state_;
+ other_impl.receive_state_ = block;
+ impl.send_state_ = other_impl.send_state_;
+ other_impl.send_state_ = other_impl.max_buffer_size_ ? buffer : block;
+ impl.buffer_move_from(other_impl);
+
+ 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;
+ }
+}
+
+template <typename Mutex>
+inline void channel_service<Mutex>::base_destroy(
+ channel_service<Mutex>::base_implementation_type& 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;
+}
+
+template <typename Mutex>
+inline std::size_t channel_service<Mutex>::capacity(
+ const channel_service<Mutex>::base_implementation_type& impl)
+ const noexcept
+{
+ typename Mutex::scoped_lock lock(impl.mutex_);
+
+ return impl.max_buffer_size_;
+}
+
+template <typename Mutex>
+inline bool channel_service<Mutex>::is_open(
+ const channel_service<Mutex>::base_implementation_type& impl)
+ const noexcept
+{
+ typename Mutex::scoped_lock lock(impl.mutex_);
+
+ return impl.send_state_ != closed;
+}
+
+template <typename Mutex>
+template <typename Traits, typename... Signatures>
+void channel_service<Mutex>::reset(
+ channel_service<Mutex>::implementation_type<Traits, Signatures...>& impl)
+{
+ cancel(impl);
+
+ typename Mutex::scoped_lock lock(impl.mutex_);
+
+ impl.receive_state_ = block;
+ impl.send_state_ = impl.max_buffer_size_ ? buffer : block;
+ impl.buffer_clear();
+}
+
+template <typename Mutex>
+template <typename Traits, typename... Signatures>
+void channel_service<Mutex>::close(
+ channel_service<Mutex>::implementation_type<Traits, Signatures...>& impl)
+{
+ typedef typename implementation_type<Traits,
+ Signatures...>::traits_type traits_type;
+ typedef typename implementation_type<Traits,
+ Signatures...>::payload_type payload_type;
+
+ typename Mutex::scoped_lock lock(impl.mutex_);
+
+ if (impl.receive_state_ == block)
+ {
+ while (channel_operation* op = impl.waiters_.front())
+ {
+ impl.waiters_.pop();
+ traits_type::invoke_receive_closed(
+ post_receive<payload_type,
+ typename traits_type::receive_closed_signature>(
+ static_cast<channel_receive<payload_type>*>(op)));
+ }
+ }
+
+ impl.send_state_ = closed;
+ if (impl.receive_state_ != buffer)
+ impl.receive_state_ = closed;
+}
+
+template <typename Mutex>
+template <typename Traits, typename... Signatures>
+void channel_service<Mutex>::cancel(
+ channel_service<Mutex>::implementation_type<Traits, Signatures...>& impl)
+{
+ typedef typename implementation_type<Traits,
+ Signatures...>::traits_type traits_type;
+ typedef typename implementation_type<Traits,
+ Signatures...>::payload_type payload_type;
+
+ typename Mutex::scoped_lock lock(impl.mutex_);
+
+ while (channel_operation* op = impl.waiters_.front())
+ {
+ if (impl.send_state_ == block)
+ {
+ impl.waiters_.pop();
+ static_cast<channel_send<payload_type>*>(op)->cancel();
+ }
+ else
+ {
+ impl.waiters_.pop();
+ traits_type::invoke_receive_cancelled(
+ post_receive<payload_type,
+ typename traits_type::receive_cancelled_signature>(
+ static_cast<channel_receive<payload_type>*>(op)));
+ }
+ }
+
+ if (impl.receive_state_ == waiter)
+ impl.receive_state_ = block;
+ if (impl.send_state_ == waiter)
+ impl.send_state_ = impl.max_buffer_size_ ? buffer : block;
+}
+
+template <typename Mutex>
+template <typename Traits, typename... Signatures>
+void channel_service<Mutex>::cancel_by_key(
+ channel_service<Mutex>::implementation_type<Traits, Signatures...>& impl,
+ void* cancellation_key)
+{
+ typedef typename implementation_type<Traits,
+ Signatures...>::traits_type traits_type;
+ typedef typename implementation_type<Traits,
+ Signatures...>::payload_type payload_type;
+
+ typename Mutex::scoped_lock lock(impl.mutex_);
+
+ asio::detail::op_queue<channel_operation> other_ops;
+ while (channel_operation* op = impl.waiters_.front())
+ {
+ if (op->cancellation_key_ == cancellation_key)
+ {
+ if (impl.send_state_ == block)
+ {
+ impl.waiters_.pop();
+ static_cast<channel_send<payload_type>*>(op)->cancel();
+ }
+ else
+ {
+ impl.waiters_.pop();
+ traits_type::invoke_receive_cancelled(
+ post_receive<payload_type,
+ typename traits_type::receive_cancelled_signature>(
+ static_cast<channel_receive<payload_type>*>(op)));
+ }
+ }
+ else
+ {
+ impl.waiters_.pop();
+ other_ops.push(op);
+ }
+ }
+ impl.waiters_.push(other_ops);
+
+ if (impl.waiters_.empty())
+ {
+ if (impl.receive_state_ == waiter)
+ impl.receive_state_ = block;
+ if (impl.send_state_ == waiter)
+ impl.send_state_ = impl.max_buffer_size_ ? buffer : block;
+ }
+}
+
+template <typename Mutex>
+inline bool channel_service<Mutex>::ready(
+ const channel_service<Mutex>::base_implementation_type& impl)
+ const noexcept
+{
+ typename Mutex::scoped_lock lock(impl.mutex_);
+
+ return impl.receive_state_ != block;
+}
+
+template <typename Mutex>
+template <typename Message, typename Traits,
+ typename... Signatures, typename... Args>
+bool channel_service<Mutex>::try_send(
+ channel_service<Mutex>::implementation_type<Traits, Signatures...>& impl,
+ bool via_dispatch, Args&&... args)
+{
+ typedef typename implementation_type<Traits,
+ Signatures...>::payload_type payload_type;
+
+ typename Mutex::scoped_lock lock(impl.mutex_);
+
+ switch (impl.send_state_)
+ {
+ case block:
+ {
+ return false;
+ }
+ case buffer:
+ {
+ impl.buffer_push(Message(0, static_cast<Args&&>(args)...));
+ impl.receive_state_ = buffer;
+ if (impl.buffer_size() == impl.max_buffer_size_)
+ impl.send_state_ = block;
+ return true;
+ }
+ case waiter:
+ {
+ payload_type payload(Message(0, static_cast<Args&&>(args)...));
+ channel_receive<payload_type>* receive_op =
+ static_cast<channel_receive<payload_type>*>(impl.waiters_.front());
+ impl.waiters_.pop();
+ if (impl.waiters_.empty())
+ impl.send_state_ = impl.max_buffer_size_ ? buffer : block;
+ lock.unlock();
+ if (via_dispatch)
+ receive_op->dispatch(static_cast<payload_type&&>(payload));
+ else
+ receive_op->post(static_cast<payload_type&&>(payload));
+ return true;
+ }
+ case closed:
+ default:
+ {
+ return false;
+ }
+ }
+}
+
+template <typename Mutex>
+template <typename Message, typename Traits,
+ typename... Signatures, typename... Args>
+std::size_t channel_service<Mutex>::try_send_n(
+ channel_service<Mutex>::implementation_type<Traits, Signatures...>& impl,
+ std::size_t count, bool via_dispatch, Args&&... args)
+{
+ typedef typename implementation_type<Traits,
+ Signatures...>::payload_type payload_type;
+
+ typename Mutex::scoped_lock lock(impl.mutex_);
+
+ if (count == 0)
+ return 0;
+
+ switch (impl.send_state_)
+ {
+ case block:
+ return 0;
+ case buffer:
+ case waiter:
+ break;
+ case closed:
+ default:
+ return 0;
+ }
+
+ payload_type payload(Message(0, static_cast<Args&&>(args)...));
+
+ for (std::size_t i = 0; i < count; ++i)
+ {
+ switch (impl.send_state_)
+ {
+ case block:
+ {
+ return i;
+ }
+ case buffer:
+ {
+ i += impl.buffer_push_n(count - i,
+ static_cast<payload_type&&>(payload));
+ impl.receive_state_ = buffer;
+ if (impl.buffer_size() == impl.max_buffer_size_)
+ impl.send_state_ = block;
+ return i;
+ }
+ case waiter:
+ {
+ channel_receive<payload_type>* receive_op =
+ static_cast<channel_receive<payload_type>*>(impl.waiters_.front());
+ impl.waiters_.pop();
+ if (impl.waiters_.empty())
+ impl.send_state_ = impl.max_buffer_size_ ? buffer : block;
+ lock.unlock();
+ if (via_dispatch)
+ receive_op->dispatch(payload);
+ else
+ receive_op->post(payload);
+ break;
+ }
+ case closed:
+ default:
+ {
+ return i;
+ }
+ }
+ }
+
+ return count;
+}
+
+template <typename Mutex>
+template <typename Traits, typename... Signatures>
+void channel_service<Mutex>::start_send_op(
+ channel_service<Mutex>::implementation_type<Traits, Signatures...>& impl,
+ channel_send<typename implementation_type<
+ Traits, Signatures...>::payload_type>* send_op)
+{
+ typedef typename implementation_type<Traits,
+ Signatures...>::payload_type payload_type;
+
+ typename Mutex::scoped_lock lock(impl.mutex_);
+
+ switch (impl.send_state_)
+ {
+ case block:
+ {
+ impl.waiters_.push(send_op);
+ if (impl.receive_state_ == block)
+ impl.receive_state_ = waiter;
+ return;
+ }
+ case buffer:
+ {
+ impl.buffer_push(send_op->get_payload());
+ impl.receive_state_ = buffer;
+ if (impl.buffer_size() == impl.max_buffer_size_)
+ impl.send_state_ = block;
+ send_op->immediate();
+ break;
+ }
+ case waiter:
+ {
+ channel_receive<payload_type>* receive_op =
+ static_cast<channel_receive<payload_type>*>(impl.waiters_.front());
+ impl.waiters_.pop();
+ if (impl.waiters_.empty())
+ impl.send_state_ = impl.max_buffer_size_ ? buffer : block;
+ receive_op->post(send_op->get_payload());
+ send_op->immediate();
+ break;
+ }
+ case closed:
+ default:
+ {
+ send_op->close();
+ break;
+ }
+ }
+}
+
+template <typename Mutex>
+template <typename Traits, typename... Signatures, typename Handler>
+bool channel_service<Mutex>::try_receive(
+ channel_service<Mutex>::implementation_type<Traits, Signatures...>& impl,
+ Handler&& handler)
+{
+ typedef typename implementation_type<Traits,
+ Signatures...>::payload_type payload_type;
+
+ typename Mutex::scoped_lock lock(impl.mutex_);
+
+ switch (impl.receive_state_)
+ {
+ case block:
+ {
+ return false;
+ }
+ case buffer:
+ {
+ payload_type payload(impl.buffer_front());
+ if (channel_send<payload_type>* send_op =
+ static_cast<channel_send<payload_type>*>(impl.waiters_.front()))
+ {
+ impl.buffer_pop();
+ impl.buffer_push(send_op->get_payload());
+ impl.waiters_.pop();
+ send_op->post();
+ }
+ else
+ {
+ impl.buffer_pop();
+ if (impl.buffer_size() == 0)
+ impl.receive_state_ = (impl.send_state_ == closed) ? closed : block;
+ impl.send_state_ = (impl.send_state_ == closed) ? closed : buffer;
+ }
+ lock.unlock();
+ asio::detail::non_const_lvalue<Handler> handler2(handler);
+ channel_handler<payload_type, decay_t<Handler>>(
+ static_cast<payload_type&&>(payload), handler2.value)();
+ return true;
+ }
+ case waiter:
+ {
+ channel_send<payload_type>* send_op =
+ static_cast<channel_send<payload_type>*>(impl.waiters_.front());
+ payload_type payload = send_op->get_payload();
+ impl.waiters_.pop();
+ if (impl.waiters_.front() == 0)
+ impl.receive_state_ = (impl.send_state_ == closed) ? closed : block;
+ send_op->post();
+ lock.unlock();
+ asio::detail::non_const_lvalue<Handler> handler2(handler);
+ channel_handler<payload_type, decay_t<Handler>>(
+ static_cast<payload_type&&>(payload), handler2.value)();
+ return true;
+ }
+ case closed:
+ default:
+ {
+ return false;
+ }
+ }
+}
+
+template <typename Mutex>
+template <typename Traits, typename... Signatures>
+void channel_service<Mutex>::start_receive_op(
+ channel_service<Mutex>::implementation_type<Traits, Signatures...>& impl,
+ channel_receive<typename implementation_type<
+ Traits, Signatures...>::payload_type>* receive_op)
+{
+ typedef typename implementation_type<Traits,
+ Signatures...>::traits_type traits_type;
+ typedef typename implementation_type<Traits,
+ Signatures...>::payload_type payload_type;
+
+ typename Mutex::scoped_lock lock(impl.mutex_);
+
+ switch (impl.receive_state_)
+ {
+ case block:
+ {
+ impl.waiters_.push(receive_op);
+ if (impl.send_state_ != closed)
+ impl.send_state_ = waiter;
+ return;
+ }
+ case buffer:
+ {
+ payload_type payload(
+ static_cast<payload_type&&>(impl.buffer_front()));
+ if (channel_send<payload_type>* send_op =
+ static_cast<channel_send<payload_type>*>(impl.waiters_.front()))
+ {
+ impl.buffer_pop();
+ impl.buffer_push(send_op->get_payload());
+ impl.waiters_.pop();
+ send_op->post();
+ }
+ else
+ {
+ impl.buffer_pop();
+ if (impl.buffer_size() == 0)
+ impl.receive_state_ = (impl.send_state_ == closed) ? closed : block;
+ impl.send_state_ = (impl.send_state_ == closed) ? closed : buffer;
+ }
+ receive_op->immediate(static_cast<payload_type&&>(payload));
+ break;
+ }
+ case waiter:
+ {
+ channel_send<payload_type>* send_op =
+ static_cast<channel_send<payload_type>*>(impl.waiters_.front());
+ payload_type payload = send_op->get_payload();
+ impl.waiters_.pop();
+ if (impl.waiters_.front() == 0)
+ impl.receive_state_ = (impl.send_state_ == closed) ? closed : block;
+ send_op->post();
+ receive_op->immediate(static_cast<payload_type&&>(payload));
+ break;
+ }
+ case closed:
+ default:
+ {
+ traits_type::invoke_receive_closed(
+ post_receive<payload_type,
+ typename traits_type::receive_closed_signature>(receive_op));
+ break;
+ }
+ }
+}
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_IMPL_CHANNEL_SERVICE_HPP
diff --git a/3rdparty/asio/include/asio/experimental/detail/partial_promise.hpp b/3rdparty/asio/include/asio/experimental/detail/partial_promise.hpp
new file mode 100644
index 00000000000..8495af2f0ba
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/detail/partial_promise.hpp
@@ -0,0 +1,197 @@
+//
+// experimental/detail/partial_promise.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_DETAIL_PARTIAL_PROMISE_HPP
+#define ASIO_EXPERIMENTAL_DETAIL_PARTIAL_PROMISE_HPP
+
+#include "asio/detail/config.hpp"
+#include "asio/append.hpp"
+#include "asio/awaitable.hpp"
+#include "asio/experimental/coro_traits.hpp"
+
+#if defined(ASIO_HAS_STD_COROUTINE)
+# include <coroutine>
+#else // defined(ASIO_HAS_STD_COROUTINE)
+# include <experimental/coroutine>
+#endif // defined(ASIO_HAS_STD_COROUTINE)
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+#if defined(ASIO_HAS_STD_COROUTINE)
+
+using std::coroutine_handle;
+using std::coroutine_traits;
+using std::suspend_never;
+using std::suspend_always;
+using std::noop_coroutine;
+
+#else // defined(ASIO_HAS_STD_COROUTINE)
+
+using std::experimental::coroutine_handle;
+using std::experimental::coroutine_traits;
+using std::experimental::suspend_never;
+using std::experimental::suspend_always;
+using std::experimental::noop_coroutine;
+
+#endif // defined(ASIO_HAS_STD_COROUTINE)
+
+struct partial_coro
+{
+ coroutine_handle<void> handle{nullptr};
+};
+
+template <typename Allocator>
+struct partial_promise_base
+{
+ template <typename Executor, typename Token, typename... Args>
+ void* operator new(const std::size_t size, Executor&, Token& tk, Args&...)
+ {
+ return allocate_coroutine<Allocator>(size, get_associated_allocator(tk));
+ }
+
+ void operator delete(void* raw, const std::size_t size)
+ {
+ deallocate_coroutine<Allocator>(raw, size);
+ }
+};
+
+template <>
+struct partial_promise_base<std::allocator<void>>
+{
+};
+
+template <typename Allocator>
+struct partial_promise : partial_promise_base<Allocator>
+{
+ auto initial_suspend() noexcept
+ {
+ return asio::detail::suspend_always{};
+ }
+
+ auto final_suspend() noexcept
+ {
+ struct awaitable_t
+ {
+ partial_promise *p;
+
+ constexpr bool await_ready() noexcept { return true; }
+
+ auto await_suspend(asio::detail::coroutine_handle<>) noexcept
+ {
+ p->get_return_object().handle.destroy();
+ }
+
+ constexpr void await_resume() noexcept {}
+ };
+
+ return awaitable_t{this};
+ }
+
+ void return_void() {}
+
+ partial_coro get_return_object()
+ {
+ return partial_coro{coroutine_handle<partial_promise>::from_promise(*this)};
+ }
+
+ void unhandled_exception()
+ {
+ assert(false);
+ }
+};
+
+
+
+}; // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#if defined(ASIO_HAS_STD_COROUTINE)
+
+namespace std {
+
+template <typename Executor, typename Completion, typename... Args>
+struct coroutine_traits<
+ asio::experimental::detail::partial_coro,
+ Executor, Completion, Args...>
+{
+ using promise_type =
+ asio::experimental::detail::partial_promise<
+ asio::associated_allocator_t<Completion>>;
+};
+
+} // namespace std
+
+#else // defined(ASIO_HAS_STD_COROUTINE)
+
+namespace std { namespace experimental {
+
+template <typename Executor, typename Completion, typename... Args>
+struct coroutine_traits<
+ asio::experimental::detail::partial_coro,
+ Executor, Completion, Args...>
+{
+ using promise_type =
+ asio::experimental::detail::partial_promise<
+ asio::associated_allocator_t<Completion>>;
+};
+
+}} // namespace std::experimental
+
+#endif // defined(ASIO_HAS_STD_COROUTINE)
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+template <execution::executor Executor,
+ typename CompletionToken, typename... Args>
+partial_coro post_coroutine(Executor exec,
+ CompletionToken token, Args&&... args) noexcept
+{
+ post(exec, asio::append(std::move(token), std::move(args)...));
+ co_return;
+}
+
+template <detail::execution_context Context,
+ typename CompletionToken, typename... Args>
+partial_coro post_coroutine(Context& ctx,
+ CompletionToken token, Args&&... args) noexcept
+{
+ post(ctx, asio::append(std::move(token), std::move(args)...));
+ co_return;
+}
+
+template <execution::executor Executor,
+ typename CompletionToken, typename... Args>
+partial_coro dispatch_coroutine(Executor exec,
+ CompletionToken token, Args&&... args) noexcept
+{
+ dispatch(exec, asio::append(std::move(token), std::move(args)...));
+ co_return;
+}
+
+template <detail::execution_context Context,
+ typename CompletionToken, typename... Args>
+partial_coro dispatch_coroutine(Context& ctx,
+ CompletionToken token, Args &&... args) noexcept
+{
+ dispatch(ctx, asio::append(std::move(token), std::move(args)...));
+ co_return;
+}
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#endif // ASIO_EXPERIMENTAL_DETAIL_PARTIAL_PROMISE_HPP
diff --git a/3rdparty/asio/include/asio/experimental/impl/as_single.hpp b/3rdparty/asio/include/asio/experimental/impl/as_single.hpp
new file mode 100644
index 00000000000..d183cf5679e
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/impl/as_single.hpp
@@ -0,0 +1,176 @@
+//
+// experimental/impl/as_single.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_EXPERIMENTAL_AS_SINGLE_HPP
+#define ASIO_IMPL_EXPERIMENTAL_AS_SINGLE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <tuple>
+#include "asio/associator.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+// Class to adapt a as_single_t as a completion handler.
+template <typename Handler>
+class as_single_handler
+{
+public:
+ typedef void result_type;
+
+ template <typename CompletionToken>
+ as_single_handler(as_single_t<CompletionToken> e)
+ : handler_(static_cast<CompletionToken&&>(e.token_))
+ {
+ }
+
+ template <typename RedirectedHandler>
+ as_single_handler(RedirectedHandler&& h)
+ : handler_(static_cast<RedirectedHandler&&>(h))
+ {
+ }
+
+ void operator()()
+ {
+ static_cast<Handler&&>(handler_)();
+ }
+
+ template <typename Arg>
+ void operator()(Arg&& arg)
+ {
+ static_cast<Handler&&>(handler_)(static_cast<Arg&&>(arg));
+ }
+
+ template <typename... Args>
+ void operator()(Args&&... args)
+ {
+ static_cast<Handler&&>(handler_)(
+ std::make_tuple(static_cast<Args&&>(args)...));
+ }
+
+//private:
+ Handler handler_;
+};
+
+template <typename Handler>
+inline bool asio_handler_is_continuation(
+ as_single_handler<Handler>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Signature>
+struct as_single_signature
+{
+ typedef Signature type;
+};
+
+template <typename R>
+struct as_single_signature<R()>
+{
+ typedef R type();
+};
+
+template <typename R, typename Arg>
+struct as_single_signature<R(Arg)>
+{
+ typedef R type(Arg);
+};
+
+template <typename R, typename... Args>
+struct as_single_signature<R(Args...)>
+{
+ typedef R type(std::tuple<decay_t<Args>...>);
+};
+
+} // namespace detail
+} // namespace experimental
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename CompletionToken, typename Signature>
+struct async_result<experimental::as_single_t<CompletionToken>, Signature>
+{
+ template <typename Initiation>
+ struct init_wrapper
+ {
+ init_wrapper(Initiation init)
+ : initiation_(static_cast<Initiation&&>(init))
+ {
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler, Args&&... args)
+ {
+ static_cast<Initiation&&>(initiation_)(
+ experimental::detail::as_single_handler<decay_t<Handler>>(
+ static_cast<Handler&&>(handler)),
+ static_cast<Args&&>(args)...);
+ }
+
+ Initiation initiation_;
+ };
+
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static auto initiate(Initiation&& initiation,
+ RawCompletionToken&& token, Args&&... args)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename experimental::detail::as_single_signature<Signature>::type>(
+ init_wrapper<decay_t<Initiation>>(
+ static_cast<Initiation&&>(initiation)),
+ token.token_, static_cast<Args&&>(args)...))
+ {
+ return async_initiate<CompletionToken,
+ typename experimental::detail::as_single_signature<Signature>::type>(
+ init_wrapper<decay_t<Initiation>>(
+ static_cast<Initiation&&>(initiation)),
+ token.token_, static_cast<Args&&>(args)...);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename DefaultCandidate>
+struct associator<Associator,
+ experimental::detail::as_single_handler<Handler>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const experimental::detail::as_single_handler<Handler>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const experimental::detail::as_single_handler<Handler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_EXPERIMENTAL_AS_SINGLE_HPP
diff --git a/3rdparty/asio/include/asio/experimental/impl/channel_error.ipp b/3rdparty/asio/include/asio/experimental/impl/channel_error.ipp
new file mode 100644
index 00000000000..3f4b9829774
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/impl/channel_error.ipp
@@ -0,0 +1,61 @@
+//
+// experimental/impl/channel_error.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CHANNEL_ERROR_IPP
+#define ASIO_EXPERIMENTAL_IMPL_CHANNEL_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/experimental/channel_error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace error {
+namespace detail {
+
+class channel_category : public asio::error_category
+{
+public:
+ const char* name() const noexcept
+ {
+ return "asio.channel";
+ }
+
+ std::string message(int value) const
+ {
+ switch (value)
+ {
+ case channel_closed: return "Channel closed";
+ case channel_cancelled: return "Channel cancelled";
+ default: return "asio.channel error";
+ }
+ }
+};
+
+} // namespace detail
+
+const asio::error_category& get_channel_category()
+{
+ static detail::channel_category instance;
+ return instance;
+}
+
+} // namespace error
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_IMPL_CHANNEL_ERROR_IPP
diff --git a/3rdparty/asio/include/asio/experimental/impl/co_composed.hpp b/3rdparty/asio/include/asio/experimental/impl/co_composed.hpp
new file mode 100644
index 00000000000..3eef2e2ee2c
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/impl/co_composed.hpp
@@ -0,0 +1,1174 @@
+//
+// experimental/impl/co_composed.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_EXPERIMENTAL_CO_COMPOSED_HPP
+#define ASIO_IMPL_EXPERIMENTAL_CO_COMPOSED_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <new>
+#include <tuple>
+#include <variant>
+#include "asio/associated_cancellation_slot.hpp"
+#include "asio/associator.hpp"
+#include "asio/async_result.hpp"
+#include "asio/cancellation_state.hpp"
+#include "asio/detail/composed_work.hpp"
+#include "asio/detail/recycling_allocator.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+
+#if defined(ASIO_HAS_STD_COROUTINE)
+# include <coroutine>
+#else // defined(ASIO_HAS_STD_COROUTINE)
+# include <experimental/coroutine>
+#endif // defined(ASIO_HAS_STD_COROUTINE)
+
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+# include "asio/detail/source_location.hpp"
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+#if defined(ASIO_HAS_STD_COROUTINE)
+using std::coroutine_handle;
+using std::suspend_always;
+using std::suspend_never;
+#else // defined(ASIO_HAS_STD_COROUTINE)
+using std::experimental::coroutine_handle;
+using std::experimental::suspend_always;
+using std::experimental::suspend_never;
+#endif // defined(ASIO_HAS_STD_COROUTINE)
+
+using asio::detail::composed_io_executors;
+using asio::detail::composed_work;
+using asio::detail::composed_work_guard;
+using asio::detail::get_composed_io_executor;
+using asio::detail::make_composed_io_executors;
+using asio::detail::recycling_allocator;
+using asio::detail::throw_error;
+
+template <typename Executors, typename Handler, typename Return>
+class co_composed_state;
+
+template <typename Executors, typename Handler, typename Return>
+class co_composed_handler_base;
+
+template <typename Executors, typename Handler, typename Return>
+class co_composed_promise;
+
+template <completion_signature... Signatures>
+class co_composed_returns
+{
+};
+
+struct co_composed_on_suspend
+{
+ void (*fn_)(void*) = nullptr;
+ void* arg_ = nullptr;
+};
+
+template <typename... T>
+struct co_composed_completion : std::tuple<T&&...>
+{
+ template <typename... U>
+ co_composed_completion(U&&... u) noexcept
+ : std::tuple<T&&...>(std::forward<U>(u)...)
+ {
+ }
+};
+
+template <typename Executors, typename Handler,
+ typename Return, typename Signature>
+class co_composed_state_return_overload;
+
+template <typename Executors, typename Handler,
+ typename Return, typename R, typename... Args>
+class co_composed_state_return_overload<
+ Executors, Handler, Return, R(Args...)>
+{
+public:
+ using derived_type = co_composed_state<Executors, Handler, Return>;
+ using promise_type = co_composed_promise<Executors, Handler, Return>;
+ using return_type = std::tuple<Args...>;
+
+ void on_cancellation_complete_with(Args... args)
+ {
+ derived_type& state = *static_cast<derived_type*>(this);
+ state.return_value_ = std::make_tuple(std::move(args)...);
+ state.cancellation_on_suspend_fn(
+ [](void* p)
+ {
+ auto& promise = *static_cast<promise_type*>(p);
+
+ co_composed_handler_base<Executors, Handler,
+ Return> composed_handler(promise);
+
+ Handler handler(std::move(promise.state().handler_));
+ return_type result(
+ std::move(std::get<return_type>(promise.state().return_value_)));
+
+ co_composed_handler_base<Executors, Handler,
+ Return>(std::move(composed_handler));
+
+ std::apply(std::move(handler), std::move(result));
+ });
+ }
+};
+
+template <typename Executors, typename Handler, typename Return>
+class co_composed_state_return;
+
+template <typename Executors, typename Handler, typename... Signatures>
+class co_composed_state_return<
+ Executors, Handler, co_composed_returns<Signatures...>>
+ : public co_composed_state_return_overload<Executors,
+ Handler, co_composed_returns<Signatures...>, Signatures>...
+{
+public:
+ using co_composed_state_return_overload<Executors,
+ Handler, co_composed_returns<Signatures...>,
+ Signatures>::on_cancellation_complete_with...;
+
+private:
+ template <typename, typename, typename, typename>
+ friend class co_composed_promise_return_overload;
+ template <typename, typename, typename, typename>
+ friend class co_composed_state_return_overload;
+
+ std::variant<std::monostate,
+ typename co_composed_state_return_overload<
+ Executors, Handler, co_composed_returns<Signatures...>,
+ Signatures>::return_type...> return_value_;
+};
+
+template <typename Executors, typename Handler,
+ typename Return, typename... Signatures>
+struct co_composed_state_default_cancellation_on_suspend_impl;
+
+template <typename Executors, typename Handler, typename Return>
+struct co_composed_state_default_cancellation_on_suspend_impl<
+ Executors, Handler, Return>
+{
+ static constexpr void (*fn())(void*)
+ {
+ return nullptr;
+ }
+};
+
+template <typename Executors, typename Handler, typename Return,
+ typename R, typename... Args, typename... Signatures>
+struct co_composed_state_default_cancellation_on_suspend_impl<
+ Executors, Handler, Return, R(Args...), Signatures...>
+{
+ static constexpr void (*fn())(void*)
+ {
+ return co_composed_state_default_cancellation_on_suspend_impl<
+ Executors, Handler, Return, Signatures...>::fn();
+ }
+};
+
+template <typename Executors, typename Handler, typename Return,
+ typename R, typename... Args, typename... Signatures>
+struct co_composed_state_default_cancellation_on_suspend_impl<Executors,
+ Handler, Return, R(asio::error_code, Args...), Signatures...>
+{
+ using promise_type = co_composed_promise<Executors, Handler, Return>;
+ using return_type = std::tuple<asio::error_code, Args...>;
+
+ static constexpr void (*fn())(void*)
+ {
+ if constexpr ((is_constructible<Args>::value && ...))
+ {
+ return [](void* p)
+ {
+ auto& promise = *static_cast<promise_type*>(p);
+
+ co_composed_handler_base<Executors, Handler,
+ Return> composed_handler(promise);
+
+ Handler handler(std::move(promise.state().handler_));
+
+ co_composed_handler_base<Executors, Handler,
+ Return>(std::move(composed_handler));
+
+ std::move(handler)(
+ asio::error_code(asio::error::operation_aborted),
+ Args{}...);
+ };
+ }
+ else
+ {
+ return co_composed_state_default_cancellation_on_suspend_impl<
+ Executors, Handler, Return, Signatures...>::fn();
+ }
+ }
+};
+
+template <typename Executors, typename Handler, typename Return,
+ typename R, typename... Args, typename... Signatures>
+struct co_composed_state_default_cancellation_on_suspend_impl<Executors,
+ Handler, Return, R(std::exception_ptr, Args...), Signatures...>
+{
+ using promise_type = co_composed_promise<Executors, Handler, Return>;
+ using return_type = std::tuple<std::exception_ptr, Args...>;
+
+ static constexpr void (*fn())(void*)
+ {
+ if constexpr ((is_constructible<Args>::value && ...))
+ {
+ return [](void* p)
+ {
+ auto& promise = *static_cast<promise_type*>(p);
+
+ co_composed_handler_base<Executors, Handler,
+ Return> composed_handler(promise);
+
+ Handler handler(std::move(promise.state().handler_));
+
+ co_composed_handler_base<Executors, Handler,
+ Return>(std::move(composed_handler));
+
+ std::move(handler)(
+ std::make_exception_ptr(
+ asio::system_error(
+ asio::error::operation_aborted, "co_await")),
+ Args{}...);
+ };
+ }
+ else
+ {
+ return co_composed_state_default_cancellation_on_suspend_impl<
+ Executors, Handler, Return, Signatures...>::fn();
+ }
+ }
+};
+
+template <typename Executors, typename Handler, typename Return>
+struct co_composed_state_default_cancellation_on_suspend;
+
+template <typename Executors, typename Handler, typename... Signatures>
+struct co_composed_state_default_cancellation_on_suspend<
+ Executors, Handler, co_composed_returns<Signatures...>>
+ : co_composed_state_default_cancellation_on_suspend_impl<Executors,
+ Handler, co_composed_returns<Signatures...>, Signatures...>
+{
+};
+
+template <typename Executors, typename Handler, typename Return>
+class co_composed_state_cancellation
+{
+public:
+ using cancellation_slot_type = cancellation_slot;
+
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return cancellation_state_.slot();
+ }
+
+ cancellation_state get_cancellation_state() const noexcept
+ {
+ return cancellation_state_;
+ }
+
+ void reset_cancellation_state()
+ {
+ cancellation_state_ = cancellation_state(
+ (get_associated_cancellation_slot)(
+ static_cast<co_composed_state<Executors, Handler, Return>*>(
+ this)->handler()));
+ }
+
+ template <typename Filter>
+ void reset_cancellation_state(Filter filter)
+ {
+ cancellation_state_ = cancellation_state(
+ (get_associated_cancellation_slot)(
+ static_cast<co_composed_state<Executors, Handler, Return>*>(
+ this)->handler()), filter, filter);
+ }
+
+ template <typename InFilter, typename OutFilter>
+ void reset_cancellation_state(InFilter&& in_filter, OutFilter&& out_filter)
+ {
+ cancellation_state_ = cancellation_state(
+ (get_associated_cancellation_slot)(
+ static_cast<co_composed_state<Executors, Handler, Return>*>(
+ this)->handler()),
+ std::forward<InFilter>(in_filter),
+ std::forward<OutFilter>(out_filter));
+ }
+
+ cancellation_type_t cancelled() const noexcept
+ {
+ return cancellation_state_.cancelled();
+ }
+
+ void clear_cancellation_slot() noexcept
+ {
+ cancellation_state_.slot().clear();
+ }
+
+ [[nodiscard]] bool throw_if_cancelled() const noexcept
+ {
+ return throw_if_cancelled_;
+ }
+
+ void throw_if_cancelled(bool b) noexcept
+ {
+ throw_if_cancelled_ = b;
+ }
+
+ [[nodiscard]] bool complete_if_cancelled() const noexcept
+ {
+ return complete_if_cancelled_;
+ }
+
+ void complete_if_cancelled(bool b) noexcept
+ {
+ complete_if_cancelled_ = b;
+ }
+
+private:
+ template <typename, typename, typename>
+ friend class co_composed_promise;
+ template <typename, typename, typename, typename>
+ friend class co_composed_state_return_overload;
+
+ void cancellation_on_suspend_fn(void (*fn)(void*))
+ {
+ cancellation_on_suspend_fn_ = fn;
+ }
+
+ void check_for_cancellation_on_transform()
+ {
+ if (throw_if_cancelled_ && !!cancelled())
+ throw_error(asio::error::operation_aborted, "co_await");
+ }
+
+ bool check_for_cancellation_on_suspend(
+ co_composed_promise<Executors, Handler, Return>& promise) noexcept
+ {
+ if (complete_if_cancelled_ && !!cancelled() && cancellation_on_suspend_fn_)
+ {
+ promise.state().work_.reset();
+ promise.state().on_suspend_->fn_ = cancellation_on_suspend_fn_;
+ promise.state().on_suspend_->arg_ = &promise;
+ return false;
+ }
+ return true;
+ }
+
+ cancellation_state cancellation_state_;
+ void (*cancellation_on_suspend_fn_)(void*) =
+ co_composed_state_default_cancellation_on_suspend<
+ Executors, Handler, Return>::fn();
+ bool throw_if_cancelled_ = false;
+ bool complete_if_cancelled_ = true;
+};
+
+template <typename Executors, typename Handler, typename Return>
+ requires is_same<
+ typename associated_cancellation_slot<
+ Handler, cancellation_slot
+ >::asio_associated_cancellation_slot_is_unspecialised,
+ void>::value
+class co_composed_state_cancellation<Executors, Handler, Return>
+{
+public:
+ void reset_cancellation_state()
+ {
+ }
+
+ template <typename Filter>
+ void reset_cancellation_state(Filter)
+ {
+ }
+
+ template <typename InFilter, typename OutFilter>
+ void reset_cancellation_state(InFilter&&, OutFilter&&)
+ {
+ }
+
+ cancellation_type_t cancelled() const noexcept
+ {
+ return cancellation_type::none;
+ }
+
+ void clear_cancellation_slot() noexcept
+ {
+ }
+
+ [[nodiscard]] bool throw_if_cancelled() const noexcept
+ {
+ return false;
+ }
+
+ void throw_if_cancelled(bool) noexcept
+ {
+ }
+
+ [[nodiscard]] bool complete_if_cancelled() const noexcept
+ {
+ return false;
+ }
+
+ void complete_if_cancelled(bool) noexcept
+ {
+ }
+
+private:
+ template <typename, typename, typename>
+ friend class co_composed_promise;
+ template <typename, typename, typename, typename>
+ friend class co_composed_state_return_overload;
+
+ void cancellation_on_suspend_fn(void (*)(void*))
+ {
+ }
+
+ void check_for_cancellation_on_transform() noexcept
+ {
+ }
+
+ bool check_for_cancellation_on_suspend(
+ co_composed_promise<Executors, Handler, Return>&) noexcept
+ {
+ return true;
+ }
+};
+
+template <typename Executors, typename Handler, typename Return>
+class co_composed_state
+ : public co_composed_state_return<Executors, Handler, Return>,
+ public co_composed_state_cancellation<Executors, Handler, Return>
+{
+public:
+ using io_executor_type = typename composed_work_guard<
+ typename composed_work<Executors>::head_type>::executor_type;
+
+ template <typename H>
+ co_composed_state(composed_io_executors<Executors>&& executors,
+ H&& h, co_composed_on_suspend& on_suspend)
+ : work_(std::move(executors)),
+ handler_(std::forward<H>(h)),
+ on_suspend_(&on_suspend)
+ {
+ this->reset_cancellation_state(enable_terminal_cancellation());
+ }
+
+ io_executor_type get_io_executor() const noexcept
+ {
+ return work_.head_.get_executor();
+ }
+
+ template <typename... Args>
+ [[nodiscard]] co_composed_completion<Args...> complete(Args&&... args)
+ requires requires { declval<Handler>()(std::forward<Args>(args)...); }
+ {
+ return co_composed_completion<Args...>(std::forward<Args>(args)...);
+ }
+
+ const Handler& handler() const noexcept
+ {
+ return handler_;
+ }
+
+private:
+ template <typename, typename, typename>
+ friend class co_composed_handler_base;
+ template <typename, typename, typename>
+ friend class co_composed_promise;
+ template <typename, typename, typename, typename>
+ friend class co_composed_promise_return_overload;
+ template <typename, typename, typename>
+ friend class co_composed_state_cancellation;
+ template <typename, typename, typename, typename>
+ friend class co_composed_state_return_overload;
+ template <typename, typename, typename, typename...>
+ friend struct co_composed_state_default_cancellation_on_suspend_impl;
+
+ composed_work<Executors> work_;
+ Handler handler_;
+ co_composed_on_suspend* on_suspend_;
+};
+
+template <typename Executors, typename Handler, typename Return>
+class co_composed_handler_cancellation
+{
+public:
+ using cancellation_slot_type = cancellation_slot;
+
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return static_cast<
+ const co_composed_handler_base<Executors, Handler, Return>*>(
+ this)->promise().state().get_cancellation_slot();
+ }
+};
+
+template <typename Executors, typename Handler, typename Return>
+ requires is_same<
+ typename associated_cancellation_slot<
+ Handler, cancellation_slot
+ >::asio_associated_cancellation_slot_is_unspecialised,
+ void>::value
+class co_composed_handler_cancellation<Executors, Handler, Return>
+{
+};
+
+template <typename Executors, typename Handler, typename Return>
+class co_composed_handler_base :
+ public co_composed_handler_cancellation<Executors, Handler, Return>
+{
+public:
+ co_composed_handler_base(
+ co_composed_promise<Executors, Handler, Return>& p) noexcept
+ : p_(&p)
+ {
+ }
+
+ co_composed_handler_base(co_composed_handler_base&& other) noexcept
+ : p_(std::exchange(other.p_, nullptr))
+ {
+ }
+
+ ~co_composed_handler_base()
+ {
+ if (p_) [[unlikely]]
+ p_->destroy();
+ }
+
+ co_composed_promise<Executors, Handler, Return>& promise() const noexcept
+ {
+ return *p_;
+ }
+
+protected:
+ void resume(void* result)
+ {
+ co_composed_on_suspend on_suspend{};
+ std::exchange(p_, nullptr)->resume(p_, result, on_suspend);
+ if (on_suspend.fn_)
+ on_suspend.fn_(on_suspend.arg_);
+ }
+
+private:
+ co_composed_promise<Executors, Handler, Return>* p_;
+};
+
+template <typename Executors, typename Handler,
+ typename Return, typename Signature>
+class co_composed_handler;
+
+template <typename Executors, typename Handler,
+ typename Return, typename R, typename... Args>
+class co_composed_handler<Executors, Handler, Return, R(Args...)>
+ : public co_composed_handler_base<Executors, Handler, Return>
+{
+public:
+ using co_composed_handler_base<Executors,
+ Handler, Return>::co_composed_handler_base;
+
+ using result_type = std::tuple<decay_t<Args>...>;
+
+ template <typename... T>
+ void operator()(T&&... args)
+ {
+ result_type result(std::forward<T>(args)...);
+ this->resume(&result);
+ }
+
+ static auto on_resume(void* result)
+ {
+ auto& args = *static_cast<result_type*>(result);
+ if constexpr (sizeof...(Args) == 0)
+ return;
+ else if constexpr (sizeof...(Args) == 1)
+ return std::move(std::get<0>(args));
+ else
+ return std::move(args);
+ }
+};
+
+template <typename Executors, typename Handler,
+ typename Return, typename R, typename... Args>
+class co_composed_handler<Executors, Handler,
+ Return, R(asio::error_code, Args...)>
+ : public co_composed_handler_base<Executors, Handler, Return>
+{
+public:
+ using co_composed_handler_base<Executors,
+ Handler, Return>::co_composed_handler_base;
+
+ using args_type = std::tuple<decay_t<Args>...>;
+ using result_type = std::tuple<asio::error_code, args_type>;
+
+ template <typename... T>
+ void operator()(const asio::error_code& ec, T&&... args)
+ {
+ result_type result(ec, args_type(std::forward<T>(args)...));
+ this->resume(&result);
+ }
+
+ static auto on_resume(void* result)
+ {
+ auto& [ec, args] = *static_cast<result_type*>(result);
+ throw_error(ec);
+ if constexpr (sizeof...(Args) == 0)
+ return;
+ else if constexpr (sizeof...(Args) == 1)
+ return std::move(std::get<0>(args));
+ else
+ return std::move(args);
+ }
+};
+
+template <typename Executors, typename Handler,
+ typename Return, typename R, typename... Args>
+class co_composed_handler<Executors, Handler,
+ Return, R(std::exception_ptr, Args...)>
+ : public co_composed_handler_base<Executors, Handler, Return>
+{
+public:
+ using co_composed_handler_base<Executors,
+ Handler, Return>::co_composed_handler_base;
+
+ using args_type = std::tuple<decay_t<Args>...>;
+ using result_type = std::tuple<std::exception_ptr, args_type>;
+
+ template <typename... T>
+ void operator()(std::exception_ptr ex, T&&... args)
+ {
+ result_type result(std::move(ex), args_type(std::forward<T>(args)...));
+ this->resume(&result);
+ }
+
+ static auto on_resume(void* result)
+ {
+ auto& [ex, args] = *static_cast<result_type*>(result);
+ if (ex)
+ std::rethrow_exception(ex);
+ if constexpr (sizeof...(Args) == 0)
+ return;
+ else if constexpr (sizeof...(Args) == 1)
+ return std::move(std::get<0>(args));
+ else
+ return std::move(args);
+ }
+};
+
+template <typename Executors, typename Handler, typename Return>
+class co_composed_promise_return;
+
+template <typename Executors, typename Handler>
+class co_composed_promise_return<Executors, Handler, co_composed_returns<>>
+{
+public:
+ auto final_suspend() noexcept
+ {
+ return suspend_never();
+ }
+
+ void return_void() noexcept
+ {
+ }
+};
+
+template <typename Executors, typename Handler,
+ typename Return, typename Signature>
+class co_composed_promise_return_overload;
+
+template <typename Executors, typename Handler,
+ typename Return, typename R, typename... Args>
+class co_composed_promise_return_overload<
+ Executors, Handler, Return, R(Args...)>
+{
+public:
+ using derived_type = co_composed_promise<Executors, Handler, Return>;
+ using return_type = std::tuple<Args...>;
+
+ void return_value(std::tuple<Args...>&& value)
+ {
+ derived_type& promise = *static_cast<derived_type*>(this);
+ promise.state().return_value_ = std::move(value);
+ promise.state().work_.reset();
+ promise.state().on_suspend_->arg_ = this;
+ promise.state().on_suspend_->fn_ =
+ [](void* p)
+ {
+ auto& promise = *static_cast<derived_type*>(p);
+
+ co_composed_handler_base<Executors, Handler,
+ Return> composed_handler(promise);
+
+ Handler handler(std::move(promise.state().handler_));
+ return_type result(
+ std::move(std::get<return_type>(promise.state().return_value_)));
+
+ co_composed_handler_base<Executors, Handler,
+ Return>(std::move(composed_handler));
+
+ std::apply(std::move(handler), std::move(result));
+ };
+ }
+};
+
+template <typename Executors, typename Handler, typename... Signatures>
+class co_composed_promise_return<Executors,
+ Handler, co_composed_returns<Signatures...>>
+ : public co_composed_promise_return_overload<Executors,
+ Handler, co_composed_returns<Signatures...>, Signatures>...
+{
+public:
+ auto final_suspend() noexcept
+ {
+ return suspend_always();
+ }
+
+ using co_composed_promise_return_overload<Executors, Handler,
+ co_composed_returns<Signatures...>, Signatures>::return_value...;
+
+private:
+ template <typename, typename, typename, typename>
+ friend class co_composed_promise_return_overload;
+};
+
+template <typename Executors, typename Handler, typename Return>
+class co_composed_promise
+ : public co_composed_promise_return<Executors, Handler, Return>
+{
+public:
+ template <typename... Args>
+ void* operator new(std::size_t size,
+ co_composed_state<Executors, Handler, Return>& state, Args&&...)
+ {
+ block_allocator_type allocator(
+ (get_associated_allocator)(state.handler_,
+ recycling_allocator<void>()));
+
+ block* base_ptr = std::allocator_traits<block_allocator_type>::allocate(
+ allocator, blocks(sizeof(allocator_type)) + blocks(size));
+
+ new (static_cast<void*>(base_ptr)) allocator_type(std::move(allocator));
+
+ return base_ptr + blocks(sizeof(allocator_type));
+ }
+
+ template <typename C, typename... Args>
+ void* operator new(std::size_t size, C&&,
+ co_composed_state<Executors, Handler, Return>& state, Args&&...)
+ {
+ return co_composed_promise::operator new(size, state);
+ }
+
+ void operator delete(void* ptr, std::size_t size)
+ {
+ block* base_ptr = static_cast<block*>(ptr) - blocks(sizeof(allocator_type));
+
+ allocator_type* allocator_ptr = std::launder(
+ static_cast<allocator_type*>(static_cast<void*>(base_ptr)));
+
+ block_allocator_type block_allocator(std::move(*allocator_ptr));
+ allocator_ptr->~allocator_type();
+
+ std::allocator_traits<block_allocator_type>::deallocate(block_allocator,
+ base_ptr, blocks(sizeof(allocator_type)) + blocks(size));
+ }
+
+ template <typename... Args>
+ co_composed_promise(
+ co_composed_state<Executors, Handler, Return>& state, Args&&...)
+ : state_(state)
+ {
+ }
+
+ template <typename C, typename... Args>
+ co_composed_promise(C&&,
+ co_composed_state<Executors, Handler, Return>& state, Args&&...)
+ : state_(state)
+ {
+ }
+
+ void destroy() noexcept
+ {
+ coroutine_handle<co_composed_promise>::from_promise(*this).destroy();
+ }
+
+ void resume(co_composed_promise*& owner, void* result,
+ co_composed_on_suspend& on_suspend)
+ {
+ state_.on_suspend_ = &on_suspend;
+ state_.clear_cancellation_slot();
+ owner_ = &owner;
+ result_ = result;
+ coroutine_handle<co_composed_promise>::from_promise(*this).resume();
+ }
+
+ co_composed_state<Executors, Handler, Return>& state() noexcept
+ {
+ return state_;
+ }
+
+ void get_return_object() noexcept
+ {
+ }
+
+ auto initial_suspend() noexcept
+ {
+ return suspend_never();
+ }
+
+ void unhandled_exception()
+ {
+ if (owner_)
+ *owner_ = this;
+ throw;
+ }
+
+ template <async_operation Op>
+ auto await_transform(Op&& op
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ , asio::detail::source_location location
+ = asio::detail::source_location::current()
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ )
+ {
+ class [[nodiscard]] awaitable
+ {
+ public:
+ awaitable(Op&& op, co_composed_promise& promise
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ , const asio::detail::source_location& location
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ )
+ : op_(std::forward<Op>(op)),
+ promise_(promise)
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ , location_(location)
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ {
+ }
+
+ constexpr bool await_ready() const noexcept
+ {
+ return false;
+ }
+
+ void await_suspend(coroutine_handle<co_composed_promise>)
+ {
+ if (promise_.state_.check_for_cancellation_on_suspend(promise_))
+ {
+ promise_.state_.on_suspend_->arg_ = this;
+ promise_.state_.on_suspend_->fn_ =
+ [](void* p)
+ {
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ ASIO_HANDLER_LOCATION((
+ static_cast<awaitable*>(p)->location_.file_name(),
+ static_cast<awaitable*>(p)->location_.line(),
+ static_cast<awaitable*>(p)->location_.function_name()));
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ std::forward<Op>(static_cast<awaitable*>(p)->op_)(
+ co_composed_handler<Executors, Handler,
+ Return, completion_signature_of_t<Op>>(
+ static_cast<awaitable*>(p)->promise_));
+ };
+ }
+ }
+
+ auto await_resume()
+ {
+ return co_composed_handler<Executors, Handler, Return,
+ completion_signature_of_t<Op>>::on_resume(promise_.result_);
+ }
+
+ private:
+ Op&& op_;
+ co_composed_promise& promise_;
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ asio::detail::source_location location_;
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ };
+
+ state_.check_for_cancellation_on_transform();
+ return awaitable{std::forward<Op>(op), *this
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ , location
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ };
+ }
+
+ template <typename... Args>
+ auto yield_value(co_composed_completion<Args...>&& result)
+ {
+ class [[nodiscard]] awaitable
+ {
+ public:
+ awaitable(co_composed_completion<Args...>&& result,
+ co_composed_promise& promise)
+ : result_(std::move(result)),
+ promise_(promise)
+ {
+ }
+
+ constexpr bool await_ready() const noexcept
+ {
+ return false;
+ }
+
+ void await_suspend(coroutine_handle<co_composed_promise>)
+ {
+ promise_.state_.work_.reset();
+ promise_.state_.on_suspend_->arg_ = this;
+ promise_.state_.on_suspend_->fn_ =
+ [](void* p)
+ {
+ awaitable& a = *static_cast<awaitable*>(p);
+
+ co_composed_handler_base<Executors, Handler,
+ Return> composed_handler(a.promise_);
+
+ Handler handler(std::move(a.promise_.state_.handler_));
+ std::tuple<decay_t<Args>...> result(
+ std::move(static_cast<std::tuple<Args&&...>>(a.result_)));
+
+ co_composed_handler_base<Executors, Handler,
+ Return>(std::move(composed_handler));
+
+ std::apply(std::move(handler), std::move(result));
+ };
+ }
+
+ void await_resume() noexcept
+ {
+ }
+
+ private:
+ co_composed_completion<Args...> result_;
+ co_composed_promise& promise_;
+ };
+
+ return awaitable{std::move(result), *this};
+ }
+
+private:
+ using allocator_type =
+ associated_allocator_t<Handler, recycling_allocator<void>>;
+
+ union block
+ {
+ std::max_align_t max_align;
+ alignas(allocator_type) char pad[alignof(allocator_type)];
+ };
+
+ using block_allocator_type =
+ typename std::allocator_traits<allocator_type>
+ ::template rebind_alloc<block>;
+
+ static constexpr std::size_t blocks(std::size_t size)
+ {
+ return (size + sizeof(block) - 1) / sizeof(block);
+ }
+
+ co_composed_state<Executors, Handler, Return>& state_;
+ co_composed_promise** owner_ = nullptr;
+ void* result_ = nullptr;
+};
+
+template <typename Implementation, typename Executors, typename... Signatures>
+class initiate_co_composed
+{
+public:
+ using executor_type = typename composed_io_executors<Executors>::head_type;
+
+ template <typename I>
+ initiate_co_composed(I&& impl, composed_io_executors<Executors>&& executors)
+ : implementation_(std::forward<I>(impl)),
+ executors_(std::move(executors))
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return executors_.head_;
+ }
+
+ template <typename Handler, typename... InitArgs>
+ void operator()(Handler&& handler, InitArgs&&... init_args) const &
+ {
+ using handler_type = decay_t<Handler>;
+ using returns_type = co_composed_returns<Signatures...>;
+ co_composed_on_suspend on_suspend{};
+ implementation_(
+ co_composed_state<Executors, handler_type, returns_type>(
+ executors_, std::forward<Handler>(handler), on_suspend),
+ std::forward<InitArgs>(init_args)...);
+ if (on_suspend.fn_)
+ on_suspend.fn_(on_suspend.arg_);
+ }
+
+ template <typename Handler, typename... InitArgs>
+ void operator()(Handler&& handler, InitArgs&&... init_args) &&
+ {
+ using handler_type = decay_t<Handler>;
+ using returns_type = co_composed_returns<Signatures...>;
+ co_composed_on_suspend on_suspend{};
+ std::move(implementation_)(
+ co_composed_state<Executors, handler_type, returns_type>(
+ std::move(executors_), std::forward<Handler>(handler), on_suspend),
+ std::forward<InitArgs>(init_args)...);
+ if (on_suspend.fn_)
+ on_suspend.fn_(on_suspend.arg_);
+ }
+
+private:
+ Implementation implementation_;
+ composed_io_executors<Executors> executors_;
+};
+
+template <typename... Signatures, typename Implementation, typename Executors>
+inline initiate_co_composed<Implementation, Executors, Signatures...>
+make_initiate_co_composed(Implementation&& implementation,
+ composed_io_executors<Executors>&& executors)
+{
+ return initiate_co_composed<
+ decay_t<Implementation>, Executors, Signatures...>(
+ std::forward<Implementation>(implementation), std::move(executors));
+}
+
+} // namespace detail
+
+template <completion_signature... Signatures,
+ typename Implementation, typename... IoObjectsOrExecutors>
+inline auto co_composed(Implementation&& implementation,
+ IoObjectsOrExecutors&&... io_objects_or_executors)
+{
+ return detail::make_initiate_co_composed<Signatures...>(
+ std::forward<Implementation>(implementation),
+ detail::make_composed_io_executors(
+ detail::get_composed_io_executor(
+ std::forward<IoObjectsOrExecutors>(
+ io_objects_or_executors))...));
+}
+
+} // namespace experimental
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename Executors, typename Handler, typename Return,
+ typename Signature, typename DefaultCandidate>
+struct associator<Associator,
+ experimental::detail::co_composed_handler<
+ Executors, Handler, Return, Signature>,
+ DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const experimental::detail::co_composed_handler<
+ Executors, Handler, Return, Signature>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(
+ h.promise().state().handler());
+ }
+
+ static auto get(
+ const experimental::detail::co_composed_handler<
+ Executors, Handler, Return, Signature>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(
+ Associator<Handler, DefaultCandidate>::get(
+ h.promise().state().handler(), c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(
+ h.promise().state().handler(), c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#if !defined(GENERATING_DOCUMENTATION)
+# if defined(ASIO_HAS_STD_COROUTINE)
+namespace std {
+# else // defined(ASIO_HAS_STD_COROUTINE)
+namespace std { namespace experimental {
+# endif // defined(ASIO_HAS_STD_COROUTINE)
+
+template <typename C, typename Executors,
+ typename Handler, typename Return, typename... Args>
+struct coroutine_traits<void, C&,
+ asio::experimental::detail::co_composed_state<
+ Executors, Handler, Return>,
+ Args...>
+{
+ using promise_type =
+ asio::experimental::detail::co_composed_promise<
+ Executors, Handler, Return>;
+};
+
+template <typename C, typename Executors,
+ typename Handler, typename Return, typename... Args>
+struct coroutine_traits<void, C&&,
+ asio::experimental::detail::co_composed_state<
+ Executors, Handler, Return>,
+ Args...>
+{
+ using promise_type =
+ asio::experimental::detail::co_composed_promise<
+ Executors, Handler, Return>;
+};
+
+template <typename Executors, typename Handler,
+ typename Return, typename... Args>
+struct coroutine_traits<void,
+ asio::experimental::detail::co_composed_state<
+ Executors, Handler, Return>,
+ Args...>
+{
+ using promise_type =
+ asio::experimental::detail::co_composed_promise<
+ Executors, Handler, Return>;
+};
+
+# if defined(ASIO_HAS_STD_COROUTINE)
+} // namespace std
+# else // defined(ASIO_HAS_STD_COROUTINE)
+}} // namespace std::experimental
+# endif // defined(ASIO_HAS_STD_COROUTINE)
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_EXPERIMENTAL_CO_COMPOSED_HPP
diff --git a/3rdparty/asio/include/asio/experimental/impl/coro.hpp b/3rdparty/asio/include/asio/experimental/impl/coro.hpp
new file mode 100644
index 00000000000..872d1a0255c
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/impl/coro.hpp
@@ -0,0 +1,1222 @@
+//
+// experimental/impl/coro.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_CORO_HPP
+#define ASIO_EXPERIMENTAL_IMPL_CORO_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/append.hpp"
+#include "asio/associated_cancellation_slot.hpp"
+#include "asio/bind_allocator.hpp"
+#include "asio/deferred.hpp"
+#include "asio/experimental/detail/coro_completion_handler.hpp"
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+
+template <typename Yield, typename Return,
+ typename Executor, typename Allocator>
+struct coro;
+
+namespace detail {
+
+struct coro_cancellation_source
+{
+ cancellation_slot slot;
+ cancellation_state state;
+ bool throw_if_cancelled_ = true;
+
+ void reset_cancellation_state()
+ {
+ state = cancellation_state(slot);
+ }
+
+ template <typename Filter>
+ void reset_cancellation_state(Filter&& filter)
+ {
+ state = cancellation_state(slot, static_cast<Filter&&>(filter));
+ }
+
+ template <typename InFilter, typename OutFilter>
+ void reset_cancellation_state(InFilter&& in_filter,
+ OutFilter&& out_filter)
+ {
+ state = cancellation_state(slot,
+ static_cast<InFilter&&>(in_filter),
+ static_cast<OutFilter&&>(out_filter));
+ }
+
+ bool throw_if_cancelled() const
+ {
+ return throw_if_cancelled_;
+ }
+
+ void throw_if_cancelled(bool value)
+ {
+ throw_if_cancelled_ = value;
+ }
+};
+
+template <typename Signature, typename Return,
+ typename Executor, typename Allocator>
+struct coro_promise;
+
+template <typename T>
+struct is_noexcept : std::false_type
+{
+};
+
+template <typename Return, typename... Args>
+struct is_noexcept<Return(Args...)> : std::false_type
+{
+};
+
+template <typename Return, typename... Args>
+struct is_noexcept<Return(Args...) noexcept> : std::true_type
+{
+};
+
+template <typename T>
+constexpr bool is_noexcept_v = is_noexcept<T>::value;
+
+template <typename T>
+struct coro_error;
+
+template <>
+struct coro_error<asio::error_code>
+{
+ static asio::error_code invalid()
+ {
+ return asio::error::fault;
+ }
+
+ static asio::error_code cancelled()
+ {
+ return asio::error::operation_aborted;
+ }
+
+ static asio::error_code interrupted()
+ {
+ return asio::error::interrupted;
+ }
+
+ static asio::error_code done()
+ {
+ return asio::error::broken_pipe;
+ }
+};
+
+template <>
+struct coro_error<std::exception_ptr>
+{
+ static std::exception_ptr invalid()
+ {
+ return std::make_exception_ptr(
+ asio::system_error(
+ coro_error<asio::error_code>::invalid()));
+ }
+
+ static std::exception_ptr cancelled()
+ {
+ return std::make_exception_ptr(
+ asio::system_error(
+ coro_error<asio::error_code>::cancelled()));
+ }
+
+ static std::exception_ptr interrupted()
+ {
+ return std::make_exception_ptr(
+ asio::system_error(
+ coro_error<asio::error_code>::interrupted()));
+ }
+
+ static std::exception_ptr done()
+ {
+ return std::make_exception_ptr(
+ asio::system_error(
+ coro_error<asio::error_code>::done()));
+ }
+};
+
+template <typename T, typename Coroutine >
+struct coro_with_arg
+{
+ using coro_t = Coroutine;
+ T value;
+ coro_t& coro;
+
+ struct awaitable_t
+ {
+ T value;
+ coro_t& coro;
+
+ constexpr static bool await_ready() { return false; }
+
+ template <typename Y, typename R, typename E, typename A>
+ auto await_suspend(coroutine_handle<coro_promise<Y, R, E, A>> h)
+ -> coroutine_handle<>
+ {
+ auto& hp = h.promise();
+
+ if constexpr (!coro_promise<Y, R, E, A>::is_noexcept)
+ {
+ if ((hp.cancel->state.cancelled() != cancellation_type::none)
+ && hp.cancel->throw_if_cancelled_)
+ {
+ asio::detail::throw_error(
+ asio::error::operation_aborted, "coro-cancelled");
+ }
+ }
+
+ if (hp.get_executor() == coro.get_executor())
+ {
+ coro.coro_->awaited_from = h;
+ coro.coro_->reset_error();
+ coro.coro_->input_ = std::move(value);
+ coro.coro_->cancel = hp.cancel;
+ return coro.coro_->get_handle();
+ }
+ else
+ {
+ coro.coro_->awaited_from =
+ dispatch_coroutine(
+ asio::prefer(hp.get_executor(),
+ execution::outstanding_work.tracked),
+ [h]() mutable { h.resume(); }).handle;
+
+ coro.coro_->reset_error();
+ coro.coro_->input_ = std::move(value);
+
+ struct cancel_handler
+ {
+ using src = std::pair<cancellation_signal,
+ detail::coro_cancellation_source>;
+
+ std::shared_ptr<src> st = std::make_shared<src>();
+
+ cancel_handler(E e, coro_t& coro) : e(e), coro_(coro.coro_)
+ {
+ st->second.state =
+ cancellation_state(st->second.slot = st->first.slot());
+ }
+
+ E e;
+ typename coro_t::promise_type* coro_;
+
+ void operator()(cancellation_type ct)
+ {
+ asio::dispatch(e, [ct, st = st]() mutable
+ {
+ auto & [sig, state] = *st;
+ sig.emit(ct);
+ });
+ }
+ };
+
+ if (hp.cancel->state.slot().is_connected())
+ {
+ hp.cancel->state.slot().template emplace<cancel_handler>(
+ coro.get_executor(), coro);
+ }
+
+ auto hh = detail::coroutine_handle<
+ typename coro_t::promise_type>::from_promise(*coro.coro_);
+
+ return dispatch_coroutine(
+ coro.coro_->get_executor(), [hh]() mutable { hh.resume(); }).handle;
+ }
+ }
+
+ auto await_resume() -> typename coro_t::result_type
+ {
+ coro.coro_->cancel = nullptr;
+ coro.coro_->rethrow_if();
+ return std::move(coro.coro_->result_);
+ }
+ };
+
+ template <typename CompletionToken>
+ auto async_resume(CompletionToken&& token) &&
+ {
+ return coro.async_resume(std::move(value),
+ std::forward<CompletionToken>(token));
+ }
+
+ auto operator co_await() &&
+ {
+ return awaitable_t{std::move(value), coro};
+ }
+};
+
+template <bool IsNoexcept>
+struct coro_promise_error;
+
+template <>
+struct coro_promise_error<false>
+{
+ std::exception_ptr error_;
+
+ void reset_error()
+ {
+ error_ = std::exception_ptr{};
+ }
+
+ void unhandled_exception()
+ {
+ error_ = std::current_exception();
+ }
+
+ void rethrow_if()
+ {
+ if (error_)
+ std::rethrow_exception(error_);
+ }
+};
+
+#if defined(__GNUC__)
+# pragma GCC diagnostic push
+# if defined(__clang__)
+# pragma GCC diagnostic ignored "-Wexceptions"
+# else
+# pragma GCC diagnostic ignored "-Wterminate"
+# endif
+#elif defined(_MSC_VER)
+# pragma warning(push)
+# pragma warning (disable:4297)
+#endif
+
+template <>
+struct coro_promise_error<true>
+{
+ void reset_error()
+ {
+ }
+
+ void unhandled_exception() noexcept
+ {
+ throw;
+ }
+
+ void rethrow_if()
+ {
+ }
+};
+
+#if defined(__GNUC__)
+# pragma GCC diagnostic pop
+#elif defined(_MSC_VER)
+# pragma warning(pop)
+#endif
+
+template <typename T = void>
+struct yield_input
+{
+ T& value;
+ coroutine_handle<> awaited_from{noop_coroutine()};
+
+ bool await_ready() const noexcept
+ {
+ return false;
+ }
+
+ template <typename U>
+ coroutine_handle<> await_suspend(coroutine_handle<U>) noexcept
+ {
+ return std::exchange(awaited_from, noop_coroutine());
+ }
+
+ T await_resume() const noexcept
+ {
+ return std::move(value);
+ }
+};
+
+template <>
+struct yield_input<void>
+{
+ coroutine_handle<> awaited_from{noop_coroutine()};
+
+ bool await_ready() const noexcept
+ {
+ return false;
+ }
+
+ auto await_suspend(coroutine_handle<>) noexcept
+ {
+ return std::exchange(awaited_from, noop_coroutine());
+ }
+
+ constexpr void await_resume() const noexcept
+ {
+ }
+};
+
+struct coro_awaited_from
+{
+ coroutine_handle<> awaited_from{noop_coroutine()};
+
+ auto final_suspend() noexcept
+ {
+ struct suspendor
+ {
+ coroutine_handle<> awaited_from;
+
+ constexpr static bool await_ready() noexcept
+ {
+ return false;
+ }
+
+ auto await_suspend(coroutine_handle<>) noexcept
+ {
+ return std::exchange(awaited_from, noop_coroutine());
+ }
+
+ constexpr static void await_resume() noexcept
+ {
+ }
+ };
+
+ return suspendor{std::exchange(awaited_from, noop_coroutine())};
+ }
+
+ ~coro_awaited_from()
+ {
+ awaited_from.resume();
+ }//must be on the right executor
+};
+
+template <typename Yield, typename Input, typename Return>
+struct coro_promise_exchange : coro_awaited_from
+{
+ using result_type = coro_result_t<Yield, Return>;
+
+ result_type result_;
+ Input input_;
+
+ auto yield_value(Yield&& y)
+ {
+ result_ = std::move(y);
+ return yield_input<Input>{std::move(input_),
+ std::exchange(awaited_from, noop_coroutine())};
+ }
+
+ auto yield_value(const Yield& y)
+ {
+ result_ = y;
+ return yield_input<Input>{std::move(input_),
+ std::exchange(awaited_from, noop_coroutine())};
+ }
+
+ void return_value(const Return& r)
+ {
+ result_ = r;
+ }
+
+ void return_value(Return&& r)
+ {
+ result_ = std::move(r);
+ }
+};
+
+template <typename YieldReturn>
+struct coro_promise_exchange<YieldReturn, void, YieldReturn> : coro_awaited_from
+{
+ using result_type = coro_result_t<YieldReturn, YieldReturn>;
+
+ result_type result_;
+
+ auto yield_value(const YieldReturn& y)
+ {
+ result_ = y;
+ return yield_input<void>{std::exchange(awaited_from, noop_coroutine())};
+ }
+
+ auto yield_value(YieldReturn&& y)
+ {
+ result_ = std::move(y);
+ return yield_input<void>{std::exchange(awaited_from, noop_coroutine())};
+ }
+
+ void return_value(const YieldReturn& r)
+ {
+ result_ = r;
+ }
+
+ void return_value(YieldReturn&& r)
+ {
+ result_ = std::move(r);
+ }
+};
+
+template <typename Yield, typename Return>
+struct coro_promise_exchange<Yield, void, Return> : coro_awaited_from
+{
+ using result_type = coro_result_t<Yield, Return>;
+
+ result_type result_;
+
+ auto yield_value(const Yield& y)
+ {
+ result_.template emplace<0>(y);
+ return yield_input<void>{std::exchange(awaited_from, noop_coroutine())};
+ }
+
+ auto yield_value(Yield&& y)
+ {
+ result_.template emplace<0>(std::move(y));
+ return yield_input<void>{std::exchange(awaited_from, noop_coroutine())};
+ }
+
+ void return_value(const Return& r)
+ {
+ result_.template emplace<1>(r);
+ }
+
+ void return_value(Return&& r)
+ {
+ result_.template emplace<1>(std::move(r));
+ }
+};
+
+template <typename Yield, typename Input>
+struct coro_promise_exchange<Yield, Input, void> : coro_awaited_from
+{
+ using result_type = coro_result_t<Yield, void>;
+
+ result_type result_;
+ Input input_;
+
+ auto yield_value(Yield&& y)
+ {
+ result_ = std::move(y);
+ return yield_input<Input>{input_,
+ std::exchange(awaited_from, noop_coroutine())};
+ }
+
+ auto yield_value(const Yield& y)
+ {
+ result_ = y;
+ return yield_input<Input>{input_,
+ std::exchange(awaited_from, noop_coroutine())};
+ }
+
+ void return_void()
+ {
+ result_.reset();
+ }
+};
+
+template <typename Return>
+struct coro_promise_exchange<void, void, Return> : coro_awaited_from
+{
+ using result_type = coro_result_t<void, Return>;
+
+ result_type result_;
+
+ void yield_value();
+
+ void return_value(const Return& r)
+ {
+ result_ = r;
+ }
+
+ void return_value(Return&& r)
+ {
+ result_ = std::move(r);
+ }
+};
+
+template <>
+struct coro_promise_exchange<void, void, void> : coro_awaited_from
+{
+ void return_void() {}
+
+ void yield_value();
+};
+
+template <typename Yield>
+struct coro_promise_exchange<Yield, void, void> : coro_awaited_from
+{
+ using result_type = coro_result_t<Yield, void>;
+
+ result_type result_;
+
+ auto yield_value(const Yield& y)
+ {
+ result_ = y;
+ return yield_input<void>{std::exchange(awaited_from, noop_coroutine())};
+ }
+
+ auto yield_value(Yield&& y)
+ {
+ result_ = std::move(y);
+ return yield_input<void>{std::exchange(awaited_from, noop_coroutine())};
+ }
+
+ void return_void()
+ {
+ result_.reset();
+ }
+};
+
+template <typename Yield, typename Return,
+ typename Executor, typename Allocator>
+struct coro_promise final :
+ coro_promise_allocator<Allocator>,
+ coro_promise_error<coro_traits<Yield, Return, Executor>::is_noexcept>,
+ coro_promise_exchange<
+ typename coro_traits<Yield, Return, Executor>::yield_type,
+ typename coro_traits<Yield, Return, Executor>::input_type,
+ typename coro_traits<Yield, Return, Executor>::return_type>
+{
+ using coro_type = coro<Yield, Return, Executor, Allocator>;
+
+ auto handle()
+ {
+ return coroutine_handle<coro_promise>::from_promise(this);
+ }
+
+ using executor_type = Executor;
+
+ executor_type executor_;
+
+ std::optional<coro_cancellation_source> cancel_source;
+ coro_cancellation_source * cancel;
+
+ using cancellation_slot_type = asio::cancellation_slot;
+
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return cancel ? cancel->slot : cancellation_slot_type{};
+ }
+
+ using allocator_type =
+ typename std::allocator_traits<associated_allocator_t<Executor>>::
+ template rebind_alloc<std::byte>;
+ using traits = coro_traits<Yield, Return, Executor>;
+
+ using input_type = typename traits::input_type;
+ using yield_type = typename traits::yield_type;
+ using return_type = typename traits::return_type;
+ using error_type = typename traits::error_type;
+ using result_type = typename traits::result_type;
+ constexpr static bool is_noexcept = traits::is_noexcept;
+
+ auto get_executor() const -> Executor
+ {
+ return executor_;
+ }
+
+ auto get_handle()
+ {
+ return coroutine_handle<coro_promise>::from_promise(*this);
+ }
+
+ template <typename... Args>
+ coro_promise(Executor executor, Args&&... args) noexcept
+ : coro_promise_allocator<Allocator>(
+ executor, std::forward<Args>(args)...),
+ executor_(std::move(executor))
+ {
+ }
+
+ template <typename First, typename... Args>
+ coro_promise(First&& f, Executor executor, Args&&... args) noexcept
+ : coro_promise_allocator<Allocator>(
+ f, executor, std::forward<Args>(args)...),
+ executor_(std::move(executor))
+ {
+ }
+
+ template <typename First, detail::execution_context Context, typename... Args>
+ coro_promise(First&& f, Context&& ctx, Args&&... args) noexcept
+ : coro_promise_allocator<Allocator>(
+ f, ctx, std::forward<Args>(args)...),
+ executor_(ctx.get_executor())
+ {
+ }
+
+ template <detail::execution_context Context, typename... Args>
+ coro_promise(Context&& ctx, Args&&... args) noexcept
+ : coro_promise_allocator<Allocator>(
+ ctx, std::forward<Args>(args)...),
+ executor_(ctx.get_executor())
+ {
+ }
+
+ auto get_return_object()
+ {
+ return coro<Yield, Return, Executor, Allocator>{this};
+ }
+
+ auto initial_suspend() noexcept
+ {
+ return suspend_always{};
+ }
+
+ using coro_promise_exchange<
+ typename coro_traits<Yield, Return, Executor>::yield_type,
+ typename coro_traits<Yield, Return, Executor>::input_type,
+ typename coro_traits<Yield, Return, Executor>::return_type>::yield_value;
+
+ auto await_transform(this_coro::executor_t) const
+ {
+ struct exec_helper
+ {
+ const executor_type& value;
+
+ constexpr static bool await_ready() noexcept
+ {
+ return true;
+ }
+
+ constexpr static void await_suspend(coroutine_handle<>) noexcept
+ {
+ }
+
+ executor_type await_resume() const noexcept
+ {
+ return value;
+ }
+ };
+
+ return exec_helper{executor_};
+ }
+
+ auto await_transform(this_coro::cancellation_state_t) const
+ {
+ struct exec_helper
+ {
+ const asio::cancellation_state& value;
+
+ constexpr static bool await_ready() noexcept
+ {
+ return true;
+ }
+
+ constexpr static void await_suspend(coroutine_handle<>) noexcept
+ {
+ }
+
+ asio::cancellation_state await_resume() const noexcept
+ {
+ return value;
+ }
+ };
+ assert(cancel);
+ return exec_helper{cancel->state};
+ }
+
+ // This await transformation resets the associated cancellation state.
+ auto await_transform(this_coro::reset_cancellation_state_0_t) noexcept
+ {
+ struct result
+ {
+ detail::coro_cancellation_source * src_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ auto await_resume() const
+ {
+ return src_->reset_cancellation_state();
+ }
+ };
+
+ return result{cancel};
+ }
+
+ // This await transformation resets the associated cancellation state.
+ template <typename Filter>
+ auto await_transform(
+ this_coro::reset_cancellation_state_1_t<Filter> reset) noexcept
+ {
+ struct result
+ {
+ detail::coro_cancellation_source* src_;
+ Filter filter_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ auto await_resume()
+ {
+ return src_->reset_cancellation_state(
+ static_cast<Filter&&>(filter_));
+ }
+ };
+
+ return result{cancel, static_cast<Filter&&>(reset.filter)};
+ }
+
+ // This await transformation resets the associated cancellation state.
+ template <typename InFilter, typename OutFilter>
+ auto await_transform(
+ this_coro::reset_cancellation_state_2_t<InFilter, OutFilter> reset)
+ noexcept
+ {
+ struct result
+ {
+ detail::coro_cancellation_source* src_;
+ InFilter in_filter_;
+ OutFilter out_filter_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ auto await_resume()
+ {
+ return src_->reset_cancellation_state(
+ static_cast<InFilter&&>(in_filter_),
+ static_cast<OutFilter&&>(out_filter_));
+ }
+ };
+
+ return result{cancel,
+ static_cast<InFilter&&>(reset.in_filter),
+ static_cast<OutFilter&&>(reset.out_filter)};
+ }
+
+ // This await transformation determines whether cancellation is propagated as
+ // an exception.
+ auto await_transform(this_coro::throw_if_cancelled_0_t) noexcept
+ requires (!is_noexcept)
+ {
+ struct result
+ {
+ detail::coro_cancellation_source* src_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ auto await_resume()
+ {
+ return src_->throw_if_cancelled();
+ }
+ };
+
+ return result{cancel};
+ }
+
+ // This await transformation sets whether cancellation is propagated as an
+ // exception.
+ auto await_transform(
+ this_coro::throw_if_cancelled_1_t throw_if_cancelled) noexcept
+ requires (!is_noexcept)
+ {
+ struct result
+ {
+ detail::coro_cancellation_source* src_;
+ bool value_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ auto await_resume()
+ {
+ src_->throw_if_cancelled(value_);
+ }
+ };
+
+ return result{cancel, throw_if_cancelled.value};
+ }
+
+ template <typename Yield_, typename Return_,
+ typename Executor_, typename Allocator_>
+ auto await_transform(coro<Yield_, Return_, Executor_, Allocator_>& kr)
+ -> decltype(auto)
+ {
+ return kr;
+ }
+
+ template <typename Yield_, typename Return_,
+ typename Executor_, typename Allocator_>
+ auto await_transform(coro<Yield_, Return_, Executor_, Allocator_>&& kr)
+ {
+ return std::move(kr);
+ }
+
+ template <typename T_, typename Coroutine >
+ auto await_transform(coro_with_arg<T_, Coroutine>&& kr) -> decltype(auto)
+ {
+ return std::move(kr);
+ }
+
+ template <typename T_>
+ requires requires(T_ t) {{ t.async_wait(deferred) }; }
+ auto await_transform(T_& t) -> decltype(auto)
+ {
+ return await_transform(t.async_wait(deferred));
+ }
+
+ template <typename Op>
+ auto await_transform(Op&& op,
+ constraint_t<is_async_operation<Op>::value> = 0)
+ {
+ if ((cancel->state.cancelled() != cancellation_type::none)
+ && cancel->throw_if_cancelled_)
+ {
+ asio::detail::throw_error(
+ asio::error::operation_aborted, "coro-cancelled");
+ }
+ using signature = completion_signature_of_t<Op>;
+ using result_type = detail::coro_completion_handler_type_t<signature>;
+ using handler_type =
+ typename detail::coro_completion_handler_type<signature>::template
+ completion_handler<coro_promise>;
+
+ struct aw_t
+ {
+ Op op;
+ std::optional<result_type> result;
+
+ constexpr static bool await_ready()
+ {
+ return false;
+ }
+
+ void await_suspend(coroutine_handle<coro_promise> h)
+ {
+ std::move(op)(handler_type{h, result});
+ }
+
+ auto await_resume()
+ {
+ if constexpr (is_noexcept)
+ {
+ if constexpr (std::tuple_size_v<result_type> == 0u)
+ return;
+ else if constexpr (std::tuple_size_v<result_type> == 1u)
+ return std::get<0>(std::move(result).value());
+ else
+ return std::move(result).value();
+ }
+ else
+ return detail::coro_interpret_result(std::move(result).value());
+ }
+ };
+
+ return aw_t{std::move(op), {}};
+ }
+};
+
+} // namespace detail
+
+template <typename Yield, typename Return,
+ typename Executor, typename Allocator>
+struct coro<Yield, Return, Executor, Allocator>::awaitable_t
+{
+ coro& coro_;
+
+ constexpr static bool await_ready() { return false; }
+
+ template <typename Y, typename R, typename E, typename A>
+ auto await_suspend(
+ detail::coroutine_handle<detail::coro_promise<Y, R, E, A>> h)
+ -> detail::coroutine_handle<>
+ {
+ auto& hp = h.promise();
+
+ if constexpr (!detail::coro_promise<Y, R, E, A>::is_noexcept)
+ {
+ if ((hp.cancel->state.cancelled() != cancellation_type::none)
+ && hp.cancel->throw_if_cancelled_)
+ {
+ asio::detail::throw_error(
+ asio::error::operation_aborted, "coro-cancelled");
+ }
+ }
+
+ if (hp.get_executor() == coro_.get_executor())
+ {
+ coro_.coro_->awaited_from = h;
+ coro_.coro_->cancel = hp.cancel;
+ coro_.coro_->reset_error();
+
+ return coro_.coro_->get_handle();
+ }
+ else
+ {
+ coro_.coro_->awaited_from = detail::dispatch_coroutine(
+ asio::prefer(hp.get_executor(),
+ execution::outstanding_work.tracked),
+ [h]() mutable
+ {
+ h.resume();
+ }).handle;
+
+ coro_.coro_->reset_error();
+
+ struct cancel_handler
+ {
+ std::shared_ptr<std::pair<cancellation_signal,
+ detail::coro_cancellation_source>> st = std::make_shared<
+ std::pair<cancellation_signal, detail::coro_cancellation_source>>();
+
+ cancel_handler(E e, coro& coro) : e(e), coro_(coro.coro_)
+ {
+ st->second.state = cancellation_state(
+ st->second.slot = st->first.slot());
+ }
+
+ E e;
+ typename coro::promise_type* coro_;
+
+ void operator()(cancellation_type ct)
+ {
+ asio::dispatch(e,
+ [ct, st = st]() mutable
+ {
+ auto & [sig, state] = *st;
+ sig.emit(ct);
+ });
+ }
+ };
+
+ if (hp.cancel->state.slot().is_connected())
+ {
+ hp.cancel->state.slot().template emplace<cancel_handler>(
+ coro_.get_executor(), coro_);
+ }
+
+ auto hh = detail::coroutine_handle<
+ detail::coro_promise<Yield, Return, Executor, Allocator>>::from_promise(
+ *coro_.coro_);
+
+ return detail::dispatch_coroutine(
+ coro_.coro_->get_executor(),
+ [hh]() mutable { hh.resume(); }).handle;
+ }
+ }
+
+ auto await_resume() -> result_type
+ {
+ coro_.coro_->cancel = nullptr;
+ coro_.coro_->rethrow_if();
+ if constexpr (!std::is_void_v<result_type>)
+ return std::move(coro_.coro_->result_);
+ }
+};
+
+template <typename Yield, typename Return,
+ typename Executor, typename Allocator>
+struct coro<Yield, Return, Executor, Allocator>::initiate_async_resume
+{
+ typedef Executor executor_type;
+ typedef Allocator allocator_type;
+ typedef asio::cancellation_slot cancellation_slot_type;
+
+ explicit initiate_async_resume(coro* self)
+ : coro_(self->coro_)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return coro_->get_executor();
+ }
+
+ allocator_type get_allocator() const noexcept
+ {
+ return coro_->get_allocator();
+ }
+
+ template <typename E, typename WaitHandler>
+ auto handle(E exec, WaitHandler&& handler,
+ std::true_type /* error is noexcept */,
+ std::true_type /* result is void */) //noexcept
+ {
+ return [this, the_coro = coro_,
+ h = std::forward<WaitHandler>(handler),
+ exec = std::move(exec)]() mutable
+ {
+ assert(the_coro);
+
+ auto ch = detail::coroutine_handle<promise_type>::from_promise(*the_coro);
+ assert(ch && !ch.done());
+
+ the_coro->awaited_from = post_coroutine(std::move(exec), std::move(h));
+ the_coro->reset_error();
+ ch.resume();
+ };
+ }
+
+ template <typename E, typename WaitHandler>
+ requires (!std::is_void_v<result_type>)
+ auto handle(E exec, WaitHandler&& handler,
+ std::true_type /* error is noexcept */,
+ std::false_type /* result is void */) //noexcept
+ {
+ return [the_coro = coro_,
+ h = std::forward<WaitHandler>(handler),
+ exec = std::move(exec)]() mutable
+ {
+ assert(the_coro);
+
+ auto ch = detail::coroutine_handle<promise_type>::from_promise(*the_coro);
+ assert(ch && !ch.done());
+
+ the_coro->awaited_from = detail::post_coroutine(
+ exec, std::move(h), the_coro->result_).handle;
+ the_coro->reset_error();
+ ch.resume();
+ };
+ }
+
+ template <typename E, typename WaitHandler>
+ auto handle(E exec, WaitHandler&& handler,
+ std::false_type /* error is noexcept */,
+ std::true_type /* result is void */)
+ {
+ return [the_coro = coro_,
+ h = std::forward<WaitHandler>(handler),
+ exec = std::move(exec)]() mutable
+ {
+ if (!the_coro)
+ return asio::post(exec,
+ asio::append(std::move(h),
+ detail::coro_error<error_type>::invalid()));
+
+ auto ch = detail::coroutine_handle<promise_type>::from_promise(*the_coro);
+ if (!ch)
+ return asio::post(exec,
+ asio::append(std::move(h),
+ detail::coro_error<error_type>::invalid()));
+ else if (ch.done())
+ return asio::post(exec,
+ asio::append(std::move(h),
+ detail::coro_error<error_type>::done()));
+ else
+ {
+ the_coro->awaited_from = detail::post_coroutine(
+ exec, std::move(h), the_coro->error_).handle;
+ the_coro->reset_error();
+ ch.resume();
+ }
+ };
+ }
+
+ template <typename E, typename WaitHandler>
+ auto handle(E exec, WaitHandler&& handler,
+ std::false_type /* error is noexcept */,
+ std::false_type /* result is void */)
+ {
+ return [the_coro = coro_,
+ h = std::forward<WaitHandler>(handler),
+ exec = std::move(exec)]() mutable
+ {
+ if (!the_coro)
+ return asio::post(exec,
+ asio::append(std::move(h),
+ detail::coro_error<error_type>::invalid(), result_type{}));
+
+ auto ch =
+ detail::coroutine_handle<promise_type>::from_promise(*the_coro);
+ if (!ch)
+ return asio::post(exec,
+ asio::append(std::move(h),
+ detail::coro_error<error_type>::invalid(), result_type{}));
+ else if (ch.done())
+ return asio::post(exec,
+ asio::append(std::move(h),
+ detail::coro_error<error_type>::done(), result_type{}));
+ else
+ {
+ the_coro->awaited_from = detail::post_coroutine(
+ exec, std::move(h), the_coro->error_, the_coro->result_).handle;
+ the_coro->reset_error();
+ ch.resume();
+ }
+ };
+ }
+
+ template <typename WaitHandler>
+ void operator()(WaitHandler&& handler)
+ {
+ const auto exec = asio::prefer(
+ get_associated_executor(handler, get_executor()),
+ execution::outstanding_work.tracked);
+
+ coro_->cancel = &coro_->cancel_source.emplace();
+ coro_->cancel->state = cancellation_state(
+ coro_->cancel->slot = get_associated_cancellation_slot(handler));
+ asio::dispatch(get_executor(),
+ handle(exec, std::forward<WaitHandler>(handler),
+ std::integral_constant<bool, is_noexcept>{},
+ std::is_void<result_type>{}));
+ }
+
+ template <typename WaitHandler, typename Input>
+ void operator()(WaitHandler&& handler, Input&& input)
+ {
+ const auto exec = asio::prefer(
+ get_associated_executor(handler, get_executor()),
+ execution::outstanding_work.tracked);
+
+ coro_->cancel = &coro_->cancel_source.emplace();
+ coro_->cancel->state = cancellation_state(
+ coro_->cancel->slot = get_associated_cancellation_slot(handler));
+ asio::dispatch(get_executor(),
+ [h = handle(exec, std::forward<WaitHandler>(handler),
+ std::integral_constant<bool, is_noexcept>{},
+ std::is_void<result_type>{}),
+ in = std::forward<Input>(input), the_coro = coro_]() mutable
+ {
+ the_coro->input_ = std::move(in);
+ std::move(h)();
+ });
+ }
+
+private:
+ typename coro::promise_type* coro_;
+};
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_IMPL_CORO_HPP
diff --git a/3rdparty/asio/include/asio/experimental/impl/parallel_group.hpp b/3rdparty/asio/include/asio/experimental/impl/parallel_group.hpp
new file mode 100644
index 00000000000..75e8a151876
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/impl/parallel_group.hpp
@@ -0,0 +1,788 @@
+//
+// experimental/impl/parallel_group.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_EXPERIMENTAL_PARALLEL_GROUP_HPP
+#define ASIO_IMPL_EXPERIMENTAL_PARALLEL_GROUP_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <atomic>
+#include <deque>
+#include <memory>
+#include <new>
+#include <tuple>
+#include "asio/associated_cancellation_slot.hpp"
+#include "asio/detail/recycling_allocator.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/dispatch.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+// Stores the result from an individual asynchronous operation.
+template <typename T, typename = void>
+struct parallel_group_op_result
+{
+public:
+ parallel_group_op_result()
+ : has_value_(false)
+ {
+ }
+
+ parallel_group_op_result(parallel_group_op_result&& other)
+ : has_value_(other.has_value_)
+ {
+ if (has_value_)
+ new (&u_.value_) T(std::move(other.get()));
+ }
+
+ ~parallel_group_op_result()
+ {
+ if (has_value_)
+ u_.value_.~T();
+ }
+
+ T& get() noexcept
+ {
+ return u_.value_;
+ }
+
+ template <typename... Args>
+ void emplace(Args&&... args)
+ {
+ new (&u_.value_) T(std::forward<Args>(args)...);
+ has_value_ = true;
+ }
+
+private:
+ union u
+ {
+ u() {}
+ ~u() {}
+ char c_;
+ T value_;
+ } u_;
+ bool has_value_;
+};
+
+// Proxy completion handler for the group of parallel operatations. Unpacks and
+// concatenates the individual operations' results, and invokes the user's
+// completion handler.
+template <typename Handler, typename... Ops>
+struct parallel_group_completion_handler
+{
+ typedef decay_t<
+ prefer_result_t<
+ associated_executor_t<Handler>,
+ execution::outstanding_work_t::tracked_t
+ >
+ > executor_type;
+
+ parallel_group_completion_handler(Handler&& h)
+ : handler_(std::move(h)),
+ executor_(
+ asio::prefer(
+ asio::get_associated_executor(handler_),
+ execution::outstanding_work.tracked))
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return executor_;
+ }
+
+ void operator()()
+ {
+ this->invoke(asio::detail::make_index_sequence<sizeof...(Ops)>());
+ }
+
+ template <std::size_t... I>
+ void invoke(asio::detail::index_sequence<I...>)
+ {
+ this->invoke(std::tuple_cat(std::move(std::get<I>(args_).get())...));
+ }
+
+ template <typename... Args>
+ void invoke(std::tuple<Args...>&& args)
+ {
+ this->invoke(std::move(args),
+ asio::detail::index_sequence_for<Args...>());
+ }
+
+ template <typename... Args, std::size_t... I>
+ void invoke(std::tuple<Args...>&& args,
+ asio::detail::index_sequence<I...>)
+ {
+ std::move(handler_)(completion_order_, std::move(std::get<I>(args))...);
+ }
+
+ Handler handler_;
+ executor_type executor_;
+ std::array<std::size_t, sizeof...(Ops)> completion_order_{};
+ std::tuple<
+ parallel_group_op_result<
+ typename parallel_op_signature_as_tuple<
+ completion_signature_of_t<Ops>
+ >::type
+ >...
+ > args_{};
+};
+
+// Shared state for the parallel group.
+template <typename Condition, typename Handler, typename... Ops>
+struct parallel_group_state
+{
+ parallel_group_state(Condition&& c, Handler&& h)
+ : cancellation_condition_(std::move(c)),
+ handler_(std::move(h))
+ {
+ }
+
+ // The number of operations that have completed so far. Used to determine the
+ // order of completion.
+ std::atomic<unsigned int> completed_{0};
+
+ // The non-none cancellation type that resulted from a cancellation condition.
+ // Stored here for use by the group's initiating function.
+ std::atomic<cancellation_type_t> cancel_type_{cancellation_type::none};
+
+ // The number of cancellations that have been requested, either on completion
+ // of the operations within the group, or via the cancellation slot for the
+ // group operation. Initially set to the number of operations to prevent
+ // cancellation signals from being emitted until after all of the group's
+ // operations' initiating functions have completed.
+ std::atomic<unsigned int> cancellations_requested_{sizeof...(Ops)};
+
+ // The number of operations that are yet to complete. Used to determine when
+ // it is safe to invoke the user's completion handler.
+ std::atomic<unsigned int> outstanding_{sizeof...(Ops)};
+
+ // The cancellation signals for each operation in the group.
+ asio::cancellation_signal cancellation_signals_[sizeof...(Ops)];
+
+ // The cancellation condition is used to determine whether the results from an
+ // individual operation warrant a cancellation request for the whole group.
+ Condition cancellation_condition_;
+
+ // The proxy handler to be invoked once all operations in the group complete.
+ parallel_group_completion_handler<Handler, Ops...> handler_;
+};
+
+// Handler for an individual operation within the parallel group.
+template <std::size_t I, typename Condition, typename Handler, typename... Ops>
+struct parallel_group_op_handler
+{
+ typedef asio::cancellation_slot cancellation_slot_type;
+
+ parallel_group_op_handler(
+ std::shared_ptr<parallel_group_state<Condition, Handler, Ops...>> state)
+ : state_(std::move(state))
+ {
+ }
+
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return state_->cancellation_signals_[I].slot();
+ }
+
+ template <typename... Args>
+ void operator()(Args... args)
+ {
+ // Capture this operation into the completion order.
+ state_->handler_.completion_order_[state_->completed_++] = I;
+
+ // Determine whether the results of this operation require cancellation of
+ // the whole group.
+ cancellation_type_t cancel_type = state_->cancellation_condition_(args...);
+
+ // Capture the result of the operation into the proxy completion handler.
+ std::get<I>(state_->handler_.args_).emplace(std::move(args)...);
+
+ if (cancel_type != cancellation_type::none)
+ {
+ // Save the type for potential use by the group's initiating function.
+ state_->cancel_type_ = cancel_type;
+
+ // If we are the first operation to request cancellation, emit a signal
+ // for each operation in the group.
+ if (state_->cancellations_requested_++ == 0)
+ for (std::size_t i = 0; i < sizeof...(Ops); ++i)
+ if (i != I)
+ state_->cancellation_signals_[i].emit(cancel_type);
+ }
+
+ // If this is the last outstanding operation, invoke the user's handler.
+ if (--state_->outstanding_ == 0)
+ asio::dispatch(std::move(state_->handler_));
+ }
+
+ std::shared_ptr<parallel_group_state<Condition, Handler, Ops...>> state_;
+};
+
+// Handler for an individual operation within the parallel group that has an
+// explicitly specified executor.
+template <typename Executor, std::size_t I,
+ typename Condition, typename Handler, typename... Ops>
+struct parallel_group_op_handler_with_executor :
+ parallel_group_op_handler<I, Condition, Handler, Ops...>
+{
+ typedef parallel_group_op_handler<I, Condition, Handler, Ops...> base_type;
+ typedef asio::cancellation_slot cancellation_slot_type;
+ typedef Executor executor_type;
+
+ parallel_group_op_handler_with_executor(
+ std::shared_ptr<parallel_group_state<Condition, Handler, Ops...>> state,
+ executor_type ex)
+ : parallel_group_op_handler<I, Condition, Handler, Ops...>(std::move(state))
+ {
+ cancel_proxy_ =
+ &this->state_->cancellation_signals_[I].slot().template
+ emplace<cancel_proxy>(this->state_, std::move(ex));
+ }
+
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return cancel_proxy_->signal_.slot();
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return cancel_proxy_->executor_;
+ }
+
+ // Proxy handler that forwards the emitted signal to the correct executor.
+ struct cancel_proxy
+ {
+ cancel_proxy(
+ std::shared_ptr<parallel_group_state<
+ Condition, Handler, Ops...>> state,
+ executor_type ex)
+ : state_(std::move(state)),
+ executor_(std::move(ex))
+ {
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ if (auto state = state_.lock())
+ {
+ asio::cancellation_signal* sig = &signal_;
+ asio::dispatch(executor_,
+ [state, sig, type]{ sig->emit(type); });
+ }
+ }
+
+ std::weak_ptr<parallel_group_state<Condition, Handler, Ops...>> state_;
+ asio::cancellation_signal signal_;
+ executor_type executor_;
+ };
+
+ cancel_proxy* cancel_proxy_;
+};
+
+// Helper to launch an operation using the correct executor, if any.
+template <std::size_t I, typename Op, typename = void>
+struct parallel_group_op_launcher
+{
+ template <typename Condition, typename Handler, typename... Ops>
+ static void launch(Op& op,
+ const std::shared_ptr<parallel_group_state<
+ Condition, Handler, Ops...>>& state)
+ {
+ typedef associated_executor_t<Op> ex_type;
+ ex_type ex = asio::get_associated_executor(op);
+ std::move(op)(
+ parallel_group_op_handler_with_executor<ex_type, I,
+ Condition, Handler, Ops...>(state, std::move(ex)));
+ }
+};
+
+// Specialised launcher for operations that specify no executor.
+template <std::size_t I, typename Op>
+struct parallel_group_op_launcher<I, Op,
+ enable_if_t<
+ is_same<
+ typename associated_executor<
+ Op>::asio_associated_executor_is_unspecialised,
+ void
+ >::value
+ >>
+{
+ template <typename Condition, typename Handler, typename... Ops>
+ static void launch(Op& op,
+ const std::shared_ptr<parallel_group_state<
+ Condition, Handler, Ops...>>& state)
+ {
+ std::move(op)(
+ parallel_group_op_handler<I, Condition, Handler, Ops...>(state));
+ }
+};
+
+template <typename Condition, typename Handler, typename... Ops>
+struct parallel_group_cancellation_handler
+{
+ parallel_group_cancellation_handler(
+ std::shared_ptr<parallel_group_state<Condition, Handler, Ops...>> state)
+ : state_(std::move(state))
+ {
+ }
+
+ void operator()(cancellation_type_t cancel_type)
+ {
+ // If we are the first place to request cancellation, i.e. no operation has
+ // yet completed and requested cancellation, emit a signal for each
+ // operation in the group.
+ if (cancel_type != cancellation_type::none)
+ if (auto state = state_.lock())
+ if (state->cancellations_requested_++ == 0)
+ for (std::size_t i = 0; i < sizeof...(Ops); ++i)
+ state->cancellation_signals_[i].emit(cancel_type);
+ }
+
+ std::weak_ptr<parallel_group_state<Condition, Handler, Ops...>> state_;
+};
+
+template <typename Condition, typename Handler,
+ typename... Ops, std::size_t... I>
+void parallel_group_launch(Condition cancellation_condition, Handler handler,
+ std::tuple<Ops...>& ops, asio::detail::index_sequence<I...>)
+{
+ // Get the user's completion handler's cancellation slot, so that we can allow
+ // cancellation of the entire group.
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // Create the shared state for the operation.
+ typedef parallel_group_state<Condition, Handler, Ops...> state_type;
+ std::shared_ptr<state_type> state = std::allocate_shared<state_type>(
+ asio::detail::recycling_allocator<state_type,
+ asio::detail::thread_info_base::parallel_group_tag>(),
+ std::move(cancellation_condition), std::move(handler));
+
+ // Initiate each individual operation in the group.
+ int fold[] = { 0,
+ ( parallel_group_op_launcher<I, Ops>::launch(std::get<I>(ops), state),
+ 0 )...
+ };
+ (void)fold;
+
+ // Check if any of the operations has already requested cancellation, and if
+ // so, emit a signal for each operation in the group.
+ if ((state->cancellations_requested_ -= sizeof...(Ops)) > 0)
+ for (auto& signal : state->cancellation_signals_)
+ signal.emit(state->cancel_type_);
+
+ // Register a handler with the user's completion handler's cancellation slot.
+ if (slot.is_connected())
+ slot.template emplace<
+ parallel_group_cancellation_handler<
+ Condition, Handler, Ops...>>(state);
+}
+
+// Proxy completion handler for the ranged group of parallel operatations.
+// Unpacks and recombines the individual operations' results, and invokes the
+// user's completion handler.
+template <typename Handler, typename Op, typename Allocator>
+struct ranged_parallel_group_completion_handler
+{
+ typedef decay_t<
+ prefer_result_t<
+ associated_executor_t<Handler>,
+ execution::outstanding_work_t::tracked_t
+ >
+ > executor_type;
+
+ typedef typename parallel_op_signature_as_tuple<
+ completion_signature_of_t<Op>
+ >::type op_tuple_type;
+
+ typedef parallel_group_op_result<op_tuple_type> op_result_type;
+
+ ranged_parallel_group_completion_handler(Handler&& h,
+ std::size_t size, const Allocator& allocator)
+ : handler_(std::move(h)),
+ executor_(
+ asio::prefer(
+ asio::get_associated_executor(handler_),
+ execution::outstanding_work.tracked)),
+ allocator_(allocator),
+ completion_order_(size, 0,
+ ASIO_REBIND_ALLOC(Allocator, std::size_t)(allocator)),
+ args_(ASIO_REBIND_ALLOC(Allocator, op_result_type)(allocator))
+ {
+ for (std::size_t i = 0; i < size; ++i)
+ args_.emplace_back();
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return executor_;
+ }
+
+ void operator()()
+ {
+ this->invoke(
+ asio::detail::make_index_sequence<
+ std::tuple_size<op_tuple_type>::value>());
+ }
+
+ template <std::size_t... I>
+ void invoke(asio::detail::index_sequence<I...>)
+ {
+ typedef typename parallel_op_signature_as_tuple<
+ typename ranged_parallel_group_signature<
+ completion_signature_of_t<Op>,
+ Allocator
+ >::raw_type
+ >::type vectors_type;
+
+ // Construct all result vectors using the supplied allocator.
+ vectors_type vectors{
+ typename std::tuple_element<I, vectors_type>::type(
+ ASIO_REBIND_ALLOC(Allocator, int)(allocator_))...};
+
+ // Reserve sufficient space in each of the result vectors.
+ int reserve_fold[] = { 0,
+ ( std::get<I>(vectors).reserve(completion_order_.size()),
+ 0 )...
+ };
+ (void)reserve_fold;
+
+ // Copy the results from all operations into the result vectors.
+ for (std::size_t idx = 0; idx < completion_order_.size(); ++idx)
+ {
+ int pushback_fold[] = { 0,
+ ( std::get<I>(vectors).push_back(
+ std::move(std::get<I>(args_[idx].get()))),
+ 0 )...
+ };
+ (void)pushback_fold;
+ }
+
+ std::move(handler_)(std::move(completion_order_),
+ std::move(std::get<I>(vectors))...);
+ }
+
+ Handler handler_;
+ executor_type executor_;
+ Allocator allocator_;
+ std::vector<std::size_t,
+ ASIO_REBIND_ALLOC(Allocator, std::size_t)> completion_order_;
+ std::deque<op_result_type,
+ ASIO_REBIND_ALLOC(Allocator, op_result_type)> args_;
+};
+
+// Shared state for the parallel group.
+template <typename Condition, typename Handler, typename Op, typename Allocator>
+struct ranged_parallel_group_state
+{
+ ranged_parallel_group_state(Condition&& c, Handler&& h,
+ std::size_t size, const Allocator& allocator)
+ : cancellations_requested_(size),
+ outstanding_(size),
+ cancellation_signals_(
+ ASIO_REBIND_ALLOC(Allocator,
+ asio::cancellation_signal)(allocator)),
+ cancellation_condition_(std::move(c)),
+ handler_(std::move(h), size, allocator)
+ {
+ for (std::size_t i = 0; i < size; ++i)
+ cancellation_signals_.emplace_back();
+ }
+
+ // The number of operations that have completed so far. Used to determine the
+ // order of completion.
+ std::atomic<unsigned int> completed_{0};
+
+ // The non-none cancellation type that resulted from a cancellation condition.
+ // Stored here for use by the group's initiating function.
+ std::atomic<cancellation_type_t> cancel_type_{cancellation_type::none};
+
+ // The number of cancellations that have been requested, either on completion
+ // of the operations within the group, or via the cancellation slot for the
+ // group operation. Initially set to the number of operations to prevent
+ // cancellation signals from being emitted until after all of the group's
+ // operations' initiating functions have completed.
+ std::atomic<unsigned int> cancellations_requested_;
+
+ // The number of operations that are yet to complete. Used to determine when
+ // it is safe to invoke the user's completion handler.
+ std::atomic<unsigned int> outstanding_;
+
+ // The cancellation signals for each operation in the group.
+ std::deque<asio::cancellation_signal,
+ ASIO_REBIND_ALLOC(Allocator, asio::cancellation_signal)>
+ cancellation_signals_;
+
+ // The cancellation condition is used to determine whether the results from an
+ // individual operation warrant a cancellation request for the whole group.
+ Condition cancellation_condition_;
+
+ // The proxy handler to be invoked once all operations in the group complete.
+ ranged_parallel_group_completion_handler<Handler, Op, Allocator> handler_;
+};
+
+// Handler for an individual operation within the parallel group.
+template <typename Condition, typename Handler, typename Op, typename Allocator>
+struct ranged_parallel_group_op_handler
+{
+ typedef asio::cancellation_slot cancellation_slot_type;
+
+ ranged_parallel_group_op_handler(
+ std::shared_ptr<ranged_parallel_group_state<
+ Condition, Handler, Op, Allocator>> state,
+ std::size_t idx)
+ : state_(std::move(state)),
+ idx_(idx)
+ {
+ }
+
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return state_->cancellation_signals_[idx_].slot();
+ }
+
+ template <typename... Args>
+ void operator()(Args... args)
+ {
+ // Capture this operation into the completion order.
+ state_->handler_.completion_order_[state_->completed_++] = idx_;
+
+ // Determine whether the results of this operation require cancellation of
+ // the whole group.
+ cancellation_type_t cancel_type = state_->cancellation_condition_(args...);
+
+ // Capture the result of the operation into the proxy completion handler.
+ state_->handler_.args_[idx_].emplace(std::move(args)...);
+
+ if (cancel_type != cancellation_type::none)
+ {
+ // Save the type for potential use by the group's initiating function.
+ state_->cancel_type_ = cancel_type;
+
+ // If we are the first operation to request cancellation, emit a signal
+ // for each operation in the group.
+ if (state_->cancellations_requested_++ == 0)
+ for (std::size_t i = 0; i < state_->cancellation_signals_.size(); ++i)
+ if (i != idx_)
+ state_->cancellation_signals_[i].emit(cancel_type);
+ }
+
+ // If this is the last outstanding operation, invoke the user's handler.
+ if (--state_->outstanding_ == 0)
+ asio::dispatch(std::move(state_->handler_));
+ }
+
+ std::shared_ptr<ranged_parallel_group_state<
+ Condition, Handler, Op, Allocator>> state_;
+ std::size_t idx_;
+};
+
+// Handler for an individual operation within the parallel group that has an
+// explicitly specified executor.
+template <typename Executor, typename Condition,
+ typename Handler, typename Op, typename Allocator>
+struct ranged_parallel_group_op_handler_with_executor :
+ ranged_parallel_group_op_handler<Condition, Handler, Op, Allocator>
+{
+ typedef ranged_parallel_group_op_handler<
+ Condition, Handler, Op, Allocator> base_type;
+ typedef asio::cancellation_slot cancellation_slot_type;
+ typedef Executor executor_type;
+
+ ranged_parallel_group_op_handler_with_executor(
+ std::shared_ptr<ranged_parallel_group_state<
+ Condition, Handler, Op, Allocator>> state,
+ executor_type ex, std::size_t idx)
+ : ranged_parallel_group_op_handler<Condition, Handler, Op, Allocator>(
+ std::move(state), idx)
+ {
+ cancel_proxy_ =
+ &this->state_->cancellation_signals_[idx].slot().template
+ emplace<cancel_proxy>(this->state_, std::move(ex));
+ }
+
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return cancel_proxy_->signal_.slot();
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return cancel_proxy_->executor_;
+ }
+
+ // Proxy handler that forwards the emitted signal to the correct executor.
+ struct cancel_proxy
+ {
+ cancel_proxy(
+ std::shared_ptr<ranged_parallel_group_state<
+ Condition, Handler, Op, Allocator>> state,
+ executor_type ex)
+ : state_(std::move(state)),
+ executor_(std::move(ex))
+ {
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ if (auto state = state_.lock())
+ {
+ asio::cancellation_signal* sig = &signal_;
+ asio::dispatch(executor_,
+ [state, sig, type]{ sig->emit(type); });
+ }
+ }
+
+ std::weak_ptr<ranged_parallel_group_state<
+ Condition, Handler, Op, Allocator>> state_;
+ asio::cancellation_signal signal_;
+ executor_type executor_;
+ };
+
+ cancel_proxy* cancel_proxy_;
+};
+
+template <typename Condition, typename Handler, typename Op, typename Allocator>
+struct ranged_parallel_group_cancellation_handler
+{
+ ranged_parallel_group_cancellation_handler(
+ std::shared_ptr<ranged_parallel_group_state<
+ Condition, Handler, Op, Allocator>> state)
+ : state_(std::move(state))
+ {
+ }
+
+ void operator()(cancellation_type_t cancel_type)
+ {
+ // If we are the first place to request cancellation, i.e. no operation has
+ // yet completed and requested cancellation, emit a signal for each
+ // operation in the group.
+ if (cancel_type != cancellation_type::none)
+ if (auto state = state_.lock())
+ if (state->cancellations_requested_++ == 0)
+ for (std::size_t i = 0; i < state->cancellation_signals_.size(); ++i)
+ state->cancellation_signals_[i].emit(cancel_type);
+ }
+
+ std::weak_ptr<ranged_parallel_group_state<
+ Condition, Handler, Op, Allocator>> state_;
+};
+
+template <typename Condition, typename Handler,
+ typename Range, typename Allocator>
+void ranged_parallel_group_launch(Condition cancellation_condition,
+ Handler handler, Range&& range, const Allocator& allocator)
+{
+ // Get the user's completion handler's cancellation slot, so that we can allow
+ // cancellation of the entire group.
+ associated_cancellation_slot_t<Handler> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ // The type of the asynchronous operation.
+ typedef decay_t<decltype(*declval<typename Range::iterator>())> op_type;
+
+ // Create the shared state for the operation.
+ typedef ranged_parallel_group_state<Condition,
+ Handler, op_type, Allocator> state_type;
+ std::shared_ptr<state_type> state = std::allocate_shared<state_type>(
+ asio::detail::recycling_allocator<state_type,
+ asio::detail::thread_info_base::parallel_group_tag>(),
+ std::move(cancellation_condition),
+ std::move(handler), range.size(), allocator);
+
+ std::size_t idx = 0;
+ for (auto&& op : std::forward<Range>(range))
+ {
+ typedef associated_executor_t<op_type> ex_type;
+ ex_type ex = asio::get_associated_executor(op);
+ std::move(op)(
+ ranged_parallel_group_op_handler_with_executor<
+ ex_type, Condition, Handler, op_type, Allocator>(
+ state, std::move(ex), idx++));
+ }
+
+ // Check if any of the operations has already requested cancellation, and if
+ // so, emit a signal for each operation in the group.
+ if ((state->cancellations_requested_ -= range.size()) > 0)
+ for (auto& signal : state->cancellation_signals_)
+ signal.emit(state->cancel_type_);
+
+ // Register a handler with the user's completion handler's cancellation slot.
+ if (slot.is_connected())
+ slot.template emplace<
+ ranged_parallel_group_cancellation_handler<
+ Condition, Handler, op_type, Allocator>>(state);
+}
+
+} // namespace detail
+} // namespace experimental
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename... Ops, typename DefaultCandidate>
+struct associator<Associator,
+ experimental::detail::parallel_group_completion_handler<Handler, Ops...>,
+ DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const experimental::detail::parallel_group_completion_handler<
+ Handler, Ops...>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const experimental::detail::parallel_group_completion_handler<
+ Handler, Ops...>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+template <template <typename, typename> class Associator, typename Handler,
+ typename Op, typename Allocator, typename DefaultCandidate>
+struct associator<Associator,
+ experimental::detail::ranged_parallel_group_completion_handler<
+ Handler, Op, Allocator>,
+ DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const experimental::detail::ranged_parallel_group_completion_handler<
+ Handler, Op, Allocator>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const experimental::detail::ranged_parallel_group_completion_handler<
+ Handler, Op, Allocator>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_EXPERIMENTAL_PARALLEL_GROUP_HPP
diff --git a/3rdparty/asio/include/asio/experimental/impl/promise.hpp b/3rdparty/asio/include/asio/experimental/impl/promise.hpp
new file mode 100644
index 00000000000..a80cf110baa
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/impl/promise.hpp
@@ -0,0 +1,255 @@
+//
+// experimental/impl/promise.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_PROMISE_HPP
+#define ASIO_EXPERIMENTAL_IMPL_PROMISE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/cancellation_signal.hpp"
+#include "asio/detail/utility.hpp"
+#include "asio/error.hpp"
+#include "asio/system_error.hpp"
+#include <tuple>
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+
+template<typename Signature = void(),
+ typename Executor = asio::any_io_executor,
+ typename Allocator = std::allocator<void>>
+struct promise;
+
+namespace detail {
+
+template<typename Signature, typename Executor, typename Allocator>
+struct promise_impl;
+
+template<typename... Ts, typename Executor, typename Allocator>
+struct promise_impl<void(Ts...), Executor, Allocator>
+{
+ using result_type = std::tuple<Ts...>;
+
+ promise_impl(Allocator allocator, Executor executor)
+ : allocator(std::move(allocator)), executor(std::move(executor))
+ {
+ }
+
+ promise_impl(const promise_impl&) = delete;
+
+ ~promise_impl()
+ {
+ if (completion)
+ this->cancel_();
+
+ if (done)
+ reinterpret_cast<result_type*>(&result)->~result_type();
+ }
+
+ aligned_storage_t<sizeof(result_type), alignof(result_type)> result;
+ std::atomic<bool> done{false};
+ cancellation_signal cancel;
+ Allocator allocator;
+ Executor executor;
+
+ template<typename Func, std::size_t... Idx>
+ void apply_impl(Func f, asio::detail::index_sequence<Idx...>)
+ {
+ auto& result_type = *reinterpret_cast<promise_impl::result_type*>(&result);
+ f(std::get<Idx>(std::move(result_type))...);
+ }
+
+ using allocator_type = Allocator;
+ allocator_type get_allocator() {return allocator;}
+
+ using executor_type = Executor;
+ executor_type get_executor() {return executor;}
+
+ template<typename Func>
+ void apply(Func f)
+ {
+ apply_impl(std::forward<Func>(f),
+ asio::detail::make_index_sequence<sizeof...(Ts)>{});
+ }
+
+ struct completion_base
+ {
+ virtual void invoke(Ts&&...ts) = 0;
+ };
+
+ template<typename Alloc, typename WaitHandler_>
+ struct completion_impl final : completion_base
+ {
+ WaitHandler_ handler;
+ Alloc allocator;
+ void invoke(Ts&&... ts)
+ {
+ auto h = std::move(handler);
+
+ using alloc_t = typename std::allocator_traits<
+ typename asio::decay<Alloc>::type>::template
+ rebind_alloc<completion_impl>;
+
+ alloc_t alloc_{allocator};
+ this->~completion_impl();
+ std::allocator_traits<alloc_t>::deallocate(alloc_, this, 1u);
+ std::move(h)(std::forward<Ts>(ts)...);
+ }
+
+ template<typename Alloc_, typename Handler_>
+ completion_impl(Alloc_&& alloc, Handler_&& wh)
+ : handler(std::forward<Handler_>(wh)),
+ allocator(std::forward<Alloc_>(alloc))
+ {
+ }
+ };
+
+ completion_base* completion = nullptr;
+ typename asio::aligned_storage<sizeof(void*) * 4,
+ alignof(completion_base)>::type completion_opt;
+
+ template<typename Alloc, typename Handler>
+ void set_completion(Alloc&& alloc, Handler&& handler)
+ {
+ if (completion)
+ cancel_();
+
+ using impl_t = completion_impl<
+ typename asio::decay<Alloc>::type, Handler>;
+ using alloc_t = typename std::allocator_traits<
+ typename asio::decay<Alloc>::type>::template rebind_alloc<impl_t>;
+
+ alloc_t alloc_{alloc};
+ auto p = std::allocator_traits<alloc_t>::allocate(alloc_, 1u);
+ completion = new (p) impl_t(std::forward<Alloc>(alloc),
+ std::forward<Handler>(handler));
+ }
+
+ template<typename... T_>
+ void complete(T_&&... ts)
+ {
+ assert(completion);
+ std::exchange(completion, nullptr)->invoke(std::forward<T_>(ts)...);
+ }
+
+ template<std::size_t... Idx>
+ void complete_with_result_impl(asio::detail::index_sequence<Idx...>)
+ {
+ auto& result_type = *reinterpret_cast<promise_impl::result_type*>(&result);
+ this->complete(std::get<Idx>(std::move(result_type))...);
+ }
+
+ void complete_with_result()
+ {
+ complete_with_result_impl(
+ asio::detail::make_index_sequence<sizeof...(Ts)>{});
+ }
+
+ template<typename... T_>
+ void cancel_impl_(std::exception_ptr*, T_*...)
+ {
+ complete(
+ std::make_exception_ptr(
+ asio::system_error(
+ asio::error::operation_aborted)),
+ T_{}...);
+ }
+
+ template<typename... T_>
+ void cancel_impl_(asio::error_code*, T_*...)
+ {
+ complete(asio::error::operation_aborted, T_{}...);
+ }
+
+ template<typename... T_>
+ void cancel_impl_(T_*...)
+ {
+ complete(T_{}...);
+ }
+
+ void cancel_()
+ {
+ cancel_impl_(static_cast<Ts*>(nullptr)...);
+ }
+};
+
+template<typename Signature = void(),
+ typename Executor = asio::any_io_executor,
+ typename Allocator = any_io_executor>
+struct promise_handler;
+
+template<typename... Ts, typename Executor, typename Allocator>
+struct promise_handler<void(Ts...), Executor, Allocator>
+{
+ using promise_type = promise<void(Ts...), Executor, Allocator>;
+
+ promise_handler(
+ Allocator allocator, Executor executor) // get_associated_allocator(exec)
+ : impl_(
+ std::allocate_shared<promise_impl<void(Ts...), Executor, Allocator>>(
+ allocator, allocator, executor))
+ {
+ }
+
+ std::shared_ptr<promise_impl<void(Ts...), Executor, Allocator>> impl_;
+
+ using cancellation_slot_type = cancellation_slot;
+
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return impl_->cancel.slot();
+ }
+
+ using allocator_type = Allocator;
+
+ allocator_type get_allocator() const noexcept
+ {
+ return impl_->get_allocator();
+ }
+
+ using executor_type = Executor;
+
+ Executor get_executor() const noexcept
+ {
+ return impl_->get_executor();
+ }
+
+ auto make_promise() -> promise<void(Ts...), executor_type, allocator_type>
+ {
+ return promise<void(Ts...), executor_type, allocator_type>{impl_};
+ }
+
+ void operator()(std::remove_reference_t<Ts>... ts)
+ {
+ assert(impl_);
+
+ using result_type = typename promise_impl<
+ void(Ts...), allocator_type, executor_type>::result_type ;
+
+ new (&impl_->result) result_type(std::move(ts)...);
+ impl_->done = true;
+
+ if (impl_->completion)
+ impl_->complete_with_result();
+ }
+};
+
+} // namespace detail
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_IMPL_PROMISE_HPP
diff --git a/3rdparty/asio/include/asio/experimental/impl/use_coro.hpp b/3rdparty/asio/include/asio/experimental/impl/use_coro.hpp
new file mode 100644
index 00000000000..ab5a2e68959
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/impl/use_coro.hpp
@@ -0,0 +1,214 @@
+//
+// experimental/impl/use_coro.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_USE_CORO_HPP
+#define ASIO_EXPERIMENTAL_IMPL_USE_CORO_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/deferred.hpp"
+#include "asio/experimental/coro.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename Allocator, typename R>
+struct async_result<experimental::use_coro_t<Allocator>, R()>
+{
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate_impl(Initiation initiation,
+ std::allocator_arg_t, Allocator, InitArgs... args)
+ -> experimental::coro<void() noexcept, void,
+ asio::associated_executor_t<Initiation>, Allocator>
+ {
+ co_await deferred_async_operation<R(), Initiation, InitArgs...>(
+ deferred_init_tag{}, std::move(initiation), std::move(args)...);
+ }
+
+ template <typename... InitArgs>
+ static auto initiate_impl(asio::detail::initiation_archetype<R()>,
+ std::allocator_arg_t, Allocator, InitArgs... args)
+ -> experimental::coro<void(), void,
+ asio::any_io_executor, Allocator>;
+
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate(Initiation initiation,
+ experimental::use_coro_t<Allocator> tk, InitArgs&&... args)
+ {
+ return initiate_impl(std::move(initiation), std::allocator_arg,
+ tk.get_allocator(), std::forward<InitArgs>(args)...);
+ }
+};
+
+template <typename Allocator, typename R>
+struct async_result<
+ experimental::use_coro_t<Allocator>, R(asio::error_code)>
+{
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate_impl(Initiation initiation,
+ std::allocator_arg_t, Allocator, InitArgs... args)
+ -> experimental::coro<void() noexcept, void,
+ asio::associated_executor_t<Initiation>, Allocator>
+ {
+ co_await deferred_async_operation<
+ R(asio::error_code), Initiation, InitArgs...>(
+ deferred_init_tag{}, std::move(initiation), std::move(args)...);
+ }
+
+ template <typename... InitArgs>
+ static auto initiate_impl(
+ asio::detail::initiation_archetype<R(asio::error_code)>,
+ std::allocator_arg_t, Allocator, InitArgs... args)
+ -> experimental::coro<void(), void,
+ asio::any_io_executor, Allocator>;
+
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate(Initiation initiation,
+ experimental::use_coro_t<Allocator> tk, InitArgs&&... args)
+ {
+ return initiate_impl(std::move(initiation), std::allocator_arg,
+ tk.get_allocator(), std::forward<InitArgs>(args)...);
+ }
+};
+
+template <typename Allocator, typename R>
+struct async_result<
+ experimental::use_coro_t<Allocator>, R(std::exception_ptr)>
+{
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate_impl(Initiation initiation,
+ std::allocator_arg_t, Allocator, InitArgs... args)
+ -> experimental::coro<void(), void,
+ asio::associated_executor_t<Initiation>, Allocator>
+ {
+ co_await deferred_async_operation<
+ R(std::exception_ptr), Initiation, InitArgs...>(
+ deferred_init_tag{}, std::move(initiation), std::move(args)...);
+ }
+
+ template <typename... InitArgs>
+ static auto initiate_impl(
+ asio::detail::initiation_archetype<R(std::exception_ptr)>,
+ std::allocator_arg_t, Allocator, InitArgs... args)
+ -> experimental::coro<void(), void,
+ asio::any_io_executor, Allocator>;
+
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate(Initiation initiation,
+ experimental::use_coro_t<Allocator> tk, InitArgs&&... args)
+ {
+ return initiate_impl(std::move(initiation), std::allocator_arg,
+ tk.get_allocator(), std::forward<InitArgs>(args)...);
+ }
+};
+
+template <typename Allocator, typename R, typename T>
+struct async_result<experimental::use_coro_t<Allocator>, R(T)>
+{
+
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate_impl(Initiation initiation,
+ std::allocator_arg_t, Allocator, InitArgs... args)
+ -> experimental::coro<void() noexcept, T,
+ asio::associated_executor_t<Initiation>, Allocator>
+ {
+ co_return co_await deferred_async_operation<R(T), Initiation, InitArgs...>(
+ deferred_init_tag{}, std::move(initiation), std::move(args)...);
+ }
+
+ template <typename... InitArgs>
+ static auto initiate_impl(asio::detail::initiation_archetype<R(T)>,
+ std::allocator_arg_t, Allocator, InitArgs... args)
+ -> experimental::coro<void() noexcept, T,
+ asio::any_io_executor, Allocator>;
+
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate(Initiation initiation,
+ experimental::use_coro_t<Allocator> tk, InitArgs&&... args)
+ {
+ return initiate_impl(std::move(initiation), std::allocator_arg,
+ tk.get_allocator(), std::forward<InitArgs>(args)...);
+ }
+};
+
+template <typename Allocator, typename R, typename T>
+struct async_result<
+ experimental::use_coro_t<Allocator>, R(asio::error_code, T)>
+{
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate_impl(Initiation initiation,
+ std::allocator_arg_t, Allocator, InitArgs... args)
+ -> experimental::coro<void(), T,
+ asio::associated_executor_t<Initiation>, Allocator>
+ {
+ co_return co_await deferred_async_operation<
+ R(asio::error_code, T), Initiation, InitArgs...>(
+ deferred_init_tag{}, std::move(initiation), std::move(args)...);
+ }
+
+ template <typename... InitArgs>
+ static auto initiate_impl(
+ asio::detail::initiation_archetype<
+ R(asio::error_code, T)>,
+ std::allocator_arg_t, Allocator, InitArgs... args)
+ -> experimental::coro<void(), T, asio::any_io_executor, Allocator>;
+
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate(Initiation initiation,
+ experimental::use_coro_t<Allocator> tk, InitArgs&&... args)
+ {
+ return initiate_impl(std::move(initiation), std::allocator_arg,
+ tk.get_allocator(), std::forward<InitArgs>(args)...);
+ }
+};
+
+template <typename Allocator, typename R, typename T>
+struct async_result<
+ experimental::use_coro_t<Allocator>, R(std::exception_ptr, T)>
+{
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate_impl(Initiation initiation,
+ std::allocator_arg_t, Allocator, InitArgs... args)
+ -> experimental::coro<void(), T,
+ asio::associated_executor_t<Initiation>, Allocator>
+ {
+ co_return co_await deferred_async_operation<
+ R(std::exception_ptr, T), Initiation, InitArgs...>(
+ deferred_init_tag{}, std::move(initiation), std::move(args)...);
+ }
+
+ template <typename... InitArgs>
+ static auto initiate_impl(
+ asio::detail::initiation_archetype<R(std::exception_ptr, T)>,
+ std::allocator_arg_t, Allocator, InitArgs... args)
+ -> experimental::coro<void(), T, asio::any_io_executor, Allocator>;
+
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate(Initiation initiation,
+ experimental::use_coro_t<Allocator> tk, InitArgs&&... args)
+ {
+ return initiate_impl(std::move(initiation), std::allocator_arg,
+ tk.get_allocator(), std::forward<InitArgs>(args)...);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_IMPL_USE_CORO_HPP
diff --git a/3rdparty/asio/include/asio/experimental/impl/use_promise.hpp b/3rdparty/asio/include/asio/experimental/impl/use_promise.hpp
new file mode 100644
index 00000000000..259edb394bf
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/impl/use_promise.hpp
@@ -0,0 +1,66 @@
+//
+// experimental/impl/use_promise.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_USE_PROMISE_HPP
+#define ASIO_EXPERIMENTAL_IMPL_USE_PROMISE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <memory>
+#include "asio/async_result.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+
+template <typename Allocator>
+struct use_promise_t;
+
+namespace detail {
+
+template<typename Signature, typename Executor, typename Allocator>
+struct promise_handler;
+
+} // namespace detail
+} // namespace experimental
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename Allocator, typename R, typename... Args>
+struct async_result<experimental::use_promise_t<Allocator>, R(Args...)>
+{
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate(Initiation initiation,
+ experimental::use_promise_t<Allocator> up, InitArgs... args)
+ -> experimental::promise<void(decay_t<Args>...),
+ asio::associated_executor_t<Initiation>, Allocator>
+ {
+ using handler_type = experimental::detail::promise_handler<
+ void(decay_t<Args>...),
+ asio::associated_executor_t<Initiation>, Allocator>;
+
+ handler_type ht{up.get_allocator(), get_associated_executor(initiation)};
+ std::move(initiation)(ht, std::move(args)...);
+ return ht.make_promise();
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_IMPL_USE_PROMISE_HPP
diff --git a/3rdparty/asio/include/asio/experimental/parallel_group.hpp b/3rdparty/asio/include/asio/experimental/parallel_group.hpp
new file mode 100644
index 00000000000..967fc8802db
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/parallel_group.hpp
@@ -0,0 +1,457 @@
+//
+// experimental/parallel_group.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_PARALLEL_GROUP_HPP
+#define ASIO_EXPERIMENTAL_PARALLEL_GROUP_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <vector>
+#include "asio/async_result.hpp"
+#include "asio/detail/array.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/detail/utility.hpp"
+#include "asio/experimental/cancellation_condition.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+namespace detail {
+
+// Helper trait for getting a tuple from a completion signature.
+
+template <typename Signature>
+struct parallel_op_signature_as_tuple;
+
+template <typename R, typename... Args>
+struct parallel_op_signature_as_tuple<R(Args...)>
+{
+ typedef std::tuple<decay_t<Args>...> type;
+};
+
+// Helper trait for concatenating completion signatures.
+
+template <std::size_t N, typename Offsets, typename... Signatures>
+struct parallel_group_signature;
+
+template <std::size_t N, typename R0, typename... Args0>
+struct parallel_group_signature<N, R0(Args0...)>
+{
+ typedef asio::detail::array<std::size_t, N> order_type;
+ typedef R0 raw_type(Args0...);
+ typedef R0 type(order_type, Args0...);
+};
+
+template <std::size_t N,
+ typename R0, typename... Args0,
+ typename R1, typename... Args1>
+struct parallel_group_signature<N, R0(Args0...), R1(Args1...)>
+{
+ typedef asio::detail::array<std::size_t, N> order_type;
+ typedef R0 raw_type(Args0..., Args1...);
+ typedef R0 type(order_type, Args0..., Args1...);
+};
+
+template <std::size_t N, typename Sig0,
+ typename Sig1, typename... SigN>
+struct parallel_group_signature<N, Sig0, Sig1, SigN...>
+{
+ typedef asio::detail::array<std::size_t, N> order_type;
+ typedef typename parallel_group_signature<N,
+ typename parallel_group_signature<N, Sig0, Sig1>::raw_type,
+ SigN...>::raw_type raw_type;
+ typedef typename parallel_group_signature<N,
+ typename parallel_group_signature<N, Sig0, Sig1>::raw_type,
+ SigN...>::type type;
+};
+
+template <typename Condition, typename Handler,
+ typename... Ops, std::size_t... I>
+void parallel_group_launch(Condition cancellation_condition, Handler handler,
+ std::tuple<Ops...>& ops, asio::detail::index_sequence<I...>);
+
+// Helper trait for determining ranged parallel group completion signatures.
+
+template <typename Signature, typename Allocator>
+struct ranged_parallel_group_signature;
+
+template <typename R, typename... Args, typename Allocator>
+struct ranged_parallel_group_signature<R(Args...), Allocator>
+{
+ typedef std::vector<std::size_t,
+ ASIO_REBIND_ALLOC(Allocator, std::size_t)> order_type;
+ typedef R raw_type(
+ std::vector<Args, ASIO_REBIND_ALLOC(Allocator, Args)>...);
+ typedef R type(order_type,
+ std::vector<Args, ASIO_REBIND_ALLOC(Allocator, Args)>...);
+};
+
+template <typename Condition, typename Handler,
+ typename Range, typename Allocator>
+void ranged_parallel_group_launch(Condition cancellation_condition,
+ Handler handler, Range&& range, const Allocator& allocator);
+
+char (&parallel_group_has_iterator_helper(...))[2];
+
+template <typename T>
+char parallel_group_has_iterator_helper(T*, typename T::iterator* = 0);
+
+template <typename T>
+struct parallel_group_has_iterator_typedef
+{
+ enum { value = (sizeof((parallel_group_has_iterator_helper)((T*)(0))) == 1) };
+};
+
+} // namespace detail
+
+/// Type trait used to determine whether a type is a range of asynchronous
+/// operations that can be used with with @c make_parallel_group.
+template <typename T>
+struct is_async_operation_range
+{
+#if defined(GENERATING_DOCUMENTATION)
+ /// The value member is true if the type may be used as a range of
+ /// asynchronous operations.
+ static const bool value;
+#else
+ enum
+ {
+ value = detail::parallel_group_has_iterator_typedef<T>::value
+ };
+#endif
+};
+
+/// A group of asynchronous operations that may be launched in parallel.
+/**
+ * See the documentation for asio::experimental::make_parallel_group for
+ * a usage example.
+ */
+template <typename... Ops>
+class parallel_group
+{
+private:
+ struct initiate_async_wait
+ {
+ template <typename Handler, typename Condition>
+ void operator()(Handler&& h, Condition&& c, std::tuple<Ops...>&& ops) const
+ {
+ detail::parallel_group_launch(
+ std::forward<Condition>(c), std::forward<Handler>(h),
+ ops, asio::detail::index_sequence_for<Ops...>());
+ }
+ };
+
+ std::tuple<Ops...> ops_;
+
+public:
+ /// Constructor.
+ explicit parallel_group(Ops... ops)
+ : ops_(std::move(ops)...)
+ {
+ }
+
+ /// The completion signature for the group of operations.
+ typedef typename detail::parallel_group_signature<sizeof...(Ops),
+ completion_signature_of_t<Ops>...>::type signature;
+
+ /// Initiate an asynchronous wait for the group of operations.
+ /**
+ * Launches the group and asynchronously waits for completion.
+ *
+ * @param cancellation_condition A function object, called on completion of
+ * an operation within the group, that is used to determine whether to cancel
+ * the remaining operations. The function object is passed the arguments of
+ * the completed operation's handler. To trigger cancellation of the remaining
+ * operations, it must return a asio::cancellation_type value other
+ * than <tt>asio::cancellation_type::none</tt>.
+ *
+ * @param token A @ref completion_token whose signature is comprised of
+ * a @c std::array<std::size_t, N> indicating the completion order of the
+ * operations, followed by all operations' completion handler arguments.
+ *
+ * The library provides the following @c cancellation_condition types:
+ *
+ * @li asio::experimental::wait_for_all
+ * @li asio::experimental::wait_for_one
+ * @li asio::experimental::wait_for_one_error
+ * @li asio::experimental::wait_for_one_success
+ */
+ template <typename CancellationCondition,
+ ASIO_COMPLETION_TOKEN_FOR(signature) CompletionToken>
+ auto async_wait(CancellationCondition cancellation_condition,
+ CompletionToken&& token)
+ -> decltype(
+ asio::async_initiate<CompletionToken, signature>(
+ declval<initiate_async_wait>(), token,
+ std::move(cancellation_condition), std::move(ops_)))
+ {
+ return asio::async_initiate<CompletionToken, signature>(
+ initiate_async_wait(), token,
+ std::move(cancellation_condition), std::move(ops_));
+ }
+};
+
+/// Create a group of operations that may be launched in parallel.
+/**
+ * For example:
+ * @code asio::experimental::make_parallel_group(
+ * [&](auto token)
+ * {
+ * return in.async_read_some(asio::buffer(data), token);
+ * },
+ * [&](auto token)
+ * {
+ * return timer.async_wait(token);
+ * }
+ * ).async_wait(
+ * asio::experimental::wait_for_all(),
+ * [](
+ * std::array<std::size_t, 2> completion_order,
+ * std::error_code ec1, std::size_t n1,
+ * std::error_code ec2
+ * )
+ * {
+ * switch (completion_order[0])
+ * {
+ * case 0:
+ * {
+ * std::cout << "descriptor finished: " << ec1 << ", " << n1 << "\n";
+ * }
+ * break;
+ * case 1:
+ * {
+ * std::cout << "timer finished: " << ec2 << "\n";
+ * }
+ * break;
+ * }
+ * }
+ * );
+ * @endcode
+ */
+template <typename... Ops>
+ASIO_NODISCARD inline parallel_group<Ops...>
+make_parallel_group(Ops... ops)
+{
+ return parallel_group<Ops...>(std::move(ops)...);
+}
+
+/// A range-based group of asynchronous operations that may be launched in
+/// parallel.
+/**
+ * See the documentation for asio::experimental::make_parallel_group for
+ * a usage example.
+ */
+template <typename Range, typename Allocator = std::allocator<void>>
+class ranged_parallel_group
+{
+private:
+ struct initiate_async_wait
+ {
+ template <typename Handler, typename Condition>
+ void operator()(Handler&& h, Condition&& c,
+ Range&& range, const Allocator& allocator) const
+ {
+ detail::ranged_parallel_group_launch(std::move(c),
+ std::move(h), std::forward<Range>(range), allocator);
+ }
+ };
+
+ Range range_;
+ Allocator allocator_;
+
+public:
+ /// Constructor.
+ explicit ranged_parallel_group(Range range,
+ const Allocator& allocator = Allocator())
+ : range_(std::move(range)),
+ allocator_(allocator)
+ {
+ }
+
+ /// The completion signature for the group of operations.
+ typedef typename detail::ranged_parallel_group_signature<
+ completion_signature_of_t<
+ decay_t<decltype(*std::declval<typename Range::iterator>())>>,
+ Allocator>::type signature;
+
+ /// Initiate an asynchronous wait for the group of operations.
+ /**
+ * Launches the group and asynchronously waits for completion.
+ *
+ * @param cancellation_condition A function object, called on completion of
+ * an operation within the group, that is used to determine whether to cancel
+ * the remaining operations. The function object is passed the arguments of
+ * the completed operation's handler. To trigger cancellation of the remaining
+ * operations, it must return a asio::cancellation_type value other
+ * than <tt>asio::cancellation_type::none</tt>.
+ *
+ * @param token A @ref completion_token whose signature is comprised of
+ * a @c std::vector<std::size_t, Allocator> indicating the completion order of
+ * the operations, followed by a vector for each of the completion signature's
+ * arguments.
+ *
+ * The library provides the following @c cancellation_condition types:
+ *
+ * @li asio::experimental::wait_for_all
+ * @li asio::experimental::wait_for_one
+ * @li asio::experimental::wait_for_one_error
+ * @li asio::experimental::wait_for_one_success
+ */
+ template <typename CancellationCondition,
+ ASIO_COMPLETION_TOKEN_FOR(signature) CompletionToken>
+ auto async_wait(CancellationCondition cancellation_condition,
+ CompletionToken&& token)
+ -> decltype(
+ asio::async_initiate<CompletionToken, signature>(
+ declval<initiate_async_wait>(), token,
+ std::move(cancellation_condition),
+ std::move(range_), allocator_))
+ {
+ return asio::async_initiate<CompletionToken, signature>(
+ initiate_async_wait(), token,
+ std::move(cancellation_condition),
+ std::move(range_), allocator_);
+ }
+};
+
+/// Create a group of operations that may be launched in parallel.
+/**
+ * @param range A range containing the operations to be launched.
+ *
+ * For example:
+ * @code
+ * using op_type = decltype(
+ * socket1.async_read_some(
+ * asio::buffer(data1),
+ * asio::deferred
+ * )
+ * );
+ *
+ * std::vector<op_type> ops;
+ *
+ * ops.push_back(
+ * socket1.async_read_some(
+ * asio::buffer(data1),
+ * asio::deferred
+ * )
+ * );
+ *
+ * ops.push_back(
+ * socket2.async_read_some(
+ * asio::buffer(data2),
+ * asio::deferred
+ * )
+ * );
+ *
+ * asio::experimental::make_parallel_group(ops).async_wait(
+ * asio::experimental::wait_for_all(),
+ * [](
+ * std::vector<std::size_t> completion_order,
+ * std::vector<std::error_code> e,
+ * std::vector<std::size_t> n
+ * )
+ * {
+ * for (std::size_t i = 0; i < completion_order.size(); ++i)
+ * {
+ * std::size_t idx = completion_order[i];
+ * std::cout << "socket " << idx << " finished: ";
+ * std::cout << e[idx] << ", " << n[idx] << "\n";
+ * }
+ * }
+ * );
+ * @endcode
+ */
+template <typename Range>
+ASIO_NODISCARD inline ranged_parallel_group<decay_t<Range>>
+make_parallel_group(Range&& range,
+ constraint_t<
+ is_async_operation_range<decay_t<Range>>::value
+ > = 0)
+{
+ return ranged_parallel_group<decay_t<Range>>(std::forward<Range>(range));
+}
+
+/// Create a group of operations that may be launched in parallel.
+/**
+ * @param allocator Specifies the allocator to be used with the result vectors.
+ *
+ * @param range A range containing the operations to be launched.
+ *
+ * For example:
+ * @code
+ * using op_type = decltype(
+ * socket1.async_read_some(
+ * asio::buffer(data1),
+ * asio::deferred
+ * )
+ * );
+ *
+ * std::vector<op_type> ops;
+ *
+ * ops.push_back(
+ * socket1.async_read_some(
+ * asio::buffer(data1),
+ * asio::deferred
+ * )
+ * );
+ *
+ * ops.push_back(
+ * socket2.async_read_some(
+ * asio::buffer(data2),
+ * asio::deferred
+ * )
+ * );
+ *
+ * asio::experimental::make_parallel_group(
+ * std::allocator_arg_t,
+ * my_allocator,
+ * ops
+ * ).async_wait(
+ * asio::experimental::wait_for_all(),
+ * [](
+ * std::vector<std::size_t> completion_order,
+ * std::vector<std::error_code> e,
+ * std::vector<std::size_t> n
+ * )
+ * {
+ * for (std::size_t i = 0; i < completion_order.size(); ++i)
+ * {
+ * std::size_t idx = completion_order[i];
+ * std::cout << "socket " << idx << " finished: ";
+ * std::cout << e[idx] << ", " << n[idx] << "\n";
+ * }
+ * }
+ * );
+ * @endcode
+ */
+template <typename Allocator, typename Range>
+ASIO_NODISCARD inline ranged_parallel_group<decay_t<Range>, Allocator>
+make_parallel_group(allocator_arg_t, const Allocator& allocator, Range&& range,
+ constraint_t<
+ is_async_operation_range<decay_t<Range>>::value
+ > = 0)
+{
+ return ranged_parallel_group<decay_t<Range>, Allocator>(
+ std::forward<Range>(range), allocator);
+}
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/experimental/impl/parallel_group.hpp"
+
+#endif // ASIO_EXPERIMENTAL_PARALLEL_GROUP_HPP
diff --git a/3rdparty/asio/include/asio/experimental/prepend.hpp b/3rdparty/asio/include/asio/experimental/prepend.hpp
new file mode 100644
index 00000000000..503981f776f
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/prepend.hpp
@@ -0,0 +1,36 @@
+//
+// experimental/prepend.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_PREPEND_HPP
+#define ASIO_EXPERIMENTAL_PREPEND_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/prepend.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+
+#if !defined(ASIO_NO_DEPRECATED)
+using asio::prepend_t;
+using asio::prepend;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_PREPEND_HPP
diff --git a/3rdparty/asio/include/asio/experimental/promise.hpp b/3rdparty/asio/include/asio/experimental/promise.hpp
new file mode 100644
index 00000000000..2bcf66b4e30
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/promise.hpp
@@ -0,0 +1,224 @@
+//
+// experimental/promise.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_PROMISE_HPP
+#define ASIO_EXPERIMENTAL_PROMISE_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/any_io_executor.hpp"
+#include "asio/associated_cancellation_slot.hpp"
+#include "asio/associated_executor.hpp"
+#include "asio/bind_executor.hpp"
+#include "asio/cancellation_signal.hpp"
+#include "asio/dispatch.hpp"
+#include "asio/experimental/impl/promise.hpp"
+#include "asio/post.hpp"
+
+#include <algorithm>
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+
+template <typename T>
+struct is_promise : std::false_type {};
+
+template <typename ... Ts>
+struct is_promise<promise<Ts...>> : std::true_type {};
+
+template <typename T>
+constexpr bool is_promise_v = is_promise<T>::value;
+
+template <typename ... Ts>
+struct promise_value_type
+{
+ using type = std::tuple<Ts...>;
+};
+
+template <typename T>
+struct promise_value_type<T>
+{
+ using type = T;
+};
+
+template <>
+struct promise_value_type<>
+{
+ using type = std::tuple<>;
+};
+
+#if defined(GENERATING_DOCUMENTATION)
+/// A disposable handle for an eager operation.
+/**
+ * @tparam Signature The signature of the operation.
+ *
+ * @tparam Executor The executor to be used by the promise (taken from the
+ * operation).
+ *
+ * @tparam Allocator The allocator used for the promise. Can be set through
+ * use_allocator.
+ *
+ * A promise can be used to initiate an asynchronous option that can be
+ * completed later. If the promise gets destroyed before completion, the
+ * operation gets a cancel signal and the result is ignored.
+ *
+ * A promise fulfills the requirements of async_operation.
+ *
+ * @par Examples
+ * Reading and writing from one coroutine.
+ * @code
+ * awaitable<void> read_write_some(asio::ip::tcp::socket & sock,
+ * asio::mutable_buffer read_buf, asio::const_buffer to_write)
+ * {
+ * auto p = asio::async_read(read_buf, asio::use_awaitable);
+ * co_await asio::async_write_some(to_write, asio::deferred);
+ * co_await p;
+ * }
+ * @endcode
+ */
+template<typename Signature = void(),
+ typename Executor = asio::any_io_executor,
+ typename Allocator = std::allocator<void>>
+struct promise
+#else
+template <typename ... Ts, typename Executor, typename Allocator>
+struct promise<void(Ts...), Executor, Allocator>
+#endif // defined(GENERATING_DOCUMENTATION)
+{
+ /// The value that's returned by the promise.
+ using value_type = typename promise_value_type<Ts...>::type;
+
+ /// Cancel the promise. Usually done through the destructor.
+ void cancel(cancellation_type level = cancellation_type::all)
+ {
+ if (impl_ && !impl_->done)
+ {
+ asio::dispatch(impl_->executor,
+ [level, impl = impl_]{ impl->cancel.emit(level); });
+ }
+ }
+
+ /// Check if the promise is completed already.
+ bool completed() const noexcept
+ {
+ return impl_ && impl_->done;
+ }
+
+ /// Wait for the promise to become ready.
+ template <ASIO_COMPLETION_TOKEN_FOR(void(Ts...)) CompletionToken>
+ inline ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken, void(Ts...))
+ operator()(CompletionToken&& token)
+ {
+ assert(impl_);
+
+ return async_initiate<CompletionToken, void(Ts...)>(
+ initiate_async_wait{impl_}, token);
+ }
+
+ promise() = delete;
+ promise(const promise& ) = delete;
+ promise(promise&& ) noexcept = default;
+
+ /// Destruct the promise and cancel the operation.
+ /**
+ * It is safe to destruct a promise of a promise that didn't complete.
+ */
+ ~promise() { cancel(); }
+
+
+private:
+#if !defined(GENERATING_DOCUMENTATION)
+ template <typename, typename, typename> friend struct promise;
+ friend struct detail::promise_handler<void(Ts...), Executor, Allocator>;
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ std::shared_ptr<detail::promise_impl<
+ void(Ts...), Executor, Allocator>> impl_;
+
+ promise(
+ std::shared_ptr<detail::promise_impl<
+ void(Ts...), Executor, Allocator>> impl)
+ : impl_(impl)
+ {
+ }
+
+ struct initiate_async_wait
+ {
+ std::shared_ptr<detail::promise_impl<
+ void(Ts...), Executor, Allocator>> self_;
+
+ template <typename WaitHandler>
+ void operator()(WaitHandler&& handler) const
+ {
+ const auto alloc = get_associated_allocator(
+ handler, self_->get_allocator());
+
+ auto cancel = get_associated_cancellation_slot(handler);
+
+ if (self_->done)
+ {
+ auto exec = asio::get_associated_executor(
+ handler, self_->get_executor());
+
+ asio::post(exec,
+ [self = std::move(self_),
+ handler = std::forward<WaitHandler>(handler)]() mutable
+ {
+ self->apply(std::move(handler));
+ });
+ }
+ else
+ {
+ if (cancel.is_connected())
+ {
+ struct cancel_handler
+ {
+ std::weak_ptr<detail::promise_impl<
+ void(Ts...), Executor, Allocator>> self;
+
+ cancel_handler(
+ std::weak_ptr<detail::promise_impl<
+ void(Ts...), Executor, Allocator>> self)
+ : self(std::move(self))
+ {
+ }
+
+ void operator()(cancellation_type level) const
+ {
+ if (auto p = self.lock())
+ {
+ p->cancel.emit(level);
+ p->cancel_();
+ }
+ }
+ };
+ cancel.template emplace<cancel_handler>(self_);
+ }
+
+ self_->set_completion(alloc, std::forward<WaitHandler>(handler));
+ }
+ }
+ };
+};
+
+} // namespace experimental
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_EXPERIMENTAL_PROMISE_HPP
diff --git a/3rdparty/asio/include/asio/experimental/use_coro.hpp b/3rdparty/asio/include/asio/experimental/use_coro.hpp
new file mode 100644
index 00000000000..d9e0544106c
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/use_coro.hpp
@@ -0,0 +1,189 @@
+//
+// experimental/use_coro.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_USE_CORO_HPP
+#define ASIO_EXPERIMENTAL_USE_CORO_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <memory>
+#include "asio/deferred.hpp"
+#include "asio/detail/source_location.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+class any_io_executor;
+
+namespace experimental {
+
+/// A @ref completion_token that creates another coro for the task completion.
+/**
+ * The @c use_coro_t class, with its value @c use_coro, is used to represent an
+ * operation that can be awaited by the current resumable coroutine. This
+ * completion token may be passed as a handler to an asynchronous operation.
+ * For example:
+ *
+ * @code coro<void> my_coroutine(tcp::socket my_socket)
+ * {
+ * std::size_t n = co_await my_socket.async_read_some(buffer, use_coro);
+ * ...
+ * } @endcode
+ *
+ * When used with co_await, the initiating function (@c 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.
+ *
+ * Note that this token is not the most efficient (use @c asio::deferred
+ * for that) but does provide type erasure, as it will always return a @c coro.
+ */
+template <typename Allocator = std::allocator<void>>
+struct use_coro_t
+{
+
+ /// The allocator type. The allocator is used when constructing the
+ /// @c std::promise object for a given asynchronous operation.
+ typedef Allocator allocator_type;
+
+ /// Default constructor.
+ constexpr use_coro_t(
+ allocator_type allocator = allocator_type{}
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ , asio::detail::source_location location =
+ asio::detail::source_location::current()
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ )
+ : allocator_(allocator)
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ , file_name_(location.file_name()),
+ line_(location.line()),
+ function_name_(location.function_name())
+# else // defined(ASIO_HAS_SOURCE_LOCATION)
+ , file_name_(0),
+ line_(0),
+ function_name_(0)
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ {
+ }
+
+
+ /// Specify an alternate allocator.
+ template <typename OtherAllocator>
+ use_coro_t<OtherAllocator> rebind(const OtherAllocator& allocator) const
+ {
+ return use_future_t<OtherAllocator>(allocator);
+ }
+
+ /// Obtain allocator.
+ allocator_type get_allocator() const
+ {
+ return allocator_;
+ }
+
+ /// Constructor used to specify file name, line, and function name.
+ constexpr use_coro_t(const char* file_name,
+ int line, const char* function_name,
+ allocator_type allocator = allocator_type{}) :
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+ file_name_(file_name),
+ line_(line),
+ function_name_(function_name),
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ allocator_(allocator)
+ {
+#if !defined(ASIO_ENABLE_HANDLER_TRACKING)
+ (void)file_name;
+ (void)line;
+ (void)function_name;
+#endif // !defined(ASIO_ENABLE_HANDLER_TRACKING)
+ }
+
+ /// Adapts an executor to add the @c use_coro_t completion token as the
+ /// default.
+ template <typename InnerExecutor>
+ struct executor_with_default : InnerExecutor
+ {
+ /// Specify @c use_coro_t as the default completion token type.
+ typedef use_coro_t default_completion_token_type;
+
+ /// Construct the adapted executor from the inner executor type.
+ template <typename InnerExecutor1>
+ executor_with_default(const InnerExecutor1& ex,
+ constraint_t<
+ conditional_t<
+ !is_same<InnerExecutor1, executor_with_default>::value,
+ is_convertible<InnerExecutor1, InnerExecutor>,
+ false_type
+ >::value
+ > = 0) noexcept
+ : InnerExecutor(ex)
+ {
+ }
+ };
+
+ /// Type alias to adapt an I/O object to use @c use_coro_t as its
+ /// default completion token type.
+ template <typename T>
+ using as_default_on_t = typename T::template rebind_executor<
+ executor_with_default<typename T::executor_type>>::other;
+
+ /// Function helper to adapt an I/O object to use @c use_coro_t as its
+ /// default completion token type.
+ template <typename T>
+ static typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other
+ as_default_on(T&& object)
+ {
+ return typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other(static_cast<T&&>(object));
+ }
+
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+ const char* file_name_;
+ int line_;
+ const char* function_name_;
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+
+private:
+ Allocator allocator_;
+};
+
+/// A @ref completion_token object that represents the currently executing
+/// resumable coroutine.
+/**
+ * See the documentation for asio::use_coro_t for a usage example.
+ */
+#if defined(GENERATING_DOCUMENTATION)
+constexpr use_coro_t<> use_coro;
+#else
+constexpr use_coro_t<> use_coro(0, 0, 0);
+#endif
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/experimental/impl/use_coro.hpp"
+#include "asio/experimental/coro.hpp"
+
+#endif // ASIO_EXPERIMENTAL_USE_CORO_HPP
diff --git a/3rdparty/asio/include/asio/experimental/use_promise.hpp b/3rdparty/asio/include/asio/experimental/use_promise.hpp
new file mode 100644
index 00000000000..cf19aca59d5
--- /dev/null
+++ b/3rdparty/asio/include/asio/experimental/use_promise.hpp
@@ -0,0 +1,111 @@
+//
+// experimental/use_promise.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_USE_PROMISE_HPP
+#define ASIO_EXPERIMENTAL_USE_PROMISE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <memory>
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace experimental {
+
+template <typename Allocator = std::allocator<void>>
+struct use_promise_t
+{
+ /// The allocator type. The allocator is used when constructing the
+ /// @c promise object for a given asynchronous operation.
+ typedef Allocator allocator_type;
+
+ /// Construct using default-constructed allocator.
+ constexpr use_promise_t()
+ {
+ }
+
+ /// Construct using specified allocator.
+ explicit use_promise_t(const Allocator& allocator)
+ : allocator_(allocator)
+ {
+ }
+
+ /// Obtain allocator.
+ allocator_type get_allocator() const noexcept
+ {
+ return allocator_;
+ }
+
+ /// Adapts an executor to add the @c use_promise_t completion token as the
+ /// default.
+ template <typename InnerExecutor>
+ struct executor_with_default : InnerExecutor
+ {
+ /// Specify @c use_promise_t as the default completion token type.
+ typedef use_promise_t<Allocator> default_completion_token_type;
+
+ /// Construct the adapted executor from the inner executor type.
+ executor_with_default(const InnerExecutor& ex) noexcept
+ : InnerExecutor(ex)
+ {
+ }
+
+ /// Convert the specified executor to the inner executor type, then use
+ /// that to construct the adapted executor.
+ template <typename OtherExecutor>
+ executor_with_default(const OtherExecutor& ex,
+ constraint_t<
+ is_convertible<OtherExecutor, InnerExecutor>::value
+ > = 0) noexcept
+ : InnerExecutor(ex)
+ {
+ }
+ };
+
+ /// Function helper to adapt an I/O object to use @c use_promise_t as its
+ /// default completion token type.
+ template <typename T>
+ static typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other
+ as_default_on(T&& object)
+ {
+ return typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other(static_cast<T&&>(object));
+ }
+
+ /// Specify an alternate allocator.
+ template <typename OtherAllocator>
+ use_promise_t<OtherAllocator> rebind(const OtherAllocator& allocator) const
+ {
+ return use_promise_t<OtherAllocator>(allocator);
+ }
+
+private:
+ Allocator allocator_;
+};
+
+constexpr use_promise_t<> use_promise;
+
+} // namespace experimental
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/experimental/impl/use_promise.hpp"
+
+#endif // ASIO_EXPERIMENTAL_USE_CORO_HPP
diff --git a/3rdparty/asio/include/asio/file_base.hpp b/3rdparty/asio/include/asio/file_base.hpp
new file mode 100644
index 00000000000..5e8ac4f2ed5
--- /dev/null
+++ b/3rdparty/asio/include/asio/file_base.hpp
@@ -0,0 +1,166 @@
+//
+// file_base.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_FILE_BASE_HPP
+#define ASIO_FILE_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_FILE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#if !defined(ASIO_WINDOWS)
+# include <fcntl.h>
+#endif // !defined(ASIO_WINDOWS)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// The file_base class is used as a base for the basic_stream_file and
+/// basic_random_access_file class templates so that we have a common place to
+/// define flags.
+class file_base
+{
+public:
+#if defined(GENERATING_DOCUMENTATION)
+ /// A bitmask type (C++ Std [lib.bitmask.types]).
+ typedef unspecified flags;
+
+ /// Open the file for reading.
+ static const flags read_only = implementation_defined;
+
+ /// Open the file for writing.
+ static const flags write_only = implementation_defined;
+
+ /// Open the file for reading and writing.
+ static const flags read_write = implementation_defined;
+
+ /// Open the file in append mode.
+ static const flags append = implementation_defined;
+
+ /// Create the file if it does not exist.
+ static const flags create = implementation_defined;
+
+ /// Ensure a new file is created. Must be combined with @c create.
+ static const flags exclusive = implementation_defined;
+
+ /// Open the file with any existing contents truncated.
+ static const flags truncate = implementation_defined;
+
+ /// Open the file so that write operations automatically synchronise the file
+ /// data and metadata to disk.
+ static const flags sync_all_on_write = implementation_defined;
+#else
+ enum flags
+ {
+#if defined(ASIO_WINDOWS)
+ read_only = 1,
+ write_only = 2,
+ read_write = 4,
+ append = 8,
+ create = 16,
+ exclusive = 32,
+ truncate = 64,
+ sync_all_on_write = 128
+#else // defined(ASIO_WINDOWS)
+ read_only = O_RDONLY,
+ write_only = O_WRONLY,
+ read_write = O_RDWR,
+ append = O_APPEND,
+ create = O_CREAT,
+ exclusive = O_EXCL,
+ truncate = O_TRUNC,
+ sync_all_on_write = O_SYNC
+#endif // defined(ASIO_WINDOWS)
+ };
+
+ // Implement bitmask operations as shown in C++ Std [lib.bitmask.types].
+
+ friend flags operator&(flags x, flags y)
+ {
+ return static_cast<flags>(
+ static_cast<unsigned int>(x) & static_cast<unsigned int>(y));
+ }
+
+ friend flags operator|(flags x, flags y)
+ {
+ return static_cast<flags>(
+ static_cast<unsigned int>(x) | static_cast<unsigned int>(y));
+ }
+
+ friend flags operator^(flags x, flags y)
+ {
+ return static_cast<flags>(
+ static_cast<unsigned int>(x) ^ static_cast<unsigned int>(y));
+ }
+
+ friend flags operator~(flags x)
+ {
+ return static_cast<flags>(~static_cast<unsigned int>(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
+
+ /// Basis for seeking in a file.
+ enum seek_basis
+ {
+#if defined(GENERATING_DOCUMENTATION)
+ /// Seek to an absolute position.
+ seek_set = implementation_defined,
+
+ /// Seek to an offset relative to the current file position.
+ seek_cur = implementation_defined,
+
+ /// Seek to an offset relative to the end of the file.
+ seek_end = implementation_defined
+#else
+ seek_set = SEEK_SET,
+ seek_cur = SEEK_CUR,
+ seek_end = SEEK_END
+#endif
+ };
+
+protected:
+ /// Protected destructor to prevent deletion through this type.
+ ~file_base()
+ {
+ }
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_FILE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_FILE_BASE_HPP
diff --git a/3rdparty/asio/include/asio/generic/basic_endpoint.hpp b/3rdparty/asio/include/asio/generic/basic_endpoint.hpp
new file mode 100644
index 00000000000..e7e1f6d4103
--- /dev/null
+++ b/3rdparty/asio/include/asio/generic/basic_endpoint.hpp
@@ -0,0 +1,189 @@
+//
+// generic/basic_endpoint.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Protocol>
+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() noexcept
+ {
+ }
+
+ /// 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 <typename Endpoint>
+ basic_endpoint(const Endpoint& endpoint)
+ : impl_(endpoint.data(), endpoint.size(), endpoint.protocol().protocol())
+ {
+ }
+
+ /// Copy constructor.
+ basic_endpoint(const basic_endpoint& other)
+ : impl_(other.impl_)
+ {
+ }
+
+ /// Move constructor.
+ basic_endpoint(basic_endpoint&& other)
+ : impl_(other.impl_)
+ {
+ }
+
+ /// Assign from another endpoint.
+ basic_endpoint& operator=(const basic_endpoint& other)
+ {
+ impl_ = other.impl_;
+ return *this;
+ }
+
+ /// Move-assign from another endpoint.
+ basic_endpoint& operator=(basic_endpoint&& other)
+ {
+ impl_ = other.impl_;
+ return *this;
+ }
+
+ /// 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<Protocol>& e1,
+ const basic_endpoint<Protocol>& e2)
+ {
+ return e1.impl_ == e2.impl_;
+ }
+
+ /// Compare two endpoints for inequality.
+ friend bool operator!=(const basic_endpoint<Protocol>& e1,
+ const basic_endpoint<Protocol>& e2)
+ {
+ return !(e1.impl_ == e2.impl_);
+ }
+
+ /// Compare endpoints for ordering.
+ friend bool operator<(const basic_endpoint<Protocol>& e1,
+ const basic_endpoint<Protocol>& e2)
+ {
+ return e1.impl_ < e2.impl_;
+ }
+
+ /// Compare endpoints for ordering.
+ friend bool operator>(const basic_endpoint<Protocol>& e1,
+ const basic_endpoint<Protocol>& e2)
+ {
+ return e2.impl_ < e1.impl_;
+ }
+
+ /// Compare endpoints for ordering.
+ friend bool operator<=(const basic_endpoint<Protocol>& e1,
+ const basic_endpoint<Protocol>& e2)
+ {
+ return !(e2 < e1);
+ }
+
+ /// Compare endpoints for ordering.
+ friend bool operator>=(const basic_endpoint<Protocol>& e1,
+ const basic_endpoint<Protocol>& 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/3rdparty/asio/include/asio/generic/datagram_protocol.hpp b/3rdparty/asio/include/asio/generic/datagram_protocol.hpp
new file mode 100644
index 00000000000..6e81cd6a084
--- /dev/null
+++ b/3rdparty/asio/include/asio/generic/datagram_protocol.hpp
@@ -0,0 +1,123 @@
+//
+// generic/datagram_protocol.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typeinfo>
+#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 <typename Protocol>
+ 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 noexcept
+ {
+ return ASIO_OS_DEF(SOCK_DGRAM);
+ }
+
+ /// Obtain an identifier for the protocol.
+ int protocol() const noexcept
+ {
+ return protocol_;
+ }
+
+ /// Obtain an identifier for the protocol family.
+ int family() const noexcept
+ {
+ 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<datagram_protocol> endpoint;
+
+ /// The generic socket type.
+ typedef basic_datagram_socket<datagram_protocol> 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/3rdparty/asio/include/asio/generic/detail/endpoint.hpp b/3rdparty/asio/include/asio/generic/detail/endpoint.hpp
new file mode 100644
index 00000000000..fdbcde92e5a
--- /dev/null
+++ b/3rdparty/asio/include/asio/generic/detail/endpoint.hpp
@@ -0,0 +1,133 @@
+//
+// generic/detail/endpoint.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#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/3rdparty/asio/include/asio/generic/detail/impl/endpoint.ipp b/3rdparty/asio/include/asio/generic/detail/impl/endpoint.ipp
new file mode 100644
index 00000000000..3e88c21098b
--- /dev/null
+++ b/3rdparty/asio/include/asio/generic/detail/impl/endpoint.ipp
@@ -0,0 +1,110 @@
+//
+// generic/detail/impl/endpoint.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstring>
+#include <typeinfo>
+#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/3rdparty/asio/include/asio/generic/raw_protocol.hpp b/3rdparty/asio/include/asio/generic/raw_protocol.hpp
new file mode 100644
index 00000000000..fc81cdd1ee9
--- /dev/null
+++ b/3rdparty/asio/include/asio/generic/raw_protocol.hpp
@@ -0,0 +1,121 @@
+//
+// generic/raw_protocol.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typeinfo>
+#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 <typename Protocol>
+ 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 noexcept
+ {
+ return ASIO_OS_DEF(SOCK_RAW);
+ }
+
+ /// Obtain an identifier for the protocol.
+ int protocol() const noexcept
+ {
+ return protocol_;
+ }
+
+ /// Obtain an identifier for the protocol family.
+ int family() const noexcept
+ {
+ 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<raw_protocol> endpoint;
+
+ /// The generic socket type.
+ typedef basic_raw_socket<raw_protocol> 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/3rdparty/asio/include/asio/generic/seq_packet_protocol.hpp b/3rdparty/asio/include/asio/generic/seq_packet_protocol.hpp
new file mode 100644
index 00000000000..e0342a47836
--- /dev/null
+++ b/3rdparty/asio/include/asio/generic/seq_packet_protocol.hpp
@@ -0,0 +1,122 @@
+//
+// generic/seq_packet_protocol.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typeinfo>
+#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 <typename Protocol>
+ 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 noexcept
+ {
+ return ASIO_OS_DEF(SOCK_SEQPACKET);
+ }
+
+ /// Obtain an identifier for the protocol.
+ int protocol() const noexcept
+ {
+ return protocol_;
+ }
+
+ /// Obtain an identifier for the protocol family.
+ int family() const noexcept
+ {
+ 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<seq_packet_protocol> endpoint;
+
+ /// The generic socket type.
+ typedef basic_seq_packet_socket<seq_packet_protocol> 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/3rdparty/asio/include/asio/generic/stream_protocol.hpp b/3rdparty/asio/include/asio/generic/stream_protocol.hpp
new file mode 100644
index 00000000000..270006e60ed
--- /dev/null
+++ b/3rdparty/asio/include/asio/generic/stream_protocol.hpp
@@ -0,0 +1,127 @@
+//
+// generic/stream_protocol.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typeinfo>
+#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 <typename Protocol>
+ 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 noexcept
+ {
+ return ASIO_OS_DEF(SOCK_STREAM);
+ }
+
+ /// Obtain an identifier for the protocol.
+ int protocol() const noexcept
+ {
+ return protocol_;
+ }
+
+ /// Obtain an identifier for the protocol family.
+ int family() const noexcept
+ {
+ 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<stream_protocol> endpoint;
+
+ /// The generic socket type.
+ typedef basic_stream_socket<stream_protocol> socket;
+
+#if !defined(ASIO_NO_IOSTREAM)
+ /// The generic socket iostream type.
+ typedef basic_socket_iostream<stream_protocol> 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/3rdparty/asio/include/asio/handler_continuation_hook.hpp b/3rdparty/asio/include/asio/handler_continuation_hook.hpp
new file mode 100644
index 00000000000..8c5c65243de
--- /dev/null
+++ b/3rdparty/asio/include/asio/handler_continuation_hook.hpp
@@ -0,0 +1,54 @@
+//
+// handler_continuation_hook.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <tt>false</tt>.
+ *
+ * @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/3rdparty/asio/include/asio/high_resolution_timer.hpp b/3rdparty/asio/include/asio/high_resolution_timer.hpp
new file mode 100644
index 00000000000..50e8030a225
--- /dev/null
+++ b/3rdparty/asio/include/asio/high_resolution_timer.hpp
@@ -0,0 +1,39 @@
+//
+// high_resolution_timer.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#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 &lt;chrono&gt; 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<boost::chrono::high_resolution_clock> timer;
+ * @endcode
+ */
+typedef basic_waitable_timer<
+ chrono::high_resolution_clock>
+ high_resolution_timer;
+
+} // namespace asio
+
+#endif // ASIO_HIGH_RESOLUTION_TIMER_HPP
diff --git a/3rdparty/asio/include/asio/impl/any_completion_executor.ipp b/3rdparty/asio/include/asio/impl/any_completion_executor.ipp
new file mode 100644
index 00000000000..fdad007dab1
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/any_completion_executor.ipp
@@ -0,0 +1,126 @@
+//
+// impl/any_completion_executor.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_ANY_COMPLETION_EXECUTOR_IPP
+#define ASIO_IMPL_ANY_COMPLETION_EXECUTOR_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_USE_TS_EXECUTOR_AS_DEFAULT)
+
+#include "asio/any_completion_executor.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+any_completion_executor::any_completion_executor() noexcept
+ : base_type()
+{
+}
+
+any_completion_executor::any_completion_executor(nullptr_t) noexcept
+ : base_type(nullptr_t())
+{
+}
+
+any_completion_executor::any_completion_executor(
+ const any_completion_executor& e) noexcept
+ : base_type(static_cast<const base_type&>(e))
+{
+}
+
+any_completion_executor::any_completion_executor(std::nothrow_t,
+ const any_completion_executor& e) noexcept
+ : base_type(static_cast<const base_type&>(e))
+{
+}
+
+any_completion_executor::any_completion_executor(
+ any_completion_executor&& e) noexcept
+ : base_type(static_cast<base_type&&>(e))
+{
+}
+
+any_completion_executor::any_completion_executor(std::nothrow_t,
+ any_completion_executor&& e) noexcept
+ : base_type(static_cast<base_type&&>(e))
+{
+}
+
+any_completion_executor& any_completion_executor::operator=(
+ const any_completion_executor& e) noexcept
+{
+ base_type::operator=(static_cast<const base_type&>(e));
+ return *this;
+}
+
+any_completion_executor& any_completion_executor::operator=(
+ any_completion_executor&& e) noexcept
+{
+ base_type::operator=(static_cast<base_type&&>(e));
+ return *this;
+}
+
+any_completion_executor& any_completion_executor::operator=(nullptr_t)
+{
+ base_type::operator=(nullptr_t());
+ return *this;
+}
+
+any_completion_executor::~any_completion_executor()
+{
+}
+
+void any_completion_executor::swap(
+ any_completion_executor& other) noexcept
+{
+ static_cast<base_type&>(*this).swap(static_cast<base_type&>(other));
+}
+
+template <>
+any_completion_executor any_completion_executor::prefer(
+ const execution::outstanding_work_t::tracked_t& p, int) const
+{
+ return static_cast<const base_type&>(*this).prefer(p);
+}
+
+template <>
+any_completion_executor any_completion_executor::prefer(
+ const execution::outstanding_work_t::untracked_t& p, int) const
+{
+ return static_cast<const base_type&>(*this).prefer(p);
+}
+
+template <>
+any_completion_executor any_completion_executor::prefer(
+ const execution::relationship_t::fork_t& p, int) const
+{
+ return static_cast<const base_type&>(*this).prefer(p);
+}
+
+template <>
+any_completion_executor any_completion_executor::prefer(
+ const execution::relationship_t::continuation_t& p, int) const
+{
+ return static_cast<const base_type&>(*this).prefer(p);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+#endif // ASIO_IMPL_ANY_COMPLETION_EXECUTOR_IPP
diff --git a/3rdparty/asio/include/asio/impl/any_io_executor.ipp b/3rdparty/asio/include/asio/impl/any_io_executor.ipp
new file mode 100644
index 00000000000..338ad4d3ae2
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/any_io_executor.ipp
@@ -0,0 +1,134 @@
+//
+// impl/any_io_executor.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_ANY_IO_EXECUTOR_IPP
+#define ASIO_IMPL_ANY_IO_EXECUTOR_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_USE_TS_EXECUTOR_AS_DEFAULT)
+
+#include "asio/any_io_executor.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+any_io_executor::any_io_executor() noexcept
+ : base_type()
+{
+}
+
+any_io_executor::any_io_executor(nullptr_t) noexcept
+ : base_type(nullptr_t())
+{
+}
+
+any_io_executor::any_io_executor(const any_io_executor& e) noexcept
+ : base_type(static_cast<const base_type&>(e))
+{
+}
+
+any_io_executor::any_io_executor(std::nothrow_t,
+ const any_io_executor& e) noexcept
+ : base_type(static_cast<const base_type&>(e))
+{
+}
+
+any_io_executor::any_io_executor(any_io_executor&& e) noexcept
+ : base_type(static_cast<base_type&&>(e))
+{
+}
+
+any_io_executor::any_io_executor(std::nothrow_t, any_io_executor&& e) noexcept
+ : base_type(static_cast<base_type&&>(e))
+{
+}
+
+any_io_executor& any_io_executor::operator=(const any_io_executor& e) noexcept
+{
+ base_type::operator=(static_cast<const base_type&>(e));
+ return *this;
+}
+
+any_io_executor& any_io_executor::operator=(any_io_executor&& e) noexcept
+{
+ base_type::operator=(static_cast<base_type&&>(e));
+ return *this;
+}
+
+any_io_executor& any_io_executor::operator=(nullptr_t)
+{
+ base_type::operator=(nullptr_t());
+ return *this;
+}
+
+any_io_executor::~any_io_executor()
+{
+}
+
+void any_io_executor::swap(any_io_executor& other) noexcept
+{
+ static_cast<base_type&>(*this).swap(static_cast<base_type&>(other));
+}
+
+template <>
+any_io_executor any_io_executor::require(
+ const execution::blocking_t::never_t& p, int) const
+{
+ return static_cast<const base_type&>(*this).require(p);
+}
+
+template <>
+any_io_executor any_io_executor::prefer(
+ const execution::blocking_t::possibly_t& p, int) const
+{
+ return static_cast<const base_type&>(*this).prefer(p);
+}
+
+template <>
+any_io_executor any_io_executor::prefer(
+ const execution::outstanding_work_t::tracked_t& p, int) const
+{
+ return static_cast<const base_type&>(*this).prefer(p);
+}
+
+template <>
+any_io_executor any_io_executor::prefer(
+ const execution::outstanding_work_t::untracked_t& p, int) const
+{
+ return static_cast<const base_type&>(*this).prefer(p);
+}
+
+template <>
+any_io_executor any_io_executor::prefer(
+ const execution::relationship_t::fork_t& p, int) const
+{
+ return static_cast<const base_type&>(*this).prefer(p);
+}
+
+template <>
+any_io_executor any_io_executor::prefer(
+ const execution::relationship_t::continuation_t& p, int) const
+{
+ return static_cast<const base_type&>(*this).prefer(p);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+#endif // ASIO_IMPL_ANY_IO_EXECUTOR_IPP
diff --git a/3rdparty/asio/include/asio/impl/append.hpp b/3rdparty/asio/include/asio/impl/append.hpp
new file mode 100644
index 00000000000..cfa54191fcd
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/append.hpp
@@ -0,0 +1,162 @@
+//
+// impl/append.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_APPEND_HPP
+#define ASIO_IMPL_APPEND_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/associator.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/detail/utility.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Class to adapt an append_t as a completion handler.
+template <typename Handler, typename... Values>
+class append_handler
+{
+public:
+ typedef void result_type;
+
+ template <typename H>
+ append_handler(H&& handler, std::tuple<Values...> values)
+ : handler_(static_cast<H&&>(handler)),
+ values_(static_cast<std::tuple<Values...>&&>(values))
+ {
+ }
+
+ template <typename... Args>
+ void operator()(Args&&... args)
+ {
+ this->invoke(
+ index_sequence_for<Values...>{},
+ static_cast<Args&&>(args)...);
+ }
+
+ template <std::size_t... I, typename... Args>
+ void invoke(index_sequence<I...>, Args&&... args)
+ {
+ static_cast<Handler&&>(handler_)(
+ static_cast<Args&&>(args)...,
+ static_cast<Values&&>(std::get<I>(values_))...);
+ }
+
+//private:
+ Handler handler_;
+ std::tuple<Values...> values_;
+};
+
+template <typename Handler>
+inline bool asio_handler_is_continuation(
+ append_handler<Handler>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Signature, typename... Values>
+struct append_signature;
+
+template <typename R, typename... Args, typename... Values>
+struct append_signature<R(Args...), Values...>
+{
+ typedef R type(decay_t<Args>..., Values...);
+};
+
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename CompletionToken, typename... Values, typename Signature>
+struct async_result<append_t<CompletionToken, Values...>, Signature>
+ : async_result<CompletionToken,
+ typename detail::append_signature<
+ Signature, Values...>::type>
+{
+ typedef typename detail::append_signature<
+ Signature, Values...>::type signature;
+
+ template <typename Initiation>
+ struct init_wrapper
+ {
+ init_wrapper(Initiation init)
+ : initiation_(static_cast<Initiation&&>(init))
+ {
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler,
+ std::tuple<Values...> values, Args&&... args)
+ {
+ static_cast<Initiation&&>(initiation_)(
+ detail::append_handler<decay_t<Handler>, Values...>(
+ static_cast<Handler&&>(handler),
+ static_cast<std::tuple<Values...>&&>(values)),
+ static_cast<Args&&>(args)...);
+ }
+
+ Initiation initiation_;
+ };
+
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static auto initiate(Initiation&& initiation,
+ RawCompletionToken&& token, Args&&... args)
+ -> decltype(
+ async_initiate<CompletionToken, signature>(
+ declval<init_wrapper<decay_t<Initiation>>>(),
+ token.token_,
+ static_cast<std::tuple<Values...>&&>(token.values_),
+ static_cast<Args&&>(args)...))
+ {
+ return async_initiate<CompletionToken, signature>(
+ init_wrapper<decay_t<Initiation>>(
+ static_cast<Initiation&&>(initiation)),
+ token.token_,
+ static_cast<std::tuple<Values...>&&>(token.values_),
+ static_cast<Args&&>(args)...);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename... Values, typename DefaultCandidate>
+struct associator<Associator,
+ detail::append_handler<Handler, Values...>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::append_handler<Handler, Values...>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::append_handler<Handler, Values...>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_APPEND_HPP
diff --git a/3rdparty/asio/include/asio/impl/as_tuple.hpp b/3rdparty/asio/include/asio/impl/as_tuple.hpp
new file mode 100644
index 00000000000..6d47510b997
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/as_tuple.hpp
@@ -0,0 +1,245 @@
+//
+// impl/as_tuple.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_AS_TUPLE_HPP
+#define ASIO_IMPL_AS_TUPLE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <tuple>
+#include "asio/associator.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Class to adapt a as_tuple_t as a completion handler.
+template <typename Handler>
+class as_tuple_handler
+{
+public:
+ typedef void result_type;
+
+ template <typename CompletionToken>
+ as_tuple_handler(as_tuple_t<CompletionToken> e)
+ : handler_(static_cast<CompletionToken&&>(e.token_))
+ {
+ }
+
+ template <typename RedirectedHandler>
+ as_tuple_handler(RedirectedHandler&& h)
+ : handler_(static_cast<RedirectedHandler&&>(h))
+ {
+ }
+
+ template <typename... Args>
+ void operator()(Args&&... args)
+ {
+ static_cast<Handler&&>(handler_)(
+ std::make_tuple(static_cast<Args&&>(args)...));
+ }
+
+//private:
+ Handler handler_;
+};
+
+template <typename Handler>
+inline bool asio_handler_is_continuation(
+ as_tuple_handler<Handler>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Signature>
+struct as_tuple_signature;
+
+template <typename R, typename... Args>
+struct as_tuple_signature<R(Args...)>
+{
+ typedef R type(std::tuple<decay_t<Args>...>);
+};
+
+template <typename R, typename... Args>
+struct as_tuple_signature<R(Args...) &>
+{
+ typedef R type(std::tuple<decay_t<Args>...>) &;
+};
+
+template <typename R, typename... Args>
+struct as_tuple_signature<R(Args...) &&>
+{
+ typedef R type(std::tuple<decay_t<Args>...>) &&;
+};
+
+#if defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+template <typename R, typename... Args>
+struct as_tuple_signature<R(Args...) noexcept>
+{
+ typedef R type(std::tuple<decay_t<Args>...>) noexcept;
+};
+
+template <typename R, typename... Args>
+struct as_tuple_signature<R(Args...) & noexcept>
+{
+ typedef R type(std::tuple<decay_t<Args>...>) & noexcept;
+};
+
+template <typename R, typename... Args>
+struct as_tuple_signature<R(Args...) && noexcept>
+{
+ typedef R type(std::tuple<decay_t<Args>...>) && noexcept;
+};
+
+#endif // defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename CompletionToken, typename... Signatures>
+struct async_result<as_tuple_t<CompletionToken>, Signatures...>
+ : async_result<CompletionToken,
+ typename detail::as_tuple_signature<Signatures>::type...>
+{
+ template <typename Initiation>
+ struct init_wrapper
+ {
+ init_wrapper(Initiation init)
+ : initiation_(static_cast<Initiation&&>(init))
+ {
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler, Args&&... args)
+ {
+ static_cast<Initiation&&>(initiation_)(
+ detail::as_tuple_handler<decay_t<Handler>>(
+ static_cast<Handler&&>(handler)),
+ static_cast<Args&&>(args)...);
+ }
+
+ Initiation initiation_;
+ };
+
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static auto initiate(Initiation&& initiation,
+ RawCompletionToken&& token, Args&&... args)
+ -> decltype(
+ async_initiate<
+ conditional_t<
+ is_const<remove_reference_t<RawCompletionToken>>::value,
+ const CompletionToken, CompletionToken>,
+ typename detail::as_tuple_signature<Signatures>::type...>(
+ init_wrapper<decay_t<Initiation>>(
+ static_cast<Initiation&&>(initiation)),
+ token.token_, static_cast<Args&&>(args)...))
+ {
+ return async_initiate<
+ conditional_t<
+ is_const<remove_reference_t<RawCompletionToken>>::value,
+ const CompletionToken, CompletionToken>,
+ typename detail::as_tuple_signature<Signatures>::type...>(
+ init_wrapper<decay_t<Initiation>>(
+ static_cast<Initiation&&>(initiation)),
+ token.token_, static_cast<Args&&>(args)...);
+ }
+};
+
+#if defined(ASIO_MSVC)
+
+// Workaround for MSVC internal compiler error.
+
+template <typename CompletionToken, typename Signature>
+struct async_result<as_tuple_t<CompletionToken>, Signature>
+ : async_result<CompletionToken,
+ typename detail::as_tuple_signature<Signature>::type>
+{
+ template <typename Initiation>
+ struct init_wrapper
+ {
+ init_wrapper(Initiation init)
+ : initiation_(static_cast<Initiation&&>(init))
+ {
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler, Args&&... args)
+ {
+ static_cast<Initiation&&>(initiation_)(
+ detail::as_tuple_handler<decay_t<Handler>>(
+ static_cast<Handler&&>(handler)),
+ static_cast<Args&&>(args)...);
+ }
+
+ Initiation initiation_;
+ };
+
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static auto initiate(Initiation&& initiation,
+ RawCompletionToken&& token, Args&&... args)
+ -> decltype(
+ async_initiate<
+ conditional_t<
+ is_const<remove_reference_t<RawCompletionToken>>::value,
+ const CompletionToken, CompletionToken>,
+ typename detail::as_tuple_signature<Signature>::type>(
+ init_wrapper<decay_t<Initiation>>(
+ static_cast<Initiation&&>(initiation)),
+ token.token_, static_cast<Args&&>(args)...))
+ {
+ return async_initiate<
+ conditional_t<
+ is_const<remove_reference_t<RawCompletionToken>>::value,
+ const CompletionToken, CompletionToken>,
+ typename detail::as_tuple_signature<Signature>::type>(
+ init_wrapper<decay_t<Initiation>>(
+ static_cast<Initiation&&>(initiation)),
+ token.token_, static_cast<Args&&>(args)...);
+ }
+};
+
+#endif // defined(ASIO_MSVC)
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::as_tuple_handler<Handler>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::as_tuple_handler<Handler>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::as_tuple_handler<Handler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_AS_TUPLE_HPP
diff --git a/3rdparty/asio/include/asio/impl/awaitable.hpp b/3rdparty/asio/include/asio/impl/awaitable.hpp
new file mode 100644
index 00000000000..c5ea2649171
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/awaitable.hpp
@@ -0,0 +1,1196 @@
+//
+// impl/awaitable.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_AWAITABLE_HPP
+#define ASIO_IMPL_AWAITABLE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <exception>
+#include <new>
+#include <tuple>
+#include "asio/cancellation_signal.hpp"
+#include "asio/cancellation_state.hpp"
+#include "asio/detail/thread_context.hpp"
+#include "asio/detail/thread_info_base.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+#include "asio/post.hpp"
+#include "asio/system_error.hpp"
+#include "asio/this_coro.hpp"
+
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+# include "asio/detail/source_location.hpp"
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+struct awaitable_thread_has_context_switched {};
+template <typename, typename> class awaitable_async_op_handler;
+template <typename, typename, typename> class awaitable_async_op;
+
+// An awaitable_thread represents a thread-of-execution that is composed of one
+// or more "stack frames", with each frame represented by an awaitable_frame.
+// All execution occurs in the context of the awaitable_thread's executor. An
+// awaitable_thread continues to "pump" the stack frames by repeatedly resuming
+// the top stack frame until the stack is empty, or until ownership of the
+// stack is transferred to another awaitable_thread object.
+//
+// +------------------------------------+
+// | top_of_stack_ |
+// | V
+// +--------------+---+ +-----------------+
+// | | | |
+// | awaitable_thread |<---------------------------+ awaitable_frame |
+// | | attached_thread_ | |
+// +--------------+---+ (Set only when +---+-------------+
+// | frames are being |
+// | actively pumped | caller_
+// | by a thread, and |
+// | then only for V
+// | the top frame.) +-----------------+
+// | | |
+// | | awaitable_frame |
+// | | |
+// | +---+-------------+
+// | |
+// | | caller_
+// | :
+// | :
+// | |
+// | V
+// | +-----------------+
+// | bottom_of_stack_ | |
+// +------------------------------->| awaitable_frame |
+// | |
+// +-----------------+
+
+template <typename Executor>
+class awaitable_frame_base
+{
+public:
+#if !defined(ASIO_DISABLE_AWAITABLE_FRAME_RECYCLING)
+ void* operator new(std::size_t size)
+ {
+ return asio::detail::thread_info_base::allocate(
+ asio::detail::thread_info_base::awaitable_frame_tag(),
+ asio::detail::thread_context::top_of_thread_call_stack(),
+ size);
+ }
+
+ void operator delete(void* pointer, std::size_t size)
+ {
+ asio::detail::thread_info_base::deallocate(
+ asio::detail::thread_info_base::awaitable_frame_tag(),
+ asio::detail::thread_context::top_of_thread_call_stack(),
+ pointer, size);
+ }
+#endif // !defined(ASIO_DISABLE_AWAITABLE_FRAME_RECYCLING)
+
+ // The frame starts in a suspended state until the awaitable_thread object
+ // pumps the stack.
+ auto initial_suspend() noexcept
+ {
+ return suspend_always();
+ }
+
+ // On final suspension the frame is popped from the top of the stack.
+ auto final_suspend() noexcept
+ {
+ struct result
+ {
+ awaitable_frame_base* this_;
+
+ bool await_ready() const noexcept
+ {
+ return false;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ this->this_->pop_frame();
+ }
+
+ void await_resume() const noexcept
+ {
+ }
+ };
+
+ return result{this};
+ }
+
+ void set_except(std::exception_ptr e) noexcept
+ {
+ pending_exception_ = e;
+ }
+
+ void set_error(const asio::error_code& ec)
+ {
+ this->set_except(std::make_exception_ptr(asio::system_error(ec)));
+ }
+
+ 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);
+ }
+ }
+
+ void clear_cancellation_slot()
+ {
+ this->attached_thread_->entry_point()->cancellation_state_.slot().clear();
+ }
+
+ template <typename T>
+ auto await_transform(awaitable<T, Executor> a) const
+ {
+ if (attached_thread_->entry_point()->throw_if_cancelled_)
+ if (!!attached_thread_->get_cancellation_state().cancelled())
+ throw_error(asio::error::operation_aborted, "co_await");
+ return a;
+ }
+
+ template <typename Op>
+ auto await_transform(Op&& op,
+ constraint_t<is_async_operation<Op>::value> = 0
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ , detail::source_location location = detail::source_location::current()
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ )
+ {
+ if (attached_thread_->entry_point()->throw_if_cancelled_)
+ if (!!attached_thread_->get_cancellation_state().cancelled())
+ throw_error(asio::error::operation_aborted, "co_await");
+
+ return awaitable_async_op<
+ completion_signature_of_t<Op>, decay_t<Op>, Executor>{
+ std::forward<Op>(op), this
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ , location
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ };
+ }
+
+ // This await transformation obtains the associated executor of the thread of
+ // execution.
+ auto await_transform(this_coro::executor_t) noexcept
+ {
+ struct result
+ {
+ awaitable_frame_base* this_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ auto await_resume() const noexcept
+ {
+ return this_->attached_thread_->get_executor();
+ }
+ };
+
+ return result{this};
+ }
+
+ // This await transformation obtains the associated cancellation state of the
+ // thread of execution.
+ auto await_transform(this_coro::cancellation_state_t) noexcept
+ {
+ struct result
+ {
+ awaitable_frame_base* this_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ auto await_resume() const noexcept
+ {
+ return this_->attached_thread_->get_cancellation_state();
+ }
+ };
+
+ return result{this};
+ }
+
+ // This await transformation resets the associated cancellation state.
+ auto await_transform(this_coro::reset_cancellation_state_0_t) noexcept
+ {
+ struct result
+ {
+ awaitable_frame_base* this_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ auto await_resume() const
+ {
+ return this_->attached_thread_->reset_cancellation_state();
+ }
+ };
+
+ return result{this};
+ }
+
+ // This await transformation resets the associated cancellation state.
+ template <typename Filter>
+ auto await_transform(
+ this_coro::reset_cancellation_state_1_t<Filter> reset) noexcept
+ {
+ struct result
+ {
+ awaitable_frame_base* this_;
+ Filter filter_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ auto await_resume()
+ {
+ return this_->attached_thread_->reset_cancellation_state(
+ static_cast<Filter&&>(filter_));
+ }
+ };
+
+ return result{this, static_cast<Filter&&>(reset.filter)};
+ }
+
+ // This await transformation resets the associated cancellation state.
+ template <typename InFilter, typename OutFilter>
+ auto await_transform(
+ this_coro::reset_cancellation_state_2_t<InFilter, OutFilter> reset)
+ noexcept
+ {
+ struct result
+ {
+ awaitable_frame_base* this_;
+ InFilter in_filter_;
+ OutFilter out_filter_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ auto await_resume()
+ {
+ return this_->attached_thread_->reset_cancellation_state(
+ static_cast<InFilter&&>(in_filter_),
+ static_cast<OutFilter&&>(out_filter_));
+ }
+ };
+
+ return result{this,
+ static_cast<InFilter&&>(reset.in_filter),
+ static_cast<OutFilter&&>(reset.out_filter)};
+ }
+
+ // This await transformation determines whether cancellation is propagated as
+ // an exception.
+ auto await_transform(this_coro::throw_if_cancelled_0_t)
+ noexcept
+ {
+ struct result
+ {
+ awaitable_frame_base* this_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ auto await_resume()
+ {
+ return this_->attached_thread_->throw_if_cancelled();
+ }
+ };
+
+ return result{this};
+ }
+
+ // This await transformation sets whether cancellation is propagated as an
+ // exception.
+ auto await_transform(this_coro::throw_if_cancelled_1_t throw_if_cancelled)
+ noexcept
+ {
+ struct result
+ {
+ awaitable_frame_base* this_;
+ bool value_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ auto await_resume()
+ {
+ this_->attached_thread_->throw_if_cancelled(value_);
+ }
+ };
+
+ return result{this, throw_if_cancelled.value};
+ }
+
+ // This await transformation is used to run an async operation's initiation
+ // function object after the coroutine has been suspended. This ensures that
+ // immediate resumption of the coroutine in another thread does not cause a
+ // race condition.
+ template <typename Function>
+ auto await_transform(Function f,
+ enable_if_t<
+ is_convertible<
+ result_of_t<Function(awaitable_frame_base*)>,
+ awaitable_thread<Executor>*
+ >::value
+ >* = nullptr)
+ {
+ struct result
+ {
+ Function function_;
+ awaitable_frame_base* this_;
+
+ bool await_ready() const noexcept
+ {
+ return false;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ this_->after_suspend(
+ [](void* arg)
+ {
+ result* r = static_cast<result*>(arg);
+ r->function_(r->this_);
+ }, this);
+ }
+
+ void await_resume() const noexcept
+ {
+ }
+ };
+
+ return result{std::move(f), this};
+ }
+
+ // Access the awaitable thread's has_context_switched_ flag.
+ auto await_transform(detail::awaitable_thread_has_context_switched) noexcept
+ {
+ struct result
+ {
+ awaitable_frame_base* this_;
+
+ bool await_ready() const noexcept
+ {
+ return true;
+ }
+
+ void await_suspend(coroutine_handle<void>) noexcept
+ {
+ }
+
+ bool& await_resume() const noexcept
+ {
+ return this_->attached_thread_->entry_point()->has_context_switched_;
+ }
+ };
+
+ return result{this};
+ }
+
+ void attach_thread(awaitable_thread<Executor>* handler) noexcept
+ {
+ attached_thread_ = handler;
+ }
+
+ awaitable_thread<Executor>* detach_thread() noexcept
+ {
+ attached_thread_->entry_point()->has_context_switched_ = true;
+ return std::exchange(attached_thread_, nullptr);
+ }
+
+ void push_frame(awaitable_frame_base<Executor>* caller) noexcept
+ {
+ caller_ = caller;
+ attached_thread_ = caller_->attached_thread_;
+ attached_thread_->entry_point()->top_of_stack_ = this;
+ caller_->attached_thread_ = nullptr;
+ }
+
+ void pop_frame() noexcept
+ {
+ if (caller_)
+ caller_->attached_thread_ = attached_thread_;
+ attached_thread_->entry_point()->top_of_stack_ = caller_;
+ attached_thread_ = nullptr;
+ caller_ = nullptr;
+ }
+
+ struct resume_context
+ {
+ void (*after_suspend_fn_)(void*) = nullptr;
+ void *after_suspend_arg_ = nullptr;
+ };
+
+ void resume()
+ {
+ resume_context context;
+ resume_context_ = &context;
+ coro_.resume();
+ if (context.after_suspend_fn_)
+ context.after_suspend_fn_(context.after_suspend_arg_);
+ }
+
+ void after_suspend(void (*fn)(void*), void* arg)
+ {
+ resume_context_->after_suspend_fn_ = fn;
+ resume_context_->after_suspend_arg_ = arg;
+ }
+
+ void destroy()
+ {
+ coro_.destroy();
+ }
+
+protected:
+ coroutine_handle<void> coro_ = nullptr;
+ awaitable_thread<Executor>* attached_thread_ = nullptr;
+ awaitable_frame_base<Executor>* caller_ = nullptr;
+ std::exception_ptr pending_exception_ = nullptr;
+ resume_context* resume_context_ = nullptr;
+};
+
+template <typename T, typename Executor>
+class awaitable_frame
+ : public awaitable_frame_base<Executor>
+{
+public:
+ awaitable_frame() noexcept
+ {
+ }
+
+ awaitable_frame(awaitable_frame&& other) noexcept
+ : awaitable_frame_base<Executor>(std::move(other))
+ {
+ }
+
+ ~awaitable_frame()
+ {
+ if (has_result_)
+ std::launder(static_cast<T*>(static_cast<void*>(result_)))->~T();
+ }
+
+ awaitable<T, Executor> get_return_object() noexcept
+ {
+ this->coro_ = coroutine_handle<awaitable_frame>::from_promise(*this);
+ return awaitable<T, Executor>(this);
+ };
+
+ template <typename U>
+ void return_value(U&& u)
+ {
+ new (&result_) T(std::forward<U>(u));
+ has_result_ = true;
+ }
+
+ template <typename... Us>
+ void return_values(Us&&... us)
+ {
+ this->return_value(std::forward_as_tuple(std::forward<Us>(us)...));
+ }
+
+ T get()
+ {
+ this->caller_ = nullptr;
+ this->rethrow_exception();
+ return std::move(*std::launder(
+ static_cast<T*>(static_cast<void*>(result_))));
+ }
+
+private:
+ alignas(T) unsigned char result_[sizeof(T)];
+ bool has_result_ = false;
+};
+
+template <typename Executor>
+class awaitable_frame<void, Executor>
+ : public awaitable_frame_base<Executor>
+{
+public:
+ awaitable<void, Executor> get_return_object()
+ {
+ this->coro_ = coroutine_handle<awaitable_frame>::from_promise(*this);
+ return awaitable<void, Executor>(this);
+ };
+
+ void return_void()
+ {
+ }
+
+ void get()
+ {
+ this->caller_ = nullptr;
+ this->rethrow_exception();
+ }
+};
+
+struct awaitable_thread_entry_point {};
+
+template <typename Executor>
+class awaitable_frame<awaitable_thread_entry_point, Executor>
+ : public awaitable_frame_base<Executor>
+{
+public:
+ awaitable_frame()
+ : top_of_stack_(0),
+ has_executor_(false),
+ has_context_switched_(false),
+ throw_if_cancelled_(true)
+ {
+ }
+
+ ~awaitable_frame()
+ {
+ if (has_executor_)
+ u_.executor_.~Executor();
+ }
+
+ awaitable<awaitable_thread_entry_point, Executor> get_return_object()
+ {
+ this->coro_ = coroutine_handle<awaitable_frame>::from_promise(*this);
+ return awaitable<awaitable_thread_entry_point, Executor>(this);
+ };
+
+ void return_void()
+ {
+ }
+
+ void get()
+ {
+ this->caller_ = nullptr;
+ this->rethrow_exception();
+ }
+
+private:
+ template <typename> friend class awaitable_frame_base;
+ template <typename, typename> friend class awaitable_async_op_handler;
+ template <typename, typename> friend class awaitable_handler_base;
+ template <typename> friend class awaitable_thread;
+
+ union u
+ {
+ u() {}
+ ~u() {}
+ char c_;
+ Executor executor_;
+ } u_;
+
+ awaitable_frame_base<Executor>* top_of_stack_;
+ asio::cancellation_slot parent_cancellation_slot_;
+ asio::cancellation_state cancellation_state_;
+ bool has_executor_;
+ bool has_context_switched_;
+ bool throw_if_cancelled_;
+};
+
+template <typename Executor>
+class awaitable_thread
+{
+public:
+ typedef Executor executor_type;
+ typedef cancellation_slot cancellation_slot_type;
+
+ // Construct from the entry point of a new thread of execution.
+ awaitable_thread(awaitable<awaitable_thread_entry_point, Executor> p,
+ const Executor& ex, cancellation_slot parent_cancel_slot,
+ cancellation_state cancel_state)
+ : bottom_of_stack_(std::move(p))
+ {
+ bottom_of_stack_.frame_->top_of_stack_ = bottom_of_stack_.frame_;
+ new (&bottom_of_stack_.frame_->u_.executor_) Executor(ex);
+ bottom_of_stack_.frame_->has_executor_ = true;
+ bottom_of_stack_.frame_->parent_cancellation_slot_ = parent_cancel_slot;
+ bottom_of_stack_.frame_->cancellation_state_ = cancel_state;
+ }
+
+ // Transfer ownership from another awaitable_thread.
+ awaitable_thread(awaitable_thread&& other) noexcept
+ : bottom_of_stack_(std::move(other.bottom_of_stack_))
+ {
+ }
+
+ // Clean up with a last ditch effort to ensure the thread is unwound within
+ // the context of the executor.
+ ~awaitable_thread()
+ {
+ if (bottom_of_stack_.valid())
+ {
+ // Coroutine "stack unwinding" must be performed through the executor.
+ auto* bottom_frame = bottom_of_stack_.frame_;
+ (post)(bottom_frame->u_.executor_,
+ [a = std::move(bottom_of_stack_)]() mutable
+ {
+ (void)awaitable<awaitable_thread_entry_point, Executor>(
+ std::move(a));
+ });
+ }
+ }
+
+ awaitable_frame<awaitable_thread_entry_point, Executor>* entry_point()
+ {
+ return bottom_of_stack_.frame_;
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return bottom_of_stack_.frame_->u_.executor_;
+ }
+
+ cancellation_state get_cancellation_state() const noexcept
+ {
+ return bottom_of_stack_.frame_->cancellation_state_;
+ }
+
+ void reset_cancellation_state()
+ {
+ bottom_of_stack_.frame_->cancellation_state_ =
+ cancellation_state(bottom_of_stack_.frame_->parent_cancellation_slot_);
+ }
+
+ template <typename Filter>
+ void reset_cancellation_state(Filter&& filter)
+ {
+ bottom_of_stack_.frame_->cancellation_state_ =
+ cancellation_state(bottom_of_stack_.frame_->parent_cancellation_slot_,
+ static_cast<Filter&&>(filter));
+ }
+
+ template <typename InFilter, typename OutFilter>
+ void reset_cancellation_state(InFilter&& in_filter,
+ OutFilter&& out_filter)
+ {
+ bottom_of_stack_.frame_->cancellation_state_ =
+ cancellation_state(bottom_of_stack_.frame_->parent_cancellation_slot_,
+ static_cast<InFilter&&>(in_filter),
+ static_cast<OutFilter&&>(out_filter));
+ }
+
+ bool throw_if_cancelled() const
+ {
+ return bottom_of_stack_.frame_->throw_if_cancelled_;
+ }
+
+ void throw_if_cancelled(bool value)
+ {
+ bottom_of_stack_.frame_->throw_if_cancelled_ = value;
+ }
+
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return bottom_of_stack_.frame_->cancellation_state_.slot();
+ }
+
+ // Launch a new thread of execution.
+ void launch()
+ {
+ bottom_of_stack_.frame_->top_of_stack_->attach_thread(this);
+ pump();
+ }
+
+protected:
+ template <typename> friend class awaitable_frame_base;
+
+ // Repeatedly resume the top stack frame until the stack is empty or until it
+ // has been transferred to another resumable_thread object.
+ void pump()
+ {
+ do
+ bottom_of_stack_.frame_->top_of_stack_->resume();
+ while (bottom_of_stack_.frame_ && bottom_of_stack_.frame_->top_of_stack_);
+
+ if (bottom_of_stack_.frame_)
+ {
+ awaitable<awaitable_thread_entry_point, Executor> a(
+ std::move(bottom_of_stack_));
+ a.frame_->rethrow_exception();
+ }
+ }
+
+ awaitable<awaitable_thread_entry_point, Executor> bottom_of_stack_;
+};
+
+template <typename Signature, typename Executor>
+class awaitable_async_op_handler;
+
+template <typename R, typename Executor>
+class awaitable_async_op_handler<R(), Executor>
+ : public awaitable_thread<Executor>
+{
+public:
+ struct result_type {};
+
+ awaitable_async_op_handler(
+ awaitable_thread<Executor>* h, result_type&)
+ : awaitable_thread<Executor>(std::move(*h))
+ {
+ }
+
+ void operator()()
+ {
+ this->entry_point()->top_of_stack_->attach_thread(this);
+ this->entry_point()->top_of_stack_->clear_cancellation_slot();
+ this->pump();
+ }
+
+ static void resume(result_type&)
+ {
+ }
+};
+
+template <typename R, typename Executor>
+class awaitable_async_op_handler<R(asio::error_code), Executor>
+ : public awaitable_thread<Executor>
+{
+public:
+ typedef asio::error_code* result_type;
+
+ awaitable_async_op_handler(
+ awaitable_thread<Executor>* h, result_type& result)
+ : awaitable_thread<Executor>(std::move(*h)),
+ result_(result)
+ {
+ }
+
+ void operator()(asio::error_code ec)
+ {
+ result_ = &ec;
+ this->entry_point()->top_of_stack_->attach_thread(this);
+ this->entry_point()->top_of_stack_->clear_cancellation_slot();
+ this->pump();
+ }
+
+ static void resume(result_type& result)
+ {
+ throw_error(*result);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename R, typename Executor>
+class awaitable_async_op_handler<R(std::exception_ptr), Executor>
+ : public awaitable_thread<Executor>
+{
+public:
+ typedef std::exception_ptr* result_type;
+
+ awaitable_async_op_handler(
+ awaitable_thread<Executor>* h, result_type& result)
+ : awaitable_thread<Executor>(std::move(*h)),
+ result_(result)
+ {
+ }
+
+ void operator()(std::exception_ptr ex)
+ {
+ result_ = &ex;
+ this->entry_point()->top_of_stack_->attach_thread(this);
+ this->entry_point()->top_of_stack_->clear_cancellation_slot();
+ this->pump();
+ }
+
+ static void resume(result_type& result)
+ {
+ if (*result)
+ {
+ std::exception_ptr ex = std::exchange(*result, nullptr);
+ std::rethrow_exception(ex);
+ }
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename R, typename T, typename Executor>
+class awaitable_async_op_handler<R(T), Executor>
+ : public awaitable_thread<Executor>
+{
+public:
+ typedef T* result_type;
+
+ awaitable_async_op_handler(
+ awaitable_thread<Executor>* h, result_type& result)
+ : awaitable_thread<Executor>(std::move(*h)),
+ result_(result)
+ {
+ }
+
+ void operator()(T result)
+ {
+ result_ = &result;
+ this->entry_point()->top_of_stack_->attach_thread(this);
+ this->entry_point()->top_of_stack_->clear_cancellation_slot();
+ this->pump();
+ }
+
+ static T resume(result_type& result)
+ {
+ return std::move(*result);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename R, typename T, typename Executor>
+class awaitable_async_op_handler<R(asio::error_code, T), Executor>
+ : public awaitable_thread<Executor>
+{
+public:
+ struct result_type
+ {
+ asio::error_code* ec_;
+ T* value_;
+ };
+
+ awaitable_async_op_handler(
+ awaitable_thread<Executor>* h, result_type& result)
+ : awaitable_thread<Executor>(std::move(*h)),
+ result_(result)
+ {
+ }
+
+ void operator()(asio::error_code ec, T value)
+ {
+ result_.ec_ = &ec;
+ result_.value_ = &value;
+ this->entry_point()->top_of_stack_->attach_thread(this);
+ this->entry_point()->top_of_stack_->clear_cancellation_slot();
+ this->pump();
+ }
+
+ static T resume(result_type& result)
+ {
+ throw_error(*result.ec_);
+ return std::move(*result.value_);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename R, typename T, typename Executor>
+class awaitable_async_op_handler<R(std::exception_ptr, T), Executor>
+ : public awaitable_thread<Executor>
+{
+public:
+ struct result_type
+ {
+ std::exception_ptr* ex_;
+ T* value_;
+ };
+
+ awaitable_async_op_handler(
+ awaitable_thread<Executor>* h, result_type& result)
+ : awaitable_thread<Executor>(std::move(*h)),
+ result_(result)
+ {
+ }
+
+ void operator()(std::exception_ptr ex, T value)
+ {
+ result_.ex_ = &ex;
+ result_.value_ = &value;
+ this->entry_point()->top_of_stack_->attach_thread(this);
+ this->entry_point()->top_of_stack_->clear_cancellation_slot();
+ this->pump();
+ }
+
+ static T resume(result_type& result)
+ {
+ if (*result.ex_)
+ {
+ std::exception_ptr ex = std::exchange(*result.ex_, nullptr);
+ std::rethrow_exception(ex);
+ }
+ return std::move(*result.value_);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename R, typename... Ts, typename Executor>
+class awaitable_async_op_handler<R(Ts...), Executor>
+ : public awaitable_thread<Executor>
+{
+public:
+ typedef std::tuple<Ts...>* result_type;
+
+ awaitable_async_op_handler(
+ awaitable_thread<Executor>* h, result_type& result)
+ : awaitable_thread<Executor>(std::move(*h)),
+ result_(result)
+ {
+ }
+
+ template <typename... Args>
+ void operator()(Args&&... args)
+ {
+ std::tuple<Ts...> result(std::forward<Args>(args)...);
+ result_ = &result;
+ this->entry_point()->top_of_stack_->attach_thread(this);
+ this->entry_point()->top_of_stack_->clear_cancellation_slot();
+ this->pump();
+ }
+
+ static std::tuple<Ts...> resume(result_type& result)
+ {
+ return std::move(*result);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename R, typename... Ts, typename Executor>
+class awaitable_async_op_handler<R(asio::error_code, Ts...), Executor>
+ : public awaitable_thread<Executor>
+{
+public:
+ struct result_type
+ {
+ asio::error_code* ec_;
+ std::tuple<Ts...>* value_;
+ };
+
+ awaitable_async_op_handler(
+ awaitable_thread<Executor>* h, result_type& result)
+ : awaitable_thread<Executor>(std::move(*h)),
+ result_(result)
+ {
+ }
+
+ template <typename... Args>
+ void operator()(asio::error_code ec, Args&&... args)
+ {
+ result_.ec_ = &ec;
+ std::tuple<Ts...> value(std::forward<Args>(args)...);
+ result_.value_ = &value;
+ this->entry_point()->top_of_stack_->attach_thread(this);
+ this->entry_point()->top_of_stack_->clear_cancellation_slot();
+ this->pump();
+ }
+
+ static std::tuple<Ts...> resume(result_type& result)
+ {
+ throw_error(*result.ec_);
+ return std::move(*result.value_);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename R, typename... Ts, typename Executor>
+class awaitable_async_op_handler<R(std::exception_ptr, Ts...), Executor>
+ : public awaitable_thread<Executor>
+{
+public:
+ struct result_type
+ {
+ std::exception_ptr* ex_;
+ std::tuple<Ts...>* value_;
+ };
+
+ awaitable_async_op_handler(
+ awaitable_thread<Executor>* h, result_type& result)
+ : awaitable_thread<Executor>(std::move(*h)),
+ result_(result)
+ {
+ }
+
+ template <typename... Args>
+ void operator()(std::exception_ptr ex, Args&&... args)
+ {
+ result_.ex_ = &ex;
+ std::tuple<Ts...> value(std::forward<Args>(args)...);
+ result_.value_ = &value;
+ this->entry_point()->top_of_stack_->attach_thread(this);
+ this->entry_point()->top_of_stack_->clear_cancellation_slot();
+ this->pump();
+ }
+
+ static std::tuple<Ts...> resume(result_type& result)
+ {
+ if (*result.ex_)
+ {
+ std::exception_ptr ex = std::exchange(*result.ex_, nullptr);
+ std::rethrow_exception(ex);
+ }
+ return std::move(*result.value_);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename Signature, typename Op, typename Executor>
+class awaitable_async_op
+{
+public:
+ typedef awaitable_async_op_handler<Signature, Executor> handler_type;
+
+ awaitable_async_op(Op&& o, awaitable_frame_base<Executor>* frame
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ , const detail::source_location& location
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ )
+ : op_(std::forward<Op>(o)),
+ frame_(frame),
+ result_()
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ , location_(location)
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ {
+ }
+
+ bool await_ready() const noexcept
+ {
+ return false;
+ }
+
+ void await_suspend(coroutine_handle<void>)
+ {
+ frame_->after_suspend(
+ [](void* arg)
+ {
+ awaitable_async_op* self = static_cast<awaitable_async_op*>(arg);
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ ASIO_HANDLER_LOCATION((self->location_.file_name(),
+ self->location_.line(), self->location_.function_name()));
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ std::forward<Op&&>(self->op_)(
+ handler_type(self->frame_->detach_thread(), self->result_));
+ }, this);
+ }
+
+ auto await_resume()
+ {
+ return handler_type::resume(result_);
+ }
+
+private:
+ Op&& op_;
+ awaitable_frame_base<Executor>* frame_;
+ typename handler_type::result_type result_;
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ detail::source_location location_;
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+};
+
+} // namespace detail
+} // namespace asio
+
+#if !defined(GENERATING_DOCUMENTATION)
+# if defined(ASIO_HAS_STD_COROUTINE)
+
+namespace std {
+
+template <typename T, typename Executor, typename... Args>
+struct coroutine_traits<asio::awaitable<T, Executor>, Args...>
+{
+ typedef asio::detail::awaitable_frame<T, Executor> promise_type;
+};
+
+} // namespace std
+
+# else // defined(ASIO_HAS_STD_COROUTINE)
+
+namespace std { namespace experimental {
+
+template <typename T, typename Executor, typename... Args>
+struct coroutine_traits<asio::awaitable<T, Executor>, Args...>
+{
+ typedef asio::detail::awaitable_frame<T, Executor> promise_type;
+};
+
+}} // namespace std::experimental
+
+# endif // defined(ASIO_HAS_STD_COROUTINE)
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_AWAITABLE_HPP
diff --git a/3rdparty/asio/include/asio/impl/buffered_read_stream.hpp b/3rdparty/asio/include/asio/impl/buffered_read_stream.hpp
new file mode 100644
index 00000000000..9a1d78b465e
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/buffered_read_stream.hpp
@@ -0,0 +1,404 @@
+//
+// impl/buffered_read_stream.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/associator.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+template <typename Stream>
+std::size_t buffered_read_stream<Stream>::fill()
+{
+ detail::buffer_resize_guard<detail::buffered_stream_storage>
+ 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 <typename Stream>
+std::size_t buffered_read_stream<Stream>::fill(asio::error_code& ec)
+{
+ detail::buffer_resize_guard<detail::buffered_stream_storage>
+ 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 <typename ReadHandler>
+ 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_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ 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_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(const asio::error_code& ec,
+ const std::size_t bytes_transferred)
+ {
+ storage_.resize(previous_size_ + bytes_transferred);
+ static_cast<ReadHandler&&>(handler_)(ec, bytes_transferred);
+ }
+
+ //private:
+ detail::buffered_stream_storage& storage_;
+ std::size_t previous_size_;
+ ReadHandler handler_;
+ };
+
+ template <typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ buffered_fill_handler<ReadHandler>* this_handler)
+ {
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename Stream>
+ class initiate_async_buffered_fill
+ {
+ public:
+ typedef typename remove_reference_t<
+ Stream>::lowest_layer_type::executor_type executor_type;
+
+ explicit initiate_async_buffered_fill(
+ remove_reference_t<Stream>& next_layer)
+ : next_layer_(next_layer)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return next_layer_.lowest_layer().get_executor();
+ }
+
+ template <typename ReadHandler>
+ void operator()(ReadHandler&& handler,
+ buffered_stream_storage* storage) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(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),
+ buffered_fill_handler<decay_t<ReadHandler>>(
+ *storage, previous_size, handler2.value));
+ }
+
+ private:
+ remove_reference_t<Stream>& next_layer_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename ReadHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::buffered_fill_handler<ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::buffered_fill_handler<ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::buffered_fill_handler<ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename Stream>
+template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadHandler>
+inline auto buffered_read_stream<Stream>::async_fill(ReadHandler&& handler)
+ -> decltype(
+ async_initiate<ReadHandler,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_buffered_fill<Stream>>(),
+ handler, declval<detail::buffered_stream_storage*>()))
+{
+ return async_initiate<ReadHandler,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_buffered_fill<Stream>(next_layer_),
+ handler, &storage_);
+}
+
+template <typename Stream>
+template <typename MutableBufferSequence>
+std::size_t buffered_read_stream<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 <typename Stream>
+template <typename MutableBufferSequence>
+std::size_t buffered_read_stream<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 <typename MutableBufferSequence, typename ReadHandler>
+ 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_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ 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_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(const asio::error_code& ec, std::size_t)
+ {
+ if (ec || storage_.empty())
+ {
+ const std::size_t length = 0;
+ static_cast<ReadHandler&&>(handler_)(ec, length);
+ }
+ else
+ {
+ const std::size_t bytes_copied = asio::buffer_copy(
+ buffers_, storage_.data(), storage_.size());
+ storage_.consume(bytes_copied);
+ static_cast<ReadHandler&&>(handler_)(ec, bytes_copied);
+ }
+ }
+
+ //private:
+ detail::buffered_stream_storage& storage_;
+ MutableBufferSequence buffers_;
+ ReadHandler handler_;
+ };
+
+ template <typename MutableBufferSequence, typename ReadHandler>
+ 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 <typename Stream>
+ class initiate_async_buffered_read_some
+ {
+ public:
+ typedef typename remove_reference_t<
+ Stream>::lowest_layer_type::executor_type executor_type;
+
+ explicit initiate_async_buffered_read_some(
+ remove_reference_t<Stream>& next_layer)
+ : next_layer_(next_layer)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return next_layer_.lowest_layer().get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ buffered_stream_storage* storage,
+ const MutableBufferSequence& buffers) const
+ {
+ // 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;
+
+ using asio::buffer_size;
+ non_const_lvalue<ReadHandler> handler2(handler);
+ if (buffer_size(buffers) == 0 || !storage->empty())
+ {
+ next_layer_.async_read_some(ASIO_MUTABLE_BUFFER(0, 0),
+ buffered_read_some_handler<MutableBufferSequence,
+ decay_t<ReadHandler>>(
+ *storage, buffers, handler2.value));
+ }
+ else
+ {
+ initiate_async_buffered_fill<Stream>(this->next_layer_)(
+ buffered_read_some_handler<MutableBufferSequence,
+ decay_t<ReadHandler>>(
+ *storage, buffers, handler2.value),
+ storage);
+ }
+ }
+
+ private:
+ remove_reference_t<Stream>& next_layer_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename MutableBufferSequence, typename ReadHandler,
+ typename DefaultCandidate>
+struct associator<Associator,
+ detail::buffered_read_some_handler<MutableBufferSequence, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::buffered_read_some_handler<
+ MutableBufferSequence, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::buffered_read_some_handler<
+ MutableBufferSequence, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename Stream>
+template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadHandler>
+inline auto buffered_read_stream<Stream>::async_read_some(
+ const MutableBufferSequence& buffers, ReadHandler&& handler)
+ -> decltype(
+ async_initiate<ReadHandler,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_buffered_read_some<Stream>>(),
+ handler, declval<detail::buffered_stream_storage*>(), buffers))
+{
+ return async_initiate<ReadHandler,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_buffered_read_some<Stream>(next_layer_),
+ handler, &storage_, buffers);
+}
+
+template <typename Stream>
+template <typename MutableBufferSequence>
+std::size_t buffered_read_stream<Stream>::peek(
+ const MutableBufferSequence& buffers)
+{
+ if (storage_.empty())
+ this->fill();
+ return this->peek_copy(buffers);
+}
+
+template <typename Stream>
+template <typename MutableBufferSequence>
+std::size_t buffered_read_stream<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/3rdparty/asio/include/asio/impl/buffered_write_stream.hpp b/3rdparty/asio/include/asio/impl/buffered_write_stream.hpp
new file mode 100644
index 00000000000..5bf58278ca6
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/buffered_write_stream.hpp
@@ -0,0 +1,384 @@
+//
+// impl/buffered_write_stream.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/associator.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+template <typename Stream>
+std::size_t buffered_write_stream<Stream>::flush()
+{
+ std::size_t bytes_written = write(next_layer_,
+ buffer(storage_.data(), storage_.size()));
+ storage_.consume(bytes_written);
+ return bytes_written;
+}
+
+template <typename Stream>
+std::size_t buffered_write_stream<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 <typename WriteHandler>
+ class buffered_flush_handler
+ {
+ public:
+ buffered_flush_handler(detail::buffered_stream_storage& storage,
+ WriteHandler& handler)
+ : storage_(storage),
+ handler_(static_cast<WriteHandler&&>(handler))
+ {
+ }
+
+ 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_(static_cast<WriteHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(const asio::error_code& ec,
+ const std::size_t bytes_written)
+ {
+ storage_.consume(bytes_written);
+ static_cast<WriteHandler&&>(handler_)(ec, bytes_written);
+ }
+
+ //private:
+ detail::buffered_stream_storage& storage_;
+ WriteHandler handler_;
+ };
+
+ template <typename WriteHandler>
+ inline bool asio_handler_is_continuation(
+ buffered_flush_handler<WriteHandler>* this_handler)
+ {
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename Stream>
+ class initiate_async_buffered_flush
+ {
+ public:
+ typedef typename remove_reference_t<
+ Stream>::lowest_layer_type::executor_type executor_type;
+
+ explicit initiate_async_buffered_flush(
+ remove_reference_t<Stream>& next_layer)
+ : next_layer_(next_layer)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return next_layer_.lowest_layer().get_executor();
+ }
+
+ template <typename WriteHandler>
+ void operator()(WriteHandler&& handler,
+ buffered_stream_storage* storage) const
+ {
+ // 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;
+
+ non_const_lvalue<WriteHandler> handler2(handler);
+ async_write(next_layer_, buffer(storage->data(), storage->size()),
+ buffered_flush_handler<decay_t<WriteHandler>>(
+ *storage, handler2.value));
+ }
+
+ private:
+ remove_reference_t<Stream>& next_layer_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename WriteHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::buffered_flush_handler<WriteHandler>,
+ DefaultCandidate>
+ : Associator<WriteHandler, DefaultCandidate>
+{
+ static typename Associator<WriteHandler, DefaultCandidate>::type get(
+ const detail::buffered_flush_handler<WriteHandler>& h) noexcept
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::buffered_flush_handler<WriteHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename Stream>
+template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteHandler>
+inline auto buffered_write_stream<Stream>::async_flush(WriteHandler&& handler)
+ -> decltype(
+ async_initiate<WriteHandler,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_buffered_flush<Stream>>(),
+ handler, declval<detail::buffered_stream_storage*>()))
+{
+ return async_initiate<WriteHandler,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_buffered_flush<Stream>(next_layer_),
+ handler, &storage_);
+}
+
+template <typename Stream>
+template <typename ConstBufferSequence>
+std::size_t buffered_write_stream<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 <typename Stream>
+template <typename ConstBufferSequence>
+std::size_t buffered_write_stream<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 <typename ConstBufferSequence, typename WriteHandler>
+ 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_(static_cast<WriteHandler&&>(handler))
+ {
+ }
+
+ 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_(static_cast<WriteHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(const asio::error_code& ec, std::size_t)
+ {
+ if (ec)
+ {
+ const std::size_t length = 0;
+ static_cast<WriteHandler&&>(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);
+ static_cast<WriteHandler&&>(handler_)(ec, bytes_copied);
+ }
+ }
+
+ //private:
+ detail::buffered_stream_storage& storage_;
+ ConstBufferSequence buffers_;
+ WriteHandler handler_;
+ };
+
+ template <typename ConstBufferSequence, typename WriteHandler>
+ 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 <typename Stream>
+ class initiate_async_buffered_write_some
+ {
+ public:
+ typedef typename remove_reference_t<
+ Stream>::lowest_layer_type::executor_type executor_type;
+
+ explicit initiate_async_buffered_write_some(
+ remove_reference_t<Stream>& next_layer)
+ : next_layer_(next_layer)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return next_layer_.lowest_layer().get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ buffered_stream_storage* storage,
+ const ConstBufferSequence& buffers) const
+ {
+ // 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;
+
+ using asio::buffer_size;
+ non_const_lvalue<WriteHandler> handler2(handler);
+ if (buffer_size(buffers) == 0 || storage->size() < storage->capacity())
+ {
+ next_layer_.async_write_some(ASIO_CONST_BUFFER(0, 0),
+ buffered_write_some_handler<ConstBufferSequence,
+ decay_t<WriteHandler>>(
+ *storage, buffers, handler2.value));
+ }
+ else
+ {
+ initiate_async_buffered_flush<Stream>(this->next_layer_)(
+ buffered_write_some_handler<ConstBufferSequence,
+ decay_t<WriteHandler>>(
+ *storage, buffers, handler2.value),
+ storage);
+ }
+ }
+
+ private:
+ remove_reference_t<Stream>& next_layer_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename ConstBufferSequence, typename WriteHandler,
+ typename DefaultCandidate>
+struct associator<Associator,
+ detail::buffered_write_some_handler<ConstBufferSequence, WriteHandler>,
+ DefaultCandidate>
+ : Associator<WriteHandler, DefaultCandidate>
+{
+ static typename Associator<WriteHandler, DefaultCandidate>::type get(
+ const detail::buffered_write_some_handler<
+ ConstBufferSequence, WriteHandler>& h) noexcept
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::buffered_write_some_handler<
+ ConstBufferSequence, WriteHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename Stream>
+template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteHandler>
+inline auto buffered_write_stream<Stream>::async_write_some(
+ const ConstBufferSequence& buffers, WriteHandler&& handler)
+ -> decltype(
+ async_initiate<WriteHandler,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_buffered_write_some<Stream>>(),
+ handler, declval<detail::buffered_stream_storage*>(), buffers))
+{
+ return async_initiate<WriteHandler,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_buffered_write_some<Stream>(next_layer_),
+ handler, &storage_, buffers);
+}
+
+template <typename Stream>
+template <typename ConstBufferSequence>
+std::size_t buffered_write_stream<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/3rdparty/asio/include/asio/impl/cancellation_signal.ipp b/3rdparty/asio/include/asio/impl/cancellation_signal.ipp
new file mode 100644
index 00000000000..f63ab8de0f3
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/cancellation_signal.ipp
@@ -0,0 +1,96 @@
+//
+// impl/cancellation_signal.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CANCELLATION_SIGNAL_IPP
+#define ASIO_IMPL_CANCELLATION_SIGNAL_IPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/cancellation_signal.hpp"
+#include "asio/detail/thread_context.hpp"
+#include "asio/detail/thread_info_base.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+cancellation_signal::~cancellation_signal()
+{
+ if (handler_)
+ {
+ std::pair<void*, std::size_t> mem = handler_->destroy();
+ detail::thread_info_base::deallocate(
+ detail::thread_info_base::cancellation_signal_tag(),
+ detail::thread_context::top_of_thread_call_stack(),
+ mem.first, mem.second);
+ }
+}
+
+void cancellation_slot::clear()
+{
+ if (handler_ != 0 && *handler_ != 0)
+ {
+ std::pair<void*, std::size_t> mem = (*handler_)->destroy();
+ detail::thread_info_base::deallocate(
+ detail::thread_info_base::cancellation_signal_tag(),
+ detail::thread_context::top_of_thread_call_stack(),
+ mem.first, mem.second);
+ *handler_ = 0;
+ }
+}
+
+std::pair<void*, std::size_t> cancellation_slot::prepare_memory(
+ std::size_t size, std::size_t align)
+{
+ assert(handler_);
+ std::pair<void*, std::size_t> mem;
+ if (*handler_)
+ {
+ mem = (*handler_)->destroy();
+ *handler_ = 0;
+ }
+ if (size > mem.second
+ || reinterpret_cast<std::size_t>(mem.first) % align != 0)
+ {
+ if (mem.first)
+ {
+ detail::thread_info_base::deallocate(
+ detail::thread_info_base::cancellation_signal_tag(),
+ detail::thread_context::top_of_thread_call_stack(),
+ mem.first, mem.second);
+ }
+ mem.first = detail::thread_info_base::allocate(
+ detail::thread_info_base::cancellation_signal_tag(),
+ detail::thread_context::top_of_thread_call_stack(),
+ size, align);
+ mem.second = size;
+ }
+ return mem;
+}
+
+cancellation_slot::auto_delete_helper::~auto_delete_helper()
+{
+ if (mem.first)
+ {
+ detail::thread_info_base::deallocate(
+ detail::thread_info_base::cancellation_signal_tag(),
+ detail::thread_context::top_of_thread_call_stack(),
+ mem.first, mem.second);
+ }
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_CANCELLATION_SIGNAL_IPP
diff --git a/3rdparty/asio/include/asio/impl/co_spawn.hpp b/3rdparty/asio/include/asio/impl/co_spawn.hpp
new file mode 100644
index 00000000000..3eba7d86db8
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/co_spawn.hpp
@@ -0,0 +1,449 @@
+//
+// impl/co_spawn.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CO_SPAWN_HPP
+#define ASIO_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 "asio/associated_cancellation_slot.hpp"
+#include "asio/awaitable.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/recycling_allocator.hpp"
+#include "asio/dispatch.hpp"
+#include "asio/execution/outstanding_work.hpp"
+#include "asio/post.hpp"
+#include "asio/prefer.hpp"
+#include "asio/use_awaitable.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Executor, typename = void>
+class co_spawn_work_guard
+{
+public:
+ typedef decay_t<
+ prefer_result_t<Executor,
+ execution::outstanding_work_t::tracked_t
+ >
+ > executor_type;
+
+ co_spawn_work_guard(const Executor& ex)
+ : executor_(asio::prefer(ex, execution::outstanding_work.tracked))
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return executor_;
+ }
+
+private:
+ executor_type executor_;
+};
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Executor>
+struct co_spawn_work_guard<Executor,
+ enable_if_t<
+ !execution::is_executor<Executor>::value
+ >> : executor_work_guard<Executor>
+{
+ co_spawn_work_guard(const Executor& ex)
+ : executor_work_guard<Executor>(ex)
+ {
+ }
+};
+
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Handler, typename Executor,
+ typename Function, typename = void>
+struct co_spawn_state
+{
+ template <typename H, typename F>
+ co_spawn_state(H&& h, const Executor& ex, F&& f)
+ : handler(std::forward<H>(h)),
+ spawn_work(ex),
+ handler_work(asio::get_associated_executor(handler, ex)),
+ function(std::forward<F>(f))
+ {
+ }
+
+ Handler handler;
+ co_spawn_work_guard<Executor> spawn_work;
+ co_spawn_work_guard<associated_executor_t<Handler, Executor>> handler_work;
+ Function function;
+};
+
+template <typename Handler, typename Executor, typename Function>
+struct co_spawn_state<Handler, Executor, Function,
+ enable_if_t<
+ is_same<
+ typename associated_executor<Handler,
+ Executor>::asio_associated_executor_is_unspecialised,
+ void
+ >::value
+ >>
+{
+ template <typename H, typename F>
+ co_spawn_state(H&& h, const Executor& ex, F&& f)
+ : handler(std::forward<H>(h)),
+ handler_work(ex),
+ function(std::forward<F>(f))
+ {
+ }
+
+ Handler handler;
+ co_spawn_work_guard<Executor> handler_work;
+ Function function;
+};
+
+struct co_spawn_dispatch
+{
+ template <typename CompletionToken>
+ auto operator()(CompletionToken&& token) const
+ -> decltype(asio::dispatch(std::forward<CompletionToken>(token)))
+ {
+ return asio::dispatch(std::forward<CompletionToken>(token));
+ }
+};
+
+struct co_spawn_post
+{
+ template <typename CompletionToken>
+ auto operator()(CompletionToken&& token) const
+ -> decltype(asio::post(std::forward<CompletionToken>(token)))
+ {
+ return asio::post(std::forward<CompletionToken>(token));
+ }
+};
+
+template <typename T, typename Handler, typename Executor, typename Function>
+awaitable<awaitable_thread_entry_point, Executor> co_spawn_entry_point(
+ awaitable<T, Executor>*, co_spawn_state<Handler, Executor, Function> s)
+{
+ (void) co_await co_spawn_dispatch{};
+
+ (co_await awaitable_thread_has_context_switched{}) = false;
+ std::exception_ptr e = nullptr;
+ bool done = false;
+ try
+ {
+ T t = co_await s.function();
+
+ done = true;
+
+ bool switched = (co_await awaitable_thread_has_context_switched{});
+ if (!switched)
+ {
+ co_await this_coro::throw_if_cancelled(false);
+ (void) co_await co_spawn_post();
+ }
+
+ (dispatch)(s.handler_work.get_executor(),
+ [handler = std::move(s.handler), t = std::move(t)]() mutable
+ {
+ std::move(handler)(std::exception_ptr(), std::move(t));
+ });
+
+ co_return;
+ }
+ catch (...)
+ {
+ if (done)
+ throw;
+
+ e = std::current_exception();
+ }
+
+ bool switched = (co_await awaitable_thread_has_context_switched{});
+ if (!switched)
+ {
+ co_await this_coro::throw_if_cancelled(false);
+ (void) co_await co_spawn_post();
+ }
+
+ (dispatch)(s.handler_work.get_executor(),
+ [handler = std::move(s.handler), e]() mutable
+ {
+ std::move(handler)(e, T());
+ });
+}
+
+template <typename Handler, typename Executor, typename Function>
+awaitable<awaitable_thread_entry_point, Executor> co_spawn_entry_point(
+ awaitable<void, Executor>*, co_spawn_state<Handler, Executor, Function> s)
+{
+ (void) co_await co_spawn_dispatch{};
+
+ (co_await awaitable_thread_has_context_switched{}) = false;
+ std::exception_ptr e = nullptr;
+ try
+ {
+ co_await s.function();
+ }
+ catch (...)
+ {
+ e = std::current_exception();
+ }
+
+ bool switched = (co_await awaitable_thread_has_context_switched{});
+ if (!switched)
+ {
+ co_await this_coro::throw_if_cancelled(false);
+ (void) co_await co_spawn_post();
+ }
+
+ (dispatch)(s.handler_work.get_executor(),
+ [handler = std::move(s.handler), e]() mutable
+ {
+ std::move(handler)(e);
+ });
+}
+
+template <typename T, typename Executor>
+class awaitable_as_function
+{
+public:
+ explicit awaitable_as_function(awaitable<T, Executor>&& a)
+ : awaitable_(std::move(a))
+ {
+ }
+
+ awaitable<T, Executor> operator()()
+ {
+ return std::move(awaitable_);
+ }
+
+private:
+ awaitable<T, Executor> awaitable_;
+};
+
+template <typename Handler, typename Executor, typename = void>
+class co_spawn_cancellation_handler
+{
+public:
+ co_spawn_cancellation_handler(const Handler&, const Executor& ex)
+ : signal_(detail::allocate_shared<cancellation_signal>(
+ detail::recycling_allocator<cancellation_signal,
+ detail::thread_info_base::cancellation_signal_tag>())),
+ ex_(ex)
+ {
+ }
+
+ cancellation_slot slot()
+ {
+ return signal_->slot();
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ shared_ptr<cancellation_signal> sig = signal_;
+ asio::dispatch(ex_, [sig, type]{ sig->emit(type); });
+ }
+
+private:
+ shared_ptr<cancellation_signal> signal_;
+ Executor ex_;
+};
+
+template <typename Handler, typename Executor>
+class co_spawn_cancellation_handler<Handler, Executor,
+ enable_if_t<
+ is_same<
+ typename associated_executor<Handler,
+ Executor>::asio_associated_executor_is_unspecialised,
+ void
+ >::value
+ >>
+{
+public:
+ co_spawn_cancellation_handler(const Handler&, const Executor&)
+ {
+ }
+
+ cancellation_slot slot()
+ {
+ return signal_.slot();
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ signal_.emit(type);
+ }
+
+private:
+ cancellation_signal signal_;
+};
+
+template <typename Executor>
+class initiate_co_spawn
+{
+public:
+ typedef Executor executor_type;
+
+ template <typename OtherExecutor>
+ explicit initiate_co_spawn(const OtherExecutor& ex)
+ : ex_(ex)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return ex_;
+ }
+
+ template <typename Handler, typename F>
+ void operator()(Handler&& handler, F&& f) const
+ {
+ typedef result_of_t<F()> awaitable_type;
+ typedef decay_t<Handler> handler_type;
+ typedef decay_t<F> function_type;
+ typedef co_spawn_cancellation_handler<
+ handler_type, Executor> cancel_handler_type;
+
+ auto slot = asio::get_associated_cancellation_slot(handler);
+ cancel_handler_type* cancel_handler = slot.is_connected()
+ ? &slot.template emplace<cancel_handler_type>(handler, ex_)
+ : nullptr;
+
+ cancellation_slot proxy_slot(
+ cancel_handler
+ ? cancel_handler->slot()
+ : cancellation_slot());
+
+ cancellation_state cancel_state(proxy_slot);
+
+ auto a = (co_spawn_entry_point)(static_cast<awaitable_type*>(nullptr),
+ co_spawn_state<handler_type, Executor, function_type>(
+ std::forward<Handler>(handler), ex_, std::forward<F>(f)));
+ awaitable_handler<executor_type, void>(std::move(a),
+ ex_, proxy_slot, cancel_state).launch();
+ }
+
+private:
+ Executor ex_;
+};
+
+} // namespace detail
+
+template <typename Executor, typename T, typename AwaitableExecutor,
+ ASIO_COMPLETION_TOKEN_FOR(
+ void(std::exception_ptr, T)) CompletionToken>
+inline ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(std::exception_ptr, T))
+co_spawn(const Executor& ex,
+ awaitable<T, AwaitableExecutor> a, CompletionToken&& token,
+ constraint_t<
+ (is_executor<Executor>::value || execution::is_executor<Executor>::value)
+ && is_convertible<Executor, AwaitableExecutor>::value
+ >)
+{
+ return async_initiate<CompletionToken, void(std::exception_ptr, T)>(
+ detail::initiate_co_spawn<AwaitableExecutor>(AwaitableExecutor(ex)),
+ token, detail::awaitable_as_function<T, AwaitableExecutor>(std::move(a)));
+}
+
+template <typename Executor, typename AwaitableExecutor,
+ ASIO_COMPLETION_TOKEN_FOR(
+ void(std::exception_ptr)) CompletionToken>
+inline ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(std::exception_ptr))
+co_spawn(const Executor& ex,
+ awaitable<void, AwaitableExecutor> a, CompletionToken&& token,
+ constraint_t<
+ (is_executor<Executor>::value || execution::is_executor<Executor>::value)
+ && is_convertible<Executor, AwaitableExecutor>::value
+ >)
+{
+ return async_initiate<CompletionToken, void(std::exception_ptr)>(
+ detail::initiate_co_spawn<AwaitableExecutor>(AwaitableExecutor(ex)),
+ token, detail::awaitable_as_function<
+ void, AwaitableExecutor>(std::move(a)));
+}
+
+template <typename ExecutionContext, typename T, typename AwaitableExecutor,
+ ASIO_COMPLETION_TOKEN_FOR(
+ void(std::exception_ptr, T)) CompletionToken>
+inline ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(std::exception_ptr, T))
+co_spawn(ExecutionContext& ctx,
+ awaitable<T, AwaitableExecutor> a, CompletionToken&& token,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ && is_convertible<typename ExecutionContext::executor_type,
+ AwaitableExecutor>::value
+ >)
+{
+ return (co_spawn)(ctx.get_executor(), std::move(a),
+ std::forward<CompletionToken>(token));
+}
+
+template <typename ExecutionContext, typename AwaitableExecutor,
+ ASIO_COMPLETION_TOKEN_FOR(
+ void(std::exception_ptr)) CompletionToken>
+inline ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(std::exception_ptr))
+co_spawn(ExecutionContext& ctx,
+ awaitable<void, AwaitableExecutor> a, CompletionToken&& token,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ && is_convertible<typename ExecutionContext::executor_type,
+ AwaitableExecutor>::value
+ >)
+{
+ return (co_spawn)(ctx.get_executor(), std::move(a),
+ std::forward<CompletionToken>(token));
+}
+
+template <typename Executor, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::awaitable_signature<
+ result_of_t<F()>>::type) CompletionToken>
+inline ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken,
+ typename detail::awaitable_signature<result_of_t<F()>>::type)
+co_spawn(const Executor& ex, F&& f, CompletionToken&& token,
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ >)
+{
+ return async_initiate<CompletionToken,
+ typename detail::awaitable_signature<result_of_t<F()>>::type>(
+ detail::initiate_co_spawn<
+ typename result_of_t<F()>::executor_type>(ex),
+ token, std::forward<F>(f));
+}
+
+template <typename ExecutionContext, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::awaitable_signature<
+ result_of_t<F()>>::type) CompletionToken>
+inline ASIO_INITFN_AUTO_RESULT_TYPE(CompletionToken,
+ typename detail::awaitable_signature<result_of_t<F()>>::type)
+co_spawn(ExecutionContext& ctx, F&& f, CompletionToken&& token,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ >)
+{
+ return (co_spawn)(ctx.get_executor(), std::forward<F>(f),
+ std::forward<CompletionToken>(token));
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_CO_SPAWN_HPP
diff --git a/3rdparty/asio/include/asio/impl/connect.hpp b/3rdparty/asio/include/asio/impl/connect.hpp
new file mode 100644
index 00000000000..ac74ae0a782
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/connect.hpp
@@ -0,0 +1,809 @@
+//
+// impl/connect.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <algorithm>
+#include "asio/associator.hpp"
+#include "asio/detail/base_from_cancellation_state.hpp"
+#include "asio/detail/bind_handler.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/handler_tracking.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/error.hpp"
+#include "asio/post.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+namespace detail
+{
+ struct default_connect_condition
+ {
+ template <typename Endpoint>
+ bool operator()(const asio::error_code&, const Endpoint&)
+ {
+ return true;
+ }
+ };
+
+ template <typename Protocol, typename Iterator>
+ inline typename Protocol::endpoint deref_connect_result(
+ Iterator iter, asio::error_code& ec)
+ {
+ return ec ? typename Protocol::endpoint() : *iter;
+ }
+
+ template <typename T, typename Iterator>
+ struct legacy_connect_condition_helper : T
+ {
+ typedef char (*fallback_func_type)(...);
+ operator fallback_func_type() const;
+ };
+
+ template <typename R, typename Arg1, typename Arg2, typename Iterator>
+ struct legacy_connect_condition_helper<R (*)(Arg1, Arg2), Iterator>
+ {
+ R operator()(Arg1, Arg2) const;
+ char operator()(...) const;
+ };
+
+ template <typename T, typename Iterator>
+ 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(
+ (declval<legacy_connect_condition_helper<T, Iterator>>())(
+ declval<const asio::error_code>(),
+ declval<const Iterator>()))) != 1;
+ };
+
+ template <typename ConnectCondition, typename Iterator>
+ inline Iterator call_connect_condition(ConnectCondition& connect_condition,
+ const asio::error_code& ec, Iterator next, Iterator end,
+ enable_if_t<is_legacy_connect_condition<
+ ConnectCondition, Iterator>::value>* = 0)
+ {
+ if (next != end)
+ return connect_condition(ec, next);
+ return end;
+ }
+
+ template <typename ConnectCondition, typename Iterator>
+ inline Iterator call_connect_condition(ConnectCondition& connect_condition,
+ const asio::error_code& ec, Iterator next, Iterator end,
+ enable_if_t<!is_legacy_connect_condition<
+ ConnectCondition, Iterator>::value>* = 0)
+ {
+ for (;next != end; ++next)
+ if (connect_condition(ec, *next))
+ return next;
+ return end;
+ }
+}
+
+template <typename Protocol, typename Executor, typename EndpointSequence>
+typename Protocol::endpoint connect(basic_socket<Protocol, Executor>& s,
+ const EndpointSequence& endpoints,
+ constraint_t<is_endpoint_sequence<EndpointSequence>::value>)
+{
+ asio::error_code ec;
+ typename Protocol::endpoint result = connect(s, endpoints, ec);
+ asio::detail::throw_error(ec, "connect");
+ return result;
+}
+
+template <typename Protocol, typename Executor, typename EndpointSequence>
+typename Protocol::endpoint connect(basic_socket<Protocol, Executor>& s,
+ const EndpointSequence& endpoints, asio::error_code& ec,
+ constraint_t<is_endpoint_sequence<EndpointSequence>::value>)
+{
+ return detail::deref_connect_result<Protocol>(
+ connect(s, endpoints.begin(), endpoints.end(),
+ detail::default_connect_condition(), ec), ec);
+}
+
+#if !defined(ASIO_NO_DEPRECATED)
+template <typename Protocol, typename Executor, typename Iterator>
+Iterator connect(basic_socket<Protocol, Executor>& s, Iterator begin,
+ constraint_t<!is_endpoint_sequence<Iterator>::value>)
+{
+ asio::error_code ec;
+ Iterator result = connect(s, begin, ec);
+ asio::detail::throw_error(ec, "connect");
+ return result;
+}
+
+template <typename Protocol, typename Executor, typename Iterator>
+inline Iterator connect(basic_socket<Protocol, Executor>& s,
+ Iterator begin, asio::error_code& ec,
+ constraint_t<!is_endpoint_sequence<Iterator>::value>)
+{
+ return connect(s, begin, Iterator(), detail::default_connect_condition(), ec);
+}
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+template <typename Protocol, typename Executor, typename Iterator>
+Iterator connect(basic_socket<Protocol, Executor>& 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 <typename Protocol, typename Executor, typename Iterator>
+inline Iterator connect(basic_socket<Protocol, Executor>& s,
+ Iterator begin, Iterator end, asio::error_code& ec)
+{
+ return connect(s, begin, end, detail::default_connect_condition(), ec);
+}
+
+template <typename Protocol, typename Executor,
+ typename EndpointSequence, typename ConnectCondition>
+typename Protocol::endpoint connect(basic_socket<Protocol, Executor>& s,
+ const EndpointSequence& endpoints, ConnectCondition connect_condition,
+ constraint_t<is_endpoint_sequence<EndpointSequence>::value>)
+{
+ 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, typename Executor,
+ typename EndpointSequence, typename ConnectCondition>
+typename Protocol::endpoint connect(basic_socket<Protocol, Executor>& s,
+ const EndpointSequence& endpoints, ConnectCondition connect_condition,
+ asio::error_code& ec,
+ constraint_t<is_endpoint_sequence<EndpointSequence>::value>)
+{
+ return detail::deref_connect_result<Protocol>(
+ connect(s, endpoints.begin(), endpoints.end(),
+ connect_condition, ec), ec);
+}
+
+#if !defined(ASIO_NO_DEPRECATED)
+template <typename Protocol, typename Executor,
+ typename Iterator, typename ConnectCondition>
+Iterator connect(basic_socket<Protocol, Executor>& s,
+ Iterator begin, ConnectCondition connect_condition,
+ constraint_t<!is_endpoint_sequence<Iterator>::value>)
+{
+ asio::error_code ec;
+ Iterator result = connect(s, begin, connect_condition, ec);
+ asio::detail::throw_error(ec, "connect");
+ return result;
+}
+
+template <typename Protocol, typename Executor,
+ typename Iterator, typename ConnectCondition>
+inline Iterator connect(basic_socket<Protocol, Executor>& s,
+ Iterator begin, ConnectCondition connect_condition,
+ asio::error_code& ec,
+ constraint_t<!is_endpoint_sequence<Iterator>::value>)
+{
+ return connect(s, begin, Iterator(), connect_condition, ec);
+}
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+template <typename Protocol, typename Executor,
+ typename Iterator, typename ConnectCondition>
+Iterator connect(basic_socket<Protocol, Executor>& 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 <typename Protocol, typename Executor,
+ typename Iterator, typename ConnectCondition>
+Iterator connect(basic_socket<Protocol, Executor>& 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 <typename ConnectCondition>
+ class base_from_connect_condition
+ {
+ protected:
+ explicit base_from_connect_condition(
+ const ConnectCondition& connect_condition)
+ : connect_condition_(connect_condition)
+ {
+ }
+
+ template <typename Iterator>
+ 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<default_connect_condition>
+ {
+ protected:
+ explicit base_from_connect_condition(const default_connect_condition&)
+ {
+ }
+
+ template <typename Iterator>
+ void check_condition(const asio::error_code&, Iterator&, Iterator&)
+ {
+ }
+ };
+
+ template <typename Protocol, typename Executor, typename EndpointSequence,
+ typename ConnectCondition, typename RangeConnectHandler>
+ class range_connect_op
+ : public base_from_cancellation_state<RangeConnectHandler>,
+ base_from_connect_condition<ConnectCondition>
+ {
+ public:
+ range_connect_op(basic_socket<Protocol, Executor>& sock,
+ const EndpointSequence& endpoints,
+ const ConnectCondition& connect_condition,
+ RangeConnectHandler& handler)
+ : base_from_cancellation_state<RangeConnectHandler>(
+ handler, enable_partial_cancellation()),
+ base_from_connect_condition<ConnectCondition>(connect_condition),
+ socket_(sock),
+ endpoints_(endpoints),
+ index_(0),
+ start_(0),
+ handler_(static_cast<RangeConnectHandler&&>(handler))
+ {
+ }
+
+ range_connect_op(const range_connect_op& other)
+ : base_from_cancellation_state<RangeConnectHandler>(other),
+ base_from_connect_condition<ConnectCondition>(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_cancellation_state<RangeConnectHandler>(
+ static_cast<base_from_cancellation_state<RangeConnectHandler>&&>(
+ other)),
+ base_from_connect_condition<ConnectCondition>(other),
+ socket_(other.socket_),
+ endpoints_(other.endpoints_),
+ index_(other.index_),
+ start_(other.start_),
+ handler_(static_cast<RangeConnectHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(asio::error_code ec, int start = 0)
+ {
+ this->process(ec, start,
+ const_cast<const EndpointSequence&>(endpoints_).begin(),
+ const_cast<const EndpointSequence&>(endpoints_).end());
+ }
+
+ //private:
+ template <typename Iterator>
+ void process(asio::error_code ec,
+ int start, Iterator begin, Iterator end)
+ {
+ Iterator iter = begin;
+ std::advance(iter, index_);
+
+ switch (start_ = start)
+ {
+ case 1:
+ for (;;)
+ {
+ this->check_condition(ec, iter, end);
+ index_ = std::distance(begin, iter);
+
+ if (iter != end)
+ {
+ socket_.close(ec);
+ ASIO_HANDLER_LOCATION((__FILE__, __LINE__, "async_connect"));
+ socket_.async_connect(*iter,
+ static_cast<range_connect_op&&>(*this));
+ return;
+ }
+
+ if (start)
+ {
+ ec = asio::error::not_found;
+ ASIO_HANDLER_LOCATION((__FILE__, __LINE__, "async_connect"));
+ asio::post(socket_.get_executor(),
+ detail::bind_handler(
+ static_cast<range_connect_op&&>(*this), ec));
+ return;
+ }
+
+ /* fall-through */ default:
+
+ if (iter == end)
+ break;
+
+ if (!socket_.is_open())
+ {
+ ec = asio::error::operation_aborted;
+ break;
+ }
+
+ if (!ec)
+ break;
+
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = asio::error::operation_aborted;
+ break;
+ }
+
+ ++iter;
+ ++index_;
+ }
+
+ static_cast<RangeConnectHandler&&>(handler_)(
+ static_cast<const asio::error_code&>(ec),
+ static_cast<const typename Protocol::endpoint&>(
+ ec || iter == end ? typename Protocol::endpoint() : *iter));
+ }
+ }
+
+ basic_socket<Protocol, Executor>& socket_;
+ EndpointSequence endpoints_;
+ std::size_t index_;
+ int start_;
+ RangeConnectHandler handler_;
+ };
+
+ template <typename Protocol, typename Executor, typename EndpointSequence,
+ typename ConnectCondition, typename RangeConnectHandler>
+ inline bool asio_handler_is_continuation(
+ range_connect_op<Protocol, Executor, EndpointSequence,
+ ConnectCondition, RangeConnectHandler>* this_handler)
+ {
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename Protocol, typename Executor>
+ class initiate_async_range_connect
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_range_connect(basic_socket<Protocol, Executor>& s)
+ : socket_(s)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return socket_.get_executor();
+ }
+
+ template <typename RangeConnectHandler,
+ typename EndpointSequence, typename ConnectCondition>
+ void operator()(RangeConnectHandler&& handler,
+ const EndpointSequence& endpoints,
+ const ConnectCondition& connect_condition) const
+ {
+ // If you get an error on the following line it means that your
+ // handler does not meet the documented type requirements for an
+ // RangeConnectHandler.
+ ASIO_RANGE_CONNECT_HANDLER_CHECK(RangeConnectHandler,
+ handler, typename Protocol::endpoint) type_check;
+
+ non_const_lvalue<RangeConnectHandler> handler2(handler);
+ range_connect_op<Protocol, Executor, EndpointSequence, ConnectCondition,
+ decay_t<RangeConnectHandler>>(socket_, endpoints,
+ connect_condition, handler2.value)(asio::error_code(), 1);
+ }
+
+ private:
+ basic_socket<Protocol, Executor>& socket_;
+ };
+
+ template <typename Protocol, typename Executor, typename Iterator,
+ typename ConnectCondition, typename IteratorConnectHandler>
+ class iterator_connect_op
+ : public base_from_cancellation_state<IteratorConnectHandler>,
+ base_from_connect_condition<ConnectCondition>
+ {
+ public:
+ iterator_connect_op(basic_socket<Protocol, Executor>& sock,
+ const Iterator& begin, const Iterator& end,
+ const ConnectCondition& connect_condition,
+ IteratorConnectHandler& handler)
+ : base_from_cancellation_state<IteratorConnectHandler>(
+ handler, enable_partial_cancellation()),
+ base_from_connect_condition<ConnectCondition>(connect_condition),
+ socket_(sock),
+ iter_(begin),
+ end_(end),
+ start_(0),
+ handler_(static_cast<IteratorConnectHandler&&>(handler))
+ {
+ }
+
+ iterator_connect_op(const iterator_connect_op& other)
+ : base_from_cancellation_state<IteratorConnectHandler>(other),
+ base_from_connect_condition<ConnectCondition>(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_cancellation_state<IteratorConnectHandler>(
+ static_cast<base_from_cancellation_state<IteratorConnectHandler>&&>(
+ other)),
+ base_from_connect_condition<ConnectCondition>(other),
+ socket_(other.socket_),
+ iter_(other.iter_),
+ end_(other.end_),
+ start_(other.start_),
+ handler_(static_cast<IteratorConnectHandler&&>(other.handler_))
+ {
+ }
+
+ 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);
+ ASIO_HANDLER_LOCATION((__FILE__, __LINE__, "async_connect"));
+ socket_.async_connect(*iter_,
+ static_cast<iterator_connect_op&&>(*this));
+ return;
+ }
+
+ if (start)
+ {
+ ec = asio::error::not_found;
+ ASIO_HANDLER_LOCATION((__FILE__, __LINE__, "async_connect"));
+ asio::post(socket_.get_executor(),
+ detail::bind_handler(
+ static_cast<iterator_connect_op&&>(*this), ec));
+ return;
+ }
+
+ /* fall-through */ default:
+
+ if (iter_ == end_)
+ break;
+
+ if (!socket_.is_open())
+ {
+ ec = asio::error::operation_aborted;
+ break;
+ }
+
+ if (!ec)
+ break;
+
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = asio::error::operation_aborted;
+ break;
+ }
+
+ ++iter_;
+ }
+
+ static_cast<IteratorConnectHandler&&>(handler_)(
+ static_cast<const asio::error_code&>(ec),
+ static_cast<const Iterator&>(iter_));
+ }
+ }
+
+ //private:
+ basic_socket<Protocol, Executor>& socket_;
+ Iterator iter_;
+ Iterator end_;
+ int start_;
+ IteratorConnectHandler handler_;
+ };
+
+ template <typename Protocol, typename Executor, typename Iterator,
+ typename ConnectCondition, typename IteratorConnectHandler>
+ inline bool asio_handler_is_continuation(
+ iterator_connect_op<Protocol, Executor, Iterator,
+ ConnectCondition, IteratorConnectHandler>* this_handler)
+ {
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename Protocol, typename Executor>
+ class initiate_async_iterator_connect
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_iterator_connect(
+ basic_socket<Protocol, Executor>& s)
+ : socket_(s)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return socket_.get_executor();
+ }
+
+ template <typename IteratorConnectHandler,
+ typename Iterator, typename ConnectCondition>
+ void operator()(IteratorConnectHandler&& handler,
+ Iterator begin, Iterator end,
+ const ConnectCondition& connect_condition) const
+ {
+ // If you get an error on the following line it means that your
+ // handler does not meet the documented type requirements for an
+ // IteratorConnectHandler.
+ ASIO_ITERATOR_CONNECT_HANDLER_CHECK(
+ IteratorConnectHandler, handler, Iterator) type_check;
+
+ non_const_lvalue<IteratorConnectHandler> handler2(handler);
+ iterator_connect_op<Protocol, Executor, Iterator, ConnectCondition,
+ decay_t<IteratorConnectHandler>>(socket_, begin, end,
+ connect_condition, handler2.value)(asio::error_code(), 1);
+ }
+
+ private:
+ basic_socket<Protocol, Executor>& socket_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename Protocol, typename Executor, typename EndpointSequence,
+ typename ConnectCondition, typename RangeConnectHandler,
+ typename DefaultCandidate>
+struct associator<Associator,
+ detail::range_connect_op<Protocol, Executor,
+ EndpointSequence, ConnectCondition, RangeConnectHandler>,
+ DefaultCandidate>
+ : Associator<RangeConnectHandler, DefaultCandidate>
+{
+ static typename Associator<RangeConnectHandler, DefaultCandidate>::type get(
+ const detail::range_connect_op<Protocol, Executor, EndpointSequence,
+ ConnectCondition, RangeConnectHandler>& h) noexcept
+ {
+ return Associator<RangeConnectHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::range_connect_op<Protocol, Executor,
+ EndpointSequence, ConnectCondition, RangeConnectHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(
+ Associator<RangeConnectHandler, DefaultCandidate>::get(
+ h.handler_, c))
+ {
+ return Associator<RangeConnectHandler, DefaultCandidate>::get(
+ h.handler_, c);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Protocol, typename Executor, typename Iterator,
+ typename ConnectCondition, typename IteratorConnectHandler,
+ typename DefaultCandidate>
+struct associator<Associator,
+ detail::iterator_connect_op<Protocol, Executor,
+ Iterator, ConnectCondition, IteratorConnectHandler>,
+ DefaultCandidate>
+ : Associator<IteratorConnectHandler, DefaultCandidate>
+{
+ static typename Associator<IteratorConnectHandler, DefaultCandidate>::type
+ get(const detail::iterator_connect_op<Protocol, Executor, Iterator,
+ ConnectCondition, IteratorConnectHandler>& h) noexcept
+ {
+ return Associator<IteratorConnectHandler, DefaultCandidate>::get(
+ h.handler_);
+ }
+
+ static auto get(
+ const detail::iterator_connect_op<Protocol, Executor,
+ Iterator, ConnectCondition, IteratorConnectHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(
+ Associator<IteratorConnectHandler, DefaultCandidate>::get(
+ h.handler_, c))
+ {
+ return Associator<IteratorConnectHandler, DefaultCandidate>::get(
+ h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename Protocol, typename Executor, typename EndpointSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ typename Protocol::endpoint)) RangeConnectToken>
+inline auto async_connect(basic_socket<Protocol, Executor>& s,
+ const EndpointSequence& endpoints, RangeConnectToken&& token,
+ constraint_t<is_endpoint_sequence<EndpointSequence>::value>)
+ -> decltype(
+ async_initiate<RangeConnectToken,
+ void (asio::error_code, typename Protocol::endpoint)>(
+ declval<detail::initiate_async_range_connect<Protocol, Executor>>(),
+ token, endpoints, declval<detail::default_connect_condition>()))
+{
+ return async_initiate<RangeConnectToken,
+ void (asio::error_code, typename Protocol::endpoint)>(
+ detail::initiate_async_range_connect<Protocol, Executor>(s),
+ token, endpoints, detail::default_connect_condition());
+}
+
+#if !defined(ASIO_NO_DEPRECATED)
+template <typename Protocol, typename Executor, typename Iterator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ Iterator)) IteratorConnectToken>
+inline auto async_connect(basic_socket<Protocol, Executor>& s,
+ Iterator begin, IteratorConnectToken&& token,
+ constraint_t<!is_endpoint_sequence<Iterator>::value>)
+ -> decltype(
+ async_initiate<IteratorConnectToken,
+ void (asio::error_code, Iterator)>(
+ declval<detail::initiate_async_iterator_connect<Protocol, Executor>>(),
+ token, begin, Iterator(), declval<detail::default_connect_condition>()))
+{
+ return async_initiate<IteratorConnectToken,
+ void (asio::error_code, Iterator)>(
+ detail::initiate_async_iterator_connect<Protocol, Executor>(s),
+ token, begin, Iterator(), detail::default_connect_condition());
+}
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+template <typename Protocol, typename Executor, typename Iterator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ Iterator)) IteratorConnectToken>
+inline auto async_connect(basic_socket<Protocol, Executor>& s,
+ Iterator begin, Iterator end, IteratorConnectToken&& token)
+ -> decltype(
+ async_initiate<IteratorConnectToken,
+ void (asio::error_code, Iterator)>(
+ declval<detail::initiate_async_iterator_connect<Protocol, Executor>>(),
+ token, begin, end, declval<detail::default_connect_condition>()))
+{
+ return async_initiate<IteratorConnectToken,
+ void (asio::error_code, Iterator)>(
+ detail::initiate_async_iterator_connect<Protocol, Executor>(s),
+ token, begin, end, detail::default_connect_condition());
+}
+
+template <typename Protocol, typename Executor,
+ typename EndpointSequence, typename ConnectCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ typename Protocol::endpoint)) RangeConnectToken>
+inline auto async_connect(basic_socket<Protocol, Executor>& s,
+ const EndpointSequence& endpoints, ConnectCondition connect_condition,
+ RangeConnectToken&& token,
+ constraint_t<is_endpoint_sequence<EndpointSequence>::value>)
+ -> decltype(
+ async_initiate<RangeConnectToken,
+ void (asio::error_code, typename Protocol::endpoint)>(
+ declval<detail::initiate_async_range_connect<Protocol, Executor>>(),
+ token, endpoints, connect_condition))
+{
+ return async_initiate<RangeConnectToken,
+ void (asio::error_code, typename Protocol::endpoint)>(
+ detail::initiate_async_range_connect<Protocol, Executor>(s),
+ token, endpoints, connect_condition);
+}
+
+#if !defined(ASIO_NO_DEPRECATED)
+template <typename Protocol, typename Executor,
+ typename Iterator, typename ConnectCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ Iterator)) IteratorConnectToken>
+inline auto async_connect(basic_socket<Protocol, Executor>& s, Iterator begin,
+ ConnectCondition connect_condition, IteratorConnectToken&& token,
+ constraint_t<!is_endpoint_sequence<Iterator>::value>)
+ -> decltype(
+ async_initiate<IteratorConnectToken,
+ void (asio::error_code, Iterator)>(
+ declval<detail::initiate_async_iterator_connect<Protocol, Executor>>(),
+ token, begin, Iterator(), connect_condition))
+{
+ return async_initiate<IteratorConnectToken,
+ void (asio::error_code, Iterator)>(
+ detail::initiate_async_iterator_connect<Protocol, Executor>(s),
+ token, begin, Iterator(), connect_condition);
+}
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+template <typename Protocol, typename Executor,
+ typename Iterator, typename ConnectCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ Iterator)) IteratorConnectToken>
+inline auto async_connect(basic_socket<Protocol, Executor>& s,
+ Iterator begin, Iterator end, ConnectCondition connect_condition,
+ IteratorConnectToken&& token)
+ -> decltype(
+ async_initiate<IteratorConnectToken,
+ void (asio::error_code, Iterator)>(
+ declval<detail::initiate_async_iterator_connect<Protocol, Executor>>(),
+ token, begin, end, connect_condition))
+{
+ return async_initiate<IteratorConnectToken,
+ void (asio::error_code, Iterator)>(
+ detail::initiate_async_iterator_connect<Protocol, Executor>(s),
+ token, begin, end, connect_condition);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_CONNECT_HPP
diff --git a/3rdparty/asio/include/asio/impl/connect_pipe.hpp b/3rdparty/asio/include/asio/impl/connect_pipe.hpp
new file mode 100644
index 00000000000..e40b3c9433c
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/connect_pipe.hpp
@@ -0,0 +1,73 @@
+//
+// impl/connect_pipe.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_PIPE_HPP
+#define ASIO_IMPL_CONNECT_PIPE_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_PIPE)
+
+#include "asio/connect_pipe.hpp"
+#include "asio/detail/throw_error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+template <typename Executor1, typename Executor2>
+void connect_pipe(basic_readable_pipe<Executor1>& read_end,
+ basic_writable_pipe<Executor2>& write_end)
+{
+ asio::error_code ec;
+ asio::connect_pipe(read_end, write_end, ec);
+ asio::detail::throw_error(ec, "connect_pipe");
+}
+
+template <typename Executor1, typename Executor2>
+ASIO_SYNC_OP_VOID connect_pipe(basic_readable_pipe<Executor1>& read_end,
+ basic_writable_pipe<Executor2>& write_end, asio::error_code& ec)
+{
+ detail::native_pipe_handle p[2];
+ detail::create_pipe(p, ec);
+ if (ec)
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+
+ read_end.assign(p[0], ec);
+ if (ec)
+ {
+ detail::close_pipe(p[0]);
+ detail::close_pipe(p[1]);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ write_end.assign(p[1], ec);
+ if (ec)
+ {
+ asio::error_code temp_ec;
+ read_end.close(temp_ec);
+ detail::close_pipe(p[1]);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_PIPE)
+
+#endif // ASIO_IMPL_CONNECT_PIPE_HPP
diff --git a/3rdparty/asio/include/asio/impl/connect_pipe.ipp b/3rdparty/asio/include/asio/impl/connect_pipe.ipp
new file mode 100644
index 00000000000..6efe790d713
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/connect_pipe.ipp
@@ -0,0 +1,149 @@
+//
+// impl/connect_pipe.ipp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+// Copyright (c) 2021 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software 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_PIPE_IPP
+#define ASIO_IMPL_CONNECT_PIPE_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_PIPE)
+
+#include "asio/connect_pipe.hpp"
+
+#if defined(ASIO_HAS_IOCP)
+# include <cstdio>
+# if _WIN32_WINNT >= 0x601
+# include <bcrypt.h>
+# if !defined(ASIO_NO_DEFAULT_LINKED_LIBS)
+# if defined(_MSC_VER)
+# pragma comment(lib, "bcrypt.lib")
+# endif // defined(_MSC_VER)
+# endif // !defined(ASIO_NO_DEFAULT_LINKED_LIBS)
+# endif // _WIN32_WINNT >= 0x601
+#else // defined(ASIO_HAS_IOCP)
+# include "asio/detail/descriptor_ops.hpp"
+#endif // defined(ASIO_HAS_IOCP)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+void create_pipe(native_pipe_handle p[2], asio::error_code& ec)
+{
+#if defined(ASIO_HAS_IOCP)
+ using namespace std; // For sprintf and memcmp.
+
+ static long counter1 = 0;
+ static long counter2 = 0;
+
+ long n1 = ::InterlockedIncrement(&counter1);
+ long n2 = (static_cast<unsigned long>(n1) % 0x10000000) == 0
+ ? ::InterlockedIncrement(&counter2)
+ : ::InterlockedExchangeAdd(&counter2, 0);
+
+ wchar_t pipe_name[128];
+#if defined(ASIO_HAS_SECURE_RTL)
+ swprintf_s(
+#else // defined(ASIO_HAS_SECURE_RTL)
+ _snwprintf(
+#endif // defined(ASIO_HAS_SECURE_RTL)
+ pipe_name, 128,
+ L"\\\\.\\pipe\\asio-A0812896-741A-484D-AF23-BE51BF620E22-%u-%ld-%ld",
+ static_cast<unsigned int>(::GetCurrentProcessId()), n1, n2);
+
+ p[0] = ::CreateNamedPipeW(pipe_name,
+ PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED,
+ 0, 1, 8192, 8192, 0, 0);
+
+ if (p[0] == INVALID_HANDLE_VALUE)
+ {
+ DWORD last_error = ::GetLastError();
+ ec.assign(last_error, asio::error::get_system_category());
+ return;
+ }
+
+ p[1] = ::CreateFileW(pipe_name, GENERIC_WRITE, 0,
+ 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
+
+ if (p[1] == INVALID_HANDLE_VALUE)
+ {
+ DWORD last_error = ::GetLastError();
+ ::CloseHandle(p[0]);
+ ec.assign(last_error, asio::error::get_system_category());
+ return;
+ }
+
+# if _WIN32_WINNT >= 0x601
+ unsigned char nonce[16];
+ if (::BCryptGenRandom(0, nonce, sizeof(nonce),
+ BCRYPT_USE_SYSTEM_PREFERRED_RNG) != 0)
+ {
+ ec = asio::error::connection_aborted;
+ ::CloseHandle(p[0]);
+ ::CloseHandle(p[1]);
+ return;
+ }
+
+ DWORD bytes_written = 0;
+ BOOL ok = ::WriteFile(p[1], nonce, sizeof(nonce), &bytes_written, 0);
+ if (!ok || bytes_written != sizeof(nonce))
+ {
+ ec = asio::error::connection_aborted;
+ ::CloseHandle(p[0]);
+ ::CloseHandle(p[1]);
+ return;
+ }
+
+ unsigned char nonce_check[sizeof(nonce)];
+ DWORD bytes_read = 0;
+ ok = ::ReadFile(p[0], nonce_check, sizeof(nonce), &bytes_read, 0);
+ if (!ok || bytes_read != sizeof(nonce)
+ || memcmp(nonce, nonce_check, sizeof(nonce)) != 0)
+ {
+ ec = asio::error::connection_aborted;
+ ::CloseHandle(p[0]);
+ ::CloseHandle(p[1]);
+ return;
+ }
+#endif // _WIN32_WINNT >= 0x601
+
+ asio::error::clear(ec);
+#else // defined(ASIO_HAS_IOCP)
+ int result = ::pipe(p);
+ detail::descriptor_ops::get_last_error(ec, result != 0);
+#endif // defined(ASIO_HAS_IOCP)
+}
+
+void close_pipe(native_pipe_handle p)
+{
+#if defined(ASIO_HAS_IOCP)
+ ::CloseHandle(p);
+#else // defined(ASIO_HAS_IOCP)
+ asio::error_code ignored_ec;
+ detail::descriptor_ops::state_type state = 0;
+ detail::descriptor_ops::close(p, state, ignored_ec);
+#endif // defined(ASIO_HAS_IOCP)
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_PIPE)
+
+#endif // ASIO_IMPL_CONNECT_PIPE_IPP
diff --git a/3rdparty/asio/include/asio/impl/consign.hpp b/3rdparty/asio/include/asio/impl/consign.hpp
new file mode 100644
index 00000000000..3b753c10fd0
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/consign.hpp
@@ -0,0 +1,137 @@
+//
+// impl/consign.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CONSIGN_HPP
+#define ASIO_IMPL_CONSIGN_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/associator.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/detail/utility.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Class to adapt a consign_t as a completion handler.
+template <typename Handler, typename... Values>
+class consign_handler
+{
+public:
+ typedef void result_type;
+
+ template <typename H>
+ consign_handler(H&& handler, std::tuple<Values...> values)
+ : handler_(static_cast<H&&>(handler)),
+ values_(static_cast<std::tuple<Values...>&&>(values))
+ {
+ }
+
+ template <typename... Args>
+ void operator()(Args&&... args)
+ {
+ static_cast<Handler&&>(handler_)(static_cast<Args&&>(args)...);
+ }
+
+//private:
+ Handler handler_;
+ std::tuple<Values...> values_;
+};
+
+template <typename Handler>
+inline bool asio_handler_is_continuation(
+ consign_handler<Handler>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename CompletionToken, typename... Values, typename... Signatures>
+struct async_result<consign_t<CompletionToken, Values...>, Signatures...>
+ : async_result<CompletionToken, Signatures...>
+{
+ template <typename Initiation>
+ struct init_wrapper
+ {
+ init_wrapper(Initiation init)
+ : initiation_(static_cast<Initiation&&>(init))
+ {
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler,
+ std::tuple<Values...> values, Args&&... args)
+ {
+ static_cast<Initiation&&>(initiation_)(
+ detail::consign_handler<decay_t<Handler>, Values...>(
+ static_cast<Handler&&>(handler),
+ static_cast<std::tuple<Values...>&&>(values)),
+ static_cast<Args&&>(args)...);
+ }
+
+ Initiation initiation_;
+ };
+
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static auto initiate(Initiation&& initiation,
+ RawCompletionToken&& token, Args&&... args)
+ -> decltype(
+ async_initiate<CompletionToken, Signatures...>(
+ init_wrapper<decay_t<Initiation>>(
+ static_cast<Initiation&&>(initiation)),
+ token.token_, static_cast<std::tuple<Values...>&&>(token.values_),
+ static_cast<Args&&>(args)...))
+ {
+ return async_initiate<CompletionToken, Signatures...>(
+ init_wrapper<decay_t<Initiation>>(
+ static_cast<Initiation&&>(initiation)),
+ token.token_, static_cast<std::tuple<Values...>&&>(token.values_),
+ static_cast<Args&&>(args)...);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename... Values, typename DefaultCandidate>
+struct associator<Associator,
+ detail::consign_handler<Handler, Values...>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::consign_handler<Handler, Values...>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::consign_handler<Handler, Values...>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_CONSIGN_HPP
diff --git a/3rdparty/asio/include/asio/impl/deferred.hpp b/3rdparty/asio/include/asio/impl/deferred.hpp
new file mode 100644
index 00000000000..defc34fb3e7
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/deferred.hpp
@@ -0,0 +1,147 @@
+//
+// impl/deferred.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DEFERRED_HPP
+#define ASIO_IMPL_DEFERRED_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 {
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename Signature>
+class async_result<deferred_t, Signature>
+{
+public:
+ template <typename Initiation, typename... InitArgs>
+ static deferred_async_operation<Signature, Initiation, InitArgs...>
+ initiate(Initiation&& initiation, deferred_t, InitArgs&&... args)
+ {
+ return deferred_async_operation<Signature, Initiation, InitArgs...>(
+ deferred_init_tag{},
+ static_cast<Initiation&&>(initiation),
+ static_cast<InitArgs&&>(args)...);
+ }
+};
+
+template <typename... Signatures>
+class async_result<deferred_t, Signatures...>
+{
+public:
+ template <typename Initiation, typename... InitArgs>
+ static deferred_async_operation<
+ deferred_signatures<Signatures...>, Initiation, InitArgs...>
+ initiate(Initiation&& initiation, deferred_t, InitArgs&&... args)
+ {
+ return deferred_async_operation<
+ deferred_signatures<Signatures...>, Initiation, InitArgs...>(
+ deferred_init_tag{},
+ static_cast<Initiation&&>(initiation),
+ static_cast<InitArgs&&>(args)...);
+ }
+};
+
+template <typename Function, typename Signature>
+class async_result<deferred_function<Function>, Signature>
+{
+public:
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate(Initiation&& initiation,
+ deferred_function<Function> token, InitArgs&&... init_args)
+ -> decltype(
+ deferred_sequence<
+ deferred_async_operation<
+ Signature, Initiation, InitArgs...>,
+ Function>(deferred_init_tag{},
+ deferred_async_operation<
+ Signature, Initiation, InitArgs...>(
+ deferred_init_tag{},
+ static_cast<Initiation&&>(initiation),
+ static_cast<InitArgs&&>(init_args)...),
+ static_cast<Function&&>(token.function_)))
+ {
+ return deferred_sequence<
+ deferred_async_operation<
+ Signature, Initiation, InitArgs...>,
+ Function>(deferred_init_tag{},
+ deferred_async_operation<
+ Signature, Initiation, InitArgs...>(
+ deferred_init_tag{},
+ static_cast<Initiation&&>(initiation),
+ static_cast<InitArgs&&>(init_args)...),
+ static_cast<Function&&>(token.function_));
+ }
+};
+
+template <typename Function, typename... Signatures>
+class async_result<deferred_function<Function>, Signatures...>
+{
+public:
+ template <typename Initiation, typename... InitArgs>
+ static auto initiate(Initiation&& initiation,
+ deferred_function<Function> token, InitArgs&&... init_args)
+ -> decltype(
+ deferred_sequence<
+ deferred_async_operation<
+ deferred_signatures<Signatures...>, Initiation, InitArgs...>,
+ Function>(deferred_init_tag{},
+ deferred_async_operation<
+ deferred_signatures<Signatures...>, Initiation, InitArgs...>(
+ deferred_init_tag{},
+ static_cast<Initiation&&>(initiation),
+ static_cast<InitArgs&&>(init_args)...),
+ static_cast<Function&&>(token.function_)))
+ {
+ return deferred_sequence<
+ deferred_async_operation<
+ deferred_signatures<Signatures...>, Initiation, InitArgs...>,
+ Function>(deferred_init_tag{},
+ deferred_async_operation<
+ deferred_signatures<Signatures...>, Initiation, InitArgs...>(
+ deferred_init_tag{},
+ static_cast<Initiation&&>(initiation),
+ static_cast<InitArgs&&>(init_args)...),
+ static_cast<Function&&>(token.function_));
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename Tail, typename DefaultCandidate>
+struct associator<Associator,
+ detail::deferred_sequence_handler<Handler, Tail>,
+ DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::deferred_sequence_handler<Handler, Tail>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::deferred_sequence_handler<Handler, Tail>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_DEFERRED_HPP
diff --git a/3rdparty/asio/include/asio/impl/detached.hpp b/3rdparty/asio/include/asio/impl/detached.hpp
new file mode 100644
index 00000000000..774e52b1e01
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/detached.hpp
@@ -0,0 +1,77 @@
+//
+// impl/detached.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_DETACHED_HPP
+#define ASIO_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/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+ // Class to adapt a detached_t as a completion handler.
+ class detached_handler
+ {
+ public:
+ typedef void result_type;
+
+ detached_handler(detached_t)
+ {
+ }
+
+ template <typename... Args>
+ void operator()(Args...)
+ {
+ }
+ };
+
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename Signature>
+struct async_result<detached_t, Signature>
+{
+ typedef asio::detail::detached_handler completion_handler_type;
+
+ typedef void return_type;
+
+ explicit async_result(completion_handler_type&)
+ {
+ }
+
+ void get()
+ {
+ }
+
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static return_type initiate(Initiation&& initiation,
+ RawCompletionToken&&, Args&&... args)
+ {
+ static_cast<Initiation&&>(initiation)(
+ detail::detached_handler(detached_t()),
+ static_cast<Args&&>(args)...);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_DETACHED_HPP
diff --git a/3rdparty/asio/include/asio/impl/error.ipp b/3rdparty/asio/include/asio/impl/error.ipp
new file mode 100644
index 00000000000..b564a8c68e2
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/error.ipp
@@ -0,0 +1,128 @@
+//
+// impl/error.ipp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <string>
+#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 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 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 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/3rdparty/asio/include/asio/impl/error_code.ipp b/3rdparty/asio/include/asio/impl/error_code.ipp
new file mode 100644
index 00000000000..caeb1967caa
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/error_code.ipp
@@ -0,0 +1,206 @@
+//
+// impl/error_code.ipp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <winerror.h>
+#elif defined(ASIO_WINDOWS_RUNTIME)
+# include <windows.h>
+#else
+# include <cerrno>
+# include <cstring>
+# include <string>
+#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 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<DWORD>(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<int>(wlength),
+ &msg[0], static_cast<int>(wlength * 2), 0, 0);
+ if (length <= 0)
+ return "asio.system error";
+ msg.resize(static_cast<std::size_t>(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 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/3rdparty/asio/include/asio/impl/execution_context.hpp b/3rdparty/asio/include/asio/impl/execution_context.hpp
new file mode 100644
index 00000000000..35dda80417f
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/execution_context.hpp
@@ -0,0 +1,77 @@
+//
+// impl/execution_context.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 {
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename Service>
+inline Service& use_service(execution_context& e)
+{
+ // Check that Service meets the necessary type requirements.
+ (void)static_cast<execution_context::service*>(static_cast<Service*>(0));
+
+ return e.service_registry_->template use_service<Service>();
+}
+
+template <typename Service, typename... Args>
+Service& make_service(execution_context& e, Args&&... args)
+{
+ detail::scoped_ptr<Service> svc(
+ new Service(e, static_cast<Args&&>(args)...));
+ e.service_registry_->template add_service<Service>(svc.get());
+ Service& result = *svc;
+ svc.release();
+ return result;
+}
+
+template <typename Service>
+inline void add_service(execution_context& e, Service* svc)
+{
+ // Check that Service meets the necessary type requirements.
+ (void)static_cast<execution_context::service*>(static_cast<Service*>(0));
+
+ e.service_registry_->template add_service<Service>(svc);
+}
+
+template <typename Service>
+inline bool has_service(execution_context& e)
+{
+ // Check that Service meets the necessary type requirements.
+ (void)static_cast<execution_context::service*>(static_cast<Service*>(0));
+
+ return e.service_registry_->template has_service<Service>();
+}
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+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/3rdparty/asio/include/asio/impl/execution_context.ipp b/3rdparty/asio/include/asio/impl/execution_context.ipp
new file mode 100644
index 00000000000..ed2603c9011
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/execution_context.ipp
@@ -0,0 +1,82 @@
+//
+// impl/execution_context.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/impl/executor.hpp b/3rdparty/asio/include/asio/impl/executor.hpp
new file mode 100644
index 00000000000..8bf76ccd183
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/executor.hpp
@@ -0,0 +1,317 @@
+//
+// impl/executor.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
+#include <new>
+#include "asio/detail/atomic_count.hpp"
+#include "asio/detail/global.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/executor.hpp"
+#include "asio/system_executor.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+// Default polymorphic executor implementation.
+template <typename Executor, typename Allocator>
+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;
+ }
+
+ static impl_base* create(std::nothrow_t, const Executor& e) noexcept
+ {
+ return new (std::nothrow) impl(e, std::allocator<void>());
+ }
+
+ impl(const Executor& e, const Allocator& a) noexcept
+ : impl_base(false),
+ ref_count_(1),
+ executor_(e),
+ allocator_(a)
+ {
+ }
+
+ impl_base* clone() const noexcept
+ {
+ detail::ref_count_up(ref_count_);
+ return const_cast<impl_base*>(static_cast<const impl_base*>(this));
+ }
+
+ void destroy() noexcept
+ {
+ if (detail::ref_count_down(ref_count_))
+ {
+ allocator_type alloc(allocator_);
+ impl* p = this;
+ p->~impl();
+ alloc.deallocate(p, 1);
+ }
+ }
+
+ void on_work_started() noexcept
+ {
+ executor_.on_work_started();
+ }
+
+ void on_work_finished() noexcept
+ {
+ executor_.on_work_finished();
+ }
+
+ execution_context& context() noexcept
+ {
+ return executor_.context();
+ }
+
+ void dispatch(function&& f)
+ {
+ executor_.dispatch(static_cast<function&&>(f), allocator_);
+ }
+
+ void post(function&& f)
+ {
+ executor_.post(static_cast<function&&>(f), allocator_);
+ }
+
+ void defer(function&& f)
+ {
+ executor_.defer(static_cast<function&&>(f), allocator_);
+ }
+
+ type_id_result_type target_type() const noexcept
+ {
+ return type_id<Executor>();
+ }
+
+ void* target() noexcept
+ {
+ return &executor_;
+ }
+
+ const void* target() const noexcept
+ {
+ return &executor_;
+ }
+
+ bool equals(const impl_base* e) const noexcept
+ {
+ if (this == e)
+ return true;
+ if (target_type() != e->target_type())
+ return false;
+ return executor_ == *static_cast<const Executor*>(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 executor specialisation for system_executor.
+template <typename Allocator>
+class executor::impl<system_executor, Allocator>
+ : public executor::impl_base
+{
+public:
+ static impl_base* create(const system_executor&,
+ const Allocator& = Allocator())
+ {
+ return &detail::global<impl<system_executor, std::allocator<void>> >();
+ }
+
+ static impl_base* create(std::nothrow_t, const system_executor&) noexcept
+ {
+ return &detail::global<impl<system_executor, std::allocator<void>> >();
+ }
+
+ impl()
+ : impl_base(true)
+ {
+ }
+
+ impl_base* clone() const noexcept
+ {
+ return const_cast<impl_base*>(static_cast<const impl_base*>(this));
+ }
+
+ void destroy() noexcept
+ {
+ }
+
+ void on_work_started() noexcept
+ {
+ executor_.on_work_started();
+ }
+
+ void on_work_finished() noexcept
+ {
+ executor_.on_work_finished();
+ }
+
+ execution_context& context() noexcept
+ {
+ return executor_.context();
+ }
+
+ void dispatch(function&& f)
+ {
+ executor_.dispatch(static_cast<function&&>(f),
+ std::allocator<void>());
+ }
+
+ void post(function&& f)
+ {
+ executor_.post(static_cast<function&&>(f),
+ std::allocator<void>());
+ }
+
+ void defer(function&& f)
+ {
+ executor_.defer(static_cast<function&&>(f),
+ std::allocator<void>());
+ }
+
+ type_id_result_type target_type() const noexcept
+ {
+ return type_id<system_executor>();
+ }
+
+ void* target() noexcept
+ {
+ return &executor_;
+ }
+
+ const void* target() const noexcept
+ {
+ return &executor_;
+ }
+
+ bool equals(const impl_base* e) const noexcept
+ {
+ return this == e;
+ }
+
+private:
+ system_executor executor_;
+};
+
+template <typename Executor>
+executor::executor(Executor e)
+ : impl_(impl<Executor, std::allocator<void>>::create(e))
+{
+}
+
+template <typename Executor>
+executor::executor(std::nothrow_t, Executor e) noexcept
+ : impl_(impl<Executor, std::allocator<void>>::create(std::nothrow, e))
+{
+}
+
+template <typename Executor, typename Allocator>
+executor::executor(allocator_arg_t, const Allocator& a, Executor e)
+ : impl_(impl<Executor, Allocator>::create(e, a))
+{
+}
+
+template <typename Function, typename Allocator>
+void executor::dispatch(Function&& f,
+ const Allocator& a) const
+{
+ impl_base* i = get_impl();
+ if (i->fast_dispatch_)
+ system_executor().dispatch(static_cast<Function&&>(f), a);
+ else
+ i->dispatch(function(static_cast<Function&&>(f), a));
+}
+
+template <typename Function, typename Allocator>
+void executor::post(Function&& f,
+ const Allocator& a) const
+{
+ get_impl()->post(function(static_cast<Function&&>(f), a));
+}
+
+template <typename Function, typename Allocator>
+void executor::defer(Function&& f,
+ const Allocator& a) const
+{
+ get_impl()->defer(function(static_cast<Function&&>(f), a));
+}
+
+template <typename Executor>
+Executor* executor::target() noexcept
+{
+ return impl_ && impl_->target_type() == type_id<Executor>()
+ ? static_cast<Executor*>(impl_->target()) : 0;
+}
+
+template <typename Executor>
+const Executor* executor::target() const noexcept
+{
+ return impl_ && impl_->target_type() == type_id<Executor>()
+ ? static_cast<Executor*>(impl_->target()) : 0;
+}
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+#endif // ASIO_IMPL_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/impl/executor.ipp b/3rdparty/asio/include/asio/impl/executor.ipp
new file mode 100644
index 00000000000..4153a171e09
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/executor.ipp
@@ -0,0 +1,43 @@
+//
+// impl/executor.ipp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
+#include "asio/executor.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+bad_executor::bad_executor() noexcept
+{
+}
+
+const char* bad_executor::what() const noexcept
+{
+ return "bad executor";
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+#endif // ASIO_IMPL_EXECUTOR_IPP
diff --git a/3rdparty/asio/include/asio/impl/io_context.hpp b/3rdparty/asio/include/asio/impl/io_context.hpp
new file mode 100644
index 00000000000..002b585502d
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/io_context.hpp
@@ -0,0 +1,433 @@
+//
+// impl/io_context.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/non_const_lvalue.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 {
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename Service>
+inline Service& use_service(io_context& ioc)
+{
+ // Check that Service meets the necessary type requirements.
+ (void)static_cast<execution_context::service*>(static_cast<Service*>(0));
+ (void)static_cast<const execution_context::id*>(&Service::id);
+
+ return ioc.service_registry_->template use_service<Service>(ioc);
+}
+
+template <>
+inline detail::io_context_impl& use_service<detail::io_context_impl>(
+ io_context& ioc)
+{
+ return ioc.impl_;
+}
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+inline io_context::executor_type
+io_context::get_executor() noexcept
+{
+ return executor_type(*this);
+}
+
+template <typename Rep, typename Period>
+std::size_t io_context::run_for(
+ const chrono::duration<Rep, Period>& rel_time)
+{
+ return this->run_until(chrono::steady_clock::now() + rel_time);
+}
+
+template <typename Clock, typename Duration>
+std::size_t io_context::run_until(
+ const chrono::time_point<Clock, Duration>& abs_time)
+{
+ std::size_t n = 0;
+ while (this->run_one_until(abs_time))
+ if (n != (std::numeric_limits<std::size_t>::max)())
+ ++n;
+ return n;
+}
+
+template <typename Rep, typename Period>
+std::size_t io_context::run_one_for(
+ const chrono::duration<Rep, Period>& rel_time)
+{
+ return this->run_one_until(chrono::steady_clock::now() + rel_time);
+}
+
+template <typename Clock, typename Duration>
+std::size_t io_context::run_one_until(
+ const chrono::time_point<Clock, Duration>& 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<long>(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;
+}
+
+#if !defined(ASIO_NO_DEPRECATED)
+
+inline void io_context::reset()
+{
+ restart();
+}
+
+struct io_context::initiate_dispatch
+{
+ template <typename LegacyCompletionHandler>
+ void operator()(LegacyCompletionHandler&& handler,
+ io_context* self) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<LegacyCompletionHandler> handler2(handler);
+ if (self->impl_.can_dispatch())
+ {
+ detail::fenced_block b(detail::fenced_block::full);
+ static_cast<decay_t<LegacyCompletionHandler>&&>(handler2.value)();
+ }
+ else
+ {
+ // Allocate and construct an operation to wrap the handler.
+ typedef detail::completion_handler<
+ decay_t<LegacyCompletionHandler>, executor_type> op;
+ typename op::ptr p = { detail::addressof(handler2.value),
+ op::ptr::allocate(handler2.value), 0 };
+ p.p = new (p.v) op(handler2.value, self->get_executor());
+
+ ASIO_HANDLER_CREATION((*self, *p.p,
+ "io_context", self, 0, "dispatch"));
+
+ self->impl_.do_dispatch(p.p);
+ p.v = p.p = 0;
+ }
+ }
+};
+
+template <typename LegacyCompletionHandler>
+auto io_context::dispatch(LegacyCompletionHandler&& handler)
+ -> decltype(
+ async_initiate<LegacyCompletionHandler, void ()>(
+ declval<initiate_dispatch>(), handler, this))
+{
+ return async_initiate<LegacyCompletionHandler, void ()>(
+ initiate_dispatch(), handler, this);
+}
+
+struct io_context::initiate_post
+{
+ template <typename LegacyCompletionHandler>
+ void operator()(LegacyCompletionHandler&& handler,
+ io_context* self) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<LegacyCompletionHandler> handler2(handler);
+
+ bool is_continuation =
+ asio_handler_cont_helpers::is_continuation(handler2.value);
+
+ // Allocate and construct an operation to wrap the handler.
+ typedef detail::completion_handler<
+ decay_t<LegacyCompletionHandler>, executor_type> op;
+ typename op::ptr p = { detail::addressof(handler2.value),
+ op::ptr::allocate(handler2.value), 0 };
+ p.p = new (p.v) op(handler2.value, self->get_executor());
+
+ ASIO_HANDLER_CREATION((*self, *p.p,
+ "io_context", self, 0, "post"));
+
+ self->impl_.post_immediate_completion(p.p, is_continuation);
+ p.v = p.p = 0;
+ }
+};
+
+template <typename LegacyCompletionHandler>
+auto io_context::post(LegacyCompletionHandler&& handler)
+ -> decltype(
+ async_initiate<LegacyCompletionHandler, void ()>(
+ declval<initiate_post>(), handler, this))
+{
+ return async_initiate<LegacyCompletionHandler, void ()>(
+ initiate_post(), handler, this);
+}
+
+template <typename Handler>
+#if defined(GENERATING_DOCUMENTATION)
+unspecified
+#else
+inline detail::wrapped_handler<io_context&, Handler>
+#endif
+io_context::wrap(Handler handler)
+{
+ return detail::wrapped_handler<io_context&, Handler>(*this, handler);
+}
+
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+template <typename Allocator, uintptr_t Bits>
+io_context::basic_executor_type<Allocator, Bits>&
+io_context::basic_executor_type<Allocator, Bits>::operator=(
+ const basic_executor_type& other) noexcept
+{
+ if (this != &other)
+ {
+ static_cast<Allocator&>(*this) = static_cast<const Allocator&>(other);
+ io_context* old_io_context = context_ptr();
+ target_ = other.target_;
+ if (Bits & outstanding_work_tracked)
+ {
+ if (context_ptr())
+ context_ptr()->impl_.work_started();
+ if (old_io_context)
+ old_io_context->impl_.work_finished();
+ }
+ }
+ return *this;
+}
+
+template <typename Allocator, uintptr_t Bits>
+io_context::basic_executor_type<Allocator, Bits>&
+io_context::basic_executor_type<Allocator, Bits>::operator=(
+ basic_executor_type&& other) noexcept
+{
+ if (this != &other)
+ {
+ static_cast<Allocator&>(*this) = static_cast<Allocator&&>(other);
+ io_context* old_io_context = context_ptr();
+ target_ = other.target_;
+ if (Bits & outstanding_work_tracked)
+ {
+ other.target_ = 0;
+ if (old_io_context)
+ old_io_context->impl_.work_finished();
+ }
+ }
+ return *this;
+}
+
+template <typename Allocator, uintptr_t Bits>
+inline bool io_context::basic_executor_type<Allocator,
+ Bits>::running_in_this_thread() const noexcept
+{
+ return context_ptr()->impl_.can_dispatch();
+}
+
+template <typename Allocator, uintptr_t Bits>
+template <typename Function>
+void io_context::basic_executor_type<Allocator, Bits>::execute(
+ Function&& f) const
+{
+ typedef decay_t<Function> function_type;
+
+ // Invoke immediately if the blocking.possibly property is enabled and we are
+ // already inside the thread pool.
+ if ((bits() & blocking_never) == 0 && context_ptr()->impl_.can_dispatch())
+ {
+ // Make a local, non-const copy of the function.
+ function_type tmp(static_cast<Function&&>(f));
+
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+ {
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ detail::fenced_block b(detail::fenced_block::full);
+ static_cast<function_type&&>(tmp)();
+ return;
+#if !defined(ASIO_NO_EXCEPTIONS)
+ }
+ catch (...)
+ {
+ context_ptr()->impl_.capture_current_exception();
+ return;
+ }
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ }
+
+ // Allocate and construct an operation to wrap the function.
+ typedef detail::executor_op<function_type, Allocator, detail::operation> op;
+ typename op::ptr p = {
+ detail::addressof(static_cast<const Allocator&>(*this)),
+ op::ptr::allocate(static_cast<const Allocator&>(*this)), 0 };
+ p.p = new (p.v) op(static_cast<Function&&>(f),
+ static_cast<const Allocator&>(*this));
+
+ ASIO_HANDLER_CREATION((*context_ptr(), *p.p,
+ "io_context", context_ptr(), 0, "execute"));
+
+ context_ptr()->impl_.post_immediate_completion(p.p,
+ (bits() & relationship_continuation) != 0);
+ p.v = p.p = 0;
+}
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+template <typename Allocator, uintptr_t Bits>
+inline io_context& io_context::basic_executor_type<
+ Allocator, Bits>::context() const noexcept
+{
+ return *context_ptr();
+}
+
+template <typename Allocator, uintptr_t Bits>
+inline void io_context::basic_executor_type<Allocator,
+ Bits>::on_work_started() const noexcept
+{
+ context_ptr()->impl_.work_started();
+}
+
+template <typename Allocator, uintptr_t Bits>
+inline void io_context::basic_executor_type<Allocator,
+ Bits>::on_work_finished() const noexcept
+{
+ context_ptr()->impl_.work_finished();
+}
+
+template <typename Allocator, uintptr_t Bits>
+template <typename Function, typename OtherAllocator>
+void io_context::basic_executor_type<Allocator, Bits>::dispatch(
+ Function&& f, const OtherAllocator& a) const
+{
+ typedef decay_t<Function> function_type;
+
+ // Invoke immediately if we are already inside the thread pool.
+ if (context_ptr()->impl_.can_dispatch())
+ {
+ // Make a local, non-const copy of the function.
+ function_type tmp(static_cast<Function&&>(f));
+
+ detail::fenced_block b(detail::fenced_block::full);
+ static_cast<function_type&&>(tmp)();
+ return;
+ }
+
+ // Allocate and construct an operation to wrap the function.
+ typedef detail::executor_op<function_type,
+ OtherAllocator, detail::operation> op;
+ typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
+ p.p = new (p.v) op(static_cast<Function&&>(f), a);
+
+ ASIO_HANDLER_CREATION((*context_ptr(), *p.p,
+ "io_context", context_ptr(), 0, "dispatch"));
+
+ context_ptr()->impl_.post_immediate_completion(p.p, false);
+ p.v = p.p = 0;
+}
+
+template <typename Allocator, uintptr_t Bits>
+template <typename Function, typename OtherAllocator>
+void io_context::basic_executor_type<Allocator, Bits>::post(
+ Function&& f, const OtherAllocator& a) const
+{
+ // Allocate and construct an operation to wrap the function.
+ typedef detail::executor_op<decay_t<Function>,
+ OtherAllocator, detail::operation> op;
+ typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
+ p.p = new (p.v) op(static_cast<Function&&>(f), a);
+
+ ASIO_HANDLER_CREATION((*context_ptr(), *p.p,
+ "io_context", context_ptr(), 0, "post"));
+
+ context_ptr()->impl_.post_immediate_completion(p.p, false);
+ p.v = p.p = 0;
+}
+
+template <typename Allocator, uintptr_t Bits>
+template <typename Function, typename OtherAllocator>
+void io_context::basic_executor_type<Allocator, Bits>::defer(
+ Function&& f, const OtherAllocator& a) const
+{
+ // Allocate and construct an operation to wrap the function.
+ typedef detail::executor_op<decay_t<Function>,
+ OtherAllocator, detail::operation> op;
+ typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
+ p.p = new (p.v) op(static_cast<Function&&>(f), a);
+
+ ASIO_HANDLER_CREATION((*context_ptr(), *p.p,
+ "io_context", context_ptr(), 0, "defer"));
+
+ context_ptr()->impl_.post_immediate_completion(p.p, true);
+ p.v = p.p = 0;
+}
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+#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<asio::io_context&>(io_context_impl_.context());
+}
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+inline asio::io_context& io_context::service::get_io_context()
+{
+ return static_cast<asio::io_context&>(context());
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_IO_CONTEXT_HPP
diff --git a/3rdparty/asio/include/asio/impl/io_context.ipp b/3rdparty/asio/include/asio/impl/io_context.ipp
new file mode 100644
index 00000000000..14c8736c7b2
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/io_context.ipp
@@ -0,0 +1,176 @@
+//
+// impl/io_context.ipp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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, false)))
+{
+}
+
+io_context::io_context(int concurrency_hint)
+ : impl_(add_impl(new impl_type(*this, concurrency_hint == 1
+ ? ASIO_CONCURRENCY_HINT_1 : concurrency_hint, false)))
+{
+}
+
+io_context::impl_type& io_context::add_impl(io_context::impl_type* impl)
+{
+ asio::detail::scoped_ptr<impl_type> scoped_impl(impl);
+ asio::add_service<impl_type>(*this, scoped_impl.get());
+ return *scoped_impl.release();
+}
+
+io_context::~io_context()
+{
+ shutdown();
+}
+
+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/3rdparty/asio/include/asio/impl/multiple_exceptions.ipp b/3rdparty/asio/include/asio/impl/multiple_exceptions.ipp
new file mode 100644
index 00000000000..c922c27a055
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/multiple_exceptions.ipp
@@ -0,0 +1,45 @@
+//
+// impl/multiple_exceptions.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_MULTIPLE_EXCEPTIONS_IPP
+#define ASIO_IMPL_MULTIPLE_EXCEPTIONS_IPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/multiple_exceptions.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+multiple_exceptions::multiple_exceptions(
+ std::exception_ptr first) noexcept
+ : first_(static_cast<std::exception_ptr&&>(first))
+{
+}
+
+const char* multiple_exceptions::what() const noexcept
+{
+ return "multiple exceptions";
+}
+
+std::exception_ptr multiple_exceptions::first_exception() const
+{
+ return first_;
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_MULTIPLE_EXCEPTIONS_IPP
diff --git a/3rdparty/asio/include/asio/impl/prepend.hpp b/3rdparty/asio/include/asio/impl/prepend.hpp
new file mode 100644
index 00000000000..f336d55d825
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/prepend.hpp
@@ -0,0 +1,163 @@
+//
+// impl/prepend.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_PREPEND_HPP
+#define ASIO_IMPL_PREPEND_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include "asio/associator.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/detail/utility.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Class to adapt a prepend_t as a completion handler.
+template <typename Handler, typename... Values>
+class prepend_handler
+{
+public:
+ typedef void result_type;
+
+ template <typename H>
+ prepend_handler(H&& handler, std::tuple<Values...> values)
+ : handler_(static_cast<H&&>(handler)),
+ values_(static_cast<std::tuple<Values...>&&>(values))
+ {
+ }
+
+ template <typename... Args>
+ void operator()(Args&&... args)
+ {
+ this->invoke(
+ index_sequence_for<Values...>{},
+ static_cast<Args&&>(args)...);
+ }
+
+ template <std::size_t... I, typename... Args>
+ void invoke(index_sequence<I...>, Args&&... args)
+ {
+ static_cast<Handler&&>(handler_)(
+ static_cast<Values&&>(std::get<I>(values_))...,
+ static_cast<Args&&>(args)...);
+ }
+
+//private:
+ Handler handler_;
+ std::tuple<Values...> values_;
+};
+
+template <typename Handler>
+inline bool asio_handler_is_continuation(
+ prepend_handler<Handler>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Signature, typename... Values>
+struct prepend_signature;
+
+template <typename R, typename... Args, typename... Values>
+struct prepend_signature<R(Args...), Values...>
+{
+ typedef R type(Values..., decay_t<Args>...);
+};
+
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename CompletionToken, typename... Values, typename Signature>
+struct async_result<
+ prepend_t<CompletionToken, Values...>, Signature>
+ : async_result<CompletionToken,
+ typename detail::prepend_signature<
+ Signature, Values...>::type>
+{
+ typedef typename detail::prepend_signature<
+ Signature, Values...>::type signature;
+
+ template <typename Initiation>
+ struct init_wrapper
+ {
+ init_wrapper(Initiation init)
+ : initiation_(static_cast<Initiation&&>(init))
+ {
+ }
+
+ template <typename Handler, typename... Args>
+ void operator()(Handler&& handler,
+ std::tuple<Values...> values, Args&&... args)
+ {
+ static_cast<Initiation&&>(initiation_)(
+ detail::prepend_handler<decay_t<Handler>, Values...>(
+ static_cast<Handler&&>(handler),
+ static_cast<std::tuple<Values...>&&>(values)),
+ static_cast<Args&&>(args)...);
+ }
+
+ Initiation initiation_;
+ };
+
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static auto initiate(Initiation&& initiation,
+ RawCompletionToken&& token, Args&&... args)
+ -> decltype(
+ async_initiate<CompletionToken, signature>(
+ declval<init_wrapper<decay_t<Initiation>>>(),
+ token.token_,
+ static_cast<std::tuple<Values...>&&>(token.values_),
+ static_cast<Args&&>(args)...))
+ {
+ return async_initiate<CompletionToken, signature>(
+ init_wrapper<decay_t<Initiation>>(
+ static_cast<Initiation&&>(initiation)),
+ token.token_,
+ static_cast<std::tuple<Values...>&&>(token.values_),
+ static_cast<Args&&>(args)...);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename... Values, typename DefaultCandidate>
+struct associator<Associator,
+ detail::prepend_handler<Handler, Values...>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::prepend_handler<Handler, Values...>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::prepend_handler<Handler, Values...>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_PREPEND_HPP
diff --git a/3rdparty/asio/include/asio/impl/read.hpp b/3rdparty/asio/include/asio/impl/read.hpp
new file mode 100644
index 00000000000..d86fb6467b1
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/read.hpp
@@ -0,0 +1,1053 @@
+//
+// impl/read.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <algorithm>
+#include "asio/associator.hpp"
+#include "asio/buffer.hpp"
+#include "asio/detail/array_fwd.hpp"
+#include "asio/detail/base_from_cancellation_state.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_cont_helpers.hpp"
+#include "asio/detail/handler_tracking.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+namespace detail
+{
+ template <typename SyncReadStream, typename MutableBufferSequence,
+ typename MutableBufferIterator, typename CompletionCondition>
+ std::size_t read_buffer_seq(SyncReadStream& s,
+ const MutableBufferSequence& buffers, const MutableBufferIterator&,
+ CompletionCondition completion_condition, asio::error_code& ec)
+ {
+ ec = asio::error_code();
+ asio::detail::consuming_buffers<mutable_buffer,
+ MutableBufferSequence, MutableBufferIterator> 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 <typename SyncReadStream, typename MutableBufferSequence,
+ typename CompletionCondition>
+std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
+ CompletionCondition completion_condition, asio::error_code& ec,
+ constraint_t<
+ is_mutable_buffer_sequence<MutableBufferSequence>::value
+ >)
+{
+ return detail::read_buffer_seq(s, buffers,
+ asio::buffer_sequence_begin(buffers),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+}
+
+template <typename SyncReadStream, typename MutableBufferSequence>
+inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
+ constraint_t<
+ is_mutable_buffer_sequence<MutableBufferSequence>::value
+ >)
+{
+ 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 <typename SyncReadStream, typename MutableBufferSequence>
+inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
+ asio::error_code& ec,
+ constraint_t<
+ is_mutable_buffer_sequence<MutableBufferSequence>::value
+ >)
+{
+ return read(s, buffers, transfer_all(), ec);
+}
+
+template <typename SyncReadStream, typename MutableBufferSequence,
+ typename CompletionCondition>
+inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
+ CompletionCondition completion_condition,
+ constraint_t<
+ is_mutable_buffer_sequence<MutableBufferSequence>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read(s, buffers,
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+ asio::detail::throw_error(ec, "read");
+ return bytes_transferred;
+}
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+template <typename SyncReadStream, typename DynamicBuffer_v1,
+ typename CompletionCondition>
+std::size_t read(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ CompletionCondition completion_condition, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ decay_t<DynamicBuffer_v1> b(
+ static_cast<DynamicBuffer_v1&&>(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::size_t>(
+ std::max<std::size_t>(512, b.capacity() - b.size()),
+ std::min<std::size_t>(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::size_t>(
+ std::max<std::size_t>(512, b.capacity() - b.size()),
+ std::min<std::size_t>(max_size, b.max_size() - b.size()));
+ }
+ return total_transferred;
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v1>
+inline std::size_t read(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read(s,
+ static_cast<DynamicBuffer_v1&&>(buffers), transfer_all(), ec);
+ asio::detail::throw_error(ec, "read");
+ return bytes_transferred;
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v1>
+inline std::size_t read(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ return read(s, static_cast<DynamicBuffer_v1&&>(buffers),
+ transfer_all(), ec);
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v1,
+ typename CompletionCondition>
+inline std::size_t read(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ CompletionCondition completion_condition,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read(s,
+ static_cast<DynamicBuffer_v1&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+ asio::detail::throw_error(ec, "read");
+ return bytes_transferred;
+}
+
+#if !defined(ASIO_NO_EXTENSIONS)
+#if !defined(ASIO_NO_IOSTREAM)
+
+template <typename SyncReadStream, typename Allocator,
+ typename CompletionCondition>
+inline std::size_t read(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition, asio::error_code& ec)
+{
+ return read(s, basic_streambuf_ref<Allocator>(b),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+}
+
+template <typename SyncReadStream, typename Allocator>
+inline std::size_t read(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b)
+{
+ return read(s, basic_streambuf_ref<Allocator>(b));
+}
+
+template <typename SyncReadStream, typename Allocator>
+inline std::size_t read(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ asio::error_code& ec)
+{
+ return read(s, basic_streambuf_ref<Allocator>(b), ec);
+}
+
+template <typename SyncReadStream, typename Allocator,
+ typename CompletionCondition>
+inline std::size_t read(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition)
+{
+ return read(s, basic_streambuf_ref<Allocator>(b),
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+#endif // !defined(ASIO_NO_EXTENSIONS)
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+template <typename SyncReadStream, typename DynamicBuffer_v2,
+ typename CompletionCondition>
+std::size_t read(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ CompletionCondition completion_condition, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ DynamicBuffer_v2& b = 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::size_t>(
+ std::max<std::size_t>(512, b.capacity() - b.size()),
+ std::min<std::size_t>(max_size, b.max_size() - b.size()));
+ while (bytes_available > 0)
+ {
+ std::size_t pos = b.size();
+ b.grow(bytes_available);
+ std::size_t bytes_transferred = s.read_some(
+ b.data(pos, bytes_available), ec);
+ b.shrink(bytes_available - bytes_transferred);
+ total_transferred += bytes_transferred;
+ max_size = detail::adapt_completion_condition_result(
+ completion_condition(ec, total_transferred));
+ bytes_available = std::min<std::size_t>(
+ std::max<std::size_t>(512, b.capacity() - b.size()),
+ std::min<std::size_t>(max_size, b.max_size() - b.size()));
+ }
+ return total_transferred;
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v2>
+inline std::size_t read(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read(s,
+ static_cast<DynamicBuffer_v2&&>(buffers), transfer_all(), ec);
+ asio::detail::throw_error(ec, "read");
+ return bytes_transferred;
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v2>
+inline std::size_t read(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ return read(s, static_cast<DynamicBuffer_v2&&>(buffers),
+ transfer_all(), ec);
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v2,
+ typename CompletionCondition>
+inline std::size_t read(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ CompletionCondition completion_condition,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read(s,
+ static_cast<DynamicBuffer_v2&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+ asio::detail::throw_error(ec, "read");
+ return bytes_transferred;
+}
+
+namespace detail
+{
+ template <typename AsyncReadStream, typename MutableBufferSequence,
+ typename MutableBufferIterator, typename CompletionCondition,
+ typename ReadHandler>
+ class read_op
+ : public base_from_cancellation_state<ReadHandler>,
+ base_from_completion_cond<CompletionCondition>
+ {
+ public:
+ read_op(AsyncReadStream& stream, const MutableBufferSequence& buffers,
+ CompletionCondition& completion_condition, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ base_from_completion_cond<CompletionCondition>(completion_condition),
+ stream_(stream),
+ buffers_(buffers),
+ start_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_op(const read_op& other)
+ : base_from_cancellation_state<ReadHandler>(other),
+ base_from_completion_cond<CompletionCondition>(other),
+ stream_(other.stream_),
+ buffers_(other.buffers_),
+ start_(other.start_),
+ handler_(other.handler_)
+ {
+ }
+
+ read_op(read_op&& other)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ base_from_completion_cond<CompletionCondition>(
+ static_cast<base_from_completion_cond<CompletionCondition>&&>(other)),
+ stream_(other.stream_),
+ buffers_(static_cast<buffers_type&&>(other.buffers_)),
+ start_(other.start_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(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());
+ for (;;)
+ {
+ {
+ ASIO_HANDLER_LOCATION((__FILE__, __LINE__, "async_read"));
+ stream_.async_read_some(buffers_.prepare(max_size),
+ static_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());
+ if (max_size == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = error::operation_aborted;
+ break;
+ }
+ }
+
+ static_cast<ReadHandler&&>(handler_)(
+ static_cast<const asio::error_code&>(ec),
+ static_cast<const std::size_t&>(buffers_.total_consumed()));
+ }
+ }
+
+ //private:
+ typedef asio::detail::consuming_buffers<mutable_buffer,
+ MutableBufferSequence, MutableBufferIterator> buffers_type;
+
+ AsyncReadStream& stream_;
+ buffers_type buffers_;
+ int start_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncReadStream, typename MutableBufferSequence,
+ typename MutableBufferIterator, typename CompletionCondition,
+ typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_op<AsyncReadStream, MutableBufferSequence, MutableBufferIterator,
+ CompletionCondition, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncReadStream, typename MutableBufferSequence,
+ typename MutableBufferIterator, typename CompletionCondition,
+ typename ReadHandler>
+ inline void start_read_op(AsyncReadStream& stream,
+ const MutableBufferSequence& buffers, const MutableBufferIterator&,
+ CompletionCondition& completion_condition, ReadHandler& handler)
+ {
+ read_op<AsyncReadStream, MutableBufferSequence,
+ MutableBufferIterator, CompletionCondition, ReadHandler>(
+ stream, buffers, completion_condition, handler)(
+ asio::error_code(), 0, 1);
+ }
+
+ template <typename AsyncReadStream>
+ class initiate_async_read
+ {
+ public:
+ typedef typename AsyncReadStream::executor_type executor_type;
+
+ explicit initiate_async_read(AsyncReadStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence,
+ typename CompletionCondition>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers,
+ CompletionCondition&& completion_cond) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
+ start_read_op(stream_, buffers,
+ asio::buffer_sequence_begin(buffers),
+ completion_cond2.value, handler2.value);
+ }
+
+ private:
+ AsyncReadStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncReadStream, typename MutableBufferSequence,
+ typename MutableBufferIterator, typename CompletionCondition,
+ typename ReadHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_op<AsyncReadStream, MutableBufferSequence,
+ MutableBufferIterator, CompletionCondition, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_op<AsyncReadStream, MutableBufferSequence,
+ MutableBufferIterator, CompletionCondition, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_op<AsyncReadStream, MutableBufferSequence,
+ MutableBufferIterator, CompletionCondition, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncReadStream,
+ typename MutableBufferSequence, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
+ CompletionCondition completion_condition, ReadToken&& token,
+ constraint_t<
+ is_mutable_buffer_sequence<MutableBufferSequence>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read<AsyncReadStream>>(), token, buffers,
+ static_cast<CompletionCondition&&>(completion_condition)))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read<AsyncReadStream>(s), token, buffers,
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+template <typename AsyncReadStream, typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read(AsyncReadStream& s,
+ const MutableBufferSequence& buffers, ReadToken&& token,
+ constraint_t<
+ is_mutable_buffer_sequence<MutableBufferSequence>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read<AsyncReadStream>>(),
+ token, buffers, transfer_all()))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read<AsyncReadStream>(s),
+ token, buffers, transfer_all());
+}
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+namespace detail
+{
+ template <typename AsyncReadStream, typename DynamicBuffer_v1,
+ typename CompletionCondition, typename ReadHandler>
+ class read_dynbuf_v1_op
+ : public base_from_cancellation_state<ReadHandler>,
+ base_from_completion_cond<CompletionCondition>
+ {
+ public:
+ template <typename BufferSequence>
+ read_dynbuf_v1_op(AsyncReadStream& stream,
+ BufferSequence&& buffers,
+ CompletionCondition& completion_condition, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ base_from_completion_cond<CompletionCondition>(completion_condition),
+ stream_(stream),
+ buffers_(static_cast<BufferSequence&&>(buffers)),
+ start_(0),
+ total_transferred_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_dynbuf_v1_op(const read_dynbuf_v1_op& other)
+ : base_from_cancellation_state<ReadHandler>(other),
+ base_from_completion_cond<CompletionCondition>(other),
+ stream_(other.stream_),
+ buffers_(other.buffers_),
+ start_(other.start_),
+ total_transferred_(other.total_transferred_),
+ handler_(other.handler_)
+ {
+ }
+
+ read_dynbuf_v1_op(read_dynbuf_v1_op&& other)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ base_from_completion_cond<CompletionCondition>(
+ static_cast<base_from_completion_cond<CompletionCondition>&&>(other)),
+ stream_(other.stream_),
+ buffers_(static_cast<DynamicBuffer_v1&&>(other.buffers_)),
+ start_(other.start_),
+ total_transferred_(other.total_transferred_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(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::size_t>(
+ std::max<std::size_t>(512,
+ buffers_.capacity() - buffers_.size()),
+ std::min<std::size_t>(max_size,
+ buffers_.max_size() - buffers_.size()));
+ for (;;)
+ {
+ {
+ ASIO_HANDLER_LOCATION((__FILE__, __LINE__, "async_read"));
+ stream_.async_read_some(buffers_.prepare(bytes_available),
+ static_cast<read_dynbuf_v1_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::size_t>(
+ std::max<std::size_t>(512,
+ buffers_.capacity() - buffers_.size()),
+ std::min<std::size_t>(max_size,
+ buffers_.max_size() - buffers_.size()));
+ if ((!ec && bytes_transferred == 0) || bytes_available == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = error::operation_aborted;
+ break;
+ }
+ }
+
+ static_cast<ReadHandler&&>(handler_)(
+ static_cast<const asio::error_code&>(ec),
+ static_cast<const std::size_t&>(total_transferred_));
+ }
+ }
+
+ //private:
+ AsyncReadStream& stream_;
+ DynamicBuffer_v1 buffers_;
+ int start_;
+ std::size_t total_transferred_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncReadStream, typename DynamicBuffer_v1,
+ typename CompletionCondition, typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_dynbuf_v1_op<AsyncReadStream, DynamicBuffer_v1,
+ CompletionCondition, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncReadStream>
+ class initiate_async_read_dynbuf_v1
+ {
+ public:
+ typedef typename AsyncReadStream::executor_type executor_type;
+
+ explicit initiate_async_read_dynbuf_v1(AsyncReadStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename ReadHandler, typename DynamicBuffer_v1,
+ typename CompletionCondition>
+ void operator()(ReadHandler&& handler,
+ DynamicBuffer_v1&& buffers,
+ CompletionCondition&& completion_cond) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
+ read_dynbuf_v1_op<AsyncReadStream, decay_t<DynamicBuffer_v1>,
+ CompletionCondition, decay_t<ReadHandler>>(
+ stream_, static_cast<DynamicBuffer_v1&&>(buffers),
+ completion_cond2.value, handler2.value)(
+ asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncReadStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncReadStream, typename DynamicBuffer_v1,
+ typename CompletionCondition, typename ReadHandler,
+ typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_dynbuf_v1_op<AsyncReadStream,
+ DynamicBuffer_v1, CompletionCondition, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_dynbuf_v1_op<AsyncReadStream, DynamicBuffer_v1,
+ CompletionCondition, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_dynbuf_v1_op<AsyncReadStream,
+ DynamicBuffer_v1, CompletionCondition, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncReadStream, typename DynamicBuffer_v1,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read(AsyncReadStream& s,
+ DynamicBuffer_v1&& buffers, ReadToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_dynbuf_v1<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers), transfer_all()))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_dynbuf_v1<AsyncReadStream>(s),
+ token, static_cast<DynamicBuffer_v1&&>(buffers), transfer_all());
+}
+
+template <typename AsyncReadStream,
+ typename DynamicBuffer_v1, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read(AsyncReadStream& s, DynamicBuffer_v1&& buffers,
+ CompletionCondition completion_condition, ReadToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_dynbuf_v1<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition)))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_dynbuf_v1<AsyncReadStream>(s),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+#if !defined(ASIO_NO_EXTENSIONS)
+#if !defined(ASIO_NO_IOSTREAM)
+
+template <typename AsyncReadStream, typename Allocator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read(AsyncReadStream& s,
+ basic_streambuf<Allocator>& b, ReadToken&& token)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_dynbuf_v1<AsyncReadStream>>(),
+ token, basic_streambuf_ref<Allocator>(b), transfer_all()))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_dynbuf_v1<AsyncReadStream>(s),
+ token, basic_streambuf_ref<Allocator>(b), transfer_all());
+}
+
+template <typename AsyncReadStream,
+ typename Allocator, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read(AsyncReadStream& s, basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition, ReadToken&& token)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_dynbuf_v1<AsyncReadStream>>(),
+ token, basic_streambuf_ref<Allocator>(b),
+ static_cast<CompletionCondition&&>(completion_condition)))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_dynbuf_v1<AsyncReadStream>(s),
+ token, basic_streambuf_ref<Allocator>(b),
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+#endif // !defined(ASIO_NO_EXTENSIONS)
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+namespace detail
+{
+ template <typename AsyncReadStream, typename DynamicBuffer_v2,
+ typename CompletionCondition, typename ReadHandler>
+ class read_dynbuf_v2_op
+ : public base_from_cancellation_state<ReadHandler>,
+ base_from_completion_cond<CompletionCondition>
+ {
+ public:
+ template <typename BufferSequence>
+ read_dynbuf_v2_op(AsyncReadStream& stream,
+ BufferSequence&& buffers,
+ CompletionCondition& completion_condition, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ base_from_completion_cond<CompletionCondition>(completion_condition),
+ stream_(stream),
+ buffers_(static_cast<BufferSequence&&>(buffers)),
+ start_(0),
+ total_transferred_(0),
+ bytes_available_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_dynbuf_v2_op(const read_dynbuf_v2_op& other)
+ : base_from_cancellation_state<ReadHandler>(other),
+ base_from_completion_cond<CompletionCondition>(other),
+ stream_(other.stream_),
+ buffers_(other.buffers_),
+ start_(other.start_),
+ total_transferred_(other.total_transferred_),
+ bytes_available_(other.bytes_available_),
+ handler_(other.handler_)
+ {
+ }
+
+ read_dynbuf_v2_op(read_dynbuf_v2_op&& other)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ base_from_completion_cond<CompletionCondition>(
+ static_cast<base_from_completion_cond<CompletionCondition>&&>(other)),
+ stream_(other.stream_),
+ buffers_(static_cast<DynamicBuffer_v2&&>(other.buffers_)),
+ start_(other.start_),
+ total_transferred_(other.total_transferred_),
+ bytes_available_(other.bytes_available_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(asio::error_code ec,
+ std::size_t bytes_transferred, int start = 0)
+ {
+ std::size_t max_size, pos;
+ switch (start_ = start)
+ {
+ case 1:
+ max_size = this->check_for_completion(ec, total_transferred_);
+ bytes_available_ = std::min<std::size_t>(
+ std::max<std::size_t>(512,
+ buffers_.capacity() - buffers_.size()),
+ std::min<std::size_t>(max_size,
+ buffers_.max_size() - buffers_.size()));
+ for (;;)
+ {
+ pos = buffers_.size();
+ buffers_.grow(bytes_available_);
+ {
+ ASIO_HANDLER_LOCATION((__FILE__, __LINE__, "async_read"));
+ stream_.async_read_some(buffers_.data(pos, bytes_available_),
+ static_cast<read_dynbuf_v2_op&&>(*this));
+ }
+ return; default:
+ total_transferred_ += bytes_transferred;
+ buffers_.shrink(bytes_available_ - bytes_transferred);
+ max_size = this->check_for_completion(ec, total_transferred_);
+ bytes_available_ = std::min<std::size_t>(
+ std::max<std::size_t>(512,
+ buffers_.capacity() - buffers_.size()),
+ std::min<std::size_t>(max_size,
+ buffers_.max_size() - buffers_.size()));
+ if ((!ec && bytes_transferred == 0) || bytes_available_ == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = error::operation_aborted;
+ break;
+ }
+ }
+
+ static_cast<ReadHandler&&>(handler_)(
+ static_cast<const asio::error_code&>(ec),
+ static_cast<const std::size_t&>(total_transferred_));
+ }
+ }
+
+ //private:
+ AsyncReadStream& stream_;
+ DynamicBuffer_v2 buffers_;
+ int start_;
+ std::size_t total_transferred_;
+ std::size_t bytes_available_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncReadStream, typename DynamicBuffer_v2,
+ typename CompletionCondition, typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_dynbuf_v2_op<AsyncReadStream, DynamicBuffer_v2,
+ CompletionCondition, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncReadStream>
+ class initiate_async_read_dynbuf_v2
+ {
+ public:
+ typedef typename AsyncReadStream::executor_type executor_type;
+
+ explicit initiate_async_read_dynbuf_v2(AsyncReadStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename ReadHandler, typename DynamicBuffer_v2,
+ typename CompletionCondition>
+ void operator()(ReadHandler&& handler,
+ DynamicBuffer_v2&& buffers,
+ CompletionCondition&& completion_cond) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
+ read_dynbuf_v2_op<AsyncReadStream, decay_t<DynamicBuffer_v2>,
+ CompletionCondition, decay_t<ReadHandler>>(
+ stream_, static_cast<DynamicBuffer_v2&&>(buffers),
+ completion_cond2.value, handler2.value)(
+ asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncReadStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncReadStream, typename DynamicBuffer_v2,
+ typename CompletionCondition, typename ReadHandler,
+ typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_dynbuf_v2_op<AsyncReadStream,
+ DynamicBuffer_v2, CompletionCondition, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_dynbuf_v2_op<AsyncReadStream, DynamicBuffer_v2,
+ CompletionCondition, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_dynbuf_v2_op<AsyncReadStream,
+ DynamicBuffer_v2, CompletionCondition, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncReadStream, typename DynamicBuffer_v2,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read(AsyncReadStream& s,
+ DynamicBuffer_v2 buffers, ReadToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_dynbuf_v2<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers), transfer_all()))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_dynbuf_v2<AsyncReadStream>(s),
+ token, static_cast<DynamicBuffer_v2&&>(buffers), transfer_all());
+}
+
+template <typename AsyncReadStream,
+ typename DynamicBuffer_v2, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read(AsyncReadStream& s, DynamicBuffer_v2 buffers,
+ CompletionCondition completion_condition, ReadToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_dynbuf_v2<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition)))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_dynbuf_v2<AsyncReadStream>(s),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_READ_HPP
diff --git a/3rdparty/asio/include/asio/impl/read_at.hpp b/3rdparty/asio/include/asio/impl/read_at.hpp
new file mode 100644
index 00000000000..7c668a03f46
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/read_at.hpp
@@ -0,0 +1,628 @@
+//
+// impl/read_at.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <algorithm>
+#include "asio/associator.hpp"
+#include "asio/buffer.hpp"
+#include "asio/detail/array_fwd.hpp"
+#include "asio/detail/base_from_cancellation_state.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_cont_helpers.hpp"
+#include "asio/detail/handler_tracking.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+namespace detail
+{
+ template <typename SyncRandomAccessReadDevice, typename MutableBufferSequence,
+ typename MutableBufferIterator, typename CompletionCondition>
+ 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<mutable_buffer,
+ MutableBufferSequence, MutableBufferIterator> 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 <typename SyncRandomAccessReadDevice, typename MutableBufferSequence,
+ typename CompletionCondition>
+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),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+}
+
+template <typename SyncRandomAccessReadDevice, typename MutableBufferSequence>
+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 <typename SyncRandomAccessReadDevice, typename MutableBufferSequence>
+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 <typename SyncRandomAccessReadDevice, typename MutableBufferSequence,
+ typename CompletionCondition>
+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,
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+ asio::detail::throw_error(ec, "read_at");
+ return bytes_transferred;
+}
+
+#if !defined(ASIO_NO_EXTENSIONS)
+#if !defined(ASIO_NO_IOSTREAM)
+
+template <typename SyncRandomAccessReadDevice, typename Allocator,
+ typename CompletionCondition>
+std::size_t read_at(SyncRandomAccessReadDevice& d,
+ uint64_t offset, asio::basic_streambuf<Allocator>& 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 <typename SyncRandomAccessReadDevice, typename Allocator>
+inline std::size_t read_at(SyncRandomAccessReadDevice& d,
+ uint64_t offset, asio::basic_streambuf<Allocator>& 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 <typename SyncRandomAccessReadDevice, typename Allocator>
+inline std::size_t read_at(SyncRandomAccessReadDevice& d,
+ uint64_t offset, asio::basic_streambuf<Allocator>& b,
+ asio::error_code& ec)
+{
+ return read_at(d, offset, b, transfer_all(), ec);
+}
+
+template <typename SyncRandomAccessReadDevice, typename Allocator,
+ typename CompletionCondition>
+inline std::size_t read_at(SyncRandomAccessReadDevice& d,
+ uint64_t offset, asio::basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read_at(d, offset, b,
+ static_cast<CompletionCondition&&>(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 <typename AsyncRandomAccessReadDevice,
+ typename MutableBufferSequence, typename MutableBufferIterator,
+ typename CompletionCondition, typename ReadHandler>
+ class read_at_op
+ : public base_from_cancellation_state<ReadHandler>,
+ base_from_completion_cond<CompletionCondition>
+ {
+ public:
+ read_at_op(AsyncRandomAccessReadDevice& device,
+ uint64_t offset, const MutableBufferSequence& buffers,
+ CompletionCondition& completion_condition, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ base_from_completion_cond<CompletionCondition>(completion_condition),
+ device_(device),
+ offset_(offset),
+ buffers_(buffers),
+ start_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_at_op(const read_at_op& other)
+ : base_from_cancellation_state<ReadHandler>(other),
+ base_from_completion_cond<CompletionCondition>(other),
+ device_(other.device_),
+ offset_(other.offset_),
+ buffers_(other.buffers_),
+ start_(other.start_),
+ handler_(other.handler_)
+ {
+ }
+
+ read_at_op(read_at_op&& other)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ base_from_completion_cond<CompletionCondition>(
+ static_cast<base_from_completion_cond<CompletionCondition>&&>(other)),
+ device_(other.device_),
+ offset_(other.offset_),
+ buffers_(static_cast<buffers_type&&>(other.buffers_)),
+ start_(other.start_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(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());
+ for (;;)
+ {
+ {
+ ASIO_HANDLER_LOCATION((__FILE__, __LINE__, "async_read_at"));
+ device_.async_read_some_at(
+ offset_ + buffers_.total_consumed(), buffers_.prepare(max_size),
+ static_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());
+ if (max_size == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = asio::error::operation_aborted;
+ break;
+ }
+ }
+
+ static_cast<ReadHandler&&>(handler_)(
+ static_cast<const asio::error_code&>(ec),
+ static_cast<const std::size_t&>(buffers_.total_consumed()));
+ }
+ }
+
+ //private:
+ typedef asio::detail::consuming_buffers<mutable_buffer,
+ MutableBufferSequence, MutableBufferIterator> buffers_type;
+
+ AsyncRandomAccessReadDevice& device_;
+ uint64_t offset_;
+ buffers_type buffers_;
+ int start_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncRandomAccessReadDevice,
+ typename MutableBufferSequence, typename MutableBufferIterator,
+ typename CompletionCondition, typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence,
+ MutableBufferIterator, CompletionCondition, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncRandomAccessReadDevice,
+ typename MutableBufferSequence, typename MutableBufferIterator,
+ typename CompletionCondition, typename ReadHandler>
+ inline void start_read_at_op(AsyncRandomAccessReadDevice& d,
+ uint64_t offset, const MutableBufferSequence& buffers,
+ const MutableBufferIterator&, CompletionCondition& completion_condition,
+ ReadHandler& handler)
+ {
+ detail::read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence,
+ MutableBufferIterator, CompletionCondition, ReadHandler>(
+ d, offset, buffers, completion_condition, handler)(
+ asio::error_code(), 0, 1);
+ }
+
+ template <typename AsyncRandomAccessReadDevice>
+ class initiate_async_read_at
+ {
+ public:
+ typedef typename AsyncRandomAccessReadDevice::executor_type executor_type;
+
+ explicit initiate_async_read_at(AsyncRandomAccessReadDevice& device)
+ : device_(device)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return device_.get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence,
+ typename CompletionCondition>
+ void operator()(ReadHandler&& handler,
+ uint64_t offset, const MutableBufferSequence& buffers,
+ CompletionCondition&& completion_cond) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
+ start_read_at_op(device_, offset, buffers,
+ asio::buffer_sequence_begin(buffers),
+ completion_cond2.value, handler2.value);
+ }
+
+ private:
+ AsyncRandomAccessReadDevice& device_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncRandomAccessReadDevice, typename MutableBufferSequence,
+ typename MutableBufferIterator, typename CompletionCondition,
+ typename ReadHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_at_op<AsyncRandomAccessReadDevice, MutableBufferSequence,
+ MutableBufferIterator, CompletionCondition, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_at_op<AsyncRandomAccessReadDevice,
+ MutableBufferSequence, MutableBufferIterator,
+ CompletionCondition, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_at_op<AsyncRandomAccessReadDevice,
+ MutableBufferSequence, MutableBufferIterator,
+ CompletionCondition, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncRandomAccessReadDevice,
+ typename MutableBufferSequence, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_at(AsyncRandomAccessReadDevice& d,
+ uint64_t offset, const MutableBufferSequence& buffers,
+ CompletionCondition completion_condition, ReadToken&& token)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_at<AsyncRandomAccessReadDevice>>(),
+ token, offset, buffers,
+ static_cast<CompletionCondition&&>(completion_condition)))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_at<AsyncRandomAccessReadDevice>(d),
+ token, offset, buffers,
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+template <typename AsyncRandomAccessReadDevice, typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_at(AsyncRandomAccessReadDevice& d,
+ uint64_t offset, const MutableBufferSequence& buffers, ReadToken&& token)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_at<AsyncRandomAccessReadDevice>>(),
+ token, offset, buffers, transfer_all()))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_at<AsyncRandomAccessReadDevice>(d),
+ token, offset, buffers, transfer_all());
+}
+
+#if !defined(ASIO_NO_EXTENSIONS)
+#if !defined(ASIO_NO_IOSTREAM)
+
+namespace detail
+{
+ template <typename AsyncRandomAccessReadDevice, typename Allocator,
+ typename CompletionCondition, typename ReadHandler>
+ class read_at_streambuf_op
+ : public base_from_cancellation_state<ReadHandler>,
+ base_from_completion_cond<CompletionCondition>
+ {
+ public:
+ read_at_streambuf_op(AsyncRandomAccessReadDevice& device,
+ uint64_t offset, basic_streambuf<Allocator>& streambuf,
+ CompletionCondition& completion_condition, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ base_from_completion_cond<CompletionCondition>(completion_condition),
+ device_(device),
+ offset_(offset),
+ streambuf_(streambuf),
+ start_(0),
+ total_transferred_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_at_streambuf_op(const read_at_streambuf_op& other)
+ : base_from_cancellation_state<ReadHandler>(other),
+ base_from_completion_cond<CompletionCondition>(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)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ base_from_completion_cond<CompletionCondition>(
+ static_cast<base_from_completion_cond<CompletionCondition>&&>(other)),
+ device_(other.device_),
+ offset_(other.offset_),
+ streambuf_(other.streambuf_),
+ start_(other.start_),
+ total_transferred_(other.total_transferred_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(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 (;;)
+ {
+ {
+ ASIO_HANDLER_LOCATION((__FILE__, __LINE__, "async_read_at"));
+ device_.async_read_some_at(offset_ + total_transferred_,
+ streambuf_.prepare(bytes_available),
+ static_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;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = asio::error::operation_aborted;
+ break;
+ }
+ }
+
+ static_cast<ReadHandler&&>(handler_)(
+ static_cast<const asio::error_code&>(ec),
+ static_cast<const std::size_t&>(total_transferred_));
+ }
+ }
+
+ //private:
+ AsyncRandomAccessReadDevice& device_;
+ uint64_t offset_;
+ asio::basic_streambuf<Allocator>& streambuf_;
+ int start_;
+ std::size_t total_transferred_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncRandomAccessReadDevice, typename Allocator,
+ typename CompletionCondition, typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator,
+ CompletionCondition, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncRandomAccessReadDevice>
+ class initiate_async_read_at_streambuf
+ {
+ public:
+ typedef typename AsyncRandomAccessReadDevice::executor_type executor_type;
+
+ explicit initiate_async_read_at_streambuf(
+ AsyncRandomAccessReadDevice& device)
+ : device_(device)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return device_.get_executor();
+ }
+
+ template <typename ReadHandler,
+ typename Allocator, typename CompletionCondition>
+ void operator()(ReadHandler&& handler,
+ uint64_t offset, basic_streambuf<Allocator>* b,
+ CompletionCondition&& completion_cond) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
+ read_at_streambuf_op<AsyncRandomAccessReadDevice, Allocator,
+ CompletionCondition, decay_t<ReadHandler>>(
+ device_, offset, *b, completion_cond2.value, handler2.value)(
+ asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncRandomAccessReadDevice& device_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncRandomAccessReadDevice, typename Executor,
+ typename CompletionCondition, typename ReadHandler,
+ typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_at_streambuf_op<AsyncRandomAccessReadDevice,
+ Executor, CompletionCondition, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_at_streambuf_op<AsyncRandomAccessReadDevice,
+ Executor, CompletionCondition, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_at_streambuf_op<AsyncRandomAccessReadDevice,
+ Executor, CompletionCondition, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncRandomAccessReadDevice,
+ typename Allocator, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_at(AsyncRandomAccessReadDevice& d,
+ uint64_t offset, asio::basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition, ReadToken&& token)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_at_streambuf<
+ AsyncRandomAccessReadDevice>>(),
+ token, offset, &b,
+ static_cast<CompletionCondition&&>(completion_condition)))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_at_streambuf<AsyncRandomAccessReadDevice>(d),
+ token, offset, &b,
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+template <typename AsyncRandomAccessReadDevice, typename Allocator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset,
+ asio::basic_streambuf<Allocator>& b, ReadToken&& token)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_at_streambuf<
+ AsyncRandomAccessReadDevice>>(),
+ token, offset, &b, transfer_all()))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_at_streambuf<AsyncRandomAccessReadDevice>(d),
+ token, offset, &b, transfer_all());
+}
+
+#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/3rdparty/asio/include/asio/impl/read_until.hpp b/3rdparty/asio/include/asio/impl/read_until.hpp
new file mode 100644
index 00000000000..7592263723f
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/read_until.hpp
@@ -0,0 +1,2941 @@
+//
+// impl/read_until.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <algorithm>
+#include <string>
+#include <vector>
+#include <utility>
+#include "asio/associator.hpp"
+#include "asio/buffer.hpp"
+#include "asio/buffers_iterator.hpp"
+#include "asio/detail/base_from_cancellation_state.hpp"
+#include "asio/detail/bind_handler.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/handler_tracking.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/limits.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+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 <typename Iterator1, typename Iterator2>
+ std::pair<Iterator1, bool> 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
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+template <typename SyncReadStream, typename DynamicBuffer_v1>
+inline std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers, char delim,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read_until(s,
+ static_cast<DynamicBuffer_v1&&>(buffers), delim, ec);
+ asio::detail::throw_error(ec, "read_until");
+ return bytes_transferred;
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v1>
+std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ char delim, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ decay_t<DynamicBuffer_v1> b(
+ static_cast<DynamicBuffer_v1&&>(buffers));
+
+ std::size_t search_position = 0;
+ for (;;)
+ {
+ // Determine the range of the data to be searched.
+ typedef typename DynamicBuffer_v1::const_buffers_type buffers_type;
+ typedef buffers_iterator<buffers_type> 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::size_t>(
+ std::max<std::size_t>(512, b.capacity() - b.size()),
+ std::min<std::size_t>(65536, b.max_size() - b.size()));
+ b.commit(s.read_some(b.prepare(bytes_to_read), ec));
+ if (ec)
+ return 0;
+ }
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v1>
+inline std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ ASIO_STRING_VIEW_PARAM delim,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read_until(s,
+ static_cast<DynamicBuffer_v1&&>(buffers), delim, ec);
+ asio::detail::throw_error(ec, "read_until");
+ return bytes_transferred;
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v1>
+std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ decay_t<DynamicBuffer_v1> b(
+ static_cast<DynamicBuffer_v1&&>(buffers));
+
+ std::size_t search_position = 0;
+ for (;;)
+ {
+ // Determine the range of the data to be searched.
+ typedef typename DynamicBuffer_v1::const_buffers_type buffers_type;
+ typedef buffers_iterator<buffers_type> 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<iterator, bool> 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::size_t>(
+ std::max<std::size_t>(512, b.capacity() - b.size()),
+ std::min<std::size_t>(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)
+
+namespace detail {
+
+struct regex_match_flags
+{
+ template <typename T>
+ operator T() const
+ {
+ return T::match_default | T::match_partial;
+ }
+};
+
+} // namespace detail
+
+template <typename SyncReadStream, typename DynamicBuffer_v1, typename Traits>
+inline std::size_t read_until(SyncReadStream& s, DynamicBuffer_v1&& buffers,
+ const boost::basic_regex<char, Traits>& expr,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read_until(s,
+ static_cast<DynamicBuffer_v1&&>(buffers), expr, ec);
+ asio::detail::throw_error(ec, "read_until");
+ return bytes_transferred;
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v1, typename Traits>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v1&& buffers,
+ const boost::basic_regex<char, Traits>& expr, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ decay_t<DynamicBuffer_v1> b(
+ static_cast<DynamicBuffer_v1&&>(buffers));
+
+ std::size_t search_position = 0;
+ for (;;)
+ {
+ // Determine the range of the data to be searched.
+ typedef typename DynamicBuffer_v1::const_buffers_type buffers_type;
+ typedef buffers_iterator<buffers_type> 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<iterator,
+ typename std::vector<boost::sub_match<iterator>>::allocator_type>
+ match_results;
+ if (regex_search(start_pos, end, match_results,
+ expr, detail::regex_match_flags()))
+ {
+ 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 = std::min<std::size_t>(
+ std::max<std::size_t>(512, b.capacity() - b.size()),
+ std::min<std::size_t>(65536, b.max_size() - b.size()));
+ b.commit(s.read_some(b.prepare(bytes_to_read), ec));
+ if (ec)
+ return 0;
+ }
+}
+
+#endif // defined(ASIO_HAS_BOOST_REGEX)
+
+template <typename SyncReadStream,
+ typename DynamicBuffer_v1, typename MatchCondition>
+inline std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ MatchCondition match_condition,
+ constraint_t<
+ is_match_condition<MatchCondition>::value
+ >,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read_until(s,
+ static_cast<DynamicBuffer_v1&&>(buffers),
+ match_condition, ec);
+ asio::detail::throw_error(ec, "read_until");
+ return bytes_transferred;
+}
+
+template <typename SyncReadStream,
+ typename DynamicBuffer_v1, typename MatchCondition>
+std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ MatchCondition match_condition, asio::error_code& ec,
+ constraint_t<
+ is_match_condition<MatchCondition>::value
+ >,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ decay_t<DynamicBuffer_v1> b(
+ static_cast<DynamicBuffer_v1&&>(buffers));
+
+ std::size_t search_position = 0;
+ for (;;)
+ {
+ // Determine the range of the data to be searched.
+ typedef typename DynamicBuffer_v1::const_buffers_type buffers_type;
+ typedef buffers_iterator<buffers_type> 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<iterator, bool> 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::size_t>(
+ std::max<std::size_t>(512, b.capacity() - b.size()),
+ std::min<std::size_t>(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 <typename SyncReadStream, typename Allocator>
+inline std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b, char delim)
+{
+ return read_until(s, basic_streambuf_ref<Allocator>(b), delim);
+}
+
+template <typename SyncReadStream, typename Allocator>
+inline std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b, char delim,
+ asio::error_code& ec)
+{
+ return read_until(s, basic_streambuf_ref<Allocator>(b), delim, ec);
+}
+
+template <typename SyncReadStream, typename Allocator>
+inline std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ ASIO_STRING_VIEW_PARAM delim)
+{
+ return read_until(s, basic_streambuf_ref<Allocator>(b), delim);
+}
+
+template <typename SyncReadStream, typename Allocator>
+inline std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec)
+{
+ return read_until(s, basic_streambuf_ref<Allocator>(b), delim, ec);
+}
+
+#if defined(ASIO_HAS_BOOST_REGEX)
+
+template <typename SyncReadStream, typename Allocator, typename Traits>
+inline std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ const boost::basic_regex<char, Traits>& expr)
+{
+ return read_until(s, basic_streambuf_ref<Allocator>(b), expr);
+}
+
+template <typename SyncReadStream, typename Allocator, typename Traits>
+inline std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ const boost::basic_regex<char, Traits>& expr,
+ asio::error_code& ec)
+{
+ return read_until(s, basic_streambuf_ref<Allocator>(b), expr, ec);
+}
+
+#endif // defined(ASIO_HAS_BOOST_REGEX)
+
+template <typename SyncReadStream, typename Allocator, typename MatchCondition>
+inline std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b, MatchCondition match_condition,
+ constraint_t<is_match_condition<MatchCondition>::value>)
+{
+ return read_until(s, basic_streambuf_ref<Allocator>(b), match_condition);
+}
+
+template <typename SyncReadStream, typename Allocator, typename MatchCondition>
+inline std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ MatchCondition match_condition, asio::error_code& ec,
+ constraint_t<is_match_condition<MatchCondition>::value>)
+{
+ return read_until(s, basic_streambuf_ref<Allocator>(b), match_condition, ec);
+}
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+#endif // !defined(ASIO_NO_EXTENSIONS)
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+template <typename SyncReadStream, typename DynamicBuffer_v2>
+inline std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v2 buffers, char delim,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read_until(s,
+ static_cast<DynamicBuffer_v2&&>(buffers), delim, ec);
+ asio::detail::throw_error(ec, "read_until");
+ return bytes_transferred;
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v2>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ char delim, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ DynamicBuffer_v2& b = buffers;
+
+ std::size_t search_position = 0;
+ for (;;)
+ {
+ // Determine the range of the data to be searched.
+ typedef typename DynamicBuffer_v2::const_buffers_type buffers_type;
+ typedef buffers_iterator<buffers_type> iterator;
+ buffers_type data_buffers =
+ const_cast<const DynamicBuffer_v2&>(b).data(0, b.size());
+ 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::size_t>(
+ std::max<std::size_t>(512, b.capacity() - b.size()),
+ std::min<std::size_t>(65536, b.max_size() - b.size()));
+ std::size_t pos = b.size();
+ b.grow(bytes_to_read);
+ std::size_t bytes_transferred = s.read_some(b.data(pos, bytes_to_read), ec);
+ b.shrink(bytes_to_read - bytes_transferred);
+ if (ec)
+ return 0;
+ }
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v2>
+inline std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v2 buffers, ASIO_STRING_VIEW_PARAM delim,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read_until(s,
+ static_cast<DynamicBuffer_v2&&>(buffers), delim, ec);
+ asio::detail::throw_error(ec, "read_until");
+ return bytes_transferred;
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v2>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ DynamicBuffer_v2& b = buffers;
+
+ std::size_t search_position = 0;
+ for (;;)
+ {
+ // Determine the range of the data to be searched.
+ typedef typename DynamicBuffer_v2::const_buffers_type buffers_type;
+ typedef buffers_iterator<buffers_type> iterator;
+ buffers_type data_buffers =
+ const_cast<const DynamicBuffer_v2&>(b).data(0, b.size());
+ iterator begin = iterator::begin(data_buffers);
+ iterator start_pos = begin + search_position;
+ iterator end = iterator::end(data_buffers);
+
+ // Look for a match.
+ std::pair<iterator, bool> 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::size_t>(
+ std::max<std::size_t>(512, b.capacity() - b.size()),
+ std::min<std::size_t>(65536, b.max_size() - b.size()));
+ std::size_t pos = b.size();
+ b.grow(bytes_to_read);
+ std::size_t bytes_transferred = s.read_some(b.data(pos, bytes_to_read), ec);
+ b.shrink(bytes_to_read - bytes_transferred);
+ if (ec)
+ return 0;
+ }
+}
+
+#if !defined(ASIO_NO_EXTENSIONS)
+#if defined(ASIO_HAS_BOOST_REGEX)
+
+template <typename SyncReadStream, typename DynamicBuffer_v2, typename Traits>
+inline std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ const boost::basic_regex<char, Traits>& expr,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read_until(s,
+ static_cast<DynamicBuffer_v2&&>(buffers), expr, ec);
+ asio::detail::throw_error(ec, "read_until");
+ return bytes_transferred;
+}
+
+template <typename SyncReadStream, typename DynamicBuffer_v2, typename Traits>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ const boost::basic_regex<char, Traits>& expr, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ DynamicBuffer_v2& b = buffers;
+
+ std::size_t search_position = 0;
+ for (;;)
+ {
+ // Determine the range of the data to be searched.
+ typedef typename DynamicBuffer_v2::const_buffers_type buffers_type;
+ typedef buffers_iterator<buffers_type> iterator;
+ buffers_type data_buffers =
+ const_cast<const DynamicBuffer_v2&>(b).data(0, b.size());
+ 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<iterator,
+ typename std::vector<boost::sub_match<iterator>>::allocator_type>
+ match_results;
+ if (regex_search(start_pos, end, match_results,
+ expr, detail::regex_match_flags()))
+ {
+ 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 = std::min<std::size_t>(
+ std::max<std::size_t>(512, b.capacity() - b.size()),
+ std::min<std::size_t>(65536, b.max_size() - b.size()));
+ std::size_t pos = b.size();
+ b.grow(bytes_to_read);
+ std::size_t bytes_transferred = s.read_some(b.data(pos, bytes_to_read), ec);
+ b.shrink(bytes_to_read - bytes_transferred);
+ if (ec)
+ return 0;
+ }
+}
+
+#endif // defined(ASIO_HAS_BOOST_REGEX)
+
+template <typename SyncReadStream,
+ typename DynamicBuffer_v2, typename MatchCondition>
+inline std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v2 buffers, MatchCondition match_condition,
+ constraint_t<
+ is_match_condition<MatchCondition>::value
+ >,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = read_until(s,
+ static_cast<DynamicBuffer_v2&&>(buffers),
+ match_condition, ec);
+ asio::detail::throw_error(ec, "read_until");
+ return bytes_transferred;
+}
+
+template <typename SyncReadStream,
+ typename DynamicBuffer_v2, typename MatchCondition>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ MatchCondition match_condition, asio::error_code& ec,
+ constraint_t<
+ is_match_condition<MatchCondition>::value
+ >,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ DynamicBuffer_v2& b = buffers;
+
+ std::size_t search_position = 0;
+ for (;;)
+ {
+ // Determine the range of the data to be searched.
+ typedef typename DynamicBuffer_v2::const_buffers_type buffers_type;
+ typedef buffers_iterator<buffers_type> iterator;
+ buffers_type data_buffers =
+ const_cast<const DynamicBuffer_v2&>(b).data(0, b.size());
+ iterator begin = iterator::begin(data_buffers);
+ iterator start_pos = begin + search_position;
+ iterator end = iterator::end(data_buffers);
+
+ // Look for a match.
+ std::pair<iterator, bool> 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::size_t>(
+ std::max<std::size_t>(512, b.capacity() - b.size()),
+ std::min<std::size_t>(65536, b.max_size() - b.size()));
+ std::size_t pos = b.size();
+ b.grow(bytes_to_read);
+ std::size_t bytes_transferred = s.read_some(b.data(pos, bytes_to_read), ec);
+ b.shrink(bytes_to_read - bytes_transferred);
+ if (ec)
+ return 0;
+ }
+}
+
+#endif // !defined(ASIO_NO_EXTENSIONS)
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+namespace detail
+{
+ template <typename AsyncReadStream,
+ typename DynamicBuffer_v1, typename ReadHandler>
+ class read_until_delim_op_v1
+ : public base_from_cancellation_state<ReadHandler>
+ {
+ public:
+ template <typename BufferSequence>
+ read_until_delim_op_v1(AsyncReadStream& stream,
+ BufferSequence&& buffers,
+ char delim, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ stream_(stream),
+ buffers_(static_cast<BufferSequence&&>(buffers)),
+ delim_(delim),
+ start_(0),
+ search_position_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_until_delim_op_v1(const read_until_delim_op_v1& other)
+ : base_from_cancellation_state<ReadHandler>(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_v1(read_until_delim_op_v1&& other)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ stream_(other.stream_),
+ buffers_(static_cast<DynamicBuffer_v1&&>(other.buffers_)),
+ delim_(other.delim_),
+ start_(other.start_),
+ search_position_(other.search_position_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(asio::error_code ec,
+ std::size_t bytes_transferred, int start = 0)
+ {
+ const std::size_t not_found = (std::numeric_limits<std::size_t>::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_v1::const_buffers_type
+ buffers_type;
+ typedef buffers_iterator<buffers_type> 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::size_t>(
+ std::max<std::size_t>(512,
+ buffers_.capacity() - buffers_.size()),
+ std::min<std::size_t>(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.
+ {
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, "async_read_until"));
+ stream_.async_read_some(buffers_.prepare(bytes_to_read),
+ static_cast<read_until_delim_op_v1&&>(*this));
+ }
+ return; default:
+ buffers_.commit(bytes_transferred);
+ if (ec || bytes_transferred == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = error::operation_aborted;
+ 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_;
+
+ static_cast<ReadHandler&&>(handler_)(result_ec, result_n);
+ }
+ }
+
+ //private:
+ AsyncReadStream& stream_;
+ DynamicBuffer_v1 buffers_;
+ char delim_;
+ int start_;
+ std::size_t search_position_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncReadStream,
+ typename DynamicBuffer_v1, typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_until_delim_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncReadStream>
+ class initiate_async_read_until_delim_v1
+ {
+ public:
+ typedef typename AsyncReadStream::executor_type executor_type;
+
+ explicit initiate_async_read_until_delim_v1(AsyncReadStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename ReadHandler, typename DynamicBuffer_v1>
+ void operator()(ReadHandler&& handler,
+ DynamicBuffer_v1&& buffers,
+ char delim) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ read_until_delim_op_v1<AsyncReadStream,
+ decay_t<DynamicBuffer_v1>,
+ decay_t<ReadHandler>>(
+ stream_, static_cast<DynamicBuffer_v1&&>(buffers),
+ delim, handler2.value)(asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncReadStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncReadStream, typename DynamicBuffer_v1,
+ typename ReadHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_until_delim_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_until_delim_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_until_delim_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncReadStream, typename DynamicBuffer_v1,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_until(AsyncReadStream& s,
+ DynamicBuffer_v1&& buffers, char delim, ReadToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_delim_v1<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers), delim))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_until_delim_v1<AsyncReadStream>(s),
+ token, static_cast<DynamicBuffer_v1&&>(buffers), delim);
+}
+
+namespace detail
+{
+ template <typename AsyncReadStream,
+ typename DynamicBuffer_v1, typename ReadHandler>
+ class read_until_delim_string_op_v1
+ : public base_from_cancellation_state<ReadHandler>
+ {
+ public:
+ template <typename BufferSequence>
+ read_until_delim_string_op_v1(AsyncReadStream& stream,
+ BufferSequence&& buffers,
+ const std::string& delim, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ stream_(stream),
+ buffers_(static_cast<BufferSequence&&>(buffers)),
+ delim_(delim),
+ start_(0),
+ search_position_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_until_delim_string_op_v1(const read_until_delim_string_op_v1& other)
+ : base_from_cancellation_state<ReadHandler>(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_v1(read_until_delim_string_op_v1&& other)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ stream_(other.stream_),
+ buffers_(static_cast<DynamicBuffer_v1&&>(other.buffers_)),
+ delim_(static_cast<std::string&&>(other.delim_)),
+ start_(other.start_),
+ search_position_(other.search_position_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(asio::error_code ec,
+ std::size_t bytes_transferred, int start = 0)
+ {
+ const std::size_t not_found = (std::numeric_limits<std::size_t>::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_v1::const_buffers_type
+ buffers_type;
+ typedef buffers_iterator<buffers_type> 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<iterator, bool> 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::size_t>(
+ std::max<std::size_t>(512,
+ buffers_.capacity() - buffers_.size()),
+ std::min<std::size_t>(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.
+ {
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, "async_read_until"));
+ stream_.async_read_some(buffers_.prepare(bytes_to_read),
+ static_cast<read_until_delim_string_op_v1&&>(*this));
+ }
+ return; default:
+ buffers_.commit(bytes_transferred);
+ if (ec || bytes_transferred == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = error::operation_aborted;
+ 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_;
+
+ static_cast<ReadHandler&&>(handler_)(result_ec, result_n);
+ }
+ }
+
+ //private:
+ AsyncReadStream& stream_;
+ DynamicBuffer_v1 buffers_;
+ std::string delim_;
+ int start_;
+ std::size_t search_position_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncReadStream,
+ typename DynamicBuffer_v1, typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_until_delim_string_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncReadStream>
+ class initiate_async_read_until_delim_string_v1
+ {
+ public:
+ typedef typename AsyncReadStream::executor_type executor_type;
+
+ explicit initiate_async_read_until_delim_string_v1(AsyncReadStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename ReadHandler, typename DynamicBuffer_v1>
+ void operator()(ReadHandler&& handler,
+ DynamicBuffer_v1&& buffers,
+ const std::string& delim) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ read_until_delim_string_op_v1<AsyncReadStream,
+ decay_t<DynamicBuffer_v1>,
+ decay_t<ReadHandler>>(
+ stream_, static_cast<DynamicBuffer_v1&&>(buffers),
+ delim, handler2.value)(asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncReadStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncReadStream, typename DynamicBuffer_v1,
+ typename ReadHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_until_delim_string_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_until_delim_string_op_v1<
+ AsyncReadStream, DynamicBuffer_v1, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_until_delim_string_op_v1<
+ AsyncReadStream, DynamicBuffer_v1, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncReadStream, typename DynamicBuffer_v1,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_until(AsyncReadStream& s, DynamicBuffer_v1&& buffers,
+ ASIO_STRING_VIEW_PARAM delim, ReadToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_delim_string_v1<
+ AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ static_cast<std::string>(delim)))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_until_delim_string_v1<AsyncReadStream>(s),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ static_cast<std::string>(delim));
+}
+
+#if !defined(ASIO_NO_EXTENSIONS)
+#if defined(ASIO_HAS_BOOST_REGEX)
+
+namespace detail
+{
+ template <typename AsyncReadStream, typename DynamicBuffer_v1,
+ typename RegEx, typename ReadHandler>
+ class read_until_expr_op_v1
+ : public base_from_cancellation_state<ReadHandler>
+ {
+ public:
+ template <typename BufferSequence, typename Traits>
+ read_until_expr_op_v1(AsyncReadStream& stream, BufferSequence&& buffers,
+ const boost::basic_regex<char, Traits>& expr, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ stream_(stream),
+ buffers_(static_cast<BufferSequence&&>(buffers)),
+ expr_(expr),
+ start_(0),
+ search_position_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_until_expr_op_v1(const read_until_expr_op_v1& other)
+ : base_from_cancellation_state<ReadHandler>(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_v1(read_until_expr_op_v1&& other)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ stream_(other.stream_),
+ buffers_(static_cast<DynamicBuffer_v1&&>(other.buffers_)),
+ expr_(other.expr_),
+ start_(other.start_),
+ search_position_(other.search_position_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(asio::error_code ec,
+ std::size_t bytes_transferred, int start = 0)
+ {
+ const std::size_t not_found = (std::numeric_limits<std::size_t>::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_v1::const_buffers_type
+ buffers_type;
+ typedef buffers_iterator<buffers_type> 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<iterator,
+ typename std::vector<boost::sub_match<iterator>>::allocator_type>
+ match_results;
+ bool match = regex_search(start_pos, end,
+ match_results, expr_, regex_match_flags());
+ 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::size_t>(
+ std::max<std::size_t>(512,
+ buffers_.capacity() - buffers_.size()),
+ std::min<std::size_t>(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.
+ {
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, "async_read_until"));
+ stream_.async_read_some(buffers_.prepare(bytes_to_read),
+ static_cast<read_until_expr_op_v1&&>(*this));
+ }
+ return; default:
+ buffers_.commit(bytes_transferred);
+ if (ec || bytes_transferred == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = error::operation_aborted;
+ 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_;
+
+ static_cast<ReadHandler&&>(handler_)(result_ec, result_n);
+ }
+ }
+
+ //private:
+ AsyncReadStream& stream_;
+ DynamicBuffer_v1 buffers_;
+ RegEx expr_;
+ int start_;
+ std::size_t search_position_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncReadStream, typename DynamicBuffer_v1,
+ typename RegEx, typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_until_expr_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, RegEx, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncReadStream>
+ class initiate_async_read_until_expr_v1
+ {
+ public:
+ typedef typename AsyncReadStream::executor_type executor_type;
+
+ explicit initiate_async_read_until_expr_v1(AsyncReadStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename ReadHandler, typename DynamicBuffer_v1, typename RegEx>
+ void operator()(ReadHandler&& handler,
+ DynamicBuffer_v1&& buffers, const RegEx& expr) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ read_until_expr_op_v1<AsyncReadStream,
+ decay_t<DynamicBuffer_v1>,
+ RegEx, decay_t<ReadHandler>>(
+ stream_, static_cast<DynamicBuffer_v1&&>(buffers),
+ expr, handler2.value)(asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncReadStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncReadStream, typename DynamicBuffer_v1,
+ typename RegEx, typename ReadHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_until_expr_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, RegEx, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_until_expr_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, RegEx, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_until_expr_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, RegEx, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncReadStream, typename DynamicBuffer_v1, typename Traits,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_until(AsyncReadStream& s, DynamicBuffer_v1&& buffers,
+ const boost::basic_regex<char, Traits>& expr, ReadToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_expr_v1<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers), expr))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_until_expr_v1<AsyncReadStream>(s),
+ token, static_cast<DynamicBuffer_v1&&>(buffers), expr);
+}
+
+#endif // defined(ASIO_HAS_BOOST_REGEX)
+
+namespace detail
+{
+ template <typename AsyncReadStream, typename DynamicBuffer_v1,
+ typename MatchCondition, typename ReadHandler>
+ class read_until_match_op_v1
+ : public base_from_cancellation_state<ReadHandler>
+ {
+ public:
+ template <typename BufferSequence>
+ read_until_match_op_v1(AsyncReadStream& stream,
+ BufferSequence&& buffers,
+ MatchCondition match_condition, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ stream_(stream),
+ buffers_(static_cast<BufferSequence&&>(buffers)),
+ match_condition_(match_condition),
+ start_(0),
+ search_position_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_until_match_op_v1(const read_until_match_op_v1& other)
+ : base_from_cancellation_state<ReadHandler>(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_v1(read_until_match_op_v1&& other)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ stream_(other.stream_),
+ buffers_(static_cast<DynamicBuffer_v1&&>(other.buffers_)),
+ match_condition_(other.match_condition_),
+ start_(other.start_),
+ search_position_(other.search_position_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(asio::error_code ec,
+ std::size_t bytes_transferred, int start = 0)
+ {
+ const std::size_t not_found = (std::numeric_limits<std::size_t>::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_v1::const_buffers_type
+ buffers_type;
+ typedef buffers_iterator<buffers_type> 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<iterator, bool> 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::size_t>(
+ std::max<std::size_t>(512,
+ buffers_.capacity() - buffers_.size()),
+ std::min<std::size_t>(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.
+ {
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, "async_read_until"));
+ stream_.async_read_some(buffers_.prepare(bytes_to_read),
+ static_cast<read_until_match_op_v1&&>(*this));
+ }
+ return; default:
+ buffers_.commit(bytes_transferred);
+ if (ec || bytes_transferred == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = error::operation_aborted;
+ 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_;
+
+ static_cast<ReadHandler&&>(handler_)(result_ec, result_n);
+ }
+ }
+
+ //private:
+ AsyncReadStream& stream_;
+ DynamicBuffer_v1 buffers_;
+ MatchCondition match_condition_;
+ int start_;
+ std::size_t search_position_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncReadStream, typename DynamicBuffer_v1,
+ typename MatchCondition, typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_until_match_op_v1<AsyncReadStream, DynamicBuffer_v1,
+ MatchCondition, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncReadStream>
+ class initiate_async_read_until_match_v1
+ {
+ public:
+ typedef typename AsyncReadStream::executor_type executor_type;
+
+ explicit initiate_async_read_until_match_v1(AsyncReadStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename ReadHandler,
+ typename DynamicBuffer_v1, typename MatchCondition>
+ void operator()(ReadHandler&& handler,
+ DynamicBuffer_v1&& buffers,
+ MatchCondition match_condition) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ read_until_match_op_v1<AsyncReadStream,
+ decay_t<DynamicBuffer_v1>,
+ MatchCondition, decay_t<ReadHandler>>(
+ stream_, static_cast<DynamicBuffer_v1&&>(buffers),
+ match_condition, handler2.value)(asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncReadStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncReadStream, typename DynamicBuffer_v1,
+ typename MatchCondition, typename ReadHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_until_match_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, MatchCondition, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_until_match_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, MatchCondition, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_until_match_op_v1<AsyncReadStream,
+ DynamicBuffer_v1, MatchCondition, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncReadStream,
+ typename DynamicBuffer_v1, typename MatchCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_until(AsyncReadStream& s, DynamicBuffer_v1&& buffers,
+ MatchCondition match_condition, ReadToken&& token,
+ constraint_t<
+ is_match_condition<MatchCondition>::value
+ >,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_match_v1<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ match_condition))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_until_match_v1<AsyncReadStream>(s),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ match_condition);
+}
+
+#if !defined(ASIO_NO_IOSTREAM)
+
+template <typename AsyncReadStream, typename Allocator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_until(AsyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b, char delim, ReadToken&& token)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_delim_v1<AsyncReadStream>>(),
+ token, basic_streambuf_ref<Allocator>(b), delim))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_until_delim_v1<AsyncReadStream>(s),
+ token, basic_streambuf_ref<Allocator>(b), delim);
+}
+
+template <typename AsyncReadStream, typename Allocator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_until(AsyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ ASIO_STRING_VIEW_PARAM delim, ReadToken&& token)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_delim_string_v1<
+ AsyncReadStream>>(),
+ token, basic_streambuf_ref<Allocator>(b),
+ static_cast<std::string>(delim)))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_until_delim_string_v1<AsyncReadStream>(s),
+ token, basic_streambuf_ref<Allocator>(b),
+ static_cast<std::string>(delim));
+}
+
+#if defined(ASIO_HAS_BOOST_REGEX)
+
+template <typename AsyncReadStream, typename Allocator, typename Traits,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_until(AsyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ const boost::basic_regex<char, Traits>& expr, ReadToken&& token)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_expr_v1<AsyncReadStream>>(),
+ token, basic_streambuf_ref<Allocator>(b), expr))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_until_expr_v1<AsyncReadStream>(s),
+ token, basic_streambuf_ref<Allocator>(b), expr);
+}
+
+#endif // defined(ASIO_HAS_BOOST_REGEX)
+
+template <typename AsyncReadStream, typename Allocator, typename MatchCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_until(AsyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ MatchCondition match_condition, ReadToken&& token,
+ constraint_t<is_match_condition<MatchCondition>::value>)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_match_v1<AsyncReadStream>>(),
+ token, basic_streambuf_ref<Allocator>(b), match_condition))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_until_match_v1<AsyncReadStream>(s),
+ token, basic_streambuf_ref<Allocator>(b), match_condition);
+}
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+#endif // !defined(ASIO_NO_EXTENSIONS)
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+namespace detail
+{
+ template <typename AsyncReadStream,
+ typename DynamicBuffer_v2, typename ReadHandler>
+ class read_until_delim_op_v2
+ : public base_from_cancellation_state<ReadHandler>
+ {
+ public:
+ template <typename BufferSequence>
+ read_until_delim_op_v2(AsyncReadStream& stream,
+ BufferSequence&& buffers,
+ char delim, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ stream_(stream),
+ buffers_(static_cast<BufferSequence&&>(buffers)),
+ delim_(delim),
+ start_(0),
+ search_position_(0),
+ bytes_to_read_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_until_delim_op_v2(const read_until_delim_op_v2& other)
+ : base_from_cancellation_state<ReadHandler>(other),
+ stream_(other.stream_),
+ buffers_(other.buffers_),
+ delim_(other.delim_),
+ start_(other.start_),
+ search_position_(other.search_position_),
+ bytes_to_read_(other.bytes_to_read_),
+ handler_(other.handler_)
+ {
+ }
+
+ read_until_delim_op_v2(read_until_delim_op_v2&& other)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ stream_(other.stream_),
+ buffers_(static_cast<DynamicBuffer_v2&&>(other.buffers_)),
+ delim_(other.delim_),
+ start_(other.start_),
+ search_position_(other.search_position_),
+ bytes_to_read_(other.bytes_to_read_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(asio::error_code ec,
+ std::size_t bytes_transferred, int start = 0)
+ {
+ const std::size_t not_found = (std::numeric_limits<std::size_t>::max)();
+ std::size_t pos;
+ switch (start_ = start)
+ {
+ case 1:
+ for (;;)
+ {
+ {
+ // Determine the range of the data to be searched.
+ typedef typename DynamicBuffer_v2::const_buffers_type
+ buffers_type;
+ typedef buffers_iterator<buffers_type> iterator;
+ buffers_type data_buffers =
+ const_cast<const DynamicBuffer_v2&>(buffers_).data(
+ 0, buffers_.size());
+ 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::size_t>(
+ std::max<std::size_t>(512,
+ buffers_.capacity() - buffers_.size()),
+ std::min<std::size_t>(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.
+ pos = buffers_.size();
+ buffers_.grow(bytes_to_read_);
+ {
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, "async_read_until"));
+ stream_.async_read_some(buffers_.data(pos, bytes_to_read_),
+ static_cast<read_until_delim_op_v2&&>(*this));
+ }
+ return; default:
+ buffers_.shrink(bytes_to_read_ - bytes_transferred);
+ if (ec || bytes_transferred == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = error::operation_aborted;
+ 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_;
+
+ static_cast<ReadHandler&&>(handler_)(result_ec, result_n);
+ }
+ }
+
+ //private:
+ AsyncReadStream& stream_;
+ DynamicBuffer_v2 buffers_;
+ char delim_;
+ int start_;
+ std::size_t search_position_;
+ std::size_t bytes_to_read_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncReadStream,
+ typename DynamicBuffer_v2, typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_until_delim_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncReadStream>
+ class initiate_async_read_until_delim_v2
+ {
+ public:
+ typedef typename AsyncReadStream::executor_type executor_type;
+
+ explicit initiate_async_read_until_delim_v2(AsyncReadStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename ReadHandler, typename DynamicBuffer_v2>
+ void operator()(ReadHandler&& handler,
+ DynamicBuffer_v2&& buffers, char delim) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ read_until_delim_op_v2<AsyncReadStream,
+ decay_t<DynamicBuffer_v2>,
+ decay_t<ReadHandler>>(
+ stream_, static_cast<DynamicBuffer_v2&&>(buffers),
+ delim, handler2.value)(asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncReadStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncReadStream, typename DynamicBuffer_v2,
+ typename ReadHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_until_delim_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_until_delim_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_until_delim_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncReadStream, typename DynamicBuffer_v2,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_until(AsyncReadStream& s,
+ DynamicBuffer_v2 buffers, char delim, ReadToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_delim_v2<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers), delim))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_until_delim_v2<AsyncReadStream>(s),
+ token, static_cast<DynamicBuffer_v2&&>(buffers), delim);
+}
+
+namespace detail
+{
+ template <typename AsyncReadStream,
+ typename DynamicBuffer_v2, typename ReadHandler>
+ class read_until_delim_string_op_v2
+ : public base_from_cancellation_state<ReadHandler>
+ {
+ public:
+ template <typename BufferSequence>
+ read_until_delim_string_op_v2(AsyncReadStream& stream,
+ BufferSequence&& buffers,
+ const std::string& delim, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ stream_(stream),
+ buffers_(static_cast<BufferSequence&&>(buffers)),
+ delim_(delim),
+ start_(0),
+ search_position_(0),
+ bytes_to_read_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_until_delim_string_op_v2(const read_until_delim_string_op_v2& other)
+ : base_from_cancellation_state<ReadHandler>(other),
+ stream_(other.stream_),
+ buffers_(other.buffers_),
+ delim_(other.delim_),
+ start_(other.start_),
+ search_position_(other.search_position_),
+ bytes_to_read_(other.bytes_to_read_),
+ handler_(other.handler_)
+ {
+ }
+
+ read_until_delim_string_op_v2(read_until_delim_string_op_v2&& other)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ stream_(other.stream_),
+ buffers_(static_cast<DynamicBuffer_v2&&>(other.buffers_)),
+ delim_(static_cast<std::string&&>(other.delim_)),
+ start_(other.start_),
+ search_position_(other.search_position_),
+ bytes_to_read_(other.bytes_to_read_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(asio::error_code ec,
+ std::size_t bytes_transferred, int start = 0)
+ {
+ const std::size_t not_found = (std::numeric_limits<std::size_t>::max)();
+ std::size_t pos;
+ switch (start_ = start)
+ {
+ case 1:
+ for (;;)
+ {
+ {
+ // Determine the range of the data to be searched.
+ typedef typename DynamicBuffer_v2::const_buffers_type
+ buffers_type;
+ typedef buffers_iterator<buffers_type> iterator;
+ buffers_type data_buffers =
+ const_cast<const DynamicBuffer_v2&>(buffers_).data(
+ 0, buffers_.size());
+ iterator begin = iterator::begin(data_buffers);
+ iterator start_pos = begin + search_position_;
+ iterator end = iterator::end(data_buffers);
+
+ // Look for a match.
+ std::pair<iterator, bool> 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::size_t>(
+ std::max<std::size_t>(512,
+ buffers_.capacity() - buffers_.size()),
+ std::min<std::size_t>(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.
+ pos = buffers_.size();
+ buffers_.grow(bytes_to_read_);
+ {
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, "async_read_until"));
+ stream_.async_read_some(buffers_.data(pos, bytes_to_read_),
+ static_cast<read_until_delim_string_op_v2&&>(*this));
+ }
+ return; default:
+ buffers_.shrink(bytes_to_read_ - bytes_transferred);
+ if (ec || bytes_transferred == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = error::operation_aborted;
+ 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_;
+
+ static_cast<ReadHandler&&>(handler_)(result_ec, result_n);
+ }
+ }
+
+ //private:
+ AsyncReadStream& stream_;
+ DynamicBuffer_v2 buffers_;
+ std::string delim_;
+ int start_;
+ std::size_t search_position_;
+ std::size_t bytes_to_read_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncReadStream,
+ typename DynamicBuffer_v2, typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_until_delim_string_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncReadStream>
+ class initiate_async_read_until_delim_string_v2
+ {
+ public:
+ typedef typename AsyncReadStream::executor_type executor_type;
+
+ explicit initiate_async_read_until_delim_string_v2(AsyncReadStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename ReadHandler, typename DynamicBuffer_v2>
+ void operator()(ReadHandler&& handler,
+ DynamicBuffer_v2&& buffers,
+ const std::string& delim) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ read_until_delim_string_op_v2<AsyncReadStream,
+ decay_t<DynamicBuffer_v2>,
+ decay_t<ReadHandler>>(
+ stream_, static_cast<DynamicBuffer_v2&&>(buffers),
+ delim, handler2.value)(asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncReadStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncReadStream, typename DynamicBuffer_v2,
+ typename ReadHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_until_delim_string_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_until_delim_string_op_v2<
+ AsyncReadStream, DynamicBuffer_v2, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_until_delim_string_op_v2<
+ AsyncReadStream, DynamicBuffer_v2, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncReadStream,
+ typename DynamicBuffer_v2,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
+ ASIO_STRING_VIEW_PARAM delim, ReadToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_delim_string_v2<
+ AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ static_cast<std::string>(delim)))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_until_delim_string_v2<AsyncReadStream>(s),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ static_cast<std::string>(delim));
+}
+
+#if !defined(ASIO_NO_EXTENSIONS)
+#if defined(ASIO_HAS_BOOST_REGEX)
+
+namespace detail
+{
+ template <typename AsyncReadStream, typename DynamicBuffer_v2,
+ typename RegEx, typename ReadHandler>
+ class read_until_expr_op_v2
+ : public base_from_cancellation_state<ReadHandler>
+ {
+ public:
+ template <typename BufferSequence, typename Traits>
+ read_until_expr_op_v2(AsyncReadStream& stream, BufferSequence&& buffers,
+ const boost::basic_regex<char, Traits>& expr, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ stream_(stream),
+ buffers_(static_cast<BufferSequence&&>(buffers)),
+ expr_(expr),
+ start_(0),
+ search_position_(0),
+ bytes_to_read_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_until_expr_op_v2(const read_until_expr_op_v2& other)
+ : base_from_cancellation_state<ReadHandler>(other),
+ stream_(other.stream_),
+ buffers_(other.buffers_),
+ expr_(other.expr_),
+ start_(other.start_),
+ search_position_(other.search_position_),
+ bytes_to_read_(other.bytes_to_read_),
+ handler_(other.handler_)
+ {
+ }
+
+ read_until_expr_op_v2(read_until_expr_op_v2&& other)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ stream_(other.stream_),
+ buffers_(static_cast<DynamicBuffer_v2&&>(other.buffers_)),
+ expr_(other.expr_),
+ start_(other.start_),
+ search_position_(other.search_position_),
+ bytes_to_read_(other.bytes_to_read_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(asio::error_code ec,
+ std::size_t bytes_transferred, int start = 0)
+ {
+ const std::size_t not_found = (std::numeric_limits<std::size_t>::max)();
+ std::size_t pos;
+ switch (start_ = start)
+ {
+ case 1:
+ for (;;)
+ {
+ {
+ // Determine the range of the data to be searched.
+ typedef typename DynamicBuffer_v2::const_buffers_type
+ buffers_type;
+ typedef buffers_iterator<buffers_type> iterator;
+ buffers_type data_buffers =
+ const_cast<const DynamicBuffer_v2&>(buffers_).data(
+ 0, buffers_.size());
+ 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<iterator,
+ typename std::vector<boost::sub_match<iterator>>::allocator_type>
+ match_results;
+ bool match = regex_search(start_pos, end,
+ match_results, expr_, regex_match_flags());
+ 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::size_t>(
+ std::max<std::size_t>(512,
+ buffers_.capacity() - buffers_.size()),
+ std::min<std::size_t>(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.
+ pos = buffers_.size();
+ buffers_.grow(bytes_to_read_);
+ {
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, "async_read_until"));
+ stream_.async_read_some(buffers_.data(pos, bytes_to_read_),
+ static_cast<read_until_expr_op_v2&&>(*this));
+ }
+ return; default:
+ buffers_.shrink(bytes_to_read_ - bytes_transferred);
+ if (ec || bytes_transferred == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = error::operation_aborted;
+ 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_;
+
+ static_cast<ReadHandler&&>(handler_)(result_ec, result_n);
+ }
+ }
+
+ //private:
+ AsyncReadStream& stream_;
+ DynamicBuffer_v2 buffers_;
+ RegEx expr_;
+ int start_;
+ std::size_t search_position_;
+ std::size_t bytes_to_read_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncReadStream, typename DynamicBuffer_v2,
+ typename RegEx, typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_until_expr_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, RegEx, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncReadStream>
+ class initiate_async_read_until_expr_v2
+ {
+ public:
+ typedef typename AsyncReadStream::executor_type executor_type;
+
+ explicit initiate_async_read_until_expr_v2(AsyncReadStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename ReadHandler, typename DynamicBuffer_v2, typename RegEx>
+ void operator()(ReadHandler&& handler,
+ DynamicBuffer_v2&& buffers,
+ const RegEx& expr) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ read_until_expr_op_v2<AsyncReadStream,
+ decay_t<DynamicBuffer_v2>,
+ RegEx, decay_t<ReadHandler>>(
+ stream_, static_cast<DynamicBuffer_v2&&>(buffers),
+ expr, handler2.value)(asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncReadStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncReadStream, typename DynamicBuffer_v2,
+ typename RegEx, typename ReadHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_until_expr_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, RegEx, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_until_expr_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, RegEx, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_until_expr_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, RegEx, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncReadStream, typename DynamicBuffer_v2, typename Traits,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
+ const boost::basic_regex<char, Traits>& expr, ReadToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_expr_v2<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers), expr))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_until_expr_v2<AsyncReadStream>(s),
+ token, static_cast<DynamicBuffer_v2&&>(buffers), expr);
+}
+
+#endif // defined(ASIO_HAS_BOOST_REGEX)
+
+namespace detail
+{
+ template <typename AsyncReadStream, typename DynamicBuffer_v2,
+ typename MatchCondition, typename ReadHandler>
+ class read_until_match_op_v2
+ : public base_from_cancellation_state<ReadHandler>
+ {
+ public:
+ template <typename BufferSequence>
+ read_until_match_op_v2(AsyncReadStream& stream,
+ BufferSequence&& buffers,
+ MatchCondition match_condition, ReadHandler& handler)
+ : base_from_cancellation_state<ReadHandler>(
+ handler, enable_partial_cancellation()),
+ stream_(stream),
+ buffers_(static_cast<BufferSequence&&>(buffers)),
+ match_condition_(match_condition),
+ start_(0),
+ search_position_(0),
+ bytes_to_read_(0),
+ handler_(static_cast<ReadHandler&&>(handler))
+ {
+ }
+
+ read_until_match_op_v2(const read_until_match_op_v2& other)
+ : base_from_cancellation_state<ReadHandler>(other),
+ stream_(other.stream_),
+ buffers_(other.buffers_),
+ match_condition_(other.match_condition_),
+ start_(other.start_),
+ search_position_(other.search_position_),
+ bytes_to_read_(other.bytes_to_read_),
+ handler_(other.handler_)
+ {
+ }
+
+ read_until_match_op_v2(read_until_match_op_v2&& other)
+ : base_from_cancellation_state<ReadHandler>(
+ static_cast<base_from_cancellation_state<ReadHandler>&&>(other)),
+ stream_(other.stream_),
+ buffers_(static_cast<DynamicBuffer_v2&&>(other.buffers_)),
+ match_condition_(other.match_condition_),
+ start_(other.start_),
+ search_position_(other.search_position_),
+ bytes_to_read_(other.bytes_to_read_),
+ handler_(static_cast<ReadHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(asio::error_code ec,
+ std::size_t bytes_transferred, int start = 0)
+ {
+ const std::size_t not_found = (std::numeric_limits<std::size_t>::max)();
+ std::size_t pos;
+ switch (start_ = start)
+ {
+ case 1:
+ for (;;)
+ {
+ {
+ // Determine the range of the data to be searched.
+ typedef typename DynamicBuffer_v2::const_buffers_type
+ buffers_type;
+ typedef buffers_iterator<buffers_type> iterator;
+ buffers_type data_buffers =
+ const_cast<const DynamicBuffer_v2&>(buffers_).data(
+ 0, buffers_.size());
+ iterator begin = iterator::begin(data_buffers);
+ iterator start_pos = begin + search_position_;
+ iterator end = iterator::end(data_buffers);
+
+ // Look for a match.
+ std::pair<iterator, bool> 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::size_t>(
+ std::max<std::size_t>(512,
+ buffers_.capacity() - buffers_.size()),
+ std::min<std::size_t>(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.
+ pos = buffers_.size();
+ buffers_.grow(bytes_to_read_);
+ {
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, "async_read_until"));
+ stream_.async_read_some(buffers_.data(pos, bytes_to_read_),
+ static_cast<read_until_match_op_v2&&>(*this));
+ }
+ return; default:
+ buffers_.shrink(bytes_to_read_ - bytes_transferred);
+ if (ec || bytes_transferred == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = error::operation_aborted;
+ 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_;
+
+ static_cast<ReadHandler&&>(handler_)(result_ec, result_n);
+ }
+ }
+
+ //private:
+ AsyncReadStream& stream_;
+ DynamicBuffer_v2 buffers_;
+ MatchCondition match_condition_;
+ int start_;
+ std::size_t search_position_;
+ std::size_t bytes_to_read_;
+ ReadHandler handler_;
+ };
+
+ template <typename AsyncReadStream, typename DynamicBuffer_v2,
+ typename MatchCondition, typename ReadHandler>
+ inline bool asio_handler_is_continuation(
+ read_until_match_op_v2<AsyncReadStream, DynamicBuffer_v2,
+ MatchCondition, ReadHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncReadStream>
+ class initiate_async_read_until_match_v2
+ {
+ public:
+ typedef typename AsyncReadStream::executor_type executor_type;
+
+ explicit initiate_async_read_until_match_v2(AsyncReadStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename ReadHandler,
+ typename DynamicBuffer_v2, typename MatchCondition>
+ void operator()(ReadHandler&& handler,
+ DynamicBuffer_v2&& buffers,
+ MatchCondition match_condition) const
+ {
+ // 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;
+
+ non_const_lvalue<ReadHandler> handler2(handler);
+ read_until_match_op_v2<AsyncReadStream, decay_t<DynamicBuffer_v2>,
+ MatchCondition, decay_t<ReadHandler>>(
+ stream_, static_cast<DynamicBuffer_v2&&>(buffers),
+ match_condition, handler2.value)(asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncReadStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncReadStream, typename DynamicBuffer_v2,
+ typename MatchCondition, typename ReadHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::read_until_match_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, MatchCondition, ReadHandler>,
+ DefaultCandidate>
+ : Associator<ReadHandler, DefaultCandidate>
+{
+ static typename Associator<ReadHandler, DefaultCandidate>::type get(
+ const detail::read_until_match_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, MatchCondition, ReadHandler>& h) noexcept
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::read_until_match_op_v2<AsyncReadStream,
+ DynamicBuffer_v2, MatchCondition, ReadHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<ReadHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncReadStream,
+ typename DynamicBuffer_v2, typename MatchCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken>
+inline auto async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
+ MatchCondition match_condition, ReadToken&& token,
+ constraint_t<
+ is_match_condition<MatchCondition>::value
+ >,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_match_v2<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ match_condition))
+{
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_read_until_match_v2<AsyncReadStream>(s),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ match_condition);
+}
+
+#endif // !defined(ASIO_NO_EXTENSIONS)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_READ_UNTIL_HPP
diff --git a/3rdparty/asio/include/asio/impl/redirect_error.hpp b/3rdparty/asio/include/asio/impl/redirect_error.hpp
new file mode 100644
index 00000000000..e75aa0f706c
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/redirect_error.hpp
@@ -0,0 +1,250 @@
+
+// impl/redirect_error.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_REDIRECT_ERROR_HPP
+#define ASIO_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/associator.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/system_error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Class to adapt a redirect_error_t as a completion handler.
+template <typename Handler>
+class redirect_error_handler
+{
+public:
+ typedef void result_type;
+
+ template <typename CompletionToken>
+ redirect_error_handler(redirect_error_t<CompletionToken> e)
+ : ec_(e.ec_),
+ handler_(static_cast<CompletionToken&&>(e.token_))
+ {
+ }
+
+ template <typename RedirectedHandler>
+ redirect_error_handler(asio::error_code& ec,
+ RedirectedHandler&& h)
+ : ec_(ec),
+ handler_(static_cast<RedirectedHandler&&>(h))
+ {
+ }
+
+ void operator()()
+ {
+ static_cast<Handler&&>(handler_)();
+ }
+
+ template <typename Arg, typename... Args>
+ enable_if_t<
+ !is_same<decay_t<Arg>, asio::error_code>::value
+ >
+ operator()(Arg&& arg, Args&&... args)
+ {
+ static_cast<Handler&&>(handler_)(
+ static_cast<Arg&&>(arg),
+ static_cast<Args&&>(args)...);
+ }
+
+ template <typename... Args>
+ void operator()(const asio::error_code& ec, Args&&... args)
+ {
+ ec_ = ec;
+ static_cast<Handler&&>(handler_)(static_cast<Args&&>(args)...);
+ }
+
+//private:
+ asio::error_code& ec_;
+ Handler handler_;
+};
+
+template <typename Handler>
+inline bool asio_handler_is_continuation(
+ redirect_error_handler<Handler>* this_handler)
+{
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+}
+
+template <typename Signature>
+struct redirect_error_signature
+{
+ typedef Signature type;
+};
+
+template <typename R, typename... Args>
+struct redirect_error_signature<R(asio::error_code, Args...)>
+{
+ typedef R type(Args...);
+};
+
+template <typename R, typename... Args>
+struct redirect_error_signature<R(const asio::error_code&, Args...)>
+{
+ typedef R type(Args...);
+};
+
+template <typename R, typename... Args>
+struct redirect_error_signature<R(asio::error_code, Args...) &>
+{
+ typedef R type(Args...) &;
+};
+
+template <typename R, typename... Args>
+struct redirect_error_signature<R(const asio::error_code&, Args...) &>
+{
+ typedef R type(Args...) &;
+};
+
+template <typename R, typename... Args>
+struct redirect_error_signature<R(asio::error_code, Args...) &&>
+{
+ typedef R type(Args...) &&;
+};
+
+template <typename R, typename... Args>
+struct redirect_error_signature<R(const asio::error_code&, Args...) &&>
+{
+ typedef R type(Args...) &&;
+};
+
+#if defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+template <typename R, typename... Args>
+struct redirect_error_signature<
+ R(asio::error_code, Args...) noexcept>
+{
+ typedef R type(Args...) & noexcept;
+};
+
+template <typename R, typename... Args>
+struct redirect_error_signature<
+ R(const asio::error_code&, Args...) noexcept>
+{
+ typedef R type(Args...) & noexcept;
+};
+
+template <typename R, typename... Args>
+struct redirect_error_signature<
+ R(asio::error_code, Args...) & noexcept>
+{
+ typedef R type(Args...) & noexcept;
+};
+
+template <typename R, typename... Args>
+struct redirect_error_signature<
+ R(const asio::error_code&, Args...) & noexcept>
+{
+ typedef R type(Args...) & noexcept;
+};
+
+template <typename R, typename... Args>
+struct redirect_error_signature<
+ R(asio::error_code, Args...) && noexcept>
+{
+ typedef R type(Args...) && noexcept;
+};
+
+template <typename R, typename... Args>
+struct redirect_error_signature<
+ R(const asio::error_code&, Args...) && noexcept>
+{
+ typedef R type(Args...) && noexcept;
+};
+
+#endif // defined(ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
+
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename CompletionToken, typename Signature>
+struct async_result<redirect_error_t<CompletionToken>, Signature>
+ : async_result<CompletionToken,
+ typename detail::redirect_error_signature<Signature>::type>
+{
+
+ struct init_wrapper
+ {
+ explicit init_wrapper(asio::error_code& ec)
+ : ec_(ec)
+ {
+ }
+
+ template <typename Handler, typename Initiation, typename... Args>
+ void operator()(Handler&& handler,
+ Initiation&& initiation, Args&&... args) const
+ {
+ static_cast<Initiation&&>(initiation)(
+ detail::redirect_error_handler<decay_t<Handler>>(
+ ec_, static_cast<Handler&&>(handler)),
+ static_cast<Args&&>(args)...);
+ }
+
+ asio::error_code& ec_;
+ };
+
+ template <typename Initiation, typename RawCompletionToken, typename... Args>
+ static auto initiate(Initiation&& initiation,
+ RawCompletionToken&& token, Args&&... args)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::redirect_error_signature<Signature>::type>(
+ declval<init_wrapper>(), token.token_,
+ static_cast<Initiation&&>(initiation),
+ static_cast<Args&&>(args)...))
+ {
+ return async_initiate<CompletionToken,
+ typename detail::redirect_error_signature<Signature>::type>(
+ init_wrapper(token.ec_), token.token_,
+ static_cast<Initiation&&>(initiation),
+ static_cast<Args&&>(args)...);
+ }
+};
+
+template <template <typename, typename> class Associator,
+ typename Handler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::redirect_error_handler<Handler>, DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const detail::redirect_error_handler<Handler>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const detail::redirect_error_handler<Handler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_REDIRECT_ERROR_HPP
diff --git a/3rdparty/asio/include/asio/impl/serial_port_base.hpp b/3rdparty/asio/include/asio/impl/serial_port_base.hpp
new file mode 100644
index 00000000000..1fa2af66f73
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/serial_port_base.hpp
@@ -0,0 +1,59 @@
+//
+// impl/serial_port_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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/3rdparty/asio/include/asio/impl/serial_port_base.ipp b/3rdparty/asio/include/asio/impl/serial_port_base.ipp
new file mode 100644
index 00000000000..646af3453d6
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/serial_port_base.ipp
@@ -0,0 +1,554 @@
+//
+// impl/serial_port_base.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <stdexcept>
+#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/3rdparty/asio/include/asio/impl/spawn.hpp b/3rdparty/asio/include/asio/impl/spawn.hpp
new file mode 100644
index 00000000000..38a96406ed4
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/spawn.hpp
@@ -0,0 +1,1400 @@
+//
+// impl/spawn.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <tuple>
+#include "asio/associated_allocator.hpp"
+#include "asio/associated_cancellation_slot.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/bind_handler.hpp"
+#include "asio/detail/handler_cont_helpers.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/noncopyable.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/detail/utility.hpp"
+#include "asio/system_error.hpp"
+
+#if defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+# include <boost/context/fiber.hpp>
+#endif // defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+#if !defined(ASIO_NO_EXCEPTIONS)
+inline void spawned_thread_rethrow(void* ex)
+{
+ if (*static_cast<exception_ptr*>(ex))
+ rethrow_exception(*static_cast<exception_ptr*>(ex));
+}
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+
+#if defined(ASIO_HAS_BOOST_COROUTINE)
+
+// Spawned thread implementation using Boost.Coroutine.
+class spawned_coroutine_thread : public spawned_thread_base
+{
+public:
+#if defined(BOOST_COROUTINES_UNIDIRECT) || defined(BOOST_COROUTINES_V2)
+ typedef boost::coroutines::pull_coroutine<void> callee_type;
+ typedef boost::coroutines::push_coroutine<void> caller_type;
+#else
+ typedef boost::coroutines::coroutine<void()> callee_type;
+ typedef boost::coroutines::coroutine<void()> caller_type;
+#endif
+
+ spawned_coroutine_thread(caller_type& caller)
+ : caller_(caller),
+ on_suspend_fn_(0),
+ on_suspend_arg_(0)
+ {
+ }
+
+ template <typename F>
+ static spawned_thread_base* spawn(F&& f,
+ const boost::coroutines::attributes& attributes,
+ cancellation_slot parent_cancel_slot = cancellation_slot(),
+ cancellation_state cancel_state = cancellation_state())
+ {
+ spawned_coroutine_thread* spawned_thread = 0;
+ callee_type callee(entry_point<decay_t<F>>(
+ static_cast<F&&>(f), &spawned_thread), attributes);
+ spawned_thread->callee_.swap(callee);
+ spawned_thread->parent_cancellation_slot_ = parent_cancel_slot;
+ spawned_thread->cancellation_state_ = cancel_state;
+ return spawned_thread;
+ }
+
+ template <typename F>
+ static spawned_thread_base* spawn(F&& f,
+ cancellation_slot parent_cancel_slot = cancellation_slot(),
+ cancellation_state cancel_state = cancellation_state())
+ {
+ return spawn(static_cast<F&&>(f), boost::coroutines::attributes(),
+ parent_cancel_slot, cancel_state);
+ }
+
+ void resume()
+ {
+ callee_();
+ if (on_suspend_fn_)
+ {
+ void (*fn)(void*) = on_suspend_fn_;
+ void* arg = on_suspend_arg_;
+ on_suspend_fn_ = 0;
+ fn(arg);
+ }
+ }
+
+ void suspend_with(void (*fn)(void*), void* arg)
+ {
+ if (throw_if_cancelled_)
+ if (!!cancellation_state_.cancelled())
+ throw_error(asio::error::operation_aborted, "yield");
+ has_context_switched_ = true;
+ on_suspend_fn_ = fn;
+ on_suspend_arg_ = arg;
+ caller_();
+ }
+
+ void destroy()
+ {
+ callee_type callee;
+ callee.swap(callee_);
+ if (terminal_)
+ callee();
+ }
+
+private:
+ template <typename Function>
+ class entry_point
+ {
+ public:
+ template <typename F>
+ entry_point(F&& f,
+ spawned_coroutine_thread** spawned_thread_out)
+ : function_(static_cast<F&&>(f)),
+ spawned_thread_out_(spawned_thread_out)
+ {
+ }
+
+ void operator()(caller_type& caller)
+ {
+ Function function(static_cast<Function&&>(function_));
+ spawned_coroutine_thread spawned_thread(caller);
+ *spawned_thread_out_ = &spawned_thread;
+ spawned_thread_out_ = 0;
+ spawned_thread.suspend();
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ {
+ function(&spawned_thread);
+ spawned_thread.terminal_ = true;
+ spawned_thread.suspend();
+ }
+#if !defined(ASIO_NO_EXCEPTIONS)
+ catch (const boost::coroutines::detail::forced_unwind&)
+ {
+ throw;
+ }
+ catch (...)
+ {
+ exception_ptr ex = current_exception();
+ spawned_thread.terminal_ = true;
+ spawned_thread.suspend_with(spawned_thread_rethrow, &ex);
+ }
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ }
+
+ private:
+ Function function_;
+ spawned_coroutine_thread** spawned_thread_out_;
+ };
+
+ caller_type& caller_;
+ callee_type callee_;
+ void (*on_suspend_fn_)(void*);
+ void* on_suspend_arg_;
+};
+
+#endif // defined(ASIO_HAS_BOOST_COROUTINE)
+
+#if defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+
+// Spawned thread implementation using Boost.Context's fiber.
+class spawned_fiber_thread : public spawned_thread_base
+{
+public:
+ typedef boost::context::fiber fiber_type;
+
+ spawned_fiber_thread(fiber_type&& caller)
+ : caller_(static_cast<fiber_type&&>(caller)),
+ on_suspend_fn_(0),
+ on_suspend_arg_(0)
+ {
+ }
+
+ template <typename StackAllocator, typename F>
+ static spawned_thread_base* spawn(allocator_arg_t,
+ StackAllocator&& stack_allocator,
+ F&& f,
+ cancellation_slot parent_cancel_slot = cancellation_slot(),
+ cancellation_state cancel_state = cancellation_state())
+ {
+ spawned_fiber_thread* spawned_thread = 0;
+ fiber_type callee(allocator_arg_t(),
+ static_cast<StackAllocator&&>(stack_allocator),
+ entry_point<decay_t<F>>(
+ static_cast<F&&>(f), &spawned_thread));
+ callee = fiber_type(static_cast<fiber_type&&>(callee)).resume();
+ spawned_thread->callee_ = static_cast<fiber_type&&>(callee);
+ spawned_thread->parent_cancellation_slot_ = parent_cancel_slot;
+ spawned_thread->cancellation_state_ = cancel_state;
+ return spawned_thread;
+ }
+
+ template <typename F>
+ static spawned_thread_base* spawn(F&& f,
+ cancellation_slot parent_cancel_slot = cancellation_slot(),
+ cancellation_state cancel_state = cancellation_state())
+ {
+ return spawn(allocator_arg_t(), boost::context::fixedsize_stack(),
+ static_cast<F&&>(f), parent_cancel_slot, cancel_state);
+ }
+
+ void resume()
+ {
+ callee_ = fiber_type(static_cast<fiber_type&&>(callee_)).resume();
+ if (on_suspend_fn_)
+ {
+ void (*fn)(void*) = on_suspend_fn_;
+ void* arg = on_suspend_arg_;
+ on_suspend_fn_ = 0;
+ fn(arg);
+ }
+ }
+
+ void suspend_with(void (*fn)(void*), void* arg)
+ {
+ if (throw_if_cancelled_)
+ if (!!cancellation_state_.cancelled())
+ throw_error(asio::error::operation_aborted, "yield");
+ has_context_switched_ = true;
+ on_suspend_fn_ = fn;
+ on_suspend_arg_ = arg;
+ caller_ = fiber_type(static_cast<fiber_type&&>(caller_)).resume();
+ }
+
+ void destroy()
+ {
+ fiber_type callee = static_cast<fiber_type&&>(callee_);
+ if (terminal_)
+ fiber_type(static_cast<fiber_type&&>(callee)).resume();
+ }
+
+private:
+ template <typename Function>
+ class entry_point
+ {
+ public:
+ template <typename F>
+ entry_point(F&& f,
+ spawned_fiber_thread** spawned_thread_out)
+ : function_(static_cast<F&&>(f)),
+ spawned_thread_out_(spawned_thread_out)
+ {
+ }
+
+ fiber_type operator()(fiber_type&& caller)
+ {
+ Function function(static_cast<Function&&>(function_));
+ spawned_fiber_thread spawned_thread(
+ static_cast<fiber_type&&>(caller));
+ *spawned_thread_out_ = &spawned_thread;
+ spawned_thread_out_ = 0;
+ spawned_thread.suspend();
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ {
+ function(&spawned_thread);
+ spawned_thread.terminal_ = true;
+ spawned_thread.suspend();
+ }
+#if !defined(ASIO_NO_EXCEPTIONS)
+ catch (const boost::context::detail::forced_unwind&)
+ {
+ throw;
+ }
+ catch (...)
+ {
+ exception_ptr ex = current_exception();
+ spawned_thread.terminal_ = true;
+ spawned_thread.suspend_with(spawned_thread_rethrow, &ex);
+ }
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ return static_cast<fiber_type&&>(spawned_thread.caller_);
+ }
+
+ private:
+ Function function_;
+ spawned_fiber_thread** spawned_thread_out_;
+ };
+
+ fiber_type caller_;
+ fiber_type callee_;
+ void (*on_suspend_fn_)(void*);
+ void* on_suspend_arg_;
+};
+
+#endif // defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+
+#if defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+typedef spawned_fiber_thread default_spawned_thread_type;
+#elif defined(ASIO_HAS_BOOST_COROUTINE)
+typedef spawned_coroutine_thread default_spawned_thread_type;
+#else
+# error No spawn() implementation available
+#endif
+
+// Helper class to perform the initial resume on the correct executor.
+class spawned_thread_resumer
+{
+public:
+ explicit spawned_thread_resumer(spawned_thread_base* spawned_thread)
+ : spawned_thread_(spawned_thread)
+ {
+ }
+
+ spawned_thread_resumer(spawned_thread_resumer&& other) noexcept
+ : spawned_thread_(other.spawned_thread_)
+ {
+ other.spawned_thread_ = 0;
+ }
+
+ ~spawned_thread_resumer()
+ {
+ if (spawned_thread_)
+ spawned_thread_->destroy();
+ }
+
+ void operator()()
+ {
+ spawned_thread_->attach(&spawned_thread_);
+ spawned_thread_->resume();
+ }
+
+private:
+ spawned_thread_base* spawned_thread_;
+};
+
+// Helper class to ensure spawned threads are destroyed on the correct executor.
+class spawned_thread_destroyer
+{
+public:
+ explicit spawned_thread_destroyer(spawned_thread_base* spawned_thread)
+ : spawned_thread_(spawned_thread)
+ {
+ spawned_thread->detach();
+ }
+
+ spawned_thread_destroyer(spawned_thread_destroyer&& other) noexcept
+ : spawned_thread_(other.spawned_thread_)
+ {
+ other.spawned_thread_ = 0;
+ }
+
+ ~spawned_thread_destroyer()
+ {
+ if (spawned_thread_)
+ spawned_thread_->destroy();
+ }
+
+ void operator()()
+ {
+ if (spawned_thread_)
+ {
+ spawned_thread_->destroy();
+ spawned_thread_ = 0;
+ }
+ }
+
+private:
+ spawned_thread_base* spawned_thread_;
+};
+
+// Base class for all completion handlers associated with a spawned thread.
+template <typename Executor>
+class spawn_handler_base
+{
+public:
+ typedef Executor executor_type;
+ typedef cancellation_slot cancellation_slot_type;
+
+ spawn_handler_base(const basic_yield_context<Executor>& yield)
+ : yield_(yield),
+ spawned_thread_(yield.spawned_thread_)
+ {
+ spawned_thread_->detach();
+ }
+
+ spawn_handler_base(spawn_handler_base&& other) noexcept
+ : yield_(other.yield_),
+ spawned_thread_(other.spawned_thread_)
+
+ {
+ other.spawned_thread_ = 0;
+ }
+
+ ~spawn_handler_base()
+ {
+ if (spawned_thread_)
+ (post)(yield_.executor_, spawned_thread_destroyer(spawned_thread_));
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return yield_.executor_;
+ }
+
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return spawned_thread_->get_cancellation_slot();
+ }
+
+ void resume()
+ {
+ spawned_thread_resumer resumer(spawned_thread_);
+ spawned_thread_ = 0;
+ resumer();
+ }
+
+protected:
+ const basic_yield_context<Executor>& yield_;
+ spawned_thread_base* spawned_thread_;
+};
+
+// Completion handlers for when basic_yield_context is used as a token.
+template <typename Executor, typename Signature>
+class spawn_handler;
+
+template <typename Executor, typename R>
+class spawn_handler<Executor, R()>
+ : public spawn_handler_base<Executor>
+{
+public:
+ typedef void return_type;
+
+ struct result_type {};
+
+ spawn_handler(const basic_yield_context<Executor>& yield, result_type&)
+ : spawn_handler_base<Executor>(yield)
+ {
+ }
+
+ void operator()()
+ {
+ this->resume();
+ }
+
+ static return_type on_resume(result_type&)
+ {
+ }
+};
+
+template <typename Executor, typename R>
+class spawn_handler<Executor, R(asio::error_code)>
+ : public spawn_handler_base<Executor>
+{
+public:
+ typedef void return_type;
+ typedef asio::error_code* result_type;
+
+ spawn_handler(const basic_yield_context<Executor>& yield, result_type& result)
+ : spawn_handler_base<Executor>(yield),
+ result_(result)
+ {
+ }
+
+ void operator()(asio::error_code ec)
+ {
+ if (this->yield_.ec_)
+ {
+ *this->yield_.ec_ = ec;
+ result_ = 0;
+ }
+ else
+ result_ = &ec;
+ this->resume();
+ }
+
+ static return_type on_resume(result_type& result)
+ {
+ if (result)
+ throw_error(*result);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename Executor, typename R>
+class spawn_handler<Executor, R(exception_ptr)>
+ : public spawn_handler_base<Executor>
+{
+public:
+ typedef void return_type;
+ typedef exception_ptr* result_type;
+
+ spawn_handler(const basic_yield_context<Executor>& yield, result_type& result)
+ : spawn_handler_base<Executor>(yield),
+ result_(result)
+ {
+ }
+
+ void operator()(exception_ptr ex)
+ {
+ result_ = &ex;
+ this->resume();
+ }
+
+ static return_type on_resume(result_type& result)
+ {
+ if (*result)
+ rethrow_exception(*result);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename Executor, typename R, typename T>
+class spawn_handler<Executor, R(T)>
+ : public spawn_handler_base<Executor>
+{
+public:
+ typedef T return_type;
+ typedef return_type* result_type;
+
+ spawn_handler(const basic_yield_context<Executor>& yield, result_type& result)
+ : spawn_handler_base<Executor>(yield),
+ result_(result)
+ {
+ }
+
+ void operator()(T value)
+ {
+ result_ = &value;
+ this->resume();
+ }
+
+ static return_type on_resume(result_type& result)
+ {
+ return static_cast<return_type&&>(*result);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename Executor, typename R, typename T>
+class spawn_handler<Executor, R(asio::error_code, T)>
+ : public spawn_handler_base<Executor>
+{
+public:
+ typedef T return_type;
+
+ struct result_type
+ {
+ asio::error_code* ec_;
+ return_type* value_;
+ };
+
+ spawn_handler(const basic_yield_context<Executor>& yield, result_type& result)
+ : spawn_handler_base<Executor>(yield),
+ result_(result)
+ {
+ }
+
+ void operator()(asio::error_code ec, T value)
+ {
+ if (this->yield_.ec_)
+ {
+ *this->yield_.ec_ = ec;
+ result_.ec_ = 0;
+ }
+ else
+ result_.ec_ = &ec;
+ result_.value_ = &value;
+ this->resume();
+ }
+
+ static return_type on_resume(result_type& result)
+ {
+ if (result.ec_)
+ throw_error(*result.ec_);
+ return static_cast<return_type&&>(*result.value_);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename Executor, typename R, typename T>
+class spawn_handler<Executor, R(exception_ptr, T)>
+ : public spawn_handler_base<Executor>
+{
+public:
+ typedef T return_type;
+
+ struct result_type
+ {
+ exception_ptr* ex_;
+ return_type* value_;
+ };
+
+ spawn_handler(const basic_yield_context<Executor>& yield, result_type& result)
+ : spawn_handler_base<Executor>(yield),
+ result_(result)
+ {
+ }
+
+ void operator()(exception_ptr ex, T value)
+ {
+ result_.ex_ = &ex;
+ result_.value_ = &value;
+ this->resume();
+ }
+
+ static return_type on_resume(result_type& result)
+ {
+ if (*result.ex_)
+ rethrow_exception(*result.ex_);
+ return static_cast<return_type&&>(*result.value_);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename Executor, typename R, typename... Ts>
+class spawn_handler<Executor, R(Ts...)>
+ : public spawn_handler_base<Executor>
+{
+public:
+ typedef std::tuple<Ts...> return_type;
+
+ typedef return_type* result_type;
+
+ spawn_handler(const basic_yield_context<Executor>& yield, result_type& result)
+ : spawn_handler_base<Executor>(yield),
+ result_(result)
+ {
+ }
+
+ template <typename... Args>
+ void operator()(Args&&... args)
+ {
+ return_type value(static_cast<Args&&>(args)...);
+ result_ = &value;
+ this->resume();
+ }
+
+ static return_type on_resume(result_type& result)
+ {
+ return static_cast<return_type&&>(*result);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename Executor, typename R, typename... Ts>
+class spawn_handler<Executor, R(asio::error_code, Ts...)>
+ : public spawn_handler_base<Executor>
+{
+public:
+ typedef std::tuple<Ts...> return_type;
+
+ struct result_type
+ {
+ asio::error_code* ec_;
+ return_type* value_;
+ };
+
+ spawn_handler(const basic_yield_context<Executor>& yield, result_type& result)
+ : spawn_handler_base<Executor>(yield),
+ result_(result)
+ {
+ }
+
+ template <typename... Args>
+ void operator()(asio::error_code ec,
+ Args&&... args)
+ {
+ return_type value(static_cast<Args&&>(args)...);
+ if (this->yield_.ec_)
+ {
+ *this->yield_.ec_ = ec;
+ result_.ec_ = 0;
+ }
+ else
+ result_.ec_ = &ec;
+ result_.value_ = &value;
+ this->resume();
+ }
+
+ static return_type on_resume(result_type& result)
+ {
+ if (result.ec_)
+ throw_error(*result.ec_);
+ return static_cast<return_type&&>(*result.value_);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename Executor, typename R, typename... Ts>
+class spawn_handler<Executor, R(exception_ptr, Ts...)>
+ : public spawn_handler_base<Executor>
+{
+public:
+ typedef std::tuple<Ts...> return_type;
+
+ struct result_type
+ {
+ exception_ptr* ex_;
+ return_type* value_;
+ };
+
+ spawn_handler(const basic_yield_context<Executor>& yield, result_type& result)
+ : spawn_handler_base<Executor>(yield),
+ result_(result)
+ {
+ }
+
+ template <typename... Args>
+ void operator()(exception_ptr ex, Args&&... args)
+ {
+ return_type value(static_cast<Args&&>(args)...);
+ result_.ex_ = &ex;
+ result_.value_ = &value;
+ this->resume();
+ }
+
+ static return_type on_resume(result_type& result)
+ {
+ if (*result.ex_)
+ rethrow_exception(*result.ex_);
+ return static_cast<return_type&&>(*result.value_);
+ }
+
+private:
+ result_type& result_;
+};
+
+template <typename Executor, typename Signature>
+inline bool asio_handler_is_continuation(spawn_handler<Executor, Signature>*)
+{
+ return true;
+}
+
+} // namespace detail
+
+template <typename Executor, typename Signature>
+class async_result<basic_yield_context<Executor>, Signature>
+{
+public:
+ typedef typename detail::spawn_handler<Executor, Signature> handler_type;
+ typedef typename handler_type::return_type return_type;
+
+#if defined(ASIO_HAS_VARIADIC_LAMBDA_CAPTURES)
+
+ template <typename Initiation, typename... InitArgs>
+ static return_type initiate(Initiation&& init,
+ const basic_yield_context<Executor>& yield,
+ InitArgs&&... init_args)
+ {
+ typename handler_type::result_type result
+ = typename handler_type::result_type();
+
+ yield.spawned_thread_->suspend_with(
+ [&]()
+ {
+ static_cast<Initiation&&>(init)(
+ handler_type(yield, result),
+ static_cast<InitArgs&&>(init_args)...);
+ });
+
+ return handler_type::on_resume(result);
+ }
+
+#else // defined(ASIO_HAS_VARIADIC_LAMBDA_CAPTURES)
+
+ template <typename Initiation, typename... InitArgs>
+ struct suspend_with_helper
+ {
+ typename handler_type::result_type& result_;
+ Initiation&& init_;
+ const basic_yield_context<Executor>& yield_;
+ std::tuple<InitArgs&&...> init_args_;
+
+ template <std::size_t... I>
+ void do_invoke(detail::index_sequence<I...>)
+ {
+ static_cast<Initiation&&>(init_)(
+ handler_type(yield_, result_),
+ static_cast<InitArgs&&>(std::get<I>(init_args_))...);
+ }
+
+ void operator()()
+ {
+ this->do_invoke(detail::make_index_sequence<sizeof...(InitArgs)>());
+ }
+ };
+
+ template <typename Initiation, typename... InitArgs>
+ static return_type initiate(Initiation&& init,
+ const basic_yield_context<Executor>& yield,
+ InitArgs&&... init_args)
+ {
+ typename handler_type::result_type result
+ = typename handler_type::result_type();
+
+ yield.spawned_thread_->suspend_with(
+ suspend_with_helper<Initiation, InitArgs...>{
+ result, static_cast<Initiation&&>(init), yield,
+ std::tuple<InitArgs&&...>(
+ static_cast<InitArgs&&>(init_args)...)});
+
+ return handler_type::on_resume(result);
+ }
+
+#endif // defined(ASIO_HAS_VARIADIC_LAMBDA_CAPTURES)
+};
+
+namespace detail {
+
+template <typename Executor, typename Function, typename Handler>
+class spawn_entry_point
+{
+public:
+ template <typename F, typename H>
+ spawn_entry_point(const Executor& ex,
+ F&& f, H&& h)
+ : executor_(ex),
+ function_(static_cast<F&&>(f)),
+ handler_(static_cast<H&&>(h)),
+ work_(handler_, executor_)
+ {
+ }
+
+ void operator()(spawned_thread_base* spawned_thread)
+ {
+ const basic_yield_context<Executor> yield(spawned_thread, executor_);
+ this->call(yield,
+ void_type<result_of_t<Function(basic_yield_context<Executor>)>>());
+ }
+
+private:
+ void call(const basic_yield_context<Executor>& yield, void_type<void>)
+ {
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ {
+ function_(yield);
+ if (!yield.spawned_thread_->has_context_switched())
+ (post)(yield);
+ detail::binder1<Handler, exception_ptr>
+ handler(handler_, exception_ptr());
+ work_.complete(handler, handler.handler_);
+ }
+#if !defined(ASIO_NO_EXCEPTIONS)
+# if defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+ catch (const boost::context::detail::forced_unwind&)
+ {
+ throw;
+ }
+# endif // defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+# if defined(ASIO_HAS_BOOST_COROUTINE)
+ catch (const boost::coroutines::detail::forced_unwind&)
+ {
+ throw;
+ }
+# endif // defined(ASIO_HAS_BOOST_COROUTINE)
+ catch (...)
+ {
+ exception_ptr ex = current_exception();
+ if (!yield.spawned_thread_->has_context_switched())
+ (post)(yield);
+ detail::binder1<Handler, exception_ptr> handler(handler_, ex);
+ work_.complete(handler, handler.handler_);
+ }
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ }
+
+ template <typename T>
+ void call(const basic_yield_context<Executor>& yield, void_type<T>)
+ {
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ {
+ T result(function_(yield));
+ if (!yield.spawned_thread_->has_context_switched())
+ (post)(yield);
+ detail::binder2<Handler, exception_ptr, T>
+ handler(handler_, exception_ptr(), static_cast<T&&>(result));
+ work_.complete(handler, handler.handler_);
+ }
+#if !defined(ASIO_NO_EXCEPTIONS)
+# if defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+ catch (const boost::context::detail::forced_unwind&)
+ {
+ throw;
+ }
+# endif // defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+# if defined(ASIO_HAS_BOOST_COROUTINE)
+ catch (const boost::coroutines::detail::forced_unwind&)
+ {
+ throw;
+ }
+# endif // defined(ASIO_HAS_BOOST_COROUTINE)
+ catch (...)
+ {
+ exception_ptr ex = current_exception();
+ if (!yield.spawned_thread_->has_context_switched())
+ (post)(yield);
+ detail::binder2<Handler, exception_ptr, T> handler(handler_, ex, T());
+ work_.complete(handler, handler.handler_);
+ }
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ }
+
+ Executor executor_;
+ Function function_;
+ Handler handler_;
+ handler_work<Handler, Executor> work_;
+};
+
+struct spawn_cancellation_signal_emitter
+{
+ cancellation_signal* signal_;
+ cancellation_type_t type_;
+
+ void operator()()
+ {
+ signal_->emit(type_);
+ }
+};
+
+template <typename Handler, typename Executor, typename = void>
+class spawn_cancellation_handler
+{
+public:
+ spawn_cancellation_handler(const Handler&, const Executor& ex)
+ : ex_(ex)
+ {
+ }
+
+ cancellation_slot slot()
+ {
+ return signal_.slot();
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ spawn_cancellation_signal_emitter emitter = { &signal_, type };
+ (dispatch)(ex_, emitter);
+ }
+
+private:
+ cancellation_signal signal_;
+ Executor ex_;
+};
+
+
+template <typename Handler, typename Executor>
+class spawn_cancellation_handler<Handler, Executor,
+ enable_if_t<
+ is_same<
+ typename associated_executor<Handler,
+ Executor>::asio_associated_executor_is_unspecialised,
+ void
+ >::value
+ >>
+{
+public:
+ spawn_cancellation_handler(const Handler&, const Executor&)
+ {
+ }
+
+ cancellation_slot slot()
+ {
+ return signal_.slot();
+ }
+
+ void operator()(cancellation_type_t type)
+ {
+ signal_.emit(type);
+ }
+
+private:
+ cancellation_signal signal_;
+};
+
+template <typename Executor>
+class initiate_spawn
+{
+public:
+ typedef Executor executor_type;
+
+ explicit initiate_spawn(const executor_type& ex)
+ : executor_(ex)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return executor_;
+ }
+
+ template <typename Handler, typename F>
+ void operator()(Handler&& handler,
+ F&& f) const
+ {
+ typedef decay_t<Handler> handler_type;
+ typedef decay_t<F> function_type;
+ typedef spawn_cancellation_handler<
+ handler_type, Executor> cancel_handler_type;
+
+ associated_cancellation_slot_t<handler_type> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ cancel_handler_type* cancel_handler = slot.is_connected()
+ ? &slot.template emplace<cancel_handler_type>(handler, executor_)
+ : 0;
+
+ cancellation_slot proxy_slot(
+ cancel_handler
+ ? cancel_handler->slot()
+ : cancellation_slot());
+
+ cancellation_state cancel_state(proxy_slot);
+
+ (dispatch)(executor_,
+ spawned_thread_resumer(
+ default_spawned_thread_type::spawn(
+ spawn_entry_point<Executor, function_type, handler_type>(
+ executor_, static_cast<F&&>(f),
+ static_cast<Handler&&>(handler)),
+ proxy_slot, cancel_state)));
+ }
+
+#if defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+
+ template <typename Handler, typename StackAllocator, typename F>
+ void operator()(Handler&& handler, allocator_arg_t,
+ StackAllocator&& stack_allocator,
+ F&& f) const
+ {
+ typedef decay_t<Handler> handler_type;
+ typedef decay_t<F> function_type;
+ typedef spawn_cancellation_handler<
+ handler_type, Executor> cancel_handler_type;
+
+ associated_cancellation_slot_t<handler_type> slot
+ = asio::get_associated_cancellation_slot(handler);
+
+ cancel_handler_type* cancel_handler = slot.is_connected()
+ ? &slot.template emplace<cancel_handler_type>(handler, executor_)
+ : 0;
+
+ cancellation_slot proxy_slot(
+ cancel_handler
+ ? cancel_handler->slot()
+ : cancellation_slot());
+
+ cancellation_state cancel_state(proxy_slot);
+
+ (dispatch)(executor_,
+ spawned_thread_resumer(
+ spawned_fiber_thread::spawn(allocator_arg_t(),
+ static_cast<StackAllocator&&>(stack_allocator),
+ spawn_entry_point<Executor, function_type, handler_type>(
+ executor_, static_cast<F&&>(f),
+ static_cast<Handler&&>(handler)),
+ proxy_slot, cancel_state)));
+ }
+
+#endif // defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+
+private:
+ executor_type executor_;
+};
+
+} // namespace detail
+
+template <typename Executor, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type) CompletionToken>
+inline auto spawn(const Executor& ex, F&& function, CompletionToken&& token,
+#if defined(ASIO_HAS_BOOST_COROUTINE)
+ constraint_t<
+ !is_same<
+ decay_t<CompletionToken>,
+ boost::coroutines::attributes
+ >::value
+ >,
+#endif // defined(ASIO_HAS_BOOST_COROUTINE)
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ >)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type>(
+ declval<detail::initiate_spawn<Executor>>(),
+ token, static_cast<F&&>(function)))
+{
+ return async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type>(
+ detail::initiate_spawn<Executor>(ex),
+ token, static_cast<F&&>(function));
+}
+
+template <typename ExecutionContext, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<
+ typename ExecutionContext::executor_type>)>>::type) CompletionToken>
+inline auto spawn(ExecutionContext& ctx, F&& function, CompletionToken&& token,
+#if defined(ASIO_HAS_BOOST_COROUTINE)
+ constraint_t<
+ !is_same<
+ decay_t<CompletionToken>,
+ boost::coroutines::attributes
+ >::value
+ >,
+#endif // defined(ASIO_HAS_BOOST_COROUTINE)
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ >)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<
+ typename ExecutionContext::executor_type>)>>::type>(
+ declval<detail::initiate_spawn<
+ typename ExecutionContext::executor_type>>(),
+ token, static_cast<F&&>(function)))
+{
+ return (spawn)(ctx.get_executor(), static_cast<F&&>(function),
+ static_cast<CompletionToken&&>(token));
+}
+
+template <typename Executor, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type)
+ CompletionToken>
+inline auto spawn(const basic_yield_context<Executor>& ctx,
+ F&& function, CompletionToken&& token,
+#if defined(ASIO_HAS_BOOST_COROUTINE)
+ constraint_t<
+ !is_same<
+ decay_t<CompletionToken>,
+ boost::coroutines::attributes
+ >::value
+ >,
+#endif // defined(ASIO_HAS_BOOST_COROUTINE)
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ >)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type>(
+ declval<detail::initiate_spawn<Executor>>(),
+ token, static_cast<F&&>(function)))
+{
+ return (spawn)(ctx.get_executor(), static_cast<F&&>(function),
+ static_cast<CompletionToken&&>(token));
+}
+
+#if defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+
+template <typename Executor, typename StackAllocator, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type)
+ CompletionToken>
+inline auto spawn(const Executor& ex, allocator_arg_t,
+ StackAllocator&& stack_allocator, F&& function, CompletionToken&& token,
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ >)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type>(
+ declval<detail::initiate_spawn<Executor>>(),
+ token, allocator_arg_t(),
+ static_cast<StackAllocator&&>(stack_allocator),
+ static_cast<F&&>(function)))
+{
+ return async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type>(
+ detail::initiate_spawn<Executor>(ex), token, allocator_arg_t(),
+ static_cast<StackAllocator&&>(stack_allocator),
+ static_cast<F&&>(function));
+}
+
+template <typename ExecutionContext, typename StackAllocator, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<
+ typename ExecutionContext::executor_type>)>>::type) CompletionToken>
+inline auto spawn(ExecutionContext& ctx, allocator_arg_t,
+ StackAllocator&& stack_allocator, F&& function, CompletionToken&& token,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ >)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<
+ typename ExecutionContext::executor_type>)>>::type>(
+ declval<detail::initiate_spawn<
+ typename ExecutionContext::executor_type>>(),
+ token, allocator_arg_t(),
+ static_cast<StackAllocator&&>(stack_allocator),
+ static_cast<F&&>(function)))
+{
+ return (spawn)(ctx.get_executor(), allocator_arg_t(),
+ static_cast<StackAllocator&&>(stack_allocator),
+ static_cast<F&&>(function), static_cast<CompletionToken&&>(token));
+}
+
+template <typename Executor, typename StackAllocator, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type) CompletionToken>
+inline auto spawn(const basic_yield_context<Executor>& ctx, allocator_arg_t,
+ StackAllocator&& stack_allocator, F&& function, CompletionToken&& token,
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ >)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type>(
+ declval<detail::initiate_spawn<Executor>>(), token,
+ allocator_arg_t(), static_cast<StackAllocator&&>(stack_allocator),
+ static_cast<F&&>(function)))
+{
+ return (spawn)(ctx.get_executor(), allocator_arg_t(),
+ static_cast<StackAllocator&&>(stack_allocator),
+ static_cast<F&&>(function), static_cast<CompletionToken&&>(token));
+}
+
+#endif // defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+
+#if defined(ASIO_HAS_BOOST_COROUTINE)
+
+namespace detail {
+
+template <typename Executor, typename Function, typename Handler>
+class old_spawn_entry_point
+{
+public:
+ template <typename F, typename H>
+ old_spawn_entry_point(const Executor& ex, F&& f, H&& h)
+ : executor_(ex),
+ function_(static_cast<F&&>(f)),
+ handler_(static_cast<H&&>(h))
+ {
+ }
+
+ void operator()(spawned_thread_base* spawned_thread)
+ {
+ const basic_yield_context<Executor> yield(spawned_thread, executor_);
+ this->call(yield,
+ void_type<result_of_t<Function(basic_yield_context<Executor>)>>());
+ }
+
+private:
+ void call(const basic_yield_context<Executor>& yield, void_type<void>)
+ {
+ function_(yield);
+ static_cast<Handler&&>(handler_)();
+ }
+
+ template <typename T>
+ void call(const basic_yield_context<Executor>& yield, void_type<T>)
+ {
+ static_cast<Handler&&>(handler_)(function_(yield));
+ }
+
+ Executor executor_;
+ Function function_;
+ Handler handler_;
+};
+
+inline void default_spawn_handler() {}
+
+} // namespace detail
+
+template <typename Function>
+inline void spawn(Function&& function,
+ const boost::coroutines::attributes& attributes)
+{
+ associated_executor_t<decay_t<Function>> ex(
+ (get_associated_executor)(function));
+
+ asio::spawn(ex, static_cast<Function&&>(function), attributes);
+}
+
+template <typename Handler, typename Function>
+void spawn(Handler&& handler, Function&& function,
+ const boost::coroutines::attributes& attributes,
+ constraint_t<
+ !is_executor<decay_t<Handler>>::value &&
+ !execution::is_executor<decay_t<Handler>>::value &&
+ !is_convertible<Handler&, execution_context&>::value>)
+{
+ typedef associated_executor_t<decay_t<Handler>> executor_type;
+ executor_type ex((get_associated_executor)(handler));
+
+ (dispatch)(ex,
+ detail::spawned_thread_resumer(
+ detail::spawned_coroutine_thread::spawn(
+ detail::old_spawn_entry_point<executor_type,
+ decay_t<Function>, void (*)()>(
+ ex, static_cast<Function&&>(function),
+ &detail::default_spawn_handler), attributes)));
+}
+
+template <typename Executor, typename Function>
+void spawn(basic_yield_context<Executor> ctx, Function&& function,
+ const boost::coroutines::attributes& attributes)
+{
+ (dispatch)(ctx.get_executor(),
+ detail::spawned_thread_resumer(
+ detail::spawned_coroutine_thread::spawn(
+ detail::old_spawn_entry_point<Executor,
+ decay_t<Function>, void (*)()>(
+ ctx.get_executor(), static_cast<Function&&>(function),
+ &detail::default_spawn_handler), attributes)));
+}
+
+template <typename Function, typename Executor>
+inline void spawn(const Executor& ex, Function&& function,
+ const boost::coroutines::attributes& attributes,
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ >)
+{
+ asio::spawn(asio::strand<Executor>(ex),
+ static_cast<Function&&>(function), attributes);
+}
+
+template <typename Function, typename Executor>
+inline void spawn(const strand<Executor>& ex, Function&& function,
+ const boost::coroutines::attributes& attributes)
+{
+ asio::spawn(asio::bind_executor(
+ ex, &detail::default_spawn_handler),
+ static_cast<Function&&>(function), attributes);
+}
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Function>
+inline void spawn(const asio::io_context::strand& s, Function&& function,
+ const boost::coroutines::attributes& attributes)
+{
+ asio::spawn(asio::bind_executor(
+ s, &detail::default_spawn_handler),
+ static_cast<Function&&>(function), attributes);
+}
+
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+template <typename Function, typename ExecutionContext>
+inline void spawn(ExecutionContext& ctx, Function&& function,
+ const boost::coroutines::attributes& attributes,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ >)
+{
+ asio::spawn(ctx.get_executor(),
+ static_cast<Function&&>(function), attributes);
+}
+
+#endif // defined(ASIO_HAS_BOOST_COROUTINE)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_SPAWN_HPP
diff --git a/3rdparty/asio/include/asio/impl/src.hpp b/3rdparty/asio/include/asio/impl/src.hpp
new file mode 100644
index 00000000000..28396195b06
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/src.hpp
@@ -0,0 +1,94 @@
+//
+// impl/src.hpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/any_completion_executor.ipp"
+#include "asio/impl/any_io_executor.ipp"
+#include "asio/impl/cancellation_signal.ipp"
+#include "asio/impl/connect_pipe.ipp"
+#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/io_context.ipp"
+#include "asio/impl/multiple_exceptions.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/io_uring_descriptor_service.ipp"
+#include "asio/detail/impl/io_uring_file_service.ipp"
+#include "asio/detail/impl/io_uring_socket_service_base.ipp"
+#include "asio/detail/impl/io_uring_service.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_serial_port_service.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_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/thread_context.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_file_service.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/execution/impl/bad_executor.ipp"
+#include "asio/experimental/impl/channel_error.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/3rdparty/asio/include/asio/impl/system_context.hpp b/3rdparty/asio/include/asio/impl/system_context.hpp
new file mode 100644
index 00000000000..34b5a3a0659
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/system_context.hpp
@@ -0,0 +1,34 @@
+//
+// impl/system_context.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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() noexcept
+{
+ return system_executor();
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_SYSTEM_CONTEXT_HPP
diff --git a/3rdparty/asio/include/asio/impl/system_context.ipp b/3rdparty/asio/include/asio/impl/system_context.ipp
new file mode 100644
index 00000000000..95fda4804da
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/system_context.ipp
@@ -0,0 +1,92 @@
+//
+// impl/system_context.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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()()
+ {
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+ {
+#endif// !defined(ASIO_NO_EXCEPTIONS)
+ asio::error_code ec;
+ scheduler_->run(ec);
+#if !defined(ASIO_NO_EXCEPTIONS)
+ }
+ catch (...)
+ {
+ std::terminate();
+ }
+#endif// !defined(ASIO_NO_EXCEPTIONS)
+ }
+};
+
+system_context::system_context()
+ : scheduler_(add_scheduler(new detail::scheduler(*this, 0, false)))
+{
+ scheduler_.work_started();
+
+ thread_function f = { &scheduler_ };
+ num_threads_ = detail::thread::hardware_concurrency() * 2;
+ num_threads_ = num_threads_ ? num_threads_ : 2;
+ threads_.create_threads(f, num_threads_);
+}
+
+system_context::~system_context()
+{
+ scheduler_.work_finished();
+ scheduler_.stop();
+ threads_.join();
+}
+
+void system_context::stop()
+{
+ scheduler_.stop();
+}
+
+bool system_context::stopped() const noexcept
+{
+ return scheduler_.stopped();
+}
+
+void system_context::join()
+{
+ scheduler_.work_finished();
+ threads_.join();
+}
+
+detail::scheduler& system_context::add_scheduler(detail::scheduler* s)
+{
+ detail::scoped_ptr<detail::scheduler> scoped_impl(s);
+ asio::add_service<detail::scheduler>(*this, scoped_impl.get());
+ return *scoped_impl.release();
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_SYSTEM_CONTEXT_IPP
diff --git a/3rdparty/asio/include/asio/impl/system_executor.hpp b/3rdparty/asio/include/asio/impl/system_executor.hpp
new file mode 100644
index 00000000000..099b2d63ef2
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/system_executor.hpp
@@ -0,0 +1,179 @@
+//
+// impl/system_executor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/type_traits.hpp"
+#include "asio/system_context.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+template <typename Blocking, typename Relationship, typename Allocator>
+inline system_context&
+basic_system_executor<Blocking, Relationship, Allocator>::query(
+ execution::context_t) noexcept
+{
+ return detail::global<system_context>();
+}
+
+template <typename Blocking, typename Relationship, typename Allocator>
+inline std::size_t
+basic_system_executor<Blocking, Relationship, Allocator>::query(
+ execution::occupancy_t) const noexcept
+{
+ return detail::global<system_context>().num_threads_;
+}
+
+template <typename Blocking, typename Relationship, typename Allocator>
+template <typename Function>
+inline void
+basic_system_executor<Blocking, Relationship, Allocator>::do_execute(
+ Function&& f, execution::blocking_t::possibly_t) const
+{
+ // Obtain a non-const instance of the function.
+ detail::non_const_lvalue<Function> f2(f);
+
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+ {
+#endif// !defined(ASIO_NO_EXCEPTIONS)
+ detail::fenced_block b(detail::fenced_block::full);
+ static_cast<decay_t<Function>&&>(f2.value)();
+#if !defined(ASIO_NO_EXCEPTIONS)
+ }
+ catch (...)
+ {
+ std::terminate();
+ }
+#endif// !defined(ASIO_NO_EXCEPTIONS)
+}
+
+template <typename Blocking, typename Relationship, typename Allocator>
+template <typename Function>
+inline void
+basic_system_executor<Blocking, Relationship, Allocator>::do_execute(
+ Function&& f, execution::blocking_t::always_t) const
+{
+ // Obtain a non-const instance of the function.
+ detail::non_const_lvalue<Function> f2(f);
+
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+ {
+#endif// !defined(ASIO_NO_EXCEPTIONS)
+ detail::fenced_block b(detail::fenced_block::full);
+ static_cast<decay_t<Function>&&>(f2.value)();
+#if !defined(ASIO_NO_EXCEPTIONS)
+ }
+ catch (...)
+ {
+ std::terminate();
+ }
+#endif// !defined(ASIO_NO_EXCEPTIONS)
+}
+
+template <typename Blocking, typename Relationship, typename Allocator>
+template <typename Function>
+void basic_system_executor<Blocking, Relationship, Allocator>::do_execute(
+ Function&& f, execution::blocking_t::never_t) const
+{
+ system_context& ctx = detail::global<system_context>();
+
+ // Allocate and construct an operation to wrap the function.
+ typedef detail::executor_op<decay_t<Function>, Allocator> op;
+ typename op::ptr p = { detail::addressof(allocator_),
+ op::ptr::allocate(allocator_), 0 };
+ p.p = new (p.v) op(static_cast<Function&&>(f), allocator_);
+
+ if (is_same<Relationship, execution::relationship_t::continuation_t>::value)
+ {
+ ASIO_HANDLER_CREATION((ctx, *p.p,
+ "system_executor", &ctx, 0, "execute(blk=never,rel=cont)"));
+ }
+ else
+ {
+ ASIO_HANDLER_CREATION((ctx, *p.p,
+ "system_executor", &ctx, 0, "execute(blk=never,rel=fork)"));
+ }
+
+ ctx.scheduler_.post_immediate_completion(p.p,
+ is_same<Relationship, execution::relationship_t::continuation_t>::value);
+ p.v = p.p = 0;
+}
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+template <typename Blocking, typename Relationship, typename Allocator>
+inline system_context& basic_system_executor<
+ Blocking, Relationship, Allocator>::context() const noexcept
+{
+ return detail::global<system_context>();
+}
+
+template <typename Blocking, typename Relationship, typename Allocator>
+template <typename Function, typename OtherAllocator>
+void basic_system_executor<Blocking, Relationship, Allocator>::dispatch(
+ Function&& f, const OtherAllocator&) const
+{
+ decay_t<Function>(static_cast<Function&&>(f))();
+}
+
+template <typename Blocking, typename Relationship, typename Allocator>
+template <typename Function, typename OtherAllocator>
+void basic_system_executor<Blocking, Relationship, Allocator>::post(
+ Function&& f, const OtherAllocator& a) const
+{
+ system_context& ctx = detail::global<system_context>();
+
+ // Allocate and construct an operation to wrap the function.
+ typedef detail::executor_op<decay_t<Function>, OtherAllocator> op;
+ typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
+ p.p = new (p.v) op(static_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 <typename Blocking, typename Relationship, typename Allocator>
+template <typename Function, typename OtherAllocator>
+void basic_system_executor<Blocking, Relationship, Allocator>::defer(
+ Function&& f, const OtherAllocator& a) const
+{
+ system_context& ctx = detail::global<system_context>();
+
+ // Allocate and construct an operation to wrap the function.
+ typedef detail::executor_op<decay_t<Function>, OtherAllocator> op;
+ typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
+ p.p = new (p.v) op(static_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;
+}
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_SYSTEM_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/impl/thread_pool.hpp b/3rdparty/asio/include/asio/impl/thread_pool.hpp
new file mode 100644
index 00000000000..3aed249781a
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/thread_pool.hpp
@@ -0,0 +1,277 @@
+//
+// impl/thread_pool.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/blocking_executor_op.hpp"
+#include "asio/detail/executor_op.hpp"
+#include "asio/detail/fenced_block.hpp"
+#include "asio/detail/non_const_lvalue.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() noexcept
+{
+ return executor_type(*this);
+}
+
+inline thread_pool::executor_type
+thread_pool::executor() noexcept
+{
+ return executor_type(*this);
+}
+
+template <typename Allocator, unsigned int Bits>
+thread_pool::basic_executor_type<Allocator, Bits>&
+thread_pool::basic_executor_type<Allocator, Bits>::operator=(
+ const basic_executor_type& other) noexcept
+{
+ if (this != &other)
+ {
+ thread_pool* old_thread_pool = pool_;
+ pool_ = other.pool_;
+ allocator_ = other.allocator_;
+ bits_ = other.bits_;
+ if (Bits & outstanding_work_tracked)
+ {
+ if (pool_)
+ pool_->scheduler_.work_started();
+ if (old_thread_pool)
+ old_thread_pool->scheduler_.work_finished();
+ }
+ }
+ return *this;
+}
+
+template <typename Allocator, unsigned int Bits>
+thread_pool::basic_executor_type<Allocator, Bits>&
+thread_pool::basic_executor_type<Allocator, Bits>::operator=(
+ basic_executor_type&& other) noexcept
+{
+ if (this != &other)
+ {
+ thread_pool* old_thread_pool = pool_;
+ pool_ = other.pool_;
+ allocator_ = std::move(other.allocator_);
+ bits_ = other.bits_;
+ if (Bits & outstanding_work_tracked)
+ {
+ other.pool_ = 0;
+ if (old_thread_pool)
+ old_thread_pool->scheduler_.work_finished();
+ }
+ }
+ return *this;
+}
+
+template <typename Allocator, unsigned int Bits>
+inline bool thread_pool::basic_executor_type<Allocator,
+ Bits>::running_in_this_thread() const noexcept
+{
+ return pool_->scheduler_.can_dispatch();
+}
+
+template <typename Allocator, unsigned int Bits>
+template <typename Function>
+void thread_pool::basic_executor_type<Allocator,
+ Bits>::do_execute(Function&& f, false_type) const
+{
+ typedef decay_t<Function> function_type;
+
+ // Invoke immediately if the blocking.possibly property is enabled and we are
+ // already inside the thread pool.
+ if ((bits_ & blocking_never) == 0 && pool_->scheduler_.can_dispatch())
+ {
+ // Make a local, non-const copy of the function.
+ function_type tmp(static_cast<Function&&>(f));
+
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+ {
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ detail::fenced_block b(detail::fenced_block::full);
+ static_cast<function_type&&>(tmp)();
+ return;
+#if !defined(ASIO_NO_EXCEPTIONS)
+ }
+ catch (...)
+ {
+ pool_->scheduler_.capture_current_exception();
+ return;
+ }
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ }
+
+ // Allocate and construct an operation to wrap the function.
+ typedef detail::executor_op<function_type, Allocator> op;
+ typename op::ptr p = { detail::addressof(allocator_),
+ op::ptr::allocate(allocator_), 0 };
+ p.p = new (p.v) op(static_cast<Function&&>(f), allocator_);
+
+ if ((bits_ & relationship_continuation) != 0)
+ {
+ ASIO_HANDLER_CREATION((*pool_, *p.p,
+ "thread_pool", pool_, 0, "execute(blk=never,rel=cont)"));
+ }
+ else
+ {
+ ASIO_HANDLER_CREATION((*pool_, *p.p,
+ "thread_pool", pool_, 0, "execute(blk=never,rel=fork)"));
+ }
+
+ pool_->scheduler_.post_immediate_completion(p.p,
+ (bits_ & relationship_continuation) != 0);
+ p.v = p.p = 0;
+}
+
+template <typename Allocator, unsigned int Bits>
+template <typename Function>
+void thread_pool::basic_executor_type<Allocator,
+ Bits>::do_execute(Function&& f, true_type) const
+{
+ // Obtain a non-const instance of the function.
+ detail::non_const_lvalue<Function> f2(f);
+
+ // Invoke immediately if we are already inside the thread pool.
+ if (pool_->scheduler_.can_dispatch())
+ {
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+ {
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ detail::fenced_block b(detail::fenced_block::full);
+ static_cast<decay_t<Function>&&>(f2.value)();
+ return;
+#if !defined(ASIO_NO_EXCEPTIONS)
+ }
+ catch (...)
+ {
+ std::terminate();
+ }
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ }
+
+ // Construct an operation to wrap the function.
+ typedef decay_t<Function> function_type;
+ detail::blocking_executor_op<function_type> op(f2.value);
+
+ ASIO_HANDLER_CREATION((*pool_, op,
+ "thread_pool", pool_, 0, "execute(blk=always)"));
+
+ pool_->scheduler_.post_immediate_completion(&op, false);
+ op.wait();
+}
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+template <typename Allocator, unsigned int Bits>
+inline thread_pool& thread_pool::basic_executor_type<
+ Allocator, Bits>::context() const noexcept
+{
+ return *pool_;
+}
+
+template <typename Allocator, unsigned int Bits>
+inline void thread_pool::basic_executor_type<Allocator,
+ Bits>::on_work_started() const noexcept
+{
+ pool_->scheduler_.work_started();
+}
+
+template <typename Allocator, unsigned int Bits>
+inline void thread_pool::basic_executor_type<Allocator,
+ Bits>::on_work_finished() const noexcept
+{
+ pool_->scheduler_.work_finished();
+}
+
+template <typename Allocator, unsigned int Bits>
+template <typename Function, typename OtherAllocator>
+void thread_pool::basic_executor_type<Allocator, Bits>::dispatch(
+ Function&& f, const OtherAllocator& a) const
+{
+ typedef decay_t<Function> 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(static_cast<Function&&>(f));
+
+ detail::fenced_block b(detail::fenced_block::full);
+ static_cast<function_type&&>(tmp)();
+ return;
+ }
+
+ // Allocate and construct an operation to wrap the function.
+ typedef detail::executor_op<function_type, OtherAllocator> op;
+ typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
+ p.p = new (p.v) op(static_cast<Function&&>(f), a);
+
+ ASIO_HANDLER_CREATION((*pool_, *p.p,
+ "thread_pool", pool_, 0, "dispatch"));
+
+ pool_->scheduler_.post_immediate_completion(p.p, false);
+ p.v = p.p = 0;
+}
+
+template <typename Allocator, unsigned int Bits>
+template <typename Function, typename OtherAllocator>
+void thread_pool::basic_executor_type<Allocator, Bits>::post(
+ Function&& f, const OtherAllocator& a) const
+{
+ typedef decay_t<Function> function_type;
+
+ // Allocate and construct an operation to wrap the function.
+ typedef detail::executor_op<function_type, OtherAllocator> op;
+ typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
+ p.p = new (p.v) op(static_cast<Function&&>(f), a);
+
+ ASIO_HANDLER_CREATION((*pool_, *p.p,
+ "thread_pool", pool_, 0, "post"));
+
+ pool_->scheduler_.post_immediate_completion(p.p, false);
+ p.v = p.p = 0;
+}
+
+template <typename Allocator, unsigned int Bits>
+template <typename Function, typename OtherAllocator>
+void thread_pool::basic_executor_type<Allocator, Bits>::defer(
+ Function&& f, const OtherAllocator& a) const
+{
+ typedef decay_t<Function> function_type;
+
+ // Allocate and construct an operation to wrap the function.
+ typedef detail::executor_op<function_type, OtherAllocator> op;
+ typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 };
+ p.p = new (p.v) op(static_cast<Function&&>(f), a);
+
+ ASIO_HANDLER_CREATION((*pool_, *p.p,
+ "thread_pool", pool_, 0, "defer"));
+
+ pool_->scheduler_.post_immediate_completion(p.p, true);
+ p.v = p.p = 0;
+}
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_THREAD_POOL_HPP
diff --git a/3rdparty/asio/include/asio/impl/thread_pool.ipp b/3rdparty/asio/include/asio/impl/thread_pool.ipp
new file mode 100644
index 00000000000..3f327e4610b
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/thread_pool.ipp
@@ -0,0 +1,142 @@
+//
+// impl/thread_pool.ipp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <stdexcept>
+#include "asio/thread_pool.hpp"
+#include "asio/detail/throw_exception.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+struct thread_pool::thread_function
+{
+ detail::scheduler* scheduler_;
+
+ void operator()()
+ {
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+ {
+#endif// !defined(ASIO_NO_EXCEPTIONS)
+ asio::error_code ec;
+ scheduler_->run(ec);
+#if !defined(ASIO_NO_EXCEPTIONS)
+ }
+ catch (...)
+ {
+ std::terminate();
+ }
+#endif// !defined(ASIO_NO_EXCEPTIONS)
+ }
+};
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+namespace detail {
+
+inline long default_thread_pool_size()
+{
+ std::size_t num_threads = thread::hardware_concurrency() * 2;
+ num_threads = num_threads == 0 ? 2 : num_threads;
+ return static_cast<long>(num_threads);
+}
+
+} // namespace detail
+
+thread_pool::thread_pool()
+ : scheduler_(add_scheduler(new detail::scheduler(*this, 0, false))),
+ num_threads_(detail::default_thread_pool_size())
+{
+ scheduler_.work_started();
+
+ thread_function f = { &scheduler_ };
+ threads_.create_threads(f, static_cast<std::size_t>(num_threads_));
+}
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+namespace detail {
+
+inline long clamp_thread_pool_size(std::size_t n)
+{
+ if (n > 0x7FFFFFFF)
+ {
+ std::out_of_range ex("thread pool size");
+ asio::detail::throw_exception(ex);
+ }
+ return static_cast<long>(n & 0x7FFFFFFF);
+}
+
+} // namespace detail
+
+thread_pool::thread_pool(std::size_t num_threads)
+ : scheduler_(add_scheduler(new detail::scheduler(
+ *this, num_threads == 1 ? 1 : 0, false))),
+ num_threads_(detail::clamp_thread_pool_size(num_threads))
+{
+ scheduler_.work_started();
+
+ thread_function f = { &scheduler_ };
+ threads_.create_threads(f, static_cast<std::size_t>(num_threads_));
+}
+
+thread_pool::~thread_pool()
+{
+ stop();
+ join();
+ shutdown();
+}
+
+void thread_pool::stop()
+{
+ scheduler_.stop();
+}
+
+void thread_pool::attach()
+{
+ ++num_threads_;
+ thread_function f = { &scheduler_ };
+ f();
+}
+
+void thread_pool::join()
+{
+ if (num_threads_)
+ scheduler_.work_finished();
+
+ if (!threads_.empty())
+ threads_.join();
+}
+
+detail::scheduler& thread_pool::add_scheduler(detail::scheduler* s)
+{
+ detail::scoped_ptr<detail::scheduler> scoped_impl(s);
+ asio::add_service<detail::scheduler>(*this, scoped_impl.get());
+ return *scoped_impl.release();
+}
+
+void thread_pool::wait()
+{
+ scheduler_.work_finished();
+ threads_.join();
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_THREAD_POOL_IPP
diff --git a/3rdparty/asio/include/asio/impl/use_awaitable.hpp b/3rdparty/asio/include/asio/impl/use_awaitable.hpp
new file mode 100644
index 00000000000..3cd95165c4f
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/use_awaitable.hpp
@@ -0,0 +1,301 @@
+//
+// impl/use_awaitable.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_AWAITABLE_HPP
+#define ASIO_IMPL_USE_AWAITABLE_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/cancellation_signal.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Executor, typename T>
+class awaitable_handler_base
+ : public awaitable_thread<Executor>
+{
+public:
+ typedef void result_type;
+ typedef awaitable<T, Executor> awaitable_type;
+
+ // Construct from the entry point of a new thread of execution.
+ awaitable_handler_base(awaitable<awaitable_thread_entry_point, Executor> a,
+ const Executor& ex, cancellation_slot pcs, cancellation_state cs)
+ : awaitable_thread<Executor>(std::move(a), ex, pcs, cs)
+ {
+ }
+
+ // Transfer ownership from another awaitable_thread.
+ explicit awaitable_handler_base(awaitable_thread<Executor>* h)
+ : awaitable_thread<Executor>(std::move(*h))
+ {
+ }
+
+protected:
+ awaitable_frame<T, Executor>* frame() noexcept
+ {
+ return static_cast<awaitable_frame<T, Executor>*>(
+ this->entry_point()->top_of_stack_);
+ }
+};
+
+template <typename, typename...>
+class awaitable_handler;
+
+template <typename Executor>
+class awaitable_handler<Executor>
+ : public awaitable_handler_base<Executor, void>
+{
+public:
+ using awaitable_handler_base<Executor, void>::awaitable_handler_base;
+
+ void operator()()
+ {
+ this->frame()->attach_thread(this);
+ this->frame()->return_void();
+ this->frame()->clear_cancellation_slot();
+ this->frame()->pop_frame();
+ this->pump();
+ }
+};
+
+template <typename Executor>
+class awaitable_handler<Executor, asio::error_code>
+ : public awaitable_handler_base<Executor, void>
+{
+public:
+ using awaitable_handler_base<Executor, void>::awaitable_handler_base;
+
+ void operator()(const asio::error_code& ec)
+ {
+ this->frame()->attach_thread(this);
+ if (ec)
+ this->frame()->set_error(ec);
+ else
+ this->frame()->return_void();
+ this->frame()->clear_cancellation_slot();
+ this->frame()->pop_frame();
+ this->pump();
+ }
+};
+
+template <typename Executor>
+class awaitable_handler<Executor, std::exception_ptr>
+ : public awaitable_handler_base<Executor, void>
+{
+public:
+ using awaitable_handler_base<Executor, void>::awaitable_handler_base;
+
+ void operator()(std::exception_ptr ex)
+ {
+ this->frame()->attach_thread(this);
+ if (ex)
+ this->frame()->set_except(ex);
+ else
+ this->frame()->return_void();
+ this->frame()->clear_cancellation_slot();
+ this->frame()->pop_frame();
+ this->pump();
+ }
+};
+
+template <typename Executor, typename T>
+class awaitable_handler<Executor, T>
+ : public awaitable_handler_base<Executor, T>
+{
+public:
+ using awaitable_handler_base<Executor, T>::awaitable_handler_base;
+
+ template <typename Arg>
+ void operator()(Arg&& arg)
+ {
+ this->frame()->attach_thread(this);
+ this->frame()->return_value(std::forward<Arg>(arg));
+ this->frame()->clear_cancellation_slot();
+ this->frame()->pop_frame();
+ this->pump();
+ }
+};
+
+template <typename Executor, typename T>
+class awaitable_handler<Executor, asio::error_code, T>
+ : public awaitable_handler_base<Executor, T>
+{
+public:
+ using awaitable_handler_base<Executor, T>::awaitable_handler_base;
+
+ template <typename Arg>
+ void operator()(const asio::error_code& ec, Arg&& arg)
+ {
+ this->frame()->attach_thread(this);
+ if (ec)
+ this->frame()->set_error(ec);
+ else
+ this->frame()->return_value(std::forward<Arg>(arg));
+ this->frame()->clear_cancellation_slot();
+ this->frame()->pop_frame();
+ this->pump();
+ }
+};
+
+template <typename Executor, typename T>
+class awaitable_handler<Executor, std::exception_ptr, T>
+ : public awaitable_handler_base<Executor, T>
+{
+public:
+ using awaitable_handler_base<Executor, T>::awaitable_handler_base;
+
+ template <typename Arg>
+ void operator()(std::exception_ptr ex, Arg&& arg)
+ {
+ this->frame()->attach_thread(this);
+ if (ex)
+ this->frame()->set_except(ex);
+ else
+ this->frame()->return_value(std::forward<Arg>(arg));
+ this->frame()->clear_cancellation_slot();
+ this->frame()->pop_frame();
+ this->pump();
+ }
+};
+
+template <typename Executor, typename... Ts>
+class awaitable_handler
+ : public awaitable_handler_base<Executor, std::tuple<Ts...>>
+{
+public:
+ using awaitable_handler_base<Executor,
+ std::tuple<Ts...>>::awaitable_handler_base;
+
+ template <typename... Args>
+ void operator()(Args&&... args)
+ {
+ this->frame()->attach_thread(this);
+ this->frame()->return_values(std::forward<Args>(args)...);
+ this->frame()->clear_cancellation_slot();
+ this->frame()->pop_frame();
+ this->pump();
+ }
+};
+
+template <typename Executor, typename... Ts>
+class awaitable_handler<Executor, asio::error_code, Ts...>
+ : public awaitable_handler_base<Executor, std::tuple<Ts...>>
+{
+public:
+ using awaitable_handler_base<Executor,
+ std::tuple<Ts...>>::awaitable_handler_base;
+
+ template <typename... Args>
+ void operator()(const asio::error_code& ec, Args&&... args)
+ {
+ this->frame()->attach_thread(this);
+ if (ec)
+ this->frame()->set_error(ec);
+ else
+ this->frame()->return_values(std::forward<Args>(args)...);
+ this->frame()->clear_cancellation_slot();
+ this->frame()->pop_frame();
+ this->pump();
+ }
+};
+
+template <typename Executor, typename... Ts>
+class awaitable_handler<Executor, std::exception_ptr, Ts...>
+ : public awaitable_handler_base<Executor, std::tuple<Ts...>>
+{
+public:
+ using awaitable_handler_base<Executor,
+ std::tuple<Ts...>>::awaitable_handler_base;
+
+ template <typename... Args>
+ void operator()(std::exception_ptr ex, Args&&... args)
+ {
+ this->frame()->attach_thread(this);
+ if (ex)
+ this->frame()->set_except(ex);
+ else
+ this->frame()->return_values(std::forward<Args>(args)...);
+ this->frame()->clear_cancellation_slot();
+ this->frame()->pop_frame();
+ this->pump();
+ }
+};
+
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+#if defined(_MSC_VER)
+template <typename T>
+T dummy_return()
+{
+ return std::move(*static_cast<T*>(nullptr));
+}
+
+template <>
+inline void dummy_return()
+{
+}
+#endif // defined(_MSC_VER)
+
+template <typename Executor, typename R, typename... Args>
+class async_result<use_awaitable_t<Executor>, R(Args...)>
+{
+public:
+ typedef typename detail::awaitable_handler<
+ Executor, decay_t<Args>...> handler_type;
+ typedef typename handler_type::awaitable_type return_type;
+
+ template <typename Initiation, typename... InitArgs>
+#if defined(__APPLE_CC__) && (__clang_major__ == 13)
+ __attribute__((noinline))
+#endif // defined(__APPLE_CC__) && (__clang_major__ == 13)
+ static handler_type* do_init(
+ detail::awaitable_frame_base<Executor>* frame, Initiation& initiation,
+ use_awaitable_t<Executor> u, InitArgs&... args)
+ {
+ (void)u;
+ ASIO_HANDLER_LOCATION((u.file_name_, u.line_, u.function_name_));
+ handler_type handler(frame->detach_thread());
+ std::move(initiation)(std::move(handler), std::move(args)...);
+ return nullptr;
+ }
+
+ template <typename Initiation, typename... InitArgs>
+ static return_type initiate(Initiation initiation,
+ use_awaitable_t<Executor> u, InitArgs... args)
+ {
+ co_await [&] (auto* frame)
+ {
+ return do_init(frame, initiation, u, args...);
+ };
+
+ for (;;) {} // Never reached.
+#if defined(_MSC_VER)
+ co_return dummy_return<typename return_type::value_type>();
+#endif // defined(_MSC_VER)
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_USE_AWAITABLE_HPP
diff --git a/3rdparty/asio/include/asio/impl/use_future.hpp b/3rdparty/asio/include/asio/impl/use_future.hpp
new file mode 100644
index 00000000000..579b93f5f30
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/use_future.hpp
@@ -0,0 +1,707 @@
+//
+// impl/use_future.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <tuple>
+#include "asio/async_result.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/dispatch.hpp"
+#include "asio/error_code.hpp"
+#include "asio/execution.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 {
+
+template <typename T, typename F, typename... Args>
+inline void promise_invoke_and_set(std::promise<T>& p,
+ F& f, Args&&... args)
+{
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ {
+ p.set_value(f(static_cast<Args&&>(args)...));
+ }
+#if !defined(ASIO_NO_EXCEPTIONS)
+ catch (...)
+ {
+ p.set_exception(std::current_exception());
+ }
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+}
+
+template <typename F, typename... Args>
+inline void promise_invoke_and_set(std::promise<void>& p,
+ F& f, Args&&... args)
+{
+#if !defined(ASIO_NO_EXCEPTIONS)
+ try
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+ {
+ f(static_cast<Args&&>(args)...);
+ p.set_value();
+ }
+#if !defined(ASIO_NO_EXCEPTIONS)
+ catch (...)
+ {
+ p.set_exception(std::current_exception());
+ }
+#endif // !defined(ASIO_NO_EXCEPTIONS)
+}
+
+// A function object adapter to invoke a nullary function object and capture
+// any exception thrown into a promise.
+template <typename T, typename F>
+class promise_invoker
+{
+public:
+ promise_invoker(const shared_ptr<std::promise<T>>& p,
+ F&& f)
+ : p_(p), f_(static_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<std::promise<T>> p_;
+ decay_t<F> 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 <typename T, typename Blocking = execution::blocking_t::possibly_t>
+class promise_executor
+{
+public:
+ explicit promise_executor(const shared_ptr<std::promise<T>>& p)
+ : p_(p)
+ {
+ }
+
+ execution_context& query(execution::context_t) const noexcept
+ {
+ return asio::query(system_executor(), execution::context);
+ }
+
+ static constexpr Blocking query(execution::blocking_t)
+ {
+ return Blocking();
+ }
+
+ promise_executor<T, execution::blocking_t::possibly_t>
+ require(execution::blocking_t::possibly_t) const
+ {
+ return promise_executor<T, execution::blocking_t::possibly_t>(p_);
+ }
+
+ promise_executor<T, execution::blocking_t::never_t>
+ require(execution::blocking_t::never_t) const
+ {
+ return promise_executor<T, execution::blocking_t::never_t>(p_);
+ }
+
+ template <typename F>
+ void execute(F&& f) const
+ {
+ asio::require(system_executor(), Blocking()).execute(
+ promise_invoker<T, F>(p_, static_cast<F&&>(f)));
+ }
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+ execution_context& context() const noexcept
+ {
+ return system_executor().context();
+ }
+
+ void on_work_started() const noexcept {}
+ void on_work_finished() const noexcept {}
+
+ template <typename F, typename A>
+ void dispatch(F&& f, const A&) const
+ {
+ promise_invoker<T, F>(p_, static_cast<F&&>(f))();
+ }
+
+ template <typename F, typename A>
+ void post(F&& f, const A& a) const
+ {
+ system_executor().post(
+ promise_invoker<T, F>(p_, static_cast<F&&>(f)), a);
+ }
+
+ template <typename F, typename A>
+ void defer(F&& f, const A& a) const
+ {
+ system_executor().defer(
+ promise_invoker<T, F>(p_, static_cast<F&&>(f)), a);
+ }
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+ friend bool operator==(const promise_executor& a,
+ const promise_executor& b) noexcept
+ {
+ return a.p_ == b.p_;
+ }
+
+ friend bool operator!=(const promise_executor& a,
+ const promise_executor& b) noexcept
+ {
+ return a.p_ != b.p_;
+ }
+
+private:
+ shared_ptr<std::promise<T>> p_;
+};
+
+// The base class for all completion handlers that create promises.
+template <typename T>
+class promise_creator
+{
+public:
+ typedef promise_executor<T> executor_type;
+
+ executor_type get_executor() const noexcept
+ {
+ return executor_type(p_);
+ }
+
+ typedef std::future<T> future_type;
+
+ future_type get_future()
+ {
+ return p_->get_future();
+ }
+
+protected:
+ template <typename Allocator>
+ void create_promise(const Allocator& a)
+ {
+ ASIO_REBIND_ALLOC(Allocator, char) b(a);
+ p_ = std::allocate_shared<std::promise<T>>(b, std::allocator_arg, b);
+ }
+
+ shared_ptr<std::promise<T>> p_;
+};
+
+// For completion signature void().
+class promise_handler_0
+ : public promise_creator<void>
+{
+public:
+ void operator()()
+ {
+ this->p_->set_value();
+ }
+};
+
+// For completion signature void(error_code).
+class promise_handler_ec_0
+ : public promise_creator<void>
+{
+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<void>
+{
+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 <typename T>
+class promise_handler_1
+ : public promise_creator<T>
+{
+public:
+ template <typename Arg>
+ void operator()(Arg&& arg)
+ {
+ this->p_->set_value(static_cast<Arg&&>(arg));
+ }
+};
+
+// For completion signature void(error_code, T).
+template <typename T>
+class promise_handler_ec_1
+ : public promise_creator<T>
+{
+public:
+ template <typename Arg>
+ void operator()(const asio::error_code& ec,
+ Arg&& arg)
+ {
+ if (ec)
+ {
+ this->p_->set_exception(
+ std::make_exception_ptr(
+ asio::system_error(ec)));
+ }
+ else
+ this->p_->set_value(static_cast<Arg&&>(arg));
+ }
+};
+
+// For completion signature void(exception_ptr, T).
+template <typename T>
+class promise_handler_ex_1
+ : public promise_creator<T>
+{
+public:
+ template <typename Arg>
+ void operator()(const std::exception_ptr& ex,
+ Arg&& arg)
+ {
+ if (ex)
+ this->p_->set_exception(ex);
+ else
+ this->p_->set_value(static_cast<Arg&&>(arg));
+ }
+};
+
+// For completion signature void(T1, ..., Tn);
+template <typename T>
+class promise_handler_n
+ : public promise_creator<T>
+{
+public:
+ template <typename... Args>
+ void operator()(Args&&... args)
+ {
+ this->p_->set_value(
+ std::forward_as_tuple(
+ static_cast<Args&&>(args)...));
+ }
+};
+
+// For completion signature void(error_code, T1, ..., Tn);
+template <typename T>
+class promise_handler_ec_n
+ : public promise_creator<T>
+{
+public:
+ template <typename... Args>
+ void operator()(const asio::error_code& ec, 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(
+ static_cast<Args&&>(args)...));
+ }
+ }
+};
+
+// For completion signature void(exception_ptr, T1, ..., Tn);
+template <typename T>
+class promise_handler_ex_n
+ : public promise_creator<T>
+{
+public:
+ template <typename... Args>
+ void operator()(const std::exception_ptr& ex,
+ Args&&... args)
+ {
+ if (ex)
+ this->p_->set_exception(ex);
+ else
+ {
+ this->p_->set_value(
+ std::forward_as_tuple(
+ static_cast<Args&&>(args)...));
+ }
+ }
+};
+
+// Helper template to choose the appropriate concrete promise handler
+// implementation based on the supplied completion signature.
+template <typename> class promise_handler_selector;
+
+template <>
+class promise_handler_selector<void()>
+ : public promise_handler_0 {};
+
+template <>
+class promise_handler_selector<void(asio::error_code)>
+ : public promise_handler_ec_0 {};
+
+template <>
+class promise_handler_selector<void(std::exception_ptr)>
+ : public promise_handler_ex_0 {};
+
+template <typename Arg>
+class promise_handler_selector<void(Arg)>
+ : public promise_handler_1<Arg> {};
+
+template <typename Arg>
+class promise_handler_selector<void(asio::error_code, Arg)>
+ : public promise_handler_ec_1<Arg> {};
+
+template <typename Arg>
+class promise_handler_selector<void(std::exception_ptr, Arg)>
+ : public promise_handler_ex_1<Arg> {};
+
+template <typename... Arg>
+class promise_handler_selector<void(Arg...)>
+ : public promise_handler_n<std::tuple<Arg...>> {};
+
+template <typename... Arg>
+class promise_handler_selector<void(asio::error_code, Arg...)>
+ : public promise_handler_ec_n<std::tuple<Arg...>> {};
+
+template <typename... Arg>
+class promise_handler_selector<void(std::exception_ptr, Arg...)>
+ : public promise_handler_ex_n<std::tuple<Arg...>> {};
+
+// Completion handlers produced from the use_future completion token, when not
+// using use_future::operator().
+template <typename Signature, typename Allocator>
+class promise_handler
+ : public promise_handler_selector<Signature>
+{
+public:
+ typedef Allocator allocator_type;
+ typedef void result_type;
+
+ promise_handler(use_future_t<Allocator> u)
+ : allocator_(u.get_allocator())
+ {
+ this->create_promise(allocator_);
+ }
+
+ allocator_type get_allocator() const noexcept
+ {
+ return allocator_;
+ }
+
+private:
+ Allocator allocator_;
+};
+
+template <typename Function>
+struct promise_function_wrapper
+{
+ explicit promise_function_wrapper(Function& f)
+ : function_(static_cast<Function&&>(f))
+ {
+ }
+
+ explicit promise_function_wrapper(const Function& f)
+ : function_(f)
+ {
+ }
+
+ void operator()()
+ {
+ function_();
+ }
+
+ Function function_;
+};
+
+// Helper base class for async_result specialisation.
+template <typename Signature, typename Allocator>
+class promise_async_result
+{
+public:
+ typedef promise_handler<Signature, Allocator> 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 static_cast<return_type&&>(future_);
+ }
+
+private:
+ return_type future_;
+};
+
+// Return value from use_future::operator().
+template <typename Function, typename Allocator>
+class packaged_token
+{
+public:
+ packaged_token(Function f, const Allocator& a)
+ : function_(static_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 <typename Function, typename Allocator, typename Result>
+class packaged_handler
+ : public promise_creator<Result>
+{
+public:
+ typedef Allocator allocator_type;
+ typedef void result_type;
+
+ packaged_handler(packaged_token<Function, Allocator> t)
+ : function_(static_cast<Function&&>(t.function_)),
+ allocator_(t.allocator_)
+ {
+ this->create_promise(allocator_);
+ }
+
+ allocator_type get_allocator() const noexcept
+ {
+ return allocator_;
+ }
+
+ template <typename... Args>
+ void operator()(Args&&... args)
+ {
+ (promise_invoke_and_set)(*this->p_,
+ function_, static_cast<Args&&>(args)...);
+ }
+
+private:
+ Function function_;
+ Allocator allocator_;
+};
+
+// Helper base class for async_result specialisation.
+template <typename Function, typename Allocator, typename Result>
+class packaged_async_result
+{
+public:
+ typedef packaged_handler<Function, Allocator, Result> 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 static_cast<return_type&&>(future_);
+ }
+
+private:
+ return_type future_;
+};
+
+} // namespace detail
+
+template <typename Allocator> template <typename Function>
+inline detail::packaged_token<decay_t<Function>, Allocator>
+use_future_t<Allocator>::operator()(Function&& f) const
+{
+ return detail::packaged_token<decay_t<Function>, Allocator>(
+ static_cast<Function&&>(f), allocator_);
+}
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <typename Allocator, typename Result, typename... Args>
+class async_result<use_future_t<Allocator>, Result(Args...)>
+ : public detail::promise_async_result<
+ void(decay_t<Args>...), Allocator>
+{
+public:
+ explicit async_result(
+ typename detail::promise_async_result<void(decay_t<Args>...),
+ Allocator>::completion_handler_type& h)
+ : detail::promise_async_result<
+ void(decay_t<Args>...), Allocator>(h)
+ {
+ }
+};
+
+template <typename Function, typename Allocator,
+ typename Result, typename... Args>
+class async_result<detail::packaged_token<Function, Allocator>, Result(Args...)>
+ : public detail::packaged_async_result<Function, Allocator,
+ result_of_t<Function(Args...)>>
+{
+public:
+ explicit async_result(
+ typename detail::packaged_async_result<Function, Allocator,
+ result_of_t<Function(Args...)>>::completion_handler_type& h)
+ : detail::packaged_async_result<Function, Allocator,
+ result_of_t<Function(Args...)>>(h)
+ {
+ }
+};
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename T, typename Blocking>
+struct equality_comparable<
+ asio::detail::promise_executor<T, Blocking>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename T, typename Blocking, typename Function>
+struct execute_member<
+ asio::detail::promise_executor<T, Blocking>, Function>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename T, typename Blocking, typename Property>
+struct query_static_constexpr_member<
+ asio::detail::promise_executor<T, Blocking>,
+ Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::blocking_t
+ >::value
+ >::type
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef Blocking result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return Blocking();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename T, typename Blocking>
+struct query_member<
+ asio::detail::promise_executor<T, Blocking>,
+ execution::context_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::system_context& result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename T, typename Blocking>
+struct require_member<
+ asio::detail::promise_executor<T, Blocking>,
+ execution::blocking_t::possibly_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::detail::promise_executor<T,
+ execution::blocking_t::possibly_t> result_type;
+};
+
+template <typename T, typename Blocking>
+struct require_member<
+ asio::detail::promise_executor<T, Blocking>,
+ execution::blocking_t::never_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::detail::promise_executor<T,
+ execution::blocking_t::never_t> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+} // namespace traits
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_USE_FUTURE_HPP
diff --git a/3rdparty/asio/include/asio/impl/write.hpp b/3rdparty/asio/include/asio/impl/write.hpp
new file mode 100644
index 00000000000..af2bb5544bb
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/write.hpp
@@ -0,0 +1,939 @@
+//
+// impl/write.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/associator.hpp"
+#include "asio/buffer.hpp"
+#include "asio/detail/array_fwd.hpp"
+#include "asio/detail/base_from_cancellation_state.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_cont_helpers.hpp"
+#include "asio/detail/handler_tracking.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+namespace detail
+{
+ template <typename SyncWriteStream, typename ConstBufferSequence,
+ typename ConstBufferIterator, typename CompletionCondition>
+ std::size_t write(SyncWriteStream& s,
+ const ConstBufferSequence& buffers, const ConstBufferIterator&,
+ CompletionCondition completion_condition, asio::error_code& ec)
+ {
+ ec = asio::error_code();
+ asio::detail::consuming_buffers<const_buffer,
+ ConstBufferSequence, ConstBufferIterator> 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 <typename SyncWriteStream, typename ConstBufferSequence,
+ typename CompletionCondition>
+inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
+ CompletionCondition completion_condition, asio::error_code& ec,
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ >)
+{
+ return detail::write(s, buffers,
+ asio::buffer_sequence_begin(buffers),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+}
+
+template <typename SyncWriteStream, typename ConstBufferSequence>
+inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ >)
+{
+ 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 <typename SyncWriteStream, typename ConstBufferSequence>
+inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
+ asio::error_code& ec,
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ >)
+{
+ return write(s, buffers, transfer_all(), ec);
+}
+
+template <typename SyncWriteStream, typename ConstBufferSequence,
+ typename CompletionCondition>
+inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
+ CompletionCondition completion_condition,
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = write(s, buffers,
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+ asio::detail::throw_error(ec, "write");
+ return bytes_transferred;
+}
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+template <typename SyncWriteStream, typename DynamicBuffer_v1,
+ typename CompletionCondition>
+std::size_t write(SyncWriteStream& s,
+ DynamicBuffer_v1&& buffers,
+ CompletionCondition completion_condition, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ decay_t<DynamicBuffer_v1> b(
+ static_cast<DynamicBuffer_v1&&>(buffers));
+
+ std::size_t bytes_transferred = write(s, b.data(),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+ b.consume(bytes_transferred);
+ return bytes_transferred;
+}
+
+template <typename SyncWriteStream, typename DynamicBuffer_v1>
+inline std::size_t write(SyncWriteStream& s,
+ DynamicBuffer_v1&& buffers,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = write(s,
+ static_cast<DynamicBuffer_v1&&>(buffers),
+ transfer_all(), ec);
+ asio::detail::throw_error(ec, "write");
+ return bytes_transferred;
+}
+
+template <typename SyncWriteStream, typename DynamicBuffer_v1>
+inline std::size_t write(SyncWriteStream& s,
+ DynamicBuffer_v1&& buffers,
+ asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ return write(s, static_cast<DynamicBuffer_v1&&>(buffers),
+ transfer_all(), ec);
+}
+
+template <typename SyncWriteStream, typename DynamicBuffer_v1,
+ typename CompletionCondition>
+inline std::size_t write(SyncWriteStream& s,
+ DynamicBuffer_v1&& buffers,
+ CompletionCondition completion_condition,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = write(s,
+ static_cast<DynamicBuffer_v1&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+ asio::detail::throw_error(ec, "write");
+ return bytes_transferred;
+}
+
+#if !defined(ASIO_NO_EXTENSIONS)
+#if !defined(ASIO_NO_IOSTREAM)
+
+template <typename SyncWriteStream, typename Allocator,
+ typename CompletionCondition>
+inline std::size_t write(SyncWriteStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition, asio::error_code& ec)
+{
+ return write(s, basic_streambuf_ref<Allocator>(b),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+}
+
+template <typename SyncWriteStream, typename Allocator>
+inline std::size_t write(SyncWriteStream& s,
+ asio::basic_streambuf<Allocator>& b)
+{
+ return write(s, basic_streambuf_ref<Allocator>(b));
+}
+
+template <typename SyncWriteStream, typename Allocator>
+inline std::size_t write(SyncWriteStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ asio::error_code& ec)
+{
+ return write(s, basic_streambuf_ref<Allocator>(b), ec);
+}
+
+template <typename SyncWriteStream, typename Allocator,
+ typename CompletionCondition>
+inline std::size_t write(SyncWriteStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition)
+{
+ return write(s, basic_streambuf_ref<Allocator>(b),
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+#endif // !defined(ASIO_NO_EXTENSIONS)
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+template <typename SyncWriteStream, typename DynamicBuffer_v2,
+ typename CompletionCondition>
+std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
+ CompletionCondition completion_condition, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ std::size_t bytes_transferred = write(s, buffers.data(0, buffers.size()),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+ buffers.consume(bytes_transferred);
+ return bytes_transferred;
+}
+
+template <typename SyncWriteStream, typename DynamicBuffer_v2>
+inline std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = write(s,
+ static_cast<DynamicBuffer_v2&&>(buffers),
+ transfer_all(), ec);
+ asio::detail::throw_error(ec, "write");
+ return bytes_transferred;
+}
+
+template <typename SyncWriteStream, typename DynamicBuffer_v2>
+inline std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
+ asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ return write(s, static_cast<DynamicBuffer_v2&&>(buffers),
+ transfer_all(), ec);
+}
+
+template <typename SyncWriteStream, typename DynamicBuffer_v2,
+ typename CompletionCondition>
+inline std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
+ CompletionCondition completion_condition,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = write(s,
+ static_cast<DynamicBuffer_v2&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+ asio::detail::throw_error(ec, "write");
+ return bytes_transferred;
+}
+
+namespace detail
+{
+ template <typename AsyncWriteStream, typename ConstBufferSequence,
+ typename ConstBufferIterator, typename CompletionCondition,
+ typename WriteHandler>
+ class write_op
+ : public base_from_cancellation_state<WriteHandler>,
+ base_from_completion_cond<CompletionCondition>
+ {
+ public:
+ write_op(AsyncWriteStream& stream, const ConstBufferSequence& buffers,
+ CompletionCondition& completion_condition, WriteHandler& handler)
+ : base_from_cancellation_state<WriteHandler>(
+ handler, enable_partial_cancellation()),
+ base_from_completion_cond<CompletionCondition>(completion_condition),
+ stream_(stream),
+ buffers_(buffers),
+ start_(0),
+ handler_(static_cast<WriteHandler&&>(handler))
+ {
+ }
+
+ write_op(const write_op& other)
+ : base_from_cancellation_state<WriteHandler>(other),
+ base_from_completion_cond<CompletionCondition>(other),
+ stream_(other.stream_),
+ buffers_(other.buffers_),
+ start_(other.start_),
+ handler_(other.handler_)
+ {
+ }
+
+ write_op(write_op&& other)
+ : base_from_cancellation_state<WriteHandler>(
+ static_cast<base_from_cancellation_state<WriteHandler>&&>(other)),
+ base_from_completion_cond<CompletionCondition>(
+ static_cast<base_from_completion_cond<CompletionCondition>&&>(other)),
+ stream_(other.stream_),
+ buffers_(static_cast<buffers_type&&>(other.buffers_)),
+ start_(other.start_),
+ handler_(static_cast<WriteHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(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());
+ for (;;)
+ {
+ {
+ ASIO_HANDLER_LOCATION((__FILE__, __LINE__, "async_write"));
+ stream_.async_write_some(buffers_.prepare(max_size),
+ static_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());
+ if (max_size == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = error::operation_aborted;
+ break;
+ }
+ }
+
+ static_cast<WriteHandler&&>(handler_)(
+ static_cast<const asio::error_code&>(ec),
+ static_cast<const std::size_t&>(buffers_.total_consumed()));
+ }
+ }
+
+ //private:
+ typedef asio::detail::consuming_buffers<const_buffer,
+ ConstBufferSequence, ConstBufferIterator> buffers_type;
+
+ AsyncWriteStream& stream_;
+ buffers_type buffers_;
+ int start_;
+ WriteHandler handler_;
+ };
+
+ template <typename AsyncWriteStream, typename ConstBufferSequence,
+ typename ConstBufferIterator, typename CompletionCondition,
+ typename WriteHandler>
+ inline bool asio_handler_is_continuation(
+ write_op<AsyncWriteStream, ConstBufferSequence, ConstBufferIterator,
+ CompletionCondition, WriteHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncWriteStream, typename ConstBufferSequence,
+ typename ConstBufferIterator, typename CompletionCondition,
+ typename WriteHandler>
+ inline void start_write_op(AsyncWriteStream& stream,
+ const ConstBufferSequence& buffers, const ConstBufferIterator&,
+ CompletionCondition& completion_condition, WriteHandler& handler)
+ {
+ detail::write_op<AsyncWriteStream, ConstBufferSequence,
+ ConstBufferIterator, CompletionCondition, WriteHandler>(
+ stream, buffers, completion_condition, handler)(
+ asio::error_code(), 0, 1);
+ }
+
+ template <typename AsyncWriteStream>
+ class initiate_async_write
+ {
+ public:
+ typedef typename AsyncWriteStream::executor_type executor_type;
+
+ explicit initiate_async_write(AsyncWriteStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence,
+ typename CompletionCondition>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers,
+ CompletionCondition&& completion_cond) const
+ {
+ // 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;
+
+ non_const_lvalue<WriteHandler> handler2(handler);
+ non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
+ start_write_op(stream_, buffers,
+ asio::buffer_sequence_begin(buffers),
+ completion_cond2.value, handler2.value);
+ }
+
+ private:
+ AsyncWriteStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncWriteStream, typename ConstBufferSequence,
+ typename ConstBufferIterator, typename CompletionCondition,
+ typename WriteHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::write_op<AsyncWriteStream, ConstBufferSequence,
+ ConstBufferIterator, CompletionCondition, WriteHandler>,
+ DefaultCandidate>
+ : Associator<WriteHandler, DefaultCandidate>
+{
+ static typename Associator<WriteHandler, DefaultCandidate>::type get(
+ const detail::write_op<AsyncWriteStream, ConstBufferSequence,
+ ConstBufferIterator, CompletionCondition, WriteHandler>& h) noexcept
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::write_op<AsyncWriteStream, ConstBufferSequence,
+ ConstBufferIterator, CompletionCondition, WriteHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncWriteStream,
+ typename ConstBufferSequence, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+inline auto async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
+ CompletionCondition completion_condition, WriteToken&& token,
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ >)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write<AsyncWriteStream>>(),
+ token, buffers,
+ static_cast<CompletionCondition&&>(completion_condition)))
+{
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_write<AsyncWriteStream>(s),
+ token, buffers,
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+template <typename AsyncWriteStream, typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+inline auto async_write(AsyncWriteStream& s,
+ const ConstBufferSequence& buffers, WriteToken&& token,
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ >)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write<AsyncWriteStream>>(),
+ token, buffers, transfer_all()))
+{
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_write<AsyncWriteStream>(s),
+ token, buffers, transfer_all());
+}
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+namespace detail
+{
+ template <typename AsyncWriteStream, typename DynamicBuffer_v1,
+ typename CompletionCondition, typename WriteHandler>
+ class write_dynbuf_v1_op
+ {
+ public:
+ template <typename BufferSequence>
+ write_dynbuf_v1_op(AsyncWriteStream& stream,
+ BufferSequence&& buffers,
+ CompletionCondition& completion_condition, WriteHandler& handler)
+ : stream_(stream),
+ buffers_(static_cast<BufferSequence&&>(buffers)),
+ completion_condition_(
+ static_cast<CompletionCondition&&>(completion_condition)),
+ handler_(static_cast<WriteHandler&&>(handler))
+ {
+ }
+
+ write_dynbuf_v1_op(const write_dynbuf_v1_op& other)
+ : stream_(other.stream_),
+ buffers_(other.buffers_),
+ completion_condition_(other.completion_condition_),
+ handler_(other.handler_)
+ {
+ }
+
+ write_dynbuf_v1_op(write_dynbuf_v1_op&& other)
+ : stream_(other.stream_),
+ buffers_(static_cast<DynamicBuffer_v1&&>(other.buffers_)),
+ completion_condition_(
+ static_cast<CompletionCondition&&>(
+ other.completion_condition_)),
+ handler_(static_cast<WriteHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(const asio::error_code& ec,
+ std::size_t bytes_transferred, int start = 0)
+ {
+ switch (start)
+ {
+ case 1:
+ async_write(stream_, buffers_.data(),
+ static_cast<CompletionCondition&&>(completion_condition_),
+ static_cast<write_dynbuf_v1_op&&>(*this));
+ return; default:
+ buffers_.consume(bytes_transferred);
+ static_cast<WriteHandler&&>(handler_)(ec,
+ static_cast<const std::size_t&>(bytes_transferred));
+ }
+ }
+
+ //private:
+ AsyncWriteStream& stream_;
+ DynamicBuffer_v1 buffers_;
+ CompletionCondition completion_condition_;
+ WriteHandler handler_;
+ };
+
+ template <typename AsyncWriteStream, typename DynamicBuffer_v1,
+ typename CompletionCondition, typename WriteHandler>
+ inline bool asio_handler_is_continuation(
+ write_dynbuf_v1_op<AsyncWriteStream, DynamicBuffer_v1,
+ CompletionCondition, WriteHandler>* this_handler)
+ {
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncWriteStream>
+ class initiate_async_write_dynbuf_v1
+ {
+ public:
+ typedef typename AsyncWriteStream::executor_type executor_type;
+
+ explicit initiate_async_write_dynbuf_v1(AsyncWriteStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename WriteHandler, typename DynamicBuffer_v1,
+ typename CompletionCondition>
+ void operator()(WriteHandler&& handler,
+ DynamicBuffer_v1&& buffers,
+ CompletionCondition&& completion_cond) const
+ {
+ // 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;
+
+ non_const_lvalue<WriteHandler> handler2(handler);
+ non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
+ write_dynbuf_v1_op<AsyncWriteStream,
+ decay_t<DynamicBuffer_v1>,
+ CompletionCondition, decay_t<WriteHandler>>(
+ stream_, static_cast<DynamicBuffer_v1&&>(buffers),
+ completion_cond2.value, handler2.value)(
+ asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncWriteStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncWriteStream, typename DynamicBuffer_v1,
+ typename CompletionCondition, typename WriteHandler,
+ typename DefaultCandidate>
+struct associator<Associator,
+ detail::write_dynbuf_v1_op<AsyncWriteStream,
+ DynamicBuffer_v1, CompletionCondition, WriteHandler>,
+ DefaultCandidate>
+ : Associator<WriteHandler, DefaultCandidate>
+{
+ static typename Associator<WriteHandler, DefaultCandidate>::type get(
+ const detail::write_dynbuf_v1_op<AsyncWriteStream, DynamicBuffer_v1,
+ CompletionCondition, WriteHandler>& h) noexcept
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::write_dynbuf_v1_op<AsyncWriteStream,
+ DynamicBuffer_v1, CompletionCondition, WriteHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncWriteStream, typename DynamicBuffer_v1,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+inline auto async_write(AsyncWriteStream& s,
+ DynamicBuffer_v1&& buffers, WriteToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ transfer_all()))
+{
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>(s),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ transfer_all());
+}
+
+template <typename AsyncWriteStream,
+ typename DynamicBuffer_v1, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+inline auto async_write(AsyncWriteStream& s, DynamicBuffer_v1&& buffers,
+ CompletionCondition completion_condition, WriteToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ >,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ >)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition)))
+{
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>(s),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+#if !defined(ASIO_NO_EXTENSIONS)
+#if !defined(ASIO_NO_IOSTREAM)
+
+template <typename AsyncWriteStream, typename Allocator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+inline auto async_write(AsyncWriteStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ WriteToken&& token)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>>(),
+ token, basic_streambuf_ref<Allocator>(b), transfer_all()))
+{
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>(s),
+ token, basic_streambuf_ref<Allocator>(b), transfer_all());
+}
+
+template <typename AsyncWriteStream,
+ typename Allocator, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+inline auto async_write(AsyncWriteStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition, WriteToken&& token)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>>(),
+ token, basic_streambuf_ref<Allocator>(b),
+ static_cast<CompletionCondition&&>(completion_condition)))
+{
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>(s),
+ token, basic_streambuf_ref<Allocator>(b),
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+#endif // !defined(ASIO_NO_EXTENSIONS)
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+namespace detail
+{
+ template <typename AsyncWriteStream, typename DynamicBuffer_v2,
+ typename CompletionCondition, typename WriteHandler>
+ class write_dynbuf_v2_op
+ {
+ public:
+ template <typename BufferSequence>
+ write_dynbuf_v2_op(AsyncWriteStream& stream,
+ BufferSequence&& buffers,
+ CompletionCondition& completion_condition, WriteHandler& handler)
+ : stream_(stream),
+ buffers_(static_cast<BufferSequence&&>(buffers)),
+ completion_condition_(
+ static_cast<CompletionCondition&&>(completion_condition)),
+ handler_(static_cast<WriteHandler&&>(handler))
+ {
+ }
+
+ write_dynbuf_v2_op(const write_dynbuf_v2_op& other)
+ : stream_(other.stream_),
+ buffers_(other.buffers_),
+ completion_condition_(other.completion_condition_),
+ handler_(other.handler_)
+ {
+ }
+
+ write_dynbuf_v2_op(write_dynbuf_v2_op&& other)
+ : stream_(other.stream_),
+ buffers_(static_cast<DynamicBuffer_v2&&>(other.buffers_)),
+ completion_condition_(
+ static_cast<CompletionCondition&&>(
+ other.completion_condition_)),
+ handler_(static_cast<WriteHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(const asio::error_code& ec,
+ std::size_t bytes_transferred, int start = 0)
+ {
+ switch (start)
+ {
+ case 1:
+ async_write(stream_, buffers_.data(0, buffers_.size()),
+ static_cast<CompletionCondition&&>(completion_condition_),
+ static_cast<write_dynbuf_v2_op&&>(*this));
+ return; default:
+ buffers_.consume(bytes_transferred);
+ static_cast<WriteHandler&&>(handler_)(ec,
+ static_cast<const std::size_t&>(bytes_transferred));
+ }
+ }
+
+ //private:
+ AsyncWriteStream& stream_;
+ DynamicBuffer_v2 buffers_;
+ CompletionCondition completion_condition_;
+ WriteHandler handler_;
+ };
+
+ template <typename AsyncWriteStream, typename DynamicBuffer_v2,
+ typename CompletionCondition, typename WriteHandler>
+ inline bool asio_handler_is_continuation(
+ write_dynbuf_v2_op<AsyncWriteStream, DynamicBuffer_v2,
+ CompletionCondition, WriteHandler>* this_handler)
+ {
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncWriteStream>
+ class initiate_async_write_dynbuf_v2
+ {
+ public:
+ typedef typename AsyncWriteStream::executor_type executor_type;
+
+ explicit initiate_async_write_dynbuf_v2(AsyncWriteStream& stream)
+ : stream_(stream)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return stream_.get_executor();
+ }
+
+ template <typename WriteHandler, typename DynamicBuffer_v2,
+ typename CompletionCondition>
+ void operator()(WriteHandler&& handler,
+ DynamicBuffer_v2&& buffers,
+ CompletionCondition&& completion_cond) const
+ {
+ // 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;
+
+ non_const_lvalue<WriteHandler> handler2(handler);
+ non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
+ write_dynbuf_v2_op<AsyncWriteStream, decay_t<DynamicBuffer_v2>,
+ CompletionCondition, decay_t<WriteHandler>>(
+ stream_, static_cast<DynamicBuffer_v2&&>(buffers),
+ completion_cond2.value, handler2.value)(
+ asio::error_code(), 0, 1);
+ }
+
+ private:
+ AsyncWriteStream& stream_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncWriteStream, typename DynamicBuffer_v2,
+ typename CompletionCondition, typename WriteHandler,
+ typename DefaultCandidate>
+struct associator<Associator,
+ detail::write_dynbuf_v2_op<AsyncWriteStream,
+ DynamicBuffer_v2, CompletionCondition, WriteHandler>,
+ DefaultCandidate>
+ : Associator<WriteHandler, DefaultCandidate>
+{
+ static typename Associator<WriteHandler, DefaultCandidate>::type get(
+ const detail::write_dynbuf_v2_op<AsyncWriteStream, DynamicBuffer_v2,
+ CompletionCondition, WriteHandler>& h) noexcept
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::write_dynbuf_v2_op<AsyncWriteStream,
+ DynamicBuffer_v2, CompletionCondition, WriteHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncWriteStream, typename DynamicBuffer_v2,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+inline auto async_write(AsyncWriteStream& s,
+ DynamicBuffer_v2 buffers, WriteToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_dynbuf_v2<AsyncWriteStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ transfer_all()))
+{
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_write_dynbuf_v2<AsyncWriteStream>(s),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ transfer_all());
+}
+
+template <typename AsyncWriteStream,
+ typename DynamicBuffer_v2, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+inline auto async_write(AsyncWriteStream& s, DynamicBuffer_v2 buffers,
+ CompletionCondition completion_condition, WriteToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ >)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_dynbuf_v2<AsyncWriteStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition)))
+{
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_write_dynbuf_v2<AsyncWriteStream>(s),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IMPL_WRITE_HPP
diff --git a/3rdparty/asio/include/asio/impl/write_at.hpp b/3rdparty/asio/include/asio/impl/write_at.hpp
new file mode 100644
index 00000000000..b5a67e30051
--- /dev/null
+++ b/3rdparty/asio/include/asio/impl/write_at.hpp
@@ -0,0 +1,551 @@
+//
+// impl/write_at.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/associator.hpp"
+#include "asio/buffer.hpp"
+#include "asio/detail/array_fwd.hpp"
+#include "asio/detail/base_from_cancellation_state.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_cont_helpers.hpp"
+#include "asio/detail/handler_tracking.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+namespace detail
+{
+ template <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence,
+ typename ConstBufferIterator, typename CompletionCondition>
+ 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<const_buffer,
+ ConstBufferSequence, ConstBufferIterator> 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 <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence,
+ typename CompletionCondition>
+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),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+}
+
+template <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence>
+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 <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence>
+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 <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence,
+ typename CompletionCondition>
+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,
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+ asio::detail::throw_error(ec, "write_at");
+ return bytes_transferred;
+}
+
+#if !defined(ASIO_NO_EXTENSIONS)
+#if !defined(ASIO_NO_IOSTREAM)
+
+template <typename SyncRandomAccessWriteDevice, typename Allocator,
+ typename CompletionCondition>
+std::size_t write_at(SyncRandomAccessWriteDevice& d,
+ uint64_t offset, asio::basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition, asio::error_code& ec)
+{
+ std::size_t bytes_transferred = write_at(d, offset, b.data(),
+ static_cast<CompletionCondition&&>(completion_condition), ec);
+ b.consume(bytes_transferred);
+ return bytes_transferred;
+}
+
+template <typename SyncRandomAccessWriteDevice, typename Allocator>
+inline std::size_t write_at(SyncRandomAccessWriteDevice& d,
+ uint64_t offset, asio::basic_streambuf<Allocator>& 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 <typename SyncRandomAccessWriteDevice, typename Allocator>
+inline std::size_t write_at(SyncRandomAccessWriteDevice& d,
+ uint64_t offset, asio::basic_streambuf<Allocator>& b,
+ asio::error_code& ec)
+{
+ return write_at(d, offset, b, transfer_all(), ec);
+}
+
+template <typename SyncRandomAccessWriteDevice, typename Allocator,
+ typename CompletionCondition>
+inline std::size_t write_at(SyncRandomAccessWriteDevice& d,
+ uint64_t offset, asio::basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition)
+{
+ asio::error_code ec;
+ std::size_t bytes_transferred = write_at(d, offset, b,
+ static_cast<CompletionCondition&&>(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 <typename AsyncRandomAccessWriteDevice,
+ typename ConstBufferSequence, typename ConstBufferIterator,
+ typename CompletionCondition, typename WriteHandler>
+ class write_at_op
+ : public base_from_cancellation_state<WriteHandler>,
+ base_from_completion_cond<CompletionCondition>
+ {
+ public:
+ write_at_op(AsyncRandomAccessWriteDevice& device,
+ uint64_t offset, const ConstBufferSequence& buffers,
+ CompletionCondition& completion_condition, WriteHandler& handler)
+ : base_from_cancellation_state<WriteHandler>(
+ handler, enable_partial_cancellation()),
+ base_from_completion_cond<CompletionCondition>(completion_condition),
+ device_(device),
+ offset_(offset),
+ buffers_(buffers),
+ start_(0),
+ handler_(static_cast<WriteHandler&&>(handler))
+ {
+ }
+
+ write_at_op(const write_at_op& other)
+ : base_from_cancellation_state<WriteHandler>(other),
+ base_from_completion_cond<CompletionCondition>(other),
+ device_(other.device_),
+ offset_(other.offset_),
+ buffers_(other.buffers_),
+ start_(other.start_),
+ handler_(other.handler_)
+ {
+ }
+
+ write_at_op(write_at_op&& other)
+ : base_from_cancellation_state<WriteHandler>(
+ static_cast<base_from_cancellation_state<WriteHandler>&&>(other)),
+ base_from_completion_cond<CompletionCondition>(
+ static_cast<base_from_completion_cond<CompletionCondition>&&>(other)),
+ device_(other.device_),
+ offset_(other.offset_),
+ buffers_(static_cast<buffers_type&&>(other.buffers_)),
+ start_(other.start_),
+ handler_(static_cast<WriteHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(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());
+ for (;;)
+ {
+ {
+ ASIO_HANDLER_LOCATION((__FILE__, __LINE__, "async_write_at"));
+ device_.async_write_some_at(
+ offset_ + buffers_.total_consumed(), buffers_.prepare(max_size),
+ static_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());
+ if (max_size == 0)
+ break;
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec = asio::error::operation_aborted;
+ break;
+ }
+ }
+
+ static_cast<WriteHandler&&>(handler_)(
+ static_cast<const asio::error_code&>(ec),
+ static_cast<const std::size_t&>(buffers_.total_consumed()));
+ }
+ }
+
+ //private:
+ typedef asio::detail::consuming_buffers<const_buffer,
+ ConstBufferSequence, ConstBufferIterator> buffers_type;
+
+ AsyncRandomAccessWriteDevice& device_;
+ uint64_t offset_;
+ buffers_type buffers_;
+ int start_;
+ WriteHandler handler_;
+ };
+
+ template <typename AsyncRandomAccessWriteDevice,
+ typename ConstBufferSequence, typename ConstBufferIterator,
+ typename CompletionCondition, typename WriteHandler>
+ inline bool asio_handler_is_continuation(
+ write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence,
+ ConstBufferIterator, CompletionCondition, WriteHandler>* this_handler)
+ {
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncRandomAccessWriteDevice,
+ typename ConstBufferSequence, typename ConstBufferIterator,
+ typename CompletionCondition, typename WriteHandler>
+ inline void start_write_at_op(AsyncRandomAccessWriteDevice& d,
+ uint64_t offset, const ConstBufferSequence& buffers,
+ const ConstBufferIterator&, CompletionCondition& completion_condition,
+ WriteHandler& handler)
+ {
+ detail::write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence,
+ ConstBufferIterator, CompletionCondition, WriteHandler>(
+ d, offset, buffers, completion_condition, handler)(
+ asio::error_code(), 0, 1);
+ }
+
+ template <typename AsyncRandomAccessWriteDevice>
+ class initiate_async_write_at
+ {
+ public:
+ typedef typename AsyncRandomAccessWriteDevice::executor_type executor_type;
+
+ explicit initiate_async_write_at(AsyncRandomAccessWriteDevice& device)
+ : device_(device)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return device_.get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence,
+ typename CompletionCondition>
+ void operator()(WriteHandler&& handler,
+ uint64_t offset, const ConstBufferSequence& buffers,
+ CompletionCondition&& completion_cond) const
+ {
+ // 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;
+
+ non_const_lvalue<WriteHandler> handler2(handler);
+ non_const_lvalue<CompletionCondition> completion_cond2(completion_cond);
+ start_write_at_op(device_, offset, buffers,
+ asio::buffer_sequence_begin(buffers),
+ completion_cond2.value, handler2.value);
+ }
+
+ private:
+ AsyncRandomAccessWriteDevice& device_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence,
+ typename ConstBufferIterator, typename CompletionCondition,
+ typename WriteHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::write_at_op<AsyncRandomAccessWriteDevice, ConstBufferSequence,
+ ConstBufferIterator, CompletionCondition, WriteHandler>,
+ DefaultCandidate>
+ : Associator<WriteHandler, DefaultCandidate>
+{
+ static typename Associator<WriteHandler, DefaultCandidate>::type get(
+ const detail::write_at_op<AsyncRandomAccessWriteDevice,
+ ConstBufferSequence, ConstBufferIterator,
+ CompletionCondition, WriteHandler>& h) noexcept
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::write_at_op<AsyncRandomAccessWriteDevice,
+ ConstBufferSequence, ConstBufferIterator,
+ CompletionCondition, WriteHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncRandomAccessWriteDevice,
+ typename ConstBufferSequence, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+inline auto async_write_at(AsyncRandomAccessWriteDevice& d,
+ uint64_t offset, const ConstBufferSequence& buffers,
+ CompletionCondition completion_condition, WriteToken&& token)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_at<
+ AsyncRandomAccessWriteDevice>>(),
+ token, offset, buffers,
+ static_cast<CompletionCondition&&>(completion_condition)))
+{
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_write_at<AsyncRandomAccessWriteDevice>(d),
+ token, offset, buffers,
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+inline auto async_write_at(AsyncRandomAccessWriteDevice& d,
+ uint64_t offset, const ConstBufferSequence& buffers, WriteToken&& token)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_at<
+ AsyncRandomAccessWriteDevice>>(),
+ token, offset, buffers, transfer_all()))
+{
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_write_at<AsyncRandomAccessWriteDevice>(d),
+ token, offset, buffers, transfer_all());
+}
+
+#if !defined(ASIO_NO_EXTENSIONS)
+#if !defined(ASIO_NO_IOSTREAM)
+
+namespace detail
+{
+ template <typename Allocator, typename WriteHandler>
+ class write_at_streambuf_op
+ {
+ public:
+ write_at_streambuf_op(
+ asio::basic_streambuf<Allocator>& streambuf,
+ WriteHandler& handler)
+ : streambuf_(streambuf),
+ handler_(static_cast<WriteHandler&&>(handler))
+ {
+ }
+
+ 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_(static_cast<WriteHandler&&>(other.handler_))
+ {
+ }
+
+ void operator()(const asio::error_code& ec,
+ const std::size_t bytes_transferred)
+ {
+ streambuf_.consume(bytes_transferred);
+ static_cast<WriteHandler&&>(handler_)(ec, bytes_transferred);
+ }
+
+ //private:
+ asio::basic_streambuf<Allocator>& streambuf_;
+ WriteHandler handler_;
+ };
+
+ template <typename Allocator, typename WriteHandler>
+ inline bool asio_handler_is_continuation(
+ write_at_streambuf_op<Allocator, WriteHandler>* this_handler)
+ {
+ return asio_handler_cont_helpers::is_continuation(
+ this_handler->handler_);
+ }
+
+ template <typename AsyncRandomAccessWriteDevice>
+ class initiate_async_write_at_streambuf
+ {
+ public:
+ typedef typename AsyncRandomAccessWriteDevice::executor_type executor_type;
+
+ explicit initiate_async_write_at_streambuf(
+ AsyncRandomAccessWriteDevice& device)
+ : device_(device)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return device_.get_executor();
+ }
+
+ template <typename WriteHandler,
+ typename Allocator, typename CompletionCondition>
+ void operator()(WriteHandler&& handler,
+ uint64_t offset, basic_streambuf<Allocator>* b,
+ CompletionCondition&& completion_condition) const
+ {
+ // 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;
+
+ non_const_lvalue<WriteHandler> handler2(handler);
+ async_write_at(device_, offset, b->data(),
+ static_cast<CompletionCondition&&>(completion_condition),
+ write_at_streambuf_op<Allocator, decay_t<WriteHandler>>(
+ *b, handler2.value));
+ }
+
+ private:
+ AsyncRandomAccessWriteDevice& device_;
+ };
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+template <template <typename, typename> class Associator,
+ typename Executor, typename WriteHandler, typename DefaultCandidate>
+struct associator<Associator,
+ detail::write_at_streambuf_op<Executor, WriteHandler>,
+ DefaultCandidate>
+ : Associator<WriteHandler, DefaultCandidate>
+{
+ static typename Associator<WriteHandler, DefaultCandidate>::type get(
+ const detail::write_at_streambuf_op<Executor, WriteHandler>& h) noexcept
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(
+ const detail::write_at_streambuf_op<Executor, WriteHandler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<WriteHandler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+template <typename AsyncRandomAccessWriteDevice,
+ typename Allocator, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+inline auto async_write_at(AsyncRandomAccessWriteDevice& d,
+ uint64_t offset, asio::basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition, WriteToken&& token)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_at_streambuf<
+ AsyncRandomAccessWriteDevice>>(),
+ token, offset, &b,
+ static_cast<CompletionCondition&&>(completion_condition)))
+{
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_write_at_streambuf<
+ AsyncRandomAccessWriteDevice>(d),
+ token, offset, &b,
+ static_cast<CompletionCondition&&>(completion_condition));
+}
+
+template <typename AsyncRandomAccessWriteDevice, typename Allocator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+inline auto async_write_at(AsyncRandomAccessWriteDevice& d,
+ uint64_t offset, asio::basic_streambuf<Allocator>& b,
+ WriteToken&& token)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_at_streambuf<
+ AsyncRandomAccessWriteDevice>>(),
+ token, offset, &b, transfer_all()))
+{
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ detail::initiate_async_write_at_streambuf<
+ AsyncRandomAccessWriteDevice>(d),
+ token, offset, &b, transfer_all());
+}
+
+#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/3rdparty/asio/include/asio/io_context.hpp b/3rdparty/asio/include/asio/io_context.hpp
new file mode 100644
index 00000000000..5de125685fc
--- /dev/null
+++ b/3rdparty/asio/include/asio/io_context.hpp
@@ -0,0 +1,1505 @@
+//
+// io_context.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <stdexcept>
+#include <typeinfo>
+#include "asio/async_result.hpp"
+#include "asio/detail/chrono.hpp"
+#include "asio/detail/concurrency_hint.hpp"
+#include "asio/detail/cstdint.hpp"
+#include "asio/detail/wrapped_handler.hpp"
+#include "asio/error_code.hpp"
+#include "asio/execution.hpp"
+#include "asio/execution_context.hpp"
+
+#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
+
+#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 {
+
+namespace detail {
+#if defined(ASIO_HAS_IOCP)
+ typedef win_iocp_io_context io_context_impl;
+ class win_iocp_overlapped_ptr;
+#else
+ typedef scheduler io_context_impl;
+#endif
+
+ struct io_context_bits
+ {
+ static constexpr uintptr_t blocking_never = 1;
+ static constexpr uintptr_t relationship_continuation = 2;
+ static constexpr uintptr_t outstanding_work_tracked = 4;
+ static constexpr uintptr_t runtime_bits = 3;
+ };
+} // 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
+ * using the @ref make_work_guard function to create an object of type
+ * asio::executor_work_guard<io_context::executor_type>:
+ *
+ * @code asio::io_context io_context;
+ * asio::executor_work_guard<asio::io_context::executor_type>
+ * = 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::io_context::executor_type>
+ * = 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
+
+#if !defined(ASIO_NO_DEPRECATED)
+ struct initiate_dispatch;
+ struct initiate_post;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+public:
+ template <typename Allocator, uintptr_t Bits>
+ class basic_executor_type;
+
+ template <typename Allocator, uintptr_t Bits>
+ friend class basic_executor_type;
+
+ /// Executor used to submit functions to an io_context.
+ typedef basic_executor_type<std::allocator<void>, 0> executor_type;
+
+#if !defined(ASIO_NO_DEPRECATED)
+ class work;
+ friend class work;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ class service;
+
+#if !defined(ASIO_NO_EXTENSIONS) \
+ && !defined(ASIO_NO_TS_EXECUTORS)
+ class strand;
+#endif // !defined(ASIO_NO_EXTENSIONS)
+ // && !defined(ASIO_NO_TS_EXECUTORS)
+
+ /// 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
+ * <tt>delete static_cast<io_context::service*>(svc)</tt>.
+ *
+ * @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() 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)
+
+ /// 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 <typename Rep, typename Period>
+ std::size_t run_for(const chrono::duration<Rep, Period>& 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 <typename Clock, typename Duration>
+ std::size_t run_until(const chrono::time_point<Clock, Duration>& abs_time);
+
+ /// 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 overload.) 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)
+
+ /// 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 <typename Rep, typename Period>
+ std::size_t run_one_for(const chrono::duration<Rep, Period>& 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 <typename Clock, typename Duration>
+ std::size_t run_one_until(
+ const chrono::time_point<Clock, Duration>& abs_time);
+
+ /// 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 associated allocator; or
+ *
+ * @li the handler's copy constructor
+ *
+ * throws an exception.
+ */
+ template <typename LegacyCompletionHandler>
+ auto dispatch(LegacyCompletionHandler&& handler)
+ -> decltype(
+ async_initiate<LegacyCompletionHandler, void ()>(
+ declval<initiate_dispatch>(), handler, this));
+
+ /// (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 associated allocator; or
+ *
+ * @li the handler's copy constructor
+ *
+ * throws an exception.
+ */
+ template <typename LegacyCompletionHandler>
+ auto post(LegacyCompletionHandler&& handler)
+ -> decltype(
+ async_initiate<LegacyCompletionHandler, void ()>(
+ declval<initiate_post>(), handler, this));
+
+ /// (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 <typename Handler>
+#if defined(GENERATING_DOCUMENTATION)
+ unspecified
+#else
+ detail::wrapped_handler<io_context&, Handler>
+#endif
+ wrap(Handler handler);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+private:
+ io_context(const io_context&) = delete;
+ io_context& operator=(const io_context&) = delete;
+
+ // 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 <typename Service>
+ 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 implementation type used to submit functions to an io_context.
+template <typename Allocator, uintptr_t Bits>
+class io_context::basic_executor_type :
+ detail::io_context_bits, Allocator
+{
+public:
+ /// Copy constructor.
+ basic_executor_type(const basic_executor_type& other) noexcept
+ : Allocator(static_cast<const Allocator&>(other)),
+ target_(other.target_)
+ {
+ if (Bits & outstanding_work_tracked)
+ if (context_ptr())
+ context_ptr()->impl_.work_started();
+ }
+
+ /// Move constructor.
+ basic_executor_type(basic_executor_type&& other) noexcept
+ : Allocator(static_cast<Allocator&&>(other)),
+ target_(other.target_)
+ {
+ if (Bits & outstanding_work_tracked)
+ other.target_ = 0;
+ }
+
+ /// Destructor.
+ ~basic_executor_type() noexcept
+ {
+ if (Bits & outstanding_work_tracked)
+ if (context_ptr())
+ context_ptr()->impl_.work_finished();
+ }
+
+ /// Assignment operator.
+ basic_executor_type& operator=(const basic_executor_type& other) noexcept;
+
+ /// Move assignment operator.
+ basic_executor_type& operator=(basic_executor_type&& other) noexcept;
+
+#if !defined(GENERATING_DOCUMENTATION)
+private:
+ friend struct asio_require_fn::impl;
+ friend struct asio_prefer_fn::impl;
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ /// Obtain an executor with the @c blocking.possibly property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_io_context.get_executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::blocking.possibly); @endcode
+ */
+ constexpr basic_executor_type require(execution::blocking_t::possibly_t) const
+ {
+ return basic_executor_type(context_ptr(),
+ *this, bits() & ~blocking_never);
+ }
+
+ /// Obtain an executor with the @c blocking.never property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_io_context.get_executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::blocking.never); @endcode
+ */
+ constexpr basic_executor_type require(execution::blocking_t::never_t) const
+ {
+ return basic_executor_type(context_ptr(),
+ *this, bits() | blocking_never);
+ }
+
+ /// Obtain an executor with the @c relationship.fork property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_io_context.get_executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::relationship.fork); @endcode
+ */
+ constexpr basic_executor_type require(execution::relationship_t::fork_t) const
+ {
+ return basic_executor_type(context_ptr(),
+ *this, bits() & ~relationship_continuation);
+ }
+
+ /// Obtain an executor with the @c relationship.continuation property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_io_context.get_executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::relationship.continuation); @endcode
+ */
+ constexpr basic_executor_type require(
+ execution::relationship_t::continuation_t) const
+ {
+ return basic_executor_type(context_ptr(),
+ *this, bits() | relationship_continuation);
+ }
+
+ /// Obtain an executor with the @c outstanding_work.tracked property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_io_context.get_executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::outstanding_work.tracked); @endcode
+ */
+ constexpr basic_executor_type<Allocator,
+ ASIO_UNSPECIFIED(Bits | outstanding_work_tracked)>
+ require(execution::outstanding_work_t::tracked_t) const
+ {
+ return basic_executor_type<Allocator, Bits | outstanding_work_tracked>(
+ context_ptr(), *this, bits());
+ }
+
+ /// Obtain an executor with the @c outstanding_work.untracked property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_io_context.get_executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::outstanding_work.untracked); @endcode
+ */
+ constexpr basic_executor_type<Allocator,
+ ASIO_UNSPECIFIED(Bits & ~outstanding_work_tracked)>
+ require(execution::outstanding_work_t::untracked_t) const
+ {
+ return basic_executor_type<Allocator, Bits & ~outstanding_work_tracked>(
+ context_ptr(), *this, bits());
+ }
+
+ /// Obtain an executor with the specified @c allocator property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_io_context.get_executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::allocator(my_allocator)); @endcode
+ */
+ template <typename OtherAllocator>
+ constexpr basic_executor_type<OtherAllocator, Bits>
+ require(execution::allocator_t<OtherAllocator> a) const
+ {
+ return basic_executor_type<OtherAllocator, Bits>(
+ context_ptr(), a.value(), bits());
+ }
+
+ /// Obtain an executor with the default @c allocator property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_io_context.get_executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::allocator); @endcode
+ */
+ constexpr basic_executor_type<std::allocator<void>, Bits>
+ require(execution::allocator_t<void>) const
+ {
+ return basic_executor_type<std::allocator<void>, Bits>(
+ context_ptr(), std::allocator<void>(), bits());
+ }
+
+#if !defined(GENERATING_DOCUMENTATION)
+private:
+ friend struct asio_query_fn::impl;
+ friend struct asio::execution::detail::mapping_t<0>;
+ friend struct asio::execution::detail::outstanding_work_t<0>;
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ /// Query the current value of the @c mapping property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_io_context.get_executor();
+ * if (asio::query(ex, asio::execution::mapping)
+ * == asio::execution::mapping.thread)
+ * ... @endcode
+ */
+ static constexpr execution::mapping_t query(execution::mapping_t) noexcept
+ {
+ return execution::mapping.thread;
+ }
+
+ /// Query the current value of the @c context property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_io_context.get_executor();
+ * asio::io_context& ctx = asio::query(
+ * ex, asio::execution::context); @endcode
+ */
+ io_context& query(execution::context_t) const noexcept
+ {
+ return *context_ptr();
+ }
+
+ /// Query the current value of the @c blocking property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_io_context.get_executor();
+ * if (asio::query(ex, asio::execution::blocking)
+ * == asio::execution::blocking.always)
+ * ... @endcode
+ */
+ constexpr execution::blocking_t query(execution::blocking_t) const noexcept
+ {
+ return (bits() & blocking_never)
+ ? execution::blocking_t(execution::blocking.never)
+ : execution::blocking_t(execution::blocking.possibly);
+ }
+
+ /// Query the current value of the @c relationship property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_io_context.get_executor();
+ * if (asio::query(ex, asio::execution::relationship)
+ * == asio::execution::relationship.continuation)
+ * ... @endcode
+ */
+ constexpr execution::relationship_t query(
+ execution::relationship_t) const noexcept
+ {
+ return (bits() & relationship_continuation)
+ ? execution::relationship_t(execution::relationship.continuation)
+ : execution::relationship_t(execution::relationship.fork);
+ }
+
+ /// Query the current value of the @c outstanding_work property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_io_context.get_executor();
+ * if (asio::query(ex, asio::execution::outstanding_work)
+ * == asio::execution::outstanding_work.tracked)
+ * ... @endcode
+ */
+ static constexpr execution::outstanding_work_t query(
+ execution::outstanding_work_t) noexcept
+ {
+ return (Bits & outstanding_work_tracked)
+ ? execution::outstanding_work_t(execution::outstanding_work.tracked)
+ : execution::outstanding_work_t(execution::outstanding_work.untracked);
+ }
+
+ /// Query the current value of the @c allocator property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_io_context.get_executor();
+ * auto alloc = asio::query(ex,
+ * asio::execution::allocator); @endcode
+ */
+ template <typename OtherAllocator>
+ constexpr Allocator query(
+ execution::allocator_t<OtherAllocator>) const noexcept
+ {
+ return static_cast<const Allocator&>(*this);
+ }
+
+ /// Query the current value of the @c allocator property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_io_context.get_executor();
+ * auto alloc = asio::query(ex,
+ * asio::execution::allocator); @endcode
+ */
+ constexpr Allocator query(execution::allocator_t<void>) const noexcept
+ {
+ return static_cast<const Allocator&>(*this);
+ }
+
+public:
+ /// 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 noexcept;
+
+ /// Compare two executors for equality.
+ /**
+ * Two executors are equal if they refer to the same underlying io_context.
+ */
+ friend bool operator==(const basic_executor_type& a,
+ const basic_executor_type& b) noexcept
+ {
+ return a.target_ == b.target_
+ && static_cast<const Allocator&>(a) == static_cast<const Allocator&>(b);
+ }
+
+ /// Compare two executors for inequality.
+ /**
+ * Two executors are equal if they refer to the same underlying io_context.
+ */
+ friend bool operator!=(const basic_executor_type& a,
+ const basic_executor_type& b) noexcept
+ {
+ return a.target_ != b.target_
+ || static_cast<const Allocator&>(a) != static_cast<const Allocator&>(b);
+ }
+
+ /// Execution function.
+ template <typename Function>
+ void execute(Function&& f) const;
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+public:
+ /// Obtain the underlying execution context.
+ io_context& context() const 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 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 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 <typename Function, typename OtherAllocator>
+ void dispatch(Function&& f, const OtherAllocator& 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 <typename Function, typename OtherAllocator>
+ void post(Function&& f, const OtherAllocator& 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 <typename Function, typename OtherAllocator>
+ void defer(Function&& f, const OtherAllocator& a) const;
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+private:
+ friend class io_context;
+ template <typename, uintptr_t> friend class basic_executor_type;
+
+ // Constructor used by io_context::get_executor().
+ explicit basic_executor_type(io_context& i) noexcept
+ : Allocator(),
+ target_(reinterpret_cast<uintptr_t>(&i))
+ {
+ if (Bits & outstanding_work_tracked)
+ context_ptr()->impl_.work_started();
+ }
+
+ // Constructor used by require().
+ basic_executor_type(io_context* i,
+ const Allocator& a, uintptr_t bits) noexcept
+ : Allocator(a),
+ target_(reinterpret_cast<uintptr_t>(i) | bits)
+ {
+ if (Bits & outstanding_work_tracked)
+ if (context_ptr())
+ context_ptr()->impl_.work_started();
+ }
+
+ io_context* context_ptr() const noexcept
+ {
+ return reinterpret_cast<io_context*>(target_ & ~runtime_bits);
+ }
+
+ uintptr_t bits() const noexcept
+ {
+ return target_ & runtime_bits;
+ }
+
+ // The underlying io_context and runtime bits.
+ uintptr_t target_;
+};
+
+#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();
+
+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();
+
+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 <typename Type>
+class service_base
+ : public asio::io_context::service
+{
+public:
+ static asio::detail::service_id<Type> id;
+
+ // Constructor.
+ service_base(asio::io_context& io_context)
+ : asio::io_context::service(io_context)
+ {
+ }
+};
+
+template <typename Type>
+asio::detail::service_id<Type> service_base<Type>::id;
+
+} // namespace detail
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename Allocator, uintptr_t Bits>
+struct equality_comparable<
+ asio::io_context::basic_executor_type<Allocator, Bits>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename Allocator, uintptr_t Bits, typename Function>
+struct execute_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ Function
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename Allocator, uintptr_t Bits>
+struct require_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ asio::execution::blocking_t::possibly_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::io_context::basic_executor_type<
+ Allocator, Bits> result_type;
+};
+
+template <typename Allocator, uintptr_t Bits>
+struct require_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ asio::execution::blocking_t::never_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::io_context::basic_executor_type<
+ Allocator, Bits> result_type;
+};
+
+template <typename Allocator, uintptr_t Bits>
+struct require_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ asio::execution::relationship_t::fork_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::io_context::basic_executor_type<
+ Allocator, Bits> result_type;
+};
+
+template <typename Allocator, uintptr_t Bits>
+struct require_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ asio::execution::relationship_t::continuation_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::io_context::basic_executor_type<
+ Allocator, Bits> result_type;
+};
+
+template <typename Allocator, uintptr_t Bits>
+struct require_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ asio::execution::outstanding_work_t::tracked_t
+ > : asio::detail::io_context_bits
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::io_context::basic_executor_type<
+ Allocator, Bits | outstanding_work_tracked> result_type;
+};
+
+template <typename Allocator, uintptr_t Bits>
+struct require_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ asio::execution::outstanding_work_t::untracked_t
+ > : asio::detail::io_context_bits
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::io_context::basic_executor_type<
+ Allocator, Bits & ~outstanding_work_tracked> result_type;
+};
+
+template <typename Allocator, uintptr_t Bits>
+struct require_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ asio::execution::allocator_t<void>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::io_context::basic_executor_type<
+ std::allocator<void>, Bits> result_type;
+};
+
+template <uintptr_t Bits,
+ typename Allocator, typename OtherAllocator>
+struct require_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ asio::execution::allocator_t<OtherAllocator>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::io_context::basic_executor_type<
+ OtherAllocator, Bits> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename Allocator, uintptr_t Bits, typename Property>
+struct query_static_constexpr_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::outstanding_work_t
+ >::value
+ >::type
+ > : asio::detail::io_context_bits
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::execution::outstanding_work_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return (Bits & outstanding_work_tracked)
+ ? execution::outstanding_work_t(execution::outstanding_work.tracked)
+ : execution::outstanding_work_t(execution::outstanding_work.untracked);
+ }
+};
+
+template <typename Allocator, uintptr_t Bits, typename Property>
+struct query_static_constexpr_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::mapping_t
+ >::value
+ >::type
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::execution::mapping_t::thread_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return result_type();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename Allocator, uintptr_t Bits, typename Property>
+struct query_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::blocking_t
+ >::value
+ >::type
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::execution::blocking_t result_type;
+};
+
+template <typename Allocator, uintptr_t Bits, typename Property>
+struct query_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::relationship_t
+ >::value
+ >::type
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::execution::relationship_t result_type;
+};
+
+template <typename Allocator, uintptr_t Bits>
+struct query_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ asio::execution::context_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::io_context& result_type;
+};
+
+template <typename Allocator, uintptr_t Bits>
+struct query_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ asio::execution::allocator_t<void>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef Allocator result_type;
+};
+
+template <typename Allocator, uintptr_t Bits, typename OtherAllocator>
+struct query_member<
+ asio::io_context::basic_executor_type<Allocator, Bits>,
+ asio::execution::allocator_t<OtherAllocator>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef Allocator result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+} // namespace traits
+
+namespace execution {
+
+template <>
+struct is_executor<io_context> : false_type
+{
+};
+
+} // namespace execution
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // 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/3rdparty/asio/include/asio/io_context_strand.hpp b/3rdparty/asio/include/asio/io_context_strand.hpp
new file mode 100644
index 00000000000..288ac238feb
--- /dev/null
+++ b/3rdparty/asio/include/asio/io_context_strand.hpp
@@ -0,0 +1,396 @@
+//
+// io_context_strand.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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) \
+ && !defined(ASIO_NO_TS_EXECUTORS)
+
+#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 a() happens-before @c b()
+ *
+ * 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
+{
+private:
+#if !defined(ASIO_NO_DEPRECATED)
+ struct initiate_dispatch;
+ struct initiate_post;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+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_);
+ }
+
+ /// Copy constructor.
+ /**
+ * Creates a copy such that both strand objects share the same underlying
+ * state.
+ */
+ strand(const strand& other) noexcept
+ : service_(other.service_),
+ impl_(other.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()
+ {
+ }
+
+ /// Obtain the underlying execution context.
+ asio::io_context& context() const 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 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 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 <typename Function, typename Allocator>
+ void dispatch(Function&& f, const Allocator& a) const
+ {
+ decay_t<Function> tmp(static_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 <typename LegacyCompletionHandler>
+ auto dispatch(LegacyCompletionHandler&& handler)
+ -> decltype(
+ async_initiate<LegacyCompletionHandler, void ()>(
+ declval<initiate_dispatch>(), handler, this))
+ {
+ return async_initiate<LegacyCompletionHandler, void ()>(
+ initiate_dispatch(), handler, this);
+ }
+#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 <typename Function, typename Allocator>
+ void post(Function&& f, const Allocator& a) const
+ {
+ decay_t<Function> tmp(static_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 <typename LegacyCompletionHandler>
+ auto post(LegacyCompletionHandler&& handler)
+ -> decltype(
+ async_initiate<LegacyCompletionHandler, void ()>(
+ declval<initiate_post>(), handler, this))
+ {
+ return async_initiate<LegacyCompletionHandler, void ()>(
+ initiate_post(), handler, this);
+ }
+#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 <typename Function, typename Allocator>
+ void defer(Function&& f, const Allocator& a) const
+ {
+ decay_t<Function> tmp(static_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 <typename Handler>
+#if defined(GENERATING_DOCUMENTATION)
+ unspecified
+#else
+ detail::wrapped_handler<strand, Handler, detail::is_continuation_if_running>
+#endif
+ wrap(Handler handler)
+ {
+ return detail::wrapped_handler<io_context::strand, Handler,
+ detail::is_continuation_if_running>(*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 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) 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) noexcept
+ {
+ return a.impl_ != b.impl_;
+ }
+
+private:
+#if !defined(ASIO_NO_DEPRECATED)
+ struct initiate_dispatch
+ {
+ template <typename LegacyCompletionHandler>
+ void operator()(LegacyCompletionHandler&& handler,
+ strand* self) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<LegacyCompletionHandler> handler2(handler);
+ self->service_.dispatch(self->impl_, handler2.value);
+ }
+ };
+
+ struct initiate_post
+ {
+ template <typename LegacyCompletionHandler>
+ void operator()(LegacyCompletionHandler&& handler,
+ strand* self) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<LegacyCompletionHandler> handler2(handler);
+ self->service_.post(self->impl_, handler2.value);
+ }
+ };
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ 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)
+ // && !defined(ASIO_NO_TS_EXECUTORS)
+
+#endif // ASIO_IO_CONTEXT_STRAND_HPP
diff --git a/3rdparty/asio/include/asio/io_service.hpp b/3rdparty/asio/include/asio/io_service.hpp
new file mode 100644
index 00000000000..748d8a6a323
--- /dev/null
+++ b/3rdparty/asio/include/asio/io_service.hpp
@@ -0,0 +1,33 @@
+//
+// io_service.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/io_service_strand.hpp b/3rdparty/asio/include/asio/io_service_strand.hpp
new file mode 100644
index 00000000000..65bb8db2dd3
--- /dev/null
+++ b/3rdparty/asio/include/asio/io_service_strand.hpp
@@ -0,0 +1,20 @@
+//
+// io_service_strand.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/ip/address.hpp b/3rdparty/asio/include/asio/ip/address.hpp
new file mode 100644
index 00000000000..337abe7fd69
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/address.hpp
@@ -0,0 +1,281 @@
+//
+// ip/address.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <functional>
+#include <string>
+#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 <iosfwd>
+#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() noexcept;
+
+ /// Construct an address from an IPv4 address.
+ ASIO_DECL address(
+ const asio::ip::address_v4& ipv4_address) noexcept;
+
+ /// Construct an address from an IPv6 address.
+ ASIO_DECL address(
+ const asio::ip::address_v6& ipv6_address) noexcept;
+
+ /// Copy constructor.
+ ASIO_DECL address(const address& other) noexcept;
+
+ /// Move constructor.
+ ASIO_DECL address(address&& other) noexcept;
+
+ /// Assign from another address.
+ ASIO_DECL address& operator=(const address& other) noexcept;
+
+ /// Move-assign from another address.
+ ASIO_DECL address& operator=(address&& other) noexcept;
+
+ /// Assign from an IPv4 address.
+ ASIO_DECL address& operator=(
+ const asio::ip::address_v4& ipv4_address) noexcept;
+
+ /// Assign from an IPv6 address.
+ ASIO_DECL address& operator=(
+ const asio::ip::address_v6& ipv6_address) noexcept;
+
+ /// Get whether the address is an IP version 4 address.
+ bool is_v4() const noexcept
+ {
+ return type_ == ipv4;
+ }
+
+ /// Get whether the address is an IP version 6 address.
+ bool is_v6() const noexcept
+ {
+ 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 noexcept;
+
+ /// Determine whether the address is unspecified.
+ ASIO_DECL bool is_unspecified() const noexcept;
+
+ /// Determine whether the address is a multicast address.
+ ASIO_DECL bool is_multicast() const noexcept;
+
+ /// Compare two addresses for equality.
+ ASIO_DECL friend bool operator==(const address& a1,
+ const address& a2) noexcept;
+
+ /// Compare two addresses for inequality.
+ friend bool operator!=(const address& a1,
+ const address& a2) noexcept
+ {
+ return !(a1 == a2);
+ }
+
+ /// Compare addresses for ordering.
+ ASIO_DECL friend bool operator<(const address& a1,
+ const address& a2) noexcept;
+
+ /// Compare addresses for ordering.
+ friend bool operator>(const address& a1,
+ const address& a2) noexcept
+ {
+ return a2 < a1;
+ }
+
+ /// Compare addresses for ordering.
+ friend bool operator<=(const address& a1,
+ const address& a2) noexcept
+ {
+ return !(a2 < a1);
+ }
+
+ /// Compare addresses for ordering.
+ friend bool operator>=(const address& a1,
+ const address& a2) noexcept
+ {
+ 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) noexcept;
+
+/// 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) noexcept;
+
+#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) noexcept;
+
+#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 <typename Elem, typename Traits>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& os, const address& addr);
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+
+} // namespace ip
+} // namespace asio
+
+namespace std {
+
+template <>
+struct hash<asio::ip::address>
+{
+ std::size_t operator()(const asio::ip::address& addr)
+ const noexcept
+ {
+ return addr.is_v4()
+ ? std::hash<asio::ip::address_v4>()(addr.to_v4())
+ : std::hash<asio::ip::address_v6>()(addr.to_v6());
+ }
+};
+
+} // namespace std
+
+#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/3rdparty/asio/include/asio/ip/address_v4.hpp b/3rdparty/asio/include/asio/ip/address_v4.hpp
new file mode 100644
index 00000000000..ccef6c80cda
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/address_v4.hpp
@@ -0,0 +1,421 @@
+//
+// ip/address_v4.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <functional>
+#include <string>
+#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 <iosfwd>
+#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<unsigned char, 4> bytes_type;
+#else
+ typedef asio::detail::array<unsigned char, 4> bytes_type;
+#endif
+
+ /// Default constructor.
+ /**
+ * Initialises the @c address_v4 object such that:
+ * @li <tt>to_bytes()</tt> yields <tt>{0, 0, 0, 0}</tt>; and
+ * @li <tt>to_uint() == 0</tt>.
+ */
+ address_v4() noexcept
+ {
+ addr_.s_addr = 0;
+ }
+
+ /// Construct an address from raw bytes.
+ /**
+ * Initialises the @c address_v4 object such that <tt>to_bytes() ==
+ * bytes</tt>.
+ *
+ * @throws out_of_range Thrown if any element in @c bytes is not in the range
+ * <tt>0 - 0xFF</tt>. Note that no range checking is required for platforms
+ * where <tt>std::numeric_limits<unsigned char>::max()</tt> is <tt>0xFF</tt>.
+ */
+ ASIO_DECL explicit address_v4(const bytes_type& bytes);
+
+ /// Construct an address from an unsigned integer in host byte order.
+ /**
+ * Initialises the @c address_v4 object such that <tt>to_uint() == addr</tt>.
+ */
+ ASIO_DECL explicit address_v4(uint_type addr);
+
+ /// Copy constructor.
+ address_v4(const address_v4& other) noexcept
+ : addr_(other.addr_)
+ {
+ }
+
+ /// Move constructor.
+ address_v4(address_v4&& other) noexcept
+ : addr_(other.addr_)
+ {
+ }
+
+ /// Assign from another address.
+ address_v4& operator=(const address_v4& other) noexcept
+ {
+ addr_ = other.addr_;
+ return *this;
+ }
+
+ /// Move-assign from another address.
+ address_v4& operator=(address_v4&& other) noexcept
+ {
+ addr_ = other.addr_;
+ return *this;
+ }
+
+ /// Get the address in bytes, in network byte order.
+ ASIO_DECL bytes_type to_bytes() const noexcept;
+
+ /// Get the address as an unsigned integer in host byte order.
+ ASIO_DECL uint_type to_uint() const noexcept;
+
+#if !defined(ASIO_NO_DEPRECATED)
+ /// (Deprecated: Use to_uint().) 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.
+ /**
+ * This function tests whether the address is in the address block
+ * <tt>127.0.0.0/8</tt>, which corresponds to the address range
+ * <tt>127.0.0.0 - 127.255.255.255</tt>.
+ *
+ * @returns <tt>(to_uint() & 0xFF000000) == 0x7F000000</tt>.
+ */
+ ASIO_DECL bool is_loopback() const noexcept;
+
+ /// Determine whether the address is unspecified.
+ /**
+ * This function tests whether the address is the unspecified address
+ * <tt>0.0.0.0</tt>.
+ *
+ * @returns <tt>to_uint() == 0</tt>.
+ */
+ ASIO_DECL bool is_unspecified() const noexcept;
+
+#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.
+ /**
+ * This function tests whether the address is in the multicast address block
+ * <tt>224.0.0.0/4</tt>, which corresponds to the address range
+ * <tt>224.0.0.0 - 239.255.255.255</tt>.
+ *
+ * @returns <tt>(to_uint() & 0xF0000000) == 0xE0000000</tt>.
+ */
+ ASIO_DECL bool is_multicast() const noexcept;
+
+ /// Compare two addresses for equality.
+ friend bool operator==(const address_v4& a1,
+ const address_v4& a2) noexcept
+ {
+ 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) noexcept
+ {
+ return a1.addr_.s_addr != a2.addr_.s_addr;
+ }
+
+ /// Compare addresses for ordering.
+ /**
+ * Compares two addresses in host byte order.
+ *
+ * @returns <tt>a1.to_uint() < a2.to_uint()</tt>.
+ */
+ friend bool operator<(const address_v4& a1,
+ const address_v4& a2) noexcept
+ {
+ return a1.to_uint() < a2.to_uint();
+ }
+
+ /// Compare addresses for ordering.
+ /**
+ * Compares two addresses in host byte order.
+ *
+ * @returns <tt>a1.to_uint() > a2.to_uint()</tt>.
+ */
+ friend bool operator>(const address_v4& a1,
+ const address_v4& a2) noexcept
+ {
+ return a1.to_uint() > a2.to_uint();
+ }
+
+ /// Compare addresses for ordering.
+ /**
+ * Compares two addresses in host byte order.
+ *
+ * @returns <tt>a1.to_uint() <= a2.to_uint()</tt>.
+ */
+ friend bool operator<=(const address_v4& a1,
+ const address_v4& a2) noexcept
+ {
+ return a1.to_uint() <= a2.to_uint();
+ }
+
+ /// Compare addresses for ordering.
+ /**
+ * Compares two addresses in host byte order.
+ *
+ * @returns <tt>a1.to_uint() >= a2.to_uint()</tt>.
+ */
+ friend bool operator>=(const address_v4& a1,
+ const address_v4& a2) noexcept
+ {
+ return a1.to_uint() >= a2.to_uint();
+ }
+
+ /// Obtain an address object that represents any address.
+ /**
+ * This functions returns an address that represents the "any" address
+ * <tt>0.0.0.0</tt>.
+ *
+ * @returns A default-constructed @c address_v4 object.
+ */
+ static address_v4 any() noexcept
+ {
+ return address_v4();
+ }
+
+ /// Obtain an address object that represents the loopback address.
+ /**
+ * This function returns an address that represents the well-known loopback
+ * address <tt>127.0.0.1</tt>.
+ *
+ * @returns <tt>address_v4(0x7F000001)</tt>.
+ */
+ static address_v4 loopback() noexcept
+ {
+ return address_v4(0x7F000001);
+ }
+
+ /// Obtain an address object that represents the broadcast address.
+ /**
+ * This function returns an address that represents the broadcast address
+ * <tt>255.255.255.255</tt>.
+ *
+ * @returns <tt>address_v4(0xFFFFFFFF)</tt>.
+ */
+ static address_v4 broadcast() noexcept
+ {
+ 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) noexcept;
+
+/// 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) noexcept;
+
+#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) noexcept;
+
+#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 <typename Elem, typename Traits>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& os, const address_v4& addr);
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+
+} // namespace ip
+} // namespace asio
+
+namespace std {
+
+template <>
+struct hash<asio::ip::address_v4>
+{
+ std::size_t operator()(const asio::ip::address_v4& addr)
+ const noexcept
+ {
+ return std::hash<unsigned int>()(addr.to_uint());
+ }
+};
+
+} // namespace std
+
+#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/3rdparty/asio/include/asio/ip/address_v4_iterator.hpp b/3rdparty/asio/include/asio/ip/address_v4_iterator.hpp
new file mode 100644
index 00000000000..5b91f400ac1
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/address_v4_iterator.hpp
@@ -0,0 +1,156 @@
+//
+// ip/address_v4_iterator.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename> 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<address_v4>
+{
+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) noexcept
+ : address_(addr)
+ {
+ }
+
+ /// Copy constructor.
+ basic_address_iterator(const basic_address_iterator& other) noexcept
+ : address_(other.address_)
+ {
+ }
+
+ /// Move constructor.
+ basic_address_iterator(basic_address_iterator&& other) noexcept
+ : address_(static_cast<address_v4&&>(other.address_))
+ {
+ }
+
+ /// Assignment operator.
+ basic_address_iterator& operator=(
+ const basic_address_iterator& other) noexcept
+ {
+ address_ = other.address_;
+ return *this;
+ }
+
+ /// Move assignment operator.
+ basic_address_iterator& operator=(basic_address_iterator&& other) noexcept
+ {
+ address_ = static_cast<address_v4&&>(other.address_);
+ return *this;
+ }
+
+ /// Dereference the iterator.
+ const address_v4& operator*() const noexcept
+ {
+ return address_;
+ }
+
+ /// Dereference the iterator.
+ const address_v4* operator->() const noexcept
+ {
+ return &address_;
+ }
+
+ /// Pre-increment operator.
+ basic_address_iterator& operator++() noexcept
+ {
+ address_ = address_v4((address_.to_uint() + 1) & 0xFFFFFFFF);
+ return *this;
+ }
+
+ /// Post-increment operator.
+ basic_address_iterator operator++(int) noexcept
+ {
+ basic_address_iterator tmp(*this);
+ ++*this;
+ return tmp;
+ }
+
+ /// Pre-decrement operator.
+ basic_address_iterator& operator--() 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> address_v4_iterator;
+
+} // namespace ip
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IP_ADDRESS_V4_ITERATOR_HPP
diff --git a/3rdparty/asio/include/asio/ip/address_v4_range.hpp b/3rdparty/asio/include/asio/ip/address_v4_range.hpp
new file mode 100644
index 00000000000..5fb5e65e2aa
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/address_v4_range.hpp
@@ -0,0 +1,128 @@
+//
+// ip/address_v4_range.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename> 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<address_v4>
+{
+public:
+ /// The type of an iterator that points into the range.
+ typedef basic_address_iterator<address_v4> iterator;
+
+ /// Construct an empty range.
+ basic_address_range() 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) noexcept
+ : begin_(first),
+ end_(last)
+ {
+ }
+
+ /// Copy constructor.
+ basic_address_range(const basic_address_range& other) noexcept
+ : begin_(other.begin_),
+ end_(other.end_)
+ {
+ }
+
+ /// Move constructor.
+ basic_address_range(basic_address_range&& other) noexcept
+ : begin_(static_cast<iterator&&>(other.begin_)),
+ end_(static_cast<iterator&&>(other.end_))
+ {
+ }
+
+ /// Assignment operator.
+ basic_address_range& operator=(const basic_address_range& other) noexcept
+ {
+ begin_ = other.begin_;
+ end_ = other.end_;
+ return *this;
+ }
+
+ /// Move assignment operator.
+ basic_address_range& operator=(basic_address_range&& other) noexcept
+ {
+ begin_ = static_cast<iterator&&>(other.begin_);
+ end_ = static_cast<iterator&&>(other.end_);
+ return *this;
+ }
+
+ /// Obtain an iterator that points to the start of the range.
+ iterator begin() const noexcept
+ {
+ return begin_;
+ }
+
+ /// Obtain an iterator that points to the end of the range.
+ iterator end() const noexcept
+ {
+ return end_;
+ }
+
+ /// Determine whether the range is empty.
+ bool empty() const noexcept
+ {
+ return size() == 0;
+ }
+
+ /// Return the size of the range.
+ std::size_t size() const noexcept
+ {
+ return end_->to_uint() - begin_->to_uint();
+ }
+
+ /// Find an address in the range.
+ iterator find(const address_v4& addr) const 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> address_v4_range;
+
+} // namespace ip
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IP_ADDRESS_V4_RANGE_HPP
diff --git a/3rdparty/asio/include/asio/ip/address_v6.hpp b/3rdparty/asio/include/asio/ip/address_v6.hpp
new file mode 100644
index 00000000000..aa650825cf3
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/address_v6.hpp
@@ -0,0 +1,407 @@
+//
+// ip/address_v6.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <functional>
+#include <string>
+#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"
+#include "asio/ip/address_v4.hpp"
+
+#if !defined(ASIO_NO_IOSTREAM)
+# include <iosfwd>
+#endif // !defined(ASIO_NO_IOSTREAM)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace ip {
+
+template <typename> class basic_address_iterator;
+
+/// Type used for storing IPv6 scope IDs.
+typedef uint_least32_t scope_id_type;
+
+/// 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<unsigned char, 16> bytes_type;
+#else
+ typedef asio::detail::array<unsigned char, 16> bytes_type;
+#endif
+
+ /// Default constructor.
+ /**
+ * Initialises the @c address_v6 object such that:
+ * @li <tt>to_bytes()</tt> yields <tt>{0, 0, ..., 0}</tt>; and
+ * @li <tt>scope_id() == 0</tt>.
+ */
+ ASIO_DECL address_v6() noexcept;
+
+ /// Construct an address from raw bytes and scope ID.
+ /**
+ * Initialises the @c address_v6 object such that:
+ * @li <tt>to_bytes() == bytes</tt>; and
+ * @li <tt>this->scope_id() == scope_id</tt>.
+ *
+ * @throws out_of_range Thrown if any element in @c bytes is not in the range
+ * <tt>0 - 0xFF</tt>. Note that no range checking is required for platforms
+ * where <tt>std::numeric_limits<unsigned char>::max()</tt> is <tt>0xFF</tt>.
+ */
+ ASIO_DECL explicit address_v6(const bytes_type& bytes,
+ scope_id_type scope_id = 0);
+
+ /// Copy constructor.
+ ASIO_DECL address_v6(const address_v6& other) noexcept;
+
+ /// Move constructor.
+ ASIO_DECL address_v6(address_v6&& other) noexcept;
+
+ /// Assign from another address.
+ ASIO_DECL address_v6& operator=(
+ const address_v6& other) noexcept;
+
+ /// Move-assign from another address.
+ ASIO_DECL address_v6& operator=(address_v6&& other) noexcept;
+
+ /// The scope ID of the address.
+ /**
+ * Returns the scope ID associated with the IPv6 address.
+ */
+ scope_id_type scope_id() const noexcept
+ {
+ return scope_id_;
+ }
+
+ /// The scope ID of the address.
+ /**
+ * Modifies the scope ID associated with the IPv6 address.
+ *
+ * @param id The new scope ID.
+ */
+ void scope_id(scope_id_type id) noexcept
+ {
+ scope_id_ = id;
+ }
+
+ /// Get the address in bytes, in network byte order.
+ ASIO_DECL bytes_type to_bytes() const noexcept;
+
+ /// 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.
+ /**
+ * This function tests whether the address is the loopback address
+ * <tt>::1</tt>.
+ */
+ ASIO_DECL bool is_loopback() const noexcept;
+
+ /// Determine whether the address is unspecified.
+ /**
+ * This function tests whether the address is the loopback address
+ * <tt>::</tt>.
+ */
+ ASIO_DECL bool is_unspecified() const noexcept;
+
+ /// Determine whether the address is link local.
+ ASIO_DECL bool is_link_local() const noexcept;
+
+ /// Determine whether the address is site local.
+ ASIO_DECL bool is_site_local() const noexcept;
+
+ /// Determine whether the address is a mapped IPv4 address.
+ ASIO_DECL bool is_v4_mapped() const noexcept;
+
+#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 noexcept;
+
+ /// Determine whether the address is a global multicast address.
+ ASIO_DECL bool is_multicast_global() const noexcept;
+
+ /// Determine whether the address is a link-local multicast address.
+ ASIO_DECL bool is_multicast_link_local() const noexcept;
+
+ /// Determine whether the address is a node-local multicast address.
+ ASIO_DECL bool is_multicast_node_local() const noexcept;
+
+ /// Determine whether the address is a org-local multicast address.
+ ASIO_DECL bool is_multicast_org_local() const noexcept;
+
+ /// Determine whether the address is a site-local multicast address.
+ ASIO_DECL bool is_multicast_site_local() const noexcept;
+
+ /// Compare two addresses for equality.
+ ASIO_DECL friend bool operator==(const address_v6& a1,
+ const address_v6& a2) noexcept;
+
+ /// Compare two addresses for inequality.
+ friend bool operator!=(const address_v6& a1,
+ const address_v6& a2) noexcept
+ {
+ return !(a1 == a2);
+ }
+
+ /// Compare addresses for ordering.
+ ASIO_DECL friend bool operator<(const address_v6& a1,
+ const address_v6& a2) noexcept;
+
+ /// Compare addresses for ordering.
+ friend bool operator>(const address_v6& a1,
+ const address_v6& a2) noexcept
+ {
+ return a2 < a1;
+ }
+
+ /// Compare addresses for ordering.
+ friend bool operator<=(const address_v6& a1,
+ const address_v6& a2) noexcept
+ {
+ return !(a2 < a1);
+ }
+
+ /// Compare addresses for ordering.
+ friend bool operator>=(const address_v6& a1,
+ const address_v6& a2) noexcept
+ {
+ return !(a1 < a2);
+ }
+
+ /// Obtain an address object that represents any address.
+ /**
+ * This functions returns an address that represents the "any" address
+ * <tt>::</tt>.
+ *
+ * @returns A default-constructed @c address_v6 object.
+ */
+ static address_v6 any() noexcept
+ {
+ return address_v6();
+ }
+
+ /// Obtain an address object that represents the loopback address.
+ /**
+ * This function returns an address that represents the well-known loopback
+ * address <tt>::1</tt>.
+ */
+ ASIO_DECL static address_v6 loopback() noexcept;
+
+#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<address_v6>;
+
+ // The underlying IPv6 address.
+ asio::detail::in6_addr_type addr_;
+
+ // The scope ID associated with the address.
+ scope_id_type 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,
+ scope_id_type 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) noexcept;
+
+/// 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) noexcept;
+
+#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) noexcept;
+
+#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 <typename Elem, typename Traits>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& os, const address_v6& addr);
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+
+} // namespace ip
+} // namespace asio
+
+namespace std {
+
+template <>
+struct hash<asio::ip::address_v6>
+{
+ std::size_t operator()(const asio::ip::address_v6& addr)
+ const noexcept
+ {
+ const asio::ip::address_v6::bytes_type bytes = addr.to_bytes();
+ std::size_t result = static_cast<std::size_t>(addr.scope_id());
+ combine_4_bytes(result, &bytes[0]);
+ combine_4_bytes(result, &bytes[4]);
+ combine_4_bytes(result, &bytes[8]);
+ combine_4_bytes(result, &bytes[12]);
+ return result;
+ }
+
+private:
+ static void combine_4_bytes(std::size_t& seed, const unsigned char* bytes)
+ {
+ const std::size_t bytes_hash =
+ (static_cast<std::size_t>(bytes[0]) << 24) |
+ (static_cast<std::size_t>(bytes[1]) << 16) |
+ (static_cast<std::size_t>(bytes[2]) << 8) |
+ (static_cast<std::size_t>(bytes[3]));
+ seed ^= bytes_hash + 0x9e3779b9 + (seed << 6) + (seed >> 2);
+ }
+};
+
+} // namespace std
+
+#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/3rdparty/asio/include/asio/ip/address_v6_iterator.hpp b/3rdparty/asio/include/asio/ip/address_v6_iterator.hpp
new file mode 100644
index 00000000000..5116f614f08
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/address_v6_iterator.hpp
@@ -0,0 +1,178 @@
+//
+// ip/address_v6_iterator.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <typename> 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<address_v6>
+{
+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) noexcept
+ : address_(addr)
+ {
+ }
+
+ /// Copy constructor.
+ basic_address_iterator(
+ const basic_address_iterator& other) noexcept
+ : address_(other.address_)
+ {
+ }
+
+ /// Move constructor.
+ basic_address_iterator(basic_address_iterator&& other) noexcept
+ : address_(static_cast<address_v6&&>(other.address_))
+ {
+ }
+
+ /// Assignment operator.
+ basic_address_iterator& operator=(
+ const basic_address_iterator& other) noexcept
+ {
+ address_ = other.address_;
+ return *this;
+ }
+
+ /// Move assignment operator.
+ basic_address_iterator& operator=(basic_address_iterator&& other) noexcept
+ {
+ address_ = static_cast<address_v6&&>(other.address_);
+ return *this;
+ }
+
+ /// Dereference the iterator.
+ const address_v6& operator*() const noexcept
+ {
+ return address_;
+ }
+
+ /// Dereference the iterator.
+ const address_v6* operator->() const noexcept
+ {
+ return &address_;
+ }
+
+ /// Pre-increment operator.
+ basic_address_iterator& operator++() 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) noexcept
+ {
+ basic_address_iterator tmp(*this);
+ ++*this;
+ return tmp;
+ }
+
+ /// Pre-decrement operator.
+ basic_address_iterator& operator--() 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> address_v6_iterator;
+
+} // namespace ip
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IP_ADDRESS_V6_ITERATOR_HPP
diff --git a/3rdparty/asio/include/asio/ip/address_v6_range.hpp b/3rdparty/asio/include/asio/ip/address_v6_range.hpp
new file mode 100644
index 00000000000..7f89773383d
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/address_v6_range.hpp
@@ -0,0 +1,124 @@
+//
+// ip/address_v6_range.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <typename> 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<address_v6>
+{
+public:
+ /// The type of an iterator that points into the range.
+ typedef basic_address_iterator<address_v6> iterator;
+
+ /// Construct an empty range.
+ basic_address_range() 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) noexcept
+ : begin_(first),
+ end_(last)
+ {
+ }
+
+ /// Copy constructor.
+ basic_address_range(const basic_address_range& other) noexcept
+ : begin_(other.begin_),
+ end_(other.end_)
+ {
+ }
+
+ /// Move constructor.
+ basic_address_range(basic_address_range&& other) noexcept
+ : begin_(static_cast<iterator&&>(other.begin_)),
+ end_(static_cast<iterator&&>(other.end_))
+ {
+ }
+
+ /// Assignment operator.
+ basic_address_range& operator=(
+ const basic_address_range& other) noexcept
+ {
+ begin_ = other.begin_;
+ end_ = other.end_;
+ return *this;
+ }
+
+ /// Move assignment operator.
+ basic_address_range& operator=(basic_address_range&& other) noexcept
+ {
+ begin_ = static_cast<iterator&&>(other.begin_);
+ end_ = static_cast<iterator&&>(other.end_);
+ return *this;
+ }
+
+ /// Obtain an iterator that points to the start of the range.
+ iterator begin() const noexcept
+ {
+ return begin_;
+ }
+
+ /// Obtain an iterator that points to the end of the range.
+ iterator end() const noexcept
+ {
+ return end_;
+ }
+
+ /// Determine whether the range is empty.
+ bool empty() const noexcept
+ {
+ return begin_ == end_;
+ }
+
+ /// Find an address in the range.
+ iterator find(const address_v6& addr) const 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> address_v6_range;
+
+} // namespace ip
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IP_ADDRESS_V6_RANGE_HPP
diff --git a/3rdparty/asio/include/asio/ip/bad_address_cast.hpp b/3rdparty/asio/include/asio/ip/bad_address_cast.hpp
new file mode 100644
index 00000000000..3d242f07048
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/bad_address_cast.hpp
@@ -0,0 +1,63 @@
+//
+// ip/bad_address_cast.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typeinfo>
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace ip {
+
+/// Thrown to indicate a failed address conversion.
+class bad_address_cast :
+#if defined(ASIO_MSVC) && defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS
+ public std::exception
+#else
+ public std::bad_cast
+#endif
+{
+public:
+ /// Default constructor.
+ bad_address_cast() {}
+
+ /// Copy constructor.
+ bad_address_cast(const bad_address_cast& other) noexcept
+#if defined(ASIO_MSVC) && defined(_HAS_EXCEPTIONS) && !_HAS_EXCEPTIONS
+ : std::exception(static_cast<const std::exception&>(other))
+#else
+ : std::bad_cast(static_cast<const std::bad_cast&>(other))
+#endif
+ {
+ }
+
+ /// Destructor.
+ virtual ~bad_address_cast() noexcept {}
+
+ /// Get the message associated with the exception.
+ virtual const char* what() const noexcept
+ {
+ return "bad address cast";
+ }
+};
+
+} // namespace ip
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IP_ADDRESS_HPP
diff --git a/3rdparty/asio/include/asio/ip/basic_endpoint.hpp b/3rdparty/asio/include/asio/ip/basic_endpoint.hpp
new file mode 100644
index 00000000000..3dfb1248db7
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/basic_endpoint.hpp
@@ -0,0 +1,282 @@
+//
+// ip/basic_endpoint.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <functional>
+#include "asio/detail/cstdint.hpp"
+#include "asio/ip/address.hpp"
+#include "asio/ip/detail/endpoint.hpp"
+
+#if !defined(ASIO_NO_IOSTREAM)
+# include <iosfwd>
+#endif // !defined(ASIO_NO_IOSTREAM)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace ip {
+
+/// Type used for storing port numbers.
+typedef uint_least16_t port_type;
+
+/// 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 <typename InternetProtocol>
+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() noexcept
+ : 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,
+ port_type port_num) noexcept
+ : 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,
+ port_type port_num) noexcept
+ : impl_(addr, port_num)
+ {
+ }
+
+ /// Copy constructor.
+ basic_endpoint(const basic_endpoint& other) noexcept
+ : impl_(other.impl_)
+ {
+ }
+
+ /// Move constructor.
+ basic_endpoint(basic_endpoint&& other) noexcept
+ : impl_(other.impl_)
+ {
+ }
+
+ /// Assign from another endpoint.
+ basic_endpoint& operator=(const basic_endpoint& other) noexcept
+ {
+ impl_ = other.impl_;
+ return *this;
+ }
+
+ /// Move-assign from another endpoint.
+ basic_endpoint& operator=(basic_endpoint&& other) noexcept
+ {
+ impl_ = other.impl_;
+ return *this;
+ }
+
+ /// The protocol associated with the endpoint.
+ protocol_type protocol() const noexcept
+ {
+ if (impl_.is_v4())
+ return InternetProtocol::v4();
+ return InternetProtocol::v6();
+ }
+
+ /// Get the underlying endpoint in the native type.
+ data_type* data() noexcept
+ {
+ return impl_.data();
+ }
+
+ /// Get the underlying endpoint in the native type.
+ const data_type* data() const noexcept
+ {
+ return impl_.data();
+ }
+
+ /// Get the underlying size of the endpoint in the native type.
+ std::size_t size() const noexcept
+ {
+ 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 noexcept
+ {
+ return impl_.capacity();
+ }
+
+ /// Get the port associated with the endpoint. The port number is always in
+ /// the host's byte order.
+ port_type port() const noexcept
+ {
+ return impl_.port();
+ }
+
+ /// Set the port associated with the endpoint. The port number is always in
+ /// the host's byte order.
+ void port(port_type port_num) noexcept
+ {
+ impl_.port(port_num);
+ }
+
+ /// Get the IP address associated with the endpoint.
+ asio::ip::address address() const noexcept
+ {
+ return impl_.address();
+ }
+
+ /// Set the IP address associated with the endpoint.
+ void address(const asio::ip::address& addr) noexcept
+ {
+ impl_.address(addr);
+ }
+
+ /// Compare two endpoints for equality.
+ friend bool operator==(const basic_endpoint<InternetProtocol>& e1,
+ const basic_endpoint<InternetProtocol>& e2) noexcept
+ {
+ return e1.impl_ == e2.impl_;
+ }
+
+ /// Compare two endpoints for inequality.
+ friend bool operator!=(const basic_endpoint<InternetProtocol>& e1,
+ const basic_endpoint<InternetProtocol>& e2) noexcept
+ {
+ return !(e1 == e2);
+ }
+
+ /// Compare endpoints for ordering.
+ friend bool operator<(const basic_endpoint<InternetProtocol>& e1,
+ const basic_endpoint<InternetProtocol>& e2) noexcept
+ {
+ return e1.impl_ < e2.impl_;
+ }
+
+ /// Compare endpoints for ordering.
+ friend bool operator>(const basic_endpoint<InternetProtocol>& e1,
+ const basic_endpoint<InternetProtocol>& e2) noexcept
+ {
+ return e2.impl_ < e1.impl_;
+ }
+
+ /// Compare endpoints for ordering.
+ friend bool operator<=(const basic_endpoint<InternetProtocol>& e1,
+ const basic_endpoint<InternetProtocol>& e2) noexcept
+ {
+ return !(e2 < e1);
+ }
+
+ /// Compare endpoints for ordering.
+ friend bool operator>=(const basic_endpoint<InternetProtocol>& e1,
+ const basic_endpoint<InternetProtocol>& e2) noexcept
+ {
+ 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 <typename Elem, typename Traits, typename InternetProtocol>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& os,
+ const basic_endpoint<InternetProtocol>& endpoint);
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+
+} // namespace ip
+} // namespace asio
+
+namespace std {
+
+template <typename InternetProtocol>
+struct hash<asio::ip::basic_endpoint<InternetProtocol>>
+{
+ std::size_t operator()(
+ const asio::ip::basic_endpoint<InternetProtocol>& ep)
+ const noexcept
+ {
+ std::size_t hash1 = std::hash<asio::ip::address>()(ep.address());
+ std::size_t hash2 = std::hash<unsigned short>()(ep.port());
+ return hash1 ^ (hash2 + 0x9e3779b9 + (hash1 << 6) + (hash1 >> 2));
+ }
+};
+
+} // namespace std
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/ip/impl/basic_endpoint.hpp"
+
+#endif // ASIO_IP_BASIC_ENDPOINT_HPP
diff --git a/3rdparty/asio/include/asio/ip/basic_resolver.hpp b/3rdparty/asio/include/asio/ip/basic_resolver.hpp
new file mode 100644
index 00000000000..4d41bfde090
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/basic_resolver.hpp
@@ -0,0 +1,1112 @@
+//
+// ip/basic_resolver.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <string>
+#include <utility>
+#include "asio/any_io_executor.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/string_view.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_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_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 {
+
+#if !defined(ASIO_IP_BASIC_RESOLVER_FWD_DECL)
+#define ASIO_IP_BASIC_RESOLVER_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename InternetProtocol, typename Executor = any_io_executor>
+class basic_resolver;
+
+#endif // !defined(ASIO_IP_BASIC_RESOLVER_FWD_DECL)
+
+/// 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 <typename InternetProtocol, typename Executor>
+class basic_resolver
+ : public resolver_base
+{
+private:
+ class initiate_async_resolve;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the resolver type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The resolver type when rebound to the specified executor.
+ typedef basic_resolver<InternetProtocol, Executor1> other;
+ };
+
+ /// 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<InternetProtocol> query;
+
+ /// (Deprecated.) The iterator type.
+ typedef basic_resolver_iterator<InternetProtocol> iterator;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ /// The results type.
+ typedef basic_resolver_results<InternetProtocol> results_type;
+
+ /// Construct with executor.
+ /**
+ * This constructor creates a basic_resolver.
+ *
+ * @param ex The I/O executor that the resolver will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * resolver.
+ */
+ explicit basic_resolver(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// Construct with execution context.
+ /**
+ * This constructor creates a basic_resolver.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the resolver will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the resolver.
+ */
+ template <typename ExecutionContext>
+ explicit basic_resolver(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// 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(const executor_type&) constructor.
+ */
+ basic_resolver(basic_resolver&& other)
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ // All resolvers have access to each other's implementations.
+ template <typename InternetProtocol1, typename Executor1>
+ friend class basic_resolver;
+
+ /// 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(const executor_type&) constructor.
+ */
+ template <typename Executor1>
+ basic_resolver(basic_resolver<InternetProtocol, Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value
+ > = 0)
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// 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(const executor_type&) constructor.
+ */
+ basic_resolver& operator=(basic_resolver&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ /// 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(const executor_type&) constructor.
+ */
+ template <typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_resolver&
+ > operator=(basic_resolver<InternetProtocol, Executor1>&& other)
+ {
+ basic_resolver tmp(std::move(other));
+ impl_ = std::move(tmp.impl_);
+ return *this;
+ }
+
+ /// 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()
+ {
+ }
+
+ /// Get the executor associated with the object.
+ executor_type get_executor() noexcept
+ {
+ return impl_.get_executor();
+ }
+
+ /// 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 impl_.get_service().cancel(impl_.get_implementation());
+ }
+
+#if !defined(ASIO_NO_DEPRECATED)
+ /// (Deprecated: Use overload with separate host and service parameters.)
+ /// 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 = impl_.get_service().resolve(
+ impl_.get_implementation(), q, ec);
+ asio::detail::throw_error(ec, "resolve");
+ return r;
+ }
+
+ /// (Deprecated: Use overload with separate host and service parameters.)
+ /// 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 impl_.get_service().resolve(impl_.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
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. 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
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. 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. See the @ref resolver_base documentation for the set of
+ * available flags.
+ *
+ * @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
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. 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<protocol_type> q(static_cast<std::string>(host),
+ static_cast<std::string>(service), resolve_flags);
+ results_type r = impl_.get_service().resolve(
+ impl_.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. See the @ref resolver_base documentation for the set of
+ * available flags.
+ *
+ * @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
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. 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<protocol_type> q(static_cast<std::string>(host),
+ static_cast<std::string>(service), resolve_flags);
+ return impl_.get_service().resolve(impl_.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
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. 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
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. 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. See the @ref resolver_base documentation for the set of
+ * available flags.
+ *
+ * @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
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. 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<protocol_type> q(
+ protocol, static_cast<std::string>(host),
+ static_cast<std::string>(service), resolve_flags);
+ results_type r = impl_.get_service().resolve(
+ impl_.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. See the @ref resolver_base documentation for the set of
+ * available flags.
+ *
+ * @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
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. 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<protocol_type> q(
+ protocol, static_cast<std::string>(host),
+ static_cast<std::string>(service), resolve_flags);
+ return impl_.get_service().resolve(impl_.get_implementation(), q, ec);
+ }
+
+#if !defined(ASIO_NO_DEPRECATED)
+ /// (Deprecated: Use overload with separate host and service parameters.)
+ /// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * @param q A query object that determines what endpoints will be returned.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the resolve completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * A successful resolve operation is guaranteed to pass a non-empty range to
+ * the handler.
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, results_type) @endcode
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ results_type)) ResolveToken = default_completion_token_t<executor_type>>
+ auto async_resolve(const query& q,
+ ResolveToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ asio::async_initiate<ResolveToken,
+ void (asio::error_code, results_type)>(
+ declval<initiate_async_resolve>(), token, q))
+ {
+ return asio::async_initiate<ResolveToken,
+ void (asio::error_code, results_type)>(
+ initiate_async_resolve(this), token, q);
+ }
+#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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the resolve completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * A successful resolve operation is guaranteed to pass a non-empty range to
+ * the handler.
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, results_type) @endcode
+ *
+ * @note On POSIX systems, host names may be locally defined in the file
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. Operating systems
+ * may use additional locations when resolving service names.
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ results_type)) ResolveToken = default_completion_token_t<executor_type>>
+ auto async_resolve(ASIO_STRING_VIEW_PARAM host,
+ ASIO_STRING_VIEW_PARAM service,
+ ResolveToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ asio::async_initiate<ResolveToken,
+ void (asio::error_code, results_type)>(
+ declval<initiate_async_resolve>(), token,
+ declval<basic_resolver_query<protocol_type>&>()))
+ {
+ return async_resolve(host, service, resolver_base::flags(),
+ static_cast<ResolveToken&&>(token));
+ }
+
+ /// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * @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. See the @ref resolver_base documentation for the set of
+ * available flags.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the resolve completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * A successful resolve operation is guaranteed to pass a non-empty range to
+ * the handler.
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, results_type) @endcode
+ *
+ * @note On POSIX systems, host names may be locally defined in the file
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. Operating systems
+ * may use additional locations when resolving service names.
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ results_type)) ResolveToken = default_completion_token_t<executor_type>>
+ auto async_resolve(ASIO_STRING_VIEW_PARAM host,
+ ASIO_STRING_VIEW_PARAM service, resolver_base::flags resolve_flags,
+ ResolveToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ asio::async_initiate<ResolveToken,
+ void (asio::error_code, results_type)>(
+ declval<initiate_async_resolve>(), token,
+ declval<basic_resolver_query<protocol_type>&>()))
+ {
+ basic_resolver_query<protocol_type> q(static_cast<std::string>(host),
+ static_cast<std::string>(service), resolve_flags);
+
+ return asio::async_initiate<ResolveToken,
+ void (asio::error_code, results_type)>(
+ initiate_async_resolve(this), token, q);
+ }
+
+ /// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * @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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the resolve completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * A successful resolve operation is guaranteed to pass a non-empty range to
+ * the handler.
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, results_type) @endcode
+ *
+ * @note On POSIX systems, host names may be locally defined in the file
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. Operating systems
+ * may use additional locations when resolving service names.
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ results_type)) ResolveToken = default_completion_token_t<executor_type>>
+ auto async_resolve(const protocol_type& protocol,
+ ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service,
+ ResolveToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ asio::async_initiate<ResolveToken,
+ void (asio::error_code, results_type)>(
+ declval<initiate_async_resolve>(), token,
+ declval<basic_resolver_query<protocol_type>&>()))
+ {
+ return async_resolve(protocol, host, service, resolver_base::flags(),
+ static_cast<ResolveToken&&>(token));
+ }
+
+ /// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * @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. See the @ref resolver_base documentation for the set of
+ * available flags.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the resolve completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * A successful resolve operation is guaranteed to pass a non-empty range to
+ * the handler.
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, results_type) @endcode
+ *
+ * @note On POSIX systems, host names may be locally defined in the file
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. Operating systems
+ * may use additional locations when resolving service names.
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ results_type)) ResolveToken = default_completion_token_t<executor_type>>
+ auto async_resolve(const protocol_type& protocol,
+ ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service,
+ resolver_base::flags resolve_flags,
+ ResolveToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ asio::async_initiate<ResolveToken,
+ void (asio::error_code, results_type)>(
+ declval<initiate_async_resolve>(), token,
+ declval<basic_resolver_query<protocol_type>&>()))
+ {
+ basic_resolver_query<protocol_type> q(
+ protocol, static_cast<std::string>(host),
+ static_cast<std::string>(service), resolve_flags);
+
+ return asio::async_initiate<ResolveToken,
+ void (asio::error_code, results_type)>(
+ initiate_async_resolve(this), token, q);
+ }
+
+ /// 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 = impl_.get_service().resolve(
+ impl_.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 impl_.get_service().resolve(impl_.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. It is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * @param e An endpoint object that determines what endpoints will be
+ * returned.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the resolve completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * A successful resolve operation is guaranteed to pass a non-empty range to
+ * the handler.
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, results_type) @endcode
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ results_type)) ResolveToken = default_completion_token_t<executor_type>>
+ auto async_resolve(const endpoint_type& e,
+ ResolveToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ asio::async_initiate<ResolveToken,
+ void (asio::error_code, results_type)>(
+ declval<initiate_async_resolve>(), token, e))
+ {
+ return asio::async_initiate<ResolveToken,
+ void (asio::error_code, results_type)>(
+ initiate_async_resolve(this), token, e);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_resolver(const basic_resolver&) = delete;
+ basic_resolver& operator=(const basic_resolver&) = delete;
+
+ class initiate_async_resolve
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_resolve(basic_resolver* self)
+ : self_(self)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ResolveHandler, typename Query>
+ void operator()(ResolveHandler&& handler,
+ const Query& q) const
+ {
+ // 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;
+
+ asio::detail::non_const_lvalue<ResolveHandler> handler2(handler);
+ self_->impl_.get_service().async_resolve(
+ self_->impl_.get_implementation(), q,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_resolver* self_;
+ };
+
+# if defined(ASIO_WINDOWS_RUNTIME)
+ asio::detail::io_object_impl<
+ asio::detail::winrt_resolver_service<InternetProtocol>,
+ Executor> impl_;
+# else
+ asio::detail::io_object_impl<
+ asio::detail::resolver_service<InternetProtocol>,
+ Executor> impl_;
+# endif
+};
+
+} // namespace ip
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IP_BASIC_RESOLVER_HPP
diff --git a/3rdparty/asio/include/asio/ip/basic_resolver_entry.hpp b/3rdparty/asio/include/asio/ip/basic_resolver_entry.hpp
new file mode 100644
index 00000000000..a65af27af50
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/basic_resolver_entry.hpp
@@ -0,0 +1,113 @@
+//
+// ip/basic_resolver_entry.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <string>
+#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 <typename InternetProtocol>
+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<std::string>(host)),
+ service_name_(static_cast<std::string>(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 <class Allocator>
+ std::basic_string<char, std::char_traits<char>, Allocator> host_name(
+ const Allocator& alloc = Allocator()) const
+ {
+ return std::basic_string<char, std::char_traits<char>, 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 <class Allocator>
+ std::basic_string<char, std::char_traits<char>, Allocator> service_name(
+ const Allocator& alloc = Allocator()) const
+ {
+ return std::basic_string<char, std::char_traits<char>, 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/3rdparty/asio/include/asio/ip/basic_resolver_iterator.hpp b/3rdparty/asio/include/asio/ip/basic_resolver_iterator.hpp
new file mode 100644
index 00000000000..b494f7ae02c
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/basic_resolver_iterator.hpp
@@ -0,0 +1,188 @@
+//
+// ip/basic_resolver_iterator.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <cstring>
+#include <iterator>
+#include <string>
+#include <vector>
+#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<InternetProtocol> @endcode
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Unsafe.
+ */
+template <typename InternetProtocol>
+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<InternetProtocol> value_type;
+
+ /// The type of the result of applying operator->() to the iterator.
+ typedef const basic_resolver_entry<InternetProtocol>* pointer;
+
+ /// The type of the result of applying operator*() to the iterator.
+ typedef const basic_resolver_entry<InternetProtocol>& 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_)
+ {
+ }
+
+ /// Move constructor.
+ basic_resolver_iterator(basic_resolver_iterator&& other)
+ : values_(static_cast<values_ptr_type&&>(other.values_)),
+ index_(other.index_)
+ {
+ other.index_ = 0;
+ }
+
+ /// Assignment operator.
+ basic_resolver_iterator& operator=(const basic_resolver_iterator& other)
+ {
+ values_ = other.values_;
+ index_ = other.index_;
+ return *this;
+ }
+
+ /// Move-assignment operator.
+ basic_resolver_iterator& operator=(basic_resolver_iterator&& other)
+ {
+ if (this != &other)
+ {
+ values_ = static_cast<values_ptr_type&&>(other.values_);
+ index_ = other.index_;
+ other.index_ = 0;
+ }
+
+ return *this;
+ }
+
+ /// Dereference an iterator.
+ const basic_resolver_entry<InternetProtocol>& operator*() const
+ {
+ return dereference();
+ }
+
+ /// Dereference an iterator.
+ const basic_resolver_entry<InternetProtocol>* 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<InternetProtocol>& dereference() const
+ {
+ return (*values_)[index_];
+ }
+
+ typedef std::vector<basic_resolver_entry<InternetProtocol>> values_type;
+ typedef asio::detail::shared_ptr<values_type> 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/3rdparty/asio/include/asio/ip/basic_resolver_query.hpp b/3rdparty/asio/include/asio/ip/basic_resolver_query.hpp
new file mode 100644
index 00000000000..ada5a4f3802
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/basic_resolver_query.hpp
@@ -0,0 +1,260 @@
+//
+// ip/basic_resolver_query.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <string>
+#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 <typename InternetProtocol>
+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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. 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<int>(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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. 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<int>(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
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. 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<int>(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
+ * <tt>/etc/hosts</tt>. On Windows, host names may be defined in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\hosts</tt>. 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
+ * <tt>/etc/services</tt>. On Windows, service names may be found in the file
+ * <tt>c:\\windows\\system32\\drivers\\etc\\services</tt>. 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<int>(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;
+ }
+
+ /// Copy construct a @c basic_resolver_query from another.
+ basic_resolver_query(const basic_resolver_query& other)
+ : hints_(other.hints_),
+ host_name_(other.host_name_),
+ service_name_(other.service_name_)
+ {
+ }
+
+ /// Move construct a @c basic_resolver_query from another.
+ basic_resolver_query(basic_resolver_query&& other)
+ : hints_(other.hints_),
+ host_name_(static_cast<std::string&&>(other.host_name_)),
+ service_name_(static_cast<std::string&&>(other.service_name_))
+ {
+ }
+
+ /// 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/3rdparty/asio/include/asio/ip/basic_resolver_results.hpp b/3rdparty/asio/include/asio/ip/basic_resolver_results.hpp
new file mode 100644
index 00000000000..7a461f13bc4
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/basic_resolver_results.hpp
@@ -0,0 +1,307 @@
+//
+// ip/basic_resolver_results.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <cstring>
+#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<InternetProtocol> @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 <typename InternetProtocol>
+class basic_resolver_results
+#if !defined(ASIO_NO_DEPRECATED)
+ : public basic_resolver_iterator<InternetProtocol>
+#else // !defined(ASIO_NO_DEPRECATED)
+ : private basic_resolver_iterator<InternetProtocol>
+#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<protocol_type> 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<protocol_type> 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<InternetProtocol>(other)
+ {
+ }
+
+ /// Move constructor.
+ basic_resolver_results(basic_resolver_results&& other)
+ : basic_resolver_iterator<InternetProtocol>(
+ static_cast<basic_resolver_results&&>(other))
+ {
+ }
+
+ /// Assignment operator.
+ basic_resolver_results& operator=(const basic_resolver_results& other)
+ {
+ basic_resolver_iterator<InternetProtocol>::operator=(other);
+ return *this;
+ }
+
+ /// Move-assignment operator.
+ basic_resolver_results& operator=(basic_resolver_results&& other)
+ {
+ basic_resolver_iterator<InternetProtocol>::operator=(
+ static_cast<basic_resolver_results&&>(other));
+ return *this;
+ }
+
+#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<std::size_t>(address_info->ai_addrlen));
+ memcpy(endpoint.data(), address_info->ai_addr,
+ address_info->ai_addrlen);
+ results.values_->push_back(
+ basic_resolver_entry<InternetProtocol>(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<InternetProtocol>(
+ endpoint, host_name, service_name));
+ return results;
+ }
+
+ // Create results from a sequence of endpoints, host and service name.
+ template <typename EndpointIterator>
+ 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<InternetProtocol>(
+ *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<InternetProtocol>(
+ 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 noexcept
+ {
+ return this->values_ ? this->values_->size() : 0;
+ }
+
+ /// Get the maximum number of entries permitted in a results range.
+ size_type max_size() const noexcept
+ {
+ return this->values_ ? this->values_->max_size() : values_type().max_size();
+ }
+
+ /// Determine whether the results range is empty.
+ bool empty() const noexcept
+ {
+ return this->values_ ? this->values_->empty() : true;
+ }
+
+ /// Obtain a begin iterator for the results range.
+ const_iterator begin() const
+ {
+ basic_resolver_results tmp(*this);
+ tmp.index_ = 0;
+ return static_cast<basic_resolver_results&&>(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) 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<basic_resolver_entry<InternetProtocol>> values_type;
+};
+
+} // namespace ip
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IP_BASIC_RESOLVER_RESULTS_HPP
diff --git a/3rdparty/asio/include/asio/ip/detail/endpoint.hpp b/3rdparty/asio/include/asio/ip/detail/endpoint.hpp
new file mode 100644
index 00000000000..2c4e3cd43f3
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/detail/endpoint.hpp
@@ -0,0 +1,141 @@
+//
+// ip/detail/endpoint.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <string>
+#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() noexcept;
+
+ // Construct an endpoint using a family and port number.
+ ASIO_DECL endpoint(int family,
+ unsigned short port_num) noexcept;
+
+ // Construct an endpoint using an address and port number.
+ ASIO_DECL endpoint(const asio::ip::address& addr,
+ unsigned short port_num) noexcept;
+
+ // Copy constructor.
+ endpoint(const endpoint& other) noexcept
+ : data_(other.data_)
+ {
+ }
+
+ // Assign from another endpoint.
+ endpoint& operator=(const endpoint& other) noexcept
+ {
+ data_ = other.data_;
+ return *this;
+ }
+
+ // Get the underlying endpoint in the native type.
+ asio::detail::socket_addr_type* data() noexcept
+ {
+ return &data_.base;
+ }
+
+ // Get the underlying endpoint in the native type.
+ const asio::detail::socket_addr_type* data() const noexcept
+ {
+ return &data_.base;
+ }
+
+ // Get the underlying size of the endpoint in the native type.
+ std::size_t size() const noexcept
+ {
+ 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 noexcept
+ {
+ return sizeof(data_);
+ }
+
+ // Get the port associated with the endpoint.
+ ASIO_DECL unsigned short port() const noexcept;
+
+ // Set the port associated with the endpoint.
+ ASIO_DECL void port(unsigned short port_num) noexcept;
+
+ // Get the IP address associated with the endpoint.
+ ASIO_DECL asio::ip::address address() const noexcept;
+
+ // Set the IP address associated with the endpoint.
+ ASIO_DECL void address(
+ const asio::ip::address& addr) noexcept;
+
+ // Compare two endpoints for equality.
+ ASIO_DECL friend bool operator==(const endpoint& e1,
+ const endpoint& e2) noexcept;
+
+ // Compare endpoints for ordering.
+ ASIO_DECL friend bool operator<(const endpoint& e1,
+ const endpoint& e2) noexcept;
+
+ // Determine whether the endpoint is IPv4.
+ bool is_v4() const noexcept
+ {
+ 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/3rdparty/asio/include/asio/ip/detail/impl/endpoint.ipp b/3rdparty/asio/include/asio/ip/detail/impl/endpoint.ipp
new file mode 100644
index 00000000000..ef61208e234
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/detail/impl/endpoint.ipp
@@ -0,0 +1,195 @@
+//
+// ip/detail/impl/endpoint.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstring>
+#if !defined(ASIO_NO_IOSTREAM)
+# include <sstream>
+#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() noexcept
+ : 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) noexcept
+ : 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) noexcept
+ : 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<asio::detail::u_long_type>(
+ 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 noexcept
+{
+ 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) noexcept
+{
+ 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 noexcept
+{
+ 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;
+ memcpy(bytes.data(), data_.v6.sin6_addr.s6_addr, 16);
+ return asio::ip::address_v6(bytes, data_.v6.sin6_scope_id);
+ }
+}
+
+void endpoint::address(const asio::ip::address& addr) noexcept
+{
+ endpoint tmp_endpoint(addr, port());
+ data_ = tmp_endpoint.data_;
+}
+
+bool operator==(const endpoint& e1, const endpoint& e2) noexcept
+{
+ return e1.address() == e2.address() && e1.port() == e2.port();
+}
+
+bool operator<(const endpoint& e1, const endpoint& e2) noexcept
+{
+ 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/3rdparty/asio/include/asio/ip/detail/socket_option.hpp b/3rdparty/asio/include/asio/ip/detail/socket_option.hpp
new file mode 100644
index 00000000000..c9883ae033e
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/detail/socket_option.hpp
@@ -0,0 +1,566 @@
+//
+// detail/socket_option.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <cstring>
+#include <stdexcept>
+#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 <int IPv4_Level, int IPv4_Name, int IPv6_Level, int IPv6_Name>
+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 <typename Protocol>
+ 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 <typename Protocol>
+ 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 <typename Protocol>
+ void* data(const Protocol& protocol)
+ {
+ if (protocol.family() == PF_INET6)
+ return &ipv6_value_;
+ return &ipv4_value_;
+ }
+
+ // Get the address of the boolean data.
+ template <typename Protocol>
+ 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 <typename Protocol>
+ 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 <typename Protocol>
+ 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 <int IPv4_Level, int IPv4_Name, int IPv6_Level, int IPv6_Name>
+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 <typename Protocol>
+ 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 <typename Protocol>
+ int name(const Protocol& protocol) const
+ {
+ if (protocol.family() == PF_INET6)
+ return IPv6_Name;
+ return IPv4_Name;
+ }
+
+ // Get the address of the data.
+ template <typename Protocol>
+ int* data(const Protocol&)
+ {
+ return &value_;
+ }
+
+ // Get the address of the data.
+ template <typename Protocol>
+ const int* data(const Protocol&) const
+ {
+ return &value_;
+ }
+
+ // Get the size of the data.
+ template <typename Protocol>
+ std::size_t size(const Protocol&) const
+ {
+ return sizeof(value_);
+ }
+
+ // Set the size of the data.
+ template <typename Protocol>
+ 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 <int IPv4_Level, int IPv4_Name, int IPv6_Level, int IPv6_Name>
+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 <typename Protocol>
+ 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 <typename Protocol>
+ int name(const Protocol& protocol) const
+ {
+ if (protocol.family() == PF_INET6)
+ return IPv6_Name;
+ return IPv4_Name;
+ }
+
+ // Get the address of the data.
+ template <typename Protocol>
+ void* data(const Protocol& protocol)
+ {
+ if (protocol.family() == PF_INET6)
+ return &ipv6_value_;
+ return &ipv4_value_;
+ }
+
+ // Get the address of the data.
+ template <typename Protocol>
+ 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 <typename Protocol>
+ 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 <typename Protocol>
+ 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 <int IPv4_Level, int IPv4_Name, int IPv6_Level, int IPv6_Name>
+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 <typename Protocol>
+ 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 <typename Protocol>
+ 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 <typename Protocol>
+ 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 <typename Protocol>
+ 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 <int IPv4_Level, int IPv4_Name, int IPv6_Level, int IPv6_Name>
+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 <typename Protocol>
+ 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 <typename Protocol>
+ 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 <typename Protocol>
+ 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 <typename Protocol>
+ 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/3rdparty/asio/include/asio/ip/host_name.hpp b/3rdparty/asio/include/asio/ip/host_name.hpp
new file mode 100644
index 00000000000..f9cb1852cae
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/host_name.hpp
@@ -0,0 +1,42 @@
+//
+// ip/host_name.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <string>
+#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/3rdparty/asio/include/asio/ip/icmp.hpp b/3rdparty/asio/include/asio/ip/icmp.hpp
new file mode 100644
index 00000000000..9e4e8e4cb5b
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/icmp.hpp
@@ -0,0 +1,115 @@
+//
+// ip/icmp.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<icmp> endpoint;
+
+ /// Construct to represent the IPv4 ICMP protocol.
+ static icmp v4() noexcept
+ {
+ return icmp(ASIO_OS_DEF(IPPROTO_ICMP),
+ ASIO_OS_DEF(AF_INET));
+ }
+
+ /// Construct to represent the IPv6 ICMP protocol.
+ static icmp v6() noexcept
+ {
+ return icmp(ASIO_OS_DEF(IPPROTO_ICMPV6),
+ ASIO_OS_DEF(AF_INET6));
+ }
+
+ /// Obtain an identifier for the type of the protocol.
+ int type() const noexcept
+ {
+ return ASIO_OS_DEF(SOCK_RAW);
+ }
+
+ /// Obtain an identifier for the protocol.
+ int protocol() const noexcept
+ {
+ return protocol_;
+ }
+
+ /// Obtain an identifier for the protocol family.
+ int family() const noexcept
+ {
+ return family_;
+ }
+
+ /// The ICMP socket type.
+ typedef basic_raw_socket<icmp> socket;
+
+ /// The ICMP resolver type.
+ typedef basic_resolver<icmp> 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) noexcept
+ : 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/3rdparty/asio/include/asio/ip/impl/address.hpp b/3rdparty/asio/include/asio/ip/impl/address.hpp
new file mode 100644
index 00000000000..5780f320067
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/impl/address.hpp
@@ -0,0 +1,67 @@
+//
+// ip/impl/address.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Elem, typename Traits>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& 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/3rdparty/asio/include/asio/ip/impl/address.ipp b/3rdparty/asio/include/asio/ip/impl/address.ipp
new file mode 100644
index 00000000000..9893b4ce9c2
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/impl/address.ipp
@@ -0,0 +1,235 @@
+//
+// ip/impl/address.ipp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typeinfo>
+#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() noexcept
+ : type_(ipv4),
+ ipv4_address_(),
+ ipv6_address_()
+{
+}
+
+address::address(
+ const asio::ip::address_v4& ipv4_address) noexcept
+ : type_(ipv4),
+ ipv4_address_(ipv4_address),
+ ipv6_address_()
+{
+}
+
+address::address(
+ const asio::ip::address_v6& ipv6_address) noexcept
+ : type_(ipv6),
+ ipv4_address_(),
+ ipv6_address_(ipv6_address)
+{
+}
+
+address::address(const address& other) noexcept
+ : type_(other.type_),
+ ipv4_address_(other.ipv4_address_),
+ ipv6_address_(other.ipv6_address_)
+{
+}
+
+address::address(address&& other) noexcept
+ : type_(other.type_),
+ ipv4_address_(other.ipv4_address_),
+ ipv6_address_(other.ipv6_address_)
+{
+}
+
+address& address::operator=(const address& other) noexcept
+{
+ type_ = other.type_;
+ ipv4_address_ = other.ipv4_address_;
+ ipv6_address_ = other.ipv6_address_;
+ return *this;
+}
+
+address& address::operator=(address&& other) noexcept
+{
+ type_ = other.type_;
+ ipv4_address_ = other.ipv4_address_;
+ ipv6_address_ = other.ipv6_address_;
+ return *this;
+}
+
+address& address::operator=(
+ const asio::ip::address_v4& ipv4_address) noexcept
+{
+ type_ = ipv4;
+ ipv4_address_ = ipv4_address;
+ ipv6_address_ = asio::ip::address_v6();
+ return *this;
+}
+
+address& address::operator=(
+ const asio::ip::address_v6& ipv6_address) noexcept
+{
+ 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) noexcept
+{
+ 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) noexcept
+{
+ return make_address(str.c_str(), ec);
+}
+
+#if defined(ASIO_HAS_STRING_VIEW)
+
+address make_address(string_view str)
+{
+ return make_address(static_cast<std::string>(str));
+}
+
+address make_address(string_view str,
+ asio::error_code& ec) noexcept
+{
+ return make_address(static_cast<std::string>(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 noexcept
+{
+ return (type_ == ipv4)
+ ? ipv4_address_.is_loopback()
+ : ipv6_address_.is_loopback();
+}
+
+bool address::is_unspecified() const noexcept
+{
+ return (type_ == ipv4)
+ ? ipv4_address_.is_unspecified()
+ : ipv6_address_.is_unspecified();
+}
+
+bool address::is_multicast() const noexcept
+{
+ return (type_ == ipv4)
+ ? ipv4_address_.is_multicast()
+ : ipv6_address_.is_multicast();
+}
+
+bool operator==(const address& a1, const address& a2) noexcept
+{
+ 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) noexcept
+{
+ 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/3rdparty/asio/include/asio/ip/impl/address_v4.hpp b/3rdparty/asio/include/asio/ip/impl/address_v4.hpp
new file mode 100644
index 00000000000..5e29a249ba8
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/impl/address_v4.hpp
@@ -0,0 +1,67 @@
+//
+// ip/impl/address_v4.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Elem, typename Traits>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& 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/3rdparty/asio/include/asio/ip/impl/address_v4.ipp b/3rdparty/asio/include/asio/ip/impl/address_v4.ipp
new file mode 100644
index 00000000000..d7803271ac9
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/impl/address_v4.ipp
@@ -0,0 +1,206 @@
+//
+// ip/impl/address_v4.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <climits>
+#include <limits>
+#include <stdexcept>
+#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<uint_type>::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<asio::detail::u_long_type>(addr));
+}
+
+address_v4::bytes_type address_v4::to_bytes() const noexcept
+{
+ using namespace std; // For memcpy.
+ bytes_type bytes;
+ memcpy(bytes.data(), &addr_.s_addr, 4);
+ return bytes;
+}
+
+address_v4::uint_type address_v4::to_uint() const noexcept
+{
+ 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 noexcept
+{
+ return (to_uint() & 0xFF000000) == 0x7F000000;
+}
+
+bool address_v4::is_unspecified() const noexcept
+{
+ 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 noexcept
+{
+ 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) noexcept
+{
+ 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) noexcept
+{
+ 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<std::string>(str));
+}
+
+address_v4 make_address_v4(string_view str,
+ asio::error_code& ec) noexcept
+{
+ return make_address_v4(static_cast<std::string>(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/3rdparty/asio/include/asio/ip/impl/address_v6.hpp b/3rdparty/asio/include/asio/ip/impl/address_v6.hpp
new file mode 100644
index 00000000000..b4b53abe069
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/impl/address_v6.hpp
@@ -0,0 +1,67 @@
+//
+// ip/impl/address_v6.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Elem, typename Traits>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& 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/3rdparty/asio/include/asio/ip/impl/address_v6.ipp b/3rdparty/asio/include/asio/ip/impl/address_v6.ipp
new file mode 100644
index 00000000000..8d5b7d1fd09
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/impl/address_v6.ipp
@@ -0,0 +1,342 @@
+//
+// ip/impl/address_v6.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstring>
+#include <stdexcept>
+#include <typeinfo>
+#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() noexcept
+ : addr_(),
+ scope_id_(0)
+{
+}
+
+address_v6::address_v6(const address_v6::bytes_type& bytes,
+ scope_id_type 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) noexcept
+ : addr_(other.addr_),
+ scope_id_(other.scope_id_)
+{
+}
+
+address_v6::address_v6(address_v6&& other) noexcept
+ : addr_(other.addr_),
+ scope_id_(other.scope_id_)
+{
+}
+
+address_v6& address_v6::operator=(const address_v6& other) noexcept
+{
+ addr_ = other.addr_;
+ scope_id_ = other.scope_id_;
+ return *this;
+}
+
+address_v6& address_v6::operator=(address_v6&& other) noexcept
+{
+ addr_ = other.addr_;
+ scope_id_ = other.scope_id_;
+ return *this;
+}
+
+address_v6::bytes_type address_v6::to_bytes() const noexcept
+{
+ using namespace std; // For memcpy.
+ bytes_type bytes;
+ memcpy(bytes.data(), addr_.s6_addr, 16);
+ 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 noexcept
+{
+ 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 noexcept
+{
+ 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 noexcept
+{
+ return ((addr_.s6_addr[0] == 0xfe) && ((addr_.s6_addr[1] & 0xc0) == 0x80));
+}
+
+bool address_v6::is_site_local() const noexcept
+{
+ return ((addr_.s6_addr[0] == 0xfe) && ((addr_.s6_addr[1] & 0xc0) == 0xc0));
+}
+
+bool address_v6::is_v4_mapped() const noexcept
+{
+ 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 noexcept
+{
+ return (addr_.s6_addr[0] == 0xff);
+}
+
+bool address_v6::is_multicast_global() const noexcept
+{
+ return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x0e));
+}
+
+bool address_v6::is_multicast_link_local() const noexcept
+{
+ return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x02));
+}
+
+bool address_v6::is_multicast_node_local() const noexcept
+{
+ return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x01));
+}
+
+bool address_v6::is_multicast_org_local() const noexcept
+{
+ return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x08));
+}
+
+bool address_v6::is_multicast_site_local() const noexcept
+{
+ return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x05));
+}
+
+bool operator==(const address_v6& a1, const address_v6& a2) noexcept
+{
+ 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) noexcept
+{
+ 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() noexcept
+{
+ 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) noexcept
+{
+ 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) noexcept
+{
+ 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<std::string>(str));
+}
+
+address_v6 make_address_v6(string_view str,
+ asio::error_code& ec) noexcept
+{
+ return make_address_v6(static_cast<std::string>(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/3rdparty/asio/include/asio/ip/impl/basic_endpoint.hpp b/3rdparty/asio/include/asio/ip/impl/basic_endpoint.hpp
new file mode 100644
index 00000000000..2da96c16547
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/impl/basic_endpoint.hpp
@@ -0,0 +1,43 @@
+//
+// ip/impl/basic_endpoint.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Elem, typename Traits, typename InternetProtocol>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& os,
+ const basic_endpoint<InternetProtocol>& 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/3rdparty/asio/include/asio/ip/impl/host_name.ipp b/3rdparty/asio/include/asio/ip/impl/host_name.ipp
new file mode 100644
index 00000000000..eb27829fdab
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/impl/host_name.ipp
@@ -0,0 +1,54 @@
+//
+// ip/impl/host_name.ipp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/ip/impl/network_v4.hpp b/3rdparty/asio/include/asio/ip/impl/network_v4.hpp
new file mode 100644
index 00000000000..2199c7da8ca
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/impl/network_v4.hpp
@@ -0,0 +1,54 @@
+//
+// ip/impl/network_v4.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <typename Elem, typename Traits>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& os, const network_v4& addr)
+{
+ asio::error_code ec;
+ std::string s = addr.to_string(ec);
+ if (ec)
+ {
+ if (os.exceptions() & std::basic_ostream<Elem, Traits>::failbit)
+ asio::detail::throw_error(ec);
+ else
+ os.setstate(std::basic_ostream<Elem, Traits>::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/3rdparty/asio/include/asio/ip/impl/network_v4.ipp b/3rdparty/asio/include/asio/ip/impl/network_v4.ipp
new file mode 100644
index 00000000000..e7e68ed443a
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/impl/network_v4.ipp
@@ -0,0 +1,218 @@
+//
+// ip/impl/network_v4.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <climits>
+#include <cstdio>
+#include <cstdlib>
+#include <stdexcept>
+#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 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 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_SNPRINTF)
+ snprintf(prefix_len, sizeof(prefix_len), "/%u", prefix_length_);
+#elif 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<unsigned short>(prefix_len));
+}
+
+#if defined(ASIO_HAS_STRING_VIEW)
+
+network_v4 make_network_v4(string_view str)
+{
+ return make_network_v4(static_cast<std::string>(str));
+}
+
+network_v4 make_network_v4(string_view str,
+ asio::error_code& ec)
+{
+ return make_network_v4(static_cast<std::string>(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/3rdparty/asio/include/asio/ip/impl/network_v6.hpp b/3rdparty/asio/include/asio/ip/impl/network_v6.hpp
new file mode 100644
index 00000000000..69c121813cb
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/impl/network_v6.hpp
@@ -0,0 +1,53 @@
+//
+// ip/impl/network_v6.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Elem, typename Traits>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& os, const network_v6& addr)
+{
+ asio::error_code ec;
+ std::string s = addr.to_string(ec);
+ if (ec)
+ {
+ if (os.exceptions() & std::basic_ostream<Elem, Traits>::failbit)
+ asio::detail::throw_error(ec);
+ else
+ os.setstate(std::basic_ostream<Elem, Traits>::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/3rdparty/asio/include/asio/ip/impl/network_v6.ipp b/3rdparty/asio/include/asio/ip/impl/network_v6.ipp
new file mode 100644
index 00000000000..d85cd647e06
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/impl/network_v6.ipp
@@ -0,0 +1,187 @@
+//
+// ip/impl/network_v6.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <climits>
+#include <cstdio>
+#include <cstdlib>
+#include <stdexcept>
+#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 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 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_SNPRINTF)
+ snprintf(prefix_len, sizeof(prefix_len), "/%u", prefix_length_);
+#elif 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<unsigned short>(prefix_len));
+}
+
+#if defined(ASIO_HAS_STRING_VIEW)
+
+network_v6 make_network_v6(string_view str)
+{
+ return make_network_v6(static_cast<std::string>(str));
+}
+
+network_v6 make_network_v6(string_view str,
+ asio::error_code& ec)
+{
+ return make_network_v6(static_cast<std::string>(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/3rdparty/asio/include/asio/ip/multicast.hpp b/3rdparty/asio/include/asio/ip/multicast.hpp
new file mode 100644
index 00000000000..363f5ed81d5
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/multicast.hpp
@@ -0,0 +1,191 @@
+//
+// ip/multicast.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#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(my_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(my_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(my_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(my_context);
+ * ...
+ * asio::ip::multicast::hops option(4);
+ * socket.set_option(option);
+ * @endcode
+ *
+ * @par
+ * Getting the current option value:
+ * @code
+ * asio::ip::udp::socket socket(my_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(my_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(my_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/3rdparty/asio/include/asio/ip/network_v4.hpp b/3rdparty/asio/include/asio/ip/network_v4.hpp
new file mode 100644
index 00000000000..1c29ebec143
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/network_v4.hpp
@@ -0,0 +1,257 @@
+//
+// ip/network_v4.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <string>
+#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() 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) noexcept
+ : address_(other.address_),
+ prefix_length_(other.prefix_length_)
+ {
+ }
+
+ /// Move constructor.
+ network_v4(network_v4&& other) noexcept
+ : address_(static_cast<address_v4&&>(other.address_)),
+ prefix_length_(other.prefix_length_)
+ {
+ }
+
+ /// Assign from another network.
+ network_v4& operator=(const network_v4& other) noexcept
+ {
+ address_ = other.address_;
+ prefix_length_ = other.prefix_length_;
+ return *this;
+ }
+
+ /// Move-assign from another network.
+ network_v4& operator=(network_v4&& other) noexcept
+ {
+ address_ = static_cast<address_v4&&>(other.address_);
+ prefix_length_ = other.prefix_length_;
+ return *this;
+ }
+
+ /// Obtain the address object specified when the network object was created.
+ address_v4 address() const noexcept
+ {
+ return address_;
+ }
+
+ /// Obtain the prefix length that was specified when the network object was
+ /// created.
+ unsigned short prefix_length() const noexcept
+ {
+ return prefix_length_;
+ }
+
+ /// Obtain the netmask that was specified when the network object was created.
+ ASIO_DECL address_v4 netmask() const noexcept;
+
+ /// Obtain an address object that represents the network address.
+ address_v4 network() const 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 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 noexcept;
+
+ /// Obtain the true network address, omitting any host bits.
+ network_v4 canonical() const noexcept
+ {
+ return network_v4(network(), prefix_length());
+ }
+
+ /// Test if network is a valid host address.
+ bool is_host() const 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 <typename Elem, typename Traits>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& 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/3rdparty/asio/include/asio/ip/network_v6.hpp b/3rdparty/asio/include/asio/ip/network_v6.hpp
new file mode 100644
index 00000000000..942ed9d2f29
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/network_v6.hpp
@@ -0,0 +1,231 @@
+//
+// ip/network_v6.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <string>
+#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() 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) noexcept
+ : address_(other.address_),
+ prefix_length_(other.prefix_length_)
+ {
+ }
+
+ /// Move constructor.
+ network_v6(network_v6&& other) noexcept
+ : address_(static_cast<address_v6&&>(other.address_)),
+ prefix_length_(other.prefix_length_)
+ {
+ }
+
+ /// Assign from another network.
+ network_v6& operator=(const network_v6& other) noexcept
+ {
+ address_ = other.address_;
+ prefix_length_ = other.prefix_length_;
+ return *this;
+ }
+
+ /// Move-assign from another network.
+ network_v6& operator=(network_v6&& other) noexcept
+ {
+ address_ = static_cast<address_v6&&>(other.address_);
+ prefix_length_ = other.prefix_length_;
+ return *this;
+ }
+
+ /// Obtain the address object specified when the network object was created.
+ address_v6 address() const noexcept
+ {
+ return address_;
+ }
+
+ /// Obtain the prefix length that was specified when the network object was
+ /// created.
+ unsigned short prefix_length() const noexcept
+ {
+ return prefix_length_;
+ }
+
+ /// Obtain an address object that represents the network address.
+ ASIO_DECL address_v6 network() const noexcept;
+
+ /// Obtain an address range corresponding to the hosts in the network.
+ ASIO_DECL address_v6_range hosts() const noexcept;
+
+ /// Obtain the true network address, omitting any host bits.
+ network_v6 canonical() const noexcept
+ {
+ return network_v6(network(), prefix_length());
+ }
+
+ /// Test if network is a valid host address.
+ bool is_host() const 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 <typename Elem, typename Traits>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& 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/3rdparty/asio/include/asio/ip/resolver_base.hpp b/3rdparty/asio/include/asio/ip/resolver_base.hpp
new file mode 100644
index 00000000000..9fa01ca9107
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/resolver_base.hpp
@@ -0,0 +1,129 @@
+//
+// ip/resolver_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<flags>(
+ static_cast<unsigned int>(x) & static_cast<unsigned int>(y));
+ }
+
+ friend flags operator|(flags x, flags y)
+ {
+ return static_cast<flags>(
+ static_cast<unsigned int>(x) | static_cast<unsigned int>(y));
+ }
+
+ friend flags operator^(flags x, flags y)
+ {
+ return static_cast<flags>(
+ static_cast<unsigned int>(x) ^ static_cast<unsigned int>(y));
+ }
+
+ friend flags operator~(flags x)
+ {
+ return static_cast<flags>(~static_cast<unsigned int>(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/3rdparty/asio/include/asio/ip/resolver_query_base.hpp b/3rdparty/asio/include/asio/ip/resolver_query_base.hpp
new file mode 100644
index 00000000000..892bc28e006
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/resolver_query_base.hpp
@@ -0,0 +1,43 @@
+//
+// ip/resolver_query_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/ip/tcp.hpp b/3rdparty/asio/include/asio/ip/tcp.hpp
new file mode 100644
index 00000000000..b8319609ddb
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/tcp.hpp
@@ -0,0 +1,155 @@
+//
+// ip/tcp.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<tcp> endpoint;
+
+ /// Construct to represent the IPv4 TCP protocol.
+ static tcp v4() noexcept
+ {
+ return tcp(ASIO_OS_DEF(AF_INET));
+ }
+
+ /// Construct to represent the IPv6 TCP protocol.
+ static tcp v6() noexcept
+ {
+ return tcp(ASIO_OS_DEF(AF_INET6));
+ }
+
+ /// Obtain an identifier for the type of the protocol.
+ int type() const noexcept
+ {
+ return ASIO_OS_DEF(SOCK_STREAM);
+ }
+
+ /// Obtain an identifier for the protocol.
+ int protocol() const noexcept
+ {
+ return ASIO_OS_DEF(IPPROTO_TCP);
+ }
+
+ /// Obtain an identifier for the protocol family.
+ int family() const noexcept
+ {
+ return family_;
+ }
+
+ /// The TCP socket type.
+ typedef basic_stream_socket<tcp> socket;
+
+ /// The TCP acceptor type.
+ typedef basic_socket_acceptor<tcp> acceptor;
+
+ /// The TCP resolver type.
+ typedef basic_resolver<tcp> resolver;
+
+#if !defined(ASIO_NO_IOSTREAM)
+ /// The TCP iostream type.
+ typedef basic_socket_iostream<tcp> 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(my_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(my_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) noexcept
+ : family_(protocol_family)
+ {
+ }
+
+ int family_;
+};
+
+} // namespace ip
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IP_TCP_HPP
diff --git a/3rdparty/asio/include/asio/ip/udp.hpp b/3rdparty/asio/include/asio/ip/udp.hpp
new file mode 100644
index 00000000000..50c667a5371
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/udp.hpp
@@ -0,0 +1,111 @@
+//
+// ip/udp.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<udp> endpoint;
+
+ /// Construct to represent the IPv4 UDP protocol.
+ static udp v4() noexcept
+ {
+ return udp(ASIO_OS_DEF(AF_INET));
+ }
+
+ /// Construct to represent the IPv6 UDP protocol.
+ static udp v6() noexcept
+ {
+ return udp(ASIO_OS_DEF(AF_INET6));
+ }
+
+ /// Obtain an identifier for the type of the protocol.
+ int type() const noexcept
+ {
+ return ASIO_OS_DEF(SOCK_DGRAM);
+ }
+
+ /// Obtain an identifier for the protocol.
+ int protocol() const noexcept
+ {
+ return ASIO_OS_DEF(IPPROTO_UDP);
+ }
+
+ /// Obtain an identifier for the protocol family.
+ int family() const noexcept
+ {
+ return family_;
+ }
+
+ /// The UDP socket type.
+ typedef basic_datagram_socket<udp> socket;
+
+ /// The UDP resolver type.
+ typedef basic_resolver<udp> 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) noexcept
+ : family_(protocol_family)
+ {
+ }
+
+ int family_;
+};
+
+} // namespace ip
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IP_UDP_HPP
diff --git a/3rdparty/asio/include/asio/ip/unicast.hpp b/3rdparty/asio/include/asio/ip/unicast.hpp
new file mode 100644
index 00000000000..4d68af877bc
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/unicast.hpp
@@ -0,0 +1,70 @@
+//
+// ip/unicast.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#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(my_context);
+ * ...
+ * asio::ip::unicast::hops option(4);
+ * socket.set_option(option);
+ * @endcode
+ *
+ * @par
+ * Getting the current option value:
+ * @code
+ * asio::ip::udp::socket socket(my_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/3rdparty/asio/include/asio/ip/v6_only.hpp b/3rdparty/asio/include/asio/ip/v6_only.hpp
new file mode 100644
index 00000000000..0fc61213bda
--- /dev/null
+++ b/3rdparty/asio/include/asio/ip/v6_only.hpp
@@ -0,0 +1,69 @@
+//
+// ip/v6_only.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/IPV6_V6ONLY socket option.
+ *
+ * @par Examples
+ * Setting the option:
+ * @code
+ * asio::ip::tcp::socket socket(my_context);
+ * ...
+ * asio::ip::v6_only option(true);
+ * socket.set_option(option);
+ * @endcode
+ *
+ * @par
+ * Getting the current option value:
+ * @code
+ * asio::ip::tcp::socket socket(my_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/3rdparty/asio/include/asio/is_applicable_property.hpp b/3rdparty/asio/include/asio/is_applicable_property.hpp
new file mode 100644
index 00000000000..20ca981ad02
--- /dev/null
+++ b/3rdparty/asio/include/asio/is_applicable_property.hpp
@@ -0,0 +1,61 @@
+//
+// is_applicable_property.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_APPLICABLE_PROPERTY_HPP
+#define ASIO_IS_APPLICABLE_PROPERTY_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"
+
+namespace asio {
+namespace detail {
+
+template <typename T, typename Property, typename = void>
+struct is_applicable_property_trait : false_type
+{
+};
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename Property>
+struct is_applicable_property_trait<T, Property,
+ void_t<
+ enable_if_t<
+ !!Property::template is_applicable_property_v<T>
+ >
+ >> : true_type
+{
+};
+
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+} // namespace detail
+
+template <typename T, typename Property, typename = void>
+struct is_applicable_property :
+ detail::is_applicable_property_trait<T, Property>
+{
+};
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename Property>
+constexpr const bool is_applicable_property_v
+ = is_applicable_property<T, Property>::value;
+
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+} // namespace asio
+
+#endif // ASIO_IS_APPLICABLE_PROPERTY_HPP
diff --git a/3rdparty/asio/include/asio/is_contiguous_iterator.hpp b/3rdparty/asio/include/asio/is_contiguous_iterator.hpp
new file mode 100644
index 00000000000..a120d4d3761
--- /dev/null
+++ b/3rdparty/asio/include/asio/is_contiguous_iterator.hpp
@@ -0,0 +1,45 @@
+//
+// is_contiguous_iterator.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_CONTIGUOUS_ITERATOR_HPP
+#define ASIO_IS_CONTIGUOUS_ITERATOR_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <iterator>
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// The is_contiguous_iterator class is a traits class that may be used to
+/// determine whether a type is a contiguous iterator.
+template <typename T>
+struct is_contiguous_iterator :
+#if defined(ASIO_HAS_STD_CONCEPTS) \
+ || defined(GENERATING_DOCUMENTATION)
+ integral_constant<bool, std::contiguous_iterator<T>>
+#else // defined(ASIO_HAS_STD_CONCEPTS)
+ // || defined(GENERATING_DOCUMENTATION)
+ is_pointer<T>
+#endif // defined(ASIO_HAS_STD_CONCEPTS)
+ // || defined(GENERATING_DOCUMENTATION)
+{
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IS_CONTIGUOUS_ITERATOR_HPP
diff --git a/3rdparty/asio/include/asio/is_executor.hpp b/3rdparty/asio/include/asio/is_executor.hpp
new file mode 100644
index 00000000000..2c933a3949c
--- /dev/null
+++ b/3rdparty/asio/include/asio/is_executor.hpp
@@ -0,0 +1,46 @@
+//
+// is_executor.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename T>
+struct is_executor
+#if defined(GENERATING_DOCUMENTATION)
+ : integral_constant<bool, automatically_determined>
+#else // defined(GENERATING_DOCUMENTATION)
+ : asio::detail::is_executor<T>
+#endif // defined(GENERATING_DOCUMENTATION)
+{
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_IS_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/is_read_buffered.hpp b/3rdparty/asio/include/asio/is_read_buffered.hpp
new file mode 100644
index 00000000000..768f70fb7e1
--- /dev/null
+++ b/3rdparty/asio/include/asio/is_read_buffered.hpp
@@ -0,0 +1,59 @@
+//
+// is_read_buffered.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Stream>
+char is_read_buffered_helper(buffered_stream<Stream>* s);
+
+template <typename Stream>
+char is_read_buffered_helper(buffered_read_stream<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 <typename Stream>
+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/3rdparty/asio/include/asio/is_write_buffered.hpp b/3rdparty/asio/include/asio/is_write_buffered.hpp
new file mode 100644
index 00000000000..1818fd4b2d5
--- /dev/null
+++ b/3rdparty/asio/include/asio/is_write_buffered.hpp
@@ -0,0 +1,59 @@
+//
+// is_write_buffered.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Stream>
+char is_write_buffered_helper(buffered_stream<Stream>* s);
+
+template <typename Stream>
+char is_write_buffered_helper(buffered_write_stream<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 <typename Stream>
+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/3rdparty/asio/include/asio/local/basic_endpoint.hpp b/3rdparty/asio/include/asio/local/basic_endpoint.hpp
new file mode 100644
index 00000000000..d363f352531
--- /dev/null
+++ b/3rdparty/asio/include/asio/local/basic_endpoint.hpp
@@ -0,0 +1,243 @@
+//
+// local/basic_endpoint.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <iosfwd>
+#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 <typename Protocol>
+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() noexcept
+ {
+ }
+
+ /// 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)
+ {
+ }
+
+ #if defined(ASIO_HAS_STRING_VIEW)
+ /// Construct an endpoint using the specified path name.
+ basic_endpoint(string_view path_name)
+ : impl_(path_name)
+ {
+ }
+ #endif // defined(ASIO_HAS_STRING_VIEW)
+
+ /// Copy constructor.
+ basic_endpoint(const basic_endpoint& other)
+ : impl_(other.impl_)
+ {
+ }
+
+ /// Move constructor.
+ basic_endpoint(basic_endpoint&& other)
+ : impl_(other.impl_)
+ {
+ }
+
+ /// Assign from another endpoint.
+ basic_endpoint& operator=(const basic_endpoint& other)
+ {
+ impl_ = other.impl_;
+ return *this;
+ }
+
+ /// Move-assign from another endpoint.
+ basic_endpoint& operator=(basic_endpoint&& other)
+ {
+ impl_ = other.impl_;
+ return *this;
+ }
+
+ /// 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<Protocol>& e1,
+ const basic_endpoint<Protocol>& e2)
+ {
+ return e1.impl_ == e2.impl_;
+ }
+
+ /// Compare two endpoints for inequality.
+ friend bool operator!=(const basic_endpoint<Protocol>& e1,
+ const basic_endpoint<Protocol>& e2)
+ {
+ return !(e1.impl_ == e2.impl_);
+ }
+
+ /// Compare endpoints for ordering.
+ friend bool operator<(const basic_endpoint<Protocol>& e1,
+ const basic_endpoint<Protocol>& e2)
+ {
+ return e1.impl_ < e2.impl_;
+ }
+
+ /// Compare endpoints for ordering.
+ friend bool operator>(const basic_endpoint<Protocol>& e1,
+ const basic_endpoint<Protocol>& e2)
+ {
+ return e2.impl_ < e1.impl_;
+ }
+
+ /// Compare endpoints for ordering.
+ friend bool operator<=(const basic_endpoint<Protocol>& e1,
+ const basic_endpoint<Protocol>& e2)
+ {
+ return !(e2 < e1);
+ }
+
+ /// Compare endpoints for ordering.
+ friend bool operator>=(const basic_endpoint<Protocol>& e1,
+ const basic_endpoint<Protocol>& 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 <typename Elem, typename Traits, typename Protocol>
+std::basic_ostream<Elem, Traits>& operator<<(
+ std::basic_ostream<Elem, Traits>& os,
+ const basic_endpoint<Protocol>& 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/3rdparty/asio/include/asio/local/connect_pair.hpp b/3rdparty/asio/include/asio/local/connect_pair.hpp
new file mode 100644
index 00000000000..b8608e40de5
--- /dev/null
+++ b/3rdparty/asio/include/asio/local/connect_pair.hpp
@@ -0,0 +1,101 @@
+//
+// local/connect_pair.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Protocol, typename Executor1, typename Executor2>
+void connect_pair(basic_socket<Protocol, Executor1>& socket1,
+ basic_socket<Protocol, Executor2>& socket2);
+
+/// Create a pair of connected sockets.
+template <typename Protocol, typename Executor1, typename Executor2>
+ASIO_SYNC_OP_VOID connect_pair(basic_socket<Protocol, Executor1>& socket1,
+ basic_socket<Protocol, Executor2>& socket2, asio::error_code& ec);
+
+template <typename Protocol, typename Executor1, typename Executor2>
+inline void connect_pair(basic_socket<Protocol, Executor1>& socket1,
+ basic_socket<Protocol, Executor2>& socket2)
+{
+ asio::error_code ec;
+ connect_pair(socket1, socket2, ec);
+ asio::detail::throw_error(ec, "connect_pair");
+}
+
+template <typename Protocol, typename Executor1, typename Executor2>
+inline ASIO_SYNC_OP_VOID connect_pair(
+ basic_socket<Protocol, Executor1>& socket1,
+ basic_socket<Protocol, Executor2>& socket2, asio::error_code& ec)
+{
+ // Check that this function is only being used with a UNIX domain socket.
+ asio::local::basic_endpoint<Protocol>* tmp
+ = static_cast<typename Protocol::endpoint*>(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/3rdparty/asio/include/asio/local/datagram_protocol.hpp b/3rdparty/asio/include/asio/local/datagram_protocol.hpp
new file mode 100644
index 00000000000..6bf18a46e49
--- /dev/null
+++ b/3rdparty/asio/include/asio/local/datagram_protocol.hpp
@@ -0,0 +1,80 @@
+//
+// local/datagram_protocol.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 noexcept
+ {
+ return SOCK_DGRAM;
+ }
+
+ /// Obtain an identifier for the protocol.
+ int protocol() const noexcept
+ {
+ return 0;
+ }
+
+ /// Obtain an identifier for the protocol family.
+ int family() const noexcept
+ {
+ return AF_UNIX;
+ }
+
+ /// The type of a UNIX domain endpoint.
+ typedef basic_endpoint<datagram_protocol> endpoint;
+
+ /// The UNIX domain socket type.
+ typedef basic_datagram_socket<datagram_protocol> 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/3rdparty/asio/include/asio/local/detail/endpoint.hpp b/3rdparty/asio/include/asio/local/detail/endpoint.hpp
new file mode 100644
index 00000000000..5e94c3d0aeb
--- /dev/null
+++ b/3rdparty/asio/include/asio/local/detail/endpoint.hpp
@@ -0,0 +1,139 @@
+//
+// local/detail/endpoint.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <cstddef>
+#include <string>
+#include "asio/detail/socket_types.hpp"
+#include "asio/detail/string_view.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);
+
+ #if defined(ASIO_HAS_STRING_VIEW)
+ // Construct an endpoint using the specified path name.
+ ASIO_DECL endpoint(string_view path_name);
+ #endif // defined(ASIO_HAS_STRING_VIEW)
+
+ // 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/3rdparty/asio/include/asio/local/detail/impl/endpoint.ipp b/3rdparty/asio/include/asio/local/detail/impl/endpoint.ipp
new file mode 100644
index 00000000000..55b403e8ed6
--- /dev/null
+++ b/3rdparty/asio/include/asio/local/detail/impl/endpoint.ipp
@@ -0,0 +1,131 @@
+//
+// local/detail/impl/endpoint.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <cstring>
+#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());
+}
+
+#if defined(ASIO_HAS_STRING_VIEW)
+endpoint::endpoint(string_view path_name)
+{
+ init(path_name.data(), path_name.length());
+}
+#endif // defined(ASIO_HAS_STRING_VIEW)
+
+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 memset and memcpy.
+ memset(&data_.local, 0, sizeof(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;
+}
+
+} // 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/3rdparty/asio/include/asio/local/seq_packet_protocol.hpp b/3rdparty/asio/include/asio/local/seq_packet_protocol.hpp
new file mode 100644
index 00000000000..c5a231fe859
--- /dev/null
+++ b/3rdparty/asio/include/asio/local/seq_packet_protocol.hpp
@@ -0,0 +1,84 @@
+//
+// local/seq_packet_protocol.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_SEQ_PACKET_PROTOCOL_HPP
+#define ASIO_LOCAL_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"
+
+#if defined(ASIO_HAS_LOCAL_SOCKETS) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/basic_socket_acceptor.hpp"
+#include "asio/basic_seq_packet_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 seq_packet UNIX sockets.
+/**
+ * The asio::local::seq_packet_protocol class contains flags necessary
+ * for sequenced packet UNIX domain sockets.
+ *
+ * @par Thread Safety
+ * @e Distinct @e objects: Safe.@n
+ * @e Shared @e objects: Safe.
+ *
+ * @par Concepts:
+ * Protocol.
+ */
+class seq_packet_protocol
+{
+public:
+ /// Obtain an identifier for the type of the protocol.
+ int type() const noexcept
+ {
+ return SOCK_SEQPACKET;
+ }
+
+ /// Obtain an identifier for the protocol.
+ int protocol() const noexcept
+ {
+ return 0;
+ }
+
+ /// Obtain an identifier for the protocol family.
+ int family() const noexcept
+ {
+ return AF_UNIX;
+ }
+
+ /// The type of a UNIX domain endpoint.
+ typedef basic_endpoint<seq_packet_protocol> endpoint;
+
+ /// The UNIX domain socket type.
+ typedef basic_seq_packet_socket<seq_packet_protocol> socket;
+
+ /// The UNIX domain acceptor type.
+ typedef basic_socket_acceptor<seq_packet_protocol> acceptor;
+};
+
+} // namespace local
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_LOCAL_SOCKETS)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_LOCAL_SEQ_PACKET_PROTOCOL_HPP
diff --git a/3rdparty/asio/include/asio/local/stream_protocol.hpp b/3rdparty/asio/include/asio/local/stream_protocol.hpp
new file mode 100644
index 00000000000..4cbad450fc5
--- /dev/null
+++ b/3rdparty/asio/include/asio/local/stream_protocol.hpp
@@ -0,0 +1,90 @@
+//
+// local/stream_protocol.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 noexcept
+ {
+ return SOCK_STREAM;
+ }
+
+ /// Obtain an identifier for the protocol.
+ int protocol() const noexcept
+ {
+ return 0;
+ }
+
+ /// Obtain an identifier for the protocol family.
+ int family() const noexcept
+ {
+ return AF_UNIX;
+ }
+
+ /// The type of a UNIX domain endpoint.
+ typedef basic_endpoint<stream_protocol> endpoint;
+
+ /// The UNIX domain socket type.
+ typedef basic_stream_socket<stream_protocol> socket;
+
+ /// The UNIX domain acceptor type.
+ typedef basic_socket_acceptor<stream_protocol> acceptor;
+
+#if !defined(ASIO_NO_IOSTREAM)
+ /// The UNIX domain iostream type.
+ typedef basic_socket_iostream<stream_protocol> 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/3rdparty/asio/include/asio/multiple_exceptions.hpp b/3rdparty/asio/include/asio/multiple_exceptions.hpp
new file mode 100644
index 00000000000..2fd0455a91a
--- /dev/null
+++ b/3rdparty/asio/include/asio/multiple_exceptions.hpp
@@ -0,0 +1,52 @@
+//
+// multiple_exceptions.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_MULTIPLE_EXCEPTIONS_HPP
+#define ASIO_MULTIPLE_EXCEPTIONS_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <exception>
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Exception thrown when there are multiple pending exceptions to rethrow.
+class multiple_exceptions
+ : public std::exception
+{
+public:
+ /// Constructor.
+ ASIO_DECL multiple_exceptions(
+ std::exception_ptr first) noexcept;
+
+ /// Obtain message associated with exception.
+ ASIO_DECL virtual const char* what() const
+ noexcept;
+
+ /// Obtain a pointer to the first exception.
+ ASIO_DECL std::exception_ptr first_exception() const;
+
+private:
+ std::exception_ptr first_;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#if defined(ASIO_HEADER_ONLY)
+# include "asio/impl/multiple_exceptions.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // ASIO_MULTIPLE_EXCEPTIONS_HPP
diff --git a/3rdparty/asio/include/asio/packaged_task.hpp b/3rdparty/asio/include/asio/packaged_task.hpp
new file mode 100644
index 00000000000..68e5b9b175a
--- /dev/null
+++ b/3rdparty/asio/include/asio/packaged_task.hpp
@@ -0,0 +1,66 @@
+//
+// packaged_task.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include "asio/detail/future.hpp"
+
+#if defined(ASIO_HAS_STD_FUTURE_CLASS) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/async_result.hpp"
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Partial specialisation of @c async_result for @c std::packaged_task.
+template <typename Result, typename... Args, typename Signature>
+class async_result<std::packaged_task<Result(Args...)>, Signature>
+{
+public:
+ /// The packaged task is the concrete completion handler type.
+ typedef std::packaged_task<Result(Args...)> completion_handler_type;
+
+ /// The return type of the initiating function is the future obtained from
+ /// the packaged task.
+ typedef std::future<Result> 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_;
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_STD_FUTURE_CLASS)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_PACKAGED_TASK_HPP
diff --git a/3rdparty/asio/include/asio/placeholders.hpp b/3rdparty/asio/include/asio/placeholders.hpp
new file mode 100644
index 00000000000..21da545fe9e
--- /dev/null
+++ b/3rdparty/asio/include/asio/placeholders.hpp
@@ -0,0 +1,75 @@
+//
+// placeholders.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include "asio/detail/functional.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace placeholders {
+
+#if defined(GENERATING_DOCUMENTATION)
+
+/// An argument placeholder, for use with std::bind() or 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 std::bind() or 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 std::bind() or 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 std::bind() or 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 std::bind() or 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 std::bind() or 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;
+
+#else
+
+static constexpr auto& error = std::placeholders::_1;
+static constexpr auto& bytes_transferred = std::placeholders::_2;
+static constexpr auto& iterator = std::placeholders::_2;
+static constexpr auto& results = std::placeholders::_2;
+static constexpr auto& endpoint = std::placeholders::_2;
+static constexpr auto& signal_number = std::placeholders::_2;
+
+#endif
+
+} // namespace placeholders
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_PLACEHOLDERS_HPP
diff --git a/3rdparty/asio/include/asio/posix/basic_descriptor.hpp b/3rdparty/asio/include/asio/posix/basic_descriptor.hpp
new file mode 100644
index 00000000000..fa47d6a0949
--- /dev/null
+++ b/3rdparty/asio/include/asio/posix/basic_descriptor.hpp
@@ -0,0 +1,773 @@
+//
+// posix/basic_descriptor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_HAS_POSIX_STREAM_DESCRIPTOR) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include <utility>
+#include "asio/any_io_executor.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/non_const_lvalue.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/posix/descriptor_base.hpp"
+
+#if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/io_uring_descriptor_service.hpp"
+#else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+# include "asio/detail/reactive_descriptor_service.hpp"
+#endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+#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 <typename Executor = any_io_executor>
+class basic_descriptor
+ : public descriptor_base
+{
+private:
+ class initiate_async_wait;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the descriptor type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The descriptor type when rebound to the specified executor.
+ typedef basic_descriptor<Executor1> other;
+ };
+
+ /// The native representation of a descriptor.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#elif defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ typedef detail::io_uring_descriptor_service::native_handle_type
+ native_handle_type;
+#else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ typedef detail::reactive_descriptor_service::native_handle_type
+ native_handle_type;
+#endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+ /// A descriptor is always the lowest layer.
+ typedef basic_descriptor lowest_layer_type;
+
+ /// Construct a descriptor without opening it.
+ /**
+ * This constructor creates a descriptor without opening it.
+ *
+ * @param ex The I/O executor that the descriptor will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * descriptor.
+ */
+ explicit basic_descriptor(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// Construct a descriptor without opening it.
+ /**
+ * This constructor creates a descriptor without opening it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the descriptor will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the descriptor.
+ */
+ template <typename ExecutionContext>
+ explicit basic_descriptor(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// Construct a descriptor on an existing native descriptor.
+ /**
+ * This constructor creates a descriptor object to hold an existing native
+ * descriptor.
+ *
+ * @param ex The I/O executor that the descriptor will use, by default, 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(const executor_type& ex,
+ const native_handle_type& native_descriptor)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(),
+ native_descriptor, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Construct a descriptor on an existing native descriptor.
+ /**
+ * This constructor creates a descriptor object to hold an existing native
+ * descriptor.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the descriptor will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the descriptor.
+ *
+ * @param native_descriptor A native descriptor.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_descriptor(ExecutionContext& context,
+ const native_handle_type& native_descriptor,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(),
+ native_descriptor, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// 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 basic_descriptor(const executor_type&)
+ * constructor.
+ */
+ basic_descriptor(basic_descriptor&& other) noexcept
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// 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 basic_descriptor(const executor_type&)
+ * constructor.
+ */
+ basic_descriptor& operator=(basic_descriptor&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ // All descriptors have access to each other's implementations.
+ template <typename Executor1>
+ friend class basic_descriptor;
+
+ /// Move-construct a basic_descriptor from a descriptor of another executor
+ /// type.
+ /**
+ * 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(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ basic_descriptor(basic_descriptor<Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// Move-assign a basic_descriptor from a descriptor of another executor type.
+ /**
+ * 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(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_descriptor&
+ > operator=(basic_descriptor<Executor1> && other)
+ {
+ basic_descriptor tmp(std::move(other));
+ impl_ = std::move(tmp.impl_);
+ return *this;
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return impl_.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;
+ impl_.get_service().assign(impl_.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)
+ {
+ impl_.get_service().assign(
+ impl_.get_implementation(), native_descriptor, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Determine whether the descriptor is open.
+ bool is_open() const
+ {
+ return impl_.get_service().is_open(impl_.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;
+ impl_.get_service().close(impl_.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)
+ {
+ impl_.get_service().close(impl_.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 impl_.get_service().native_handle(impl_.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 impl_.get_service().release(impl_.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;
+ impl_.get_service().cancel(impl_.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)
+ {
+ impl_.get_service().cancel(impl_.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(my_context);
+ * ...
+ * asio::posix::stream_descriptor::bytes_readable command;
+ * descriptor.io_control(command);
+ * std::size_t bytes_readable = command.get();
+ * @endcode
+ */
+ template <typename IoControlCommand>
+ void io_control(IoControlCommand& command)
+ {
+ asio::error_code ec;
+ impl_.get_service().io_control(impl_.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(my_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 <typename IoControlCommand>
+ ASIO_SYNC_OP_VOID io_control(IoControlCommand& command,
+ asio::error_code& ec)
+ {
+ impl_.get_service().io_control(impl_.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 impl_.get_service().non_blocking(impl_.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;
+ impl_.get_service().non_blocking(impl_.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)
+ {
+ impl_.get_service().non_blocking(impl_.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 impl_.get_service().native_non_blocking(
+ impl_.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;
+ impl_.get_service().native_non_blocking(
+ impl_.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)
+ {
+ impl_.get_service().native_non_blocking(
+ impl_.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(my_context);
+ * ...
+ * descriptor.wait(asio::posix::stream_descriptor::wait_read);
+ * @endcode
+ */
+ void wait(wait_type w)
+ {
+ asio::error_code ec;
+ impl_.get_service().wait(impl_.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(my_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)
+ {
+ impl_.get_service().wait(impl_.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. It is an initiating
+ * function for an @ref asynchronous_operation, and always returns
+ * immediately.
+ *
+ * @param w Specifies the desired descriptor state.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the wait completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code) @endcode
+ *
+ * @par Example
+ * @code
+ * void wait_handler(const asio::error_code& error)
+ * {
+ * if (!error)
+ * {
+ * // Wait succeeded.
+ * }
+ * }
+ *
+ * ...
+ *
+ * asio::posix::stream_descriptor descriptor(my_context);
+ * ...
+ * descriptor.async_wait(
+ * asio::posix::stream_descriptor::wait_read,
+ * wait_handler);
+ * @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ WaitToken = default_completion_token_t<executor_type>>
+ auto async_wait(wait_type w,
+ WaitToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WaitToken, void (asio::error_code)>(
+ declval<initiate_async_wait>(), token, w))
+ {
+ return async_initiate<WaitToken, void (asio::error_code)>(
+ initiate_async_wait(this), token, w);
+ }
+
+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.
+ */
+ ~basic_descriptor()
+ {
+ }
+
+#if defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ detail::io_object_impl<detail::io_uring_descriptor_service, Executor> impl_;
+#else // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+ detail::io_object_impl<detail::reactive_descriptor_service, Executor> impl_;
+#endif // defined(ASIO_HAS_IO_URING_AS_DEFAULT)
+
+private:
+ // Disallow copying and assignment.
+ basic_descriptor(const basic_descriptor&) = delete;
+ basic_descriptor& operator=(const basic_descriptor&) = delete;
+
+ class initiate_async_wait
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_wait(basic_descriptor* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WaitHandler>
+ void operator()(WaitHandler&& handler, wait_type w) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WaitHandler> handler2(handler);
+ self_->impl_.get_service().async_wait(
+ self_->impl_.get_implementation(), w,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_descriptor* self_;
+ };
+};
+
+} // namespace posix
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_POSIX_BASIC_DESCRIPTOR_HPP
diff --git a/3rdparty/asio/include/asio/posix/basic_stream_descriptor.hpp b/3rdparty/asio/include/asio/posix/basic_stream_descriptor.hpp
new file mode 100644
index 00000000000..9868dee1259
--- /dev/null
+++ b/3rdparty/asio/include/asio/posix/basic_stream_descriptor.hpp
@@ -0,0 +1,559 @@
+//
+// posix/basic_stream_descriptor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include "asio/posix/basic_descriptor.hpp"
+
+#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#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.
+ *
+ * Synchronous @c read_some and @c write_some operations are thread safe with
+ * respect to each other, if the underlying operating system calls are also
+ * thread safe. This means that it is permitted to perform concurrent calls to
+ * these synchronous operations on a single descriptor object. Other synchronous
+ * operations, such as @c close, are not thread safe.
+ *
+ * @par Concepts:
+ * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream.
+ */
+template <typename Executor = any_io_executor>
+class basic_stream_descriptor
+ : public basic_descriptor<Executor>
+{
+private:
+ class initiate_async_write_some;
+ class initiate_async_read_some;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the descriptor type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The descriptor type when rebound to the specified executor.
+ typedef basic_stream_descriptor<Executor1> other;
+ };
+
+ /// The native representation of a descriptor.
+ typedef typename basic_descriptor<Executor>::native_handle_type
+ native_handle_type;
+
+ /// 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 ex The I/O executor that the descriptor will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * descriptor.
+ */
+ explicit basic_stream_descriptor(const executor_type& ex)
+ : basic_descriptor<Executor>(ex)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the descriptor will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the descriptor.
+ */
+ template <typename ExecutionContext>
+ explicit basic_stream_descriptor(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_descriptor<Executor>(context)
+ {
+ }
+
+ /// Construct a stream descriptor on an existing native descriptor.
+ /**
+ * This constructor creates a stream descriptor object to hold an existing
+ * native descriptor.
+ *
+ * @param ex The I/O executor that the descriptor will use, by default, 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(const executor_type& ex,
+ const native_handle_type& native_descriptor)
+ : basic_descriptor<Executor>(ex, native_descriptor)
+ {
+ }
+
+ /// Construct a stream descriptor on an existing native descriptor.
+ /**
+ * This constructor creates a stream descriptor object to hold an existing
+ * native descriptor.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the descriptor will use, by default, 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.
+ */
+ template <typename ExecutionContext>
+ basic_stream_descriptor(ExecutionContext& context,
+ const native_handle_type& native_descriptor,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_descriptor<Executor>(context, native_descriptor)
+ {
+ }
+
+ /// 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 basic_stream_descriptor(const executor_type&)
+ * constructor.
+ */
+ basic_stream_descriptor(basic_stream_descriptor&& other) noexcept
+ : basic_descriptor<Executor>(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 basic_stream_descriptor(const executor_type&)
+ * constructor.
+ */
+ basic_stream_descriptor& operator=(basic_stream_descriptor&& other)
+ {
+ basic_descriptor<Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// Move-construct a basic_stream_descriptor from a descriptor of another
+ /// executor type.
+ /**
+ * This constructor moves a 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(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ basic_stream_descriptor(basic_stream_descriptor<Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_descriptor<Executor>(std::move(other))
+ {
+ }
+
+ /// Move-assign a basic_stream_descriptor from a descriptor of another
+ /// executor type.
+ /**
+ * This assignment operator moves a 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(const executor_type&)
+ * constructor.
+ */
+ template <typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_stream_descriptor&
+ > operator=(basic_stream_descriptor<Executor1> && other)
+ {
+ basic_descriptor<Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// 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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().write_some(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().write_some(
+ this->impl_.get_implementation(), buffers, ec);
+ }
+
+ /// Start an asynchronous write.
+ /**
+ * This function is used to asynchronously write data to the stream
+ * descriptor. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_write_some(const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_write_some(this), token, buffers))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_write_some(this), token, buffers);
+ }
+
+ /// 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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().read_some(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().read_some(
+ this->impl_.get_implementation(), buffers, ec);
+ }
+
+ /// Start an asynchronous read.
+ /**
+ * This function is used to asynchronously read data from the stream
+ * descriptor. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_read_some(const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_read_some>(), token, buffers))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_read_some(this), token, buffers);
+ }
+
+private:
+ class initiate_async_write_some
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_write_some(basic_stream_descriptor* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_write_some(
+ self_->impl_.get_implementation(), buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_stream_descriptor* self_;
+ };
+
+ class initiate_async_read_some
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_read_some(basic_stream_descriptor* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_read_some(
+ self_->impl_.get_implementation(), buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_stream_descriptor* self_;
+ };
+};
+
+} // namespace posix
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_POSIX_BASIC_STREAM_DESCRIPTOR_HPP
diff --git a/3rdparty/asio/include/asio/posix/descriptor.hpp b/3rdparty/asio/include/asio/posix/descriptor.hpp
new file mode 100644
index 00000000000..57b5b2522fd
--- /dev/null
+++ b/3rdparty/asio/include/asio/posix/descriptor.hpp
@@ -0,0 +1,37 @@
+//
+// posix/descriptor.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_HAS_POSIX_STREAM_DESCRIPTOR) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/posix/basic_descriptor.hpp"
+
+namespace asio {
+namespace posix {
+
+/// Typedef for the typical usage of basic_descriptor.
+typedef basic_descriptor<> descriptor;
+
+} // namespace posix
+} // namespace asio
+
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_POSIX_DESCRIPTOR_HPP
diff --git a/3rdparty/asio/include/asio/posix/descriptor_base.hpp b/3rdparty/asio/include/asio/posix/descriptor_base.hpp
new file mode 100644
index 00000000000..7bc3bc1e8f6
--- /dev/null
+++ b/3rdparty/asio/include/asio/posix/descriptor_base.hpp
@@ -0,0 +1,90 @@
+//
+// posix/descriptor_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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(my_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/3rdparty/asio/include/asio/posix/stream_descriptor.hpp b/3rdparty/asio/include/asio/posix/stream_descriptor.hpp
new file mode 100644
index 00000000000..4855f10777e
--- /dev/null
+++ b/3rdparty/asio/include/asio/posix/stream_descriptor.hpp
@@ -0,0 +1,37 @@
+//
+// posix/stream_descriptor.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/posix/basic_stream_descriptor.hpp"
+
+namespace asio {
+namespace posix {
+
+/// Typedef for the typical usage of a stream-oriented descriptor.
+typedef basic_stream_descriptor<> stream_descriptor;
+
+} // namespace posix
+} // namespace asio
+
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_POSIX_STREAM_DESCRIPTOR_HPP
diff --git a/3rdparty/asio/include/asio/post.hpp b/3rdparty/asio/include/asio/post.hpp
new file mode 100644
index 00000000000..6b534dfae4a
--- /dev/null
+++ b/3rdparty/asio/include/asio/post.hpp
@@ -0,0 +1,213 @@
+//
+// post.hpp
+// ~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/initiate_post.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/execution_context.hpp"
+#include "asio/execution/blocking.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/is_executor.hpp"
+#include "asio/require.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 <tt>post()</tt>.
+ *
+ * The use of @c post(), rather than @ref defer(), indicates the caller's
+ * preference that the function object be eagerly queued for execution.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler. The function signature of the completion handler must be:
+ * @code void handler(); @endcode
+ *
+ * @returns This function returns <tt>async_initiate<NullaryToken,
+ * void()>(Init{}, token)</tt>, where @c Init is a function object type defined
+ * as:
+ *
+ * @code class Init
+ * {
+ * public:
+ * template <typename CompletionHandler>
+ * void operator()(CompletionHandler&& completion_handler) const;
+ * }; @endcode
+ *
+ * The function call operator of @c Init:
+ *
+ * @li Obtains the handler's associated executor object @c ex of type @c Ex by
+ * performing @code auto ex = get_associated_executor(handler); @endcode
+ *
+ * @li Obtains the handler's associated allocator object @c alloc by performing
+ * @code auto alloc = get_associated_allocator(handler); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex>::value</tt> is true, performs
+ * @code prefer(
+ * require(ex, execution::blocking.never),
+ * execution::relationship.fork,
+ * execution::allocator(alloc)
+ * ).execute(std::forward<CompletionHandler>(completion_handler)); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex>::value</tt> is false, performs
+ * @code ex.post(
+ * std::forward<CompletionHandler>(completion_handler),
+ * alloc); @endcode
+ *
+ * @par Completion Signature
+ * @code void() @endcode
+ */
+template <ASIO_COMPLETION_TOKEN_FOR(void()) NullaryToken>
+inline auto post(NullaryToken&& token)
+ -> decltype(
+ async_initiate<NullaryToken, void()>(
+ declval<detail::initiate_post>(), token))
+{
+ return async_initiate<NullaryToken, void()>(
+ detail::initiate_post(), 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 <tt>post()</tt>.
+ *
+ * The use of @c post(), rather than @ref defer(), indicates the caller's
+ * preference that the function object be eagerly queued for execution.
+ *
+ * @param ex The target executor.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler. The function signature of the completion handler must be:
+ * @code void handler(); @endcode
+ *
+ * @returns This function returns <tt>async_initiate<NullaryToken,
+ * void()>(Init{ex}, token)</tt>, where @c Init is a function object type
+ * defined as:
+ *
+ * @code class Init
+ * {
+ * public:
+ * using executor_type = Executor;
+ * explicit Init(const Executor& ex) : ex_(ex) {}
+ * executor_type get_executor() const noexcept { return ex_; }
+ * template <typename CompletionHandler>
+ * void operator()(CompletionHandler&& completion_handler) const;
+ * private:
+ * Executor ex_; // exposition only
+ * }; @endcode
+ *
+ * The function call operator of @c Init:
+ *
+ * @li Obtains the handler's associated executor object @c ex1 of type @c Ex1 by
+ * performing @code auto ex1 = get_associated_executor(handler, ex); @endcode
+ *
+ * @li Obtains the handler's associated allocator object @c alloc by performing
+ * @code auto alloc = get_associated_allocator(handler); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex1>::value</tt> is true, constructs a
+ * function object @c f with a member @c executor_ that is initialised with
+ * <tt>prefer(ex1, execution::outstanding_work.tracked)</tt>, a member @c
+ * handler_ that is a decay-copy of @c completion_handler, and a function call
+ * operator that performs:
+ * @code auto a = get_associated_allocator(handler_);
+ * prefer(executor_, execution::allocator(a)).execute(std::move(handler_));
+ * @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex1>::value</tt> is false, constructs a
+ * function object @c f with a member @c work_ that is initialised with
+ * <tt>make_work_guard(ex1)</tt>, a member @c handler_ that is a decay-copy of
+ * @c completion_handler, and a function call operator that performs:
+ * @code auto a = get_associated_allocator(handler_);
+ * work_.get_executor().dispatch(std::move(handler_), a);
+ * work_.reset(); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex>::value</tt> is true, performs
+ * @code prefer(
+ * require(ex, execution::blocking.never),
+ * execution::relationship.fork,
+ * execution::allocator(alloc)
+ * ).execute(std::move(f)); @endcode
+ *
+ * @li If <tt>execution::is_executor<Ex>::value</tt> is false, performs
+ * @code ex.post(std::move(f), alloc); @endcode
+ *
+ * @par Completion Signature
+ * @code void() @endcode
+ */
+template <typename Executor,
+ ASIO_COMPLETION_TOKEN_FOR(void()) NullaryToken
+ = default_completion_token_t<Executor>>
+inline auto post(const Executor& ex,
+ NullaryToken&& token = default_completion_token_t<Executor>(),
+ constraint_t<
+ (execution::is_executor<Executor>::value
+ && can_require<Executor, execution::blocking_t::never_t>::value)
+ || is_executor<Executor>::value
+ > = 0)
+ -> decltype(
+ async_initiate<NullaryToken, void()>(
+ declval<detail::initiate_post_with_executor<Executor>>(), token))
+{
+ return async_initiate<NullaryToken, void()>(
+ detail::initiate_post_with_executor<Executor>(ex), token);
+}
+
+/// Submits a completion token or function object for execution.
+/**
+ * @param ctx An execution context, from which the target executor is obtained.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler. The function signature of the completion handler must be:
+ * @code void handler(); @endcode
+ *
+ * @returns <tt>post(ctx.get_executor(), forward<NullaryToken>(token))</tt>.
+ *
+ * @par Completion Signature
+ * @code void() @endcode
+ */
+template <typename ExecutionContext,
+ ASIO_COMPLETION_TOKEN_FOR(void()) NullaryToken
+ = default_completion_token_t<typename ExecutionContext::executor_type>>
+inline auto post(ExecutionContext& ctx,
+ NullaryToken&& token = default_completion_token_t<
+ typename ExecutionContext::executor_type>(),
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ -> decltype(
+ async_initiate<NullaryToken, void()>(
+ declval<detail::initiate_post_with_executor<
+ typename ExecutionContext::executor_type>>(), token))
+{
+ return async_initiate<NullaryToken, void()>(
+ detail::initiate_post_with_executor<
+ typename ExecutionContext::executor_type>(
+ ctx.get_executor()), token);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_POST_HPP
diff --git a/3rdparty/asio/include/asio/prefer.hpp b/3rdparty/asio/include/asio/prefer.hpp
new file mode 100644
index 00000000000..3b13d4123bf
--- /dev/null
+++ b/3rdparty/asio/include/asio/prefer.hpp
@@ -0,0 +1,577 @@
+//
+// prefer.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_PREFER_HPP
+#define ASIO_PREFER_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_applicable_property.hpp"
+#include "asio/traits/prefer_free.hpp"
+#include "asio/traits/prefer_member.hpp"
+#include "asio/traits/require_free.hpp"
+#include "asio/traits/require_member.hpp"
+#include "asio/traits/static_require.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace asio {
+
+/// A customisation point that attempts to apply a property to an object.
+/**
+ * The name <tt>prefer</tt> denotes a customisation point object. The
+ * expression <tt>asio::prefer(E, P0, Pn...)</tt> for some subexpressions
+ * <tt>E</tt> and <tt>P0</tt>, and where <tt>Pn...</tt> represents <tt>N</tt>
+ * subexpressions (where <tt>N</tt> is 0 or more, and with types <tt>T =
+ * decay_t<decltype(E)></tt> and <tt>Prop0 = decay_t<decltype(P0)></tt>) is
+ * expression-equivalent to:
+ *
+ * @li If <tt>is_applicable_property_v<T, Prop0> && Prop0::is_preferable</tt> is
+ * not a well-formed constant expression with value <tt>true</tt>,
+ * <tt>asio::prefer(E, P0, Pn...)</tt> is ill-formed.
+ *
+ * @li Otherwise, <tt>E</tt> if <tt>N == 0</tt> and the expression
+ * <tt>Prop0::template static_query_v<T> == Prop0::value()</tt> is a
+ * well-formed constant expression with value <tt>true</tt>.
+ *
+ * @li Otherwise, <tt>(E).require(P0)</tt> if <tt>N == 0</tt> and the expression
+ * <tt>(E).require(P0)</tt> is a valid expression.
+ *
+ * @li Otherwise, <tt>require(E, P0)</tt> if <tt>N == 0</tt> and the expression
+ * <tt>require(E, P0)</tt> is a valid expression with overload resolution
+ * performed in a context that does not include the declaration of the
+ * <tt>require</tt> customization point object.
+ *
+ * @li Otherwise, <tt>(E).prefer(P0)</tt> if <tt>N == 0</tt> and the expression
+ * <tt>(E).prefer(P0)</tt> is a valid expression.
+ *
+ * @li Otherwise, <tt>prefer(E, P0)</tt> if <tt>N == 0</tt> and the expression
+ * <tt>prefer(E, P0)</tt> is a valid expression with overload resolution
+ * performed in a context that does not include the declaration of the
+ * <tt>prefer</tt> customization point object.
+ *
+ * @li Otherwise, <tt>E</tt> if <tt>N == 0</tt>.
+ *
+ * @li Otherwise,
+ * <tt>asio::prefer(asio::prefer(E, P0), Pn...)</tt>
+ * if <tt>N > 0</tt> and the expression
+ * <tt>asio::prefer(asio::prefer(E, P0), Pn...)</tt>
+ * is a valid expression.
+ *
+ * @li Otherwise, <tt>asio::prefer(E, P0, Pn...)</tt> is ill-formed.
+ */
+inline constexpr unspecified prefer = unspecified;
+
+/// A type trait that determines whether a @c prefer expression is well-formed.
+/**
+ * Class template @c can_prefer is a trait that is derived from
+ * @c true_type if the expression <tt>asio::prefer(std::declval<T>(),
+ * std::declval<Properties>()...)</tt> is well formed; otherwise @c false_type.
+ */
+template <typename T, typename... Properties>
+struct can_prefer :
+ integral_constant<bool, automatically_determined>
+{
+};
+
+/// A type trait that determines whether a @c prefer expression will not throw.
+/**
+ * Class template @c is_nothrow_prefer is a trait that is derived from
+ * @c true_type if the expression <tt>asio::prefer(std::declval<T>(),
+ * std::declval<Properties>()...)</tt> is @c noexcept; otherwise @c false_type.
+ */
+template <typename T, typename... Properties>
+struct is_nothrow_prefer :
+ integral_constant<bool, automatically_determined>
+{
+};
+
+/// A type trait that determines the result type of a @c prefer expression.
+/**
+ * Class template @c prefer_result is a trait that determines the result
+ * type of the expression <tt>asio::prefer(std::declval<T>(),
+ * std::declval<Properties>()...)</tt>.
+ */
+template <typename T, typename... Properties>
+struct prefer_result
+{
+ /// The result of the @c prefer expression.
+ typedef automatically_determined type;
+};
+
+} // namespace asio
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace asio_prefer_fn {
+
+using asio::conditional_t;
+using asio::decay_t;
+using asio::declval;
+using asio::enable_if_t;
+using asio::is_applicable_property;
+using asio::traits::prefer_free;
+using asio::traits::prefer_member;
+using asio::traits::require_free;
+using asio::traits::require_member;
+using asio::traits::static_require;
+
+void prefer();
+void require();
+
+enum overload_type
+{
+ identity,
+ call_require_member,
+ call_require_free,
+ call_prefer_member,
+ call_prefer_free,
+ two_props,
+ n_props,
+ ill_formed
+};
+
+template <typename Impl, typename T, typename Properties,
+ typename = void, typename = void, typename = void, typename = void,
+ typename = void, typename = void, typename = void>
+struct call_traits
+{
+ static constexpr overload_type overload = ill_formed;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ decay_t<Property>::is_preferable
+ >,
+ enable_if_t<
+ static_require<T, Property>::is_valid
+ >>
+{
+ static constexpr overload_type overload = identity;
+ static constexpr bool is_noexcept = true;
+
+ typedef T&& result_type;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ decay_t<Property>::is_preferable
+ >,
+ enable_if_t<
+ !static_require<T, Property>::is_valid
+ >,
+ enable_if_t<
+ require_member<typename Impl::template proxy<T>::type, Property>::is_valid
+ >> :
+ require_member<typename Impl::template proxy<T>::type, Property>
+{
+ static constexpr overload_type overload = call_require_member;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ decay_t<Property>::is_preferable
+ >,
+ enable_if_t<
+ !static_require<T, Property>::is_valid
+ >,
+ enable_if_t<
+ !require_member<typename Impl::template proxy<T>::type, Property>::is_valid
+ >,
+ enable_if_t<
+ require_free<T, Property>::is_valid
+ >> :
+ require_free<T, Property>
+{
+ static constexpr overload_type overload = call_require_free;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ decay_t<Property>::is_preferable
+ >,
+ enable_if_t<
+ !static_require<T, Property>::is_valid
+ >,
+ enable_if_t<
+ !require_member<typename Impl::template proxy<T>::type, Property>::is_valid
+ >,
+ enable_if_t<
+ !require_free<T, Property>::is_valid
+ >,
+ enable_if_t<
+ prefer_member<typename Impl::template proxy<T>::type, Property>::is_valid
+ >> :
+ prefer_member<typename Impl::template proxy<T>::type, Property>
+{
+ static constexpr overload_type overload = call_prefer_member;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ decay_t<Property>::is_preferable
+ >,
+ enable_if_t<
+ !static_require<T, Property>::is_valid
+ >,
+ enable_if_t<
+ !require_member<typename Impl::template proxy<T>::type, Property>::is_valid
+ >,
+ enable_if_t<
+ !require_free<T, Property>::is_valid
+ >,
+ enable_if_t<
+ !prefer_member<typename Impl::template proxy<T>::type, Property>::is_valid
+ >,
+ enable_if_t<
+ prefer_free<T, Property>::is_valid
+ >> :
+ prefer_free<T, Property>
+{
+ static constexpr overload_type overload = call_prefer_free;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ decay_t<Property>::is_preferable
+ >,
+ enable_if_t<
+ !static_require<T, Property>::is_valid
+ >,
+ enable_if_t<
+ !require_member<typename Impl::template proxy<T>::type, Property>::is_valid
+ >,
+ enable_if_t<
+ !require_free<T, Property>::is_valid
+ >,
+ enable_if_t<
+ !prefer_member<typename Impl::template proxy<T>::type, Property>::is_valid
+ >,
+ enable_if_t<
+ !prefer_free<T, Property>::is_valid
+ >>
+{
+ static constexpr overload_type overload = identity;
+ static constexpr bool is_noexcept = true;
+
+ typedef T&& result_type;
+};
+
+template <typename Impl, typename T, typename P0, typename P1>
+struct call_traits<Impl, T, void(P0, P1),
+ enable_if_t<
+ call_traits<Impl, T, void(P0)>::overload != ill_formed
+ >,
+ enable_if_t<
+ call_traits<
+ Impl,
+ typename call_traits<Impl, T, void(P0)>::result_type,
+ void(P1)
+ >::overload != ill_formed
+ >>
+{
+ static constexpr overload_type overload = two_props;
+
+ static constexpr bool is_noexcept =
+ (
+ call_traits<Impl, T, void(P0)>::is_noexcept
+ &&
+ call_traits<
+ Impl,
+ typename call_traits<Impl, T, void(P0)>::result_type,
+ void(P1)
+ >::is_noexcept
+ );
+
+ typedef decay_t<
+ typename call_traits<
+ Impl,
+ typename call_traits<Impl, T, void(P0)>::result_type,
+ void(P1)
+ >::result_type
+ > result_type;
+};
+
+template <typename Impl, typename T, typename P0,
+ typename P1, typename... PN>
+struct call_traits<Impl, T, void(P0, P1, PN...),
+ enable_if_t<
+ call_traits<Impl, T, void(P0)>::overload != ill_formed
+ >,
+ enable_if_t<
+ call_traits<
+ Impl,
+ typename call_traits<Impl, T, void(P0)>::result_type,
+ void(P1, PN...)
+ >::overload != ill_formed
+ >>
+{
+ static constexpr overload_type overload = n_props;
+
+ static constexpr bool is_noexcept =
+ (
+ call_traits<Impl, T, void(P0)>::is_noexcept
+ &&
+ call_traits<
+ Impl,
+ typename call_traits<Impl, T, void(P0)>::result_type,
+ void(P1, PN...)
+ >::is_noexcept
+ );
+
+ typedef decay_t<
+ typename call_traits<
+ Impl,
+ typename call_traits<Impl, T, void(P0)>::result_type,
+ void(P1, PN...)
+ >::result_type
+ > result_type;
+};
+
+struct impl
+{
+ template <typename T>
+ struct proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) \
+ && defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ auto require(P&& p)
+ noexcept(
+ noexcept(
+ declval<conditional_t<true, T, P>>().require(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ declval<conditional_t<true, T, P>>().require(static_cast<P&&>(p))
+ );
+
+ template <typename P>
+ auto prefer(P&& p)
+ noexcept(
+ noexcept(
+ declval<conditional_t<true, T, P>>().prefer(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ declval<conditional_t<true, T, P>>().prefer(static_cast<P&&>(p))
+ );
+ };
+#else // defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+ // && defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+ // && defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+ };
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == identity,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&&) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return static_cast<T&&>(t);
+ }
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == call_require_member,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&& p) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return static_cast<T&&>(t).require(static_cast<Property&&>(p));
+ }
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == call_require_free,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&& p) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return require(static_cast<T&&>(t), static_cast<Property&&>(p));
+ }
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == call_prefer_member,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&& p) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return static_cast<T&&>(t).prefer(static_cast<Property&&>(p));
+ }
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == call_prefer_free,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&& p) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return prefer(static_cast<T&&>(t), static_cast<Property&&>(p));
+ }
+
+ template <typename T, typename P0, typename P1>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(P0, P1)>::overload == two_props,
+ typename call_traits<impl, T, void(P0, P1)>::result_type
+ >
+ operator()(T&& t, P0&& p0, P1&& p1) const
+ noexcept(call_traits<impl, T, void(P0, P1)>::is_noexcept)
+ {
+ return (*this)(
+ (*this)(static_cast<T&&>(t), static_cast<P0&&>(p0)),
+ static_cast<P1&&>(p1));
+ }
+
+ template <typename T, typename P0, typename P1,
+ typename... PN>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(P0, P1, PN...)>::overload == n_props,
+ typename call_traits<impl, T, void(P0, P1, PN...)>::result_type
+ >
+ operator()(T&& t, P0&& p0, P1&& p1, PN&&... pn) const
+ noexcept(call_traits<impl, T, void(P0, P1, PN...)>::is_noexcept)
+ {
+ return (*this)(
+ (*this)(static_cast<T&&>(t), static_cast<P0&&>(p0)),
+ static_cast<P1&&>(p1), static_cast<PN&&>(pn)...);
+ }
+};
+
+template <typename T = impl>
+struct static_instance
+{
+ static const T instance;
+};
+
+template <typename T>
+const T static_instance<T>::instance = {};
+
+} // namespace asio_prefer_fn
+namespace asio {
+namespace {
+
+static constexpr const asio_prefer_fn::impl&
+ prefer = asio_prefer_fn::static_instance<>::instance;
+
+} // namespace
+
+typedef asio_prefer_fn::impl prefer_t;
+
+template <typename T, typename... Properties>
+struct can_prefer :
+ integral_constant<bool,
+ asio_prefer_fn::call_traits<
+ prefer_t, T, void(Properties...)>::overload
+ != asio_prefer_fn::ill_formed>
+{
+};
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename... Properties>
+constexpr bool can_prefer_v
+ = can_prefer<T, Properties...>::value;
+
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename... Properties>
+struct is_nothrow_prefer :
+ integral_constant<bool,
+ asio_prefer_fn::call_traits<
+ prefer_t, T, void(Properties...)>::is_noexcept>
+{
+};
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename... Properties>
+constexpr bool is_nothrow_prefer_v = is_nothrow_prefer<T, Properties...>::value;
+
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename... Properties>
+struct prefer_result
+{
+ typedef typename asio_prefer_fn::call_traits<
+ prefer_t, T, void(Properties...)>::result_type type;
+};
+
+template <typename T, typename... Properties>
+using prefer_result_t = typename prefer_result<T, Properties...>::type;
+
+} // namespace asio
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_PREFER_HPP
diff --git a/3rdparty/asio/include/asio/prepend.hpp b/3rdparty/asio/include/asio/prepend.hpp
new file mode 100644
index 00000000000..972b47fd300
--- /dev/null
+++ b/3rdparty/asio/include/asio/prepend.hpp
@@ -0,0 +1,66 @@
+//
+// prepend.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_PREPEND_HPP
+#define ASIO_PREPEND_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+#include <tuple>
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Completion token type used to specify that the completion handler
+/// arguments should be passed additional values before the results of the
+/// operation.
+template <typename CompletionToken, typename... Values>
+class prepend_t
+{
+public:
+ /// Constructor.
+ template <typename T, typename... V>
+ constexpr explicit prepend_t(T&& completion_token, V&&... values)
+ : token_(static_cast<T&&>(completion_token)),
+ values_(static_cast<V&&>(values)...)
+ {
+ }
+
+//private:
+ CompletionToken token_;
+ std::tuple<Values...> values_;
+};
+
+/// Completion token type used to specify that the completion handler
+/// arguments should be passed additional values before the results of the
+/// operation.
+template <typename CompletionToken, typename... Values>
+ASIO_NODISCARD inline constexpr
+prepend_t<decay_t<CompletionToken>, decay_t<Values>...>
+prepend(CompletionToken&& completion_token,
+ Values&&... values)
+{
+ return prepend_t<decay_t<CompletionToken>, decay_t<Values>...>(
+ static_cast<CompletionToken&&>(completion_token),
+ static_cast<Values&&>(values)...);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/prepend.hpp"
+
+#endif // ASIO_PREPEND_HPP
diff --git a/3rdparty/asio/include/asio/query.hpp b/3rdparty/asio/include/asio/query.hpp
new file mode 100644
index 00000000000..c27d26a4030
--- /dev/null
+++ b/3rdparty/asio/include/asio/query.hpp
@@ -0,0 +1,311 @@
+//
+// query.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_QUERY_HPP
+#define ASIO_QUERY_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_applicable_property.hpp"
+#include "asio/traits/query_member.hpp"
+#include "asio/traits/query_free.hpp"
+#include "asio/traits/static_query.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace asio {
+
+/// A customisation point that queries the value of a property.
+/**
+ * The name <tt>query</tt> denotes a customization point object. The
+ * expression <tt>asio::query(E, P)</tt> for some
+ * subexpressions <tt>E</tt> and <tt>P</tt> (with types <tt>T =
+ * decay_t<decltype(E)></tt> and <tt>Prop = decay_t<decltype(P)></tt>) is
+ * expression-equivalent to:
+ *
+ * @li If <tt>is_applicable_property_v<T, Prop></tt> is not a well-formed
+ * constant expression with value <tt>true</tt>, <tt>asio::query(E,
+ * P)</tt> is ill-formed.
+ *
+ * @li Otherwise, <tt>Prop::template static_query_v<T></tt> if the expression
+ * <tt>Prop::template static_query_v<T></tt> is a well-formed constant
+ * expression.
+ *
+ * @li Otherwise, <tt>(E).query(P)</tt> if the expression
+ * <tt>(E).query(P)</tt> is well-formed.
+ *
+ * @li Otherwise, <tt>query(E, P)</tt> if the expression
+ * <tt>query(E, P)</tt> is a valid expression with overload
+ * resolution performed in a context that does not include the declaration
+ * of the <tt>query</tt> customization point object.
+ *
+ * @li Otherwise, <tt>asio::query(E, P)</tt> is ill-formed.
+ */
+inline constexpr unspecified query = unspecified;
+
+/// A type trait that determines whether a @c query expression is well-formed.
+/**
+ * Class template @c can_query is a trait that is derived from
+ * @c true_type if the expression <tt>asio::query(std::declval<T>(),
+ * std::declval<Property>())</tt> is well formed; otherwise @c false_type.
+ */
+template <typename T, typename Property>
+struct can_query :
+ integral_constant<bool, automatically_determined>
+{
+};
+
+/// A type trait that determines whether a @c query expression will
+/// not throw.
+/**
+ * Class template @c is_nothrow_query is a trait that is derived from
+ * @c true_type if the expression <tt>asio::query(std::declval<T>(),
+ * std::declval<Property>())</tt> is @c noexcept; otherwise @c false_type.
+ */
+template <typename T, typename Property>
+struct is_nothrow_query :
+ integral_constant<bool, automatically_determined>
+{
+};
+
+/// A type trait that determines the result type of a @c query expression.
+/**
+ * Class template @c query_result is a trait that determines the result
+ * type of the expression <tt>asio::query(std::declval<T>(),
+ * std::declval<Property>())</tt>.
+ */
+template <typename T, typename Property>
+struct query_result
+{
+ /// The result of the @c query expression.
+ typedef automatically_determined type;
+};
+
+} // namespace asio
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace asio_query_fn {
+
+using asio::conditional_t;
+using asio::decay_t;
+using asio::declval;
+using asio::enable_if_t;
+using asio::is_applicable_property;
+using asio::traits::query_free;
+using asio::traits::query_member;
+using asio::traits::static_query;
+
+void query();
+
+enum overload_type
+{
+ static_value,
+ call_member,
+ call_free,
+ ill_formed
+};
+
+template <typename Impl, typename T, typename Properties,
+ typename = void, typename = void, typename = void, typename = void>
+struct call_traits
+{
+ static constexpr overload_type overload = ill_formed;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ static_query<T, Property>::is_valid
+ >> :
+ static_query<T, Property>
+{
+ static constexpr overload_type overload = static_value;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ !static_query<T, Property>::is_valid
+ >,
+ enable_if_t<
+ query_member<typename Impl::template proxy<T>::type, Property>::is_valid
+ >> :
+ query_member<typename Impl::template proxy<T>::type, Property>
+{
+ static constexpr overload_type overload = call_member;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ !static_query<T, Property>::is_valid
+ >,
+ enable_if_t<
+ !query_member<typename Impl::template proxy<T>::type, Property>::is_valid
+ >,
+ enable_if_t<
+ query_free<T, Property>::is_valid
+ >> :
+ query_free<T, Property>
+{
+ static constexpr overload_type overload = call_free;
+};
+
+struct impl
+{
+ template <typename T>
+ struct proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ auto query(P&& p)
+ noexcept(
+ noexcept(
+ declval<conditional_t<true, T, P>>().query(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ declval<conditional_t<true, T, P>>().query(static_cast<P&&>(p))
+ );
+ };
+#else // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+ };
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == static_value,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&&, Property&&) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return static_query<decay_t<T>, decay_t<Property>>::value();
+ }
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == call_member,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&& p) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return static_cast<T&&>(t).query(static_cast<Property&&>(p));
+ }
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == call_free,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&& p) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return query(static_cast<T&&>(t), static_cast<Property&&>(p));
+ }
+};
+
+template <typename T = impl>
+struct static_instance
+{
+ static const T instance;
+};
+
+template <typename T>
+const T static_instance<T>::instance = {};
+
+} // namespace asio_query_fn
+namespace asio {
+namespace {
+
+static constexpr const asio_query_fn::impl&
+ query = asio_query_fn::static_instance<>::instance;
+
+} // namespace
+
+typedef asio_query_fn::impl query_t;
+
+template <typename T, typename Property>
+struct can_query :
+ integral_constant<bool,
+ asio_query_fn::call_traits<query_t, T, void(Property)>::overload !=
+ asio_query_fn::ill_formed>
+{
+};
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename Property>
+constexpr bool can_query_v = can_query<T, Property>::value;
+
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename Property>
+struct is_nothrow_query :
+ integral_constant<bool,
+ asio_query_fn::call_traits<query_t, T, void(Property)>::is_noexcept>
+{
+};
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename Property>
+constexpr bool is_nothrow_query_v = is_nothrow_query<T, Property>::value;
+
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename Property>
+struct query_result
+{
+ typedef typename asio_query_fn::call_traits<
+ query_t, T, void(Property)>::result_type type;
+};
+
+template <typename T, typename Property>
+using query_result_t = typename query_result<T, Property>::type;
+
+} // namespace asio
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_QUERY_HPP
diff --git a/3rdparty/asio/include/asio/random_access_file.hpp b/3rdparty/asio/include/asio/random_access_file.hpp
new file mode 100644
index 00000000000..c638e336394
--- /dev/null
+++ b/3rdparty/asio/include/asio/random_access_file.hpp
@@ -0,0 +1,35 @@
+//
+// random_access_file.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_RANDOM_ACCESS_FILE_HPP
+#define ASIO_RANDOM_ACCESS_FILE_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_FILE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/basic_random_access_file.hpp"
+
+namespace asio {
+
+/// Typedef for the typical usage of a random-access file.
+typedef basic_random_access_file<> random_access_file;
+
+} // namespace asio
+
+#endif // defined(ASIO_HAS_FILE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_RANDOM_ACCESS_FILE_HPP
diff --git a/3rdparty/asio/include/asio/read.hpp b/3rdparty/asio/include/asio/read.hpp
new file mode 100644
index 00000000000..0eb966af36f
--- /dev/null
+++ b/3rdparty/asio/include/asio/read.hpp
@@ -0,0 +1,1448 @@
+//
+// read.hpp
+// ~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include "asio/async_result.hpp"
+#include "asio/buffer.hpp"
+#include "asio/completion_condition.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 {
+
+template <typename> class initiate_async_read;
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+template <typename> class initiate_async_read_dynbuf_v1;
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+template <typename> class initiate_async_read_dynbuf_v2;
+
+} // namespace detail
+
+/**
+ * @defgroup read asio::read
+ *
+ * @brief The @c read function is a composed operation that reads 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 <typename SyncReadStream, typename MutableBufferSequence>
+std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
+ constraint_t<
+ is_mutable_buffer_sequence<MutableBufferSequence>::value
+ > = 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 <typename SyncReadStream, typename MutableBufferSequence>
+std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
+ asio::error_code& ec,
+ constraint_t<
+ is_mutable_buffer_sequence<MutableBufferSequence>::value
+ > = 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 <typename SyncReadStream, typename MutableBufferSequence,
+ typename CompletionCondition>
+std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
+ CompletionCondition completion_condition,
+ constraint_t<
+ is_mutable_buffer_sequence<MutableBufferSequence>::value
+ > = 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 <typename SyncReadStream, typename MutableBufferSequence,
+ typename CompletionCondition>
+std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
+ CompletionCondition completion_condition, asio::error_code& ec,
+ constraint_t<
+ is_mutable_buffer_sequence<MutableBufferSequence>::value
+ > = 0);
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// 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 <typename SyncReadStream, typename DynamicBuffer_v1>
+std::size_t read(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 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 <typename SyncReadStream, typename DynamicBuffer_v1>
+std::size_t read(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 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 <typename SyncReadStream, typename DynamicBuffer_v1,
+ typename CompletionCondition>
+std::size_t read(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ CompletionCondition completion_condition,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 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 <typename SyncReadStream, typename DynamicBuffer_v1,
+ typename CompletionCondition>
+std::size_t read(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ CompletionCondition completion_condition, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 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 <typename SyncReadStream, typename Allocator>
+std::size_t read(SyncReadStream& s, basic_streambuf<Allocator>& 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 <typename SyncReadStream, typename Allocator>
+std::size_t read(SyncReadStream& s, basic_streambuf<Allocator>& 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 <typename SyncReadStream, typename Allocator,
+ typename CompletionCondition>
+std::size_t read(SyncReadStream& s, basic_streambuf<Allocator>& 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 <typename SyncReadStream, typename Allocator,
+ typename CompletionCondition>
+std::size_t read(SyncReadStream& s, basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition, asio::error_code& ec);
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+#endif // !defined(ASIO_NO_EXTENSIONS)
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// 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 <typename SyncReadStream, typename DynamicBuffer_v2>
+std::size_t read(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 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 <typename SyncReadStream, typename DynamicBuffer_v2>
+std::size_t read(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 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 <typename SyncReadStream, typename DynamicBuffer_v2,
+ typename CompletionCondition>
+std::size_t read(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ CompletionCondition completion_condition,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 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 <typename SyncReadStream, typename DynamicBuffer_v2,
+ typename CompletionCondition>
+std::size_t read(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ CompletionCondition completion_condition, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0);
+
+/*@}*/
+/**
+ * @defgroup async_read asio::async_read
+ *
+ * @brief The @c async_read function is a composed asynchronous operation that
+ * reads a certain amount of data from a stream before completion.
+ */
+/*@{*/
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_mutable_buffer_sequence<MutableBufferSequence>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read<AsyncReadStream>>(),
+ token, buffers, transfer_all()));
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream,
+ typename MutableBufferSequence, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
+ CompletionCondition completion_condition,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_mutable_buffer_sequence<MutableBufferSequence>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read<AsyncReadStream>>(),
+ token, buffers,
+ static_cast<CompletionCondition&&>(completion_condition)));
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @note This overload is equivalent to calling:
+ * @code asio::async_read(
+ * s, buffers,
+ * asio::transfer_all(),
+ * handler); @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename DynamicBuffer_v1,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read(AsyncReadStream& s, DynamicBuffer_v1&& buffers,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_dynbuf_v1<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers), transfer_all()));
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream,
+ typename DynamicBuffer_v1, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read(AsyncReadStream& s, DynamicBuffer_v1&& buffers,
+ CompletionCondition completion_condition,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_dynbuf_v1<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition)));
+
+#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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @note This overload is equivalent to calling:
+ * @code asio::async_read(
+ * s, b,
+ * asio::transfer_all(),
+ * handler); @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename Allocator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read(AsyncReadStream& s, basic_streambuf<Allocator>& b,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_dynbuf_v1<AsyncReadStream>>(),
+ token, basic_streambuf_ref<Allocator>(b), transfer_all()));
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream,
+ typename Allocator, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read(AsyncReadStream& s, basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_dynbuf_v1<AsyncReadStream>>(),
+ token, basic_streambuf_ref<Allocator>(b),
+ static_cast<CompletionCondition&&>(completion_condition)));
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+#endif // !defined(ASIO_NO_EXTENSIONS)
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @note This overload is equivalent to calling:
+ * @code asio::async_read(
+ * s, buffers,
+ * asio::transfer_all(),
+ * handler); @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename DynamicBuffer_v2,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read(AsyncReadStream& s, DynamicBuffer_v2 buffers,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_dynbuf_v2<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers), transfer_all()));
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream,
+ typename DynamicBuffer_v2, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read(AsyncReadStream& s, DynamicBuffer_v2 buffers,
+ CompletionCondition completion_condition,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_dynbuf_v2<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition)));
+
+/*@}*/
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/read.hpp"
+
+#endif // ASIO_READ_HPP
diff --git a/3rdparty/asio/include/asio/read_at.hpp b/3rdparty/asio/include/asio/read_at.hpp
new file mode 100644
index 00000000000..09a0b22e12e
--- /dev/null
+++ b/3rdparty/asio/include/asio/read_at.hpp
@@ -0,0 +1,778 @@
+//
+// read_at.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include "asio/async_result.hpp"
+#include "asio/completion_condition.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 {
+namespace detail {
+
+template <typename> class initiate_async_read_at;
+#if !defined(ASIO_NO_IOSTREAM)
+template <typename> class initiate_async_read_at_streambuf;
+#endif // !defined(ASIO_NO_IOSTREAM)
+
+} // namespace detail
+
+/**
+ * @defgroup read_at asio::read_at
+ *
+ * @brief The @c read_at function is a composed operation that reads 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 <typename SyncRandomAccessReadDevice, typename MutableBufferSequence>
+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 <typename SyncRandomAccessReadDevice, typename MutableBufferSequence>
+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 <typename SyncRandomAccessReadDevice, typename MutableBufferSequence,
+ typename CompletionCondition>
+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 <typename SyncRandomAccessReadDevice, typename MutableBufferSequence,
+ typename CompletionCondition>
+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 <typename SyncRandomAccessReadDevice, typename Allocator>
+std::size_t read_at(SyncRandomAccessReadDevice& d,
+ uint64_t offset, basic_streambuf<Allocator>& 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 <typename SyncRandomAccessReadDevice, typename Allocator>
+std::size_t read_at(SyncRandomAccessReadDevice& d,
+ uint64_t offset, basic_streambuf<Allocator>& 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 <typename SyncRandomAccessReadDevice, typename Allocator,
+ typename CompletionCondition>
+std::size_t read_at(SyncRandomAccessReadDevice& d,
+ uint64_t offset, basic_streambuf<Allocator>& 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 <typename SyncRandomAccessReadDevice, typename Allocator,
+ typename CompletionCondition>
+std::size_t read_at(SyncRandomAccessReadDevice& d,
+ uint64_t offset, basic_streambuf<Allocator>& 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 The @c async_read_at function is a composed asynchronous operation
+ * that reads 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. It is an
+ * initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncRandomAccessReadDevice type's
+ * async_read_some_at operation.
+ */
+template <typename AsyncRandomAccessReadDevice, typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncRandomAccessReadDevice::executor_type>>
+auto async_read_at(AsyncRandomAccessReadDevice& d,
+ uint64_t offset, const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncRandomAccessReadDevice::executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_at<AsyncRandomAccessReadDevice>>(),
+ token, offset, buffers, transfer_all()));
+
+/// 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. It is an
+ * initiating function for an @ref asynchronous_operation, and 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncRandomAccessReadDevice type's
+ * async_read_some_at operation.
+ */
+template <typename AsyncRandomAccessReadDevice,
+ typename MutableBufferSequence, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncRandomAccessReadDevice::executor_type>>
+auto async_read_at(AsyncRandomAccessReadDevice& d,
+ uint64_t offset, const MutableBufferSequence& buffers,
+ CompletionCondition completion_condition,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncRandomAccessReadDevice::executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_at<AsyncRandomAccessReadDevice>>(),
+ token, offset, buffers,
+ static_cast<CompletionCondition&&>(completion_condition)));
+
+#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. It is an
+ * initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @note This overload is equivalent to calling:
+ * @code asio::async_read_at(
+ * d, 42, b,
+ * asio::transfer_all(),
+ * handler); @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncRandomAccessReadDevice type's
+ * async_read_some_at operation.
+ */
+template <typename AsyncRandomAccessReadDevice, typename Allocator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncRandomAccessReadDevice::executor_type>>
+auto async_read_at(AsyncRandomAccessReadDevice& d,
+ uint64_t offset, basic_streambuf<Allocator>& b,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncRandomAccessReadDevice::executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_at_streambuf<
+ AsyncRandomAccessReadDevice>>(),
+ token, offset, &b, transfer_all()));
+
+/// 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. It is an
+ * initiating function for an @ref asynchronous_operation, and 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncRandomAccessReadDevice type's
+ * async_read_some_at operation.
+ */
+template <typename AsyncRandomAccessReadDevice,
+ typename Allocator, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncRandomAccessReadDevice::executor_type>>
+auto async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset,
+ basic_streambuf<Allocator>& b, CompletionCondition completion_condition,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncRandomAccessReadDevice::executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_at_streambuf<
+ AsyncRandomAccessReadDevice>>(),
+ token, offset, &b,
+ static_cast<CompletionCondition&&>(completion_condition)));
+
+#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/3rdparty/asio/include/asio/read_until.hpp b/3rdparty/asio/include/asio/read_until.hpp
new file mode 100644
index 00000000000..97abbdbf0ea
--- /dev/null
+++ b/3rdparty/asio/include/asio/read_until.hpp
@@ -0,0 +1,3124 @@
+//
+// read_until.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <string>
+#include "asio/async_result.hpp"
+#include "asio/buffer.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 <typename T>
+char has_result_type_helper(T*, typename T::result_type* = 0);
+
+template <typename T>
+struct has_result_type
+{
+ enum { value = (sizeof((has_result_type_helper)((T*)(0))) == 1) };
+};
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+template <typename> class initiate_async_read_until_delim_v1;
+template <typename> class initiate_async_read_until_delim_string_v1;
+#if defined(ASIO_HAS_BOOST_REGEX)
+template <typename> class initiate_async_read_until_expr_v1;
+#endif // defined(ASIO_HAS_BOOST_REGEX)
+template <typename> class initiate_async_read_until_match_v1;
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+template <typename> class initiate_async_read_until_delim_v2;
+template <typename> class initiate_async_read_until_delim_string_v2;
+#if defined(ASIO_HAS_BOOST_REGEX)
+template <typename> class initiate_async_read_until_expr_v2;
+#endif // defined(ASIO_HAS_BOOST_REGEX)
+template <typename> class initiate_async_read_until_match_v2;
+
+} // 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 <typename T>
+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<remove_pointer_t<T>>::value
+ || detail::has_result_type<T>::value
+ };
+#endif
+};
+
+/**
+ * @defgroup read_until asio::read_until
+ *
+ * @brief The @c read_until function is a composed operation that reads 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.
+ */
+/*@{*/
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// 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::size_t 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 <typename SyncReadStream, typename DynamicBuffer_v1>
+std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers, char delim,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0);
+
+/// 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 <typename SyncReadStream, typename DynamicBuffer_v1>
+std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ char delim, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0);
+
+/// 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::size_t 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 <typename SyncReadStream, typename DynamicBuffer_v1>
+std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ ASIO_STRING_VIEW_PARAM delim,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0);
+
+/// 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 <typename SyncReadStream, typename DynamicBuffer_v1>
+std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ ASIO_STRING_VIEW_PARAM delim,
+ asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0);
+
+#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::size_t 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 <typename SyncReadStream, typename DynamicBuffer_v1, typename Traits>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v1&& buffers,
+ const boost::basic_regex<char, Traits>& expr,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0);
+
+/// 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 <typename SyncReadStream, typename DynamicBuffer_v1, typename Traits>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v1&& buffers,
+ const boost::basic_regex<char, Traits>& expr, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0);
+
+#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<iterator, bool> match_condition(iterator begin, iterator end);
+ * @endcode
+ * where @c iterator represents the type:
+ * @code buffers_iterator<typename DynamicBuffer_v1::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 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<iterator, bool>
+ * 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 <typename Iterator>
+ * std::pair<Iterator, bool> 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<match_char>
+ * : public boost::true_type {};
+ * } // namespace asio
+ * ...
+ * std::string data;
+ * asio::read_until(s, data, match_char('a'));
+ * @endcode
+ */
+template <typename SyncReadStream,
+ typename DynamicBuffer_v1, typename MatchCondition>
+std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ MatchCondition match_condition,
+ constraint_t<
+ is_match_condition<MatchCondition>::value
+ > = 0,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 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<iterator, bool> match_condition(iterator begin, iterator end);
+ * @endcode
+ * where @c iterator represents the type:
+ * @code buffers_iterator<DynamicBuffer_v1::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 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 <typename SyncReadStream,
+ typename DynamicBuffer_v1, typename MatchCondition>
+std::size_t read_until(SyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ MatchCondition match_condition, asio::error_code& ec,
+ constraint_t<
+ is_match_condition<MatchCondition>::value
+ > = 0,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 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 <typename SyncReadStream, typename Allocator>
+std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& 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 <typename SyncReadStream, typename Allocator>
+std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& 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 <typename SyncReadStream, typename Allocator>
+std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& 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 <typename SyncReadStream, typename Allocator>
+std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& 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 <typename SyncReadStream, typename Allocator, typename Traits>
+std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ const boost::basic_regex<char, Traits>& 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 <typename SyncReadStream, typename Allocator, typename Traits>
+std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ const boost::basic_regex<char, Traits>& 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<iterator, bool> match_condition(iterator begin, iterator end);
+ * @endcode
+ * where @c iterator represents the type:
+ * @code buffers_iterator<basic_streambuf<Allocator>::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<iterator, bool>
+ * 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 <typename Iterator>
+ * std::pair<Iterator, bool> 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<match_char>
+ * : public boost::true_type {};
+ * } // namespace asio
+ * ...
+ * asio::streambuf b;
+ * asio::read_until(s, b, match_char('a'));
+ * @endcode
+ */
+template <typename SyncReadStream, typename Allocator, typename MatchCondition>
+std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b, MatchCondition match_condition,
+ constraint_t<is_match_condition<MatchCondition>::value> = 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<iterator, bool> match_condition(iterator begin, iterator end);
+ * @endcode
+ * where @c iterator represents the type:
+ * @code buffers_iterator<basic_streambuf<Allocator>::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 <typename SyncReadStream, typename Allocator, typename MatchCondition>
+std::size_t read_until(SyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ MatchCondition match_condition, asio::error_code& ec,
+ constraint_t<is_match_condition<MatchCondition>::value> = 0);
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+#endif // !defined(ASIO_NO_EXTENSIONS)
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// 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::size_t 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 <typename SyncReadStream, typename DynamicBuffer_v2>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers, char delim,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0);
+
+/// 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 <typename SyncReadStream, typename DynamicBuffer_v2>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ char delim, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0);
+
+/// 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::size_t 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 <typename SyncReadStream, typename DynamicBuffer_v2>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ ASIO_STRING_VIEW_PARAM delim,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0);
+
+/// 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 <typename SyncReadStream, typename DynamicBuffer_v2>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0);
+
+#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::size_t 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 <typename SyncReadStream, typename DynamicBuffer_v2, typename Traits>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ const boost::basic_regex<char, Traits>& expr,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0);
+
+/// 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 <typename SyncReadStream, typename DynamicBuffer_v2, typename Traits>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ const boost::basic_regex<char, Traits>& expr, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0);
+
+#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<iterator, bool> match_condition(iterator begin, iterator end);
+ * @endcode
+ * where @c iterator represents the type:
+ * @code buffers_iterator<typename DynamicBuffer_v2::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 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<iterator, bool>
+ * 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 <typename Iterator>
+ * std::pair<Iterator, bool> 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<match_char>
+ * : public boost::true_type {};
+ * } // namespace asio
+ * ...
+ * std::string data;
+ * asio::read_until(s, data, match_char('a'));
+ * @endcode
+ */
+template <typename SyncReadStream,
+ typename DynamicBuffer_v2, typename MatchCondition>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ MatchCondition match_condition,
+ constraint_t<
+ is_match_condition<MatchCondition>::value
+ > = 0,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 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<iterator, bool> match_condition(iterator begin, iterator end);
+ * @endcode
+ * where @c iterator represents the type:
+ * @code buffers_iterator<DynamicBuffer_v2::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 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 <typename SyncReadStream,
+ typename DynamicBuffer_v2, typename MatchCondition>
+std::size_t read_until(SyncReadStream& s, DynamicBuffer_v2 buffers,
+ MatchCondition match_condition, asio::error_code& ec,
+ constraint_t<
+ is_match_condition<MatchCondition>::value
+ > = 0,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0);
+
+#endif // !defined(ASIO_NO_EXTENSIONS)
+
+/*@}*/
+/**
+ * @defgroup async_read_until asio::async_read_until
+ *
+ * @brief The @c async_read_until function is a composed asynchronous operation
+ * that reads 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.
+ */
+/*@{*/
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param delim The delimiter character.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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.
+ * std::size_t bytes_transferred
+ * ); @endcode
+ * Regardless of whether the asynchronous operation completes immediately or
+ * not, the completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename DynamicBuffer_v1,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read_until(AsyncReadStream& s,
+ DynamicBuffer_v1&& buffers, char delim,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_delim_v1<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers), delim));
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param delim The delimiter string.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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.
+ * std::size_t bytes_transferred
+ * ); @endcode
+ * Regardless of whether the asynchronous operation completes immediately or
+ * not, the completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename DynamicBuffer_v1,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read_until(AsyncReadStream& s,
+ DynamicBuffer_v1&& buffers,
+ ASIO_STRING_VIEW_PARAM delim,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_delim_string_v1<
+ AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ static_cast<std::string>(delim)));
+
+#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. It is an initiating function for an
+ * @ref asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param expr The regular expression.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename DynamicBuffer_v1, typename Traits,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read_until(AsyncReadStream& s, DynamicBuffer_v1&& buffers,
+ const boost::basic_regex<char, Traits>& expr,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_expr_v1<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers), expr));
+
+#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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion 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<iterator, bool> match_condition(iterator begin, iterator end);
+ * @endcode
+ * where @c iterator represents the type:
+ * @code buffers_iterator<typename DynamicBuffer_v1::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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::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.
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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<iterator, bool>
+ * 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 <typename Iterator>
+ * std::pair<Iterator, bool> 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<match_char>
+ * : 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
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream,
+ typename DynamicBuffer_v1, typename MatchCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read_until(AsyncReadStream& s,
+ DynamicBuffer_v1&& buffers, MatchCondition match_condition,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_match_condition<MatchCondition>::value
+ > = 0,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_match_v1<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ match_condition));
+
+#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.
+ * It is an initiating function for an @ref asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param delim The delimiter character.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename Allocator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read_until(AsyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b, char delim,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_delim_v1<AsyncReadStream>>(),
+ token, basic_streambuf_ref<Allocator>(b), delim));
+
+/// 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.
+ * It is an initiating function for an @ref asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param delim The delimiter string.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename Allocator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read_until(AsyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ ASIO_STRING_VIEW_PARAM delim,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_delim_string_v1<
+ AsyncReadStream>>(),
+ token, basic_streambuf_ref<Allocator>(b),
+ static_cast<std::string>(delim)));
+
+#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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param expr The regular expression.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename Allocator, typename Traits,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read_until(AsyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b,
+ const boost::basic_regex<char, Traits>& expr,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_expr_v1<AsyncReadStream>>(),
+ token, basic_streambuf_ref<Allocator>(b), expr));
+
+#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. It is
+ * an initiating function for an @ref asynchronous_operation, and 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 <em>composed operation</em>. 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<iterator, bool> match_condition(iterator begin, iterator end);
+ * @endcode
+ * where @c iterator represents the type:
+ * @code buffers_iterator<basic_streambuf<Allocator>::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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::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.
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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<iterator, bool>
+ * 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 <typename Iterator>
+ * std::pair<Iterator, bool> 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<match_char>
+ * : 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
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename Allocator, typename MatchCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read_until(AsyncReadStream& s,
+ asio::basic_streambuf<Allocator>& b, MatchCondition match_condition,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<is_match_condition<MatchCondition>::value> = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_match_v1<AsyncReadStream>>(),
+ token, basic_streambuf_ref<Allocator>(b), match_condition));
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+#endif // !defined(ASIO_NO_EXTENSIONS)
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param delim The delimiter character.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename DynamicBuffer_v2,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers, char delim,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_delim_v2<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers), delim));
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param delim The delimiter string.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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.
+ * std::size_t bytes_transferred
+ * ); @endcode
+ * Regardless of whether the asynchronous operation completes immediately or
+ * not, the completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename DynamicBuffer_v2,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
+ ASIO_STRING_VIEW_PARAM delim,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_delim_string_v2<
+ AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ static_cast<std::string>(delim)));
+
+#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. It is an initiating function for an
+ * @ref asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param expr The regular expression.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream, typename DynamicBuffer_v2, typename Traits,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read_until(AsyncReadStream& s, DynamicBuffer_v2 buffers,
+ const boost::basic_regex<char, Traits>& expr,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_expr_v2<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers), expr));
+
+#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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion 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<iterator, bool> match_condition(iterator begin, iterator end);
+ * @endcode
+ * where @c iterator represents the type:
+ * @code buffers_iterator<typename DynamicBuffer_v2::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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::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.
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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<iterator, bool>
+ * 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 <typename Iterator>
+ * std::pair<Iterator, bool> 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<match_char>
+ * : 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
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncReadStream type's
+ * @c async_read_some operation.
+ */
+template <typename AsyncReadStream,
+ typename DynamicBuffer_v2, typename MatchCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<
+ typename AsyncReadStream::executor_type>>
+auto async_read_until(AsyncReadStream& s,
+ DynamicBuffer_v2 buffers, MatchCondition match_condition,
+ ReadToken&& token = default_completion_token_t<
+ typename AsyncReadStream::executor_type>(),
+ constraint_t<
+ is_match_condition<MatchCondition>::value
+ > = 0,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0)
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_read_until_match_v2<AsyncReadStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers), match_condition));
+
+#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/3rdparty/asio/include/asio/readable_pipe.hpp b/3rdparty/asio/include/asio/readable_pipe.hpp
new file mode 100644
index 00000000000..19101c28702
--- /dev/null
+++ b/3rdparty/asio/include/asio/readable_pipe.hpp
@@ -0,0 +1,35 @@
+//
+// readable_pipe.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_READABLE_PIPE_HPP
+#define ASIO_READABLE_PIPE_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_PIPE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/basic_readable_pipe.hpp"
+
+namespace asio {
+
+/// Typedef for the typical usage of a readable pipe.
+typedef basic_readable_pipe<> readable_pipe;
+
+} // namespace asio
+
+#endif // defined(ASIO_HAS_PIPE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_READABLE_PIPE_HPP
diff --git a/3rdparty/asio/include/asio/recycling_allocator.hpp b/3rdparty/asio/include/asio/recycling_allocator.hpp
new file mode 100644
index 00000000000..b3986c0242e
--- /dev/null
+++ b/3rdparty/asio/include/asio/recycling_allocator.hpp
@@ -0,0 +1,138 @@
+//
+// recycling_allocator.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_RECYCLING_ALLOCATOR_HPP
+#define ASIO_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/recycling_allocator.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// An allocator that caches memory blocks in thread-local storage for reuse.
+/**
+ * The @recycling_allocator uses a simple strategy where a limited number of
+ * small memory blocks are cached in thread-local storage, if the current
+ * thread is running an @c io_context or is part of a @c thread_pool.
+ */
+template <typename T>
+class recycling_allocator
+{
+public:
+ /// The type of object allocated by the recycling allocator.
+ typedef T value_type;
+
+ /// Rebind the allocator to another value_type.
+ template <typename U>
+ struct rebind
+ {
+ /// The rebound @c allocator type.
+ typedef recycling_allocator<U> other;
+ };
+
+ /// Default constructor.
+ constexpr recycling_allocator() noexcept
+ {
+ }
+
+ /// Converting constructor.
+ template <typename U>
+ constexpr recycling_allocator(
+ const recycling_allocator<U>&) noexcept
+ {
+ }
+
+ /// Equality operator. Always returns true.
+ constexpr bool operator==(
+ const recycling_allocator&) const noexcept
+ {
+ return true;
+ }
+
+ /// Inequality operator. Always returns false.
+ constexpr bool operator!=(
+ const recycling_allocator&) const noexcept
+ {
+ return false;
+ }
+
+ /// Allocate memory for the specified number of values.
+ T* allocate(std::size_t n)
+ {
+ return detail::recycling_allocator<T>().allocate(n);
+ }
+
+ /// Deallocate memory for the specified number of values.
+ void deallocate(T* p, std::size_t n)
+ {
+ detail::recycling_allocator<T>().deallocate(p, n);
+ }
+};
+
+/// A proto-allocator that caches memory blocks in thread-local storage for
+/// reuse.
+/**
+ * The @recycling_allocator uses a simple strategy where a limited number of
+ * small memory blocks are cached in thread-local storage, if the current
+ * thread is running an @c io_context or is part of a @c thread_pool.
+ */
+template <>
+class recycling_allocator<void>
+{
+public:
+ /// No values are allocated by a proto-allocator.
+ typedef void value_type;
+
+ /// Rebind the allocator to another value_type.
+ template <typename U>
+ struct rebind
+ {
+ /// The rebound @c allocator type.
+ typedef recycling_allocator<U> other;
+ };
+
+ /// Default constructor.
+ constexpr recycling_allocator() noexcept
+ {
+ }
+
+ /// Converting constructor.
+ template <typename U>
+ constexpr recycling_allocator(
+ const recycling_allocator<U>&) noexcept
+ {
+ }
+
+ /// Equality operator. Always returns true.
+ constexpr bool operator==(
+ const recycling_allocator&) const noexcept
+ {
+ return true;
+ }
+
+ /// Inequality operator. Always returns false.
+ constexpr bool operator!=(
+ const recycling_allocator&) const noexcept
+ {
+ return false;
+ }
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_RECYCLING_ALLOCATOR_HPP
diff --git a/3rdparty/asio/include/asio/redirect_error.hpp b/3rdparty/asio/include/asio/redirect_error.hpp
new file mode 100644
index 00000000000..524bd0b99a1
--- /dev/null
+++ b/3rdparty/asio/include/asio/redirect_error.hpp
@@ -0,0 +1,64 @@
+//
+// redirect_error.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_REDIRECT_ERROR_HPP
+#define ASIO_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 {
+
+/// A @ref completion_token adapter 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 <typename CompletionToken>
+class redirect_error_t
+{
+public:
+ /// Constructor.
+ template <typename T>
+ redirect_error_t(T&& completion_token, asio::error_code& ec)
+ : token_(static_cast<T&&>(completion_token)),
+ ec_(ec)
+ {
+ }
+
+//private:
+ CompletionToken token_;
+ asio::error_code& ec_;
+};
+
+/// Adapt a @ref completion_token to capture error_code values to a variable.
+template <typename CompletionToken>
+inline redirect_error_t<decay_t<CompletionToken>> redirect_error(
+ CompletionToken&& completion_token, asio::error_code& ec)
+{
+ return redirect_error_t<decay_t<CompletionToken>>(
+ static_cast<CompletionToken&&>(completion_token), ec);
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/redirect_error.hpp"
+
+#endif // ASIO_REDIRECT_ERROR_HPP
diff --git a/3rdparty/asio/include/asio/registered_buffer.hpp b/3rdparty/asio/include/asio/registered_buffer.hpp
new file mode 100644
index 00000000000..f563277b30a
--- /dev/null
+++ b/3rdparty/asio/include/asio/registered_buffer.hpp
@@ -0,0 +1,344 @@
+//
+// registered_buffer.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_REGISTERED_BUFFER_HPP
+#define ASIO_REGISTERED_BUFFER_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/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+class buffer_registration_base;
+
+} // namespace detail
+
+class const_registered_buffer;
+
+/// Type used to identify a registered buffer.
+class registered_buffer_id
+{
+public:
+ /// The native buffer identifier type.
+ typedef int native_handle_type;
+
+ /// Default constructor creates an invalid registered buffer identifier.
+ registered_buffer_id() noexcept
+ : scope_(0),
+ index_(-1)
+ {
+ }
+
+ /// Get the native buffer identifier type.
+ native_handle_type native_handle() const noexcept
+ {
+ return index_;
+ }
+
+ /// Compare two IDs for equality.
+ friend bool operator==(const registered_buffer_id& lhs,
+ const registered_buffer_id& rhs) noexcept
+ {
+ return lhs.scope_ == rhs.scope_ && lhs.index_ == rhs.index_;
+ }
+
+ /// Compare two IDs for equality.
+ friend bool operator!=(const registered_buffer_id& lhs,
+ const registered_buffer_id& rhs) noexcept
+ {
+ return lhs.scope_ != rhs.scope_ || lhs.index_ != rhs.index_;
+ }
+
+private:
+ friend class detail::buffer_registration_base;
+
+ // Hidden constructor used by buffer registration.
+ registered_buffer_id(const void* scope, int index) noexcept
+ : scope_(scope),
+ index_(index)
+ {
+ }
+
+ const void* scope_;
+ int index_;
+};
+
+/// Holds a registered buffer over modifiable data.
+/**
+ * Satisfies the @c MutableBufferSequence type requirements.
+ */
+class mutable_registered_buffer
+{
+public:
+ /// Default constructor creates an invalid registered buffer.
+ mutable_registered_buffer() noexcept
+ : buffer_(),
+ id_()
+ {
+ }
+
+ /// Get the underlying mutable buffer.
+ const mutable_buffer& buffer() const noexcept
+ {
+ return buffer_;
+ }
+
+ /// Get a pointer to the beginning of the memory range.
+ /**
+ * @returns <tt>buffer().data()</tt>.
+ */
+ void* data() const noexcept
+ {
+ return buffer_.data();
+ }
+
+ /// Get the size of the memory range.
+ /**
+ * @returns <tt>buffer().size()</tt>.
+ */
+ std::size_t size() const noexcept
+ {
+ return buffer_.size();
+ }
+
+ /// Get the registered buffer identifier.
+ const registered_buffer_id& id() const noexcept
+ {
+ return id_;
+ }
+
+ /// Move the start of the buffer by the specified number of bytes.
+ mutable_registered_buffer& operator+=(std::size_t n) noexcept
+ {
+ buffer_ += n;
+ return *this;
+ }
+
+private:
+ friend class detail::buffer_registration_base;
+
+ // Hidden constructor used by buffer registration and operators.
+ mutable_registered_buffer(const mutable_buffer& b,
+ const registered_buffer_id& i) noexcept
+ : buffer_(b),
+ id_(i)
+ {
+ }
+
+#if !defined(GENERATING_DOCUMENTATION)
+ friend mutable_registered_buffer buffer(
+ const mutable_registered_buffer& b, std::size_t n) noexcept;
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ mutable_buffer buffer_;
+ registered_buffer_id id_;
+};
+
+/// Holds a registered buffer over non-modifiable data.
+/**
+ * Satisfies the @c ConstBufferSequence type requirements.
+ */
+class const_registered_buffer
+{
+public:
+ /// Default constructor creates an invalid registered buffer.
+ const_registered_buffer() noexcept
+ : buffer_(),
+ id_()
+ {
+ }
+
+ /// Construct a non-modifiable buffer from a modifiable one.
+ const_registered_buffer(
+ const mutable_registered_buffer& b) noexcept
+ : buffer_(b.buffer()),
+ id_(b.id())
+ {
+ }
+
+ /// Get the underlying constant buffer.
+ const const_buffer& buffer() const noexcept
+ {
+ return buffer_;
+ }
+
+ /// Get a pointer to the beginning of the memory range.
+ /**
+ * @returns <tt>buffer().data()</tt>.
+ */
+ const void* data() const noexcept
+ {
+ return buffer_.data();
+ }
+
+ /// Get the size of the memory range.
+ /**
+ * @returns <tt>buffer().size()</tt>.
+ */
+ std::size_t size() const noexcept
+ {
+ return buffer_.size();
+ }
+
+ /// Get the registered buffer identifier.
+ const registered_buffer_id& id() const noexcept
+ {
+ return id_;
+ }
+
+ /// Move the start of the buffer by the specified number of bytes.
+ const_registered_buffer& operator+=(std::size_t n) noexcept
+ {
+ buffer_ += n;
+ return *this;
+ }
+
+private:
+ // Hidden constructor used by operators.
+ const_registered_buffer(const const_buffer& b,
+ const registered_buffer_id& i) noexcept
+ : buffer_(b),
+ id_(i)
+ {
+ }
+
+#if !defined(GENERATING_DOCUMENTATION)
+ friend const_registered_buffer buffer(
+ const const_registered_buffer& b, std::size_t n) noexcept;
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ const_buffer buffer_;
+ registered_buffer_id id_;
+};
+
+/** @addtogroup buffer_sequence_begin */
+
+/// Get an iterator to the first element in a buffer sequence.
+inline const mutable_buffer* buffer_sequence_begin(
+ const mutable_registered_buffer& b) noexcept
+{
+ return &b.buffer();
+}
+
+/// Get an iterator to the first element in a buffer sequence.
+inline const const_buffer* buffer_sequence_begin(
+ const const_registered_buffer& b) noexcept
+{
+ return &b.buffer();
+}
+
+/** @} */
+/** @addtogroup buffer_sequence_end */
+
+/// Get an iterator to one past the end element in a buffer sequence.
+inline const mutable_buffer* buffer_sequence_end(
+ const mutable_registered_buffer& b) noexcept
+{
+ return &b.buffer() + 1;
+}
+
+/// Get an iterator to one past the end element in a buffer sequence.
+inline const const_buffer* buffer_sequence_end(
+ const const_registered_buffer& b) noexcept
+{
+ return &b.buffer() + 1;
+}
+
+/** @} */
+/** @addtogroup buffer */
+
+/// Obtain a buffer representing the entire registered buffer.
+inline mutable_registered_buffer buffer(
+ const mutable_registered_buffer& b) noexcept
+{
+ return b;
+}
+
+/// Obtain a buffer representing the entire registered buffer.
+inline const_registered_buffer buffer(
+ const const_registered_buffer& b) noexcept
+{
+ return b;
+}
+
+/// Obtain a buffer representing part of a registered buffer.
+inline mutable_registered_buffer buffer(
+ const mutable_registered_buffer& b, std::size_t n) noexcept
+{
+ return mutable_registered_buffer(buffer(b.buffer_, n), b.id_);
+}
+
+/// Obtain a buffer representing part of a registered buffer.
+inline const_registered_buffer buffer(
+ const const_registered_buffer& b, std::size_t n) noexcept
+{
+ return const_registered_buffer(buffer(b.buffer_, n), b.id_);
+}
+
+/** @} */
+
+/// Create a new modifiable registered buffer that is offset from the start of
+/// another.
+/**
+ * @relates mutable_registered_buffer
+ */
+inline mutable_registered_buffer operator+(
+ const mutable_registered_buffer& b, std::size_t n) noexcept
+{
+ mutable_registered_buffer tmp(b);
+ tmp += n;
+ return tmp;
+}
+
+/// Create a new modifiable buffer that is offset from the start of another.
+/**
+ * @relates mutable_registered_buffer
+ */
+inline mutable_registered_buffer operator+(std::size_t n,
+ const mutable_registered_buffer& b) noexcept
+{
+ return b + n;
+}
+
+/// Create a new non-modifiable registered buffer that is offset from the start
+/// of another.
+/**
+ * @relates const_registered_buffer
+ */
+inline const_registered_buffer operator+(const const_registered_buffer& b,
+ std::size_t n) noexcept
+{
+ const_registered_buffer tmp(b);
+ tmp += n;
+ return tmp;
+}
+
+/// Create a new non-modifiable buffer that is offset from the start of another.
+/**
+ * @relates const_registered_buffer
+ */
+inline const_registered_buffer operator+(std::size_t n,
+ const const_registered_buffer& b) noexcept
+{
+ return b + n;
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_REGISTERED_BUFFER_HPP
diff --git a/3rdparty/asio/include/asio/require.hpp b/3rdparty/asio/include/asio/require.hpp
new file mode 100644
index 00000000000..609e54fcaa3
--- /dev/null
+++ b/3rdparty/asio/include/asio/require.hpp
@@ -0,0 +1,433 @@
+//
+// require.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_REQUIRE_HPP
+#define ASIO_REQUIRE_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_applicable_property.hpp"
+#include "asio/traits/require_member.hpp"
+#include "asio/traits/require_free.hpp"
+#include "asio/traits/static_require.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace asio {
+
+/// A customisation point that applies a concept-preserving property to an
+/// object.
+/**
+ * The name <tt>require</tt> denotes a customisation point object. The
+ * expression <tt>asio::require(E, P0, Pn...)</tt> for some
+ * subexpressions <tt>E</tt> and <tt>P0</tt>, and where <tt>Pn...</tt>
+ * represents <tt>N</tt> subexpressions (where <tt>N</tt> is 0 or more, and with
+ * types <tt>T = decay_t<decltype(E)></tt> and <tt>Prop0 =
+ * decay_t<decltype(P0)></tt>) is expression-equivalent to:
+ *
+ * @li If <tt>is_applicable_property_v<T, Prop0> && Prop0::is_requirable</tt> is
+ * not a well-formed constant expression with value <tt>true</tt>,
+ * <tt>asio::require(E, P0, Pn...)</tt> is ill-formed.
+ *
+ * @li Otherwise, <tt>E</tt> if <tt>N == 0</tt> and the expression
+ * <tt>Prop0::template static_query_v<T> == Prop0::value()</tt> is a
+ * well-formed constant expression with value <tt>true</tt>.
+ *
+ * @li Otherwise, <tt>(E).require(P0)</tt> if <tt>N == 0</tt> and the expression
+ * <tt>(E).require(P0)</tt> is a valid expression.
+ *
+ * @li Otherwise, <tt>require(E, P0)</tt> if <tt>N == 0</tt> and the expression
+ * <tt>require(E, P0)</tt> is a valid expression with overload resolution
+ * performed in a context that does not include the declaration of the
+ * <tt>require</tt> customization point object.
+ *
+ * @li Otherwise,
+ * <tt>asio::require(asio::require(E, P0), Pn...)</tt>
+ * if <tt>N > 0</tt> and the expression
+ * <tt>asio::require(asio::require(E, P0), Pn...)</tt>
+ * is a valid expression.
+ *
+ * @li Otherwise, <tt>asio::require(E, P0, Pn...)</tt> is ill-formed.
+ */
+inline constexpr unspecified require = unspecified;
+
+/// A type trait that determines whether a @c require expression is well-formed.
+/**
+ * Class template @c can_require is a trait that is derived from
+ * @c true_type if the expression <tt>asio::require(std::declval<T>(),
+ * std::declval<Properties>()...)</tt> is well formed; otherwise @c false_type.
+ */
+template <typename T, typename... Properties>
+struct can_require :
+ integral_constant<bool, automatically_determined>
+{
+};
+
+/// A type trait that determines whether a @c require expression will not throw.
+/**
+ * Class template @c is_nothrow_require is a trait that is derived from
+ * @c true_type if the expression <tt>asio::require(std::declval<T>(),
+ * std::declval<Properties>()...)</tt> is @c noexcept; otherwise @c false_type.
+ */
+template <typename T, typename... Properties>
+struct is_nothrow_require :
+ integral_constant<bool, automatically_determined>
+{
+};
+
+/// A type trait that determines the result type of a @c require expression.
+/**
+ * Class template @c require_result is a trait that determines the result
+ * type of the expression <tt>asio::require(std::declval<T>(),
+ * std::declval<Properties>()...)</tt>.
+ */
+template <typename T, typename... Properties>
+struct require_result
+{
+ /// The result of the @c require expression.
+ typedef automatically_determined type;
+};
+
+} // namespace asio
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace asio_require_fn {
+
+using asio::conditional_t;
+using asio::decay_t;
+using asio::declval;
+using asio::enable_if_t;
+using asio::is_applicable_property;
+using asio::traits::require_free;
+using asio::traits::require_member;
+using asio::traits::static_require;
+
+void require();
+
+enum overload_type
+{
+ identity,
+ call_member,
+ call_free,
+ two_props,
+ n_props,
+ ill_formed
+};
+
+template <typename Impl, typename T, typename Properties, typename = void,
+ typename = void, typename = void, typename = void, typename = void>
+struct call_traits
+{
+ static constexpr overload_type overload = ill_formed;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ decay_t<Property>::is_requirable
+ >,
+ enable_if_t<
+ static_require<T, Property>::is_valid
+ >>
+{
+ static constexpr overload_type overload = identity;
+ static constexpr bool is_noexcept = true;
+
+ typedef T&& result_type;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ decay_t<Property>::is_requirable
+ >,
+ enable_if_t<
+ !static_require<T, Property>::is_valid
+ >,
+ enable_if_t<
+ require_member<typename Impl::template proxy<T>::type, Property>::is_valid
+ >> :
+ require_member<typename Impl::template proxy<T>::type, Property>
+{
+ static constexpr overload_type overload = call_member;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ decay_t<Property>::is_requirable
+ >,
+ enable_if_t<
+ !static_require<T, Property>::is_valid
+ >,
+ enable_if_t<
+ !require_member<typename Impl::template proxy<T>::type, Property>::is_valid
+ >,
+ enable_if_t<
+ require_free<T, Property>::is_valid
+ >> :
+ require_free<T, Property>
+{
+ static constexpr overload_type overload = call_free;
+};
+
+template <typename Impl, typename T, typename P0, typename P1>
+struct call_traits<Impl, T, void(P0, P1),
+ enable_if_t<
+ call_traits<Impl, T, void(P0)>::overload != ill_formed
+ >,
+ enable_if_t<
+ call_traits<
+ Impl,
+ typename call_traits<Impl, T, void(P0)>::result_type,
+ void(P1)
+ >::overload != ill_formed
+ >>
+{
+ static constexpr overload_type overload = two_props;
+
+ static constexpr bool is_noexcept =
+ (
+ call_traits<Impl, T, void(P0)>::is_noexcept
+ &&
+ call_traits<
+ Impl,
+ typename call_traits<Impl, T, void(P0)>::result_type,
+ void(P1)
+ >::is_noexcept
+ );
+
+ typedef decay_t<
+ typename call_traits<
+ Impl,
+ typename call_traits<Impl, T, void(P0)>::result_type,
+ void(P1)
+ >::result_type
+ > result_type;
+};
+
+template <typename Impl, typename T, typename P0,
+ typename P1, typename... PN>
+struct call_traits<Impl, T, void(P0, P1, PN...),
+ enable_if_t<
+ call_traits<Impl, T, void(P0)>::overload != ill_formed
+ >,
+ enable_if_t<
+ call_traits<
+ Impl,
+ typename call_traits<Impl, T, void(P0)>::result_type,
+ void(P1, PN...)
+ >::overload != ill_formed
+ >>
+{
+ static constexpr overload_type overload = n_props;
+
+ static constexpr bool is_noexcept =
+ (
+ call_traits<Impl, T, void(P0)>::is_noexcept
+ &&
+ call_traits<
+ Impl,
+ typename call_traits<Impl, T, void(P0)>::result_type,
+ void(P1, PN...)
+ >::is_noexcept
+ );
+
+ typedef decay_t<
+ typename call_traits<
+ Impl,
+ typename call_traits<Impl, T, void(P0)>::result_type,
+ void(P1, PN...)
+ >::result_type
+ > result_type;
+};
+
+struct impl
+{
+ template <typename T>
+ struct proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ auto require(P&& p)
+ noexcept(
+ noexcept(
+ declval<conditional_t<true, T, P>>().require(static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ declval<conditional_t<true, T, P>>().require(static_cast<P&&>(p))
+ );
+ };
+#else // defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+ };
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == identity,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&&) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return static_cast<T&&>(t);
+ }
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == call_member,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&& p) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return static_cast<T&&>(t).require(static_cast<Property&&>(p));
+ }
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == call_free,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&& p) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return require(static_cast<T&&>(t), static_cast<Property&&>(p));
+ }
+
+ template <typename T, typename P0, typename P1>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(P0, P1)>::overload == two_props,
+ typename call_traits<impl, T, void(P0, P1)>::result_type
+ >
+ operator()(T&& t, P0&& p0, P1&& p1) const
+ noexcept(call_traits<impl, T, void(P0, P1)>::is_noexcept)
+ {
+ return (*this)(
+ (*this)(static_cast<T&&>(t), static_cast<P0&&>(p0)),
+ static_cast<P1&&>(p1));
+ }
+
+ template <typename T, typename P0, typename P1,
+ typename... PN>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(P0, P1, PN...)>::overload == n_props,
+ typename call_traits<impl, T, void(P0, P1, PN...)>::result_type
+ >
+ operator()(T&& t, P0&& p0, P1&& p1, PN&&... pn) const
+ noexcept(call_traits<impl, T, void(P0, P1, PN...)>::is_noexcept)
+ {
+ return (*this)(
+ (*this)(static_cast<T&&>(t), static_cast<P0&&>(p0)),
+ static_cast<P1&&>(p1), static_cast<PN&&>(pn)...);
+ }
+};
+
+template <typename T = impl>
+struct static_instance
+{
+ static const T instance;
+};
+
+template <typename T>
+const T static_instance<T>::instance = {};
+
+} // namespace asio_require_fn
+namespace asio {
+namespace {
+
+static constexpr const asio_require_fn::impl&
+ require = asio_require_fn::static_instance<>::instance;
+
+} // namespace
+
+typedef asio_require_fn::impl require_t;
+
+template <typename T, typename... Properties>
+struct can_require :
+ integral_constant<bool,
+ asio_require_fn::call_traits<
+ require_t, T, void(Properties...)>::overload
+ != asio_require_fn::ill_formed>
+{
+};
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename... Properties>
+constexpr bool can_require_v
+ = can_require<T, Properties...>::value;
+
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename... Properties>
+struct is_nothrow_require :
+ integral_constant<bool,
+ asio_require_fn::call_traits<
+ require_t, T, void(Properties...)>::is_noexcept>
+{
+};
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename... Properties>
+constexpr bool is_nothrow_require_v
+ = is_nothrow_require<T, Properties...>::value;
+
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename... Properties>
+struct require_result
+{
+ typedef typename asio_require_fn::call_traits<
+ require_t, T, void(Properties...)>::result_type type;
+};
+
+template <typename T, typename... Properties>
+using require_result_t = typename require_result<T, Properties...>::type;
+
+} // namespace asio
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_REQUIRE_HPP
diff --git a/3rdparty/asio/include/asio/require_concept.hpp b/3rdparty/asio/include/asio/require_concept.hpp
new file mode 100644
index 00000000000..b735b669952
--- /dev/null
+++ b/3rdparty/asio/include/asio/require_concept.hpp
@@ -0,0 +1,343 @@
+//
+// require_concept.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_REQUIRE_CONCEPT_HPP
+#define ASIO_REQUIRE_CONCEPT_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_applicable_property.hpp"
+#include "asio/traits/require_concept_member.hpp"
+#include "asio/traits/require_concept_free.hpp"
+#include "asio/traits/static_require_concept.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+#if defined(GENERATING_DOCUMENTATION)
+
+namespace asio {
+
+/// A customisation point that applies a concept-enforcing property to an
+/// object.
+/**
+ * The name <tt>require_concept</tt> denotes a customization point object. The
+ * expression <tt>asio::require_concept(E, P)</tt> for some
+ * subexpressions <tt>E</tt> and <tt>P</tt> (with types <tt>T =
+ * decay_t<decltype(E)></tt> and <tt>Prop = decay_t<decltype(P)></tt>) is
+ * expression-equivalent to:
+ *
+ * @li If <tt>is_applicable_property_v<T, Prop> &&
+ * Prop::is_requirable_concept</tt> is not a well-formed constant expression
+ * with value <tt>true</tt>, <tt>asio::require_concept(E, P)</tt> is
+ * ill-formed.
+ *
+ * @li Otherwise, <tt>E</tt> if the expression <tt>Prop::template
+ * static_query_v<T> == Prop::value()</tt> is a well-formed constant
+ * expression with value <tt>true</tt>.
+ *
+ * @li Otherwise, <tt>(E).require_concept(P)</tt> if the expression
+ * <tt>(E).require_concept(P)</tt> is well-formed.
+ *
+ * @li Otherwise, <tt>require_concept(E, P)</tt> if the expression
+ * <tt>require_concept(E, P)</tt> is a valid expression with overload
+ * resolution performed in a context that does not include the declaration
+ * of the <tt>require_concept</tt> customization point object.
+ *
+ * @li Otherwise, <tt>asio::require_concept(E, P)</tt> is ill-formed.
+ */
+inline constexpr unspecified require_concept = unspecified;
+
+/// A type trait that determines whether a @c require_concept expression is
+/// well-formed.
+/**
+ * Class template @c can_require_concept is a trait that is derived from
+ * @c true_type if the expression
+ * <tt>asio::require_concept(std::declval<T>(),
+ * std::declval<Property>())</tt> is well formed; otherwise @c false_type.
+ */
+template <typename T, typename Property>
+struct can_require_concept :
+ integral_constant<bool, automatically_determined>
+{
+};
+
+/// A type trait that determines whether a @c require_concept expression will
+/// not throw.
+/**
+ * Class template @c is_nothrow_require_concept is a trait that is derived from
+ * @c true_type if the expression
+ * <tt>asio::require_concept(std::declval<T>(),
+ * std::declval<Property>())</tt> is @c noexcept; otherwise @c false_type.
+ */
+template <typename T, typename Property>
+struct is_nothrow_require_concept :
+ integral_constant<bool, automatically_determined>
+{
+};
+
+/// A type trait that determines the result type of a @c require_concept
+/// expression.
+/**
+ * Class template @c require_concept_result is a trait that determines the
+ * result type of the expression
+ * <tt>asio::require_concept(std::declval<T>(),
+ * std::declval<Property>())</tt>.
+ */
+template <typename T, typename Property>
+struct require_concept_result
+{
+ /// The result of the @c require_concept expression.
+ typedef automatically_determined type;
+};
+
+} // namespace asio
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+namespace asio_require_concept_fn {
+
+using asio::conditional_t;
+using asio::decay_t;
+using asio::declval;
+using asio::enable_if_t;
+using asio::is_applicable_property;
+using asio::traits::require_concept_free;
+using asio::traits::require_concept_member;
+using asio::traits::static_require_concept;
+
+void require_concept();
+
+enum overload_type
+{
+ identity,
+ call_member,
+ call_free,
+ ill_formed
+};
+
+template <typename Impl, typename T, typename Properties, typename = void,
+ typename = void, typename = void, typename = void, typename = void>
+struct call_traits
+{
+ static constexpr overload_type overload = ill_formed;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ decay_t<Property>::is_requirable_concept
+ >,
+ enable_if_t<
+ static_require_concept<T, Property>::is_valid
+ >>
+{
+ static constexpr overload_type overload = identity;
+ static constexpr bool is_noexcept = true;
+ typedef T&& result_type;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ decay_t<Property>::is_requirable_concept
+ >,
+ enable_if_t<
+ !static_require_concept<T, Property>::is_valid
+ >,
+ enable_if_t<
+ require_concept_member<
+ typename Impl::template proxy<T>::type,
+ Property
+ >::is_valid
+ >> :
+ require_concept_member<
+ typename Impl::template proxy<T>::type,
+ Property
+ >
+{
+ static constexpr overload_type overload = call_member;
+};
+
+template <typename Impl, typename T, typename Property>
+struct call_traits<Impl, T, void(Property),
+ enable_if_t<
+ is_applicable_property<
+ decay_t<T>,
+ decay_t<Property>
+ >::value
+ >,
+ enable_if_t<
+ decay_t<Property>::is_requirable_concept
+ >,
+ enable_if_t<
+ !static_require_concept<T, Property>::is_valid
+ >,
+ enable_if_t<
+ !require_concept_member<
+ typename Impl::template proxy<T>::type,
+ Property
+ >::is_valid
+ >,
+ enable_if_t<
+ require_concept_free<T, Property>::is_valid
+ >> :
+ require_concept_free<T, Property>
+{
+ static constexpr overload_type overload = call_free;
+};
+
+struct impl
+{
+ template <typename T>
+ struct proxy
+ {
+#if defined(ASIO_HAS_DEDUCED_REQUIRE_CONCEPT_MEMBER_TRAIT)
+ struct type
+ {
+ template <typename P>
+ auto require_concept(P&& p)
+ noexcept(
+ noexcept(
+ declval<conditional_t<true, T, P>>().require_concept(
+ static_cast<P&&>(p))
+ )
+ )
+ -> decltype(
+ declval<conditional_t<true, T, P>>().require_concept(
+ static_cast<P&&>(p))
+ );
+ };
+#else // defined(ASIO_HAS_DEDUCED_REQUIRE_CONCEPT_MEMBER_TRAIT)
+ typedef T type;
+#endif // defined(ASIO_HAS_DEDUCED_REQUIRE_CONCEPT_MEMBER_TRAIT)
+ };
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == identity,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&&) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return static_cast<T&&>(t);
+ }
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == call_member,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&& p) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return static_cast<T&&>(t).require_concept(static_cast<Property&&>(p));
+ }
+
+ template <typename T, typename Property>
+ ASIO_NODISCARD constexpr enable_if_t<
+ call_traits<impl, T, void(Property)>::overload == call_free,
+ typename call_traits<impl, T, void(Property)>::result_type
+ >
+ operator()(T&& t, Property&& p) const
+ noexcept(call_traits<impl, T, void(Property)>::is_noexcept)
+ {
+ return require_concept(static_cast<T&&>(t), static_cast<Property&&>(p));
+ }
+};
+
+template <typename T = impl>
+struct static_instance
+{
+ static const T instance;
+};
+
+template <typename T>
+const T static_instance<T>::instance = {};
+
+} // namespace asio_require_concept_fn
+namespace asio {
+namespace {
+
+static constexpr const asio_require_concept_fn::impl&
+ require_concept = asio_require_concept_fn::static_instance<>::instance;
+
+} // namespace
+
+typedef asio_require_concept_fn::impl require_concept_t;
+
+template <typename T, typename Property>
+struct can_require_concept :
+ integral_constant<bool,
+ asio_require_concept_fn::call_traits<
+ require_concept_t, T, void(Property)>::overload !=
+ asio_require_concept_fn::ill_formed>
+{
+};
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename Property>
+constexpr bool can_require_concept_v = can_require_concept<T, Property>::value;
+
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename Property>
+struct is_nothrow_require_concept :
+ integral_constant<bool,
+ asio_require_concept_fn::call_traits<
+ require_concept_t, T, void(Property)>::is_noexcept>
+{
+};
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename Property>
+constexpr bool is_nothrow_require_concept_v
+ = is_nothrow_require_concept<T, Property>::value;
+
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+
+template <typename T, typename Property>
+struct require_concept_result
+{
+ typedef typename asio_require_concept_fn::call_traits<
+ require_concept_t, T, void(Property)>::result_type type;
+};
+
+template <typename T, typename Property>
+using require_concept_result_t =
+ typename require_concept_result<T, Property>::type;
+
+} // namespace asio
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_REQUIRE_CONCEPT_HPP
diff --git a/3rdparty/asio/include/asio/serial_port.hpp b/3rdparty/asio/include/asio/serial_port.hpp
new file mode 100644
index 00000000000..61e893769bf
--- /dev/null
+++ b/3rdparty/asio/include/asio/serial_port.hpp
@@ -0,0 +1,36 @@
+//
+// serial_port.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 "asio/basic_serial_port.hpp"
+
+namespace asio {
+
+/// Typedef for the typical usage of a serial port.
+typedef basic_serial_port<> serial_port;
+
+} // namespace asio
+
+#endif // defined(ASIO_HAS_SERIAL_PORT)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_SERIAL_PORT_HPP
diff --git a/3rdparty/asio/include/asio/serial_port_base.hpp b/3rdparty/asio/include/asio/serial_port_base.hpp
new file mode 100644
index 00000000000..479d69796e7
--- /dev/null
+++ b/3rdparty/asio/include/asio/serial_port_base.hpp
@@ -0,0 +1,167 @@
+//
+// serial_port_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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 <termios.h>
+#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/3rdparty/asio/include/asio/signal_set.hpp b/3rdparty/asio/include/asio/signal_set.hpp
new file mode 100644
index 00000000000..b2e189d01d7
--- /dev/null
+++ b/3rdparty/asio/include/asio/signal_set.hpp
@@ -0,0 +1,28 @@
+//
+// signal_set.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/basic_signal_set.hpp"
+
+namespace asio {
+
+/// Typedef for the typical usage of a signal set.
+typedef basic_signal_set<> signal_set;
+
+} // namespace asio
+
+#endif // ASIO_SIGNAL_SET_HPP
diff --git a/3rdparty/asio/include/asio/signal_set_base.hpp b/3rdparty/asio/include/asio/signal_set_base.hpp
new file mode 100644
index 00000000000..9863a1598a3
--- /dev/null
+++ b/3rdparty/asio/include/asio/signal_set_base.hpp
@@ -0,0 +1,171 @@
+//
+// signal_set_base.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_BASE_HPP
+#define ASIO_SIGNAL_SET_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 {
+
+/// The signal_set_base class is used as a base for the basic_signal_set class
+/// templates so that we have a common place to define the flags enum.
+class signal_set_base
+{
+public:
+# if defined(GENERATING_DOCUMENTATION)
+ /// Enumeration representing the different types of flags that may specified
+ /// when adding a signal to a set.
+ enum flags
+ {
+ /// Bitmask representing no flags.
+ none = 0,
+
+ /// Affects the behaviour of interruptible functions such that, if the
+ /// function would have failed with error::interrupted when interrupted by
+ /// the specified signal, the function shall instead be restarted and not
+ /// fail with error::interrupted.
+ restart = implementation_defined,
+
+ /// Do not generate SIGCHLD when child processes stop or stopped child
+ /// processes continue.
+ no_child_stop = implementation_defined,
+
+ /// Do not transform child processes into zombies when they terminate.
+ no_child_wait = implementation_defined,
+
+ /// Special value to indicate that the signal registration does not care
+ /// which flags are set, and so will not conflict with any prior
+ /// registrations of the same signal.
+ dont_care = -1
+ };
+
+ /// Portability typedef.
+ typedef flags flags_t;
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+ enum class flags : int
+ {
+ none = 0,
+ restart = ASIO_OS_DEF(SA_RESTART),
+ no_child_stop = ASIO_OS_DEF(SA_NOCLDSTOP),
+ no_child_wait = ASIO_OS_DEF(SA_NOCLDWAIT),
+ dont_care = -1
+ };
+
+ typedef flags flags_t;
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+protected:
+ /// Protected destructor to prevent deletion through this type.
+ ~signal_set_base()
+ {
+ }
+};
+
+/// Negation operator.
+/**
+ * @relates signal_set_base::flags
+ */
+inline constexpr bool operator!(signal_set_base::flags_t x)
+{
+ return static_cast<int>(x) == 0;
+}
+
+/// Bitwise and operator.
+/**
+ * @relates signal_set_base::flags
+ */
+inline constexpr signal_set_base::flags_t operator&(
+ signal_set_base::flags_t x, signal_set_base::flags_t y)
+{
+ return static_cast<signal_set_base::flags_t>(
+ static_cast<int>(x) & static_cast<int>(y));
+}
+
+/// Bitwise or operator.
+/**
+ * @relates signal_set_base::flags
+ */
+inline constexpr signal_set_base::flags_t operator|(
+ signal_set_base::flags_t x, signal_set_base::flags_t y)
+{
+ return static_cast<signal_set_base::flags_t>(
+ static_cast<int>(x) | static_cast<int>(y));
+}
+
+/// Bitwise xor operator.
+/**
+ * @relates signal_set_base::flags
+ */
+inline constexpr signal_set_base::flags_t operator^(
+ signal_set_base::flags_t x, signal_set_base::flags_t y)
+{
+ return static_cast<signal_set_base::flags_t>(
+ static_cast<int>(x) ^ static_cast<int>(y));
+}
+
+/// Bitwise negation operator.
+/**
+ * @relates signal_set_base::flags
+ */
+inline constexpr signal_set_base::flags_t operator~(
+ signal_set_base::flags_t x)
+{
+ return static_cast<signal_set_base::flags_t>(~static_cast<int>(x));
+}
+
+/// Bitwise and-assignment operator.
+/**
+ * @relates signal_set_base::flags
+ */
+inline signal_set_base::flags_t& operator&=(
+ signal_set_base::flags_t& x, signal_set_base::flags_t y)
+{
+ x = x & y;
+ return x;
+}
+
+/// Bitwise or-assignment operator.
+/**
+ * @relates signal_set_base::flags
+ */
+inline signal_set_base::flags_t& operator|=(
+ signal_set_base::flags_t& x, signal_set_base::flags_t y)
+{
+ x = x | y;
+ return x;
+}
+
+/// Bitwise xor-assignment operator.
+/**
+ * @relates signal_set_base::flags
+ */
+inline signal_set_base::flags_t& operator^=(
+ signal_set_base::flags_t& x, signal_set_base::flags_t y)
+{
+ x = x ^ y;
+ return x;
+}
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_SIGNAL_SET_BASE_HPP
diff --git a/3rdparty/asio/include/asio/socket_base.hpp b/3rdparty/asio/include/asio/socket_base.hpp
new file mode 100644
index 00000000000..5d509790d3d
--- /dev/null
+++ b/3rdparty/asio/include/asio/socket_base.hpp
@@ -0,0 +1,559 @@
+//
+// socket_base.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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(my_context);
+ * ...
+ * asio::socket_base::broadcast option(true);
+ * socket.set_option(option);
+ * @endcode
+ *
+ * @par
+ * Getting the current option value:
+ * @code
+ * asio::ip::udp::socket socket(my_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(my_context);
+ * ...
+ * asio::socket_base::debug option(true);
+ * socket.set_option(option);
+ * @endcode
+ *
+ * @par
+ * Getting the current option value:
+ * @code
+ * asio::ip::tcp::socket socket(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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(my_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/3rdparty/asio/include/asio/spawn.hpp b/3rdparty/asio/include/asio/spawn.hpp
new file mode 100644
index 00000000000..eeacb49de6d
--- /dev/null
+++ b/3rdparty/asio/include/asio/spawn.hpp
@@ -0,0 +1,872 @@
+//
+// spawn.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 "asio/any_io_executor.hpp"
+#include "asio/cancellation_signal.hpp"
+#include "asio/cancellation_state.hpp"
+#include "asio/detail/exception.hpp"
+#include "asio/detail/memory.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/io_context.hpp"
+#include "asio/is_executor.hpp"
+#include "asio/strand.hpp"
+
+#if defined(ASIO_HAS_BOOST_COROUTINE)
+# include <boost/coroutine/all.hpp>
+#endif // defined(ASIO_HAS_BOOST_COROUTINE)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+// Base class for all spawn()-ed thread implementations.
+class spawned_thread_base
+{
+public:
+ spawned_thread_base()
+ : owner_(0),
+ has_context_switched_(false),
+ throw_if_cancelled_(false),
+ terminal_(false)
+ {
+ }
+
+ virtual ~spawned_thread_base() {}
+ virtual void resume() = 0;
+ virtual void suspend_with(void (*fn)(void*), void* arg) = 0;
+ virtual void destroy() = 0;
+
+ void attach(spawned_thread_base** owner)
+ {
+ owner_ = owner;
+ *owner_ = this;
+ }
+
+ void detach()
+ {
+ if (owner_)
+ *owner_ = 0;
+ owner_ = 0;
+ }
+
+ void suspend()
+ {
+ suspend_with(0, 0);
+ }
+
+ template <typename F>
+ void suspend_with(F f)
+ {
+ suspend_with(&spawned_thread_base::call<F>, &f);
+ }
+
+ cancellation_slot get_cancellation_slot() const noexcept
+ {
+ return cancellation_state_.slot();
+ }
+
+ cancellation_state get_cancellation_state() const noexcept
+ {
+ return cancellation_state_;
+ }
+
+ void reset_cancellation_state()
+ {
+ cancellation_state_ = cancellation_state(parent_cancellation_slot_);
+ }
+
+ template <typename Filter>
+ void reset_cancellation_state(Filter filter)
+ {
+ cancellation_state_ = cancellation_state(
+ parent_cancellation_slot_, filter, filter);
+ }
+
+ template <typename InFilter, typename OutFilter>
+ void reset_cancellation_state(InFilter in_filter, OutFilter out_filter)
+ {
+ cancellation_state_ = cancellation_state(
+ parent_cancellation_slot_, in_filter, out_filter);
+ }
+
+ cancellation_type_t cancelled() const noexcept
+ {
+ return cancellation_state_.cancelled();
+ }
+
+ bool has_context_switched() const noexcept
+ {
+ return has_context_switched_;
+ }
+
+ bool throw_if_cancelled() const noexcept
+ {
+ return throw_if_cancelled_;
+ }
+
+ void throw_if_cancelled(bool value) noexcept
+ {
+ throw_if_cancelled_ = value;
+ }
+
+protected:
+ spawned_thread_base** owner_; // Points to data member in active handler.
+ asio::cancellation_slot parent_cancellation_slot_;
+ asio::cancellation_state cancellation_state_;
+ bool has_context_switched_;
+ bool throw_if_cancelled_;
+ bool terminal_;
+
+private:
+ // Disallow copying and assignment.
+ spawned_thread_base(const spawned_thread_base&) = delete;
+ spawned_thread_base& operator=(const spawned_thread_base&) = delete;
+
+ template <typename F>
+ static void call(void* f)
+ {
+ (*static_cast<F*>(f))();
+ }
+};
+
+
+template <typename T>
+struct spawn_signature
+{
+ typedef void type(exception_ptr, T);
+};
+
+template <>
+struct spawn_signature<void>
+{
+ typedef void type(exception_ptr);
+};
+
+template <typename Executor>
+class initiate_spawn;
+
+} // namespace detail
+
+/// A @ref completion_token that represents the currently executing coroutine.
+/**
+ * The basic_yield_context class is a completion token type that is used to
+ * represent the currently executing stackful coroutine. A basic_yield_context
+ * object may be passed as a completion token to an asynchronous operation. For
+ * example:
+ *
+ * @code template <typename Executor>
+ * void my_coroutine(basic_yield_context<Executor> 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 <typename Executor>
+class basic_yield_context
+{
+public:
+ /// The executor type associated with the yield context.
+ typedef Executor executor_type;
+
+ /// The cancellation slot type associated with the yield context.
+ typedef cancellation_slot cancellation_slot_type;
+
+ /// Construct a yield context from another yield context type.
+ /**
+ * Requires that OtherExecutor be convertible to Executor.
+ */
+ template <typename OtherExecutor>
+ basic_yield_context(const basic_yield_context<OtherExecutor>& other,
+ constraint_t<
+ is_convertible<OtherExecutor, Executor>::value
+ > = 0)
+ : spawned_thread_(other.spawned_thread_),
+ executor_(other.executor_),
+ ec_(other.ec_)
+ {
+ }
+
+ /// Get the executor associated with the yield context.
+ executor_type get_executor() const noexcept
+ {
+ return executor_;
+ }
+
+ /// Get the cancellation slot associated with the coroutine.
+ cancellation_slot_type get_cancellation_slot() const noexcept
+ {
+ return spawned_thread_->get_cancellation_slot();
+ }
+
+ /// Get the cancellation state associated with the coroutine.
+ cancellation_state get_cancellation_state() const noexcept
+ {
+ return spawned_thread_->get_cancellation_state();
+ }
+
+ /// Reset the cancellation state associated with the coroutine.
+ /**
+ * Let <tt>P</tt> be the cancellation slot associated with the current
+ * coroutine's @ref spawn completion handler. Assigns a new
+ * asio::cancellation_state object <tt>S</tt>, constructed as
+ * <tt>S(P)</tt>, into the current coroutine's cancellation state object.
+ */
+ void reset_cancellation_state() const
+ {
+ spawned_thread_->reset_cancellation_state();
+ }
+
+ /// Reset the cancellation state associated with the coroutine.
+ /**
+ * Let <tt>P</tt> be the cancellation slot associated with the current
+ * coroutine's @ref spawn completion handler. Assigns a new
+ * asio::cancellation_state object <tt>S</tt>, constructed as <tt>S(P,
+ * std::forward<Filter>(filter))</tt>, into the current coroutine's
+ * cancellation state object.
+ */
+ template <typename Filter>
+ void reset_cancellation_state(Filter&& filter) const
+ {
+ spawned_thread_->reset_cancellation_state(
+ static_cast<Filter&&>(filter));
+ }
+
+ /// Reset the cancellation state associated with the coroutine.
+ /**
+ * Let <tt>P</tt> be the cancellation slot associated with the current
+ * coroutine's @ref spawn completion handler. Assigns a new
+ * asio::cancellation_state object <tt>S</tt>, constructed as <tt>S(P,
+ * std::forward<InFilter>(in_filter),
+ * std::forward<OutFilter>(out_filter))</tt>, into the current coroutine's
+ * cancellation state object.
+ */
+ template <typename InFilter, typename OutFilter>
+ void reset_cancellation_state(InFilter&& in_filter,
+ OutFilter&& out_filter) const
+ {
+ spawned_thread_->reset_cancellation_state(
+ static_cast<InFilter&&>(in_filter),
+ static_cast<OutFilter&&>(out_filter));
+ }
+
+ /// Determine whether the current coroutine has been cancelled.
+ cancellation_type_t cancelled() const noexcept
+ {
+ return spawned_thread_->cancelled();
+ }
+
+ /// Determine whether the coroutine throws if trying to suspend when it has
+ /// been cancelled.
+ bool throw_if_cancelled() const noexcept
+ {
+ return spawned_thread_->throw_if_cancelled();
+ }
+
+ /// Set whether the coroutine throws if trying to suspend when it has been
+ /// cancelled.
+ void throw_if_cancelled(bool value) const noexcept
+ {
+ spawned_thread_->throw_if_cancelled(value);
+ }
+
+ /// 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 <typename Executor>
+ * void my_coroutine(basic_yield_context<Executor> 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:
+ basic_yield_context(detail::spawned_thread_base* spawned_thread,
+ const Executor& ex)
+ : spawned_thread_(spawned_thread),
+ executor_(ex),
+ ec_(0)
+ {
+ }
+
+ detail::spawned_thread_base* spawned_thread_;
+ Executor executor_;
+ asio::error_code* ec_;
+#endif // !defined(GENERATING_DOCUMENTATION)
+};
+
+/// A @ref completion_token object that represents the currently executing
+/// coroutine.
+typedef basic_yield_context<any_io_executor> yield_context;
+
+/**
+ * @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, asio::detached);
+ *
+ * // ...
+ *
+ * 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 that executes on a given executor.
+/**
+ * This function is used to launch a new stackful coroutine.
+ *
+ * @param ex Identifies the executor that will run the stackful coroutine.
+ *
+ * @param function The coroutine function. The function must be callable the
+ * signature:
+ * @code void function(basic_yield_context<Executor> yield); @endcode
+ *
+ * @param token The @ref completion_token that will handle the notification
+ * that the coroutine has completed. If the return type @c R of @c function is
+ * @c void, the function signature of the completion handler must be:
+ *
+ * @code void handler(std::exception_ptr); @endcode
+ * Otherwise, the function signature of the completion handler must be:
+ * @code void handler(std::exception_ptr, R); @endcode
+ *
+ * @par Completion Signature
+ * @code void(std::exception_ptr, R) @endcode
+ * where @c R is the return type of the function object.
+ *
+ * @par Per-Operation Cancellation
+ * The new thread of execution is created with a cancellation state that
+ * supports @c cancellation_type::terminal values only. To change the
+ * cancellation state, call the basic_yield_context member function
+ * @c reset_cancellation_state.
+ */
+template <typename Executor, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type)
+ CompletionToken = default_completion_token_t<Executor>>
+auto spawn(const Executor& ex, F&& function,
+ CompletionToken&& token = default_completion_token_t<Executor>(),
+#if defined(ASIO_HAS_BOOST_COROUTINE)
+ constraint_t<
+ !is_same<
+ decay_t<CompletionToken>,
+ boost::coroutines::attributes
+ >::value
+ > = 0,
+#endif // defined(ASIO_HAS_BOOST_COROUTINE)
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type>(
+ declval<detail::initiate_spawn<Executor>>(),
+ token, static_cast<F&&>(function)));
+
+/// Start a new stackful coroutine that executes on a given execution context.
+/**
+ * This function is used to launch a new stackful coroutine.
+ *
+ * @param ctx Identifies the execution context that will run the stackful
+ * coroutine.
+ *
+ * @param function The coroutine function. The function must be callable the
+ * signature:
+ * @code void function(basic_yield_context<Executor> yield); @endcode
+ *
+ * @param token The @ref completion_token that will handle the notification
+ * that the coroutine has completed. If the return type @c R of @c function is
+ * @c void, the function signature of the completion handler must be:
+ *
+ * @code void handler(std::exception_ptr); @endcode
+ * Otherwise, the function signature of the completion handler must be:
+ * @code void handler(std::exception_ptr, R); @endcode
+ *
+ * @par Completion Signature
+ * @code void(std::exception_ptr, R) @endcode
+ * where @c R is the return type of the function object.
+ *
+ * @par Per-Operation Cancellation
+ * The new thread of execution is created with a cancellation state that
+ * supports @c cancellation_type::terminal values only. To change the
+ * cancellation state, call the basic_yield_context member function
+ * @c reset_cancellation_state.
+ */
+template <typename ExecutionContext, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<
+ typename ExecutionContext::executor_type>)>>::type)
+ CompletionToken = default_completion_token_t<
+ typename ExecutionContext::executor_type>>
+auto spawn(ExecutionContext& ctx, F&& function,
+ CompletionToken&& token
+ = default_completion_token_t<typename ExecutionContext::executor_type>(),
+#if defined(ASIO_HAS_BOOST_COROUTINE)
+ constraint_t<
+ !is_same<
+ decay_t<CompletionToken>,
+ boost::coroutines::attributes
+ >::value
+ > = 0,
+#endif // defined(ASIO_HAS_BOOST_COROUTINE)
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<
+ typename ExecutionContext::executor_type>)>>::type>(
+ declval<detail::initiate_spawn<
+ typename ExecutionContext::executor_type>>(),
+ token, static_cast<F&&>(function)));
+
+/// Start a new stackful coroutine, inheriting the executor of another.
+/**
+ * This function is used to launch a new stackful coroutine.
+ *
+ * @param ctx Identifies the current coroutine as a parent of the new
+ * coroutine. This specifies that the new coroutine should inherit the executor
+ * 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 be callable the
+ * signature:
+ * @code void function(basic_yield_context<Executor> yield); @endcode
+ *
+ * @param token The @ref completion_token that will handle the notification
+ * that the coroutine has completed. If the return type @c R of @c function is
+ * @c void, the function signature of the completion handler must be:
+ *
+ * @code void handler(std::exception_ptr); @endcode
+ * Otherwise, the function signature of the completion handler must be:
+ * @code void handler(std::exception_ptr, R); @endcode
+ *
+ * @par Completion Signature
+ * @code void(std::exception_ptr, R) @endcode
+ * where @c R is the return type of the function object.
+ *
+ * @par Per-Operation Cancellation
+ * The new thread of execution is created with a cancellation state that
+ * supports @c cancellation_type::terminal values only. To change the
+ * cancellation state, call the basic_yield_context member function
+ * @c reset_cancellation_state.
+ */
+template <typename Executor, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type)
+ CompletionToken = default_completion_token_t<Executor>>
+auto spawn(const basic_yield_context<Executor>& ctx, F&& function,
+ CompletionToken&& token = default_completion_token_t<Executor>(),
+#if defined(ASIO_HAS_BOOST_COROUTINE)
+ constraint_t<
+ !is_same<
+ decay_t<CompletionToken>,
+ boost::coroutines::attributes
+ >::value
+ > = 0,
+#endif // defined(ASIO_HAS_BOOST_COROUTINE)
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type>(
+ declval<detail::initiate_spawn<Executor>>(),
+ token, static_cast<F&&>(function)));
+
+#if defined(ASIO_HAS_BOOST_CONTEXT_FIBER) \
+ || defined(GENERATING_DOCUMENTATION)
+
+/// Start a new stackful coroutine that executes on a given executor.
+/**
+ * This function is used to launch a new stackful coroutine using the
+ * specified stack allocator.
+ *
+ * @param ex Identifies the executor that will run the stackful coroutine.
+ *
+ * @param stack_allocator Denotes the allocator to be used to allocate the
+ * underlying coroutine's stack. The type must satisfy the stack-allocator
+ * concept defined by the Boost.Context library.
+ *
+ * @param function The coroutine function. The function must be callable the
+ * signature:
+ * @code void function(basic_yield_context<Executor> yield); @endcode
+ *
+ * @param token The @ref completion_token that will handle the notification
+ * that the coroutine has completed. If the return type @c R of @c function is
+ * @c void, the function signature of the completion handler must be:
+ *
+ * @code void handler(std::exception_ptr); @endcode
+ * Otherwise, the function signature of the completion handler must be:
+ * @code void handler(std::exception_ptr, R); @endcode
+ *
+ * @par Completion Signature
+ * @code void(std::exception_ptr, R) @endcode
+ * where @c R is the return type of the function object.
+ *
+ * @par Per-Operation Cancellation
+ * The new thread of execution is created with a cancellation state that
+ * supports @c cancellation_type::terminal values only. To change the
+ * cancellation state, call the basic_yield_context member function
+ * @c reset_cancellation_state.
+ */
+template <typename Executor, typename StackAllocator, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type)
+ CompletionToken = default_completion_token_t<Executor>>
+auto spawn(const Executor& ex, allocator_arg_t,
+ StackAllocator&& stack_allocator, F&& function,
+ CompletionToken&& token = default_completion_token_t<Executor>(),
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type>(
+ declval<detail::initiate_spawn<Executor>>(),
+ token, allocator_arg_t(),
+ static_cast<StackAllocator&&>(stack_allocator),
+ static_cast<F&&>(function)));
+
+/// Start a new stackful coroutine that executes on a given execution context.
+/**
+ * This function is used to launch a new stackful coroutine.
+ *
+ * @param ctx Identifies the execution context that will run the stackful
+ * coroutine.
+ *
+ * @param stack_allocator Denotes the allocator to be used to allocate the
+ * underlying coroutine's stack. The type must satisfy the stack-allocator
+ * concept defined by the Boost.Context library.
+ *
+ * @param function The coroutine function. The function must be callable the
+ * signature:
+ * @code void function(basic_yield_context<Executor> yield); @endcode
+ *
+ * @param token The @ref completion_token that will handle the notification
+ * that the coroutine has completed. If the return type @c R of @c function is
+ * @c void, the function signature of the completion handler must be:
+ *
+ * @code void handler(std::exception_ptr); @endcode
+ * Otherwise, the function signature of the completion handler must be:
+ * @code void handler(std::exception_ptr, R); @endcode
+ *
+ * @par Completion Signature
+ * @code void(std::exception_ptr, R) @endcode
+ * where @c R is the return type of the function object.
+ *
+ * @par Per-Operation Cancellation
+ * The new thread of execution is created with a cancellation state that
+ * supports @c cancellation_type::terminal values only. To change the
+ * cancellation state, call the basic_yield_context member function
+ * @c reset_cancellation_state.
+ */
+template <typename ExecutionContext, typename StackAllocator, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<
+ typename ExecutionContext::executor_type>)>>::type)
+ CompletionToken = default_completion_token_t<
+ typename ExecutionContext::executor_type>>
+auto spawn(ExecutionContext& ctx, allocator_arg_t,
+ StackAllocator&& stack_allocator, F&& function,
+ CompletionToken&& token
+ = default_completion_token_t<typename ExecutionContext::executor_type>(),
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<
+ typename ExecutionContext::executor_type>)>>::type>(
+ declval<detail::initiate_spawn<
+ typename ExecutionContext::executor_type>>(),
+ token, allocator_arg_t(),
+ static_cast<StackAllocator&&>(stack_allocator),
+ static_cast<F&&>(function)));
+
+/// Start a new stackful coroutine, inheriting the executor of another.
+/**
+ * This function is used to launch a new stackful coroutine using the
+ * specified stack allocator.
+ *
+ * @param ctx Identifies the current coroutine as a parent of the new
+ * coroutine. This specifies that the new coroutine should inherit the
+ * executor 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 stack_allocator Denotes the allocator to be used to allocate the
+ * underlying coroutine's stack. The type must satisfy the stack-allocator
+ * concept defined by the Boost.Context library.
+ *
+ * @param function The coroutine function. The function must be callable the
+ * signature:
+ * @code void function(basic_yield_context<Executor> yield); @endcode
+ *
+ * @param token The @ref completion_token that will handle the notification
+ * that the coroutine has completed. If the return type @c R of @c function is
+ * @c void, the function signature of the completion handler must be:
+ *
+ * @code void handler(std::exception_ptr); @endcode
+ * Otherwise, the function signature of the completion handler must be:
+ * @code void handler(std::exception_ptr, R); @endcode
+ *
+ * @par Completion Signature
+ * @code void(std::exception_ptr, R) @endcode
+ * where @c R is the return type of the function object.
+ *
+ * @par Per-Operation Cancellation
+ * The new thread of execution is created with a cancellation state that
+ * supports @c cancellation_type::terminal values only. To change the
+ * cancellation state, call the basic_yield_context member function
+ * @c reset_cancellation_state.
+ */
+template <typename Executor, typename StackAllocator, typename F,
+ ASIO_COMPLETION_TOKEN_FOR(typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type)
+ CompletionToken = default_completion_token_t<Executor>>
+auto spawn(const basic_yield_context<Executor>& ctx, allocator_arg_t,
+ StackAllocator&& stack_allocator, F&& function,
+ CompletionToken&& token = default_completion_token_t<Executor>(),
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0)
+ -> decltype(
+ async_initiate<CompletionToken,
+ typename detail::spawn_signature<
+ result_of_t<F(basic_yield_context<Executor>)>>::type>(
+ declval<detail::initiate_spawn<Executor>>(),
+ token, allocator_arg_t(),
+ static_cast<StackAllocator&&>(stack_allocator),
+ static_cast<F&&>(function)));
+
+#endif // defined(ASIO_HAS_BOOST_CONTEXT_FIBER)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#if defined(ASIO_HAS_BOOST_COROUTINE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+/// (Deprecated: Use overloads with a completion token.) 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<Executor> yield); @endcode
+ * where Executor is the associated executor type of @c Function.
+ *
+ * @param attributes Boost.Coroutine attributes used to customise the coroutine.
+ */
+template <typename Function>
+void spawn(Function&& function,
+ const boost::coroutines::attributes& attributes
+ = boost::coroutines::attributes());
+
+/// (Deprecated: Use overloads with a completion token.) 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<Executor> yield); @endcode
+ * where Executor is the associated executor type of @c Handler.
+ *
+ * @param attributes Boost.Coroutine attributes used to customise the coroutine.
+ */
+template <typename Handler, typename Function>
+void spawn(Handler&& handler, Function&& function,
+ const boost::coroutines::attributes& attributes
+ = boost::coroutines::attributes(),
+ constraint_t<
+ !is_executor<decay_t<Handler>>::value &&
+ !execution::is_executor<decay_t<Handler>>::value &&
+ !is_convertible<Handler&, execution_context&>::value
+ > = 0);
+
+/// (Deprecated: Use overloads with a completion token.) 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<Executor> yield); @endcode
+ *
+ * @param attributes Boost.Coroutine attributes used to customise the coroutine.
+ */
+template <typename Executor, typename Function>
+void spawn(basic_yield_context<Executor> ctx, Function&& function,
+ const boost::coroutines::attributes& attributes
+ = boost::coroutines::attributes());
+
+/// (Deprecated: Use overloads with a completion token.) 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 automatically given its own explicit 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 <typename Function, typename Executor>
+void spawn(const Executor& ex, Function&& function,
+ const boost::coroutines::attributes& attributes
+ = boost::coroutines::attributes(),
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0);
+
+/// (Deprecated: Use overloads with a completion token.) 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 <typename Function, typename Executor>
+void spawn(const strand<Executor>& ex, Function&& function,
+ const boost::coroutines::attributes& attributes
+ = boost::coroutines::attributes());
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
+/// (Deprecated: Use overloads with a completion token.) 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 <typename Function>
+void spawn(const asio::io_context::strand& s, Function&& function,
+ const boost::coroutines::attributes& attributes
+ = boost::coroutines::attributes());
+
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+/// (Deprecated: Use overloads with a completion token.) 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 <typename Function, typename ExecutionContext>
+void spawn(ExecutionContext& ctx, Function&& function,
+ const boost::coroutines::attributes& attributes
+ = boost::coroutines::attributes(),
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0);
+
+#endif // defined(ASIO_HAS_BOOST_COROUTINE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+/*@}*/
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/spawn.hpp"
+
+#endif // ASIO_SPAWN_HPP
diff --git a/3rdparty/asio/include/asio/ssl.hpp b/3rdparty/asio/include/asio/ssl.hpp
new file mode 100644
index 00000000000..4180dab6f42
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl.hpp
@@ -0,0 +1,28 @@
+//
+// ssl.hpp
+// ~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/host_name_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/3rdparty/asio/include/asio/ssl/context.hpp b/3rdparty/asio/include/asio/ssl/context.hpp
new file mode 100644
index 00000000000..a41904a4089
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/context.hpp
@@ -0,0 +1,762 @@
+//
+// ssl/context.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <string>
+#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);
+
+ /// Construct to take ownership of a native handle.
+ ASIO_DECL explicit context(native_handle_type native_handle);
+
+ /// 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);
+
+ /// 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 <typename VerifyCallback>
+ 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 <typename VerifyCallback>
+ 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 <typename PasswordCallback>
+ 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 <typename PasswordCallback>
+ 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);
+
+ // Translate an SSL error into an error code.
+ ASIO_DECL static asio::error_code translate_error(long error);
+
+ // 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/3rdparty/asio/include/asio/ssl/context_base.hpp b/3rdparty/asio/include/asio/ssl/context_base.hpp
new file mode 100644
index 00000000000..36271012b06
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/context_base.hpp
@@ -0,0 +1,209 @@
+//
+// ssl/context_base.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 version 1.3.
+ tlsv13,
+
+ /// TLS version 1.3 client.
+ tlsv13_client,
+
+ /// TLS version 1.3 server.
+ tlsv13_server,
+
+ /// Generic TLS.
+ tls,
+
+ /// TLS client.
+ tls_client,
+
+ /// TLS server.
+ tls_server
+ };
+
+ /// Bitmask type for SSL options.
+ typedef uint64_t options;
+
+#if defined(GENERATING_DOCUMENTATION)
+ /// Implement various bug workarounds.
+ static const uint64_t default_workarounds = implementation_defined;
+
+ /// Always create a new key when using tmp_dh parameters.
+ static const uint64_t single_dh_use = implementation_defined;
+
+ /// Disable SSL v2.
+ static const uint64_t no_sslv2 = implementation_defined;
+
+ /// Disable SSL v3.
+ static const uint64_t no_sslv3 = implementation_defined;
+
+ /// Disable TLS v1.
+ static const uint64_t no_tlsv1 = implementation_defined;
+
+ /// Disable TLS v1.1.
+ static const uint64_t no_tlsv1_1 = implementation_defined;
+
+ /// Disable TLS v1.2.
+ static const uint64_t no_tlsv1_2 = implementation_defined;
+
+ /// Disable TLS v1.3.
+ static const uint64_t no_tlsv1_3 = implementation_defined;
+
+ /// Disable compression. Compression is disabled by default.
+ static const uint64_t no_compression = implementation_defined;
+#else
+ ASIO_STATIC_CONSTANT(uint64_t, default_workarounds = SSL_OP_ALL);
+ ASIO_STATIC_CONSTANT(uint64_t, single_dh_use = SSL_OP_SINGLE_DH_USE);
+ ASIO_STATIC_CONSTANT(uint64_t, no_sslv2 = SSL_OP_NO_SSLv2);
+ ASIO_STATIC_CONSTANT(uint64_t, no_sslv3 = SSL_OP_NO_SSLv3);
+ ASIO_STATIC_CONSTANT(uint64_t, no_tlsv1 = SSL_OP_NO_TLSv1);
+# if defined(SSL_OP_NO_TLSv1_1)
+ ASIO_STATIC_CONSTANT(uint64_t, no_tlsv1_1 = SSL_OP_NO_TLSv1_1);
+# else // defined(SSL_OP_NO_TLSv1_1)
+ ASIO_STATIC_CONSTANT(uint64_t, no_tlsv1_1 = 0x10000000L);
+# endif // defined(SSL_OP_NO_TLSv1_1)
+# if defined(SSL_OP_NO_TLSv1_2)
+ ASIO_STATIC_CONSTANT(uint64_t, no_tlsv1_2 = SSL_OP_NO_TLSv1_2);
+# else // defined(SSL_OP_NO_TLSv1_2)
+ ASIO_STATIC_CONSTANT(uint64_t, no_tlsv1_2 = 0x08000000L);
+# endif // defined(SSL_OP_NO_TLSv1_2)
+# if defined(SSL_OP_NO_TLSv1_3)
+ ASIO_STATIC_CONSTANT(uint64_t, no_tlsv1_3 = SSL_OP_NO_TLSv1_3);
+# else // defined(SSL_OP_NO_TLSv1_3)
+ ASIO_STATIC_CONSTANT(uint64_t, no_tlsv1_3 = 0x20000000L);
+# endif // defined(SSL_OP_NO_TLSv1_3)
+# if defined(SSL_OP_NO_COMPRESSION)
+ ASIO_STATIC_CONSTANT(uint64_t, no_compression = SSL_OP_NO_COMPRESSION);
+# else // defined(SSL_OP_NO_COMPRESSION)
+ ASIO_STATIC_CONSTANT(uint64_t, 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/3rdparty/asio/include/asio/ssl/detail/buffered_handshake_op.hpp b/3rdparty/asio/include/asio/ssl/detail/buffered_handshake_op.hpp
new file mode 100644
index 00000000000..4dba7120929
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/buffered_handshake_op.hpp
@@ -0,0 +1,119 @@
+//
+// ssl/detail/buffered_handshake_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename ConstBufferSequence>
+class buffered_handshake_op
+{
+public:
+ static constexpr const char* tracking_name()
+ {
+ return "ssl::stream<>::async_buffered_handshake";
+ }
+
+ 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 <typename Handler>
+ void call_handler(Handler& handler,
+ const asio::error_code& ec,
+ const std::size_t& bytes_transferred) const
+ {
+ static_cast<Handler&&>(handler)(ec, bytes_transferred);
+ }
+
+private:
+ template <typename Iterator>
+ 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/3rdparty/asio/include/asio/ssl/detail/engine.hpp b/3rdparty/asio/include/asio/ssl/detail/engine.hpp
new file mode 100644
index 00000000000..e500ca529da
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/engine.hpp
@@ -0,0 +1,169 @@
+//
+// ssl/detail/engine.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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);
+
+ // Construct a new engine for an existing native SSL implementation.
+ ASIO_DECL explicit engine(SSL* ssl_impl);
+
+ // Move construct from another engine.
+ ASIO_DECL engine(engine&& other) noexcept;
+
+ // Destructor.
+ ASIO_DECL ~engine();
+
+ // Move assign from another engine.
+ ASIO_DECL engine& operator=(engine&& other) noexcept;
+
+ // 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/3rdparty/asio/include/asio/ssl/detail/handshake_op.hpp b/3rdparty/asio/include/asio/ssl/detail/handshake_op.hpp
new file mode 100644
index 00000000000..53533eb7a80
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/handshake_op.hpp
@@ -0,0 +1,67 @@
+//
+// ssl/detail/handshake_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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:
+ static constexpr const char* tracking_name()
+ {
+ return "ssl::stream<>::async_handshake";
+ }
+
+ 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 <typename Handler>
+ void call_handler(Handler& handler,
+ const asio::error_code& ec,
+ const std::size_t&) const
+ {
+ static_cast<Handler&&>(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/3rdparty/asio/include/asio/ssl/detail/impl/engine.ipp b/3rdparty/asio/include/asio/ssl/detail/impl/engine.ipp
new file mode 100644
index 00000000000..91588cd6b47
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/impl/engine.ipp
@@ -0,0 +1,377 @@
+//
+// ssl/detail/impl/engine.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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<int>(::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(SSL* ssl_impl)
+ : ssl_(ssl_impl)
+{
+#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(engine&& other) noexcept
+ : ssl_(other.ssl_),
+ ext_bio_(other.ext_bio_)
+{
+ other.ssl_ = 0;
+ other.ext_bio_ = 0;
+}
+
+engine::~engine()
+{
+ if (ssl_ && SSL_get_app_data(ssl_))
+ {
+ delete static_cast<verify_callback_base*>(SSL_get_app_data(ssl_));
+ SSL_set_app_data(ssl_, 0);
+ }
+
+ if (ext_bio_)
+ ::BIO_free(ext_bio_);
+
+ if (ssl_)
+ ::SSL_free(ssl_);
+}
+
+engine& engine::operator=(engine&& other) noexcept
+{
+ if (this != &other)
+ {
+ ssl_ = other.ssl_;
+ ext_bio_ = other.ext_bio_;
+ other.ssl_ = 0;
+ other.ext_bio_ = 0;
+ }
+ return *this;
+}
+
+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<verify_callback_base*>(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<SSL*>(
+ ::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<verify_callback_base*>(
+ 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<void*>(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<int>(data.size()));
+
+ return asio::buffer(data,
+ length > 0 ? static_cast<std::size_t>(length) : 0);
+}
+
+asio::const_buffer engine::put_input(
+ const asio::const_buffer& data)
+{
+ int length = ::BIO_write(ext_bio_,
+ data.data(), static_cast<int>(data.size()));
+
+ return asio::buffer(data +
+ (length > 0 ? static_cast<std::size_t>(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<int>(::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 pending_output_after > pending_output_before
+ ? want_output : want_nothing;
+ }
+
+ if (ssl_error == SSL_ERROR_SYSCALL)
+ {
+ if (sys_error == 0)
+ {
+ ec = asio::ssl::error::unspecified_system_error;
+ }
+ else
+ {
+ ec = asio::error_code(sys_error,
+ asio::error::get_ssl_category());
+ }
+ return pending_output_after > pending_output_before
+ ? want_output : want_nothing;
+ }
+
+ if (result > 0 && bytes_transferred)
+ *bytes_transferred = static_cast<std::size_t>(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_error == SSL_ERROR_ZERO_RETURN)
+ {
+ ec = asio::error::eof;
+ return want_nothing;
+ }
+ else if (ssl_error == SSL_ERROR_NONE)
+ {
+ ec = asio::error_code();
+ return want_nothing;
+ }
+ else
+ {
+ ec = asio::ssl::error::unexpected_result;
+ 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<int>(length) : INT_MAX);
+}
+
+int engine::do_write(void* data, std::size_t length)
+{
+ return ::SSL_write(ssl_, data,
+ length < INT_MAX ? static_cast<int>(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/3rdparty/asio/include/asio/ssl/detail/impl/openssl_init.ipp b/3rdparty/asio/include/asio/ssl/detail/impl/openssl_init.ipp
new file mode 100644
index 00000000000..7a10cc2aa8a
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/impl/openssl_init.ipp
@@ -0,0 +1,169 @@
+//
+// ssl/detail/impl/openssl_init.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com
+// Copyright (c) 2005-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <vector>
+#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) \
+ && !defined(ASIO_USE_WOLFSSL) \
+ && (OPENSSL_VERSION_NUMBER < 0x30000000L)
+ ::CONF_modules_unload(1);
+#endif // !defined(OPENSSL_IS_BORINGSSL)
+ // && !defined(ASIO_USE_WOLFSSL)
+ // && (OPENSSL_VERSION_NUMBER < 0x30000000L)
+#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<unsigned long>(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<asio::detail::shared_ptr<
+ asio::detail::mutex>> 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::do_init>
+openssl_init_base::instance()
+{
+ static asio::detail::shared_ptr<do_init> 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/3rdparty/asio/include/asio/ssl/detail/io.hpp b/3rdparty/asio/include/asio/ssl/detail/io.hpp
new file mode 100644
index 00000000000..d951db593af
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/io.hpp
@@ -0,0 +1,376 @@
+//
+// ssl/detail/io.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/detail/base_from_cancellation_state.hpp"
+#include "asio/detail/handler_tracking.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 <typename Stream, typename Operation>
+std::size_t io(Stream& next_layer, stream_core& core,
+ const Operation& op, asio::error_code& ec)
+{
+ asio::error_code io_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_, io_ec));
+ if (!ec)
+ ec = io_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_), io_ec);
+ if (!ec)
+ ec = io_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_), io_ec);
+ if (!ec)
+ ec = io_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 <typename Stream, typename Operation, typename Handler>
+class io_op
+ : public asio::detail::base_from_cancellation_state<Handler>
+{
+public:
+ io_op(Stream& next_layer, stream_core& core,
+ const Operation& op, Handler& handler)
+ : asio::detail::base_from_cancellation_state<Handler>(handler),
+ next_layer_(next_layer),
+ core_(core),
+ op_(op),
+ start_(0),
+ want_(engine::want_nothing),
+ bytes_transferred_(0),
+ handler_(static_cast<Handler&&>(handler))
+ {
+ }
+
+ io_op(const io_op& other)
+ : asio::detail::base_from_cancellation_state<Handler>(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)
+ : asio::detail::base_from_cancellation_state<Handler>(
+ static_cast<
+ asio::detail::base_from_cancellation_state<Handler>&&>(other)),
+ next_layer_(other.next_layer_),
+ core_(other.core_),
+ op_(static_cast<Operation&&>(other.op_)),
+ start_(other.start_),
+ want_(other.want_),
+ ec_(other.ec_),
+ bytes_transferred_(other.bytes_transferred_),
+ handler_(static_cast<Handler&&>(other.handler_))
+ {
+ }
+
+ 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());
+
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, Operation::tracking_name()));
+
+ // Start reading some data from the underlying transport.
+ next_layer_.async_read_some(
+ asio::buffer(core_.input_buffer_),
+ static_cast<io_op&&>(*this));
+ }
+ else
+ {
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, Operation::tracking_name()));
+
+ // Wait until the current read operation completes.
+ core_.pending_read_.async_wait(static_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());
+
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, Operation::tracking_name()));
+
+ // Start writing all the data to the underlying transport.
+ asio::async_write(next_layer_,
+ core_.engine_.get_output(core_.output_buffer_),
+ static_cast<io_op&&>(*this));
+ }
+ else
+ {
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, Operation::tracking_name()));
+
+ // Wait until the current write operation completes.
+ core_.pending_write_.async_wait(static_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)
+ {
+ ASIO_HANDLER_LOCATION((
+ __FILE__, __LINE__, Operation::tracking_name()));
+
+ next_layer_.async_read_some(
+ asio::buffer(core_.input_buffer_, 0),
+ static_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());
+
+ // Check for cancellation before continuing.
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec_ = asio::error::operation_aborted;
+ break;
+ }
+
+ // Try the operation again.
+ continue;
+
+ case engine::want_output_and_retry:
+
+ // Release any waiting write operations.
+ core_.pending_write_.expires_at(core_.neg_infin());
+
+ // Check for cancellation before continuing.
+ if (this->cancelled() != cancellation_type::none)
+ {
+ ec_ = asio::error::operation_aborted;
+ break;
+ }
+
+ // 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 <typename Stream, typename Operation, typename Handler>
+inline bool asio_handler_is_continuation(
+ io_op<Stream, Operation, Handler>* this_handler)
+{
+ return this_handler->start_ == 0 ? true
+ : asio_handler_cont_helpers::is_continuation(this_handler->handler_);
+}
+
+template <typename Stream, typename Operation, typename Handler>
+inline void async_io(Stream& next_layer, stream_core& core,
+ const Operation& op, Handler& handler)
+{
+ io_op<Stream, Operation, Handler>(
+ next_layer, core, op, handler)(
+ asio::error_code(), 0, 1);
+}
+
+} // namespace detail
+} // namespace ssl
+
+template <template <typename, typename> class Associator,
+ typename Stream, typename Operation,
+ typename Handler, typename DefaultCandidate>
+struct associator<Associator,
+ ssl::detail::io_op<Stream, Operation, Handler>,
+ DefaultCandidate>
+ : Associator<Handler, DefaultCandidate>
+{
+ static typename Associator<Handler, DefaultCandidate>::type get(
+ const ssl::detail::io_op<Stream, Operation, Handler>& h) noexcept
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_);
+ }
+
+ static auto get(const ssl::detail::io_op<Stream, Operation, Handler>& h,
+ const DefaultCandidate& c) noexcept
+ -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
+ {
+ return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
+ }
+};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_SSL_DETAIL_IO_HPP
diff --git a/3rdparty/asio/include/asio/ssl/detail/openssl_init.hpp b/3rdparty/asio/include/asio/ssl/detail/openssl_init.hpp
new file mode 100644
index 00000000000..c66d9d62692
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/openssl_init.hpp
@@ -0,0 +1,101 @@
+//
+// ssl/detail/openssl_init.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstring>
+#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<do_init> 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 <bool Do_Init = true>
+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<do_init> ref_;
+};
+
+template <bool Do_Init>
+openssl_init<Do_Init> openssl_init<Do_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/3rdparty/asio/include/asio/ssl/detail/openssl_types.hpp b/3rdparty/asio/include/asio/ssl/detail/openssl_types.hpp
new file mode 100644
index 00000000000..25f080f1e8e
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/openssl_types.hpp
@@ -0,0 +1,34 @@
+//
+// ssl/detail/openssl_types.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#if defined(ASIO_USE_WOLFSSL)
+# include <wolfssl/options.h>
+#endif // defined(ASIO_USE_WOLFSSL)
+#include <openssl/conf.h>
+#include <openssl/ssl.h>
+#if !defined(OPENSSL_NO_ENGINE)
+# include <openssl/engine.h>
+#endif // !defined(OPENSSL_NO_ENGINE)
+#include <openssl/dh.h>
+#include <openssl/err.h>
+#include <openssl/rsa.h>
+#include <openssl/x509.h>
+#include <openssl/x509v3.h>
+
+#endif // ASIO_SSL_DETAIL_OPENSSL_TYPES_HPP
diff --git a/3rdparty/asio/include/asio/ssl/detail/password_callback.hpp b/3rdparty/asio/include/asio/ssl/detail/password_callback.hpp
new file mode 100644
index 00000000000..03ac7db0f06
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/password_callback.hpp
@@ -0,0 +1,66 @@
+//
+// ssl/detail/password_callback.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include <string>
+#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 <typename PasswordCallback>
+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/3rdparty/asio/include/asio/ssl/detail/read_op.hpp b/3rdparty/asio/include/asio/ssl/detail/read_op.hpp
new file mode 100644
index 00000000000..5cb4249556f
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/read_op.hpp
@@ -0,0 +1,72 @@
+//
+// ssl/detail/read_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename MutableBufferSequence>
+class read_op
+{
+public:
+ static constexpr const char* tracking_name()
+ {
+ return "ssl::stream<>::async_read_some";
+ }
+
+ 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<asio::mutable_buffer,
+ MutableBufferSequence>::first(buffers_);
+
+ return eng.read(buffer, ec, bytes_transferred);
+ }
+
+ template <typename Handler>
+ void call_handler(Handler& handler,
+ const asio::error_code& ec,
+ const std::size_t& bytes_transferred) const
+ {
+ static_cast<Handler&&>(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/3rdparty/asio/include/asio/ssl/detail/shutdown_op.hpp b/3rdparty/asio/include/asio/ssl/detail/shutdown_op.hpp
new file mode 100644
index 00000000000..1f6b91e17c1
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/shutdown_op.hpp
@@ -0,0 +1,69 @@
+//
+// ssl/detail/shutdown_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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:
+ static constexpr const char* tracking_name()
+ {
+ return "ssl::stream<>::async_shutdown";
+ }
+
+ engine::want operator()(engine& eng,
+ asio::error_code& ec,
+ std::size_t& bytes_transferred) const
+ {
+ bytes_transferred = 0;
+ return eng.shutdown(ec);
+ }
+
+ template <typename Handler>
+ void call_handler(Handler& handler,
+ const asio::error_code& ec,
+ const std::size_t&) const
+ {
+ if (ec == asio::error::eof)
+ {
+ // The engine only generates an eof when the shutdown notification has
+ // been received from the peer. This indicates that the shutdown has
+ // completed successfully, and thus need not be passed on to the handler.
+ static_cast<Handler&&>(handler)(asio::error_code());
+ }
+ else
+ {
+ static_cast<Handler&&>(handler)(ec);
+ }
+ }
+};
+
+} // namespace detail
+} // namespace ssl
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_SSL_DETAIL_SHUTDOWN_OP_HPP
diff --git a/3rdparty/asio/include/asio/ssl/detail/stream_core.hpp b/3rdparty/asio/include/asio/ssl/detail/stream_core.hpp
new file mode 100644
index 00000000000..0ec763d4a2b
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/stream_core.hpp
@@ -0,0 +1,217 @@
+//
+// ssl/detail/stream_core.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 };
+
+ template <typename Executor>
+ stream_core(SSL_CTX* context, const Executor& ex)
+ : engine_(context),
+ pending_read_(ex),
+ pending_write_(ex),
+ 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());
+ }
+
+ template <typename Executor>
+ stream_core(SSL* ssl_impl, const Executor& ex)
+ : engine_(ssl_impl),
+ pending_read_(ex),
+ pending_write_(ex),
+ 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(stream_core&& other)
+ : engine_(static_cast<engine&&>(other.engine_)),
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+ pending_read_(
+ static_cast<asio::deadline_timer&&>(
+ other.pending_read_)),
+ pending_write_(
+ static_cast<asio::deadline_timer&&>(
+ other.pending_write_)),
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
+ pending_read_(
+ static_cast<asio::steady_timer&&>(
+ other.pending_read_)),
+ pending_write_(
+ static_cast<asio::steady_timer&&>(
+ other.pending_write_)),
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+ output_buffer_space_(
+ static_cast<std::vector<unsigned char>&&>(
+ other.output_buffer_space_)),
+ output_buffer_(other.output_buffer_),
+ input_buffer_space_(
+ static_cast<std::vector<unsigned char>&&>(
+ other.input_buffer_space_)),
+ input_buffer_(other.input_buffer_),
+ input_(other.input_)
+ {
+ other.output_buffer_ = asio::mutable_buffer(0, 0);
+ other.input_buffer_ = asio::mutable_buffer(0, 0);
+ other.input_ = asio::const_buffer(0, 0);
+ }
+
+ ~stream_core()
+ {
+ }
+
+ stream_core& operator=(stream_core&& other)
+ {
+ if (this != &other)
+ {
+ engine_ = static_cast<engine&&>(other.engine_);
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+ pending_read_ =
+ static_cast<asio::deadline_timer&&>(
+ other.pending_read_);
+ pending_write_ =
+ static_cast<asio::deadline_timer&&>(
+ other.pending_write_);
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
+ pending_read_ =
+ static_cast<asio::steady_timer&&>(
+ other.pending_read_);
+ pending_write_ =
+ static_cast<asio::steady_timer&&>(
+ other.pending_write_);
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+ output_buffer_space_ =
+ static_cast<std::vector<unsigned char>&&>(
+ other.output_buffer_space_);
+ output_buffer_ = other.output_buffer_;
+ input_buffer_space_ =
+ static_cast<std::vector<unsigned char>&&>(
+ other.input_buffer_space_);
+ input_buffer_ = other.input_buffer_;
+ input_ = other.input_;
+ other.output_buffer_ = asio::mutable_buffer(0, 0);
+ other.input_buffer_ = asio::mutable_buffer(0, 0);
+ other.input_ = asio::const_buffer(0, 0);
+ }
+ return *this;
+ }
+
+ // 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<unsigned char> output_buffer_space_;
+
+ // A buffer that may be used to prepare output intended for the transport.
+ asio::mutable_buffer output_buffer_;
+
+ // Buffer space used to read input intended for the engine.
+ std::vector<unsigned char> input_buffer_space_;
+
+ // A buffer that may be used to read input intended for the engine.
+ 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/3rdparty/asio/include/asio/ssl/detail/verify_callback.hpp b/3rdparty/asio/include/asio/ssl/detail/verify_callback.hpp
new file mode 100644
index 00000000000..54169c9e6b8
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/verify_callback.hpp
@@ -0,0 +1,62 @@
+//
+// ssl/detail/verify_callback.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename VerifyCallback>
+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/3rdparty/asio/include/asio/ssl/detail/write_op.hpp b/3rdparty/asio/include/asio/ssl/detail/write_op.hpp
new file mode 100644
index 00000000000..edcbcad5850
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/detail/write_op.hpp
@@ -0,0 +1,76 @@
+//
+// ssl/detail/write_op.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename ConstBufferSequence>
+class write_op
+{
+public:
+ static constexpr const char* tracking_name()
+ {
+ return "ssl::stream<>::async_write_some";
+ }
+
+ write_op(const ConstBufferSequence& buffers)
+ : buffers_(buffers)
+ {
+ }
+
+ engine::want operator()(engine& eng,
+ asio::error_code& ec,
+ std::size_t& bytes_transferred) const
+ {
+ unsigned char storage[
+ asio::detail::buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence>::linearisation_storage_size];
+
+ asio::const_buffer buffer =
+ asio::detail::buffer_sequence_adapter<asio::const_buffer,
+ ConstBufferSequence>::linearise(buffers_, asio::buffer(storage));
+
+ return eng.write(buffer, ec, bytes_transferred);
+ }
+
+ template <typename Handler>
+ void call_handler(Handler& handler,
+ const asio::error_code& ec,
+ const std::size_t& bytes_transferred) const
+ {
+ static_cast<Handler&&>(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/3rdparty/asio/include/asio/ssl/error.hpp b/3rdparty/asio/include/asio/ssl/error.hpp
new file mode 100644
index 00000000000..e126f52c1c7
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/error.hpp
@@ -0,0 +1,123 @@
+//
+// ssl/error.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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,
+
+ /// The underlying SSL library returned a system error without providing
+ /// further information.
+ unspecified_system_error,
+
+ /// The underlying SSL library generated an unexpected result from a function
+ /// call.
+ unexpected_result
+#else // defined(GENERATING_DOCUMENTATION)
+# if (OPENSSL_VERSION_NUMBER < 0x10100000L) \
+ && !defined(OPENSSL_IS_BORINGSSL) \
+ && !defined(ASIO_USE_WOLFSSL)
+ stream_truncated = ERR_PACK(ERR_LIB_SSL, 0, SSL_R_SHORT_READ),
+# else
+ stream_truncated = 1,
+# endif
+ unspecified_system_error = 2,
+ unexpected_result = 3
+#endif // defined(GENERATING_DOCUMENTATION)
+};
+
+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
+
+namespace std {
+
+template<> struct is_error_code_enum<asio::error::ssl_errors>
+{
+ static const bool value = true;
+};
+
+template<> struct is_error_code_enum<asio::ssl::error::stream_errors>
+{
+ static const bool value = true;
+};
+
+} // namespace std
+
+namespace asio {
+namespace error {
+
+inline asio::error_code make_error_code(ssl_errors e)
+{
+ return asio::error_code(
+ static_cast<int>(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<int>(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/3rdparty/asio/include/asio/ssl/host_name_verification.hpp b/3rdparty/asio/include/asio/ssl/host_name_verification.hpp
new file mode 100644
index 00000000000..adb6ac8c0f7
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/host_name_verification.hpp
@@ -0,0 +1,90 @@
+//
+// ssl/host_name_verification.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_HOST_NAME_VERIFICATION_HPP
+#define ASIO_SSL_HOST_NAME_VERIFICATION_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+
+#include <string>
+#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 host_name according to the rules described
+/// in RFC 6125.
+/**
+ * @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<tcp::socket> 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::host_name_verification("host.name"));
+ * sock.handshake(ssl_socket::client);
+ *
+ * // ... read and write as normal ...
+ * @endcode
+ */
+class host_name_verification
+{
+public:
+ /// The type of the function object's result.
+ typedef bool result_type;
+
+ /// Constructor.
+ explicit host_name_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 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/host_name_verification.ipp"
+#endif // defined(ASIO_HEADER_ONLY)
+
+#endif // ASIO_SSL_HOST_NAME_VERIFICATION_HPP
diff --git a/3rdparty/asio/include/asio/ssl/impl/context.hpp b/3rdparty/asio/include/asio/ssl/impl/context.hpp
new file mode 100644
index 00000000000..2324a9880aa
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/impl/context.hpp
@@ -0,0 +1,67 @@
+//
+// ssl/impl/context.hpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com
+// Copyright (c) 2005-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename VerifyCallback>
+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 <typename VerifyCallback>
+ASIO_SYNC_OP_VOID context::set_verify_callback(
+ VerifyCallback callback, asio::error_code& ec)
+{
+ do_set_verify_callback(
+ new detail::verify_callback<VerifyCallback>(callback), ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+}
+
+template <typename PasswordCallback>
+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 <typename PasswordCallback>
+ASIO_SYNC_OP_VOID context::set_password_callback(
+ PasswordCallback callback, asio::error_code& ec)
+{
+ do_set_password_callback(
+ new detail::password_callback<PasswordCallback>(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/3rdparty/asio/include/asio/ssl/impl/context.ipp b/3rdparty/asio/include/asio/ssl/impl/context.ipp
new file mode 100644
index 00000000000..8711048b9a7
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/impl/context.ipp
@@ -0,0 +1,1319 @@
+//
+// ssl/impl/context.ipp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com
+// Copyright (c) 2005-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstring>
+#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); }
+};
+
+#if (OPENSSL_VERSION_NUMBER < 0x30000000L)
+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); }
+};
+#endif // (OPENSSL_VERSION_NUMBER < 0x30000000L)
+
+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;
+#elif defined(SSL_TXT_TLSV1)
+ 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;
+#else // defined(SSL_TXT_TLSV1)
+ case context::tlsv1:
+ case context::tlsv1_client:
+ case context::tlsv1_server:
+ asio::detail::throw_error(
+ asio::error::invalid_argument, "context");
+ break;
+#endif // defined(SSL_TXT_TLSV1)
+
+ // 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_2)
+ 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_2)
+ 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_2)
+
+ // TLS v1.3.
+#if (OPENSSL_VERSION_NUMBER >= 0x10101000L) \
+ && !defined(LIBRESSL_VERSION_NUMBER)
+ case context::tlsv13:
+ handle_ = ::SSL_CTX_new(::TLS_method());
+ if (handle_)
+ {
+ SSL_CTX_set_min_proto_version(handle_, TLS1_3_VERSION);
+ SSL_CTX_set_max_proto_version(handle_, TLS1_3_VERSION);
+ }
+ break;
+ case context::tlsv13_client:
+ handle_ = ::SSL_CTX_new(::TLS_client_method());
+ if (handle_)
+ {
+ SSL_CTX_set_min_proto_version(handle_, TLS1_3_VERSION);
+ SSL_CTX_set_max_proto_version(handle_, TLS1_3_VERSION);
+ }
+ break;
+ case context::tlsv13_server:
+ handle_ = ::SSL_CTX_new(::TLS_server_method());
+ if (handle_)
+ {
+ SSL_CTX_set_min_proto_version(handle_, TLS1_3_VERSION);
+ SSL_CTX_set_max_proto_version(handle_, TLS1_3_VERSION);
+ }
+ break;
+#else // (OPENSSL_VERSION_NUMBER >= 0x10101000L)
+ // && !defined(LIBRESSL_VERSION_NUMBER)
+ case context::tlsv13:
+ case context::tlsv13_client:
+ case context::tlsv13_server:
+ asio::detail::throw_error(
+ asio::error::invalid_argument, "context");
+ break;
+#endif // (OPENSSL_VERSION_NUMBER >= 0x10101000L)
+ // && !defined(LIBRESSL_VERSION_NUMBER)
+
+ // 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 = translate_error(::ERR_get_error());
+ asio::detail::throw_error(ec, "context");
+ }
+
+ set_options(no_compression);
+}
+
+context::context(context::native_handle_type native_handle)
+ : handle_(native_handle)
+{
+ if (!handle_)
+ {
+ asio::detail::throw_error(
+ asio::error::invalid_argument, "context");
+ }
+}
+
+context::context(context&& other)
+{
+ handle_ = other.handle_;
+ other.handle_ = 0;
+}
+
+context& context::operator=(context&& other)
+{
+ context tmp(static_cast<context&&>(*this));
+ handle_ = other.handle_;
+ other.handle_ = 0;
+ return *this;
+}
+
+context::~context()
+{
+ if (handle_)
+ {
+#if ((OPENSSL_VERSION_NUMBER >= 0x10100000L) \
+ && (!defined(LIBRESSL_VERSION_NUMBER) \
+ || LIBRESSL_VERSION_NUMBER >= 0x2070000fL)) \
+ || defined(ASIO_USE_WOLFSSL)
+ 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<detail::password_callback_base*>(
+ cb_userdata);
+ delete callback;
+#if ((OPENSSL_VERSION_NUMBER >= 0x10100000L) \
+ && (!defined(LIBRESSL_VERSION_NUMBER) \
+ || LIBRESSL_VERSION_NUMBER >= 0x2070000fL)) \
+ || defined(ASIO_USE_WOLFSSL)
+ ::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<detail::verify_callback_base*>(
+ 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 = translate_error(::ERR_get_error());
+ 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 (bool added = false;; added = true)
+ {
+ x509_cleanup cert = { ::PEM_read_bio_X509(bio.p, 0, 0, 0) };
+ if (!cert.p)
+ {
+ unsigned long err = ::ERR_get_error();
+ if (added && ERR_GET_LIB(err) == ERR_LIB_PEM
+ && ERR_GET_REASON(err) == PEM_R_NO_START_LINE)
+ break;
+
+ ec = translate_error(err);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ if (::X509_STORE_add_cert(store, cert.p) != 1)
+ {
+ ec = translate_error(::ERR_get_error());
+ 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 = translate_error(::ERR_get_error());
+ 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 = translate_error(::ERR_get_error());
+ 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<int>(certificate.size()),
+ static_cast<const unsigned char*>(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 = translate_error(::ERR_get_error());
+ 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 = translate_error(::ERR_get_error());
+ 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) \
+ || LIBRESSL_VERSION_NUMBER >= 0x2070000fL)) \
+ || defined(ASIO_USE_WOLFSSL)
+ 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 = translate_error(ERR_R_PEM_LIB);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ int result = ::SSL_CTX_use_certificate(handle_, cert.p);
+ if (result == 0 || ::ERR_peek_error() != 0)
+ {
+ ec = translate_error(::ERR_get_error());
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+#if ((OPENSSL_VERSION_NUMBER >= 0x10002000L) \
+ && (!defined(LIBRESSL_VERSION_NUMBER) \
+ || LIBRESSL_VERSION_NUMBER >= 0x2090100fL)) \
+ || defined(ASIO_USE_WOLFSSL)
+ ::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 = translate_error(::ERR_get_error());
+ 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 = translate_error(::ERR_get_error());
+ 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 = translate_error(::ERR_get_error());
+ 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) \
+ || LIBRESSL_VERSION_NUMBER >= 0x2070000fL)) \
+ || defined(ASIO_USE_WOLFSSL)
+ 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 = translate_error(::ERR_get_error());
+ 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) \
+ || LIBRESSL_VERSION_NUMBER >= 0x2070000fL)) \
+ || defined(ASIO_USE_WOLFSSL)
+ 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)
+ {
+#if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+ 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 (::EVP_PKEY_is_a(evp_private_key.p, "RSA") == 0)
+ {
+ ec = translate_error(
+ ERR_PACK(ERR_LIB_EVP, 0, EVP_R_EXPECTING_AN_RSA_KEY));
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ if (::SSL_CTX_use_PrivateKey(handle_, evp_private_key.p) == 1)
+ {
+ ec = asio::error_code();
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+ }
+#else // (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+ 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);
+ }
+ }
+#endif // (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+ }
+
+ ec = translate_error(::ERR_get_error());
+ 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 = translate_error(::ERR_get_error());
+ 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)
+{
+#if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+ ::ERR_clear_error();
+
+ pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_);
+ void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_);
+
+ bio_cleanup bio = { ::BIO_new_file(filename.c_str(), "r") };
+ 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 (::EVP_PKEY_is_a(evp_private_key.p, "RSA") == 0)
+ {
+ ec = translate_error(
+ ERR_PACK(ERR_LIB_EVP, 0, EVP_R_EXPECTING_AN_RSA_KEY));
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ if (::SSL_CTX_use_PrivateKey(handle_, evp_private_key.p) == 1)
+ {
+ ec = asio::error_code();
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+ }
+ }
+
+ ec = translate_error(::ERR_get_error());
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+#else // (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+ 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 = translate_error(::ERR_get_error());
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ ec = asio::error_code();
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+#endif // (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+}
+
+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 = translate_error(::ERR_get_error());
+ 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 = translate_error(::ERR_get_error());
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+}
+
+ASIO_SYNC_OP_VOID context::do_use_tmp_dh(
+ BIO* bio, asio::error_code& ec)
+{
+ ::ERR_clear_error();
+
+#if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+ EVP_PKEY* p = ::PEM_read_bio_Parameters(bio, 0);
+ if (p)
+ {
+ if (::SSL_CTX_set0_tmp_dh_pkey(handle_, p) == 1)
+ {
+ ec = asio::error_code();
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+ else
+ ::EVP_PKEY_free(p);
+ }
+#else // (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+ 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);
+ }
+ }
+#endif // (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+
+ ec = translate_error(::ERR_get_error());
+ 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<detail::verify_callback_base*>(
+ 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<SSL*>(
+ ::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<detail::verify_callback_base*>(
+ 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) \
+ || LIBRESSL_VERSION_NUMBER >= 0x2070000fL)) \
+ || defined(ASIO_USE_WOLFSSL)
+ 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<detail::password_callback_base*>(
+ 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<detail::password_callback_base*>(data);
+
+ std::string passwd = callback->call(static_cast<std::size_t>(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<int>(strlen(buf));
+ }
+
+ return 0;
+}
+
+BIO* context::make_buffer_bio(const const_buffer& b)
+{
+ return ::BIO_new_mem_buf(
+ const_cast<void*>(b.data()),
+ static_cast<int>(b.size()));
+}
+
+asio::error_code context::translate_error(long error)
+{
+#if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+ if (ERR_SYSTEM_ERROR(error))
+ {
+ return asio::error_code(
+ static_cast<int>(ERR_GET_REASON(error)),
+ asio::error::get_system_category());
+ }
+#endif // (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+
+ return asio::error_code(static_cast<int>(error),
+ asio::error::get_ssl_category());
+}
+
+} // namespace ssl
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_SSL_IMPL_CONTEXT_IPP
diff --git a/3rdparty/asio/include/asio/ssl/impl/error.ipp b/3rdparty/asio/include/asio/ssl/impl/error.ipp
new file mode 100644
index 00000000000..7ff6e8a7359
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/impl/error.ipp
@@ -0,0 +1,124 @@
+//
+// ssl/impl/error.ipp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 noexcept
+ {
+ return "asio.ssl";
+ }
+
+ std::string message(int value) const
+ {
+ const char* reason = ::ERR_reason_error_string(value);
+ if (reason)
+ {
+ const char* lib = ::ERR_lib_error_string(value);
+#if (OPENSSL_VERSION_NUMBER < 0x30000000L)
+ const char* func = ::ERR_func_error_string(value);
+#else // (OPENSSL_VERSION_NUMBER < 0x30000000L)
+ const char* func = 0;
+#endif // (OPENSSL_VERSION_NUMBER < 0x30000000L)
+ std::string result(reason);
+ if (lib || func)
+ {
+ result += " (";
+ if (lib)
+ result += lib;
+ if (lib && func)
+ result += ", ";
+ if (func)
+ result += func;
+ result += ")";
+ }
+ return result;
+ }
+ return "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 noexcept
+ {
+ return "asio.ssl.stream";
+ }
+
+ std::string message(int value) const
+ {
+ switch (value)
+ {
+ case stream_truncated: return "stream truncated";
+ case unspecified_system_error: return "unspecified system error";
+ case unexpected_result: return "unexpected result";
+ 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/3rdparty/asio/include/asio/ssl/impl/host_name_verification.ipp b/3rdparty/asio/include/asio/ssl/impl/host_name_verification.ipp
new file mode 100644
index 00000000000..198d1f3989c
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/impl/host_name_verification.ipp
@@ -0,0 +1,73 @@
+//
+// ssl/impl/host_name_verification.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_HOST_NAME_VERIFICATION_IPP
+#define ASIO_SSL_IMPL_HOST_NAME_VERIFICATION_IPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+
+#include <cctype>
+#include <cstring>
+#include "asio/ip/address.hpp"
+#include "asio/ssl/host_name_verification.hpp"
+#include "asio/ssl/detail/openssl_types.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace ssl {
+
+bool host_name_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);
+ const bool is_address = !ec;
+ (void)address;
+
+ X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
+
+ if (is_address)
+ {
+ return X509_check_ip_asc(cert, host_.c_str(), 0) == 1;
+ }
+ else
+ {
+ char* peername = 0;
+ const int result = X509_check_host(cert,
+ host_.c_str(), host_.size(), 0, &peername);
+ OPENSSL_free(peername);
+ return result == 1;
+ }
+}
+
+} // namespace ssl
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_SSL_IMPL_HOST_NAME_VERIFICATION_IPP
diff --git a/3rdparty/asio/include/asio/ssl/impl/rfc2818_verification.ipp b/3rdparty/asio/include/asio/ssl/impl/rfc2818_verification.ipp
new file mode 100644
index 00000000000..93e161daa85
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/impl/rfc2818_verification.ipp
@@ -0,0 +1,164 @@
+//
+// ssl/impl/rfc2818_verification.ipp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#if !defined(ASIO_NO_DEPRECATED)
+
+#include <cctype>
+#include <cstring>
+#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<GENERAL_NAMES*>(
+ 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<const char*>(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<const char*>(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 // !defined(ASIO_NO_DEPRECATED)
+
+#endif // ASIO_SSL_IMPL_RFC2818_VERIFICATION_IPP
diff --git a/3rdparty/asio/include/asio/ssl/impl/src.hpp b/3rdparty/asio/include/asio/ssl/impl/src.hpp
new file mode 100644
index 00000000000..5ffb95fdcd6
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/impl/src.hpp
@@ -0,0 +1,29 @@
+//
+// impl/ssl/src.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/host_name_verification.ipp"
+#include "asio/ssl/impl/rfc2818_verification.ipp"
+
+#endif // ASIO_SSL_IMPL_SRC_HPP
diff --git a/3rdparty/asio/include/asio/ssl/rfc2818_verification.hpp b/3rdparty/asio/include/asio/ssl/rfc2818_verification.hpp
new file mode 100644
index 00000000000..db2831045d9
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/rfc2818_verification.hpp
@@ -0,0 +1,98 @@
+//
+// ssl/rfc2818_verification.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#if !defined(ASIO_NO_DEPRECATED)
+
+#include <string>
+#include "asio/ssl/detail/openssl_types.hpp"
+#include "asio/ssl/verify_context.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace ssl {
+
+/// (Deprecated. Use ssl::host_name_verification.) 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<tcp::socket> 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 // !defined(ASIO_NO_DEPRECATED)
+
+#endif // ASIO_SSL_RFC2818_VERIFICATION_HPP
diff --git a/3rdparty/asio/include/asio/ssl/stream.hpp b/3rdparty/asio/include/asio/ssl/stream.hpp
new file mode 100644
index 00000000000..befcc287e7f
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/stream.hpp
@@ -0,0 +1,1042 @@
+//
+// ssl/stream.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/buffer.hpp"
+#include "asio/detail/buffer_sequence_adapter.hpp"
+#include "asio/detail/handler_type_requirements.hpp"
+#include "asio/detail/non_const_lvalue.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 my_context;
+ * asio::ssl::context ctx(asio::ssl::context::sslv23);
+ * asio::ssl::stream<asio::ip::tcp::socket> sock(my_context, ctx);
+ * @endcode
+ *
+ * @par Concepts:
+ * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream.
+ */
+template <typename Stream>
+class stream :
+ public stream_base,
+ private noncopyable
+{
+private:
+ class initiate_async_handshake;
+ class initiate_async_buffered_handshake;
+ class initiate_async_shutdown;
+ class initiate_async_write_some;
+ class initiate_async_read_some;
+
+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 remove_reference_t<Stream> 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 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 <typename Arg>
+ stream(Arg&& arg, context& ctx)
+ : next_layer_(static_cast<Arg&&>(arg)),
+ core_(ctx.native_handle(), next_layer_.lowest_layer().get_executor())
+ {
+ }
+
+ /// Construct a stream from an existing native implementation.
+ /**
+ * This constructor creates a stream and initialises the underlying stream
+ * object. On success, ownership of the native implementation is transferred
+ * to the stream, and it will be cleaned up when the stream is destroyed.
+ *
+ * @param arg The argument to be passed to initialise the underlying stream.
+ *
+ * @param handle An existing native SSL implementation.
+ */
+ template <typename Arg>
+ stream(Arg&& arg, native_handle_type handle)
+ : next_layer_(static_cast<Arg&&>(arg)),
+ core_(handle, next_layer_.lowest_layer().get_executor())
+ {
+ }
+
+ /// Move-construct a stream from another.
+ /**
+ * @param other The other stream object from which the move will occur. Must
+ * have no outstanding asynchronous operations associated with it. Following
+ * the move, @c other has a valid but unspecified state where the only safe
+ * operation is destruction, or use as the target of a move assignment.
+ */
+ stream(stream&& other)
+ : next_layer_(static_cast<Stream&&>(other.next_layer_)),
+ core_(static_cast<detail::stream_core&&>(other.core_))
+ {
+ }
+
+ /// Move-assign a stream from another.
+ /**
+ * @param other The other stream object from which the move will occur. Must
+ * have no outstanding asynchronous operations associated with it. Following
+ * the move, @c other has a valid but unspecified state where the only safe
+ * operation is destruction, or use as the target of a move assignment.
+ */
+ stream& operator=(stream&& other)
+ {
+ if (this != &other)
+ {
+ next_layer_ = static_cast<Stream&&>(other.next_layer_);
+ core_ = static_cast<detail::stream_core&&>(other.core_);
+ }
+ return *this;
+ }
+
+ /// 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() noexcept
+ {
+ return next_layer_.lowest_layer().get_executor();
+ }
+
+ /// 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<asio::ip::tcp::socket> sock(io_ctx, 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 <typename VerifyCallback>
+ 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 <typename VerifyCallback>
+ ASIO_SYNC_OP_VOID set_verify_callback(VerifyCallback callback,
+ asio::error_code& ec)
+ {
+ core_.engine_.set_verify_callback(
+ new detail::verify_callback<VerifyCallback>(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 <typename ConstBufferSequence>
+ 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 <typename ConstBufferSequence>
+ ASIO_SYNC_OP_VOID handshake(handshake_type type,
+ const ConstBufferSequence& buffers, asio::error_code& ec)
+ {
+ detail::io(next_layer_, core_,
+ detail::buffered_handshake_op<ConstBufferSequence>(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. It is an initiating function for an @ref asynchronous_operation,
+ * and always returns immediately.
+ *
+ * @param type The type of handshaking to be performed, i.e. as a client or as
+ * a server.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the handshake completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c Stream type's @c async_read_some and
+ * @c async_write_some operations.
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ HandshakeToken = default_completion_token_t<executor_type>>
+ auto async_handshake(handshake_type type,
+ HandshakeToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<HandshakeToken,
+ void (asio::error_code)>(
+ declval<initiate_async_handshake>(), token, type))
+ {
+ return async_initiate<HandshakeToken,
+ void (asio::error_code)>(
+ initiate_async_handshake(this), token, type);
+ }
+
+ /// Start an asynchronous SSL handshake.
+ /**
+ * This function is used to asynchronously perform an SSL handshake on the
+ * stream. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the handshake completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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
+ * Regardless of whether the asynchronous operation completes immediately or
+ * not, the completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c Stream type's @c async_read_some and
+ * @c async_write_some operations.
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) BufferedHandshakeToken
+ = default_completion_token_t<executor_type>>
+ auto async_handshake(handshake_type type, const ConstBufferSequence& buffers,
+ BufferedHandshakeToken&& token
+ = default_completion_token_t<executor_type>(),
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ > = 0)
+ -> decltype(
+ async_initiate<BufferedHandshakeToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_buffered_handshake>(), token, type, buffers))
+ {
+ return async_initiate<BufferedHandshakeToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_buffered_handshake(this), token, type, buffers);
+ }
+
+ /// 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. It is
+ * an initiating function for an @ref asynchronous_operation, and always
+ * returns immediately.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the shutdown completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c Stream type's @c async_read_some and
+ * @c async_write_some operations.
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ ShutdownToken
+ = default_completion_token_t<executor_type>>
+ auto async_shutdown(
+ ShutdownToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ShutdownToken,
+ void (asio::error_code)>(
+ declval<initiate_async_shutdown>(), token))
+ {
+ return async_initiate<ShutdownToken,
+ void (asio::error_code)>(
+ initiate_async_shutdown(this), token);
+ }
+
+ /// 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 <typename ConstBufferSequence>
+ 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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return detail::io(next_layer_, core_,
+ detail::write_op<ConstBufferSequence>(buffers), ec);
+ }
+
+ /// Start an asynchronous write.
+ /**
+ * This function is used to asynchronously write one or more bytes of data to
+ * the stream. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @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 asynchronous operation
+ * completes.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c Stream type's @c async_read_some and
+ * @c async_write_some operations.
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_write_some(const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_write_some>(), token, buffers))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_write_some(this), token, buffers);
+ }
+
+ /// 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 <typename MutableBufferSequence>
+ 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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return detail::io(next_layer_, core_,
+ detail::read_op<MutableBufferSequence>(buffers), ec);
+ }
+
+ /// Start an asynchronous read.
+ /**
+ * This function is used to asynchronously read one or more bytes of data from
+ * the stream. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c Stream type's @c async_read_some and
+ * @c async_write_some operations.
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_read_some(const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_read_some>(), token, buffers))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_read_some(this), token, buffers);
+ }
+
+private:
+ class initiate_async_handshake
+ {
+ public:
+ typedef typename stream::executor_type executor_type;
+
+ explicit initiate_async_handshake(stream* self)
+ : self_(self)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename HandshakeHandler>
+ void operator()(HandshakeHandler&& handler,
+ handshake_type type) const
+ {
+ // 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::detail::non_const_lvalue<HandshakeHandler> handler2(handler);
+ detail::async_io(self_->next_layer_, self_->core_,
+ detail::handshake_op(type), handler2.value);
+ }
+
+ private:
+ stream* self_;
+ };
+
+ class initiate_async_buffered_handshake
+ {
+ public:
+ typedef typename stream::executor_type executor_type;
+
+ explicit initiate_async_buffered_handshake(stream* self)
+ : self_(self)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename BufferedHandshakeHandler, typename ConstBufferSequence>
+ void operator()(BufferedHandshakeHandler&& handler,
+ handshake_type type, const ConstBufferSequence& buffers) const
+ {
+ // 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::detail::non_const_lvalue<
+ BufferedHandshakeHandler> handler2(handler);
+ detail::async_io(self_->next_layer_, self_->core_,
+ detail::buffered_handshake_op<ConstBufferSequence>(type, buffers),
+ handler2.value);
+ }
+
+ private:
+ stream* self_;
+ };
+
+ class initiate_async_shutdown
+ {
+ public:
+ typedef typename stream::executor_type executor_type;
+
+ explicit initiate_async_shutdown(stream* self)
+ : self_(self)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ShutdownHandler>
+ void operator()(ShutdownHandler&& handler) const
+ {
+ // 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_HANDSHAKE_HANDLER_CHECK(ShutdownHandler, handler) type_check;
+
+ asio::detail::non_const_lvalue<ShutdownHandler> handler2(handler);
+ detail::async_io(self_->next_layer_, self_->core_,
+ detail::shutdown_op(), handler2.value);
+ }
+
+ private:
+ stream* self_;
+ };
+
+ class initiate_async_write_some
+ {
+ public:
+ typedef typename stream::executor_type executor_type;
+
+ explicit initiate_async_write_some(stream* self)
+ : self_(self)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers) const
+ {
+ // 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::detail::non_const_lvalue<WriteHandler> handler2(handler);
+ detail::async_io(self_->next_layer_, self_->core_,
+ detail::write_op<ConstBufferSequence>(buffers), handler2.value);
+ }
+
+ private:
+ stream* self_;
+ };
+
+ class initiate_async_read_some
+ {
+ public:
+ typedef typename stream::executor_type executor_type;
+
+ explicit initiate_async_read_some(stream* self)
+ : self_(self)
+ {
+ }
+
+ executor_type get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers) const
+ {
+ // 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::detail::non_const_lvalue<ReadHandler> handler2(handler);
+ detail::async_io(self_->next_layer_, self_->core_,
+ detail::read_op<MutableBufferSequence>(buffers), handler2.value);
+ }
+
+ private:
+ stream* self_;
+ };
+
+ 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/3rdparty/asio/include/asio/ssl/stream_base.hpp b/3rdparty/asio/include/asio/ssl/stream_base.hpp
new file mode 100644
index 00000000000..2728ec8ca1b
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/stream_base.hpp
@@ -0,0 +1,52 @@
+//
+// ssl/stream_base.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/ssl/verify_context.hpp b/3rdparty/asio/include/asio/ssl/verify_context.hpp
new file mode 100644
index 00000000000..7251856f08e
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/verify_context.hpp
@@ -0,0 +1,67 @@
+//
+// ssl/verify_context.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/ssl/verify_mode.hpp b/3rdparty/asio/include/asio/ssl/verify_mode.hpp
new file mode 100644
index 00000000000..919e308c8a4
--- /dev/null
+++ b/3rdparty/asio/include/asio/ssl/verify_mode.hpp
@@ -0,0 +1,63 @@
+//
+// ssl/verify_mode.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/static_thread_pool.hpp b/3rdparty/asio/include/asio/static_thread_pool.hpp
new file mode 100644
index 00000000000..636afe1cee5
--- /dev/null
+++ b/3rdparty/asio/include/asio/static_thread_pool.hpp
@@ -0,0 +1,31 @@
+//
+// static_thread_pool.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_STATIC_THREAD_POOL_HPP
+#define ASIO_STATIC_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/thread_pool.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+typedef thread_pool static_thread_pool;
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_STATIC_THREAD_POOL_HPP
diff --git a/3rdparty/asio/include/asio/steady_timer.hpp b/3rdparty/asio/include/asio/steady_timer.hpp
new file mode 100644
index 00000000000..5db00250b71
--- /dev/null
+++ b/3rdparty/asio/include/asio/steady_timer.hpp
@@ -0,0 +1,37 @@
+//
+// steady_timer.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#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 &lt;chrono&gt; 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<boost::chrono::steady_clock> timer;
+ * @endcode
+ */
+typedef basic_waitable_timer<chrono::steady_clock> steady_timer;
+
+} // namespace asio
+
+#endif // ASIO_STEADY_TIMER_HPP
diff --git a/3rdparty/asio/include/asio/strand.hpp b/3rdparty/asio/include/asio/strand.hpp
new file mode 100644
index 00000000000..c63592b8649
--- /dev/null
+++ b/3rdparty/asio/include/asio/strand.hpp
@@ -0,0 +1,557 @@
+//
+// strand.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/execution/blocking.hpp"
+#include "asio/execution/executor.hpp"
+#include "asio/is_executor.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Provides serialised function invocation for any executor type.
+template <typename Executor>
+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_(strand::create_implementation(executor_))
+ {
+ }
+
+ /// Construct a strand for the specified executor.
+ template <typename Executor1>
+ explicit strand(const Executor1& e,
+ constraint_t<
+ conditional_t<
+ !is_same<Executor1, strand>::value,
+ is_convertible<Executor1, Executor>,
+ false_type
+ >::value
+ > = 0)
+ : executor_(e),
+ impl_(strand::create_implementation(executor_))
+ {
+ }
+
+ /// Copy constructor.
+ strand(const strand& other) 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 <class OtherExecutor>
+ strand(
+ const strand<OtherExecutor>& other) noexcept
+ : executor_(other.executor_),
+ impl_(other.impl_)
+ {
+ }
+
+ /// Assignment operator.
+ strand& operator=(const strand& other) 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 <class OtherExecutor>
+ strand& operator=(
+ const strand<OtherExecutor>& other) noexcept
+ {
+ executor_ = other.executor_;
+ impl_ = other.impl_;
+ return *this;
+ }
+
+ /// Move constructor.
+ strand(strand&& other) noexcept
+ : executor_(static_cast<Executor&&>(other.executor_)),
+ impl_(static_cast<implementation_type&&>(other.impl_))
+ {
+ }
+
+ /// Converting move constructor.
+ /**
+ * This constructor is only valid if the @c OtherExecutor type is convertible
+ * to @c Executor.
+ */
+ template <class OtherExecutor>
+ strand(strand<OtherExecutor>&& other) noexcept
+ : executor_(static_cast<OtherExecutor&&>(other.executor_)),
+ impl_(static_cast<implementation_type&&>(other.impl_))
+ {
+ }
+
+ /// Move assignment operator.
+ strand& operator=(strand&& other) noexcept
+ {
+ executor_ = static_cast<Executor&&>(other.executor_);
+ impl_ = static_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 <class OtherExecutor>
+ strand& operator=(strand<OtherExecutor>&& other) noexcept
+ {
+ executor_ = static_cast<OtherExecutor&&>(other.executor_);
+ impl_ = static_cast<implementation_type&&>(other.impl_);
+ return *this;
+ }
+
+ /// Destructor.
+ ~strand() noexcept
+ {
+ }
+
+ /// Obtain the underlying executor.
+ inner_executor_type get_inner_executor() const noexcept
+ {
+ return executor_;
+ }
+
+ /// Forward a query to the underlying executor.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code asio::strand<my_executor_type> ex = ...;
+ * if (asio::query(ex, asio::execution::blocking)
+ * == asio::execution::blocking.never)
+ * ... @endcode
+ */
+ template <typename Property>
+ constraint_t<
+ can_query<const Executor&, Property>::value,
+ conditional_t<
+ is_convertible<Property, execution::blocking_t>::value,
+ execution::blocking_t,
+ query_result_t<const Executor&, Property>
+ >
+ > query(const Property& p) const
+ noexcept(is_nothrow_query<const Executor&, Property>::value)
+ {
+ return this->query_helper(
+ is_convertible<Property, execution::blocking_t>(), p);
+ }
+
+ /// Forward a requirement to the underlying executor.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code asio::strand<my_executor_type> ex1 = ...;
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::blocking.never); @endcode
+ */
+ template <typename Property>
+ constraint_t<
+ can_require<const Executor&, Property>::value
+ && !is_convertible<Property, execution::blocking_t::always_t>::value,
+ strand<decay_t<require_result_t<const Executor&, Property>>>
+ > require(const Property& p) const
+ noexcept(is_nothrow_require<const Executor&, Property>::value)
+ {
+ return strand<decay_t<require_result_t<const Executor&, Property>>>(
+ asio::require(executor_, p), impl_);
+ }
+
+ /// Forward a preference to the underlying executor.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::prefer customisation point.
+ *
+ * For example:
+ * @code asio::strand<my_executor_type> ex1 = ...;
+ * auto ex2 = asio::prefer(ex1,
+ * asio::execution::blocking.never); @endcode
+ */
+ template <typename Property>
+ constraint_t<
+ can_prefer<const Executor&, Property>::value
+ && !is_convertible<Property, execution::blocking_t::always_t>::value,
+ strand<decay_t<prefer_result_t<const Executor&, Property>>>
+ > prefer(const Property& p) const
+ noexcept(is_nothrow_prefer<const Executor&, Property>::value)
+ {
+ return strand<decay_t<prefer_result_t<const Executor&, Property>>>(
+ asio::prefer(executor_, p), impl_);
+ }
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+ /// Obtain the underlying execution context.
+ execution_context& context() const 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 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 noexcept
+ {
+ executor_.on_work_finished();
+ }
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+ /// 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
+ * according to the properties of the underlying executor.
+ *
+ * @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
+ */
+ template <typename Function>
+ constraint_t<
+ traits::execute_member<const Executor&, Function>::is_valid,
+ void
+ > execute(Function&& f) const
+ {
+ detail::strand_executor_service::execute(impl_,
+ executor_, static_cast<Function&&>(f));
+ }
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+ /// 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 <typename Function, typename Allocator>
+ void dispatch(Function&& f, const Allocator& a) const
+ {
+ detail::strand_executor_service::dispatch(impl_,
+ executor_, static_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 <typename Function, typename Allocator>
+ void post(Function&& f, const Allocator& a) const
+ {
+ detail::strand_executor_service::post(impl_,
+ executor_, static_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 <typename Function, typename Allocator>
+ void defer(Function&& f, const Allocator& a) const
+ {
+ detail::strand_executor_service::defer(impl_,
+ executor_, static_cast<Function&&>(f), a);
+ }
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+ /// 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 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) 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) noexcept
+ {
+ return a.impl_ != b.impl_;
+ }
+
+#if defined(GENERATING_DOCUMENTATION)
+private:
+#endif // defined(GENERATING_DOCUMENTATION)
+ typedef detail::strand_executor_service::implementation_type
+ implementation_type;
+
+ template <typename InnerExecutor>
+ static implementation_type create_implementation(const InnerExecutor& ex,
+ constraint_t<
+ can_query<InnerExecutor, execution::context_t>::value
+ > = 0)
+ {
+ return use_service<detail::strand_executor_service>(
+ asio::query(ex, execution::context)).create_implementation();
+ }
+
+ template <typename InnerExecutor>
+ static implementation_type create_implementation(const InnerExecutor& ex,
+ constraint_t<
+ !can_query<InnerExecutor, execution::context_t>::value
+ > = 0)
+ {
+ return use_service<detail::strand_executor_service>(
+ ex.context()).create_implementation();
+ }
+
+ strand(const Executor& ex, const implementation_type& impl)
+ : executor_(ex),
+ impl_(impl)
+ {
+ }
+
+ template <typename Property>
+ query_result_t<const Executor&, Property> query_helper(
+ false_type, const Property& property) const
+ {
+ return asio::query(executor_, property);
+ }
+
+ template <typename Property>
+ execution::blocking_t query_helper(true_type, const Property& property) const
+ {
+ execution::blocking_t result = asio::query(executor_, property);
+ return result == execution::blocking.always
+ ? execution::blocking.possibly : result;
+ }
+
+ Executor executor_;
+ implementation_type impl_;
+};
+
+/** @defgroup make_strand asio::make_strand
+ *
+ * @brief The asio::make_strand function creates a @ref strand object for
+ * an executor or execution context.
+ */
+/*@{*/
+
+/// Create a @ref strand object for an executor.
+/**
+ * @param ex An executor.
+ *
+ * @returns A strand constructed with the specified executor.
+ */
+template <typename Executor>
+inline strand<Executor> make_strand(const Executor& ex,
+ constraint_t<
+ is_executor<Executor>::value || execution::is_executor<Executor>::value
+ > = 0)
+{
+ return strand<Executor>(ex);
+}
+
+/// Create a @ref strand object for an execution context.
+/**
+ * @param ctx An execution context, from which an executor will be obtained.
+ *
+ * @returns A strand constructed with the execution context's executor, obtained
+ * by performing <tt>ctx.get_executor()</tt>.
+ */
+template <typename ExecutionContext>
+inline strand<typename ExecutionContext::executor_type>
+make_strand(ExecutionContext& ctx,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+{
+ return strand<typename ExecutionContext::executor_type>(ctx.get_executor());
+}
+
+/*@}*/
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename Executor>
+struct equality_comparable<strand<Executor>>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename Executor, typename Function>
+struct execute_member<strand<Executor>, Function,
+ enable_if_t<
+ traits::execute_member<const Executor&, Function>::is_valid
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename Executor, typename Property>
+struct query_member<strand<Executor>, Property,
+ enable_if_t<
+ can_query<const Executor&, Property>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_query<Executor, Property>::value;
+ typedef conditional_t<
+ is_convertible<Property, execution::blocking_t>::value,
+ execution::blocking_t, query_result_t<Executor, Property>> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename Executor, typename Property>
+struct require_member<strand<Executor>, Property,
+ enable_if_t<
+ can_require<const Executor&, Property>::value
+ && !is_convertible<Property, execution::blocking_t::always_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_require<Executor, Property>::value;
+ typedef strand<decay_t<require_result_t<Executor, Property>>> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+template <typename Executor, typename Property>
+struct prefer_member<strand<Executor>, Property,
+ enable_if_t<
+ can_prefer<const Executor&, Property>::value
+ && !is_convertible<Property, execution::blocking_t::always_t>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept =
+ is_nothrow_prefer<Executor, Property>::value;
+ typedef strand<decay_t<prefer_result_t<Executor, Property>>> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+} // namespace traits
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // 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/3rdparty/asio/include/asio/stream_file.hpp b/3rdparty/asio/include/asio/stream_file.hpp
new file mode 100644
index 00000000000..ef059a987e5
--- /dev/null
+++ b/3rdparty/asio/include/asio/stream_file.hpp
@@ -0,0 +1,35 @@
+//
+// stream_file.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_FILE_HPP
+#define ASIO_STREAM_FILE_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_FILE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/basic_stream_file.hpp"
+
+namespace asio {
+
+/// Typedef for the typical usage of a stream-oriented file.
+typedef basic_stream_file<> stream_file;
+
+} // namespace asio
+
+#endif // defined(ASIO_HAS_FILE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_STREAM_FILE_HPP
diff --git a/3rdparty/asio/include/asio/streambuf.hpp b/3rdparty/asio/include/asio/streambuf.hpp
new file mode 100644
index 00000000000..d7745245cb8
--- /dev/null
+++ b/3rdparty/asio/include/asio/streambuf.hpp
@@ -0,0 +1,33 @@
+//
+// streambuf.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/system_context.hpp b/3rdparty/asio/include/asio/system_context.hpp
new file mode 100644
index 00000000000..132ce615677
--- /dev/null
+++ b/3rdparty/asio/include/asio/system_context.hpp
@@ -0,0 +1,90 @@
+//
+// system_context.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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.hpp"
+#include "asio/execution_context.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+template <typename Blocking, typename Relationship, typename Allocator>
+class basic_system_executor;
+
+/// The executor context for the system executor.
+class system_context : public execution_context
+{
+public:
+ /// The executor type associated with the context.
+ typedef basic_system_executor<
+ execution::blocking_t::possibly_t,
+ execution::relationship_t::fork_t,
+ std::allocator<void>
+ > 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() 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 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:
+ template <typename, typename, typename> friend class basic_system_executor;
+
+ struct thread_function;
+
+ // Helper function to create the underlying scheduler.
+ ASIO_DECL detail::scheduler& add_scheduler(detail::scheduler* s);
+
+ // The underlying scheduler.
+ detail::scheduler& scheduler_;
+
+ // The threads in the system thread pool.
+ detail::thread_group threads_;
+
+ // The number of threads in the pool.
+ std::size_t num_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/3rdparty/asio/include/asio/system_error.hpp b/3rdparty/asio/include/asio/system_error.hpp
new file mode 100644
index 00000000000..d7f932627bd
--- /dev/null
+++ b/3rdparty/asio/include/asio/system_error.hpp
@@ -0,0 +1,31 @@
+//
+// system_error.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include <system_error>
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+typedef std::system_error system_error;
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_SYSTEM_ERROR_HPP
diff --git a/3rdparty/asio/include/asio/system_executor.hpp b/3rdparty/asio/include/asio/system_executor.hpp
new file mode 100644
index 00000000000..19b6d30e322
--- /dev/null
+++ b/3rdparty/asio/include/asio/system_executor.hpp
@@ -0,0 +1,671 @@
+//
+// system_executor.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/memory.hpp"
+#include "asio/execution.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. When the blocking.never property is
+ * established, the system executor will schedule the function to run on an
+ * unspecified system thread pool. When either blocking.possibly or
+ * blocking.always is established, the executor invokes the function
+ * immediately.
+ */
+template <typename Blocking, typename Relationship, typename Allocator>
+class basic_system_executor
+{
+public:
+ /// Default constructor.
+ basic_system_executor() noexcept
+ : allocator_(Allocator())
+ {
+ }
+
+#if !defined(GENERATING_DOCUMENTATION)
+private:
+ friend struct asio_require_fn::impl;
+ friend struct asio_prefer_fn::impl;
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ /// Obtain an executor with the @c blocking.possibly property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex1;
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::blocking.possibly); @endcode
+ */
+ basic_system_executor<execution::blocking_t::possibly_t,
+ Relationship, Allocator>
+ require(execution::blocking_t::possibly_t) const
+ {
+ return basic_system_executor<execution::blocking_t::possibly_t,
+ Relationship, Allocator>(allocator_);
+ }
+
+ /// Obtain an executor with the @c blocking.always property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex1;
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::blocking.always); @endcode
+ */
+ basic_system_executor<execution::blocking_t::always_t,
+ Relationship, Allocator>
+ require(execution::blocking_t::always_t) const
+ {
+ return basic_system_executor<execution::blocking_t::always_t,
+ Relationship, Allocator>(allocator_);
+ }
+
+ /// Obtain an executor with the @c blocking.never property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex1;
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::blocking.never); @endcode
+ */
+ basic_system_executor<execution::blocking_t::never_t,
+ Relationship, Allocator>
+ require(execution::blocking_t::never_t) const
+ {
+ return basic_system_executor<execution::blocking_t::never_t,
+ Relationship, Allocator>(allocator_);
+ }
+
+ /// Obtain an executor with the @c relationship.continuation property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex1;
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::relationship.continuation); @endcode
+ */
+ basic_system_executor<Blocking,
+ execution::relationship_t::continuation_t, Allocator>
+ require(execution::relationship_t::continuation_t) const
+ {
+ return basic_system_executor<Blocking,
+ execution::relationship_t::continuation_t, Allocator>(allocator_);
+ }
+
+ /// Obtain an executor with the @c relationship.fork property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex1;
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::relationship.fork); @endcode
+ */
+ basic_system_executor<Blocking,
+ execution::relationship_t::fork_t, Allocator>
+ require(execution::relationship_t::fork_t) const
+ {
+ return basic_system_executor<Blocking,
+ execution::relationship_t::fork_t, Allocator>(allocator_);
+ }
+
+ /// Obtain an executor with the specified @c allocator property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex1;
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::allocator(my_allocator)); @endcode
+ */
+ template <typename OtherAllocator>
+ basic_system_executor<Blocking, Relationship, OtherAllocator>
+ require(execution::allocator_t<OtherAllocator> a) const
+ {
+ return basic_system_executor<Blocking,
+ Relationship, OtherAllocator>(a.value());
+ }
+
+ /// Obtain an executor with the default @c allocator property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex1;
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::allocator); @endcode
+ */
+ basic_system_executor<Blocking, Relationship, std::allocator<void>>
+ require(execution::allocator_t<void>) const
+ {
+ return basic_system_executor<Blocking,
+ Relationship, std::allocator<void>>();
+ }
+
+#if !defined(GENERATING_DOCUMENTATION)
+private:
+ friend struct asio_query_fn::impl;
+ friend struct asio::execution::detail::blocking_t<0>;
+ friend struct asio::execution::detail::mapping_t<0>;
+ friend struct asio::execution::detail::outstanding_work_t<0>;
+ friend struct asio::execution::detail::relationship_t<0>;
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ /// Query the current value of the @c mapping property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex;
+ * if (asio::query(ex, asio::execution::mapping)
+ * == asio::execution::mapping.thread)
+ * ... @endcode
+ */
+ static constexpr execution::mapping_t query(
+ execution::mapping_t) noexcept
+ {
+ return execution::mapping.thread;
+ }
+
+ /// Query the current value of the @c context property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex;
+ * asio::system_context& pool = asio::query(
+ * ex, asio::execution::context); @endcode
+ */
+ static system_context& query(execution::context_t) noexcept;
+
+ /// Query the current value of the @c blocking property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex;
+ * if (asio::query(ex, asio::execution::blocking)
+ * == asio::execution::blocking.always)
+ * ... @endcode
+ */
+ static constexpr execution::blocking_t query(
+ execution::blocking_t) noexcept
+ {
+ return Blocking();
+ }
+
+ /// Query the current value of the @c relationship property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex;
+ * if (asio::query(ex, asio::execution::relationship)
+ * == asio::execution::relationship.continuation)
+ * ... @endcode
+ */
+ static constexpr execution::relationship_t query(
+ execution::relationship_t) noexcept
+ {
+ return Relationship();
+ }
+
+ /// Query the current value of the @c allocator property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex;
+ * auto alloc = asio::query(ex,
+ * asio::execution::allocator); @endcode
+ */
+ template <typename OtherAllocator>
+ constexpr Allocator query(
+ execution::allocator_t<OtherAllocator>) const noexcept
+ {
+ return allocator_;
+ }
+
+ /// Query the current value of the @c allocator property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex;
+ * auto alloc = asio::query(ex,
+ * asio::execution::allocator); @endcode
+ */
+ constexpr Allocator query(
+ execution::allocator_t<void>) const noexcept
+ {
+ return allocator_;
+ }
+
+ /// Query the occupancy (recommended number of work items) for the system
+ /// context.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code asio::system_executor ex;
+ * std::size_t occupancy = asio::query(
+ * ex, asio::execution::occupancy); @endcode
+ */
+ std::size_t query(execution::occupancy_t) const noexcept;
+
+public:
+ /// Compare two executors for equality.
+ /**
+ * Two executors are equal if they refer to the same underlying io_context.
+ */
+ friend bool operator==(const basic_system_executor&,
+ const basic_system_executor&) noexcept
+ {
+ return true;
+ }
+
+ /// Compare two executors for inequality.
+ /**
+ * Two executors are equal if they refer to the same underlying io_context.
+ */
+ friend bool operator!=(const basic_system_executor&,
+ const basic_system_executor&) noexcept
+ {
+ return false;
+ }
+
+ /// Execution function.
+ template <typename Function>
+ void execute(Function&& f) const
+ {
+ this->do_execute(static_cast<Function&&>(f), Blocking());
+ }
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+public:
+ /// Obtain the underlying execution context.
+ system_context& context() const 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 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 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 <typename Function, typename OtherAllocator>
+ void dispatch(Function&& f, const OtherAllocator& 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 <typename Function, typename OtherAllocator>
+ void post(Function&& f, const OtherAllocator& 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 <typename Function, typename OtherAllocator>
+ void defer(Function&& f, const OtherAllocator& a) const;
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+private:
+ template <typename, typename, typename> friend class basic_system_executor;
+
+ // Constructor used by require().
+ basic_system_executor(const Allocator& a)
+ : allocator_(a)
+ {
+ }
+
+ /// Execution helper implementation for the possibly blocking property.
+ template <typename Function>
+ void do_execute(Function&& f,
+ execution::blocking_t::possibly_t) const;
+
+ /// Execution helper implementation for the always blocking property.
+ template <typename Function>
+ void do_execute(Function&& f,
+ execution::blocking_t::always_t) const;
+
+ /// Execution helper implementation for the never blocking property.
+ template <typename Function>
+ void do_execute(Function&& f,
+ execution::blocking_t::never_t) const;
+
+ // The allocator used for execution functions.
+ Allocator allocator_;
+};
+
+/// An executor that uses arbitrary threads.
+/**
+ * The system executor represents an execution context where functions are
+ * permitted to run on arbitrary threads. When the blocking.never property is
+ * established, the system executor will schedule the function to run on an
+ * unspecified system thread pool. When either blocking.possibly or
+ * blocking.always is established, the executor invokes the function
+ * immediately.
+ */
+typedef basic_system_executor<execution::blocking_t::possibly_t,
+ execution::relationship_t::fork_t, std::allocator<void>>
+ system_executor;
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename Blocking, typename Relationship, typename Allocator>
+struct equality_comparable<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename Blocking, typename Relationship,
+ typename Allocator, typename Function>
+struct execute_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ Function
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename Blocking, typename Relationship, typename Allocator>
+struct require_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ asio::execution::blocking_t::possibly_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::basic_system_executor<
+ asio::execution::blocking_t::possibly_t,
+ Relationship, Allocator> result_type;
+};
+
+template <typename Blocking, typename Relationship, typename Allocator>
+struct require_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ asio::execution::blocking_t::always_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::basic_system_executor<
+ asio::execution::blocking_t::always_t,
+ Relationship, Allocator> result_type;
+};
+
+template <typename Blocking, typename Relationship, typename Allocator>
+struct require_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ asio::execution::blocking_t::never_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::basic_system_executor<
+ asio::execution::blocking_t::never_t,
+ Relationship, Allocator> result_type;
+};
+
+template <typename Blocking, typename Relationship, typename Allocator>
+struct require_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ asio::execution::relationship_t::fork_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::basic_system_executor<Blocking,
+ asio::execution::relationship_t::fork_t,
+ Allocator> result_type;
+};
+
+template <typename Blocking, typename Relationship, typename Allocator>
+struct require_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ asio::execution::relationship_t::continuation_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::basic_system_executor<Blocking,
+ asio::execution::relationship_t::continuation_t,
+ Allocator> result_type;
+};
+
+template <typename Blocking, typename Relationship, typename Allocator>
+struct require_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ asio::execution::allocator_t<void>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::basic_system_executor<Blocking,
+ Relationship, std::allocator<void>> result_type;
+};
+
+template <typename Blocking, typename Relationship,
+ typename Allocator, typename OtherAllocator>
+struct require_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ asio::execution::allocator_t<OtherAllocator>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::basic_system_executor<Blocking,
+ Relationship, OtherAllocator> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename Blocking, typename Relationship,
+ typename Allocator, typename Property>
+struct query_static_constexpr_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::mapping_t
+ >::value
+ >::type
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::execution::mapping_t::thread_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return result_type();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename Blocking, typename Relationship,
+ typename Allocator, typename Property>
+struct query_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::blocking_t
+ >::value
+ >::type
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::execution::blocking_t result_type;
+};
+
+template <typename Blocking, typename Relationship,
+ typename Allocator, typename Property>
+struct query_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::relationship_t
+ >::value
+ >::type
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::execution::relationship_t result_type;
+};
+
+template <typename Blocking, typename Relationship, typename Allocator>
+struct query_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ asio::execution::context_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::system_context& result_type;
+};
+
+template <typename Blocking, typename Relationship, typename Allocator>
+struct query_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ asio::execution::allocator_t<void>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef Allocator result_type;
+};
+
+template <typename Blocking, typename Relationship, typename Allocator>
+struct query_member<
+ asio::basic_system_executor<Blocking, Relationship, Allocator>,
+ asio::execution::allocator_t<Allocator>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef Allocator result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+} // namespace traits
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/system_executor.hpp"
+
+#endif // ASIO_SYSTEM_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/system_timer.hpp b/3rdparty/asio/include/asio/system_timer.hpp
new file mode 100644
index 00000000000..7b5e768032f
--- /dev/null
+++ b/3rdparty/asio/include/asio/system_timer.hpp
@@ -0,0 +1,37 @@
+//
+// system_timer.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#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 &lt;chrono&gt; 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<boost::chrono::system_clock> timer;
+ * @endcode
+ */
+typedef basic_waitable_timer<chrono::system_clock> system_timer;
+
+} // namespace asio
+
+#endif // ASIO_SYSTEM_TIMER_HPP
diff --git a/3rdparty/asio/include/asio/this_coro.hpp b/3rdparty/asio/include/asio/this_coro.hpp
new file mode 100644
index 00000000000..37381b92abf
--- /dev/null
+++ b/3rdparty/asio/include/asio/this_coro.hpp
@@ -0,0 +1,267 @@
+//
+// this_coro.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_THIS_CORO_HPP
+#define ASIO_THIS_CORO_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 this_coro {
+
+/// Awaitable type that returns the executor of the current coroutine.
+struct executor_t
+{
+ constexpr executor_t()
+ {
+ }
+};
+
+/// Awaitable object that returns the executor of the current coroutine.
+constexpr executor_t executor;
+
+/// Awaitable type that returns the cancellation state of the current coroutine.
+struct cancellation_state_t
+{
+ constexpr cancellation_state_t()
+ {
+ }
+};
+
+/// Awaitable object that returns the cancellation state of the current
+/// coroutine.
+/**
+ * @par Example
+ * @code asio::awaitable<void> my_coroutine()
+ * {
+ * asio::cancellation_state cs
+ * = co_await asio::this_coro::cancellation_state;
+ *
+ * // ...
+ *
+ * if (cs.cancelled() != asio::cancellation_type::none)
+ * // ...
+ * } @endcode
+ */
+constexpr cancellation_state_t cancellation_state;
+
+#if defined(GENERATING_DOCUMENTATION)
+
+/// Returns an awaitable object that may be used to reset the cancellation state
+/// of the current coroutine.
+/**
+ * Let <tt>P</tt> be the cancellation slot associated with the current
+ * coroutine's @ref co_spawn completion handler. Assigns a new
+ * asio::cancellation_state object <tt>S</tt>, constructed as
+ * <tt>S(P)</tt>, into the current coroutine's cancellation state object.
+ *
+ * @par Example
+ * @code asio::awaitable<void> my_coroutine()
+ * {
+ * co_await asio::this_coro::reset_cancellation_state();
+ *
+ * // ...
+ * } @endcode
+ *
+ * @note The cancellation state is shared by all coroutines in the same "thread
+ * of execution" that was created using asio::co_spawn.
+ */
+ASIO_NODISCARD constexpr unspecified
+reset_cancellation_state();
+
+/// Returns an awaitable object that may be used to reset the cancellation state
+/// of the current coroutine.
+/**
+ * Let <tt>P</tt> be the cancellation slot associated with the current
+ * coroutine's @ref co_spawn completion handler. Assigns a new
+ * asio::cancellation_state object <tt>S</tt>, constructed as <tt>S(P,
+ * std::forward<Filter>(filter))</tt>, into the current coroutine's
+ * cancellation state object.
+ *
+ * @par Example
+ * @code asio::awaitable<void> my_coroutine()
+ * {
+ * co_await asio::this_coro::reset_cancellation_state(
+ * asio::enable_partial_cancellation());
+ *
+ * // ...
+ * } @endcode
+ *
+ * @note The cancellation state is shared by all coroutines in the same "thread
+ * of execution" that was created using asio::co_spawn.
+ */
+template <typename Filter>
+ASIO_NODISCARD constexpr unspecified
+reset_cancellation_state(Filter&& filter);
+
+/// Returns an awaitable object that may be used to reset the cancellation state
+/// of the current coroutine.
+/**
+ * Let <tt>P</tt> be the cancellation slot associated with the current
+ * coroutine's @ref co_spawn completion handler. Assigns a new
+ * asio::cancellation_state object <tt>S</tt>, constructed as <tt>S(P,
+ * std::forward<InFilter>(in_filter),
+ * std::forward<OutFilter>(out_filter))</tt>, into the current coroutine's
+ * cancellation state object.
+ *
+ * @par Example
+ * @code asio::awaitable<void> my_coroutine()
+ * {
+ * co_await asio::this_coro::reset_cancellation_state(
+ * asio::enable_partial_cancellation(),
+ * asio::disable_cancellation());
+ *
+ * // ...
+ * } @endcode
+ *
+ * @note The cancellation state is shared by all coroutines in the same "thread
+ * of execution" that was created using asio::co_spawn.
+ */
+template <typename InFilter, typename OutFilter>
+ASIO_NODISCARD constexpr unspecified
+reset_cancellation_state(
+ InFilter&& in_filter,
+ OutFilter&& out_filter);
+
+/// Returns an awaitable object that may be used to determine whether the
+/// coroutine throws if trying to suspend when it has been cancelled.
+/**
+ * @par Example
+ * @code asio::awaitable<void> my_coroutine()
+ * {
+ * if (co_await asio::this_coro::throw_if_cancelled)
+ * // ...
+ *
+ * // ...
+ * } @endcode
+ */
+ASIO_NODISCARD constexpr unspecified
+throw_if_cancelled();
+
+/// Returns an awaitable object that may be used to specify whether the
+/// coroutine throws if trying to suspend when it has been cancelled.
+/**
+ * @par Example
+ * @code asio::awaitable<void> my_coroutine()
+ * {
+ * co_await asio::this_coro::throw_if_cancelled(false);
+ *
+ * // ...
+ * } @endcode
+ */
+ASIO_NODISCARD constexpr unspecified
+throw_if_cancelled(bool value);
+
+#else // defined(GENERATING_DOCUMENTATION)
+
+struct reset_cancellation_state_0_t
+{
+ constexpr reset_cancellation_state_0_t()
+ {
+ }
+};
+
+ASIO_NODISCARD inline constexpr reset_cancellation_state_0_t
+reset_cancellation_state()
+{
+ return reset_cancellation_state_0_t();
+}
+
+template <typename Filter>
+struct reset_cancellation_state_1_t
+{
+ template <typename F>
+ explicit constexpr reset_cancellation_state_1_t(
+ F&& filt)
+ : filter(static_cast<F&&>(filt))
+ {
+ }
+
+ Filter filter;
+};
+
+template <typename Filter>
+ASIO_NODISCARD inline constexpr reset_cancellation_state_1_t<
+ decay_t<Filter>>
+reset_cancellation_state(Filter&& filter)
+{
+ return reset_cancellation_state_1_t<decay_t<Filter>>(
+ static_cast<Filter&&>(filter));
+}
+
+template <typename InFilter, typename OutFilter>
+struct reset_cancellation_state_2_t
+{
+ template <typename F1, typename F2>
+ constexpr reset_cancellation_state_2_t(
+ F1&& in_filt, F2&& out_filt)
+ : in_filter(static_cast<F1&&>(in_filt)),
+ out_filter(static_cast<F2&&>(out_filt))
+ {
+ }
+
+ InFilter in_filter;
+ OutFilter out_filter;
+};
+
+template <typename InFilter, typename OutFilter>
+ASIO_NODISCARD inline constexpr
+reset_cancellation_state_2_t<decay_t<InFilter>, decay_t<OutFilter>>
+reset_cancellation_state(InFilter&& in_filter, OutFilter&& out_filter)
+{
+ return reset_cancellation_state_2_t<decay_t<InFilter>, decay_t<OutFilter>>(
+ static_cast<InFilter&&>(in_filter),
+ static_cast<OutFilter&&>(out_filter));
+}
+
+struct throw_if_cancelled_0_t
+{
+ constexpr throw_if_cancelled_0_t()
+ {
+ }
+};
+
+ASIO_NODISCARD inline constexpr throw_if_cancelled_0_t
+throw_if_cancelled()
+{
+ return throw_if_cancelled_0_t();
+}
+
+struct throw_if_cancelled_1_t
+{
+ explicit constexpr throw_if_cancelled_1_t(bool val)
+ : value(val)
+ {
+ }
+
+ bool value;
+};
+
+ASIO_NODISCARD inline constexpr throw_if_cancelled_1_t
+throw_if_cancelled(bool value)
+{
+ return throw_if_cancelled_1_t(value);
+}
+
+#endif // defined(GENERATING_DOCUMENTATION)
+
+} // namespace this_coro
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_THIS_CORO_HPP
diff --git a/3rdparty/asio/include/asio/thread.hpp b/3rdparty/asio/include/asio/thread.hpp
new file mode 100644
index 00000000000..fc57bffdd9e
--- /dev/null
+++ b/3rdparty/asio/include/asio/thread.hpp
@@ -0,0 +1,92 @@
+//
+// thread.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Function>
+ 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/3rdparty/asio/include/asio/thread_pool.hpp b/3rdparty/asio/include/asio/thread_pool.hpp
new file mode 100644
index 00000000000..f9095d9441a
--- /dev/null
+++ b/3rdparty/asio/include/asio/thread_pool.hpp
@@ -0,0 +1,963 @@
+//
+// thread_pool.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/atomic_count.hpp"
+#include "asio/detail/scheduler.hpp"
+#include "asio/detail/thread_group.hpp"
+#include "asio/execution.hpp"
+#include "asio/execution_context.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+ struct thread_pool_bits
+ {
+ static constexpr unsigned int blocking_never = 1;
+ static constexpr unsigned int blocking_always = 2;
+ static constexpr unsigned int blocking_mask = 3;
+ static constexpr unsigned int relationship_continuation = 4;
+ static constexpr unsigned int outstanding_work_tracked = 8;
+ };
+} // namespace detail
+
+/// 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 thread pool, 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:
+ template <typename Allocator, unsigned int Bits>
+ class basic_executor_type;
+
+ template <typename Allocator, unsigned int Bits>
+ friend class basic_executor_type;
+
+ /// Executor used to submit functions to a thread pool.
+ typedef basic_executor_type<std::allocator<void>, 0> executor_type;
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+ /// Constructs a pool with an automatically determined number of threads.
+ ASIO_DECL thread_pool();
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+ /// 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() noexcept;
+
+ /// Obtains the executor associated with the pool.
+ executor_type executor() 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();
+
+ /// Attaches the current thread to the pool.
+ /**
+ * This function attaches the current thread to the pool so that it may be
+ * used for executing submitted function objects. Blocks the calling thread
+ * until the pool is stopped or joined and has no outstanding work.
+ */
+ ASIO_DECL void attach();
+
+ /// 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();
+
+ /// Waits for threads to complete.
+ /**
+ * This function blocks until the threads in the pool have completed. If @c
+ * stop() is not called prior to @c wait(), the @c wait() call will wait
+ * until the pool has no more outstanding work.
+ */
+ ASIO_DECL void wait();
+
+private:
+ thread_pool(const thread_pool&) = delete;
+ thread_pool& operator=(const thread_pool&) = delete;
+
+ struct thread_function;
+
+ // Helper function to create the underlying scheduler.
+ ASIO_DECL detail::scheduler& add_scheduler(detail::scheduler* s);
+
+ // The underlying scheduler.
+ detail::scheduler& scheduler_;
+
+ // The threads in the pool.
+ detail::thread_group threads_;
+
+ // The current number of threads in the pool.
+ detail::atomic_count num_threads_;
+};
+
+/// Executor implementation type used to submit functions to a thread pool.
+template <typename Allocator, unsigned int Bits>
+class thread_pool::basic_executor_type : detail::thread_pool_bits
+{
+public:
+ /// Copy constructor.
+ basic_executor_type(const basic_executor_type& other) noexcept
+ : pool_(other.pool_),
+ allocator_(other.allocator_),
+ bits_(other.bits_)
+ {
+ if (Bits & outstanding_work_tracked)
+ if (pool_)
+ pool_->scheduler_.work_started();
+ }
+
+ /// Move constructor.
+ basic_executor_type(basic_executor_type&& other) noexcept
+ : pool_(other.pool_),
+ allocator_(static_cast<Allocator&&>(other.allocator_)),
+ bits_(other.bits_)
+ {
+ if (Bits & outstanding_work_tracked)
+ other.pool_ = 0;
+ }
+
+ /// Destructor.
+ ~basic_executor_type() noexcept
+ {
+ if (Bits & outstanding_work_tracked)
+ if (pool_)
+ pool_->scheduler_.work_finished();
+ }
+
+ /// Assignment operator.
+ basic_executor_type& operator=(const basic_executor_type& other) noexcept;
+
+ /// Move assignment operator.
+ basic_executor_type& operator=(basic_executor_type&& other) noexcept;
+
+#if !defined(GENERATING_DOCUMENTATION)
+private:
+ friend struct asio_require_fn::impl;
+ friend struct asio_prefer_fn::impl;
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ /// Obtain an executor with the @c blocking.possibly property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_thread_pool.executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::blocking.possibly); @endcode
+ */
+ constexpr basic_executor_type<Allocator,
+ ASIO_UNSPECIFIED(Bits & ~blocking_mask)>
+ require(execution::blocking_t::possibly_t) const
+ {
+ return basic_executor_type<Allocator, Bits & ~blocking_mask>(
+ pool_, allocator_, bits_ & ~blocking_mask);
+ }
+
+ /// Obtain an executor with the @c blocking.always property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_thread_pool.executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::blocking.always); @endcode
+ */
+ constexpr basic_executor_type<Allocator,
+ ASIO_UNSPECIFIED((Bits & ~blocking_mask) | blocking_always)>
+ require(execution::blocking_t::always_t) const
+ {
+ return basic_executor_type<Allocator,
+ ASIO_UNSPECIFIED((Bits & ~blocking_mask) | blocking_always)>(
+ pool_, allocator_, bits_ & ~blocking_mask);
+ }
+
+ /// Obtain an executor with the @c blocking.never property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_thread_pool.executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::blocking.never); @endcode
+ */
+ constexpr basic_executor_type<Allocator,
+ ASIO_UNSPECIFIED(Bits & ~blocking_mask)>
+ require(execution::blocking_t::never_t) const
+ {
+ return basic_executor_type<Allocator, Bits & ~blocking_mask>(
+ pool_, allocator_, (bits_ & ~blocking_mask) | blocking_never);
+ }
+
+ /// Obtain an executor with the @c relationship.fork property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_thread_pool.executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::relationship.fork); @endcode
+ */
+ constexpr basic_executor_type require(execution::relationship_t::fork_t) const
+ {
+ return basic_executor_type(pool_,
+ allocator_, bits_ & ~relationship_continuation);
+ }
+
+ /// Obtain an executor with the @c relationship.continuation property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_thread_pool.executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::relationship.continuation); @endcode
+ */
+ constexpr basic_executor_type require(
+ execution::relationship_t::continuation_t) const
+ {
+ return basic_executor_type(pool_,
+ allocator_, bits_ | relationship_continuation);
+ }
+
+ /// Obtain an executor with the @c outstanding_work.tracked property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_thread_pool.executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::outstanding_work.tracked); @endcode
+ */
+ constexpr basic_executor_type<Allocator,
+ ASIO_UNSPECIFIED(Bits | outstanding_work_tracked)>
+ require(execution::outstanding_work_t::tracked_t) const
+ {
+ return basic_executor_type<Allocator, Bits | outstanding_work_tracked>(
+ pool_, allocator_, bits_);
+ }
+
+ /// Obtain an executor with the @c outstanding_work.untracked property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_thread_pool.executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::outstanding_work.untracked); @endcode
+ */
+ constexpr basic_executor_type<Allocator,
+ ASIO_UNSPECIFIED(Bits & ~outstanding_work_tracked)>
+ require(execution::outstanding_work_t::untracked_t) const
+ {
+ return basic_executor_type<Allocator, Bits & ~outstanding_work_tracked>(
+ pool_, allocator_, bits_);
+ }
+
+ /// Obtain an executor with the specified @c allocator property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_thread_pool.executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::allocator(my_allocator)); @endcode
+ */
+ template <typename OtherAllocator>
+ constexpr basic_executor_type<OtherAllocator, Bits>
+ require(execution::allocator_t<OtherAllocator> a) const
+ {
+ return basic_executor_type<OtherAllocator, Bits>(
+ pool_, a.value(), bits_);
+ }
+
+ /// Obtain an executor with the default @c allocator property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::require customisation point.
+ *
+ * For example:
+ * @code auto ex1 = my_thread_pool.executor();
+ * auto ex2 = asio::require(ex1,
+ * asio::execution::allocator); @endcode
+ */
+ constexpr basic_executor_type<std::allocator<void>, Bits>
+ require(execution::allocator_t<void>) const
+ {
+ return basic_executor_type<std::allocator<void>, Bits>(
+ pool_, std::allocator<void>(), bits_);
+ }
+
+#if !defined(GENERATING_DOCUMENTATION)
+private:
+ friend struct asio_query_fn::impl;
+ friend struct asio::execution::detail::mapping_t<0>;
+ friend struct asio::execution::detail::outstanding_work_t<0>;
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+ /// Query the current value of the @c mapping property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_thread_pool.executor();
+ * if (asio::query(ex, asio::execution::mapping)
+ * == asio::execution::mapping.thread)
+ * ... @endcode
+ */
+ static constexpr execution::mapping_t query(execution::mapping_t) noexcept
+ {
+ return execution::mapping.thread;
+ }
+
+ /// Query the current value of the @c context property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_thread_pool.executor();
+ * asio::thread_pool& pool = asio::query(
+ * ex, asio::execution::context); @endcode
+ */
+ thread_pool& query(execution::context_t) const noexcept
+ {
+ return *pool_;
+ }
+
+ /// Query the current value of the @c blocking property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_thread_pool.executor();
+ * if (asio::query(ex, asio::execution::blocking)
+ * == asio::execution::blocking.always)
+ * ... @endcode
+ */
+ constexpr execution::blocking_t query(execution::blocking_t) const noexcept
+ {
+ return (bits_ & blocking_never)
+ ? execution::blocking_t(execution::blocking.never)
+ : ((Bits & blocking_always)
+ ? execution::blocking_t(execution::blocking.always)
+ : execution::blocking_t(execution::blocking.possibly));
+ }
+
+ /// Query the current value of the @c relationship property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_thread_pool.executor();
+ * if (asio::query(ex, asio::execution::relationship)
+ * == asio::execution::relationship.continuation)
+ * ... @endcode
+ */
+ constexpr execution::relationship_t query(
+ execution::relationship_t) const noexcept
+ {
+ return (bits_ & relationship_continuation)
+ ? execution::relationship_t(execution::relationship.continuation)
+ : execution::relationship_t(execution::relationship.fork);
+ }
+
+ /// Query the current value of the @c outstanding_work property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_thread_pool.executor();
+ * if (asio::query(ex, asio::execution::outstanding_work)
+ * == asio::execution::outstanding_work.tracked)
+ * ... @endcode
+ */
+ static constexpr execution::outstanding_work_t query(
+ execution::outstanding_work_t) noexcept
+ {
+ return (Bits & outstanding_work_tracked)
+ ? execution::outstanding_work_t(execution::outstanding_work.tracked)
+ : execution::outstanding_work_t(execution::outstanding_work.untracked);
+ }
+
+ /// Query the current value of the @c allocator property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_thread_pool.executor();
+ * auto alloc = asio::query(ex,
+ * asio::execution::allocator); @endcode
+ */
+ template <typename OtherAllocator>
+ constexpr Allocator query(
+ execution::allocator_t<OtherAllocator>) const noexcept
+ {
+ return allocator_;
+ }
+
+ /// Query the current value of the @c allocator property.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_thread_pool.executor();
+ * auto alloc = asio::query(ex,
+ * asio::execution::allocator); @endcode
+ */
+ constexpr Allocator query(execution::allocator_t<void>) const noexcept
+ {
+ return allocator_;
+ }
+
+ /// Query the occupancy (recommended number of work items) for the pool.
+ /**
+ * Do not call this function directly. It is intended for use with the
+ * asio::query customisation point.
+ *
+ * For example:
+ * @code auto ex = my_thread_pool.executor();
+ * std::size_t occupancy = asio::query(
+ * ex, asio::execution::occupancy); @endcode
+ */
+ std::size_t query(execution::occupancy_t) const noexcept
+ {
+ return static_cast<std::size_t>(pool_->num_threads_);
+ }
+
+public:
+ /// Determine whether the thread pool is running in the current thread.
+ /**
+ * @return @c true if the current thread is running the thread pool. Otherwise
+ * returns @c false.
+ */
+ bool running_in_this_thread() const noexcept;
+
+ /// Compare two executors for equality.
+ /**
+ * Two executors are equal if they refer to the same underlying thread pool.
+ */
+ friend bool operator==(const basic_executor_type& a,
+ const basic_executor_type& b) noexcept
+ {
+ return a.pool_ == b.pool_
+ && a.allocator_ == b.allocator_
+ && a.bits_ == b.bits_;
+ }
+
+ /// Compare two executors for inequality.
+ /**
+ * Two executors are equal if they refer to the same underlying thread pool.
+ */
+ friend bool operator!=(const basic_executor_type& a,
+ const basic_executor_type& b) noexcept
+ {
+ return a.pool_ != b.pool_
+ || a.allocator_ != b.allocator_
+ || a.bits_ != b.bits_;
+ }
+
+ /// Execution function.
+ template <typename Function>
+ void execute(Function&& f) const
+ {
+ this->do_execute(static_cast<Function&&>(f),
+ integral_constant<bool, (Bits & blocking_always) != 0>());
+ }
+
+public:
+#if !defined(ASIO_NO_TS_EXECUTORS)
+ /// Obtain the underlying execution context.
+ thread_pool& context() const 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 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 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 <typename Function, typename OtherAllocator>
+ void dispatch(Function&& f, const OtherAllocator& 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 <typename Function, typename OtherAllocator>
+ void post(Function&& f, const OtherAllocator& 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 <typename Function, typename OtherAllocator>
+ void defer(Function&& f, const OtherAllocator& a) const;
+#endif // !defined(ASIO_NO_TS_EXECUTORS)
+
+private:
+ friend class thread_pool;
+ template <typename, unsigned int> friend class basic_executor_type;
+
+ // Constructor used by thread_pool::get_executor().
+ explicit basic_executor_type(thread_pool& p) noexcept
+ : pool_(&p),
+ allocator_(),
+ bits_(0)
+ {
+ if (Bits & outstanding_work_tracked)
+ pool_->scheduler_.work_started();
+ }
+
+ // Constructor used by require().
+ basic_executor_type(thread_pool* p,
+ const Allocator& a, unsigned int bits) noexcept
+ : pool_(p),
+ allocator_(a),
+ bits_(bits)
+ {
+ if (Bits & outstanding_work_tracked)
+ if (pool_)
+ pool_->scheduler_.work_started();
+ }
+
+ /// Execution helper implementation for possibly and never blocking.
+ template <typename Function>
+ void do_execute(Function&& f, false_type) const;
+
+ /// Execution helper implementation for always blocking.
+ template <typename Function>
+ void do_execute(Function&& f, true_type) const;
+
+ // The underlying thread pool.
+ thread_pool* pool_;
+
+ // The allocator used for execution functions.
+ Allocator allocator_;
+
+ // The runtime-switched properties of the thread pool executor.
+ unsigned int bits_;
+};
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename Allocator, unsigned int Bits>
+struct equality_comparable<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename Allocator, unsigned int Bits, typename Function>
+struct execute_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ Function
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename Allocator, unsigned int Bits>
+struct require_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::blocking_t::possibly_t
+ > : asio::detail::thread_pool_bits
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::thread_pool::basic_executor_type<
+ Allocator, Bits & ~blocking_mask> result_type;
+};
+
+template <typename Allocator, unsigned int Bits>
+struct require_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::blocking_t::always_t
+ > : asio::detail::thread_pool_bits
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::thread_pool::basic_executor_type<Allocator,
+ (Bits & ~blocking_mask) | blocking_always> result_type;
+};
+
+template <typename Allocator, unsigned int Bits>
+struct require_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::blocking_t::never_t
+ > : asio::detail::thread_pool_bits
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::thread_pool::basic_executor_type<
+ Allocator, Bits & ~blocking_mask> result_type;
+};
+
+template <typename Allocator, unsigned int Bits>
+struct require_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::relationship_t::fork_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::thread_pool::basic_executor_type<
+ Allocator, Bits> result_type;
+};
+
+template <typename Allocator, unsigned int Bits>
+struct require_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::relationship_t::continuation_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::thread_pool::basic_executor_type<
+ Allocator, Bits> result_type;
+};
+
+template <typename Allocator, unsigned int Bits>
+struct require_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::outstanding_work_t::tracked_t
+ > : asio::detail::thread_pool_bits
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::thread_pool::basic_executor_type<
+ Allocator, Bits | outstanding_work_tracked> result_type;
+};
+
+template <typename Allocator, unsigned int Bits>
+struct require_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::outstanding_work_t::untracked_t
+ > : asio::detail::thread_pool_bits
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::thread_pool::basic_executor_type<
+ Allocator, Bits & ~outstanding_work_tracked> result_type;
+};
+
+template <typename Allocator, unsigned int Bits>
+struct require_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::allocator_t<void>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::thread_pool::basic_executor_type<
+ std::allocator<void>, Bits> result_type;
+};
+
+template <unsigned int Bits,
+ typename Allocator, typename OtherAllocator>
+struct require_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::allocator_t<OtherAllocator>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef asio::thread_pool::basic_executor_type<
+ OtherAllocator, Bits> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename Allocator, unsigned int Bits, typename Property>
+struct query_static_constexpr_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::outstanding_work_t
+ >::value
+ >::type
+ > : asio::detail::thread_pool_bits
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::execution::outstanding_work_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return (Bits & outstanding_work_tracked)
+ ? execution::outstanding_work_t(execution::outstanding_work.tracked)
+ : execution::outstanding_work_t(execution::outstanding_work.untracked);
+ }
+};
+
+template <typename Allocator, unsigned int Bits, typename Property>
+struct query_static_constexpr_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::mapping_t
+ >::value
+ >::type
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::execution::mapping_t::thread_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return result_type();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename Allocator, unsigned int Bits, typename Property>
+struct query_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::blocking_t
+ >::value
+ >::type
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::execution::blocking_t result_type;
+};
+
+template <typename Allocator, unsigned int Bits, typename Property>
+struct query_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::relationship_t
+ >::value
+ >::type
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::execution::relationship_t result_type;
+};
+
+template <typename Allocator, unsigned int Bits>
+struct query_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::occupancy_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef std::size_t result_type;
+};
+
+template <typename Allocator, unsigned int Bits>
+struct query_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::context_t
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef asio::thread_pool& result_type;
+};
+
+template <typename Allocator, unsigned int Bits>
+struct query_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::allocator_t<void>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef Allocator result_type;
+};
+
+template <typename Allocator, unsigned int Bits, typename OtherAllocator>
+struct query_member<
+ asio::thread_pool::basic_executor_type<Allocator, Bits>,
+ asio::execution::allocator_t<OtherAllocator>
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef Allocator result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+} // namespace traits
+
+namespace execution {
+
+template <>
+struct is_executor<thread_pool> : false_type
+{
+};
+
+} // namespace execution
+
+#endif // !defined(GENERATING_DOCUMENTATION)
+
+} // 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/3rdparty/asio/include/asio/time_traits.hpp b/3rdparty/asio/include/asio/time_traits.hpp
new file mode 100644
index 00000000000..f3980233eab
--- /dev/null
+++ b/3rdparty/asio/include/asio/time_traits.hpp
@@ -0,0 +1,86 @@
+//
+// time_traits.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// Time traits suitable for use with the deadline timer.
+template <typename Time>
+struct time_traits;
+
+/// Time traits specialised for posix_time.
+template <>
+struct time_traits<boost::posix_time::ptime>
+{
+ /// 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/3rdparty/asio/include/asio/traits/equality_comparable.hpp b/3rdparty/asio/include/asio/traits/equality_comparable.hpp
new file mode 100644
index 00000000000..0a6decf2d93
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/equality_comparable.hpp
@@ -0,0 +1,100 @@
+//
+// traits/equality_comparable.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_EQUALITY_COMPARABLE_HPP
+#define ASIO_TRAITS_EQUALITY_COMPARABLE_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"
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# define ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT 1
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename = void>
+struct equality_comparable_default;
+
+template <typename T, typename = void>
+struct equality_comparable;
+
+} // namespace traits
+namespace detail {
+
+struct no_equality_comparable
+{
+ static constexpr bool is_valid = false;
+ static constexpr bool is_noexcept = false;
+};
+
+#if defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename T, typename = void>
+struct equality_comparable_trait : no_equality_comparable
+{
+};
+
+template <typename T>
+struct equality_comparable_trait<T,
+ void_t<
+ decltype(
+ static_cast<void>(
+ static_cast<bool>(declval<const T>() == declval<const T>())
+ ),
+ static_cast<void>(
+ static_cast<bool>(declval<const T>() != declval<const T>())
+ )
+ )
+ >>
+{
+ static constexpr bool is_valid = true;
+
+ static constexpr bool is_noexcept =
+ noexcept(declval<const T>() == declval<const T>())
+ && noexcept(declval<const T>() != declval<const T>());
+};
+
+#else // defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename T, typename = void>
+struct equality_comparable_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value,
+ no_equality_comparable,
+ traits::equality_comparable<decay_t<T>>
+ >
+{
+};
+
+#endif // defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename>
+struct equality_comparable_default : detail::equality_comparable_trait<T>
+{
+};
+
+template <typename T, typename>
+struct equality_comparable : equality_comparable_default<T>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#endif // ASIO_TRAITS_EQUALITY_COMPARABLE_HPP
diff --git a/3rdparty/asio/include/asio/traits/execute_member.hpp b/3rdparty/asio/include/asio/traits/execute_member.hpp
new file mode 100644
index 00000000000..fc0760bef05
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/execute_member.hpp
@@ -0,0 +1,104 @@
+//
+// traits/execute_member.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_EXECUTE_MEMBER_HPP
+#define ASIO_TRAITS_EXECUTE_MEMBER_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"
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# define ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT 1
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename F, typename = void>
+struct execute_member_default;
+
+template <typename T, typename F, typename = void>
+struct execute_member;
+
+} // namespace traits
+namespace detail {
+
+struct no_execute_member
+{
+ static constexpr bool is_valid = false;
+ static constexpr bool is_noexcept = false;
+};
+
+#if defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename T, typename F, typename = void>
+struct execute_member_trait : no_execute_member
+{
+};
+
+template <typename T, typename F>
+struct execute_member_trait<T, F,
+ void_t<
+ decltype(declval<T>().execute(declval<F>()))
+ >>
+{
+ static constexpr bool is_valid = true;
+
+ using result_type = decltype(
+ declval<T>().execute(declval<F>()));
+
+ static constexpr bool is_noexcept =
+ noexcept(declval<T>().execute(declval<F>()));
+};
+
+#else // defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename T, typename F, typename = void>
+struct execute_member_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<F, decay_t<F>>::value,
+ no_execute_member,
+ traits::execute_member<
+ decay_t<T>,
+ decay_t<F>>
+ >
+{
+};
+
+#endif // defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename F, typename>
+struct execute_member_default :
+ detail::execute_member_trait<T, F>
+{
+};
+
+template <typename T, typename F, typename>
+struct execute_member :
+ execute_member_default<T, F>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_EXECUTE_MEMBER_HPP
diff --git a/3rdparty/asio/include/asio/traits/prefer_free.hpp b/3rdparty/asio/include/asio/traits/prefer_free.hpp
new file mode 100644
index 00000000000..c6104d636ed
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/prefer_free.hpp
@@ -0,0 +1,104 @@
+//
+// traits/prefer_free.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_PREFER_FREE_HPP
+#define ASIO_TRAITS_PREFER_FREE_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"
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# define ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT 1
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename Property, typename = void>
+struct prefer_free_default;
+
+template <typename T, typename Property, typename = void>
+struct prefer_free;
+
+} // namespace traits
+namespace detail {
+
+struct no_prefer_free
+{
+ static constexpr bool is_valid = false;
+ static constexpr bool is_noexcept = false;
+};
+
+#if defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct prefer_free_trait : no_prefer_free
+{
+};
+
+template <typename T, typename Property>
+struct prefer_free_trait<T, Property,
+ void_t<
+ decltype(prefer(declval<T>(), declval<Property>()))
+ >>
+{
+ static constexpr bool is_valid = true;
+
+ using result_type = decltype(
+ prefer(declval<T>(), declval<Property>()));
+
+ static constexpr bool is_noexcept =
+ noexcept(prefer(declval<T>(), declval<Property>()));
+};
+
+#else // defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct prefer_free_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<Property, decay_t<Property>>::value,
+ no_prefer_free,
+ traits::prefer_free<
+ decay_t<T>,
+ decay_t<Property>>
+ >
+{
+};
+
+#endif // defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename Property, typename>
+struct prefer_free_default :
+ detail::prefer_free_trait<T, Property>
+{
+};
+
+template <typename T, typename Property, typename>
+struct prefer_free :
+ prefer_free_default<T, Property>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_PREFER_FREE_HPP
diff --git a/3rdparty/asio/include/asio/traits/prefer_member.hpp b/3rdparty/asio/include/asio/traits/prefer_member.hpp
new file mode 100644
index 00000000000..278c25c9964
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/prefer_member.hpp
@@ -0,0 +1,104 @@
+//
+// traits/prefer_member.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_PREFER_MEMBER_HPP
+#define ASIO_TRAITS_PREFER_MEMBER_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"
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# define ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT 1
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename Property, typename = void>
+struct prefer_member_default;
+
+template <typename T, typename Property, typename = void>
+struct prefer_member;
+
+} // namespace traits
+namespace detail {
+
+struct no_prefer_member
+{
+ static constexpr bool is_valid = false;
+ static constexpr bool is_noexcept = false;
+};
+
+#if defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct prefer_member_trait : no_prefer_member
+{
+};
+
+template <typename T, typename Property>
+struct prefer_member_trait<T, Property,
+ void_t<
+ decltype(declval<T>().prefer(declval<Property>()))
+ >>
+{
+ static constexpr bool is_valid = true;
+
+ using result_type = decltype(
+ declval<T>().prefer(declval<Property>()));
+
+ static constexpr bool is_noexcept =
+ noexcept(declval<T>().prefer(declval<Property>()));
+};
+
+#else // defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct prefer_member_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<Property, decay_t<Property>>::value,
+ no_prefer_member,
+ traits::prefer_member<
+ decay_t<T>,
+ decay_t<Property>>
+ >
+{
+};
+
+#endif // defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename Property, typename>
+struct prefer_member_default :
+ detail::prefer_member_trait<T, Property>
+{
+};
+
+template <typename T, typename Property, typename>
+struct prefer_member :
+ prefer_member_default<T, Property>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_PREFER_MEMBER_HPP
diff --git a/3rdparty/asio/include/asio/traits/query_free.hpp b/3rdparty/asio/include/asio/traits/query_free.hpp
new file mode 100644
index 00000000000..a54016adddc
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/query_free.hpp
@@ -0,0 +1,104 @@
+//
+// traits/query_free.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_QUERY_FREE_HPP
+#define ASIO_TRAITS_QUERY_FREE_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"
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# define ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT 1
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename Property, typename = void>
+struct query_free_default;
+
+template <typename T, typename Property, typename = void>
+struct query_free;
+
+} // namespace traits
+namespace detail {
+
+struct no_query_free
+{
+ static constexpr bool is_valid = false;
+ static constexpr bool is_noexcept = false;
+};
+
+#if defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct query_free_trait : no_query_free
+{
+};
+
+template <typename T, typename Property>
+struct query_free_trait<T, Property,
+ void_t<
+ decltype(query(declval<T>(), declval<Property>()))
+ >>
+{
+ static constexpr bool is_valid = true;
+
+ using result_type = decltype(
+ query(declval<T>(), declval<Property>()));
+
+ static constexpr bool is_noexcept =
+ noexcept(query(declval<T>(), declval<Property>()));
+};
+
+#else // defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct query_free_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<Property, decay_t<Property>>::value,
+ no_query_free,
+ traits::query_free<
+ decay_t<T>,
+ decay_t<Property>>
+ >
+{
+};
+
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename Property, typename>
+struct query_free_default :
+ detail::query_free_trait<T, Property>
+{
+};
+
+template <typename T, typename Property, typename>
+struct query_free :
+ query_free_default<T, Property>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_QUERY_FREE_HPP
diff --git a/3rdparty/asio/include/asio/traits/query_member.hpp b/3rdparty/asio/include/asio/traits/query_member.hpp
new file mode 100644
index 00000000000..2202c9dab4b
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/query_member.hpp
@@ -0,0 +1,104 @@
+//
+// traits/query_member.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_QUERY_MEMBER_HPP
+#define ASIO_TRAITS_QUERY_MEMBER_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"
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# define ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT 1
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename Property, typename = void>
+struct query_member_default;
+
+template <typename T, typename Property, typename = void>
+struct query_member;
+
+} // namespace traits
+namespace detail {
+
+struct no_query_member
+{
+ static constexpr bool is_valid = false;
+ static constexpr bool is_noexcept = false;
+};
+
+#if defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct query_member_trait : no_query_member
+{
+};
+
+template <typename T, typename Property>
+struct query_member_trait<T, Property,
+ void_t<
+ decltype(declval<T>().query(declval<Property>()))
+ >>
+{
+ static constexpr bool is_valid = true;
+
+ using result_type = decltype(
+ declval<T>().query(declval<Property>()));
+
+ static constexpr bool is_noexcept =
+ noexcept(declval<T>().query(declval<Property>()));
+};
+
+#else // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct query_member_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<Property, decay_t<Property>>::value,
+ no_query_member,
+ traits::query_member<
+ decay_t<T>,
+ decay_t<Property>>
+ >
+{
+};
+
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename Property, typename>
+struct query_member_default :
+ detail::query_member_trait<T, Property>
+{
+};
+
+template <typename T, typename Property, typename>
+struct query_member :
+ query_member_default<T, Property>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_QUERY_MEMBER_HPP
diff --git a/3rdparty/asio/include/asio/traits/query_static_constexpr_member.hpp b/3rdparty/asio/include/asio/traits/query_static_constexpr_member.hpp
new file mode 100644
index 00000000000..95bdb7db376
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/query_static_constexpr_member.hpp
@@ -0,0 +1,101 @@
+//
+// traits/query_static_constexpr_member.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_QUERY_STATIC_CONSTEXPR_MEMBER_HPP
+#define ASIO_TRAITS_QUERY_STATIC_CONSTEXPR_MEMBER_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"
+
+#if defined(ASIO_HAS_CONSTANT_EXPRESSION_SFINAE) \
+ && defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# define ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT 1
+#endif // defined(ASIO_HAS_CONSTANT_EXPRESSION_SFINAE)
+ // && defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename Property, typename = void>
+struct query_static_constexpr_member_default;
+
+template <typename T, typename Property, typename = void>
+struct query_static_constexpr_member;
+
+} // namespace traits
+namespace detail {
+
+struct no_query_static_constexpr_member
+{
+ static constexpr bool is_valid = false;
+};
+
+template <typename T, typename Property, typename = void>
+struct query_static_constexpr_member_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<Property, decay_t<Property>>::value,
+ no_query_static_constexpr_member,
+ traits::query_static_constexpr_member<
+ decay_t<T>,
+ decay_t<Property>>
+ >
+{
+};
+
+#if defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename T, typename Property>
+struct query_static_constexpr_member_trait<T, Property,
+ enable_if_t<
+ (static_cast<void>(T::query(Property{})), true)
+ >>
+{
+ static constexpr bool is_valid = true;
+
+ using result_type = decltype(T::query(Property{}));
+
+ static constexpr bool is_noexcept = noexcept(T::query(Property{}));
+
+ static constexpr result_type value() noexcept(is_noexcept)
+ {
+ return T::query(Property{});
+ }
+};
+
+#endif // defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename Property, typename>
+struct query_static_constexpr_member_default :
+ detail::query_static_constexpr_member_trait<T, Property>
+{
+};
+
+template <typename T, typename Property, typename>
+struct query_static_constexpr_member :
+ query_static_constexpr_member_default<T, Property>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_QUERY_STATIC_CONSTEXPR_MEMBER_HPP
diff --git a/3rdparty/asio/include/asio/traits/require_concept_free.hpp b/3rdparty/asio/include/asio/traits/require_concept_free.hpp
new file mode 100644
index 00000000000..1ae2ad7801d
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/require_concept_free.hpp
@@ -0,0 +1,104 @@
+//
+// traits/require_concept_free.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_REQUIRE_CONCEPT_FREE_HPP
+#define ASIO_TRAITS_REQUIRE_CONCEPT_FREE_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"
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# define ASIO_HAS_DEDUCED_REQUIRE_CONCEPT_FREE_TRAIT 1
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename Property, typename = void>
+struct require_concept_free_default;
+
+template <typename T, typename Property, typename = void>
+struct require_concept_free;
+
+} // namespace traits
+namespace detail {
+
+struct no_require_concept_free
+{
+ static constexpr bool is_valid = false;
+ static constexpr bool is_noexcept = false;
+};
+
+#if defined(ASIO_HAS_DEDUCED_REQUIRE_CONCEPT_FREE_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct require_concept_free_trait : no_require_concept_free
+{
+};
+
+template <typename T, typename Property>
+struct require_concept_free_trait<T, Property,
+ void_t<
+ decltype(require_concept(declval<T>(), declval<Property>()))
+ >>
+{
+ static constexpr bool is_valid = true;
+
+ using result_type = decltype(
+ require_concept(declval<T>(), declval<Property>()));
+
+ static constexpr bool is_noexcept =
+ noexcept(require_concept(declval<T>(), declval<Property>()));
+};
+
+#else // defined(ASIO_HAS_DEDUCED_REQUIRE_CONCEPT_FREE_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct require_concept_free_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<Property, decay_t<Property>>::value,
+ no_require_concept_free,
+ traits::require_concept_free<
+ decay_t<T>,
+ decay_t<Property>>
+ >
+{
+};
+
+#endif // defined(ASIO_HAS_DEDUCED_REQUIRE_CONCEPT_FREE_TRAIT)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename Property, typename>
+struct require_concept_free_default :
+ detail::require_concept_free_trait<T, Property>
+{
+};
+
+template <typename T, typename Property, typename>
+struct require_concept_free :
+ require_concept_free_default<T, Property>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_REQUIRE_CONCEPT_FREE_HPP
diff --git a/3rdparty/asio/include/asio/traits/require_concept_member.hpp b/3rdparty/asio/include/asio/traits/require_concept_member.hpp
new file mode 100644
index 00000000000..f6b6535e9bd
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/require_concept_member.hpp
@@ -0,0 +1,104 @@
+//
+// traits/require_concept_member.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_REQUIRE_CONCEPT_MEMBER_HPP
+#define ASIO_TRAITS_REQUIRE_CONCEPT_MEMBER_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"
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# define ASIO_HAS_DEDUCED_REQUIRE_CONCEPT_MEMBER_TRAIT 1
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename Property, typename = void>
+struct require_concept_member_default;
+
+template <typename T, typename Property, typename = void>
+struct require_concept_member;
+
+} // namespace traits
+namespace detail {
+
+struct no_require_concept_member
+{
+ static constexpr bool is_valid = false;
+ static constexpr bool is_noexcept = false;
+};
+
+#if defined(ASIO_HAS_DEDUCED_REQUIRE_CONCEPT_MEMBER_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct require_concept_member_trait : no_require_concept_member
+{
+};
+
+template <typename T, typename Property>
+struct require_concept_member_trait<T, Property,
+ void_t<
+ decltype(declval<T>().require_concept(declval<Property>()))
+ >>
+{
+ static constexpr bool is_valid = true;
+
+ using result_type = decltype(
+ declval<T>().require_concept(declval<Property>()));
+
+ static constexpr bool is_noexcept =
+ noexcept(declval<T>().require_concept(declval<Property>()));
+};
+
+#else // defined(ASIO_HAS_DEDUCED_REQUIRE_CONCEPT_MEMBER_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct require_concept_member_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<Property, decay_t<Property>>::value,
+ no_require_concept_member,
+ traits::require_concept_member<
+ decay_t<T>,
+ decay_t<Property>>
+ >
+{
+};
+
+#endif // defined(ASIO_HAS_DEDUCED_REQUIRE_CONCEPT_MEMBER_TRAIT)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename Property, typename>
+struct require_concept_member_default :
+ detail::require_concept_member_trait<T, Property>
+{
+};
+
+template <typename T, typename Property, typename>
+struct require_concept_member :
+ require_concept_member_default<T, Property>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_REQUIRE_CONCEPT_MEMBER_HPP
diff --git a/3rdparty/asio/include/asio/traits/require_free.hpp b/3rdparty/asio/include/asio/traits/require_free.hpp
new file mode 100644
index 00000000000..02b558676b1
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/require_free.hpp
@@ -0,0 +1,104 @@
+//
+// traits/require_free.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_REQUIRE_FREE_HPP
+#define ASIO_TRAITS_REQUIRE_FREE_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"
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# define ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT 1
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename Property, typename = void>
+struct require_free_default;
+
+template <typename T, typename Property, typename = void>
+struct require_free;
+
+} // namespace traits
+namespace detail {
+
+struct no_require_free
+{
+ static constexpr bool is_valid = false;
+ static constexpr bool is_noexcept = false;
+};
+
+#if defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct require_free_trait : no_require_free
+{
+};
+
+template <typename T, typename Property>
+struct require_free_trait<T, Property,
+ void_t<
+ decltype(require(declval<T>(), declval<Property>()))
+ >>
+{
+ static constexpr bool is_valid = true;
+
+ using result_type = decltype(
+ require(declval<T>(), declval<Property>()));
+
+ static constexpr bool is_noexcept =
+ noexcept(require(declval<T>(), declval<Property>()));
+};
+
+#else // defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct require_free_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<Property, decay_t<Property>>::value,
+ no_require_free,
+ traits::require_free<
+ decay_t<T>,
+ decay_t<Property>>
+ >
+{
+};
+
+#endif // defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename Property, typename>
+struct require_free_default :
+ detail::require_free_trait<T, Property>
+{
+};
+
+template <typename T, typename Property, typename>
+struct require_free :
+ require_free_default<T, Property>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_REQUIRE_FREE_HPP
diff --git a/3rdparty/asio/include/asio/traits/require_member.hpp b/3rdparty/asio/include/asio/traits/require_member.hpp
new file mode 100644
index 00000000000..af733e3b270
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/require_member.hpp
@@ -0,0 +1,104 @@
+//
+// traits/require_member.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_REQUIRE_MEMBER_HPP
+#define ASIO_TRAITS_REQUIRE_MEMBER_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"
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# define ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT 1
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename Property, typename = void>
+struct require_member_default;
+
+template <typename T, typename Property, typename = void>
+struct require_member;
+
+} // namespace traits
+namespace detail {
+
+struct no_require_member
+{
+ static constexpr bool is_valid = false;
+ static constexpr bool is_noexcept = false;
+};
+
+#if defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct require_member_trait : no_require_member
+{
+};
+
+template <typename T, typename Property>
+struct require_member_trait<T, Property,
+ void_t<
+ decltype(declval<T>().require(declval<Property>()))
+ >>
+{
+ static constexpr bool is_valid = true;
+
+ using result_type = decltype(
+ declval<T>().require(declval<Property>()));
+
+ static constexpr bool is_noexcept =
+ noexcept(declval<T>().require(declval<Property>()));
+};
+
+#else // defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename T, typename Property, typename = void>
+struct require_member_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<Property, decay_t<Property>>::value,
+ no_require_member,
+ traits::require_member<
+ decay_t<T>,
+ decay_t<Property>>
+ >
+{
+};
+
+#endif // defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename Property, typename>
+struct require_member_default :
+ detail::require_member_trait<T, Property>
+{
+};
+
+template <typename T, typename Property, typename>
+struct require_member :
+ require_member_default<T, Property>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_REQUIRE_MEMBER_HPP
diff --git a/3rdparty/asio/include/asio/traits/static_query.hpp b/3rdparty/asio/include/asio/traits/static_query.hpp
new file mode 100644
index 00000000000..b177a9d5304
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/static_query.hpp
@@ -0,0 +1,102 @@
+//
+// traits/static_query.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_STATIC_QUERY_HPP
+#define ASIO_TRAITS_STATIC_QUERY_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"
+
+#if defined(ASIO_HAS_VARIABLE_TEMPLATES) \
+ && defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+# define ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT 1
+#endif // defined(ASIO_HAS_VARIABLE_TEMPLATES)
+ // && defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename Property, typename = void>
+struct static_query_default;
+
+template <typename T, typename Property, typename = void>
+struct static_query;
+
+} // namespace traits
+namespace detail {
+
+struct no_static_query
+{
+ static constexpr bool is_valid = false;
+ static constexpr bool is_noexcept = false;
+};
+
+template <typename T, typename Property, typename = void>
+struct static_query_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<Property, decay_t<Property>>::value,
+ no_static_query,
+ traits::static_query<
+ decay_t<T>,
+ decay_t<Property>>
+ >
+{
+};
+
+#if defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+
+template <typename T, typename Property>
+struct static_query_trait<T, Property,
+ void_t<
+ decltype(decay_t<Property>::template static_query_v<T>)
+ >>
+{
+ static constexpr bool is_valid = true;
+
+ using result_type = decltype(
+ decay_t<Property>::template static_query_v<T>);
+
+ static constexpr bool is_noexcept =
+ noexcept(decay_t<Property>::template static_query_v<T>);
+
+ static constexpr result_type value() noexcept(is_noexcept)
+ {
+ return decay_t<Property>::template static_query_v<T>;
+ }
+};
+
+#endif // defined(ASIO_HAS_DEDUCED_STATIC_QUERY_TRAIT)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename Property, typename>
+struct static_query_default : detail::static_query_trait<T, Property>
+{
+};
+
+template <typename T, typename Property, typename>
+struct static_query : static_query_default<T, Property>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_STATIC_QUERY_HPP
diff --git a/3rdparty/asio/include/asio/traits/static_require.hpp b/3rdparty/asio/include/asio/traits/static_require.hpp
new file mode 100644
index 00000000000..4ef4a617390
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/static_require.hpp
@@ -0,0 +1,115 @@
+//
+// traits/static_require.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_STATIC_REQUIRE_HPP
+#define ASIO_TRAITS_STATIC_REQUIRE_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/traits/static_query.hpp"
+
+#define ASIO_HAS_DEDUCED_STATIC_REQUIRE_TRAIT 1
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename Property, typename = void>
+struct static_require_default;
+
+template <typename T, typename Property, typename = void>
+struct static_require;
+
+} // namespace traits
+namespace detail {
+
+struct no_static_require
+{
+ static constexpr bool is_valid = false;
+};
+
+template <typename T, typename Property, typename = void>
+struct static_require_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<Property, decay_t<Property>>::value,
+ no_static_require,
+ traits::static_require<
+ decay_t<T>,
+ decay_t<Property>>
+ >
+{
+};
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+template <typename T, typename Property>
+struct static_require_trait<T, Property,
+ enable_if_t<
+ decay_t<Property>::value() == traits::static_query<T, Property>::value()
+ >>
+{
+ static constexpr bool is_valid = true;
+};
+
+#else // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+false_type static_require_test(...);
+
+template <typename T, typename Property>
+true_type static_require_test(T*, Property*,
+ enable_if_t<
+ Property::value() == traits::static_query<T, Property>::value()
+ >* = 0);
+
+template <typename T, typename Property>
+struct has_static_require
+{
+ static constexpr bool value =
+ decltype((static_require_test)(
+ static_cast<T*>(0), static_cast<Property*>(0)))::value;
+};
+
+template <typename T, typename Property>
+struct static_require_trait<T, Property,
+ enable_if_t<
+ has_static_require<decay_t<T>,
+ decay_t<Property>>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+};
+
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename Property, typename>
+struct static_require_default : detail::static_require_trait<T, Property>
+{
+};
+
+template <typename T, typename Property, typename>
+struct static_require : static_require_default<T, Property>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_STATIC_REQUIRE_HPP
diff --git a/3rdparty/asio/include/asio/traits/static_require_concept.hpp b/3rdparty/asio/include/asio/traits/static_require_concept.hpp
new file mode 100644
index 00000000000..6861f46aa0d
--- /dev/null
+++ b/3rdparty/asio/include/asio/traits/static_require_concept.hpp
@@ -0,0 +1,116 @@
+//
+// traits/static_require_concept.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_TRAITS_STATIC_REQUIRE_CONCEPT_HPP
+#define ASIO_TRAITS_STATIC_REQUIRE_CONCEPT_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/traits/static_query.hpp"
+
+#define ASIO_HAS_DEDUCED_STATIC_REQUIRE_CONCEPT_TRAIT 1
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace traits {
+
+template <typename T, typename Property, typename = void>
+struct static_require_concept_default;
+
+template <typename T, typename Property, typename = void>
+struct static_require_concept;
+
+} // namespace traits
+namespace detail {
+
+struct no_static_require_concept
+{
+ static constexpr bool is_valid = false;
+};
+
+template <typename T, typename Property, typename = void>
+struct static_require_concept_trait :
+ conditional_t<
+ is_same<T, decay_t<T>>::value
+ && is_same<Property, decay_t<Property>>::value,
+ no_static_require_concept,
+ traits::static_require_concept<
+ decay_t<T>,
+ decay_t<Property>>
+ >
+{
+};
+
+#if defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+template <typename T, typename Property>
+struct static_require_concept_trait<T, Property,
+ enable_if_t<
+ decay_t<Property>::value() == traits::static_query<T, Property>::value()
+ >>
+{
+ static constexpr bool is_valid = true;
+};
+
+#else // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+false_type static_require_concept_test(...);
+
+template <typename T, typename Property>
+true_type static_require_concept_test(T*, Property*,
+ enable_if_t<
+ Property::value() == traits::static_query<T, Property>::value()
+ >* = 0);
+
+template <typename T, typename Property>
+struct has_static_require_concept
+{
+ static constexpr bool value =
+ decltype((static_require_concept_test)(
+ static_cast<T*>(0), static_cast<Property*>(0)))::value;
+};
+
+template <typename T, typename Property>
+struct static_require_concept_trait<T, Property,
+ enable_if_t<
+ has_static_require_concept<decay_t<T>,
+ decay_t<Property>>::value
+ >>
+{
+ static constexpr bool is_valid = true;
+};
+
+#endif // defined(ASIO_HAS_WORKING_EXPRESSION_SFINAE)
+
+} // namespace detail
+namespace traits {
+
+template <typename T, typename Property, typename>
+struct static_require_concept_default :
+ detail::static_require_concept_trait<T, Property>
+{
+};
+
+template <typename T, typename Property, typename>
+struct static_require_concept : static_require_concept_default<T, Property>
+{
+};
+
+} // namespace traits
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_TRAITS_STATIC_REQUIRE_CONCEPT_HPP
diff --git a/3rdparty/asio/include/asio/ts/buffer.hpp b/3rdparty/asio/include/asio/ts/buffer.hpp
new file mode 100644
index 00000000000..6c74a50ca66
--- /dev/null
+++ b/3rdparty/asio/include/asio/ts/buffer.hpp
@@ -0,0 +1,24 @@
+//
+// ts/buffer.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/ts/executor.hpp b/3rdparty/asio/include/asio/ts/executor.hpp
new file mode 100644
index 00000000000..df28bbf44bb
--- /dev/null
+++ b/3rdparty/asio/include/asio/ts/executor.hpp
@@ -0,0 +1,35 @@
+//
+// ts/executor.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/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/any_io_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/3rdparty/asio/include/asio/ts/internet.hpp b/3rdparty/asio/include/asio/ts/internet.hpp
new file mode 100644
index 00000000000..eb2c35cd628
--- /dev/null
+++ b/3rdparty/asio/include/asio/ts/internet.hpp
@@ -0,0 +1,40 @@
+//
+// ts/internet.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/ts/io_context.hpp b/3rdparty/asio/include/asio/ts/io_context.hpp
new file mode 100644
index 00000000000..c688f160e7a
--- /dev/null
+++ b/3rdparty/asio/include/asio/ts/io_context.hpp
@@ -0,0 +1,20 @@
+//
+// ts/io_context.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/ts/net.hpp b/3rdparty/asio/include/asio/ts/net.hpp
new file mode 100644
index 00000000000..f82113b930a
--- /dev/null
+++ b/3rdparty/asio/include/asio/ts/net.hpp
@@ -0,0 +1,26 @@
+//
+// ts/net.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/ts/netfwd.hpp b/3rdparty/asio/include/asio/ts/netfwd.hpp
new file mode 100644
index 00000000000..a575b6e497a
--- /dev/null
+++ b/3rdparty/asio/include/asio/ts/netfwd.hpp
@@ -0,0 +1,236 @@
+//
+// ts/netfwd.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include "asio/detail/chrono.hpp"
+
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+# include "asio/detail/date_time_fwd.hpp"
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+
+#if !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+#include "asio/execution/blocking.hpp"
+#include "asio/execution/outstanding_work.hpp"
+#include "asio/execution/relationship.hpp"
+#endif // !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+#if !defined(GENERATING_DOCUMENTATION)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+class execution_context;
+
+template <typename T, typename Executor>
+class executor_binder;
+
+#if !defined(ASIO_EXECUTOR_WORK_GUARD_DECL)
+#define ASIO_EXECUTOR_WORK_GUARD_DECL
+
+template <typename Executor, typename = void, typename = void>
+class executor_work_guard;
+
+#endif // !defined(ASIO_EXECUTOR_WORK_GUARD_DECL)
+
+template <typename Blocking, typename Relationship, typename Allocator>
+class basic_system_executor;
+
+#if defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+class executor;
+
+typedef executor any_io_executor;
+
+#else // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+namespace execution {
+
+#if !defined(ASIO_EXECUTION_ANY_EXECUTOR_FWD_DECL)
+#define ASIO_EXECUTION_ANY_EXECUTOR_FWD_DECL
+
+template <typename... SupportableProperties>
+class any_executor;
+
+#endif // !defined(ASIO_EXECUTION_ANY_EXECUTOR_FWD_DECL)
+
+template <typename U>
+struct context_as_t;
+
+template <typename Property>
+struct prefer_only;
+
+} // namespace execution
+
+class any_io_executor;
+
+#endif // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
+
+template <typename Executor>
+class strand;
+
+class io_context;
+
+template <typename Clock>
+struct wait_traits;
+
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+
+template <typename Time>
+struct time_traits;
+
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+
+#if !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL)
+#define ASIO_BASIC_WAITABLE_TIMER_FWD_DECL
+
+template <typename Clock,
+ typename WaitTraits = wait_traits<Clock>,
+ typename Executor = any_io_executor>
+class basic_waitable_timer;
+
+#endif // !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL)
+
+typedef basic_waitable_timer<chrono::system_clock> system_timer;
+
+typedef basic_waitable_timer<chrono::steady_clock> steady_timer;
+
+typedef basic_waitable_timer<chrono::high_resolution_clock>
+ high_resolution_timer;
+
+#if !defined(ASIO_BASIC_SOCKET_FWD_DECL)
+#define ASIO_BASIC_SOCKET_FWD_DECL
+
+template <typename Protocol, typename Executor = any_io_executor>
+class basic_socket;
+
+#endif // !defined(ASIO_BASIC_SOCKET_FWD_DECL)
+
+#if !defined(ASIO_BASIC_DATAGRAM_SOCKET_FWD_DECL)
+#define ASIO_BASIC_DATAGRAM_SOCKET_FWD_DECL
+
+template <typename Protocol, typename Executor = any_io_executor>
+class basic_datagram_socket;
+
+#endif // !defined(ASIO_BASIC_DATAGRAM_SOCKET_FWD_DECL)
+
+#if !defined(ASIO_BASIC_STREAM_SOCKET_FWD_DECL)
+#define ASIO_BASIC_STREAM_SOCKET_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Protocol, typename Executor = any_io_executor>
+class basic_stream_socket;
+
+#endif // !defined(ASIO_BASIC_STREAM_SOCKET_FWD_DECL)
+
+#if !defined(ASIO_BASIC_SOCKET_ACCEPTOR_FWD_DECL)
+#define ASIO_BASIC_SOCKET_ACCEPTOR_FWD_DECL
+
+template <typename Protocol, typename Executor = any_io_executor>
+class basic_socket_acceptor;
+
+#endif // !defined(ASIO_BASIC_SOCKET_ACCEPTOR_FWD_DECL)
+
+#if !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL)
+#define ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL
+
+// Forward declaration with defaulted arguments.
+template <typename Protocol,
+#if defined(ASIO_HAS_BOOST_DATE_TIME) \
+ || defined(GENERATING_DOCUMENTATION)
+ typename Clock = boost::posix_time::ptime,
+ typename WaitTraits = time_traits<Clock>>
+#else
+ typename Clock = chrono::steady_clock,
+ typename WaitTraits = wait_traits<Clock>>
+#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 <typename Protocol,
+#if defined(ASIO_HAS_BOOST_DATE_TIME) \
+ || defined(GENERATING_DOCUMENTATION)
+ typename Clock = boost::posix_time::ptime,
+ typename WaitTraits = time_traits<Clock>>
+#else
+ typename Clock = chrono::steady_clock,
+ typename WaitTraits = wait_traits<Clock>>
+#endif
+class basic_socket_iostream;
+
+#endif // !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL)
+
+namespace ip {
+
+class address;
+
+class address_v4;
+
+class address_v6;
+
+template <typename Address>
+class basic_address_iterator;
+
+typedef basic_address_iterator<address_v4> address_v4_iterator;
+
+typedef basic_address_iterator<address_v6> address_v6_iterator;
+
+template <typename Address>
+class basic_address_range;
+
+typedef basic_address_range<address_v4> address_v4_range;
+
+typedef basic_address_range<address_v6> address_v6_range;
+
+class network_v4;
+
+class network_v6;
+
+template <typename InternetProtocol>
+class basic_endpoint;
+
+template <typename InternetProtocol>
+class basic_resolver_entry;
+
+template <typename InternetProtocol>
+class basic_resolver_results;
+
+#if !defined(ASIO_IP_BASIC_RESOLVER_FWD_DECL)
+#define ASIO_IP_BASIC_RESOLVER_FWD_DECL
+
+template <typename InternetProtocol, typename Executor = any_io_executor>
+class basic_resolver;
+
+#endif // !defined(ASIO_IP_BASIC_RESOLVER_FWD_DECL)
+
+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/3rdparty/asio/include/asio/ts/socket.hpp b/3rdparty/asio/include/asio/ts/socket.hpp
new file mode 100644
index 00000000000..d54e0778264
--- /dev/null
+++ b/3rdparty/asio/include/asio/ts/socket.hpp
@@ -0,0 +1,27 @@
+//
+// ts/socket.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/ts/timer.hpp b/3rdparty/asio/include/asio/ts/timer.hpp
new file mode 100644
index 00000000000..3b3d6facf11
--- /dev/null
+++ b/3rdparty/asio/include/asio/ts/timer.hpp
@@ -0,0 +1,26 @@
+//
+// ts/timer.hpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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/3rdparty/asio/include/asio/unyield.hpp b/3rdparty/asio/include/asio/unyield.hpp
new file mode 100644
index 00000000000..f843d6137a2
--- /dev/null
+++ b/3rdparty/asio/include/asio/unyield.hpp
@@ -0,0 +1,21 @@
+//
+// unyield.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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/3rdparty/asio/include/asio/use_awaitable.hpp b/3rdparty/asio/include/asio/use_awaitable.hpp
new file mode 100644
index 00000000000..6dd42f3d6e3
--- /dev/null
+++ b/3rdparty/asio/include/asio/use_awaitable.hpp
@@ -0,0 +1,161 @@
+//
+// use_awaitable.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_AWAITABLE_HPP
+#define ASIO_USE_AWAITABLE_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 "asio/awaitable.hpp"
+#include "asio/detail/handler_tracking.hpp"
+
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+# include "asio/detail/source_location.hpp"
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+
+/// A @ref completion_token that represents the currently executing coroutine.
+/**
+ * The @c use_awaitable_t class, with its value @c use_awaitable, is used to
+ * represent the currently executing coroutine. This completion token may be
+ * passed as a handler to an asynchronous operation. For example:
+ *
+ * @code awaitable<void> my_coroutine()
+ * {
+ * std::size_t n = co_await my_socket.async_read_some(buffer, use_awaitable);
+ * ...
+ * } @endcode
+ *
+ * When used with co_await, the initiating function (@c 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 <typename Executor = any_io_executor>
+struct use_awaitable_t
+{
+ /// Default constructor.
+ constexpr use_awaitable_t(
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ detail::source_location location = detail::source_location::current()
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ )
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# if defined(ASIO_HAS_SOURCE_LOCATION)
+ : file_name_(location.file_name()),
+ line_(location.line()),
+ function_name_(location.function_name())
+# else // defined(ASIO_HAS_SOURCE_LOCATION)
+ : file_name_(0),
+ line_(0),
+ function_name_(0)
+# endif // defined(ASIO_HAS_SOURCE_LOCATION)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ {
+ }
+
+ /// Constructor used to specify file name, line, and function name.
+ constexpr use_awaitable_t(const char* file_name,
+ int line, const char* function_name)
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+ : file_name_(file_name),
+ line_(line),
+ function_name_(function_name)
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+ {
+#if !defined(ASIO_ENABLE_HANDLER_TRACKING)
+ (void)file_name;
+ (void)line;
+ (void)function_name;
+#endif // !defined(ASIO_ENABLE_HANDLER_TRACKING)
+ }
+
+ /// Adapts an executor to add the @c use_awaitable_t completion token as the
+ /// default.
+ template <typename InnerExecutor>
+ struct executor_with_default : InnerExecutor
+ {
+ /// Specify @c use_awaitable_t as the default completion token type.
+ typedef use_awaitable_t default_completion_token_type;
+
+ /// Construct the adapted executor from the inner executor type.
+ template <typename InnerExecutor1>
+ executor_with_default(const InnerExecutor1& ex,
+ constraint_t<
+ conditional_t<
+ !is_same<InnerExecutor1, executor_with_default>::value,
+ is_convertible<InnerExecutor1, InnerExecutor>,
+ false_type
+ >::value
+ > = 0) noexcept
+ : InnerExecutor(ex)
+ {
+ }
+ };
+
+ /// Type alias to adapt an I/O object to use @c use_awaitable_t as its
+ /// default completion token type.
+ template <typename T>
+ using as_default_on_t = typename T::template rebind_executor<
+ executor_with_default<typename T::executor_type>>::other;
+
+ /// Function helper to adapt an I/O object to use @c use_awaitable_t as its
+ /// default completion token type.
+ template <typename T>
+ static typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other
+ as_default_on(T&& object)
+ {
+ return typename decay_t<T>::template rebind_executor<
+ executor_with_default<typename decay_t<T>::executor_type>
+ >::other(static_cast<T&&>(object));
+ }
+
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+ const char* file_name_;
+ int line_;
+ const char* function_name_;
+#endif // defined(ASIO_ENABLE_HANDLER_TRACKING)
+};
+
+/// A @ref completion_token object that represents the currently executing
+/// coroutine.
+/**
+ * See the documentation for asio::use_awaitable_t for a usage example.
+ */
+#if defined(GENERATING_DOCUMENTATION)
+constexpr use_awaitable_t<> use_awaitable;
+#else
+constexpr use_awaitable_t<> use_awaitable(0, 0, 0);
+#endif
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/use_awaitable.hpp"
+
+#endif // defined(ASIO_HAS_CO_AWAIT) || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_USE_AWAITABLE_HPP
diff --git a/3rdparty/asio/include/asio/use_future.hpp b/3rdparty/asio/include/asio/use_future.hpp
new file mode 100644
index 00000000000..26f5ae1fed0
--- /dev/null
+++ b/3rdparty/asio/include/asio/use_future.hpp
@@ -0,0 +1,159 @@
+//
+// use_future.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include "asio/detail/future.hpp"
+
+#if defined(ASIO_HAS_STD_FUTURE_CLASS) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include <memory>
+#include "asio/detail/type_traits.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+template <typename Function, typename Allocator>
+class packaged_token;
+
+template <typename Function, typename Allocator, typename Result>
+class packaged_handler;
+
+} // namespace detail
+
+/// A @ref completion_token type that causes an asynchronous operation to return
+/// a future.
+/**
+ * The use_future_t class is a completion token type that is used to indicate
+ * that an asynchronous operation should return a std::future object. A
+ * use_future_t object may be passed as a completion token to an asynchronous
+ * operation, typically using the special value @c asio::use_future. For
+ * example:
+ *
+ * @code std::future<std::size_t> 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 <typename Allocator = std::allocator<void>>
+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.
+ 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 <typename OtherAllocator>
+ use_future_t<OtherAllocator> operator[](const OtherAllocator& allocator) const
+ {
+ return use_future_t<OtherAllocator>(allocator);
+ }
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ /// Specify an alternate allocator.
+ template <typename OtherAllocator>
+ use_future_t<OtherAllocator> rebind(const OtherAllocator& allocator) const
+ {
+ return use_future_t<OtherAllocator>(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<std::size_t> 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 <typename Function>
+#if defined(GENERATING_DOCUMENTATION)
+ unspecified
+#else // defined(GENERATING_DOCUMENTATION)
+ detail::packaged_token<decay_t<Function>, Allocator>
+#endif // defined(GENERATING_DOCUMENTATION)
+ operator()(Function&& f) const;
+
+private:
+ // Helper type to ensure that use_future can be constexpr default-constructed
+ // even when std::allocator<void> can't be.
+ struct std_allocator_void
+ {
+ constexpr std_allocator_void()
+ {
+ }
+
+ operator std::allocator<void>() const
+ {
+ return std::allocator<void>();
+ }
+ };
+
+ conditional_t<
+ is_same<std::allocator<void>, Allocator>::value,
+ std_allocator_void, Allocator> allocator_;
+};
+
+/// A @ref completion_token object that causes an asynchronous operation to
+/// return a future.
+/**
+ * See the documentation for asio::use_future_t for a usage example.
+ */
+constexpr use_future_t<> use_future;
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/use_future.hpp"
+
+#endif // defined(ASIO_HAS_STD_FUTURE_CLASS)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_USE_FUTURE_HPP
diff --git a/3rdparty/asio/include/asio/uses_executor.hpp b/3rdparty/asio/include/asio/uses_executor.hpp
new file mode 100644
index 00000000000..ff475cad4a1
--- /dev/null
+++ b/3rdparty/asio/include/asio/uses_executor.hpp
@@ -0,0 +1,67 @@
+//
+// uses_executor.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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.
+ constexpr executor_arg_t() 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.
+ */
+constexpr executor_arg_t executor_arg;
+
+/// 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 <typename T, typename Executor>
+struct uses_executor : false_type {};
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // ASIO_USES_EXECUTOR_HPP
diff --git a/3rdparty/asio/include/asio/version.hpp b/3rdparty/asio/include/asio/version.hpp
new file mode 100644
index 00000000000..c52fdd45b58
--- /dev/null
+++ b/3rdparty/asio/include/asio/version.hpp
@@ -0,0 +1,23 @@
+//
+// version.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 103002 // 1.30.2
+
+#endif // ASIO_VERSION_HPP
diff --git a/3rdparty/asio/include/asio/wait_traits.hpp b/3rdparty/asio/include/asio/wait_traits.hpp
new file mode 100644
index 00000000000..5f5e876da66
--- /dev/null
+++ b/3rdparty/asio/include/asio/wait_traits.hpp
@@ -0,0 +1,56 @@
+//
+// wait_traits.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename Clock>
+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/3rdparty/asio/include/asio/windows/basic_object_handle.hpp b/3rdparty/asio/include/asio/windows/basic_object_handle.hpp
new file mode 100644
index 00000000000..bb10efc2a0a
--- /dev/null
+++ b/3rdparty/asio/include/asio/windows/basic_object_handle.hpp
@@ -0,0 +1,485 @@
+//
+// windows/basic_object_handle.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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_HAS_WINDOWS_OBJECT_HANDLE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include <utility>
+#include "asio/any_io_executor.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/win_object_handle_service.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace windows {
+
+/// Provides object-oriented handle functionality.
+/**
+ * The windows::basic_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.
+ */
+template <typename Executor = any_io_executor>
+class basic_object_handle
+{
+private:
+ class initiate_async_wait;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the handle type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The handle type when rebound to the specified executor.
+ typedef basic_object_handle<Executor1> other;
+ };
+
+ /// The native representation of a handle.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#else
+ typedef asio::detail::win_object_handle_service::native_handle_type
+ native_handle_type;
+#endif
+
+ /// An object handle is always the lowest layer.
+ typedef basic_object_handle lowest_layer_type;
+
+ /// Construct an object handle without opening it.
+ /**
+ * This constructor creates an object handle without opening it.
+ *
+ * @param ex The I/O executor that the object handle will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * object handle.
+ */
+ explicit basic_object_handle(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// Construct an object handle without opening it.
+ /**
+ * This constructor creates an object handle without opening it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the object handle will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the object handle.
+ */
+ template <typename ExecutionContext>
+ explicit basic_object_handle(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// Construct an object handle on an existing native handle.
+ /**
+ * This constructor creates an object handle object to hold an existing native
+ * handle.
+ *
+ * @param ex The I/O executor that the object handle will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the
+ * object handle.
+ *
+ * @param native_handle The new underlying handle implementation.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_object_handle(const executor_type& ex,
+ const native_handle_type& native_handle)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(), native_handle, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Construct an object handle on an existing native handle.
+ /**
+ * This constructor creates an object handle object to hold an existing native
+ * handle.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the object handle will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the object handle.
+ *
+ * @param native_handle The new underlying handle implementation.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_object_handle(ExecutionContext& context,
+ const native_handle_type& native_handle,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(), native_handle, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// 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 basic_object_handle(const executor_type&)
+ * constructor.
+ */
+ basic_object_handle(basic_object_handle&& other)
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// 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 basic_object_handle(const executor_type&)
+ * constructor.
+ */
+ basic_object_handle& operator=(basic_object_handle&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ // All handles have access to each other's implementations.
+ template <typename Executor1>
+ friend class basic_object_handle;
+
+ /// Move-construct an object handle from a handle of another executor type.
+ /**
+ * 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 basic_object_handle(const executor_type&)
+ * constructor.
+ */
+ template<typename Executor1>
+ basic_object_handle(basic_object_handle<Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// Move-assign an object handle from a handle of another executor type.
+ /**
+ * 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 basic_object_handle(const executor_type&)
+ * constructor.
+ */
+ template<typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_object_handle&
+ > operator=(basic_object_handle<Executor1>&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return impl_.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;
+ impl_.get_service().assign(impl_.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)
+ {
+ impl_.get_service().assign(impl_.get_implementation(), handle, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Determine whether the handle is open.
+ bool is_open() const
+ {
+ return impl_.get_service().is_open(impl_.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;
+ impl_.get_service().close(impl_.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)
+ {
+ impl_.get_service().close(impl_.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 impl_.get_service().native_handle(impl_.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;
+ impl_.get_service().cancel(impl_.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)
+ {
+ impl_.get_service().cancel(impl_.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;
+ impl_.get_service().wait(impl_.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)
+ {
+ impl_.get_service().wait(impl_.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 is an initiating function for an @ref
+ * asynchronous_operation, and always returns immediately.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the wait completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code) @endcode
+ */
+ template <
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code))
+ WaitToken = default_completion_token_t<executor_type>>
+ auto async_wait(
+ WaitToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WaitToken, void (asio::error_code)>(
+ declval<initiate_async_wait>(), token))
+ {
+ return async_initiate<WaitToken, void (asio::error_code)>(
+ initiate_async_wait(this), token);
+ }
+
+private:
+ // Disallow copying and assignment.
+ basic_object_handle(const basic_object_handle&) = delete;
+ basic_object_handle& operator=(const basic_object_handle&) = delete;
+
+ class initiate_async_wait
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_wait(basic_object_handle* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WaitHandler>
+ void operator()(WaitHandler&& handler) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WaitHandler> handler2(handler);
+ self_->impl_.get_service().async_wait(
+ self_->impl_.get_implementation(),
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_object_handle* self_;
+ };
+
+ asio::detail::io_object_impl<
+ asio::detail::win_object_handle_service, Executor> impl_;
+};
+
+} // namespace windows
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_WINDOWS_BASIC_OBJECT_HANDLE_HPP
diff --git a/3rdparty/asio/include/asio/windows/basic_overlapped_handle.hpp b/3rdparty/asio/include/asio/windows/basic_overlapped_handle.hpp
new file mode 100644
index 00000000000..8b8475b0006
--- /dev/null
+++ b/3rdparty/asio/include/asio/windows/basic_overlapped_handle.hpp
@@ -0,0 +1,455 @@
+//
+// windows/basic_overlapped_handle.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_OVERLAPPED_HANDLE_HPP
+#define ASIO_WINDOWS_BASIC_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_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \
+ || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include <cstddef>
+#include <utility>
+#include "asio/any_io_executor.hpp"
+#include "asio/async_result.hpp"
+#include "asio/detail/io_object_impl.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/detail/win_iocp_handle_service.hpp"
+#include "asio/error.hpp"
+#include "asio/execution_context.hpp"
+
+#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.
+ */
+template <typename Executor = any_io_executor>
+class basic_overlapped_handle
+{
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the handle type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The handle type when rebound to the specified executor.
+ typedef basic_overlapped_handle<Executor1> other;
+ };
+
+ /// The native representation of a handle.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#else
+ typedef asio::detail::win_iocp_handle_service::native_handle_type
+ native_handle_type;
+#endif
+
+ /// An overlapped_handle is always the lowest layer.
+ typedef basic_overlapped_handle lowest_layer_type;
+
+ /// Construct an overlapped handle without opening it.
+ /**
+ * This constructor creates an overlapped handle without opening it.
+ *
+ * @param ex The I/O executor that the overlapped handle will use, by default,
+ * to dispatch handlers for any asynchronous operations performed on the
+ * overlapped handle.
+ */
+ explicit basic_overlapped_handle(const executor_type& ex)
+ : impl_(0, ex)
+ {
+ }
+
+ /// Construct an overlapped handle without opening it.
+ /**
+ * This constructor creates an overlapped handle without opening it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the overlapped handle will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the overlapped handle.
+ */
+ template <typename ExecutionContext>
+ explicit basic_overlapped_handle(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(0, 0, context)
+ {
+ }
+
+ /// Construct an overlapped handle on an existing native handle.
+ /**
+ * This constructor creates an overlapped handle object to hold an existing
+ * native handle.
+ *
+ * @param ex The I/O executor that the overlapped handle will use, by default,
+ * to dispatch handlers for any asynchronous operations performed on the
+ * overlapped handle.
+ *
+ * @param native_handle The new underlying handle implementation.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_overlapped_handle(const executor_type& ex,
+ const native_handle_type& native_handle)
+ : impl_(0, ex)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(), native_handle, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// Construct an overlapped handle on an existing native handle.
+ /**
+ * This constructor creates an overlapped handle object to hold an existing
+ * native handle.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the overlapped handle will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the overlapped handle.
+ *
+ * @param native_handle The new underlying handle implementation.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_overlapped_handle(ExecutionContext& context,
+ const native_handle_type& native_handle,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(0, 0, context)
+ {
+ asio::error_code ec;
+ impl_.get_service().assign(impl_.get_implementation(), native_handle, ec);
+ asio::detail::throw_error(ec, "assign");
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_overlapped_handle(basic_overlapped_handle&& other)
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// 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(const executor_type&)
+ * constructor.
+ */
+ basic_overlapped_handle& operator=(basic_overlapped_handle&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ // All overlapped handles have access to each other's implementations.
+ template <typename Executor1>
+ friend class basic_overlapped_handle;
+
+ /// Move-construct an overlapped handle from a handle of another executor
+ /// type.
+ /**
+ * 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(const executor_type&)
+ * constructor.
+ */
+ template<typename Executor1>
+ basic_overlapped_handle(basic_overlapped_handle<Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : impl_(std::move(other.impl_))
+ {
+ }
+
+ /// Move-assign an overlapped handle from a handle of another executor type.
+ /**
+ * 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(const executor_type&)
+ * constructor.
+ */
+ template<typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_overlapped_handle&
+ > operator=(basic_overlapped_handle<Executor1>&& other)
+ {
+ impl_ = std::move(other.impl_);
+ return *this;
+ }
+
+ /// Get the executor associated with the object.
+ const executor_type& get_executor() noexcept
+ {
+ return impl_.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;
+ impl_.get_service().assign(impl_.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)
+ {
+ impl_.get_service().assign(impl_.get_implementation(), handle, ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Determine whether the handle is open.
+ bool is_open() const
+ {
+ return impl_.get_service().is_open(impl_.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;
+ impl_.get_service().close(impl_.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)
+ {
+ impl_.get_service().close(impl_.get_implementation(), ec);
+ ASIO_SYNC_OP_VOID_RETURN(ec);
+ }
+
+ /// Release ownership of the underlying native handle.
+ /**
+ * This function causes all outstanding asynchronous operations to finish
+ * immediately, and the handlers for cancelled operations will be passed the
+ * asio::error::operation_aborted error. Ownership of the native handle
+ * 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 = impl_.get_service().release(
+ impl_.get_implementation(), ec);
+ asio::detail::throw_error(ec, "release");
+ return s;
+ }
+
+ /// Release ownership of the underlying native handle.
+ /**
+ * This function causes all outstanding asynchronous operations to finish
+ * immediately, and the handlers for cancelled operations will be passed the
+ * asio::error::operation_aborted error. Ownership of the native handle
+ * 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 impl_.get_service().release(impl_.get_implementation(), 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 impl_.get_service().native_handle(impl_.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;
+ impl_.get_service().cancel(impl_.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)
+ {
+ impl_.get_service().cancel(impl_.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.
+ */
+ ~basic_overlapped_handle()
+ {
+ }
+
+ asio::detail::io_object_impl<
+ asio::detail::win_iocp_handle_service, Executor> impl_;
+
+private:
+ // Disallow copying and assignment.
+ basic_overlapped_handle(const basic_overlapped_handle&) = delete;
+ basic_overlapped_handle& operator=(
+ const basic_overlapped_handle&) = delete;
+};
+
+} // 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(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_WINDOWS_BASIC_OVERLAPPED_HANDLE_HPP
diff --git a/3rdparty/asio/include/asio/windows/basic_random_access_handle.hpp b/3rdparty/asio/include/asio/windows/basic_random_access_handle.hpp
new file mode 100644
index 00000000000..e66e943c6b5
--- /dev/null
+++ b/3rdparty/asio/include/asio/windows/basic_random_access_handle.hpp
@@ -0,0 +1,567 @@
+//
+// windows/basic_random_access_handle.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include "asio/windows/basic_overlapped_handle.hpp"
+
+#if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace windows {
+
+/// Provides random-access handle functionality.
+/**
+ * The windows::basic_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.
+ */
+template <typename Executor = any_io_executor>
+class basic_random_access_handle
+ : public basic_overlapped_handle<Executor>
+{
+private:
+ class initiate_async_write_some_at;
+ class initiate_async_read_some_at;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the handle type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The handle type when rebound to the specified executor.
+ typedef basic_random_access_handle<Executor1> other;
+ };
+
+ /// The native representation of a handle.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#else
+ typedef asio::detail::win_iocp_handle_service::native_handle_type
+ native_handle_type;
+#endif
+
+ /// Construct a random-access handle without opening it.
+ /**
+ * This constructor creates a random-access handle without opening it.
+ *
+ * @param ex The I/O executor that the random-access handle will use, by
+ * default, to dispatch handlers for any asynchronous operations performed on
+ * the random-access handle.
+ */
+ explicit basic_random_access_handle(const executor_type& ex)
+ : basic_overlapped_handle<Executor>(ex)
+ {
+ }
+
+ /// Construct a random-access handle without opening it.
+ /**
+ * This constructor creates a random-access handle without opening it. The
+ * handle needs to be opened or assigned before data can be written to or read
+ * from it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the random-access handle will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the random-access handle.
+ */
+ template <typename ExecutionContext>
+ explicit basic_random_access_handle(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_overlapped_handle<Executor>(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 ex The I/O executor that the random-access handle will use, by
+ * default, to dispatch handlers for any asynchronous operations performed on
+ * the random-access handle.
+ *
+ * @param handle The new underlying handle implementation.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_random_access_handle(const executor_type& ex,
+ const native_handle_type& handle)
+ : basic_overlapped_handle<Executor>(ex, handle)
+ {
+ }
+
+ /// 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 context An execution context which provides the I/O executor that
+ * the random-access handle will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the random-access handle.
+ *
+ * @param handle The new underlying handle implementation.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_random_access_handle(ExecutionContext& context,
+ const native_handle_type& handle,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_overlapped_handle<Executor>(context, handle)
+ {
+ }
+
+ /// 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 basic_random_access_handle(const executor_type&)
+ * constructor.
+ */
+ basic_random_access_handle(basic_random_access_handle&& other)
+ : basic_overlapped_handle<Executor>(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 basic_random_access_handle(const executor_type&)
+ * constructor.
+ */
+ basic_random_access_handle& operator=(basic_random_access_handle&& other)
+ {
+ basic_overlapped_handle<Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// Move-construct a random-access handle from a handle of another executor
+ /// type.
+ /**
+ * 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 basic_random_access_handle(const executor_type&)
+ * constructor.
+ */
+ template<typename Executor1>
+ basic_random_access_handle(basic_random_access_handle<Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_overlapped_handle<Executor>(std::move(other))
+ {
+ }
+
+ /// Move-assign a random-access handle from a handle of another executor
+ /// type.
+ /**
+ * 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 basic_random_access_handle(const executor_type&)
+ * constructor.
+ */
+ template<typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_random_access_handle&
+ > operator=(basic_random_access_handle<Executor1>&& other)
+ {
+ basic_overlapped_handle<Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// 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 <typename ConstBufferSequence>
+ std::size_t write_some_at(uint64_t offset,
+ const ConstBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().write_some_at(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t write_some_at(uint64_t offset,
+ const ConstBufferSequence& buffers, asio::error_code& ec)
+ {
+ return this->impl_.get_service().write_some_at(
+ this->impl_.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. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_write_some_at(uint64_t offset, const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_write_some_at>(), token, offset, buffers))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_write_some_at(this), token, offset, buffers);
+ }
+
+ /// 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 <typename MutableBufferSequence>
+ std::size_t read_some_at(uint64_t offset,
+ const MutableBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().read_some_at(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t read_some_at(uint64_t offset,
+ const MutableBufferSequence& buffers, asio::error_code& ec)
+ {
+ return this->impl_.get_service().read_some_at(
+ this->impl_.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. It is an initiating function for an @ref asynchronous_operation,
+ * and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_read_some_at(uint64_t offset, const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_read_some_at>(), token, offset, buffers))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_read_some_at(this), token, offset, buffers);
+ }
+
+private:
+ class initiate_async_write_some_at
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_write_some_at(basic_random_access_handle* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ uint64_t offset, const ConstBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_write_some_at(
+ self_->impl_.get_implementation(), offset, buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_random_access_handle* self_;
+ };
+
+ class initiate_async_read_some_at
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_read_some_at(basic_random_access_handle* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ uint64_t offset, const MutableBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_read_some_at(
+ self_->impl_.get_implementation(), offset, buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_random_access_handle* self_;
+ };
+};
+
+} // namespace windows
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_WINDOWS_BASIC_RANDOM_ACCESS_HANDLE_HPP
diff --git a/3rdparty/asio/include/asio/windows/basic_stream_handle.hpp b/3rdparty/asio/include/asio/windows/basic_stream_handle.hpp
new file mode 100644
index 00000000000..0331d9dfa03
--- /dev/null
+++ b/3rdparty/asio/include/asio/windows/basic_stream_handle.hpp
@@ -0,0 +1,551 @@
+//
+// windows/basic_stream_handle.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+#include "asio/windows/basic_overlapped_handle.hpp"
+
+#if defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace windows {
+
+/// Provides stream-oriented handle functionality.
+/**
+ * The windows::basic_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.
+ */
+template <typename Executor = any_io_executor>
+class basic_stream_handle
+ : public basic_overlapped_handle<Executor>
+{
+private:
+ class initiate_async_write_some;
+ class initiate_async_read_some;
+
+public:
+ /// The type of the executor associated with the object.
+ typedef Executor executor_type;
+
+ /// Rebinds the handle type to another executor.
+ template <typename Executor1>
+ struct rebind_executor
+ {
+ /// The handle type when rebound to the specified executor.
+ typedef basic_stream_handle<Executor1> other;
+ };
+
+ /// The native representation of a handle.
+#if defined(GENERATING_DOCUMENTATION)
+ typedef implementation_defined native_handle_type;
+#else
+ typedef asio::detail::win_iocp_handle_service::native_handle_type
+ native_handle_type;
+#endif
+
+ /// Construct a stream handle without opening it.
+ /**
+ * This constructor creates a stream handle without opening it.
+ *
+ * @param ex The I/O executor that the stream handle will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the stream
+ * handle.
+ */
+ explicit basic_stream_handle(const executor_type& ex)
+ : basic_overlapped_handle<Executor>(ex)
+ {
+ }
+
+ /// Construct a stream handle without opening it.
+ /**
+ * This constructor creates a stream handle without opening it. The handle
+ * needs to be opened or assigned before data can be written to or read from
+ * it.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the stream handle will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the stream handle.
+ */
+ template <typename ExecutionContext>
+ explicit basic_stream_handle(ExecutionContext& context,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_overlapped_handle<Executor>(context)
+ {
+ }
+
+ /// Construct a stream handle on an existing native handle.
+ /**
+ * This constructor creates a stream handle object to hold an existing native
+ * handle.
+ *
+ * @param ex The I/O executor that the stream handle will use, by default, to
+ * dispatch handlers for any asynchronous operations performed on the stream
+ * handle.
+ *
+ * @param handle The new underlying handle implementation.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ basic_stream_handle(const executor_type& ex, const native_handle_type& handle)
+ : basic_overlapped_handle<Executor>(ex, handle)
+ {
+ }
+
+ /// Construct a stream handle on an existing native handle.
+ /**
+ * This constructor creates a stream handle object to hold an existing native
+ * handle.
+ *
+ * @param context An execution context which provides the I/O executor that
+ * the stream handle will use, by default, to dispatch handlers for any
+ * asynchronous operations performed on the stream handle.
+ *
+ * @param handle The new underlying handle implementation.
+ *
+ * @throws asio::system_error Thrown on failure.
+ */
+ template <typename ExecutionContext>
+ basic_stream_handle(ExecutionContext& context,
+ const native_handle_type& handle,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : basic_overlapped_handle<Executor>(context, handle)
+ {
+ }
+
+ /// 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 basic_stream_handle(const executor_type&)
+ * constructor.
+ */
+ basic_stream_handle(basic_stream_handle&& other)
+ : basic_overlapped_handle<Executor>(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 basic_stream_handle(const executor_type&)
+ * constructor.
+ */
+ basic_stream_handle& operator=(basic_stream_handle&& other)
+ {
+ basic_overlapped_handle<Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// Move-construct a stream handle from a handle of another executor type.
+ /**
+ * 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 basic_stream_handle(const executor_type&)
+ * constructor.
+ */
+ template<typename Executor1>
+ basic_stream_handle(basic_stream_handle<Executor1>&& other,
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ defaulted_constraint
+ > = defaulted_constraint())
+ : basic_overlapped_handle<Executor>(std::move(other))
+ {
+ }
+
+ /// Move-assign a stream handle from a handle of another executor type.
+ /**
+ * 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 basic_stream_handle(const executor_type&)
+ * constructor.
+ */
+ template<typename Executor1>
+ constraint_t<
+ is_convertible<Executor1, Executor>::value,
+ basic_stream_handle&
+ > operator=(basic_stream_handle<Executor1>&& other)
+ {
+ basic_overlapped_handle<Executor>::operator=(std::move(other));
+ return *this;
+ }
+
+ /// 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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().write_some(
+ this->impl_.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 <typename ConstBufferSequence>
+ std::size_t write_some(const ConstBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().write_some(
+ this->impl_.get_implementation(), buffers, ec);
+ }
+
+ /// Start an asynchronous write.
+ /**
+ * This function is used to asynchronously write data to the stream handle.
+ * It is an initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<executor_type>>
+ auto async_write_some(const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_write_some>(), token, buffers))
+ {
+ return async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_write_some(this), token, buffers);
+ }
+
+ /// 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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers)
+ {
+ asio::error_code ec;
+ std::size_t s = this->impl_.get_service().read_some(
+ this->impl_.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 <typename MutableBufferSequence>
+ std::size_t read_some(const MutableBufferSequence& buffers,
+ asio::error_code& ec)
+ {
+ return this->impl_.get_service().read_some(
+ this->impl_.get_implementation(), buffers, ec);
+ }
+
+ /// Start an asynchronous read.
+ /**
+ * This function is used to asynchronously read data from the stream handle.
+ * It is an initiating function for an @ref asynchronous_operation, and 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the read completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * @li @c cancellation_type::total
+ */
+ template <typename MutableBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) ReadToken = default_completion_token_t<executor_type>>
+ auto async_read_some(const MutableBufferSequence& buffers,
+ ReadToken&& token = default_completion_token_t<executor_type>())
+ -> decltype(
+ async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ declval<initiate_async_read_some>(), token, buffers))
+ {
+ return async_initiate<ReadToken,
+ void (asio::error_code, std::size_t)>(
+ initiate_async_read_some(this), token, buffers);
+ }
+
+private:
+ class initiate_async_write_some
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_write_some(basic_stream_handle* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename WriteHandler, typename ConstBufferSequence>
+ void operator()(WriteHandler&& handler,
+ const ConstBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<WriteHandler> handler2(handler);
+ self_->impl_.get_service().async_write_some(
+ self_->impl_.get_implementation(), buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_stream_handle* self_;
+ };
+
+ class initiate_async_read_some
+ {
+ public:
+ typedef Executor executor_type;
+
+ explicit initiate_async_read_some(basic_stream_handle* self)
+ : self_(self)
+ {
+ }
+
+ const executor_type& get_executor() const noexcept
+ {
+ return self_->get_executor();
+ }
+
+ template <typename ReadHandler, typename MutableBufferSequence>
+ void operator()(ReadHandler&& handler,
+ const MutableBufferSequence& buffers) const
+ {
+ // 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;
+
+ detail::non_const_lvalue<ReadHandler> handler2(handler);
+ self_->impl_.get_service().async_read_some(
+ self_->impl_.get_implementation(), buffers,
+ handler2.value, self_->impl_.get_executor());
+ }
+
+ private:
+ basic_stream_handle* self_;
+ };
+};
+
+} // namespace windows
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_HAS_WINDOWS_STREAM_HANDLE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_WINDOWS_BASIC_STREAM_HANDLE_HPP
diff --git a/3rdparty/asio/include/asio/windows/object_handle.hpp b/3rdparty/asio/include/asio/windows/object_handle.hpp
new file mode 100644
index 00000000000..243d9455ce2
--- /dev/null
+++ b/3rdparty/asio/include/asio/windows/object_handle.hpp
@@ -0,0 +1,38 @@
+//
+// windows/object_handle.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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/windows/basic_object_handle.hpp"
+
+namespace asio {
+namespace windows {
+
+/// Typedef for the typical usage of an object handle.
+typedef basic_object_handle<> object_handle;
+
+} // namespace windows
+} // namespace asio
+
+#endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_WINDOWS_OBJECT_HANDLE_HPP
diff --git a/3rdparty/asio/include/asio/windows/overlapped_handle.hpp b/3rdparty/asio/include/asio/windows/overlapped_handle.hpp
new file mode 100644
index 00000000000..fc12865b48c
--- /dev/null
+++ b/3rdparty/asio/include/asio/windows/overlapped_handle.hpp
@@ -0,0 +1,39 @@
+//
+// windows/overlapped_handle.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \
+ || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/windows/basic_overlapped_handle.hpp"
+
+namespace asio {
+namespace windows {
+
+/// Typedef for the typical usage of an overlapped handle.
+typedef basic_overlapped_handle<> overlapped_handle;
+
+} // namespace windows
+} // namespace asio
+
+#endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE)
+ // || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_WINDOWS_OVERLAPPED_HANDLE_HPP
diff --git a/3rdparty/asio/include/asio/windows/overlapped_ptr.hpp b/3rdparty/asio/include/asio/windows/overlapped_ptr.hpp
new file mode 100644
index 00000000000..e1e6f8c841f
--- /dev/null
+++ b/3rdparty/asio/include/asio/windows/overlapped_ptr.hpp
@@ -0,0 +1,145 @@
+//
+// windows/overlapped_ptr.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <typename ExecutionContext, typename Handler>
+ explicit overlapped_ptr(ExecutionContext& context,
+ Handler&& handler,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ : impl_(context.get_executor(), static_cast<Handler&&>(handler))
+ {
+ }
+
+ /// Construct an overlapped_ptr to contain the specified handler.
+ template <typename Executor, typename Handler>
+ explicit overlapped_ptr(const Executor& ex,
+ Handler&& handler,
+ constraint_t<
+ execution::is_executor<Executor>::value
+ || is_executor<Executor>::value
+ > = 0)
+ : impl_(ex, static_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 <typename ExecutionContext, typename Handler>
+ void reset(ExecutionContext& context, Handler&& handler,
+ constraint_t<
+ is_convertible<ExecutionContext&, execution_context&>::value
+ > = 0)
+ {
+ impl_.reset(context.get_executor(), static_cast<Handler&&>(handler));
+ }
+
+ /// Reset to contain the specified handler, freeing any current OVERLAPPED
+ /// object.
+ template <typename Executor, typename Handler>
+ void reset(const Executor& ex, Handler&& handler,
+ constraint_t<
+ execution::is_executor<Executor>::value
+ || is_executor<Executor>::value
+ > = 0)
+ {
+ impl_.reset(ex, static_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/3rdparty/asio/include/asio/windows/random_access_handle.hpp b/3rdparty/asio/include/asio/windows/random_access_handle.hpp
new file mode 100644
index 00000000000..88dfa36ecdd
--- /dev/null
+++ b/3rdparty/asio/include/asio/windows/random_access_handle.hpp
@@ -0,0 +1,37 @@
+//
+// windows/random_access_handle.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/windows/basic_random_access_handle.hpp"
+
+namespace asio {
+namespace windows {
+
+/// Typedef for the typical usage of a random-access handle.
+typedef basic_random_access_handle<> random_access_handle;
+
+} // namespace windows
+} // namespace asio
+
+#endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_HPP
diff --git a/3rdparty/asio/include/asio/windows/stream_handle.hpp b/3rdparty/asio/include/asio/windows/stream_handle.hpp
new file mode 100644
index 00000000000..4b88b8cb699
--- /dev/null
+++ b/3rdparty/asio/include/asio/windows/stream_handle.hpp
@@ -0,0 +1,37 @@
+//
+// windows/stream_handle.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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"
+
+#if defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/windows/basic_stream_handle.hpp"
+
+namespace asio {
+namespace windows {
+
+/// Typedef for the typical usage of a stream-oriented handle.
+typedef basic_stream_handle<> stream_handle;
+
+} // namespace windows
+} // namespace asio
+
+#endif // defined(ASIO_HAS_WINDOWS_STREAM_HANDLE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_WINDOWS_STREAM_HANDLE_HPP
diff --git a/3rdparty/asio/include/asio/writable_pipe.hpp b/3rdparty/asio/include/asio/writable_pipe.hpp
new file mode 100644
index 00000000000..27f408a4956
--- /dev/null
+++ b/3rdparty/asio/include/asio/writable_pipe.hpp
@@ -0,0 +1,35 @@
+//
+// writable_pipe.hpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ASIO_WRITABLE_PIPE_HPP
+#define ASIO_WRITABLE_PIPE_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_PIPE) \
+ || defined(GENERATING_DOCUMENTATION)
+
+#include "asio/basic_writable_pipe.hpp"
+
+namespace asio {
+
+/// Typedef for the typical usage of a writable pipe.
+typedef basic_writable_pipe<> writable_pipe;
+
+} // namespace asio
+
+#endif // defined(ASIO_HAS_PIPE)
+ // || defined(GENERATING_DOCUMENTATION)
+
+#endif // ASIO_WRITABLE_PIPE_HPP
diff --git a/3rdparty/asio/include/asio/write.hpp b/3rdparty/asio/include/asio/write.hpp
new file mode 100644
index 00000000000..ca3f002c025
--- /dev/null
+++ b/3rdparty/asio/include/asio/write.hpp
@@ -0,0 +1,1414 @@
+//
+// write.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include "asio/async_result.hpp"
+#include "asio/buffer.hpp"
+#include "asio/completion_condition.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 {
+
+template <typename> class initiate_async_write;
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+template <typename> class initiate_async_write_dynbuf_v1;
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+template <typename> class initiate_async_write_dynbuf_v2;
+
+} // namespace detail
+
+/**
+ * @defgroup write asio::write
+ *
+ * @brief The @c write function is a composed operation that writes 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 <typename SyncWriteStream, typename ConstBufferSequence>
+std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ > = 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 <typename SyncWriteStream, typename ConstBufferSequence>
+std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
+ asio::error_code& ec,
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ > = 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 <typename SyncWriteStream, typename ConstBufferSequence,
+ typename CompletionCondition>
+std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
+ CompletionCondition completion_condition,
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ > = 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 <typename SyncWriteStream, typename ConstBufferSequence,
+ typename CompletionCondition>
+std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers,
+ CompletionCondition completion_condition, asio::error_code& ec,
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ > = 0);
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// 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 <typename SyncWriteStream, typename DynamicBuffer_v1>
+std::size_t write(SyncWriteStream& s,
+ DynamicBuffer_v1&& buffers,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 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 <typename SyncWriteStream, typename DynamicBuffer_v1>
+std::size_t write(SyncWriteStream& s,
+ DynamicBuffer_v1&& buffers,
+ asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 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 <typename SyncWriteStream, typename DynamicBuffer_v1,
+ typename CompletionCondition>
+std::size_t write(SyncWriteStream& s,
+ DynamicBuffer_v1&& buffers,
+ CompletionCondition completion_condition,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 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 <typename SyncWriteStream, typename DynamicBuffer_v1,
+ typename CompletionCondition>
+std::size_t write(SyncWriteStream& s,
+ DynamicBuffer_v1&& buffers,
+ CompletionCondition completion_condition, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 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 <typename SyncWriteStream, typename Allocator>
+std::size_t write(SyncWriteStream& s, basic_streambuf<Allocator>& 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 <typename SyncWriteStream, typename Allocator>
+std::size_t write(SyncWriteStream& s, basic_streambuf<Allocator>& 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 <typename SyncWriteStream, typename Allocator,
+ typename CompletionCondition>
+std::size_t write(SyncWriteStream& s, basic_streambuf<Allocator>& 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 <typename SyncWriteStream, typename Allocator,
+ typename CompletionCondition>
+std::size_t write(SyncWriteStream& s, basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition, asio::error_code& ec);
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+#endif // !defined(ASIO_NO_EXTENSIONS)
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// 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 <typename SyncWriteStream, typename DynamicBuffer_v2>
+std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 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 <typename SyncWriteStream, typename DynamicBuffer_v2>
+std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
+ asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 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 <typename SyncWriteStream, typename DynamicBuffer_v2,
+ typename CompletionCondition>
+std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
+ CompletionCondition completion_condition,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 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 <typename SyncWriteStream, typename DynamicBuffer_v2,
+ typename CompletionCondition>
+std::size_t write(SyncWriteStream& s, DynamicBuffer_v2 buffers,
+ CompletionCondition completion_condition, asio::error_code& ec,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0);
+
+/*@}*/
+/**
+ * @defgroup async_write asio::async_write
+ *
+ * @brief The @c async_write function is a composed asynchronous operation that
+ * writes a certain amount of data to a stream before completion.
+ */
+/*@{*/
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncWriteStream type's
+ * @c async_write_some operation.
+ */
+template <typename AsyncWriteStream, typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken
+ = default_completion_token_t<typename AsyncWriteStream::executor_type>>
+auto async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
+ WriteToken&& token
+ = default_completion_token_t<typename AsyncWriteStream::executor_type>(),
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ > = 0)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write<AsyncWriteStream>>(),
+ token, buffers, transfer_all()));
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncWriteStream type's
+ * @c async_write_some operation.
+ */
+template <typename AsyncWriteStream,
+ typename ConstBufferSequence, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+auto async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers,
+ CompletionCondition completion_condition,
+ WriteToken&& token,
+ constraint_t<
+ is_const_buffer_sequence<ConstBufferSequence>::value
+ > = 0)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write<AsyncWriteStream>>(),
+ token, buffers,
+ static_cast<CompletionCondition&&>(completion_condition)));
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called. Successfully
+ * written data is automatically consumed from the buffers.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncWriteStream type's
+ * @c async_write_some operation.
+ */
+template <typename AsyncWriteStream, typename DynamicBuffer_v1,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken
+ = default_completion_token_t<typename AsyncWriteStream::executor_type>>
+auto async_write(AsyncWriteStream& s, DynamicBuffer_v1&& buffers,
+ WriteToken&& token
+ = default_completion_token_t<typename AsyncWriteStream::executor_type>(),
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ transfer_all()));
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncWriteStream type's
+ * @c async_write_some operation.
+ */
+template <typename AsyncWriteStream,
+ typename DynamicBuffer_v1, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+auto async_write(AsyncWriteStream& s, DynamicBuffer_v1&& buffers,
+ CompletionCondition completion_condition, WriteToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v1<decay_t<DynamicBuffer_v1>>::value
+ > = 0,
+ constraint_t<
+ !is_dynamic_buffer_v2<decay_t<DynamicBuffer_v1>>::value
+ > = 0)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>>(),
+ token, static_cast<DynamicBuffer_v1&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition)));
+
+#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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncWriteStream type's
+ * @c async_write_some operation.
+ */
+template <typename AsyncWriteStream, typename Allocator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken
+ = default_completion_token_t<typename AsyncWriteStream::executor_type>>
+auto async_write(AsyncWriteStream& s, basic_streambuf<Allocator>& b,
+ WriteToken&& token
+ = default_completion_token_t<typename AsyncWriteStream::executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>>(),
+ token, basic_streambuf_ref<Allocator>(b), transfer_all()));
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncWriteStream type's
+ * @c async_write_some operation.
+ */
+template <typename AsyncWriteStream,
+ typename Allocator, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+auto async_write(AsyncWriteStream& s, basic_streambuf<Allocator>& b,
+ CompletionCondition completion_condition, WriteToken&& token)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_dynbuf_v1<AsyncWriteStream>>(),
+ token, basic_streambuf_ref<Allocator>(b),
+ static_cast<CompletionCondition&&>(completion_condition)));
+
+#endif // !defined(ASIO_NO_IOSTREAM)
+#endif // !defined(ASIO_NO_EXTENSIONS)
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion handler is called. Successfully
+ * written data is automatically consumed from the buffers.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncWriteStream type's
+ * @c async_write_some operation.
+ */
+template <typename AsyncWriteStream, typename DynamicBuffer_v2,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken
+ = default_completion_token_t<typename AsyncWriteStream::executor_type>>
+auto async_write(AsyncWriteStream& s, DynamicBuffer_v2 buffers,
+ WriteToken&& token
+ = default_completion_token_t<typename AsyncWriteStream::executor_type>(),
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_dynbuf_v2<AsyncWriteStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ transfer_all()));
+
+/// 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. It is an initiating function for an @ref
+ * asynchronous_operation, and 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 <em>composed operation</em>. 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncWriteStream type's
+ * @c async_write_some operation.
+ */
+template <typename AsyncWriteStream,
+ typename DynamicBuffer_v2, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken>
+auto async_write(AsyncWriteStream& s, DynamicBuffer_v2 buffers,
+ CompletionCondition completion_condition,
+ WriteToken&& token,
+ constraint_t<
+ is_dynamic_buffer_v2<DynamicBuffer_v2>::value
+ > = 0)
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_dynbuf_v2<AsyncWriteStream>>(),
+ token, static_cast<DynamicBuffer_v2&&>(buffers),
+ static_cast<CompletionCondition&&>(completion_condition)));
+
+/*@}*/
+
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#include "asio/impl/write.hpp"
+
+#endif // ASIO_WRITE_HPP
diff --git a/3rdparty/asio/include/asio/write_at.hpp b/3rdparty/asio/include/asio/write_at.hpp
new file mode 100644
index 00000000000..a33514e61a0
--- /dev/null
+++ b/3rdparty/asio/include/asio/write_at.hpp
@@ -0,0 +1,789 @@
+//
+// write_at.hpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software 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 <cstddef>
+#include "asio/async_result.hpp"
+#include "asio/completion_condition.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 {
+namespace detail {
+
+template <typename> class initiate_async_write_at;
+#if !defined(ASIO_NO_IOSTREAM)
+template <typename> class initiate_async_write_at_streambuf;
+#endif // !defined(ASIO_NO_IOSTREAM)
+
+} // namespace detail
+
+/**
+ * @defgroup write_at asio::write_at
+ *
+ * @brief The @c write_at function is a composed operation that writes 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 <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence>
+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 <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence>
+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 <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence,
+ typename CompletionCondition>
+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 <typename SyncRandomAccessWriteDevice, typename ConstBufferSequence,
+ typename CompletionCondition>
+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 <typename SyncRandomAccessWriteDevice, typename Allocator>
+std::size_t write_at(SyncRandomAccessWriteDevice& d,
+ uint64_t offset, basic_streambuf<Allocator>& 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 <typename SyncRandomAccessWriteDevice, typename Allocator>
+std::size_t write_at(SyncRandomAccessWriteDevice& d,
+ uint64_t offset, basic_streambuf<Allocator>& 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 <typename SyncRandomAccessWriteDevice, typename Allocator,
+ typename CompletionCondition>
+std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset,
+ basic_streambuf<Allocator>& 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 <typename SyncRandomAccessWriteDevice, typename Allocator,
+ typename CompletionCondition>
+std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset,
+ basic_streambuf<Allocator>& 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 The @c async_write_at function is a composed asynchronous operation
+ * that writes a certain amount of data at the specified offset before
+ * completion.
+ */
+/*@{*/
+
+/// 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. It is an initiating
+ * function for an @ref asynchronous_operation, and 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 <em>composed operation</em>.
+ * The program must ensure that the device performs no <em>overlapping</em>
+ * 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncRandomAccessWriteDevice type's
+ * async_write_some_at operation.
+ */
+template <typename AsyncRandomAccessWriteDevice, typename ConstBufferSequence,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<
+ typename AsyncRandomAccessWriteDevice::executor_type>>
+auto async_write_at(AsyncRandomAccessWriteDevice& d,
+ uint64_t offset, const ConstBufferSequence& buffers,
+ WriteToken&& token = default_completion_token_t<
+ typename AsyncRandomAccessWriteDevice::executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_at<
+ AsyncRandomAccessWriteDevice>>(),
+ token, offset, buffers, transfer_all()));
+
+/// 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. It is an initiating
+ * function for an @ref asynchronous_operation, and 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 <em>composed operation</em>.
+ * The program must ensure that the device performs no <em>overlapping</em>
+ * 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @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.
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncRandomAccessWriteDevice type's
+ * async_write_some_at operation.
+ */
+template <typename AsyncRandomAccessWriteDevice,
+ typename ConstBufferSequence, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<
+ typename AsyncRandomAccessWriteDevice::executor_type>>
+auto async_write_at(AsyncRandomAccessWriteDevice& d,
+ uint64_t offset, const ConstBufferSequence& buffers,
+ CompletionCondition completion_condition,
+ WriteToken&& token = default_completion_token_t<
+ typename AsyncRandomAccessWriteDevice::executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_at<
+ AsyncRandomAccessWriteDevice>>(),
+ token, offset, buffers,
+ static_cast<CompletionCondition&&>(completion_condition)));
+
+#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. It is an initiating
+ * function for an @ref asynchronous_operation, and 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 <em>composed operation</em>.
+ * The program must ensure that the device performs no <em>overlapping</em>
+ * 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 completion handler is called.
+ *
+ * @param token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncRandomAccessWriteDevice type's
+ * async_write_some_at operation.
+ */
+template <typename AsyncRandomAccessWriteDevice, typename Allocator,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<
+ typename AsyncRandomAccessWriteDevice::executor_type>>
+auto async_write_at(AsyncRandomAccessWriteDevice& d,
+ uint64_t offset, basic_streambuf<Allocator>& b,
+ WriteToken&& token = default_completion_token_t<
+ typename AsyncRandomAccessWriteDevice::executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_at_streambuf<
+ AsyncRandomAccessWriteDevice>>(),
+ token, offset, &b, transfer_all()));
+
+/// 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. It is an initiating
+ * function for an @ref asynchronous_operation, and 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 <em>composed operation</em>.
+ * The program must ensure that the device performs no <em>overlapping</em>
+ * 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 completion 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 token The @ref completion_token that will be used to produce a
+ * completion handler, which will be called when the write completes.
+ * Potential completion tokens include @ref use_future, @ref use_awaitable,
+ * @ref yield_context, or a function object with the correct completion
+ * signature. The function signature of the completion 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 completion handler will not be invoked from within this function.
+ * On immediate completion, invocation of the handler will be performed in a
+ * manner equivalent to using asio::post().
+ *
+ * @par Completion Signature
+ * @code void(asio::error_code, std::size_t) @endcode
+ *
+ * @par Per-Operation Cancellation
+ * This asynchronous operation supports cancellation for the following
+ * asio::cancellation_type values:
+ *
+ * @li @c cancellation_type::terminal
+ *
+ * @li @c cancellation_type::partial
+ *
+ * if they are also supported by the @c AsyncRandomAccessWriteDevice type's
+ * async_write_some_at operation.
+ */
+template <typename AsyncRandomAccessWriteDevice,
+ typename Allocator, typename CompletionCondition,
+ ASIO_COMPLETION_TOKEN_FOR(void (asio::error_code,
+ std::size_t)) WriteToken = default_completion_token_t<
+ typename AsyncRandomAccessWriteDevice::executor_type>>
+auto async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset,
+ basic_streambuf<Allocator>& b, CompletionCondition completion_condition,
+ WriteToken&& token = default_completion_token_t<
+ typename AsyncRandomAccessWriteDevice::executor_type>())
+ -> decltype(
+ async_initiate<WriteToken,
+ void (asio::error_code, std::size_t)>(
+ declval<detail::initiate_async_write_at_streambuf<
+ AsyncRandomAccessWriteDevice>>(),
+ token, offset, &b,
+ static_cast<CompletionCondition&&>(completion_condition)));
+
+#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/3rdparty/asio/include/asio/yield.hpp b/3rdparty/asio/include/asio/yield.hpp
new file mode 100644
index 00000000000..c180503dda9
--- /dev/null
+++ b/3rdparty/asio/include/asio/yield.hpp
@@ -0,0 +1,23 @@
+//
+// yield.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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/3rdparty/asio/install-sh b/3rdparty/asio/install-sh
new file mode 100755
index 00000000000..ec298b53740
--- /dev/null
+++ b/3rdparty/asio/install-sh
@@ -0,0 +1,541 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2020-11-14.01; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# 'make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+tab=' '
+nl='
+'
+IFS=" $tab$nl"
+
+# Set DOITPROG to "echo" to test this script.
+
+doit=${DOITPROG-}
+doit_exec=${doit:-exec}
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+# Create dirs (including intermediate dirs) using mode 755.
+# This is like GNU 'install' as of coreutils 8.32 (2020).
+mkdir_umask=22
+
+backupsuffix=
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+is_target_a_directory=possibly
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+ or: $0 [OPTION]... SRCFILES... DIRECTORY
+ or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+ or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+ --help display this help and exit.
+ --version display version info and exit.
+
+ -c (ignored)
+ -C install only if different (preserve data modification time)
+ -d create directories instead of installing files.
+ -g GROUP $chgrpprog installed files to GROUP.
+ -m MODE $chmodprog installed files to MODE.
+ -o USER $chownprog installed files to USER.
+ -p pass -p to $cpprog.
+ -s $stripprog installed files.
+ -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
+ -t DIRECTORY install into DIRECTORY.
+ -T report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+ RMPROG STRIPPROG
+
+By default, rm is invoked with -f; when overridden with RMPROG,
+it's up to you to specify -f if you want it.
+
+If -S is not specified, no backups are attempted.
+
+Email bug reports to bug-automake@gnu.org.
+Automake home page: https://www.gnu.org/software/automake/
+"
+
+while test $# -ne 0; do
+ case $1 in
+ -c) ;;
+
+ -C) copy_on_change=true;;
+
+ -d) dir_arg=true;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ case $mode in
+ *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+ echo "$0: invalid mode: $mode" >&2
+ exit 1;;
+ esac
+ shift;;
+
+ -o) chowncmd="$chownprog $2"
+ shift;;
+
+ -p) cpprog="$cpprog -p";;
+
+ -s) stripcmd=$stripprog;;
+
+ -S) backupsuffix="$2"
+ shift;;
+
+ -t)
+ is_target_a_directory=always
+ dst_arg=$2
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ shift;;
+
+ -T) is_target_a_directory=never;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ --) shift
+ break;;
+
+ -*) echo "$0: invalid option: $1" >&2
+ exit 1;;
+
+ *) break;;
+ esac
+ shift
+done
+
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+ if test -n "$dst_arg"; then
+ echo "$0: target directory not allowed when installing a directory." >&2
+ exit 1
+ fi
+fi
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+ # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dst_arg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dst_arg"
+ shift # fnord
+ fi
+ shift # arg
+ dst_arg=$arg
+ # Protect names problematic for 'test' and other utilities.
+ case $dst_arg in
+ -* | [=\(\)!]) dst_arg=./$dst_arg;;
+ esac
+ done
+fi
+
+if test $# -eq 0; then
+ if test -z "$dir_arg"; then
+ echo "$0: no input file specified." >&2
+ exit 1
+ fi
+ # It's OK to call 'install-sh -d' without argument.
+ # This can happen when creating conditional directories.
+ exit 0
+fi
+
+if test -z "$dir_arg"; then
+ if test $# -gt 1 || test "$is_target_a_directory" = always; then
+ if test ! -d "$dst_arg"; then
+ echo "$0: $dst_arg: Is not a directory." >&2
+ exit 1
+ fi
+ fi
+fi
+
+if test -z "$dir_arg"; then
+ do_exit='(exit $ret); exit $ret'
+ trap "ret=129; $do_exit" 1
+ trap "ret=130; $do_exit" 2
+ trap "ret=141; $do_exit" 13
+ trap "ret=143; $do_exit" 15
+
+ # Set umask so as not to create temps with too-generous modes.
+ # However, 'strip' requires both read and write access to temps.
+ case $mode in
+ # Optimize common cases.
+ *644) cp_umask=133;;
+ *755) cp_umask=22;;
+
+ *[0-7])
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw='% 200'
+ fi
+ cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+ *)
+ if test -z "$stripcmd"; then
+ u_plus_rw=
+ else
+ u_plus_rw=,u+rw
+ fi
+ cp_umask=$mode$u_plus_rw;;
+ esac
+fi
+
+for src
+do
+ # Protect names problematic for 'test' and other utilities.
+ case $src in
+ -* | [=\(\)!]) src=./$src;;
+ esac
+
+ if test -n "$dir_arg"; then
+ dst=$src
+ dstdir=$dst
+ test -d "$dstdir"
+ dstdir_status=$?
+ # Don't chown directories that already exist.
+ if test $dstdir_status = 0; then
+ chowncmd=""
+ fi
+ else
+
+ # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+ # might cause directories to be created, which would be especially bad
+ # if $src (and thus $dsttmp) contains '*'.
+ if test ! -f "$src" && test ! -d "$src"; then
+ echo "$0: $src does not exist." >&2
+ exit 1
+ fi
+
+ if test -z "$dst_arg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+ dst=$dst_arg
+
+ # If destination is a directory, append the input filename.
+ if test -d "$dst"; then
+ if test "$is_target_a_directory" = never; then
+ echo "$0: $dst_arg: Is a directory" >&2
+ exit 1
+ fi
+ dstdir=$dst
+ dstbase=`basename "$src"`
+ case $dst in
+ */) dst=$dst$dstbase;;
+ *) dst=$dst/$dstbase;;
+ esac
+ dstdir_status=0
+ else
+ dstdir=`dirname "$dst"`
+ test -d "$dstdir"
+ dstdir_status=$?
+ fi
+ fi
+
+ case $dstdir in
+ */) dstdirslash=$dstdir;;
+ *) dstdirslash=$dstdir/;;
+ esac
+
+ obsolete_mkdir_used=false
+
+ if test $dstdir_status != 0; then
+ case $posix_mkdir in
+ '')
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, rely on $mkdir_umask.
+ if test -n "$dir_arg"; then
+ mkdir_mode=-m$mode
+ else
+ mkdir_mode=
+ fi
+
+ posix_mkdir=false
+ # The $RANDOM variable is not portable (e.g., dash). Use it
+ # here however when possible just to lower collision chance.
+ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+
+ trap '
+ ret=$?
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
+ exit $ret
+ ' 0
+
+ # Because "mkdir -p" follows existing symlinks and we likely work
+ # directly in world-writeable /tmp, make sure that the '$tmpdir'
+ # directory is successfully created first before we actually test
+ # 'mkdir -p'.
+ if (umask $mkdir_umask &&
+ $mkdirprog $mkdir_mode "$tmpdir" &&
+ exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+ then
+ if test -z "$dir_arg" || {
+ # Check for POSIX incompatibilities with -m.
+ # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+ # other-writable bit of parent directory when it shouldn't.
+ # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+ test_tmpdir="$tmpdir/a"
+ ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+ case $ls_ld_tmpdir in
+ d????-?r-*) different_mode=700;;
+ d????-?--*) different_mode=755;;
+ *) false;;
+ esac &&
+ $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+ ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+ test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+ }
+ }
+ then posix_mkdir=:
+ fi
+ rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+ fi
+ trap '' 0;;
+ esac
+
+ if
+ $posix_mkdir && (
+ umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+ )
+ then :
+ else
+
+ # mkdir does not conform to POSIX,
+ # or it failed possibly due to a race condition. Create the
+ # directory the slow way, step by step, checking for races as we go.
+
+ case $dstdir in
+ /*) prefix='/';;
+ [-=\(\)!]*) prefix='./';;
+ *) prefix='';;
+ esac
+
+ oIFS=$IFS
+ IFS=/
+ set -f
+ set fnord $dstdir
+ shift
+ set +f
+ IFS=$oIFS
+
+ prefixes=
+
+ for d
+ do
+ test X"$d" = X && continue
+
+ prefix=$prefix$d
+ if test -d "$prefix"; then
+ prefixes=
+ else
+ if $posix_mkdir; then
+ (umask $mkdir_umask &&
+ $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+ # Don't fail if two instances are running concurrently.
+ test -d "$prefix" || exit 1
+ else
+ case $prefix in
+ *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) qprefix=$prefix;;
+ esac
+ prefixes="$prefixes '$qprefix'"
+ fi
+ fi
+ prefix=$prefix/
+ done
+
+ if test -n "$prefixes"; then
+ # Don't fail if two instances are running concurrently.
+ (umask $mkdir_umask &&
+ eval "\$doit_exec \$mkdirprog $prefixes") ||
+ test -d "$dstdir" || exit 1
+ obsolete_mkdir_used=true
+ fi
+ fi
+ fi
+
+ if test -n "$dir_arg"; then
+ { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+ { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+ else
+
+ # Make a couple of temp file names in the proper directory.
+ dsttmp=${dstdirslash}_inst.$$_
+ rmtmp=${dstdirslash}_rm.$$_
+
+ # Trap to clean up those temp files at exit.
+ trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+ # Copy the file name to the temp name.
+ (umask $cp_umask &&
+ { test -z "$stripcmd" || {
+ # Create $dsttmp read-write so that cp doesn't create it read-only,
+ # which would cause strip to fail.
+ if test -z "$doit"; then
+ : >"$dsttmp" # No need to fork-exec 'touch'.
+ else
+ $doit touch "$dsttmp"
+ fi
+ }
+ } &&
+ $doit_exec $cpprog "$src" "$dsttmp") &&
+
+ # and set any options; do chmod last to preserve setuid bits.
+ #
+ # If any of these fail, we abort the whole thing. If we want to
+ # ignore errors from any of these, just make sure not to ignore
+ # errors from the above "$doit $cpprog $src $dsttmp" command.
+ #
+ { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+ { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+ { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+ { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+ # If -C, don't bother to copy if it wouldn't change the file.
+ if $copy_on_change &&
+ old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
+ new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
+ set -f &&
+ set X $old && old=:$2:$4:$5:$6 &&
+ set X $new && new=:$2:$4:$5:$6 &&
+ set +f &&
+ test "$old" = "$new" &&
+ $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+ then
+ rm -f "$dsttmp"
+ else
+ # If $backupsuffix is set, and the file being installed
+ # already exists, attempt a backup. Don't worry if it fails,
+ # e.g., if mv doesn't support -f.
+ if test -n "$backupsuffix" && test -f "$dst"; then
+ $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
+ fi
+
+ # Rename the file to the real destination.
+ $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+ # The rename failed, perhaps because mv can't rename something else
+ # to itself, or perhaps because mv is so ancient that it does not
+ # support -f.
+ {
+ # Now remove or move aside any old file at destination location.
+ # We try this two ways since rm can't unlink itself on some
+ # systems and the destination file might be busy for other
+ # reasons. In this case, the final cleanup might fail but the new
+ # file should still install successfully.
+ {
+ test ! -f "$dst" ||
+ $doit $rmcmd "$dst" 2>/dev/null ||
+ { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+ { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
+ } ||
+ { echo "$0: cannot unlink or rename $dst" >&2
+ (exit 1); exit 1
+ }
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ fi || exit 1
+
+ trap '' 0
+ fi
+done
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/3rdparty/asio/missing b/3rdparty/asio/missing
new file mode 100755
index 00000000000..1fe1611f185
--- /dev/null
+++ b/3rdparty/asio/missing
@@ -0,0 +1,215 @@
+#! /bin/sh
+# Common wrapper for a few potentially missing GNU programs.
+
+scriptversion=2018-03-07.03; # UTC
+
+# Copyright (C) 1996-2021 Free Software Foundation, Inc.
+# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try '$0 --help' for more information"
+ exit 1
+fi
+
+case $1 in
+
+ --is-lightweight)
+ # Used by our autoconf macros to check whether the available missing
+ # script is modern enough.
+ exit 0
+ ;;
+
+ --run)
+ # Back-compat with the calling convention used by older automake.
+ shift
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due
+to PROGRAM being missing or too old.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+
+Supported PROGRAM values:
+ aclocal autoconf autoheader autom4te automake makeinfo
+ bison yacc flex lex help2man
+
+Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and
+'g' are ignored when checking the name.
+
+Send bug reports to <bug-automake@gnu.org>."
+ exit $?
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing $scriptversion (GNU Automake)"
+ exit $?
+ ;;
+
+ -*)
+ echo 1>&2 "$0: unknown '$1' option"
+ echo 1>&2 "Try '$0 --help' for more information"
+ exit 1
+ ;;
+
+esac
+
+# Run the given program, remember its exit status.
+"$@"; st=$?
+
+# If it succeeded, we are done.
+test $st -eq 0 && exit 0
+
+# Also exit now if we it failed (or wasn't found), and '--version' was
+# passed; such an option is passed most likely to detect whether the
+# program is present and works.
+case $2 in --version|--help) exit $st;; esac
+
+# Exit code 63 means version mismatch. This often happens when the user
+# tries to use an ancient version of a tool on a file that requires a
+# minimum version.
+if test $st -eq 63; then
+ msg="probably too old"
+elif test $st -eq 127; then
+ # Program was missing.
+ msg="missing on your system"
+else
+ # Program was found and executed, but failed. Give up.
+ exit $st
+fi
+
+perl_URL=https://www.perl.org/
+flex_URL=https://github.com/westes/flex
+gnu_software_URL=https://www.gnu.org/software
+
+program_details ()
+{
+ case $1 in
+ aclocal|automake)
+ echo "The '$1' program is part of the GNU Automake package:"
+ echo "<$gnu_software_URL/automake>"
+ echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/autoconf>"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ autoconf|autom4te|autoheader)
+ echo "The '$1' program is part of the GNU Autoconf package:"
+ echo "<$gnu_software_URL/autoconf/>"
+ echo "It also requires GNU m4 and Perl in order to run:"
+ echo "<$gnu_software_URL/m4/>"
+ echo "<$perl_URL>"
+ ;;
+ esac
+}
+
+give_advice ()
+{
+ # Normalize program name to check for.
+ normalized_program=`echo "$1" | sed '
+ s/^gnu-//; t
+ s/^gnu//; t
+ s/^g//; t'`
+
+ printf '%s\n' "'$1' is $msg."
+
+ configure_deps="'configure.ac' or m4 files included by 'configure.ac'"
+ case $normalized_program in
+ autoconf*)
+ echo "You should only need it if you modified 'configure.ac',"
+ echo "or m4 files included by it."
+ program_details 'autoconf'
+ ;;
+ autoheader*)
+ echo "You should only need it if you modified 'acconfig.h' or"
+ echo "$configure_deps."
+ program_details 'autoheader'
+ ;;
+ automake*)
+ echo "You should only need it if you modified 'Makefile.am' or"
+ echo "$configure_deps."
+ program_details 'automake'
+ ;;
+ aclocal*)
+ echo "You should only need it if you modified 'acinclude.m4' or"
+ echo "$configure_deps."
+ program_details 'aclocal'
+ ;;
+ autom4te*)
+ echo "You might have modified some maintainer files that require"
+ echo "the 'autom4te' program to be rebuilt."
+ program_details 'autom4te'
+ ;;
+ bison*|yacc*)
+ echo "You should only need it if you modified a '.y' file."
+ echo "You may want to install the GNU Bison package:"
+ echo "<$gnu_software_URL/bison/>"
+ ;;
+ lex*|flex*)
+ echo "You should only need it if you modified a '.l' file."
+ echo "You may want to install the Fast Lexical Analyzer package:"
+ echo "<$flex_URL>"
+ ;;
+ help2man*)
+ echo "You should only need it if you modified a dependency" \
+ "of a man page."
+ echo "You may want to install the GNU Help2man package:"
+ echo "<$gnu_software_URL/help2man/>"
+ ;;
+ makeinfo*)
+ echo "You should only need it if you modified a '.texi' file, or"
+ echo "any other file indirectly affecting the aspect of the manual."
+ echo "You might want to install the Texinfo package:"
+ echo "<$gnu_software_URL/texinfo/>"
+ echo "The spurious makeinfo call might also be the consequence of"
+ echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might"
+ echo "want to install GNU make:"
+ echo "<$gnu_software_URL/make/>"
+ ;;
+ *)
+ echo "You might have modified some files without having the proper"
+ echo "tools for further handling them. Check the 'README' file, it"
+ echo "often tells you about the needed prerequisites for installing"
+ echo "this package. You may also peek at any GNU archive site, in"
+ echo "case some other package contains this missing '$1' program."
+ ;;
+ esac
+}
+
+give_advice "$1" | sed -e '1s/^/WARNING: /' \
+ -e '2,$s/^/ /' >&2
+
+# Propagate the correct exit status (expected to be 127 for a program
+# not found, 63 for a program that failed due to version mismatch).
+exit $st
+
+# Local variables:
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/3rdparty/asio/src/Makefile.am b/3rdparty/asio/src/Makefile.am
new file mode 100644
index 00000000000..587bb4935e8
--- /dev/null
+++ b/3rdparty/asio/src/Makefile.am
@@ -0,0 +1,39 @@
+if HAVE_CXX11
+EXAMPLES_CPP11 = examples/cpp11
+endif
+
+if HAVE_CXX14
+EXAMPLES_CPP14 = examples/cpp14
+endif
+
+if HAVE_CXX17
+EXAMPLES_CPP17 = examples/cpp17
+endif
+
+if HAVE_CXX20
+EXAMPLES_CPP20 = examples/cpp20
+endif
+
+SUBDIRS = \
+ $(EXAMPLES_CPP11) \
+ $(EXAMPLES_CPP14) \
+ $(EXAMPLES_CPP17) \
+ $(EXAMPLES_CPP20) \
+ tests
+
+DIST_SUBDIRS = \
+ examples/cpp11 \
+ examples/cpp14 \
+ examples/cpp17 \
+ examples/cpp20 \
+ tests
+
+EXTRA_DIST = \
+ Makefile.mgw \
+ Makefile.msc \
+ tools/handlerlive.pl \
+ tools/handlertree.pl \
+ tools/handlerviz.pl
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
diff --git a/3rdparty/asio/src/Makefile.in b/3rdparty/asio/src/Makefile.in
new file mode 100644
index 00000000000..63e9eaf7c34
--- /dev/null
+++ b/3rdparty/asio/src/Makefile.in
@@ -0,0 +1,619 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+subdir = src
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ distdir distdir-am
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__DIST_COMMON = $(srcdir)/Makefile.in
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+@HAVE_CXX11_TRUE@EXAMPLES_CPP11 = examples/cpp11
+@HAVE_CXX14_TRUE@EXAMPLES_CPP14 = examples/cpp14
+@HAVE_CXX17_TRUE@EXAMPLES_CPP17 = examples/cpp17
+@HAVE_CXX20_TRUE@EXAMPLES_CPP20 = examples/cpp20
+SUBDIRS = \
+ $(EXAMPLES_CPP11) \
+ $(EXAMPLES_CPP14) \
+ $(EXAMPLES_CPP17) \
+ $(EXAMPLES_CPP20) \
+ tests
+
+DIST_SUBDIRS = \
+ examples/cpp11 \
+ examples/cpp14 \
+ examples/cpp17 \
+ examples/cpp20 \
+ tests
+
+EXTRA_DIST = \
+ Makefile.mgw \
+ Makefile.msc \
+ tools/handlerlive.pl \
+ tools/handlertree.pl \
+ tools/handlerviz.pl
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
+
+all: all-recursive
+
+.SUFFIXES:
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-recursive
+all-am: Makefile
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-generic mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f Makefile
+distclean-am: clean-am distclean-generic distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \
+ check-am clean clean-generic cscopelist-am ctags ctags-am \
+ distclean distclean-generic distclean-tags distdir dvi dvi-am \
+ html html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \
+ pdf-am ps ps-am tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/3rdparty/asio/src/Makefile.mgw b/3rdparty/asio/src/Makefile.mgw
new file mode 100644
index 00000000000..1fea10c2cdc
--- /dev/null
+++ b/3rdparty/asio/src/Makefile.mgw
@@ -0,0 +1,291 @@
+SHELL=cmd
+
+ifndef BOOSTDIR
+BOOSTDIR = ../../boost_1_73_0
+endif
+
+ifdef OPTIMISED
+OPTIM_CXXFLAGS = -O2
+OPTIM_LDFLAGS = -O2
+else
+OPTIM_CXXFLAGS = -fno-inline
+OPTIM_LDFLAGS =
+endif
+
+ifndef STANDALONE
+BOOST_CXXFLAGS = -I$(BOOSTDIR) -DASIO_ENABLE_BOOST
+endif
+
+ifdef SEPARATE_COMPILATION
+SEPARATE_COMPILATION_LIB = libasio.a
+SEPARATE_COMPILATION_CXXFLAGS = \
+ -DASIO_SEPARATE_COMPILATION \
+ -DASIO_ENABLE_CANCELIO
+endif
+
+CXXFLAGS = -g -Wall -Wextra -mthreads -I../include \
+ $(OPTIM_CXXFLAGS) \
+ $(BOOST_CXXFLAGS) \
+ $(SEPARATE_COMPILATION_CXXFLAGS)
+LDFLAGS = -g -mthreads $(OPTIM_LDFLAGS)
+LIBS = $(SEPARATE_COMPILATION_LIB) -lws2_32 -lmswsock
+DEFINES = -D_WIN32_WINNT=0x0501
+
+PERFORMANCE_TEST_EXES = \
+ tests/performance/client.exe \
+ tests/performance/server.exe
+
+UNIT_TEST_EXES = \
+ tests/unit/any_completion_executor.exe \
+ tests/unit/any_completion_handler.exe \
+ tests/unit/any_io_executor.exe \
+ tests/unit/associated_allocator.exe \
+ tests/unit/associated_executor.exe \
+ tests/unit/async_result.exe \
+ tests/unit/awaitable.exe \
+ tests/unit/basic_datagram_socket.exe \
+ tests/unit/basic_deadline_timer.exe \
+ tests/unit/basic_raw_socket.exe \
+ tests/unit/basic_seq_packet_socket.exe \
+ tests/unit/basic_serial_port.exe \
+ tests/unit/basic_signal_set.exe \
+ tests/unit/basic_socket.exe \
+ tests/unit/basic_socket_acceptor.exe \
+ tests/unit/basic_stream_socket.exe \
+ tests/unit/basic_streambuf.exe \
+ tests/unit/basic_waitable_timer.exe \
+ tests/unit/bind_cancellation_slot.exe \
+ tests/unit/bind_executor.exe \
+ tests/unit/buffered_read_stream.exe \
+ tests/unit/buffered_stream.exe \
+ tests/unit/buffered_write_stream.exe \
+ tests/unit/buffer.exe \
+ tests/unit/buffers_iterator.exe \
+ tests/unit/co_spawn.exe \
+ tests/unit/completion_condition.exe \
+ tests/unit/compose.exe \
+ tests/unit/connect.exe \
+ tests/unit/coroutine.exe \
+ tests/unit/deadline_timer.exe \
+ tests/unit/defer.exe \
+ tests/unit/detached.exe \
+ tests/unit/dispatch.exe \
+ tests/unit/error.exe \
+ tests/unit/execution_context.exe \
+ tests/unit/execution/any_executor.exe \
+ tests/unit/execution/blocking.exe \
+ tests/unit/execution/blocking_adaptation.exe \
+ tests/unit/execution/context_as.exe \
+ tests/unit/execution/executor.exe \
+ tests/unit/execution/invocable_archetype.exe \
+ tests/unit/execution/mapping.exe \
+ tests/unit/execution/outstanding_work.exe \
+ tests/unit/execution/prefer_only.exe \
+ tests/unit/execution/relationship.exe \
+ tests/unit/executor.exe \
+ tests/unit/executor_work_guard.exe \
+ tests/unit/generic/basic_endpoint.exe \
+ tests/unit/generic/datagram_protocol.exe \
+ tests/unit/generic/raw_protocol.exe \
+ tests/unit/generic/seq_packet_protocol.exe \
+ tests/unit/generic/stream_protocol.exe \
+ tests/unit/high_resolution_timer.exe \
+ tests/unit/io_context.exe \
+ tests/unit/io_context_strand.exe \
+ tests/unit/ip/address.exe \
+ tests/unit/ip/address_v4.exe \
+ tests/unit/ip/address_v4_iterator.exe \
+ tests/unit/ip/address_v4_range.exe \
+ tests/unit/ip/address_v6.exe \
+ tests/unit/ip/address_v6_iterator.exe \
+ tests/unit/ip/address_v6_range.exe \
+ tests/unit/ip/basic_endpoint.exe \
+ tests/unit/ip/basic_resolver.exe \
+ tests/unit/ip/basic_resolver_entry.exe \
+ tests/unit/ip/basic_resolver_iterator.exe \
+ tests/unit/ip/basic_resolver_query.exe \
+ tests/unit/ip/host_name.exe \
+ tests/unit/ip/icmp.exe \
+ tests/unit/ip/multicast.exe \
+ tests/unit/ip/network_v4.exe \
+ tests/unit/ip/network_v6.exe \
+ tests/unit/ip/resolver_query_base.exe \
+ tests/unit/ip/tcp.exe \
+ tests/unit/ip/udp.exe \
+ tests/unit/ip/unicast.exe \
+ tests/unit/ip/v6_only.exe \
+ tests/unit/is_read_buffered.exe \
+ tests/unit/is_write_buffered.exe \
+ tests/unit/packaged_task.exe \
+ tests/unit/placeholders.exe \
+ tests/unit/post.exe \
+ tests/unit/read.exe \
+ tests/unit/read_at.exe \
+ tests/unit/read_until.exe \
+ tests/unit/redirect_error.exe \
+ tests/unit/serial_port.exe \
+ tests/unit/serial_port_base.exe \
+ tests/unit/signal_set.exe \
+ tests/unit/socket_base.exe \
+ tests/unit/static_thread_pool.exe \
+ tests/unit/steady_timer.exe \
+ tests/unit/strand.exe \
+ tests/unit/streambuf.exe \
+ tests/unit/system_context.exe \
+ tests/unit/system_executor.exe \
+ tests/unit/system_timer.exe \
+ tests/unit/this_coro.exe \
+ tests/unit/thread.exe \
+ tests/unit/thread_pool.exe \
+ tests/unit/time_traits.exe \
+ tests/unit/ts/buffer.exe \
+ tests/unit/ts/executor.exe \
+ tests/unit/ts/internet.exe \
+ tests/unit/ts/io_context.exe \
+ tests/unit/ts/net.exe \
+ tests/unit/ts/netfwd.exe \
+ tests/unit/ts/socket.exe \
+ tests/unit/ts/timer.exe \
+ tests/unit/use_awaitable.exe \
+ tests/unit/use_future.exe \
+ tests/unit/uses_executor.exe \
+ tests/unit/wait_traits.exe \
+ tests/unit/windows/basic_object_handle.exe \
+ tests/unit/windows/basic_overlapped_handle.exe \
+ tests/unit/windows/basic_random_access_handle.exe \
+ tests/unit/windows/basic_stream_handle.exe \
+ tests/unit/windows/object_handle.exe \
+ tests/unit/windows/overlapped_handle.exe \
+ tests/unit/windows/overlapped_ptr.exe \
+ tests/unit/windows/random_access_handle.exe \
+ tests/unit/windows/stream_handle.exe \
+ tests/unit/write.exe \
+ tests/unit/write_at.exe
+
+CPP11_EXAMPLE_EXES = \
+ examples/cpp11/allocation/server.exe \
+ examples/cpp11/buffers/reference_counted.exe \
+ examples/cpp11/chat/chat_client.exe \
+ examples/cpp11/chat/chat_server.exe \
+ examples/cpp11/echo/async_tcp_echo_server.exe \
+ examples/cpp11/echo/async_udp_echo_server.exe \
+ examples/cpp11/echo/blocking_tcp_echo_client.exe \
+ examples/cpp11/echo/blocking_tcp_echo_server.exe \
+ examples/cpp11/echo/blocking_udp_echo_client.exe \
+ examples/cpp11/echo/blocking_udp_echo_server.exe \
+ examples/cpp11/http/client/async_client.exe \
+ examples/cpp11/http/client/sync_client.exe \
+ examples/cpp11/http/server/http_server.exe \
+ examples/cpp11/http/server2/http_server.exe \
+ examples/cpp11/http/server3/http_server.exe \
+ examples/cpp11/http/server4/http_server.exe \
+ examples/cpp11/icmp/ping.exe \
+ examples/cpp11/invocation/prioritised_handlers.exe \
+ examples/cpp11/iostreams/daytime_client.exe \
+ examples/cpp11/iostreams/daytime_server.exe \
+ examples/cpp11/iostreams/http_client.exe \
+ examples/cpp11/multicast/receiver.exe \
+ examples/cpp11/multicast/sender.exe \
+ examples/cpp11/nonblocking/third_party_lib.exe \
+ examples/cpp11/porthopper/client.exe \
+ examples/cpp11/porthopper/server.exe \
+ examples/cpp11/services/daytime_client.exe \
+ examples/cpp11/socks4/sync_client.exe \
+ examples/cpp11/timeouts/async_tcp_client.exe \
+ examples/cpp11/timeouts/blocking_tcp_client.exe \
+ examples/cpp11/timeouts/blocking_token_tcp_client.exe \
+ examples/cpp11/timeouts/blocking_udp_client.exe \
+ examples/cpp11/timeouts/server.exe \
+ examples/cpp11/timers/time_t_timer.exe \
+ examples/cpp11/tutorial/timer1/timer.exe \
+ examples/cpp11/tutorial/timer2/timer.exe \
+ examples/cpp11/tutorial/timer3/timer.exe \
+ examples/cpp11/tutorial/timer4/timer.exe \
+ examples/cpp11/tutorial/timer5/timer.exe \
+ examples/cpp11/tutorial/daytime1/client.exe \
+ examples/cpp11/tutorial/daytime2/server.exe \
+ examples/cpp11/tutorial/daytime3/server.exe \
+ examples/cpp11/tutorial/daytime4/client.exe \
+ examples/cpp11/tutorial/daytime5/server.exe \
+ examples/cpp11/tutorial/daytime6/server.exe \
+ examples/cpp11/tutorial/daytime7/server.exe \
+ examples/cpp11/windows/transmit_file.exe
+
+ifdef STANDALONE
+all: \
+ $(SEPARATE_COMPILATION_LIB) \
+ $(EXAMPLE_EXES) \
+ $(UNIT_TEST_EXES)
+else
+all: \
+ $(SEPARATE_COMPILATION_LIB) \
+ $(PERFORMANCE_TEST_EXES) \
+ $(EXAMPLE_EXES) \
+ $(OTHER_EXAMPLE_EXES) \
+ $(UNIT_TEST_EXES)
+endif
+
+ifdef SEPARATE_COMPILATION
+libasio.a: asio.o
+ ar ru libasio.a asio.o
+endif
+
+check: $(UNIT_TEST_EXES) $(addprefix run.,$(UNIT_TEST_EXES))
+
+$(addprefix run.,$(UNIT_TEST_EXES))::
+ @echo === Running $(@:run.%=%) ===
+ @$(@:run.%=%)
+ @echo.
+
+clean:
+ -del libasio.a asio.o
+ -del /q /s tests\*.exe
+ -del /q /s tests\*.o
+ -del /q /s examples\*.exe
+ -del /q /s examples\*.o
+
+$(UNIT_TEST_EXES): %.exe: %.o
+ g++ -o$@ $(LDFLAGS) $< $(LIBS)
+
+$(PERFORMANCE_TEST_EXES) $(EXAMPLE_EXES): %.exe: %.o
+ g++ -o$@ $(LDFLAGS) $< $(LIBS)
+
+examples/cpp11/http/server/http_server.exe: \
+ examples/cpp11/http/server/connection.o \
+ examples/cpp11/http/server/connection_manager.o \
+ examples/cpp11/http/server/main.o \
+ examples/cpp11/http/server/mime_types.o \
+ examples/cpp11/http/server/reply.o \
+ examples/cpp11/http/server/request_handler.o \
+ examples/cpp11/http/server/request_parser.o \
+ examples/cpp11/http/server/server.o
+ g++ -o$@ $(LDFLAGS) $^ $(LIBS)
+
+examples/cpp11/http/server2/http_server.exe: \
+ examples/cpp11/http/server2/connection.o \
+ examples/cpp11/http/server2/io_context_pool.o \
+ examples/cpp11/http/server2/main.o \
+ examples/cpp11/http/server2/mime_types.o \
+ examples/cpp11/http/server2/reply.o \
+ examples/cpp11/http/server2/request_handler.o \
+ examples/cpp11/http/server2/request_parser.o \
+ examples/cpp11/http/server2/server.o
+ g++ -o$@ $(LDFLAGS) $^ $(LIBS)
+
+examples/cpp11/http/server3/http_server.exe: \
+ examples/cpp11/http/server3/connection.o \
+ examples/cpp11/http/server3/main.o \
+ examples/cpp11/http/server3/mime_types.o \
+ examples/cpp11/http/server3/reply.o \
+ examples/cpp11/http/server3/request_handler.o \
+ examples/cpp11/http/server3/request_parser.o \
+ examples/cpp11/http/server3/server.o
+ g++ -o$@ $(LDFLAGS) $^ $(LIBS)
+
+examples/cpp11/services/daytime_client.exe: \
+ examples/cpp11/services/daytime_client.o \
+ examples/cpp11/services/logger_service.o
+ g++ -o$@ $(LDFLAGS) $^ $(LIBS)
+
+.cpp.o:
+ g++ -o$@ -c $(CXXFLAGS) $(DEFINES) $<
diff --git a/3rdparty/asio/src/Makefile.msc b/3rdparty/asio/src/Makefile.msc
new file mode 100644
index 00000000000..840dc7bebfe
--- /dev/null
+++ b/3rdparty/asio/src/Makefile.msc
@@ -0,0 +1,550 @@
+!ifndef BOOSTDIR
+BOOSTDIR = ../../boost_1_34_1
+!endif
+
+COMMON_CXXFLAGS = -nologo -EHac -GR -I. -I../include
+
+!ifdef CXXLATEST
+STD_CXXFLAGS = -std:c++latest -permissive-
+!endif
+
+!ifdef WARNINGS
+WARNINGS_CXXFLAGS = -W4 -wd4512 -wd4447
+!endif
+
+!ifdef STATICRTL
+! ifdef DEBUG
+DEBUG_CXXFLAGS = -Zi -MTd
+! else
+DEBUG_CXXFLAGS = -O2 -MT
+! endif
+!else
+! ifdef DEBUG
+DEBUG_CXXFLAGS = -Zi -MDd
+! else
+DEBUG_CXXFLAGS = -O2 -MD
+! endif
+!endif
+
+!ifdef UNICODE
+UNICODE_CXXFLAGS = -DUNICODE -D_UNICODE
+!endif
+
+!ifdef TRACKING
+TRACKING_CXXFLAGS = -DASIO_ENABLE_HANDLER_TRACKING
+!endif
+
+!ifndef _WIN32_WINNT
+! ifdef STORE
+_WIN32_WINNT=0x0603
+! else
+_WIN32_WINNT=0x0601
+! endif
+!endif
+
+!ifdef WIN9X
+DEFINES = \
+ -DASIO_DISABLE_IOCP \
+ -D_WIN32_WINNT=$(_WIN32_WINNT) \
+ -DBOOST_ALL_NO_LIB \
+ -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
+!else
+! ifdef STORE
+DEFINES = \
+ -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP \
+ -DBOOST_ALL_NO_LIB -D_WIN32_WINNT=$(_WIN32_WINNT) \
+ -DUNICODE -D_UNICODE \
+ -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
+! else
+! ifdef WINRT
+DEFINES = \
+ -ZW -FI SDKDDKVer.h -FI winapifamily.h -DWINAPI_FAMILY=WINAPI_PARTITION_APP \
+ -DBOOST_ALL_NO_LIB \
+ -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
+! else
+DEFINES = \
+ -D_WIN32_WINNT=$(_WIN32_WINNT) \
+ -DBOOST_ALL_NO_LIB \
+ -DBOOST_CHRONO_DONT_PROVIDE_HYBRID_ERROR_HANDLING
+! endif
+! endif
+!endif
+
+!ifdef SEPARATE_COMPILATION
+LIBS = asio.lib
+SEPARATE_COMPILATION_CXXFLAGS = \
+ -DASIO_SEPARATE_COMPILATION \
+ -DASIO_ENABLE_CANCELIO
+!endif
+
+!ifdef STANDALONE
+STANDALONE_CXXFLAGS = -DASIO_STANDALONE
+!else
+STANDALONE_CXXFLAGS = -I$(BOOSTDIR) -DASIO_ENABLE_BOOST
+!endif
+
+CXXFLAGS = \
+ $(COMMON_CXXFLAGS) \
+ $(STD_CXXFLAGS) \
+ $(WARNINGS_CXXFLAGS) \
+ $(DEBUG_CXXFLAGS) \
+ $(UNICODE_CXXFLAGS) \
+ $(TRACKING_CXXFLAGS) \
+ $(SEPARATE_COMPILATION_CXXFLAGS) \
+ $(STANDALONE_CXXFLAGS)
+
+!ifndef SSLDIR
+SSLDIR = ../../openssl-0.9.8g
+!endif
+
+SSL_CXXFLAGS = -I$(SSLDIR)/inc32
+
+SSL_LIBS = \
+ $(SSLDIR)/out32/libeay32.lib \
+ $(SSLDIR)/out32/ssleay32.lib \
+ user32.lib advapi32.lib gdi32.lib
+
+LATENCY_TEST_EXES = \
+ tests\latency\tcp_client.exe \
+ tests\latency\tcp_server.exe \
+ tests\latency\udp_client.exe \
+ tests\latency\udp_server.exe
+
+PERFORMANCE_TEST_EXES = \
+ tests\performance\client.exe \
+ tests\performance\server.exe
+
+UNIT_TEST_EXES = \
+ tests\unit\any_completion_executor.exe \
+ tests\unit\any_completion_handler.exe \
+ tests\unit\any_io_executor.exe \
+ tests\unit\append.exe \
+ tests\unit\as_tuple.exe \
+ tests\unit\associated_allocator.exe \
+ tests\unit\associated_cancellation_slot.exe \
+ tests\unit\associated_executor.exe \
+ tests\unit\associator.exe \
+ tests\unit\async_result.exe \
+ tests\unit\awaitable.exe \
+ tests\unit\basic_datagram_socket.exe \
+ tests\unit\basic_deadline_timer.exe \
+ tests\unit\basic_file.exe \
+ tests\unit\basic_random_access_file.exe \
+ tests\unit\basic_raw_socket.exe \
+ tests\unit\basic_readable_pipe.exe \
+ tests\unit\basic_seq_packet_socket.exe \
+ tests\unit\basic_serial_port.exe \
+ tests\unit\basic_signal_set.exe \
+ tests\unit\basic_socket.exe \
+ tests\unit\basic_socket_acceptor.exe \
+ tests\unit\basic_stream_file.exe \
+ tests\unit\basic_stream_socket.exe \
+ tests\unit\basic_streambuf.exe \
+ tests\unit\basic_waitable_timer.exe \
+ tests\unit\basic_writable_pipe.exe \
+ tests\unit\bind_allocator.exe \
+ tests\unit\bind_cancellation_slot.exe \
+ tests\unit\bind_executor.exe \
+ tests\unit\bind_immediate_executor.exe \
+ tests\unit\buffered_read_stream.exe \
+ tests\unit\buffered_stream.exe \
+ tests\unit\buffered_write_stream.exe \
+ tests\unit\buffer.exe \
+ tests\unit\buffer_registration.exe \
+ tests\unit\buffers_iterator.exe \
+ tests\unit\cancellation_signal.exe \
+ tests\unit\cancellation_state.exe \
+ tests\unit\cancellation_type.exe \
+ tests\unit\co_spawn.exe \
+ tests\unit\completion_condition.exe \
+ tests\unit\compose.exe \
+ tests\unit\connect.exe \
+ tests\unit\connect_pipe.exe \
+ tests\unit\coroutine.exe \
+ tests\unit\deadline_timer.exe \
+ tests\unit\defer.exe \
+ tests\unit\deferred.exe \
+ tests\unit\detached.exe \
+ tests\unit\dispatch.exe \
+ tests\unit\error.exe \
+ tests\unit\execution_context.exe \
+ tests\unit\execution\any_executor.exe \
+ tests\unit\execution\blocking.exe \
+ tests\unit\execution\blocking_adaptation.exe \
+ tests\unit\execution\context_as.exe \
+ tests\unit\execution\executor.exe \
+ tests\unit\execution\invocable_archetype.exe \
+ tests\unit\execution\mapping.exe \
+ tests\unit\execution\outstanding_work.exe \
+ tests\unit\execution\prefer_only.exe \
+ tests\unit\execution\relationship.exe \
+ tests\unit\executor.exe \
+ tests\unit\executor_work_guard.exe \
+ tests\unit\file_base.exe \
+ tests\unit\generic\basic_endpoint.exe \
+ tests\unit\generic\datagram_protocol.exe \
+ tests\unit\generic\raw_protocol.exe \
+ tests\unit\generic\seq_packet_protocol.exe \
+ tests\unit\generic\stream_protocol.exe \
+ tests\unit\high_resolution_timer.exe \
+ tests\unit\io_context.exe \
+ tests\unit\io_context_strand.exe \
+ tests\unit\ip\address.exe \
+ tests\unit\ip\address_v4.exe \
+ tests\unit\ip\address_v4_iterator.exe \
+ tests\unit\ip\address_v4_range.exe \
+ tests\unit\ip\address_v6.exe \
+ tests\unit\ip\address_v6_iterator.exe \
+ tests\unit\ip\address_v6_range.exe \
+ tests\unit\ip\basic_endpoint.exe \
+ tests\unit\ip\basic_resolver.exe \
+ tests\unit\ip\basic_resolver_entry.exe \
+ tests\unit\ip\basic_resolver_iterator.exe \
+ tests\unit\ip\basic_resolver_query.exe \
+ tests\unit\ip\host_name.exe \
+ tests\unit\ip\icmp.exe \
+ tests\unit\ip\multicast.exe \
+ tests\unit\ip\network_v4.exe \
+ tests\unit\ip\network_v6.exe \
+ tests\unit\ip\resolver_query_base.exe \
+ tests\unit\ip\tcp.exe \
+ tests\unit\ip\udp.exe \
+ tests\unit\ip\unicast.exe \
+ tests\unit\ip\v6_only.exe \
+ tests\unit\local\basic_endpoint.exe \
+ tests\unit\local\connect_pair.exe \
+ tests\unit\local\datagram_protocol.exe \
+ tests\unit\local\stream_protocol.exe \
+ tests\unit\is_read_buffered.exe \
+ tests\unit\is_write_buffered.exe \
+ tests\unit\packaged_task.exe \
+ tests\unit\placeholders.exe \
+ tests\unit\post.exe \
+ tests\unit\prepend.exe \
+ tests\unit\random_access_file.exe \
+ tests\unit\read.exe \
+ tests\unit\read_at.exe \
+ tests\unit\read_until.exe \
+ tests\unit\readable_pipe.exe \
+ tests\unit\recycling_allocator.exe \
+ tests\unit\redirect_error.exe \
+ tests\unit\registered_buffer.exe \
+ tests\unit\serial_port.exe \
+ tests\unit\serial_port_base.exe \
+ tests\unit\signal_set.exe \
+ tests\unit\signal_set_base.exe \
+ tests\unit\socket_base.exe \
+ tests\unit\static_thread_pool.exe \
+ tests\unit\steady_timer.exe \
+ tests\unit\strand.exe \
+ tests\unit\stream_file.exe \
+ tests\unit\streambuf.exe \
+ tests\unit\system_context.exe \
+ tests\unit\system_executor.exe \
+ tests\unit\system_timer.exe \
+ tests\unit\this_coro.exe \
+ tests\unit\thread.exe \
+ tests\unit\thread_pool.exe \
+ tests\unit\time_traits.exe \
+ tests\unit\ts\buffer.exe \
+ tests\unit\ts\executor.exe \
+ tests\unit\ts\internet.exe \
+ tests\unit\ts\io_context.exe \
+ tests\unit\ts\net.exe \
+ tests\unit\ts\netfwd.exe \
+ tests\unit\ts\socket.exe \
+ tests\unit\ts\timer.exe \
+ tests\unit\use_awaitable.exe \
+ tests\unit\use_future.exe \
+ tests\unit\uses_executor.exe \
+ tests\unit\wait_traits.exe \
+ tests\unit\windows\basic_object_handle.exe \
+ tests\unit\windows\basic_overlapped_handle.exe \
+ tests\unit\windows\basic_random_access_handle.exe \
+ tests\unit\windows\basic_stream_handle.exe \
+ tests\unit\windows\object_handle.exe \
+ tests\unit\windows\overlapped_handle.exe \
+ tests\unit\windows\overlapped_ptr.exe \
+ tests\unit\windows\random_access_handle.exe \
+ tests\unit\windows\stream_handle.exe \
+ tests\unit\writable_pipe.exe \
+ tests\unit\write.exe \
+ tests\unit\write_at.exe
+
+CPP11_EXAMPLE_EXES = \
+ examples\cpp11\allocation\server.exe \
+ examples\cpp11\buffers\reference_counted.exe \
+ examples\cpp11\chat\chat_client.exe \
+ examples\cpp11\chat\chat_server.exe \
+ examples\cpp11\echo\async_tcp_echo_server.exe \
+ examples\cpp11\echo\async_udp_echo_server.exe \
+ examples\cpp11\echo\blocking_tcp_echo_client.exe \
+ examples\cpp11\echo\blocking_tcp_echo_server.exe \
+ examples\cpp11\echo\blocking_udp_echo_client.exe \
+ examples\cpp11\echo\blocking_udp_echo_server.exe \
+ examples\cpp11\http\client\async_client.exe \
+ examples\cpp11\http\client\sync_client.exe \
+ examples\cpp11\http\server\http_server.exe \
+ examples\cpp11\http\server2\http_server.exe \
+ examples\cpp11\http\server3\http_server.exe \
+ examples\cpp11\http\server4\http_server.exe \
+ examples\cpp11\icmp\ping.exe \
+ examples\cpp11\invocation\prioritised_handlers.exe \
+ examples\cpp11\iostreams\daytime_client.exe \
+ examples\cpp11\iostreams\daytime_server.exe \
+ examples\cpp11\iostreams\http_client.exe \
+ examples\cpp11\multicast\receiver.exe \
+ examples\cpp11\multicast\sender.exe \
+ examples\cpp11\nonblocking\third_party_lib.exe \
+ examples\cpp11\porthopper\client.exe \
+ examples\cpp11\porthopper\server.exe \
+ examples\cpp11\services\daytime_client.exe \
+ examples\cpp11\socks4\sync_client.exe \
+ examples\cpp11\timeouts\async_tcp_client.exe \
+ examples\cpp11\timeouts\blocking_tcp_client.exe \
+ examples\cpp11\timeouts\blocking_token_tcp_client.exe \
+ examples\cpp11\timeouts\blocking_udp_client.exe \
+ examples\cpp11\timeouts\server.exe \
+ examples\cpp11\timers\time_t_timer.exe \
+ examples\cpp11\tutorial\timer1\timer.exe \
+ examples\cpp11\tutorial\timer2\timer.exe \
+ examples\cpp11\tutorial\timer3\timer.exe \
+ examples\cpp11\tutorial\timer4\timer.exe \
+ examples\cpp11\tutorial\timer5\timer.exe \
+ examples\cpp11\tutorial\daytime1\client.exe \
+ examples\cpp11\tutorial\daytime2\server.exe \
+ examples\cpp11\tutorial\daytime3\server.exe \
+ examples\cpp11\tutorial\daytime4\client.exe \
+ examples\cpp11\tutorial\daytime5\server.exe \
+ examples\cpp11\tutorial\daytime6\server.exe \
+ examples\cpp11\tutorial\daytime7\server.exe \
+ examples\cpp11\windows\transmit_file.exe
+
+SSL_UNIT_TEST_EXES = \
+ tests\unit\ssl\basic_context.exe \
+ tests\unit\ssl\context.exe \
+ tests\unit\ssl\context_base.exe \
+ tests\unit\ssl\context_service.exe \
+ tests\unit\ssl\rfc2818_verification.exe \
+ tests\unit\ssl\stream.exe \
+ tests\unit\ssl\stream_base.exe \
+ tests\unit\ssl\stream_service.exe
+
+SSL_EXAMPLE_EXES = \
+ examples\cpp11\ssl\client.exe \
+ examples\cpp11\ssl\server.exe
+
+!ifdef SEPARATE_COMPILATION
+all: asio.lib
+asio.lib: asio.cpp
+ cl -Fe$@ -Foasio.obj $(CXXFLAGS) $(DEFINES) -c asio.cpp
+ lib -name:asio.lib asio.obj
+!endif
+
+!ifdef STANDALONE
+all: \
+ $(CPP11_EXAMPLE_EXES) \
+ $(UNIT_TEST_EXES)
+!else
+all: \
+ $(LATENCY_TEST_EXES) \
+ $(PERFORMANCE_TEST_EXES) \
+ $(CPP11_EXAMPLE_EXES) \
+ $(UNIT_TEST_EXES)
+!endif
+
+ssl: \
+ $(SSL_UNIT_TEST_EXES) \
+ $(SSL_EXAMPLE_EXES)
+
+check: $(UNIT_TEST_EXES)
+ !@echo === Running $** === && $** && echo.
+
+{tests\latency}.cpp{tests\latency}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{tests\performance}.cpp{tests\performance}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+tests\unit\unit_test.obj: tests\unit\unit_test.cpp
+ cl -Fe$@ -Fotests\unit\unit_test.obj $(CXXFLAGS) $(DEFINES) -c tests\unit\unit_test.cpp
+
+{tests\unit}.cpp{tests\unit}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{tests\unit\execution}.cpp{tests\unit\execution}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{tests\unit\generic}.cpp{tests\unit\generic}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{tests\unit\ip}.cpp{tests\unit\ip}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{tests\unit\local}.cpp{tests\unit\local}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{tests\unit\ssl}.cpp{tests\unit\ssl}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(SSL_CXXFLAGS) $(DEFINES) $< $(SSL_LIBS) $(LIBS) -link -opt:ref
+
+{tests\unit\ts}.cpp{tests\unit\ts}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{tests\unit\windows}.cpp{tests\unit\windows}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\allocation}.cpp{examples\cpp11\allocation}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\buffers}.cpp{examples\cpp11\buffers}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\chat}.cpp{examples\cpp11\chat}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\echo}.cpp{examples\cpp11\echo}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\http\client}.cpp{examples\cpp11\http\client}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\icmp}.cpp{examples\cpp11\icmp}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\invocation}.cpp{examples\cpp11\invocation}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\iostreams}.cpp{examples\cpp11\iostreams}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\multicast}.cpp{examples\cpp11\multicast}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\nonblocking}.cpp{examples\cpp11\nonblocking}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\porthopper}.cpp{examples\cpp11\porthopper}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\socks4}.cpp{examples\cpp11\socks4}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\ssl}.cpp{examples\cpp11\ssl}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(SSL_CXXFLAGS) $(DEFINES) $< $(SSL_LIBS) $(LIBS) -link -opt:ref
+
+{examples\cpp11\timeouts}.cpp{examples\cpp11\timeouts}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\timers}.cpp{examples\cpp11\timers}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\tutorial\timer1}.cpp{examples\cpp11\tutorial\timer1}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\tutorial\timer2}.cpp{examples\cpp11\tutorial\timer2}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\tutorial\timer3}.cpp{examples\cpp11\tutorial\timer3}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\tutorial\timer4}.cpp{examples\cpp11\tutorial\timer4}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\tutorial\timer5}.cpp{examples\cpp11\tutorial\timer5}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\tutorial\daytime1}.cpp{examples\cpp11\tutorial\daytime1}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\tutorial\daytime2}.cpp{examples\cpp11\tutorial\daytime2}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\tutorial\daytime3}.cpp{examples\cpp11\tutorial\daytime3}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\tutorial\daytime4}.cpp{examples\cpp11\tutorial\daytime4}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\tutorial\daytime5}.cpp{examples\cpp11\tutorial\daytime5}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\tutorial\daytime6}.cpp{examples\cpp11\tutorial\daytime6}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\tutorial\daytime7}.cpp{examples\cpp11\tutorial\daytime7}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\windows}.cpp{examples\cpp11\windows}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\executors}.cpp{examples\cpp11\executors}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp11\operations}.cpp{examples\cpp11\operations}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+{examples\cpp14\operations}.cpp{examples\cpp14\operations}.exe:
+ cl -Fe$@ -Fo$(<:.cpp=.obj) $(CXXFLAGS) $(DEFINES) $< $(LIBS) -link -opt:ref
+
+examples\cpp11\http\server\http_server.exe: \
+ examples\cpp11\http\server\connection.cpp \
+ examples\cpp11\http\server\connection_manager.cpp \
+ examples\cpp11\http\server\main.cpp \
+ examples\cpp11\http\server\mime_types.cpp \
+ examples\cpp11\http\server\reply.cpp \
+ examples\cpp11\http\server\request_handler.cpp \
+ examples\cpp11\http\server\request_parser.cpp \
+ examples\cpp11\http\server\server.cpp
+ cl -Fe$@ -Foexamples\cpp11\http\server\ $(CXXFLAGS) $(DEFINES) $** $(LIBS) -link -opt:ref
+
+examples\cpp11\http\server2\http_server.exe: \
+ examples\cpp11\http\server2\connection.cpp \
+ examples\cpp11\http\server2\io_context_pool.cpp \
+ examples\cpp11\http\server2\main.cpp \
+ examples\cpp11\http\server2\mime_types.cpp \
+ examples\cpp11\http\server2\reply.cpp \
+ examples\cpp11\http\server2\request_handler.cpp \
+ examples\cpp11\http\server2\request_parser.cpp \
+ examples\cpp11\http\server2\server.cpp
+ cl -Fe$@ -Foexamples\cpp11\http\server2\ $(CXXFLAGS) $(DEFINES) $** $(LIBS) -link -opt:ref
+
+examples\cpp11\http\server3\http_server.exe: \
+ examples\cpp11\http\server3\connection.cpp \
+ examples\cpp11\http\server3\main.cpp \
+ examples\cpp11\http\server3\mime_types.cpp \
+ examples\cpp11\http\server3\reply.cpp \
+ examples\cpp11\http\server3\request_handler.cpp \
+ examples\cpp11\http\server3\request_parser.cpp \
+ examples\cpp11\http\server3\server.cpp
+ cl -Fe$@ -Foexamples\cpp11\http\server3\ $(CXXFLAGS) $(DEFINES) $** $(LIBS) -link -opt:ref
+
+examples\cpp11\http\server4\http_server.exe: \
+ examples\cpp11\http\server4\file_handler.cpp \
+ examples\cpp11\http\server4\main.cpp \
+ examples\cpp11\http\server4\mime_types.cpp \
+ examples\cpp11\http\server4\reply.cpp \
+ examples\cpp11\http\server4\request_parser.cpp \
+ examples\cpp11\http\server4\server.cpp
+ cl -Fe$@ -Foexamples\cpp11\http\server4\ $(CXXFLAGS) $(DEFINES) $** $(LIBS) -link -opt:ref
+
+examples\cpp11\services\daytime_client.exe: \
+ examples\cpp11\services\daytime_client.cpp \
+ examples\cpp11\services\logger_service.cpp
+ cl -Fe$@ -Foexamples\cpp11\services\ $(CXXFLAGS) $(DEFINES) $** $(LIBS) -link -opt:ref
+
+clean:
+ -del /q /s asio.lib
+ -del /q /s asio.obj
+ -del /q /s tests\*.exe
+ -del /q /s tests\*.exe.manifest
+ -del /q /s tests\*.exp
+ -del /q /s tests\*.ilk
+ -del /q /s tests\*.pdb
+ -del /q /s tests\*.obj
+ -del /q /s examples\*.exe
+ -del /q /s examples\*.exe.manifest
+ -del /q /s examples\*.exp
+ -del /q /s examples\*.ilk
+ -del /q /s examples\*.pdb
+ -del /q /s examples\*.obj
+ -del /q /s *.pdb
diff --git a/3rdparty/asio/src/asio.cpp b/3rdparty/asio/src/asio.cpp
new file mode 100644
index 00000000000..bd919afb87c
--- /dev/null
+++ b/3rdparty/asio/src/asio.cpp
@@ -0,0 +1,11 @@
+//
+// asio.cpp
+// ~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/impl/src.hpp"
diff --git a/3rdparty/asio/src/asio_ssl.cpp b/3rdparty/asio/src/asio_ssl.cpp
new file mode 100644
index 00000000000..6a5a626a69a
--- /dev/null
+++ b/3rdparty/asio/src/asio_ssl.cpp
@@ -0,0 +1,11 @@
+//
+// asio_ssl.cpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/ssl/impl/src.hpp"
diff --git a/3rdparty/asio/src/examples/cpp11/Makefile.am b/3rdparty/asio/src/examples/cpp11/Makefile.am
new file mode 100644
index 00000000000..a132a469ff5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/Makefile.am
@@ -0,0 +1,308 @@
+AUTOMAKE_OPTIONS = subdir-objects
+
+if SEPARATE_COMPILATION
+noinst_LIBRARIES = libasio.a
+libasio_a_SOURCES = ../../asio.cpp
+if HAVE_OPENSSL
+libasio_a_SOURCES += ../../asio_ssl.cpp
+endif
+LDADD = libasio.a
+endif
+
+noinst_PROGRAMS = \
+ allocation/server \
+ buffers/reference_counted \
+ chat/chat_client \
+ chat/chat_server \
+ deferred/deferred_1 \
+ deferred/deferred_2 \
+ echo/async_tcp_echo_server \
+ echo/async_udp_echo_server \
+ echo/blocking_tcp_echo_client \
+ echo/blocking_tcp_echo_server \
+ echo/blocking_udp_echo_client \
+ echo/blocking_udp_echo_server \
+ executors/actor \
+ executors/bank_account_1 \
+ executors/bank_account_2 \
+ executors/fork_join \
+ executors/pipeline \
+ executors/priority_scheduler \
+ files/blocking_file_copy \
+ files/async_file_copy \
+ futures/daytime_client \
+ handler_tracking/async_tcp_echo_server \
+ http/client/async_client \
+ http/client/sync_client \
+ http/server/http_server \
+ http/server2/http_server \
+ http/server3/http_server \
+ http/server4/http_server \
+ icmp/ping \
+ invocation/prioritised_handlers \
+ iostreams/daytime_client \
+ iostreams/daytime_server \
+ iostreams/http_client \
+ multicast/receiver \
+ multicast/sender \
+ nonblocking/third_party_lib \
+ operations/composed_1 \
+ operations/composed_2 \
+ operations/composed_3 \
+ operations/composed_4 \
+ operations/composed_5 \
+ operations/composed_6 \
+ operations/composed_7 \
+ operations/composed_8 \
+ parallel_group/ranged_wait_for_all \
+ parallel_group/wait_for_all \
+ parallel_group/wait_for_one \
+ parallel_group/wait_for_one_error \
+ parallel_group/wait_for_one_success \
+ porthopper/client \
+ porthopper/server \
+ services/daytime_client \
+ socks4/sync_client \
+ timeouts/async_tcp_client \
+ timeouts/blocking_tcp_client \
+ timeouts/blocking_token_tcp_client \
+ timeouts/blocking_udp_client \
+ timeouts/server \
+ timers/time_t_timer \
+ tutorial/timer1/timer \
+ tutorial/timer2/timer \
+ tutorial/timer3/timer \
+ tutorial/timer4/timer \
+ tutorial/timer5/timer \
+ tutorial/daytime1/client \
+ tutorial/daytime2/server \
+ tutorial/daytime3/server \
+ tutorial/daytime4/client \
+ tutorial/daytime5/server \
+ tutorial/daytime6/server \
+ tutorial/daytime7/server \
+ type_erasure/type_erasure
+
+if !WINDOWS_TARGET
+noinst_PROGRAMS += \
+ chat/posix_chat_client \
+ fork/daemon \
+ fork/process_per_connection \
+ local/connect_pair \
+ local/iostream_client \
+ local/stream_server \
+ local/stream_client \
+ local/fd_passing_stream_server \
+ local/fd_passing_stream_client
+endif
+
+if WINDOWS_TARGET
+noinst_PROGRAMS += \
+ windows/transmit_file
+endif
+
+if HAVE_OPENSSL
+noinst_PROGRAMS += \
+ ssl/client \
+ ssl/server
+endif
+
+if HAVE_BOOST_COROUTINE
+noinst_PROGRAMS += \
+ spawn/echo_server \
+ spawn/parallel_grep
+endif
+
+noinst_HEADERS = \
+ chat/chat_message.hpp \
+ handler_tracking/custom_tracking.hpp \
+ http/server/connection.hpp \
+ http/server/connection_manager.hpp \
+ http/server/header.hpp \
+ http/server/mime_types.hpp \
+ http/server/reply.hpp \
+ http/server/request.hpp \
+ http/server/request_handler.hpp \
+ http/server/request_parser.hpp \
+ http/server/server.hpp \
+ http/server2/connection.hpp \
+ http/server2/io_context_pool.hpp \
+ http/server2/header.hpp \
+ http/server2/mime_types.hpp \
+ http/server2/reply.hpp \
+ http/server2/request.hpp \
+ http/server2/request_handler.hpp \
+ http/server2/request_parser.hpp \
+ http/server2/server.hpp \
+ http/server3/connection.hpp \
+ http/server3/header.hpp \
+ http/server3/mime_types.hpp \
+ http/server3/reply.hpp \
+ http/server3/request.hpp \
+ http/server3/request_handler.hpp \
+ http/server3/request_parser.hpp \
+ http/server3/server.hpp \
+ http/server4/file_handler.hpp \
+ http/server4/header.hpp \
+ http/server4/mime_types.hpp \
+ http/server4/reply.hpp \
+ http/server4/request.hpp \
+ http/server4/request_parser.hpp \
+ http/server4/server.hpp \
+ icmp/icmp_header.hpp \
+ icmp/ipv4_header.hpp \
+ porthopper/protocol.hpp \
+ services/basic_logger.hpp \
+ services/logger.hpp \
+ services/logger_service.hpp \
+ socks4/socks4.hpp \
+ type_erasure/line_reader.hpp \
+ type_erasure/stdin_line_reader.hpp \
+ type_erasure/sleep.hpp
+
+AM_CXXFLAGS = -I$(srcdir)/../../../include
+
+allocation_server_SOURCES = allocation/server.cpp
+buffers_reference_counted_SOURCES = buffers/reference_counted.cpp
+chat_chat_client_SOURCES = chat/chat_client.cpp
+chat_chat_server_SOURCES = chat/chat_server.cpp
+deferred_deferred_1_SOURCES = deferred/deferred_1.cpp
+deferred_deferred_2_SOURCES = deferred/deferred_2.cpp
+echo_async_tcp_echo_server_SOURCES = echo/async_tcp_echo_server.cpp
+echo_async_udp_echo_server_SOURCES = echo/async_udp_echo_server.cpp
+echo_blocking_tcp_echo_client_SOURCES = echo/blocking_tcp_echo_client.cpp
+echo_blocking_tcp_echo_server_SOURCES = echo/blocking_tcp_echo_server.cpp
+echo_blocking_udp_echo_client_SOURCES = echo/blocking_udp_echo_client.cpp
+echo_blocking_udp_echo_server_SOURCES = echo/blocking_udp_echo_server.cpp
+executors_actor_SOURCES = executors/actor.cpp
+executors_bank_account_1_SOURCES = executors/bank_account_1.cpp
+executors_bank_account_2_SOURCES = executors/bank_account_2.cpp
+executors_fork_join_SOURCES = executors/fork_join.cpp
+executors_pipeline_SOURCES = executors/pipeline.cpp
+executors_priority_scheduler_SOURCES = executors/priority_scheduler.cpp
+files_blocking_file_copy_SOURCES = files/blocking_file_copy.cpp
+files_async_file_copy_SOURCES = files/async_file_copy.cpp
+futures_daytime_client_SOURCES = futures/daytime_client.cpp
+handler_tracking_async_tcp_echo_server_SOURCES = handler_tracking/async_tcp_echo_server.cpp
+http_client_async_client_SOURCES = http/client/async_client.cpp
+http_client_sync_client_SOURCES = http/client/sync_client.cpp
+http_server_http_server_SOURCES = \
+ http/server/connection.cpp \
+ http/server/connection_manager.cpp \
+ http/server/main.cpp \
+ http/server/mime_types.cpp \
+ http/server/reply.cpp \
+ http/server/request_handler.cpp \
+ http/server/request_parser.cpp \
+ http/server/server.cpp
+http_server2_http_server_SOURCES = \
+ http/server2/connection.cpp \
+ http/server2/io_context_pool.cpp \
+ http/server2/main.cpp \
+ http/server2/mime_types.cpp \
+ http/server2/reply.cpp \
+ http/server2/request_handler.cpp \
+ http/server2/request_parser.cpp \
+ http/server2/server.cpp
+http_server3_http_server_SOURCES = \
+ http/server3/connection.cpp \
+ http/server3/main.cpp \
+ http/server3/mime_types.cpp \
+ http/server3/reply.cpp \
+ http/server3/request_handler.cpp \
+ http/server3/request_parser.cpp \
+ http/server3/server.cpp
+http_server4_http_server_SOURCES = \
+ http/server4/file_handler.cpp \
+ http/server4/main.cpp \
+ http/server4/mime_types.cpp \
+ http/server4/reply.cpp \
+ http/server4/request_parser.cpp \
+ http/server4/server.cpp
+icmp_ping_SOURCES = icmp/ping.cpp
+invocation_prioritised_handlers_SOURCES = invocation/prioritised_handlers.cpp
+iostreams_daytime_client_SOURCES = iostreams/daytime_client.cpp
+iostreams_daytime_server_SOURCES = iostreams/daytime_server.cpp
+iostreams_http_client_SOURCES = iostreams/http_client.cpp
+multicast_receiver_SOURCES = multicast/receiver.cpp
+multicast_sender_SOURCES = multicast/sender.cpp
+nonblocking_third_party_lib_SOURCES = nonblocking/third_party_lib.cpp
+operations_composed_1_SOURCES = operations/composed_1.cpp
+operations_composed_2_SOURCES = operations/composed_2.cpp
+operations_composed_3_SOURCES = operations/composed_3.cpp
+operations_composed_4_SOURCES = operations/composed_4.cpp
+operations_composed_5_SOURCES = operations/composed_5.cpp
+operations_composed_6_SOURCES = operations/composed_6.cpp
+operations_composed_7_SOURCES = operations/composed_7.cpp
+operations_composed_8_SOURCES = operations/composed_8.cpp
+parallel_group_ranged_wait_for_all_SOURCES = parallel_group/ranged_wait_for_all.cpp
+parallel_group_wait_for_all_SOURCES = parallel_group/wait_for_all.cpp
+parallel_group_wait_for_one_SOURCES = parallel_group/wait_for_one.cpp
+parallel_group_wait_for_one_error_SOURCES = parallel_group/wait_for_one_error.cpp
+parallel_group_wait_for_one_success_SOURCES = parallel_group/wait_for_one_success.cpp
+porthopper_client_SOURCES = porthopper/client.cpp
+porthopper_server_SOURCES = porthopper/server.cpp
+services_daytime_client_SOURCES = \
+ services/daytime_client.cpp \
+ services/logger_service.cpp
+socks4_sync_client_SOURCES = socks4/sync_client.cpp
+timeouts_async_tcp_client_SOURCES = timeouts/async_tcp_client.cpp
+timeouts_blocking_tcp_client_SOURCES = timeouts/blocking_tcp_client.cpp
+timeouts_blocking_token_tcp_client_SOURCES = timeouts/blocking_token_tcp_client.cpp
+timeouts_blocking_udp_client_SOURCES = timeouts/blocking_udp_client.cpp
+timeouts_server_SOURCES = timeouts/server.cpp
+timers_time_t_timer_SOURCES = timers/time_t_timer.cpp
+tutorial_timer1_timer_SOURCES = tutorial/timer1/timer.cpp
+tutorial_timer2_timer_SOURCES = tutorial/timer2/timer.cpp
+tutorial_timer3_timer_SOURCES = tutorial/timer3/timer.cpp
+tutorial_timer4_timer_SOURCES = tutorial/timer4/timer.cpp
+tutorial_timer5_timer_SOURCES = tutorial/timer5/timer.cpp
+tutorial_daytime1_client_SOURCES = tutorial/daytime1/client.cpp
+tutorial_daytime2_server_SOURCES = tutorial/daytime2/server.cpp
+tutorial_daytime3_server_SOURCES = tutorial/daytime3/server.cpp
+tutorial_daytime4_client_SOURCES = tutorial/daytime4/client.cpp
+tutorial_daytime5_server_SOURCES = tutorial/daytime5/server.cpp
+tutorial_daytime6_server_SOURCES = tutorial/daytime6/server.cpp
+tutorial_daytime7_server_SOURCES = tutorial/daytime7/server.cpp
+type_erasure_type_erasure_SOURCES = type_erasure/main.cpp type_erasure/stdin_line_reader.cpp type_erasure/sleep.cpp
+
+if !WINDOWS_TARGET
+chat_posix_chat_client_SOURCES = chat/posix_chat_client.cpp
+fork_daemon_SOURCES = fork/daemon.cpp
+fork_process_per_connection_SOURCES = fork/process_per_connection.cpp
+local_connect_pair_SOURCES = local/connect_pair.cpp
+local_iostream_client_SOURCES = local/iostream_client.cpp
+local_stream_server_SOURCES = local/stream_server.cpp
+local_stream_client_SOURCES = local/stream_client.cpp
+local_fd_passing_stream_server_SOURCES = local/fd_passing_stream_server.cpp
+local_fd_passing_stream_client_SOURCES = local/fd_passing_stream_client.cpp
+endif
+
+if WINDOWS_TARGET
+windows_transmit_file_SOURCES = windows/transmit_file.cpp
+endif
+
+if HAVE_OPENSSL
+ssl_client_SOURCES = ssl/client.cpp
+ssl_server_SOURCES = ssl/server.cpp
+endif
+
+if HAVE_BOOST_COROUTINE
+spawn_echo_server_SOURCES = spawn/echo_server.cpp
+spawn_echo_server_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system
+spawn_parallel_grep_SOURCES = spawn/parallel_grep.cpp
+spawn_parallel_grep_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system
+endif
+
+EXTRA_DIST = \
+ serialization/client.cpp \
+ serialization/server.cpp \
+ serialization/connection.hpp \
+ serialization/stock.hpp \
+ ssl/README \
+ ssl/ca.pem \
+ ssl/server.pem \
+ ssl/dh4096.pem
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
diff --git a/3rdparty/asio/src/examples/cpp11/Makefile.in b/3rdparty/asio/src/examples/cpp11/Makefile.in
new file mode 100644
index 00000000000..0f73bb5b85a
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/Makefile.in
@@ -0,0 +1,2975 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__append_1 = ../../asio_ssl.cpp
+noinst_PROGRAMS = allocation/server$(EXEEXT) \
+ buffers/reference_counted$(EXEEXT) chat/chat_client$(EXEEXT) \
+ chat/chat_server$(EXEEXT) deferred/deferred_1$(EXEEXT) \
+ deferred/deferred_2$(EXEEXT) \
+ echo/async_tcp_echo_server$(EXEEXT) \
+ echo/async_udp_echo_server$(EXEEXT) \
+ echo/blocking_tcp_echo_client$(EXEEXT) \
+ echo/blocking_tcp_echo_server$(EXEEXT) \
+ echo/blocking_udp_echo_client$(EXEEXT) \
+ echo/blocking_udp_echo_server$(EXEEXT) \
+ executors/actor$(EXEEXT) executors/bank_account_1$(EXEEXT) \
+ executors/bank_account_2$(EXEEXT) executors/fork_join$(EXEEXT) \
+ executors/pipeline$(EXEEXT) \
+ executors/priority_scheduler$(EXEEXT) \
+ files/blocking_file_copy$(EXEEXT) \
+ files/async_file_copy$(EXEEXT) futures/daytime_client$(EXEEXT) \
+ handler_tracking/async_tcp_echo_server$(EXEEXT) \
+ http/client/async_client$(EXEEXT) \
+ http/client/sync_client$(EXEEXT) \
+ http/server/http_server$(EXEEXT) \
+ http/server2/http_server$(EXEEXT) \
+ http/server3/http_server$(EXEEXT) \
+ http/server4/http_server$(EXEEXT) icmp/ping$(EXEEXT) \
+ invocation/prioritised_handlers$(EXEEXT) \
+ iostreams/daytime_client$(EXEEXT) \
+ iostreams/daytime_server$(EXEEXT) \
+ iostreams/http_client$(EXEEXT) multicast/receiver$(EXEEXT) \
+ multicast/sender$(EXEEXT) nonblocking/third_party_lib$(EXEEXT) \
+ operations/composed_1$(EXEEXT) operations/composed_2$(EXEEXT) \
+ operations/composed_3$(EXEEXT) operations/composed_4$(EXEEXT) \
+ operations/composed_5$(EXEEXT) operations/composed_6$(EXEEXT) \
+ operations/composed_7$(EXEEXT) operations/composed_8$(EXEEXT) \
+ parallel_group/ranged_wait_for_all$(EXEEXT) \
+ parallel_group/wait_for_all$(EXEEXT) \
+ parallel_group/wait_for_one$(EXEEXT) \
+ parallel_group/wait_for_one_error$(EXEEXT) \
+ parallel_group/wait_for_one_success$(EXEEXT) \
+ porthopper/client$(EXEEXT) porthopper/server$(EXEEXT) \
+ services/daytime_client$(EXEEXT) socks4/sync_client$(EXEEXT) \
+ timeouts/async_tcp_client$(EXEEXT) \
+ timeouts/blocking_tcp_client$(EXEEXT) \
+ timeouts/blocking_token_tcp_client$(EXEEXT) \
+ timeouts/blocking_udp_client$(EXEEXT) timeouts/server$(EXEEXT) \
+ timers/time_t_timer$(EXEEXT) tutorial/timer1/timer$(EXEEXT) \
+ tutorial/timer2/timer$(EXEEXT) tutorial/timer3/timer$(EXEEXT) \
+ tutorial/timer4/timer$(EXEEXT) tutorial/timer5/timer$(EXEEXT) \
+ tutorial/daytime1/client$(EXEEXT) \
+ tutorial/daytime2/server$(EXEEXT) \
+ tutorial/daytime3/server$(EXEEXT) \
+ tutorial/daytime4/client$(EXEEXT) \
+ tutorial/daytime5/server$(EXEEXT) \
+ tutorial/daytime6/server$(EXEEXT) \
+ tutorial/daytime7/server$(EXEEXT) \
+ type_erasure/type_erasure$(EXEEXT) $(am__EXEEXT_1) \
+ $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4)
+@WINDOWS_TARGET_FALSE@am__append_2 = \
+@WINDOWS_TARGET_FALSE@ chat/posix_chat_client \
+@WINDOWS_TARGET_FALSE@ fork/daemon \
+@WINDOWS_TARGET_FALSE@ fork/process_per_connection \
+@WINDOWS_TARGET_FALSE@ local/connect_pair \
+@WINDOWS_TARGET_FALSE@ local/iostream_client \
+@WINDOWS_TARGET_FALSE@ local/stream_server \
+@WINDOWS_TARGET_FALSE@ local/stream_client \
+@WINDOWS_TARGET_FALSE@ local/fd_passing_stream_server \
+@WINDOWS_TARGET_FALSE@ local/fd_passing_stream_client
+
+@WINDOWS_TARGET_TRUE@am__append_3 = \
+@WINDOWS_TARGET_TRUE@ windows/transmit_file
+
+@HAVE_OPENSSL_TRUE@am__append_4 = \
+@HAVE_OPENSSL_TRUE@ ssl/client \
+@HAVE_OPENSSL_TRUE@ ssl/server
+
+@HAVE_BOOST_COROUTINE_TRUE@am__append_5 = \
+@HAVE_BOOST_COROUTINE_TRUE@ spawn/echo_server \
+@HAVE_BOOST_COROUTINE_TRUE@ spawn/parallel_grep
+
+subdir = src/examples/cpp11
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+ $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@WINDOWS_TARGET_FALSE@am__EXEEXT_1 = chat/posix_chat_client$(EXEEXT) \
+@WINDOWS_TARGET_FALSE@ fork/daemon$(EXEEXT) \
+@WINDOWS_TARGET_FALSE@ fork/process_per_connection$(EXEEXT) \
+@WINDOWS_TARGET_FALSE@ local/connect_pair$(EXEEXT) \
+@WINDOWS_TARGET_FALSE@ local/iostream_client$(EXEEXT) \
+@WINDOWS_TARGET_FALSE@ local/stream_server$(EXEEXT) \
+@WINDOWS_TARGET_FALSE@ local/stream_client$(EXEEXT) \
+@WINDOWS_TARGET_FALSE@ local/fd_passing_stream_server$(EXEEXT) \
+@WINDOWS_TARGET_FALSE@ local/fd_passing_stream_client$(EXEEXT)
+@WINDOWS_TARGET_TRUE@am__EXEEXT_2 = windows/transmit_file$(EXEEXT)
+@HAVE_OPENSSL_TRUE@am__EXEEXT_3 = ssl/client$(EXEEXT) \
+@HAVE_OPENSSL_TRUE@ ssl/server$(EXEEXT)
+@HAVE_BOOST_COROUTINE_TRUE@am__EXEEXT_4 = spawn/echo_server$(EXEEXT) \
+@HAVE_BOOST_COROUTINE_TRUE@ spawn/parallel_grep$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libasio_a_AR = $(AR) $(ARFLAGS)
+libasio_a_LIBADD =
+am__libasio_a_SOURCES_DIST = ../../asio.cpp ../../asio_ssl.cpp
+am__dirstamp = $(am__leading_dot)dirstamp
+@HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__objects_1 = ../../asio_ssl.$(OBJEXT)
+@SEPARATE_COMPILATION_TRUE@am_libasio_a_OBJECTS = \
+@SEPARATE_COMPILATION_TRUE@ ../../asio.$(OBJEXT) \
+@SEPARATE_COMPILATION_TRUE@ $(am__objects_1)
+libasio_a_OBJECTS = $(am_libasio_a_OBJECTS)
+am_allocation_server_OBJECTS = allocation/server.$(OBJEXT)
+allocation_server_OBJECTS = $(am_allocation_server_OBJECTS)
+allocation_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@allocation_server_DEPENDENCIES = libasio.a
+am_buffers_reference_counted_OBJECTS = \
+ buffers/reference_counted.$(OBJEXT)
+buffers_reference_counted_OBJECTS = \
+ $(am_buffers_reference_counted_OBJECTS)
+buffers_reference_counted_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@buffers_reference_counted_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_chat_chat_client_OBJECTS = chat/chat_client.$(OBJEXT)
+chat_chat_client_OBJECTS = $(am_chat_chat_client_OBJECTS)
+chat_chat_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@chat_chat_client_DEPENDENCIES = libasio.a
+am_chat_chat_server_OBJECTS = chat/chat_server.$(OBJEXT)
+chat_chat_server_OBJECTS = $(am_chat_chat_server_OBJECTS)
+chat_chat_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@chat_chat_server_DEPENDENCIES = libasio.a
+am__chat_posix_chat_client_SOURCES_DIST = chat/posix_chat_client.cpp
+@WINDOWS_TARGET_FALSE@am_chat_posix_chat_client_OBJECTS = \
+@WINDOWS_TARGET_FALSE@ chat/posix_chat_client.$(OBJEXT)
+chat_posix_chat_client_OBJECTS = $(am_chat_posix_chat_client_OBJECTS)
+chat_posix_chat_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@chat_posix_chat_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_deferred_deferred_1_OBJECTS = deferred/deferred_1.$(OBJEXT)
+deferred_deferred_1_OBJECTS = $(am_deferred_deferred_1_OBJECTS)
+deferred_deferred_1_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@deferred_deferred_1_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_deferred_deferred_2_OBJECTS = deferred/deferred_2.$(OBJEXT)
+deferred_deferred_2_OBJECTS = $(am_deferred_deferred_2_OBJECTS)
+deferred_deferred_2_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@deferred_deferred_2_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_echo_async_tcp_echo_server_OBJECTS = \
+ echo/async_tcp_echo_server.$(OBJEXT)
+echo_async_tcp_echo_server_OBJECTS = \
+ $(am_echo_async_tcp_echo_server_OBJECTS)
+echo_async_tcp_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@echo_async_tcp_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_echo_async_udp_echo_server_OBJECTS = \
+ echo/async_udp_echo_server.$(OBJEXT)
+echo_async_udp_echo_server_OBJECTS = \
+ $(am_echo_async_udp_echo_server_OBJECTS)
+echo_async_udp_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@echo_async_udp_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_echo_blocking_tcp_echo_client_OBJECTS = \
+ echo/blocking_tcp_echo_client.$(OBJEXT)
+echo_blocking_tcp_echo_client_OBJECTS = \
+ $(am_echo_blocking_tcp_echo_client_OBJECTS)
+echo_blocking_tcp_echo_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@echo_blocking_tcp_echo_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_echo_blocking_tcp_echo_server_OBJECTS = \
+ echo/blocking_tcp_echo_server.$(OBJEXT)
+echo_blocking_tcp_echo_server_OBJECTS = \
+ $(am_echo_blocking_tcp_echo_server_OBJECTS)
+echo_blocking_tcp_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@echo_blocking_tcp_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_echo_blocking_udp_echo_client_OBJECTS = \
+ echo/blocking_udp_echo_client.$(OBJEXT)
+echo_blocking_udp_echo_client_OBJECTS = \
+ $(am_echo_blocking_udp_echo_client_OBJECTS)
+echo_blocking_udp_echo_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@echo_blocking_udp_echo_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_echo_blocking_udp_echo_server_OBJECTS = \
+ echo/blocking_udp_echo_server.$(OBJEXT)
+echo_blocking_udp_echo_server_OBJECTS = \
+ $(am_echo_blocking_udp_echo_server_OBJECTS)
+echo_blocking_udp_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@echo_blocking_udp_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_executors_actor_OBJECTS = executors/actor.$(OBJEXT)
+executors_actor_OBJECTS = $(am_executors_actor_OBJECTS)
+executors_actor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_actor_DEPENDENCIES = libasio.a
+am_executors_bank_account_1_OBJECTS = \
+ executors/bank_account_1.$(OBJEXT)
+executors_bank_account_1_OBJECTS = \
+ $(am_executors_bank_account_1_OBJECTS)
+executors_bank_account_1_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_bank_account_1_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_executors_bank_account_2_OBJECTS = \
+ executors/bank_account_2.$(OBJEXT)
+executors_bank_account_2_OBJECTS = \
+ $(am_executors_bank_account_2_OBJECTS)
+executors_bank_account_2_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_bank_account_2_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_executors_fork_join_OBJECTS = executors/fork_join.$(OBJEXT)
+executors_fork_join_OBJECTS = $(am_executors_fork_join_OBJECTS)
+executors_fork_join_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_fork_join_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_executors_pipeline_OBJECTS = executors/pipeline.$(OBJEXT)
+executors_pipeline_OBJECTS = $(am_executors_pipeline_OBJECTS)
+executors_pipeline_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_pipeline_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_executors_priority_scheduler_OBJECTS = \
+ executors/priority_scheduler.$(OBJEXT)
+executors_priority_scheduler_OBJECTS = \
+ $(am_executors_priority_scheduler_OBJECTS)
+executors_priority_scheduler_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_priority_scheduler_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_files_async_file_copy_OBJECTS = files/async_file_copy.$(OBJEXT)
+files_async_file_copy_OBJECTS = $(am_files_async_file_copy_OBJECTS)
+files_async_file_copy_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@files_async_file_copy_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_files_blocking_file_copy_OBJECTS = \
+ files/blocking_file_copy.$(OBJEXT)
+files_blocking_file_copy_OBJECTS = \
+ $(am_files_blocking_file_copy_OBJECTS)
+files_blocking_file_copy_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@files_blocking_file_copy_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__fork_daemon_SOURCES_DIST = fork/daemon.cpp
+@WINDOWS_TARGET_FALSE@am_fork_daemon_OBJECTS = fork/daemon.$(OBJEXT)
+fork_daemon_OBJECTS = $(am_fork_daemon_OBJECTS)
+fork_daemon_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@fork_daemon_DEPENDENCIES = libasio.a
+am__fork_process_per_connection_SOURCES_DIST = \
+ fork/process_per_connection.cpp
+@WINDOWS_TARGET_FALSE@am_fork_process_per_connection_OBJECTS = \
+@WINDOWS_TARGET_FALSE@ fork/process_per_connection.$(OBJEXT)
+fork_process_per_connection_OBJECTS = \
+ $(am_fork_process_per_connection_OBJECTS)
+fork_process_per_connection_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@fork_process_per_connection_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_futures_daytime_client_OBJECTS = futures/daytime_client.$(OBJEXT)
+futures_daytime_client_OBJECTS = $(am_futures_daytime_client_OBJECTS)
+futures_daytime_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@futures_daytime_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_handler_tracking_async_tcp_echo_server_OBJECTS = \
+ handler_tracking/async_tcp_echo_server.$(OBJEXT)
+handler_tracking_async_tcp_echo_server_OBJECTS = \
+ $(am_handler_tracking_async_tcp_echo_server_OBJECTS)
+handler_tracking_async_tcp_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@handler_tracking_async_tcp_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_http_client_async_client_OBJECTS = \
+ http/client/async_client.$(OBJEXT)
+http_client_async_client_OBJECTS = \
+ $(am_http_client_async_client_OBJECTS)
+http_client_async_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@http_client_async_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_http_client_sync_client_OBJECTS = \
+ http/client/sync_client.$(OBJEXT)
+http_client_sync_client_OBJECTS = \
+ $(am_http_client_sync_client_OBJECTS)
+http_client_sync_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@http_client_sync_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_http_server_http_server_OBJECTS = http/server/connection.$(OBJEXT) \
+ http/server/connection_manager.$(OBJEXT) \
+ http/server/main.$(OBJEXT) http/server/mime_types.$(OBJEXT) \
+ http/server/reply.$(OBJEXT) \
+ http/server/request_handler.$(OBJEXT) \
+ http/server/request_parser.$(OBJEXT) \
+ http/server/server.$(OBJEXT)
+http_server_http_server_OBJECTS = \
+ $(am_http_server_http_server_OBJECTS)
+http_server_http_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@http_server_http_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_http_server2_http_server_OBJECTS = \
+ http/server2/connection.$(OBJEXT) \
+ http/server2/io_context_pool.$(OBJEXT) \
+ http/server2/main.$(OBJEXT) http/server2/mime_types.$(OBJEXT) \
+ http/server2/reply.$(OBJEXT) \
+ http/server2/request_handler.$(OBJEXT) \
+ http/server2/request_parser.$(OBJEXT) \
+ http/server2/server.$(OBJEXT)
+http_server2_http_server_OBJECTS = \
+ $(am_http_server2_http_server_OBJECTS)
+http_server2_http_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@http_server2_http_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_http_server3_http_server_OBJECTS = \
+ http/server3/connection.$(OBJEXT) http/server3/main.$(OBJEXT) \
+ http/server3/mime_types.$(OBJEXT) http/server3/reply.$(OBJEXT) \
+ http/server3/request_handler.$(OBJEXT) \
+ http/server3/request_parser.$(OBJEXT) \
+ http/server3/server.$(OBJEXT)
+http_server3_http_server_OBJECTS = \
+ $(am_http_server3_http_server_OBJECTS)
+http_server3_http_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@http_server3_http_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_http_server4_http_server_OBJECTS = \
+ http/server4/file_handler.$(OBJEXT) \
+ http/server4/main.$(OBJEXT) http/server4/mime_types.$(OBJEXT) \
+ http/server4/reply.$(OBJEXT) \
+ http/server4/request_parser.$(OBJEXT) \
+ http/server4/server.$(OBJEXT)
+http_server4_http_server_OBJECTS = \
+ $(am_http_server4_http_server_OBJECTS)
+http_server4_http_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@http_server4_http_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_icmp_ping_OBJECTS = icmp/ping.$(OBJEXT)
+icmp_ping_OBJECTS = $(am_icmp_ping_OBJECTS)
+icmp_ping_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@icmp_ping_DEPENDENCIES = libasio.a
+am_invocation_prioritised_handlers_OBJECTS = \
+ invocation/prioritised_handlers.$(OBJEXT)
+invocation_prioritised_handlers_OBJECTS = \
+ $(am_invocation_prioritised_handlers_OBJECTS)
+invocation_prioritised_handlers_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@invocation_prioritised_handlers_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_iostreams_daytime_client_OBJECTS = \
+ iostreams/daytime_client.$(OBJEXT)
+iostreams_daytime_client_OBJECTS = \
+ $(am_iostreams_daytime_client_OBJECTS)
+iostreams_daytime_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@iostreams_daytime_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_iostreams_daytime_server_OBJECTS = \
+ iostreams/daytime_server.$(OBJEXT)
+iostreams_daytime_server_OBJECTS = \
+ $(am_iostreams_daytime_server_OBJECTS)
+iostreams_daytime_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@iostreams_daytime_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_iostreams_http_client_OBJECTS = iostreams/http_client.$(OBJEXT)
+iostreams_http_client_OBJECTS = $(am_iostreams_http_client_OBJECTS)
+iostreams_http_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@iostreams_http_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__local_connect_pair_SOURCES_DIST = local/connect_pair.cpp
+@WINDOWS_TARGET_FALSE@am_local_connect_pair_OBJECTS = \
+@WINDOWS_TARGET_FALSE@ local/connect_pair.$(OBJEXT)
+local_connect_pair_OBJECTS = $(am_local_connect_pair_OBJECTS)
+local_connect_pair_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@local_connect_pair_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__local_fd_passing_stream_client_SOURCES_DIST = \
+ local/fd_passing_stream_client.cpp
+@WINDOWS_TARGET_FALSE@am_local_fd_passing_stream_client_OBJECTS = local/fd_passing_stream_client.$(OBJEXT)
+local_fd_passing_stream_client_OBJECTS = \
+ $(am_local_fd_passing_stream_client_OBJECTS)
+local_fd_passing_stream_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@local_fd_passing_stream_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__local_fd_passing_stream_server_SOURCES_DIST = \
+ local/fd_passing_stream_server.cpp
+@WINDOWS_TARGET_FALSE@am_local_fd_passing_stream_server_OBJECTS = local/fd_passing_stream_server.$(OBJEXT)
+local_fd_passing_stream_server_OBJECTS = \
+ $(am_local_fd_passing_stream_server_OBJECTS)
+local_fd_passing_stream_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@local_fd_passing_stream_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__local_iostream_client_SOURCES_DIST = local/iostream_client.cpp
+@WINDOWS_TARGET_FALSE@am_local_iostream_client_OBJECTS = \
+@WINDOWS_TARGET_FALSE@ local/iostream_client.$(OBJEXT)
+local_iostream_client_OBJECTS = $(am_local_iostream_client_OBJECTS)
+local_iostream_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@local_iostream_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__local_stream_client_SOURCES_DIST = local/stream_client.cpp
+@WINDOWS_TARGET_FALSE@am_local_stream_client_OBJECTS = \
+@WINDOWS_TARGET_FALSE@ local/stream_client.$(OBJEXT)
+local_stream_client_OBJECTS = $(am_local_stream_client_OBJECTS)
+local_stream_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@local_stream_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__local_stream_server_SOURCES_DIST = local/stream_server.cpp
+@WINDOWS_TARGET_FALSE@am_local_stream_server_OBJECTS = \
+@WINDOWS_TARGET_FALSE@ local/stream_server.$(OBJEXT)
+local_stream_server_OBJECTS = $(am_local_stream_server_OBJECTS)
+local_stream_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@local_stream_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_multicast_receiver_OBJECTS = multicast/receiver.$(OBJEXT)
+multicast_receiver_OBJECTS = $(am_multicast_receiver_OBJECTS)
+multicast_receiver_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@multicast_receiver_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_multicast_sender_OBJECTS = multicast/sender.$(OBJEXT)
+multicast_sender_OBJECTS = $(am_multicast_sender_OBJECTS)
+multicast_sender_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@multicast_sender_DEPENDENCIES = libasio.a
+am_nonblocking_third_party_lib_OBJECTS = \
+ nonblocking/third_party_lib.$(OBJEXT)
+nonblocking_third_party_lib_OBJECTS = \
+ $(am_nonblocking_third_party_lib_OBJECTS)
+nonblocking_third_party_lib_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@nonblocking_third_party_lib_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_1_OBJECTS = operations/composed_1.$(OBJEXT)
+operations_composed_1_OBJECTS = $(am_operations_composed_1_OBJECTS)
+operations_composed_1_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_1_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_2_OBJECTS = operations/composed_2.$(OBJEXT)
+operations_composed_2_OBJECTS = $(am_operations_composed_2_OBJECTS)
+operations_composed_2_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_2_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_3_OBJECTS = operations/composed_3.$(OBJEXT)
+operations_composed_3_OBJECTS = $(am_operations_composed_3_OBJECTS)
+operations_composed_3_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_3_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_4_OBJECTS = operations/composed_4.$(OBJEXT)
+operations_composed_4_OBJECTS = $(am_operations_composed_4_OBJECTS)
+operations_composed_4_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_4_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_5_OBJECTS = operations/composed_5.$(OBJEXT)
+operations_composed_5_OBJECTS = $(am_operations_composed_5_OBJECTS)
+operations_composed_5_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_5_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_6_OBJECTS = operations/composed_6.$(OBJEXT)
+operations_composed_6_OBJECTS = $(am_operations_composed_6_OBJECTS)
+operations_composed_6_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_6_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_7_OBJECTS = operations/composed_7.$(OBJEXT)
+operations_composed_7_OBJECTS = $(am_operations_composed_7_OBJECTS)
+operations_composed_7_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_7_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_8_OBJECTS = operations/composed_8.$(OBJEXT)
+operations_composed_8_OBJECTS = $(am_operations_composed_8_OBJECTS)
+operations_composed_8_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_8_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_parallel_group_ranged_wait_for_all_OBJECTS = \
+ parallel_group/ranged_wait_for_all.$(OBJEXT)
+parallel_group_ranged_wait_for_all_OBJECTS = \
+ $(am_parallel_group_ranged_wait_for_all_OBJECTS)
+parallel_group_ranged_wait_for_all_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@parallel_group_ranged_wait_for_all_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_parallel_group_wait_for_all_OBJECTS = \
+ parallel_group/wait_for_all.$(OBJEXT)
+parallel_group_wait_for_all_OBJECTS = \
+ $(am_parallel_group_wait_for_all_OBJECTS)
+parallel_group_wait_for_all_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@parallel_group_wait_for_all_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_parallel_group_wait_for_one_OBJECTS = \
+ parallel_group/wait_for_one.$(OBJEXT)
+parallel_group_wait_for_one_OBJECTS = \
+ $(am_parallel_group_wait_for_one_OBJECTS)
+parallel_group_wait_for_one_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@parallel_group_wait_for_one_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_parallel_group_wait_for_one_error_OBJECTS = \
+ parallel_group/wait_for_one_error.$(OBJEXT)
+parallel_group_wait_for_one_error_OBJECTS = \
+ $(am_parallel_group_wait_for_one_error_OBJECTS)
+parallel_group_wait_for_one_error_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@parallel_group_wait_for_one_error_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_parallel_group_wait_for_one_success_OBJECTS = \
+ parallel_group/wait_for_one_success.$(OBJEXT)
+parallel_group_wait_for_one_success_OBJECTS = \
+ $(am_parallel_group_wait_for_one_success_OBJECTS)
+parallel_group_wait_for_one_success_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@parallel_group_wait_for_one_success_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_porthopper_client_OBJECTS = porthopper/client.$(OBJEXT)
+porthopper_client_OBJECTS = $(am_porthopper_client_OBJECTS)
+porthopper_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@porthopper_client_DEPENDENCIES = libasio.a
+am_porthopper_server_OBJECTS = porthopper/server.$(OBJEXT)
+porthopper_server_OBJECTS = $(am_porthopper_server_OBJECTS)
+porthopper_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@porthopper_server_DEPENDENCIES = libasio.a
+am_services_daytime_client_OBJECTS = \
+ services/daytime_client.$(OBJEXT) \
+ services/logger_service.$(OBJEXT)
+services_daytime_client_OBJECTS = \
+ $(am_services_daytime_client_OBJECTS)
+services_daytime_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@services_daytime_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_socks4_sync_client_OBJECTS = socks4/sync_client.$(OBJEXT)
+socks4_sync_client_OBJECTS = $(am_socks4_sync_client_OBJECTS)
+socks4_sync_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@socks4_sync_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__spawn_echo_server_SOURCES_DIST = spawn/echo_server.cpp
+@HAVE_BOOST_COROUTINE_TRUE@am_spawn_echo_server_OBJECTS = \
+@HAVE_BOOST_COROUTINE_TRUE@ spawn/echo_server.$(OBJEXT)
+spawn_echo_server_OBJECTS = $(am_spawn_echo_server_OBJECTS)
+@HAVE_BOOST_COROUTINE_TRUE@spawn_echo_server_DEPENDENCIES = $(LDADD)
+am__spawn_parallel_grep_SOURCES_DIST = spawn/parallel_grep.cpp
+@HAVE_BOOST_COROUTINE_TRUE@am_spawn_parallel_grep_OBJECTS = \
+@HAVE_BOOST_COROUTINE_TRUE@ spawn/parallel_grep.$(OBJEXT)
+spawn_parallel_grep_OBJECTS = $(am_spawn_parallel_grep_OBJECTS)
+@HAVE_BOOST_COROUTINE_TRUE@spawn_parallel_grep_DEPENDENCIES = \
+@HAVE_BOOST_COROUTINE_TRUE@ $(LDADD)
+am__ssl_client_SOURCES_DIST = ssl/client.cpp
+@HAVE_OPENSSL_TRUE@am_ssl_client_OBJECTS = ssl/client.$(OBJEXT)
+ssl_client_OBJECTS = $(am_ssl_client_OBJECTS)
+ssl_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@ssl_client_DEPENDENCIES = libasio.a
+am__ssl_server_SOURCES_DIST = ssl/server.cpp
+@HAVE_OPENSSL_TRUE@am_ssl_server_OBJECTS = ssl/server.$(OBJEXT)
+ssl_server_OBJECTS = $(am_ssl_server_OBJECTS)
+ssl_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@ssl_server_DEPENDENCIES = libasio.a
+am_timeouts_async_tcp_client_OBJECTS = \
+ timeouts/async_tcp_client.$(OBJEXT)
+timeouts_async_tcp_client_OBJECTS = \
+ $(am_timeouts_async_tcp_client_OBJECTS)
+timeouts_async_tcp_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@timeouts_async_tcp_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_timeouts_blocking_tcp_client_OBJECTS = \
+ timeouts/blocking_tcp_client.$(OBJEXT)
+timeouts_blocking_tcp_client_OBJECTS = \
+ $(am_timeouts_blocking_tcp_client_OBJECTS)
+timeouts_blocking_tcp_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@timeouts_blocking_tcp_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_timeouts_blocking_token_tcp_client_OBJECTS = \
+ timeouts/blocking_token_tcp_client.$(OBJEXT)
+timeouts_blocking_token_tcp_client_OBJECTS = \
+ $(am_timeouts_blocking_token_tcp_client_OBJECTS)
+timeouts_blocking_token_tcp_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@timeouts_blocking_token_tcp_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_timeouts_blocking_udp_client_OBJECTS = \
+ timeouts/blocking_udp_client.$(OBJEXT)
+timeouts_blocking_udp_client_OBJECTS = \
+ $(am_timeouts_blocking_udp_client_OBJECTS)
+timeouts_blocking_udp_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@timeouts_blocking_udp_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_timeouts_server_OBJECTS = timeouts/server.$(OBJEXT)
+timeouts_server_OBJECTS = $(am_timeouts_server_OBJECTS)
+timeouts_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@timeouts_server_DEPENDENCIES = libasio.a
+am_timers_time_t_timer_OBJECTS = timers/time_t_timer.$(OBJEXT)
+timers_time_t_timer_OBJECTS = $(am_timers_time_t_timer_OBJECTS)
+timers_time_t_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@timers_time_t_timer_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_tutorial_daytime1_client_OBJECTS = \
+ tutorial/daytime1/client.$(OBJEXT)
+tutorial_daytime1_client_OBJECTS = \
+ $(am_tutorial_daytime1_client_OBJECTS)
+tutorial_daytime1_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@tutorial_daytime1_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_tutorial_daytime2_server_OBJECTS = \
+ tutorial/daytime2/server.$(OBJEXT)
+tutorial_daytime2_server_OBJECTS = \
+ $(am_tutorial_daytime2_server_OBJECTS)
+tutorial_daytime2_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@tutorial_daytime2_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_tutorial_daytime3_server_OBJECTS = \
+ tutorial/daytime3/server.$(OBJEXT)
+tutorial_daytime3_server_OBJECTS = \
+ $(am_tutorial_daytime3_server_OBJECTS)
+tutorial_daytime3_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@tutorial_daytime3_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_tutorial_daytime4_client_OBJECTS = \
+ tutorial/daytime4/client.$(OBJEXT)
+tutorial_daytime4_client_OBJECTS = \
+ $(am_tutorial_daytime4_client_OBJECTS)
+tutorial_daytime4_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@tutorial_daytime4_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_tutorial_daytime5_server_OBJECTS = \
+ tutorial/daytime5/server.$(OBJEXT)
+tutorial_daytime5_server_OBJECTS = \
+ $(am_tutorial_daytime5_server_OBJECTS)
+tutorial_daytime5_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@tutorial_daytime5_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_tutorial_daytime6_server_OBJECTS = \
+ tutorial/daytime6/server.$(OBJEXT)
+tutorial_daytime6_server_OBJECTS = \
+ $(am_tutorial_daytime6_server_OBJECTS)
+tutorial_daytime6_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@tutorial_daytime6_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_tutorial_daytime7_server_OBJECTS = \
+ tutorial/daytime7/server.$(OBJEXT)
+tutorial_daytime7_server_OBJECTS = \
+ $(am_tutorial_daytime7_server_OBJECTS)
+tutorial_daytime7_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@tutorial_daytime7_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_tutorial_timer1_timer_OBJECTS = tutorial/timer1/timer.$(OBJEXT)
+tutorial_timer1_timer_OBJECTS = $(am_tutorial_timer1_timer_OBJECTS)
+tutorial_timer1_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@tutorial_timer1_timer_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_tutorial_timer2_timer_OBJECTS = tutorial/timer2/timer.$(OBJEXT)
+tutorial_timer2_timer_OBJECTS = $(am_tutorial_timer2_timer_OBJECTS)
+tutorial_timer2_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@tutorial_timer2_timer_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_tutorial_timer3_timer_OBJECTS = tutorial/timer3/timer.$(OBJEXT)
+tutorial_timer3_timer_OBJECTS = $(am_tutorial_timer3_timer_OBJECTS)
+tutorial_timer3_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@tutorial_timer3_timer_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_tutorial_timer4_timer_OBJECTS = tutorial/timer4/timer.$(OBJEXT)
+tutorial_timer4_timer_OBJECTS = $(am_tutorial_timer4_timer_OBJECTS)
+tutorial_timer4_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@tutorial_timer4_timer_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_tutorial_timer5_timer_OBJECTS = tutorial/timer5/timer.$(OBJEXT)
+tutorial_timer5_timer_OBJECTS = $(am_tutorial_timer5_timer_OBJECTS)
+tutorial_timer5_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@tutorial_timer5_timer_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_type_erasure_type_erasure_OBJECTS = type_erasure/main.$(OBJEXT) \
+ type_erasure/stdin_line_reader.$(OBJEXT) \
+ type_erasure/sleep.$(OBJEXT)
+type_erasure_type_erasure_OBJECTS = \
+ $(am_type_erasure_type_erasure_OBJECTS)
+type_erasure_type_erasure_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@type_erasure_type_erasure_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__windows_transmit_file_SOURCES_DIST = windows/transmit_file.cpp
+@WINDOWS_TARGET_TRUE@am_windows_transmit_file_OBJECTS = \
+@WINDOWS_TARGET_TRUE@ windows/transmit_file.$(OBJEXT)
+windows_transmit_file_OBJECTS = $(am_windows_transmit_file_OBJECTS)
+windows_transmit_file_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@windows_transmit_file_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ../../$(DEPDIR)/asio.Po \
+ ../../$(DEPDIR)/asio_ssl.Po allocation/$(DEPDIR)/server.Po \
+ buffers/$(DEPDIR)/reference_counted.Po \
+ chat/$(DEPDIR)/chat_client.Po chat/$(DEPDIR)/chat_server.Po \
+ chat/$(DEPDIR)/posix_chat_client.Po \
+ deferred/$(DEPDIR)/deferred_1.Po \
+ deferred/$(DEPDIR)/deferred_2.Po \
+ echo/$(DEPDIR)/async_tcp_echo_server.Po \
+ echo/$(DEPDIR)/async_udp_echo_server.Po \
+ echo/$(DEPDIR)/blocking_tcp_echo_client.Po \
+ echo/$(DEPDIR)/blocking_tcp_echo_server.Po \
+ echo/$(DEPDIR)/blocking_udp_echo_client.Po \
+ echo/$(DEPDIR)/blocking_udp_echo_server.Po \
+ executors/$(DEPDIR)/actor.Po \
+ executors/$(DEPDIR)/bank_account_1.Po \
+ executors/$(DEPDIR)/bank_account_2.Po \
+ executors/$(DEPDIR)/fork_join.Po \
+ executors/$(DEPDIR)/pipeline.Po \
+ executors/$(DEPDIR)/priority_scheduler.Po \
+ files/$(DEPDIR)/async_file_copy.Po \
+ files/$(DEPDIR)/blocking_file_copy.Po fork/$(DEPDIR)/daemon.Po \
+ fork/$(DEPDIR)/process_per_connection.Po \
+ futures/$(DEPDIR)/daytime_client.Po \
+ handler_tracking/$(DEPDIR)/async_tcp_echo_server.Po \
+ http/client/$(DEPDIR)/async_client.Po \
+ http/client/$(DEPDIR)/sync_client.Po \
+ http/server/$(DEPDIR)/connection.Po \
+ http/server/$(DEPDIR)/connection_manager.Po \
+ http/server/$(DEPDIR)/main.Po \
+ http/server/$(DEPDIR)/mime_types.Po \
+ http/server/$(DEPDIR)/reply.Po \
+ http/server/$(DEPDIR)/request_handler.Po \
+ http/server/$(DEPDIR)/request_parser.Po \
+ http/server/$(DEPDIR)/server.Po \
+ http/server2/$(DEPDIR)/connection.Po \
+ http/server2/$(DEPDIR)/io_context_pool.Po \
+ http/server2/$(DEPDIR)/main.Po \
+ http/server2/$(DEPDIR)/mime_types.Po \
+ http/server2/$(DEPDIR)/reply.Po \
+ http/server2/$(DEPDIR)/request_handler.Po \
+ http/server2/$(DEPDIR)/request_parser.Po \
+ http/server2/$(DEPDIR)/server.Po \
+ http/server3/$(DEPDIR)/connection.Po \
+ http/server3/$(DEPDIR)/main.Po \
+ http/server3/$(DEPDIR)/mime_types.Po \
+ http/server3/$(DEPDIR)/reply.Po \
+ http/server3/$(DEPDIR)/request_handler.Po \
+ http/server3/$(DEPDIR)/request_parser.Po \
+ http/server3/$(DEPDIR)/server.Po \
+ http/server4/$(DEPDIR)/file_handler.Po \
+ http/server4/$(DEPDIR)/main.Po \
+ http/server4/$(DEPDIR)/mime_types.Po \
+ http/server4/$(DEPDIR)/reply.Po \
+ http/server4/$(DEPDIR)/request_parser.Po \
+ http/server4/$(DEPDIR)/server.Po icmp/$(DEPDIR)/ping.Po \
+ invocation/$(DEPDIR)/prioritised_handlers.Po \
+ iostreams/$(DEPDIR)/daytime_client.Po \
+ iostreams/$(DEPDIR)/daytime_server.Po \
+ iostreams/$(DEPDIR)/http_client.Po \
+ local/$(DEPDIR)/connect_pair.Po \
+ local/$(DEPDIR)/fd_passing_stream_client.Po \
+ local/$(DEPDIR)/fd_passing_stream_server.Po \
+ local/$(DEPDIR)/iostream_client.Po \
+ local/$(DEPDIR)/stream_client.Po \
+ local/$(DEPDIR)/stream_server.Po \
+ multicast/$(DEPDIR)/receiver.Po multicast/$(DEPDIR)/sender.Po \
+ nonblocking/$(DEPDIR)/third_party_lib.Po \
+ operations/$(DEPDIR)/composed_1.Po \
+ operations/$(DEPDIR)/composed_2.Po \
+ operations/$(DEPDIR)/composed_3.Po \
+ operations/$(DEPDIR)/composed_4.Po \
+ operations/$(DEPDIR)/composed_5.Po \
+ operations/$(DEPDIR)/composed_6.Po \
+ operations/$(DEPDIR)/composed_7.Po \
+ operations/$(DEPDIR)/composed_8.Po \
+ parallel_group/$(DEPDIR)/ranged_wait_for_all.Po \
+ parallel_group/$(DEPDIR)/wait_for_all.Po \
+ parallel_group/$(DEPDIR)/wait_for_one.Po \
+ parallel_group/$(DEPDIR)/wait_for_one_error.Po \
+ parallel_group/$(DEPDIR)/wait_for_one_success.Po \
+ porthopper/$(DEPDIR)/client.Po porthopper/$(DEPDIR)/server.Po \
+ services/$(DEPDIR)/daytime_client.Po \
+ services/$(DEPDIR)/logger_service.Po \
+ socks4/$(DEPDIR)/sync_client.Po spawn/$(DEPDIR)/echo_server.Po \
+ spawn/$(DEPDIR)/parallel_grep.Po ssl/$(DEPDIR)/client.Po \
+ ssl/$(DEPDIR)/server.Po timeouts/$(DEPDIR)/async_tcp_client.Po \
+ timeouts/$(DEPDIR)/blocking_tcp_client.Po \
+ timeouts/$(DEPDIR)/blocking_token_tcp_client.Po \
+ timeouts/$(DEPDIR)/blocking_udp_client.Po \
+ timeouts/$(DEPDIR)/server.Po timers/$(DEPDIR)/time_t_timer.Po \
+ tutorial/daytime1/$(DEPDIR)/client.Po \
+ tutorial/daytime2/$(DEPDIR)/server.Po \
+ tutorial/daytime3/$(DEPDIR)/server.Po \
+ tutorial/daytime4/$(DEPDIR)/client.Po \
+ tutorial/daytime5/$(DEPDIR)/server.Po \
+ tutorial/daytime6/$(DEPDIR)/server.Po \
+ tutorial/daytime7/$(DEPDIR)/server.Po \
+ tutorial/timer1/$(DEPDIR)/timer.Po \
+ tutorial/timer2/$(DEPDIR)/timer.Po \
+ tutorial/timer3/$(DEPDIR)/timer.Po \
+ tutorial/timer4/$(DEPDIR)/timer.Po \
+ tutorial/timer5/$(DEPDIR)/timer.Po \
+ type_erasure/$(DEPDIR)/main.Po type_erasure/$(DEPDIR)/sleep.Po \
+ type_erasure/$(DEPDIR)/stdin_line_reader.Po \
+ windows/$(DEPDIR)/transmit_file.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(libasio_a_SOURCES) $(allocation_server_SOURCES) \
+ $(buffers_reference_counted_SOURCES) \
+ $(chat_chat_client_SOURCES) $(chat_chat_server_SOURCES) \
+ $(chat_posix_chat_client_SOURCES) \
+ $(deferred_deferred_1_SOURCES) $(deferred_deferred_2_SOURCES) \
+ $(echo_async_tcp_echo_server_SOURCES) \
+ $(echo_async_udp_echo_server_SOURCES) \
+ $(echo_blocking_tcp_echo_client_SOURCES) \
+ $(echo_blocking_tcp_echo_server_SOURCES) \
+ $(echo_blocking_udp_echo_client_SOURCES) \
+ $(echo_blocking_udp_echo_server_SOURCES) \
+ $(executors_actor_SOURCES) $(executors_bank_account_1_SOURCES) \
+ $(executors_bank_account_2_SOURCES) \
+ $(executors_fork_join_SOURCES) $(executors_pipeline_SOURCES) \
+ $(executors_priority_scheduler_SOURCES) \
+ $(files_async_file_copy_SOURCES) \
+ $(files_blocking_file_copy_SOURCES) $(fork_daemon_SOURCES) \
+ $(fork_process_per_connection_SOURCES) \
+ $(futures_daytime_client_SOURCES) \
+ $(handler_tracking_async_tcp_echo_server_SOURCES) \
+ $(http_client_async_client_SOURCES) \
+ $(http_client_sync_client_SOURCES) \
+ $(http_server_http_server_SOURCES) \
+ $(http_server2_http_server_SOURCES) \
+ $(http_server3_http_server_SOURCES) \
+ $(http_server4_http_server_SOURCES) $(icmp_ping_SOURCES) \
+ $(invocation_prioritised_handlers_SOURCES) \
+ $(iostreams_daytime_client_SOURCES) \
+ $(iostreams_daytime_server_SOURCES) \
+ $(iostreams_http_client_SOURCES) $(local_connect_pair_SOURCES) \
+ $(local_fd_passing_stream_client_SOURCES) \
+ $(local_fd_passing_stream_server_SOURCES) \
+ $(local_iostream_client_SOURCES) \
+ $(local_stream_client_SOURCES) $(local_stream_server_SOURCES) \
+ $(multicast_receiver_SOURCES) $(multicast_sender_SOURCES) \
+ $(nonblocking_third_party_lib_SOURCES) \
+ $(operations_composed_1_SOURCES) \
+ $(operations_composed_2_SOURCES) \
+ $(operations_composed_3_SOURCES) \
+ $(operations_composed_4_SOURCES) \
+ $(operations_composed_5_SOURCES) \
+ $(operations_composed_6_SOURCES) \
+ $(operations_composed_7_SOURCES) \
+ $(operations_composed_8_SOURCES) \
+ $(parallel_group_ranged_wait_for_all_SOURCES) \
+ $(parallel_group_wait_for_all_SOURCES) \
+ $(parallel_group_wait_for_one_SOURCES) \
+ $(parallel_group_wait_for_one_error_SOURCES) \
+ $(parallel_group_wait_for_one_success_SOURCES) \
+ $(porthopper_client_SOURCES) $(porthopper_server_SOURCES) \
+ $(services_daytime_client_SOURCES) \
+ $(socks4_sync_client_SOURCES) $(spawn_echo_server_SOURCES) \
+ $(spawn_parallel_grep_SOURCES) $(ssl_client_SOURCES) \
+ $(ssl_server_SOURCES) $(timeouts_async_tcp_client_SOURCES) \
+ $(timeouts_blocking_tcp_client_SOURCES) \
+ $(timeouts_blocking_token_tcp_client_SOURCES) \
+ $(timeouts_blocking_udp_client_SOURCES) \
+ $(timeouts_server_SOURCES) $(timers_time_t_timer_SOURCES) \
+ $(tutorial_daytime1_client_SOURCES) \
+ $(tutorial_daytime2_server_SOURCES) \
+ $(tutorial_daytime3_server_SOURCES) \
+ $(tutorial_daytime4_client_SOURCES) \
+ $(tutorial_daytime5_server_SOURCES) \
+ $(tutorial_daytime6_server_SOURCES) \
+ $(tutorial_daytime7_server_SOURCES) \
+ $(tutorial_timer1_timer_SOURCES) \
+ $(tutorial_timer2_timer_SOURCES) \
+ $(tutorial_timer3_timer_SOURCES) \
+ $(tutorial_timer4_timer_SOURCES) \
+ $(tutorial_timer5_timer_SOURCES) \
+ $(type_erasure_type_erasure_SOURCES) \
+ $(windows_transmit_file_SOURCES)
+DIST_SOURCES = $(am__libasio_a_SOURCES_DIST) \
+ $(allocation_server_SOURCES) \
+ $(buffers_reference_counted_SOURCES) \
+ $(chat_chat_client_SOURCES) $(chat_chat_server_SOURCES) \
+ $(am__chat_posix_chat_client_SOURCES_DIST) \
+ $(deferred_deferred_1_SOURCES) $(deferred_deferred_2_SOURCES) \
+ $(echo_async_tcp_echo_server_SOURCES) \
+ $(echo_async_udp_echo_server_SOURCES) \
+ $(echo_blocking_tcp_echo_client_SOURCES) \
+ $(echo_blocking_tcp_echo_server_SOURCES) \
+ $(echo_blocking_udp_echo_client_SOURCES) \
+ $(echo_blocking_udp_echo_server_SOURCES) \
+ $(executors_actor_SOURCES) $(executors_bank_account_1_SOURCES) \
+ $(executors_bank_account_2_SOURCES) \
+ $(executors_fork_join_SOURCES) $(executors_pipeline_SOURCES) \
+ $(executors_priority_scheduler_SOURCES) \
+ $(files_async_file_copy_SOURCES) \
+ $(files_blocking_file_copy_SOURCES) \
+ $(am__fork_daemon_SOURCES_DIST) \
+ $(am__fork_process_per_connection_SOURCES_DIST) \
+ $(futures_daytime_client_SOURCES) \
+ $(handler_tracking_async_tcp_echo_server_SOURCES) \
+ $(http_client_async_client_SOURCES) \
+ $(http_client_sync_client_SOURCES) \
+ $(http_server_http_server_SOURCES) \
+ $(http_server2_http_server_SOURCES) \
+ $(http_server3_http_server_SOURCES) \
+ $(http_server4_http_server_SOURCES) $(icmp_ping_SOURCES) \
+ $(invocation_prioritised_handlers_SOURCES) \
+ $(iostreams_daytime_client_SOURCES) \
+ $(iostreams_daytime_server_SOURCES) \
+ $(iostreams_http_client_SOURCES) \
+ $(am__local_connect_pair_SOURCES_DIST) \
+ $(am__local_fd_passing_stream_client_SOURCES_DIST) \
+ $(am__local_fd_passing_stream_server_SOURCES_DIST) \
+ $(am__local_iostream_client_SOURCES_DIST) \
+ $(am__local_stream_client_SOURCES_DIST) \
+ $(am__local_stream_server_SOURCES_DIST) \
+ $(multicast_receiver_SOURCES) $(multicast_sender_SOURCES) \
+ $(nonblocking_third_party_lib_SOURCES) \
+ $(operations_composed_1_SOURCES) \
+ $(operations_composed_2_SOURCES) \
+ $(operations_composed_3_SOURCES) \
+ $(operations_composed_4_SOURCES) \
+ $(operations_composed_5_SOURCES) \
+ $(operations_composed_6_SOURCES) \
+ $(operations_composed_7_SOURCES) \
+ $(operations_composed_8_SOURCES) \
+ $(parallel_group_ranged_wait_for_all_SOURCES) \
+ $(parallel_group_wait_for_all_SOURCES) \
+ $(parallel_group_wait_for_one_SOURCES) \
+ $(parallel_group_wait_for_one_error_SOURCES) \
+ $(parallel_group_wait_for_one_success_SOURCES) \
+ $(porthopper_client_SOURCES) $(porthopper_server_SOURCES) \
+ $(services_daytime_client_SOURCES) \
+ $(socks4_sync_client_SOURCES) \
+ $(am__spawn_echo_server_SOURCES_DIST) \
+ $(am__spawn_parallel_grep_SOURCES_DIST) \
+ $(am__ssl_client_SOURCES_DIST) $(am__ssl_server_SOURCES_DIST) \
+ $(timeouts_async_tcp_client_SOURCES) \
+ $(timeouts_blocking_tcp_client_SOURCES) \
+ $(timeouts_blocking_token_tcp_client_SOURCES) \
+ $(timeouts_blocking_udp_client_SOURCES) \
+ $(timeouts_server_SOURCES) $(timers_time_t_timer_SOURCES) \
+ $(tutorial_daytime1_client_SOURCES) \
+ $(tutorial_daytime2_server_SOURCES) \
+ $(tutorial_daytime3_server_SOURCES) \
+ $(tutorial_daytime4_client_SOURCES) \
+ $(tutorial_daytime5_server_SOURCES) \
+ $(tutorial_daytime6_server_SOURCES) \
+ $(tutorial_daytime7_server_SOURCES) \
+ $(tutorial_timer1_timer_SOURCES) \
+ $(tutorial_timer2_timer_SOURCES) \
+ $(tutorial_timer3_timer_SOURCES) \
+ $(tutorial_timer4_timer_SOURCES) \
+ $(tutorial_timer5_timer_SOURCES) \
+ $(type_erasure_type_erasure_SOURCES) \
+ $(am__windows_transmit_file_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+HEADERS = $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = subdir-objects
+@SEPARATE_COMPILATION_TRUE@noinst_LIBRARIES = libasio.a
+@SEPARATE_COMPILATION_TRUE@libasio_a_SOURCES = ../../asio.cpp \
+@SEPARATE_COMPILATION_TRUE@ $(am__append_1)
+@SEPARATE_COMPILATION_TRUE@LDADD = libasio.a
+noinst_HEADERS = \
+ chat/chat_message.hpp \
+ handler_tracking/custom_tracking.hpp \
+ http/server/connection.hpp \
+ http/server/connection_manager.hpp \
+ http/server/header.hpp \
+ http/server/mime_types.hpp \
+ http/server/reply.hpp \
+ http/server/request.hpp \
+ http/server/request_handler.hpp \
+ http/server/request_parser.hpp \
+ http/server/server.hpp \
+ http/server2/connection.hpp \
+ http/server2/io_context_pool.hpp \
+ http/server2/header.hpp \
+ http/server2/mime_types.hpp \
+ http/server2/reply.hpp \
+ http/server2/request.hpp \
+ http/server2/request_handler.hpp \
+ http/server2/request_parser.hpp \
+ http/server2/server.hpp \
+ http/server3/connection.hpp \
+ http/server3/header.hpp \
+ http/server3/mime_types.hpp \
+ http/server3/reply.hpp \
+ http/server3/request.hpp \
+ http/server3/request_handler.hpp \
+ http/server3/request_parser.hpp \
+ http/server3/server.hpp \
+ http/server4/file_handler.hpp \
+ http/server4/header.hpp \
+ http/server4/mime_types.hpp \
+ http/server4/reply.hpp \
+ http/server4/request.hpp \
+ http/server4/request_parser.hpp \
+ http/server4/server.hpp \
+ icmp/icmp_header.hpp \
+ icmp/ipv4_header.hpp \
+ porthopper/protocol.hpp \
+ services/basic_logger.hpp \
+ services/logger.hpp \
+ services/logger_service.hpp \
+ socks4/socks4.hpp \
+ type_erasure/line_reader.hpp \
+ type_erasure/stdin_line_reader.hpp \
+ type_erasure/sleep.hpp
+
+AM_CXXFLAGS = -I$(srcdir)/../../../include
+allocation_server_SOURCES = allocation/server.cpp
+buffers_reference_counted_SOURCES = buffers/reference_counted.cpp
+chat_chat_client_SOURCES = chat/chat_client.cpp
+chat_chat_server_SOURCES = chat/chat_server.cpp
+deferred_deferred_1_SOURCES = deferred/deferred_1.cpp
+deferred_deferred_2_SOURCES = deferred/deferred_2.cpp
+echo_async_tcp_echo_server_SOURCES = echo/async_tcp_echo_server.cpp
+echo_async_udp_echo_server_SOURCES = echo/async_udp_echo_server.cpp
+echo_blocking_tcp_echo_client_SOURCES = echo/blocking_tcp_echo_client.cpp
+echo_blocking_tcp_echo_server_SOURCES = echo/blocking_tcp_echo_server.cpp
+echo_blocking_udp_echo_client_SOURCES = echo/blocking_udp_echo_client.cpp
+echo_blocking_udp_echo_server_SOURCES = echo/blocking_udp_echo_server.cpp
+executors_actor_SOURCES = executors/actor.cpp
+executors_bank_account_1_SOURCES = executors/bank_account_1.cpp
+executors_bank_account_2_SOURCES = executors/bank_account_2.cpp
+executors_fork_join_SOURCES = executors/fork_join.cpp
+executors_pipeline_SOURCES = executors/pipeline.cpp
+executors_priority_scheduler_SOURCES = executors/priority_scheduler.cpp
+files_blocking_file_copy_SOURCES = files/blocking_file_copy.cpp
+files_async_file_copy_SOURCES = files/async_file_copy.cpp
+futures_daytime_client_SOURCES = futures/daytime_client.cpp
+handler_tracking_async_tcp_echo_server_SOURCES = handler_tracking/async_tcp_echo_server.cpp
+http_client_async_client_SOURCES = http/client/async_client.cpp
+http_client_sync_client_SOURCES = http/client/sync_client.cpp
+http_server_http_server_SOURCES = \
+ http/server/connection.cpp \
+ http/server/connection_manager.cpp \
+ http/server/main.cpp \
+ http/server/mime_types.cpp \
+ http/server/reply.cpp \
+ http/server/request_handler.cpp \
+ http/server/request_parser.cpp \
+ http/server/server.cpp
+
+http_server2_http_server_SOURCES = \
+ http/server2/connection.cpp \
+ http/server2/io_context_pool.cpp \
+ http/server2/main.cpp \
+ http/server2/mime_types.cpp \
+ http/server2/reply.cpp \
+ http/server2/request_handler.cpp \
+ http/server2/request_parser.cpp \
+ http/server2/server.cpp
+
+http_server3_http_server_SOURCES = \
+ http/server3/connection.cpp \
+ http/server3/main.cpp \
+ http/server3/mime_types.cpp \
+ http/server3/reply.cpp \
+ http/server3/request_handler.cpp \
+ http/server3/request_parser.cpp \
+ http/server3/server.cpp
+
+http_server4_http_server_SOURCES = \
+ http/server4/file_handler.cpp \
+ http/server4/main.cpp \
+ http/server4/mime_types.cpp \
+ http/server4/reply.cpp \
+ http/server4/request_parser.cpp \
+ http/server4/server.cpp
+
+icmp_ping_SOURCES = icmp/ping.cpp
+invocation_prioritised_handlers_SOURCES = invocation/prioritised_handlers.cpp
+iostreams_daytime_client_SOURCES = iostreams/daytime_client.cpp
+iostreams_daytime_server_SOURCES = iostreams/daytime_server.cpp
+iostreams_http_client_SOURCES = iostreams/http_client.cpp
+multicast_receiver_SOURCES = multicast/receiver.cpp
+multicast_sender_SOURCES = multicast/sender.cpp
+nonblocking_third_party_lib_SOURCES = nonblocking/third_party_lib.cpp
+operations_composed_1_SOURCES = operations/composed_1.cpp
+operations_composed_2_SOURCES = operations/composed_2.cpp
+operations_composed_3_SOURCES = operations/composed_3.cpp
+operations_composed_4_SOURCES = operations/composed_4.cpp
+operations_composed_5_SOURCES = operations/composed_5.cpp
+operations_composed_6_SOURCES = operations/composed_6.cpp
+operations_composed_7_SOURCES = operations/composed_7.cpp
+operations_composed_8_SOURCES = operations/composed_8.cpp
+parallel_group_ranged_wait_for_all_SOURCES = parallel_group/ranged_wait_for_all.cpp
+parallel_group_wait_for_all_SOURCES = parallel_group/wait_for_all.cpp
+parallel_group_wait_for_one_SOURCES = parallel_group/wait_for_one.cpp
+parallel_group_wait_for_one_error_SOURCES = parallel_group/wait_for_one_error.cpp
+parallel_group_wait_for_one_success_SOURCES = parallel_group/wait_for_one_success.cpp
+porthopper_client_SOURCES = porthopper/client.cpp
+porthopper_server_SOURCES = porthopper/server.cpp
+services_daytime_client_SOURCES = \
+ services/daytime_client.cpp \
+ services/logger_service.cpp
+
+socks4_sync_client_SOURCES = socks4/sync_client.cpp
+timeouts_async_tcp_client_SOURCES = timeouts/async_tcp_client.cpp
+timeouts_blocking_tcp_client_SOURCES = timeouts/blocking_tcp_client.cpp
+timeouts_blocking_token_tcp_client_SOURCES = timeouts/blocking_token_tcp_client.cpp
+timeouts_blocking_udp_client_SOURCES = timeouts/blocking_udp_client.cpp
+timeouts_server_SOURCES = timeouts/server.cpp
+timers_time_t_timer_SOURCES = timers/time_t_timer.cpp
+tutorial_timer1_timer_SOURCES = tutorial/timer1/timer.cpp
+tutorial_timer2_timer_SOURCES = tutorial/timer2/timer.cpp
+tutorial_timer3_timer_SOURCES = tutorial/timer3/timer.cpp
+tutorial_timer4_timer_SOURCES = tutorial/timer4/timer.cpp
+tutorial_timer5_timer_SOURCES = tutorial/timer5/timer.cpp
+tutorial_daytime1_client_SOURCES = tutorial/daytime1/client.cpp
+tutorial_daytime2_server_SOURCES = tutorial/daytime2/server.cpp
+tutorial_daytime3_server_SOURCES = tutorial/daytime3/server.cpp
+tutorial_daytime4_client_SOURCES = tutorial/daytime4/client.cpp
+tutorial_daytime5_server_SOURCES = tutorial/daytime5/server.cpp
+tutorial_daytime6_server_SOURCES = tutorial/daytime6/server.cpp
+tutorial_daytime7_server_SOURCES = tutorial/daytime7/server.cpp
+type_erasure_type_erasure_SOURCES = type_erasure/main.cpp type_erasure/stdin_line_reader.cpp type_erasure/sleep.cpp
+@WINDOWS_TARGET_FALSE@chat_posix_chat_client_SOURCES = chat/posix_chat_client.cpp
+@WINDOWS_TARGET_FALSE@fork_daemon_SOURCES = fork/daemon.cpp
+@WINDOWS_TARGET_FALSE@fork_process_per_connection_SOURCES = fork/process_per_connection.cpp
+@WINDOWS_TARGET_FALSE@local_connect_pair_SOURCES = local/connect_pair.cpp
+@WINDOWS_TARGET_FALSE@local_iostream_client_SOURCES = local/iostream_client.cpp
+@WINDOWS_TARGET_FALSE@local_stream_server_SOURCES = local/stream_server.cpp
+@WINDOWS_TARGET_FALSE@local_stream_client_SOURCES = local/stream_client.cpp
+@WINDOWS_TARGET_FALSE@local_fd_passing_stream_server_SOURCES = local/fd_passing_stream_server.cpp
+@WINDOWS_TARGET_FALSE@local_fd_passing_stream_client_SOURCES = local/fd_passing_stream_client.cpp
+@WINDOWS_TARGET_TRUE@windows_transmit_file_SOURCES = windows/transmit_file.cpp
+@HAVE_OPENSSL_TRUE@ssl_client_SOURCES = ssl/client.cpp
+@HAVE_OPENSSL_TRUE@ssl_server_SOURCES = ssl/server.cpp
+@HAVE_BOOST_COROUTINE_TRUE@spawn_echo_server_SOURCES = spawn/echo_server.cpp
+@HAVE_BOOST_COROUTINE_TRUE@spawn_echo_server_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system
+@HAVE_BOOST_COROUTINE_TRUE@spawn_parallel_grep_SOURCES = spawn/parallel_grep.cpp
+@HAVE_BOOST_COROUTINE_TRUE@spawn_parallel_grep_LDADD = $(LDADD) -lboost_coroutine -lboost_context -lboost_thread -lboost_chrono -lboost_system
+EXTRA_DIST = \
+ serialization/client.cpp \
+ serialization/server.cpp \
+ serialization/connection.hpp \
+ serialization/stock.hpp \
+ ssl/README \
+ ssl/ca.pem \
+ ssl/server.pem \
+ ssl/dh4096.pem
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/examples/cpp11/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/examples/cpp11/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+ -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+../../$(am__dirstamp):
+ @$(MKDIR_P) ../..
+ @: > ../../$(am__dirstamp)
+../../$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) ../../$(DEPDIR)
+ @: > ../../$(DEPDIR)/$(am__dirstamp)
+../../asio.$(OBJEXT): ../../$(am__dirstamp) \
+ ../../$(DEPDIR)/$(am__dirstamp)
+../../asio_ssl.$(OBJEXT): ../../$(am__dirstamp) \
+ ../../$(DEPDIR)/$(am__dirstamp)
+
+libasio.a: $(libasio_a_OBJECTS) $(libasio_a_DEPENDENCIES) $(EXTRA_libasio_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libasio.a
+ $(AM_V_AR)$(libasio_a_AR) libasio.a $(libasio_a_OBJECTS) $(libasio_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libasio.a
+allocation/$(am__dirstamp):
+ @$(MKDIR_P) allocation
+ @: > allocation/$(am__dirstamp)
+allocation/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) allocation/$(DEPDIR)
+ @: > allocation/$(DEPDIR)/$(am__dirstamp)
+allocation/server.$(OBJEXT): allocation/$(am__dirstamp) \
+ allocation/$(DEPDIR)/$(am__dirstamp)
+
+allocation/server$(EXEEXT): $(allocation_server_OBJECTS) $(allocation_server_DEPENDENCIES) $(EXTRA_allocation_server_DEPENDENCIES) allocation/$(am__dirstamp)
+ @rm -f allocation/server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(allocation_server_OBJECTS) $(allocation_server_LDADD) $(LIBS)
+buffers/$(am__dirstamp):
+ @$(MKDIR_P) buffers
+ @: > buffers/$(am__dirstamp)
+buffers/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) buffers/$(DEPDIR)
+ @: > buffers/$(DEPDIR)/$(am__dirstamp)
+buffers/reference_counted.$(OBJEXT): buffers/$(am__dirstamp) \
+ buffers/$(DEPDIR)/$(am__dirstamp)
+
+buffers/reference_counted$(EXEEXT): $(buffers_reference_counted_OBJECTS) $(buffers_reference_counted_DEPENDENCIES) $(EXTRA_buffers_reference_counted_DEPENDENCIES) buffers/$(am__dirstamp)
+ @rm -f buffers/reference_counted$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(buffers_reference_counted_OBJECTS) $(buffers_reference_counted_LDADD) $(LIBS)
+chat/$(am__dirstamp):
+ @$(MKDIR_P) chat
+ @: > chat/$(am__dirstamp)
+chat/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) chat/$(DEPDIR)
+ @: > chat/$(DEPDIR)/$(am__dirstamp)
+chat/chat_client.$(OBJEXT): chat/$(am__dirstamp) \
+ chat/$(DEPDIR)/$(am__dirstamp)
+
+chat/chat_client$(EXEEXT): $(chat_chat_client_OBJECTS) $(chat_chat_client_DEPENDENCIES) $(EXTRA_chat_chat_client_DEPENDENCIES) chat/$(am__dirstamp)
+ @rm -f chat/chat_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(chat_chat_client_OBJECTS) $(chat_chat_client_LDADD) $(LIBS)
+chat/chat_server.$(OBJEXT): chat/$(am__dirstamp) \
+ chat/$(DEPDIR)/$(am__dirstamp)
+
+chat/chat_server$(EXEEXT): $(chat_chat_server_OBJECTS) $(chat_chat_server_DEPENDENCIES) $(EXTRA_chat_chat_server_DEPENDENCIES) chat/$(am__dirstamp)
+ @rm -f chat/chat_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(chat_chat_server_OBJECTS) $(chat_chat_server_LDADD) $(LIBS)
+chat/posix_chat_client.$(OBJEXT): chat/$(am__dirstamp) \
+ chat/$(DEPDIR)/$(am__dirstamp)
+
+chat/posix_chat_client$(EXEEXT): $(chat_posix_chat_client_OBJECTS) $(chat_posix_chat_client_DEPENDENCIES) $(EXTRA_chat_posix_chat_client_DEPENDENCIES) chat/$(am__dirstamp)
+ @rm -f chat/posix_chat_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(chat_posix_chat_client_OBJECTS) $(chat_posix_chat_client_LDADD) $(LIBS)
+deferred/$(am__dirstamp):
+ @$(MKDIR_P) deferred
+ @: > deferred/$(am__dirstamp)
+deferred/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) deferred/$(DEPDIR)
+ @: > deferred/$(DEPDIR)/$(am__dirstamp)
+deferred/deferred_1.$(OBJEXT): deferred/$(am__dirstamp) \
+ deferred/$(DEPDIR)/$(am__dirstamp)
+
+deferred/deferred_1$(EXEEXT): $(deferred_deferred_1_OBJECTS) $(deferred_deferred_1_DEPENDENCIES) $(EXTRA_deferred_deferred_1_DEPENDENCIES) deferred/$(am__dirstamp)
+ @rm -f deferred/deferred_1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(deferred_deferred_1_OBJECTS) $(deferred_deferred_1_LDADD) $(LIBS)
+deferred/deferred_2.$(OBJEXT): deferred/$(am__dirstamp) \
+ deferred/$(DEPDIR)/$(am__dirstamp)
+
+deferred/deferred_2$(EXEEXT): $(deferred_deferred_2_OBJECTS) $(deferred_deferred_2_DEPENDENCIES) $(EXTRA_deferred_deferred_2_DEPENDENCIES) deferred/$(am__dirstamp)
+ @rm -f deferred/deferred_2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(deferred_deferred_2_OBJECTS) $(deferred_deferred_2_LDADD) $(LIBS)
+echo/$(am__dirstamp):
+ @$(MKDIR_P) echo
+ @: > echo/$(am__dirstamp)
+echo/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) echo/$(DEPDIR)
+ @: > echo/$(DEPDIR)/$(am__dirstamp)
+echo/async_tcp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \
+ echo/$(DEPDIR)/$(am__dirstamp)
+
+echo/async_tcp_echo_server$(EXEEXT): $(echo_async_tcp_echo_server_OBJECTS) $(echo_async_tcp_echo_server_DEPENDENCIES) $(EXTRA_echo_async_tcp_echo_server_DEPENDENCIES) echo/$(am__dirstamp)
+ @rm -f echo/async_tcp_echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(echo_async_tcp_echo_server_OBJECTS) $(echo_async_tcp_echo_server_LDADD) $(LIBS)
+echo/async_udp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \
+ echo/$(DEPDIR)/$(am__dirstamp)
+
+echo/async_udp_echo_server$(EXEEXT): $(echo_async_udp_echo_server_OBJECTS) $(echo_async_udp_echo_server_DEPENDENCIES) $(EXTRA_echo_async_udp_echo_server_DEPENDENCIES) echo/$(am__dirstamp)
+ @rm -f echo/async_udp_echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(echo_async_udp_echo_server_OBJECTS) $(echo_async_udp_echo_server_LDADD) $(LIBS)
+echo/blocking_tcp_echo_client.$(OBJEXT): echo/$(am__dirstamp) \
+ echo/$(DEPDIR)/$(am__dirstamp)
+
+echo/blocking_tcp_echo_client$(EXEEXT): $(echo_blocking_tcp_echo_client_OBJECTS) $(echo_blocking_tcp_echo_client_DEPENDENCIES) $(EXTRA_echo_blocking_tcp_echo_client_DEPENDENCIES) echo/$(am__dirstamp)
+ @rm -f echo/blocking_tcp_echo_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_tcp_echo_client_OBJECTS) $(echo_blocking_tcp_echo_client_LDADD) $(LIBS)
+echo/blocking_tcp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \
+ echo/$(DEPDIR)/$(am__dirstamp)
+
+echo/blocking_tcp_echo_server$(EXEEXT): $(echo_blocking_tcp_echo_server_OBJECTS) $(echo_blocking_tcp_echo_server_DEPENDENCIES) $(EXTRA_echo_blocking_tcp_echo_server_DEPENDENCIES) echo/$(am__dirstamp)
+ @rm -f echo/blocking_tcp_echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_tcp_echo_server_OBJECTS) $(echo_blocking_tcp_echo_server_LDADD) $(LIBS)
+echo/blocking_udp_echo_client.$(OBJEXT): echo/$(am__dirstamp) \
+ echo/$(DEPDIR)/$(am__dirstamp)
+
+echo/blocking_udp_echo_client$(EXEEXT): $(echo_blocking_udp_echo_client_OBJECTS) $(echo_blocking_udp_echo_client_DEPENDENCIES) $(EXTRA_echo_blocking_udp_echo_client_DEPENDENCIES) echo/$(am__dirstamp)
+ @rm -f echo/blocking_udp_echo_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_udp_echo_client_OBJECTS) $(echo_blocking_udp_echo_client_LDADD) $(LIBS)
+echo/blocking_udp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \
+ echo/$(DEPDIR)/$(am__dirstamp)
+
+echo/blocking_udp_echo_server$(EXEEXT): $(echo_blocking_udp_echo_server_OBJECTS) $(echo_blocking_udp_echo_server_DEPENDENCIES) $(EXTRA_echo_blocking_udp_echo_server_DEPENDENCIES) echo/$(am__dirstamp)
+ @rm -f echo/blocking_udp_echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_udp_echo_server_OBJECTS) $(echo_blocking_udp_echo_server_LDADD) $(LIBS)
+executors/$(am__dirstamp):
+ @$(MKDIR_P) executors
+ @: > executors/$(am__dirstamp)
+executors/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) executors/$(DEPDIR)
+ @: > executors/$(DEPDIR)/$(am__dirstamp)
+executors/actor.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/actor$(EXEEXT): $(executors_actor_OBJECTS) $(executors_actor_DEPENDENCIES) $(EXTRA_executors_actor_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/actor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_actor_OBJECTS) $(executors_actor_LDADD) $(LIBS)
+executors/bank_account_1.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/bank_account_1$(EXEEXT): $(executors_bank_account_1_OBJECTS) $(executors_bank_account_1_DEPENDENCIES) $(EXTRA_executors_bank_account_1_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/bank_account_1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_bank_account_1_OBJECTS) $(executors_bank_account_1_LDADD) $(LIBS)
+executors/bank_account_2.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/bank_account_2$(EXEEXT): $(executors_bank_account_2_OBJECTS) $(executors_bank_account_2_DEPENDENCIES) $(EXTRA_executors_bank_account_2_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/bank_account_2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_bank_account_2_OBJECTS) $(executors_bank_account_2_LDADD) $(LIBS)
+executors/fork_join.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/fork_join$(EXEEXT): $(executors_fork_join_OBJECTS) $(executors_fork_join_DEPENDENCIES) $(EXTRA_executors_fork_join_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/fork_join$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_fork_join_OBJECTS) $(executors_fork_join_LDADD) $(LIBS)
+executors/pipeline.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/pipeline$(EXEEXT): $(executors_pipeline_OBJECTS) $(executors_pipeline_DEPENDENCIES) $(EXTRA_executors_pipeline_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/pipeline$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_pipeline_OBJECTS) $(executors_pipeline_LDADD) $(LIBS)
+executors/priority_scheduler.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/priority_scheduler$(EXEEXT): $(executors_priority_scheduler_OBJECTS) $(executors_priority_scheduler_DEPENDENCIES) $(EXTRA_executors_priority_scheduler_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/priority_scheduler$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_priority_scheduler_OBJECTS) $(executors_priority_scheduler_LDADD) $(LIBS)
+files/$(am__dirstamp):
+ @$(MKDIR_P) files
+ @: > files/$(am__dirstamp)
+files/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) files/$(DEPDIR)
+ @: > files/$(DEPDIR)/$(am__dirstamp)
+files/async_file_copy.$(OBJEXT): files/$(am__dirstamp) \
+ files/$(DEPDIR)/$(am__dirstamp)
+
+files/async_file_copy$(EXEEXT): $(files_async_file_copy_OBJECTS) $(files_async_file_copy_DEPENDENCIES) $(EXTRA_files_async_file_copy_DEPENDENCIES) files/$(am__dirstamp)
+ @rm -f files/async_file_copy$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(files_async_file_copy_OBJECTS) $(files_async_file_copy_LDADD) $(LIBS)
+files/blocking_file_copy.$(OBJEXT): files/$(am__dirstamp) \
+ files/$(DEPDIR)/$(am__dirstamp)
+
+files/blocking_file_copy$(EXEEXT): $(files_blocking_file_copy_OBJECTS) $(files_blocking_file_copy_DEPENDENCIES) $(EXTRA_files_blocking_file_copy_DEPENDENCIES) files/$(am__dirstamp)
+ @rm -f files/blocking_file_copy$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(files_blocking_file_copy_OBJECTS) $(files_blocking_file_copy_LDADD) $(LIBS)
+fork/$(am__dirstamp):
+ @$(MKDIR_P) fork
+ @: > fork/$(am__dirstamp)
+fork/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) fork/$(DEPDIR)
+ @: > fork/$(DEPDIR)/$(am__dirstamp)
+fork/daemon.$(OBJEXT): fork/$(am__dirstamp) \
+ fork/$(DEPDIR)/$(am__dirstamp)
+
+fork/daemon$(EXEEXT): $(fork_daemon_OBJECTS) $(fork_daemon_DEPENDENCIES) $(EXTRA_fork_daemon_DEPENDENCIES) fork/$(am__dirstamp)
+ @rm -f fork/daemon$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fork_daemon_OBJECTS) $(fork_daemon_LDADD) $(LIBS)
+fork/process_per_connection.$(OBJEXT): fork/$(am__dirstamp) \
+ fork/$(DEPDIR)/$(am__dirstamp)
+
+fork/process_per_connection$(EXEEXT): $(fork_process_per_connection_OBJECTS) $(fork_process_per_connection_DEPENDENCIES) $(EXTRA_fork_process_per_connection_DEPENDENCIES) fork/$(am__dirstamp)
+ @rm -f fork/process_per_connection$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(fork_process_per_connection_OBJECTS) $(fork_process_per_connection_LDADD) $(LIBS)
+futures/$(am__dirstamp):
+ @$(MKDIR_P) futures
+ @: > futures/$(am__dirstamp)
+futures/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) futures/$(DEPDIR)
+ @: > futures/$(DEPDIR)/$(am__dirstamp)
+futures/daytime_client.$(OBJEXT): futures/$(am__dirstamp) \
+ futures/$(DEPDIR)/$(am__dirstamp)
+
+futures/daytime_client$(EXEEXT): $(futures_daytime_client_OBJECTS) $(futures_daytime_client_DEPENDENCIES) $(EXTRA_futures_daytime_client_DEPENDENCIES) futures/$(am__dirstamp)
+ @rm -f futures/daytime_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(futures_daytime_client_OBJECTS) $(futures_daytime_client_LDADD) $(LIBS)
+handler_tracking/$(am__dirstamp):
+ @$(MKDIR_P) handler_tracking
+ @: > handler_tracking/$(am__dirstamp)
+handler_tracking/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) handler_tracking/$(DEPDIR)
+ @: > handler_tracking/$(DEPDIR)/$(am__dirstamp)
+handler_tracking/async_tcp_echo_server.$(OBJEXT): \
+ handler_tracking/$(am__dirstamp) \
+ handler_tracking/$(DEPDIR)/$(am__dirstamp)
+
+handler_tracking/async_tcp_echo_server$(EXEEXT): $(handler_tracking_async_tcp_echo_server_OBJECTS) $(handler_tracking_async_tcp_echo_server_DEPENDENCIES) $(EXTRA_handler_tracking_async_tcp_echo_server_DEPENDENCIES) handler_tracking/$(am__dirstamp)
+ @rm -f handler_tracking/async_tcp_echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(handler_tracking_async_tcp_echo_server_OBJECTS) $(handler_tracking_async_tcp_echo_server_LDADD) $(LIBS)
+http/client/$(am__dirstamp):
+ @$(MKDIR_P) http/client
+ @: > http/client/$(am__dirstamp)
+http/client/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) http/client/$(DEPDIR)
+ @: > http/client/$(DEPDIR)/$(am__dirstamp)
+http/client/async_client.$(OBJEXT): http/client/$(am__dirstamp) \
+ http/client/$(DEPDIR)/$(am__dirstamp)
+
+http/client/async_client$(EXEEXT): $(http_client_async_client_OBJECTS) $(http_client_async_client_DEPENDENCIES) $(EXTRA_http_client_async_client_DEPENDENCIES) http/client/$(am__dirstamp)
+ @rm -f http/client/async_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(http_client_async_client_OBJECTS) $(http_client_async_client_LDADD) $(LIBS)
+http/client/sync_client.$(OBJEXT): http/client/$(am__dirstamp) \
+ http/client/$(DEPDIR)/$(am__dirstamp)
+
+http/client/sync_client$(EXEEXT): $(http_client_sync_client_OBJECTS) $(http_client_sync_client_DEPENDENCIES) $(EXTRA_http_client_sync_client_DEPENDENCIES) http/client/$(am__dirstamp)
+ @rm -f http/client/sync_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(http_client_sync_client_OBJECTS) $(http_client_sync_client_LDADD) $(LIBS)
+http/server/$(am__dirstamp):
+ @$(MKDIR_P) http/server
+ @: > http/server/$(am__dirstamp)
+http/server/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) http/server/$(DEPDIR)
+ @: > http/server/$(DEPDIR)/$(am__dirstamp)
+http/server/connection.$(OBJEXT): http/server/$(am__dirstamp) \
+ http/server/$(DEPDIR)/$(am__dirstamp)
+http/server/connection_manager.$(OBJEXT): http/server/$(am__dirstamp) \
+ http/server/$(DEPDIR)/$(am__dirstamp)
+http/server/main.$(OBJEXT): http/server/$(am__dirstamp) \
+ http/server/$(DEPDIR)/$(am__dirstamp)
+http/server/mime_types.$(OBJEXT): http/server/$(am__dirstamp) \
+ http/server/$(DEPDIR)/$(am__dirstamp)
+http/server/reply.$(OBJEXT): http/server/$(am__dirstamp) \
+ http/server/$(DEPDIR)/$(am__dirstamp)
+http/server/request_handler.$(OBJEXT): http/server/$(am__dirstamp) \
+ http/server/$(DEPDIR)/$(am__dirstamp)
+http/server/request_parser.$(OBJEXT): http/server/$(am__dirstamp) \
+ http/server/$(DEPDIR)/$(am__dirstamp)
+http/server/server.$(OBJEXT): http/server/$(am__dirstamp) \
+ http/server/$(DEPDIR)/$(am__dirstamp)
+
+http/server/http_server$(EXEEXT): $(http_server_http_server_OBJECTS) $(http_server_http_server_DEPENDENCIES) $(EXTRA_http_server_http_server_DEPENDENCIES) http/server/$(am__dirstamp)
+ @rm -f http/server/http_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(http_server_http_server_OBJECTS) $(http_server_http_server_LDADD) $(LIBS)
+http/server2/$(am__dirstamp):
+ @$(MKDIR_P) http/server2
+ @: > http/server2/$(am__dirstamp)
+http/server2/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) http/server2/$(DEPDIR)
+ @: > http/server2/$(DEPDIR)/$(am__dirstamp)
+http/server2/connection.$(OBJEXT): http/server2/$(am__dirstamp) \
+ http/server2/$(DEPDIR)/$(am__dirstamp)
+http/server2/io_context_pool.$(OBJEXT): http/server2/$(am__dirstamp) \
+ http/server2/$(DEPDIR)/$(am__dirstamp)
+http/server2/main.$(OBJEXT): http/server2/$(am__dirstamp) \
+ http/server2/$(DEPDIR)/$(am__dirstamp)
+http/server2/mime_types.$(OBJEXT): http/server2/$(am__dirstamp) \
+ http/server2/$(DEPDIR)/$(am__dirstamp)
+http/server2/reply.$(OBJEXT): http/server2/$(am__dirstamp) \
+ http/server2/$(DEPDIR)/$(am__dirstamp)
+http/server2/request_handler.$(OBJEXT): http/server2/$(am__dirstamp) \
+ http/server2/$(DEPDIR)/$(am__dirstamp)
+http/server2/request_parser.$(OBJEXT): http/server2/$(am__dirstamp) \
+ http/server2/$(DEPDIR)/$(am__dirstamp)
+http/server2/server.$(OBJEXT): http/server2/$(am__dirstamp) \
+ http/server2/$(DEPDIR)/$(am__dirstamp)
+
+http/server2/http_server$(EXEEXT): $(http_server2_http_server_OBJECTS) $(http_server2_http_server_DEPENDENCIES) $(EXTRA_http_server2_http_server_DEPENDENCIES) http/server2/$(am__dirstamp)
+ @rm -f http/server2/http_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(http_server2_http_server_OBJECTS) $(http_server2_http_server_LDADD) $(LIBS)
+http/server3/$(am__dirstamp):
+ @$(MKDIR_P) http/server3
+ @: > http/server3/$(am__dirstamp)
+http/server3/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) http/server3/$(DEPDIR)
+ @: > http/server3/$(DEPDIR)/$(am__dirstamp)
+http/server3/connection.$(OBJEXT): http/server3/$(am__dirstamp) \
+ http/server3/$(DEPDIR)/$(am__dirstamp)
+http/server3/main.$(OBJEXT): http/server3/$(am__dirstamp) \
+ http/server3/$(DEPDIR)/$(am__dirstamp)
+http/server3/mime_types.$(OBJEXT): http/server3/$(am__dirstamp) \
+ http/server3/$(DEPDIR)/$(am__dirstamp)
+http/server3/reply.$(OBJEXT): http/server3/$(am__dirstamp) \
+ http/server3/$(DEPDIR)/$(am__dirstamp)
+http/server3/request_handler.$(OBJEXT): http/server3/$(am__dirstamp) \
+ http/server3/$(DEPDIR)/$(am__dirstamp)
+http/server3/request_parser.$(OBJEXT): http/server3/$(am__dirstamp) \
+ http/server3/$(DEPDIR)/$(am__dirstamp)
+http/server3/server.$(OBJEXT): http/server3/$(am__dirstamp) \
+ http/server3/$(DEPDIR)/$(am__dirstamp)
+
+http/server3/http_server$(EXEEXT): $(http_server3_http_server_OBJECTS) $(http_server3_http_server_DEPENDENCIES) $(EXTRA_http_server3_http_server_DEPENDENCIES) http/server3/$(am__dirstamp)
+ @rm -f http/server3/http_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(http_server3_http_server_OBJECTS) $(http_server3_http_server_LDADD) $(LIBS)
+http/server4/$(am__dirstamp):
+ @$(MKDIR_P) http/server4
+ @: > http/server4/$(am__dirstamp)
+http/server4/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) http/server4/$(DEPDIR)
+ @: > http/server4/$(DEPDIR)/$(am__dirstamp)
+http/server4/file_handler.$(OBJEXT): http/server4/$(am__dirstamp) \
+ http/server4/$(DEPDIR)/$(am__dirstamp)
+http/server4/main.$(OBJEXT): http/server4/$(am__dirstamp) \
+ http/server4/$(DEPDIR)/$(am__dirstamp)
+http/server4/mime_types.$(OBJEXT): http/server4/$(am__dirstamp) \
+ http/server4/$(DEPDIR)/$(am__dirstamp)
+http/server4/reply.$(OBJEXT): http/server4/$(am__dirstamp) \
+ http/server4/$(DEPDIR)/$(am__dirstamp)
+http/server4/request_parser.$(OBJEXT): http/server4/$(am__dirstamp) \
+ http/server4/$(DEPDIR)/$(am__dirstamp)
+http/server4/server.$(OBJEXT): http/server4/$(am__dirstamp) \
+ http/server4/$(DEPDIR)/$(am__dirstamp)
+
+http/server4/http_server$(EXEEXT): $(http_server4_http_server_OBJECTS) $(http_server4_http_server_DEPENDENCIES) $(EXTRA_http_server4_http_server_DEPENDENCIES) http/server4/$(am__dirstamp)
+ @rm -f http/server4/http_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(http_server4_http_server_OBJECTS) $(http_server4_http_server_LDADD) $(LIBS)
+icmp/$(am__dirstamp):
+ @$(MKDIR_P) icmp
+ @: > icmp/$(am__dirstamp)
+icmp/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) icmp/$(DEPDIR)
+ @: > icmp/$(DEPDIR)/$(am__dirstamp)
+icmp/ping.$(OBJEXT): icmp/$(am__dirstamp) \
+ icmp/$(DEPDIR)/$(am__dirstamp)
+
+icmp/ping$(EXEEXT): $(icmp_ping_OBJECTS) $(icmp_ping_DEPENDENCIES) $(EXTRA_icmp_ping_DEPENDENCIES) icmp/$(am__dirstamp)
+ @rm -f icmp/ping$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(icmp_ping_OBJECTS) $(icmp_ping_LDADD) $(LIBS)
+invocation/$(am__dirstamp):
+ @$(MKDIR_P) invocation
+ @: > invocation/$(am__dirstamp)
+invocation/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) invocation/$(DEPDIR)
+ @: > invocation/$(DEPDIR)/$(am__dirstamp)
+invocation/prioritised_handlers.$(OBJEXT): invocation/$(am__dirstamp) \
+ invocation/$(DEPDIR)/$(am__dirstamp)
+
+invocation/prioritised_handlers$(EXEEXT): $(invocation_prioritised_handlers_OBJECTS) $(invocation_prioritised_handlers_DEPENDENCIES) $(EXTRA_invocation_prioritised_handlers_DEPENDENCIES) invocation/$(am__dirstamp)
+ @rm -f invocation/prioritised_handlers$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(invocation_prioritised_handlers_OBJECTS) $(invocation_prioritised_handlers_LDADD) $(LIBS)
+iostreams/$(am__dirstamp):
+ @$(MKDIR_P) iostreams
+ @: > iostreams/$(am__dirstamp)
+iostreams/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) iostreams/$(DEPDIR)
+ @: > iostreams/$(DEPDIR)/$(am__dirstamp)
+iostreams/daytime_client.$(OBJEXT): iostreams/$(am__dirstamp) \
+ iostreams/$(DEPDIR)/$(am__dirstamp)
+
+iostreams/daytime_client$(EXEEXT): $(iostreams_daytime_client_OBJECTS) $(iostreams_daytime_client_DEPENDENCIES) $(EXTRA_iostreams_daytime_client_DEPENDENCIES) iostreams/$(am__dirstamp)
+ @rm -f iostreams/daytime_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(iostreams_daytime_client_OBJECTS) $(iostreams_daytime_client_LDADD) $(LIBS)
+iostreams/daytime_server.$(OBJEXT): iostreams/$(am__dirstamp) \
+ iostreams/$(DEPDIR)/$(am__dirstamp)
+
+iostreams/daytime_server$(EXEEXT): $(iostreams_daytime_server_OBJECTS) $(iostreams_daytime_server_DEPENDENCIES) $(EXTRA_iostreams_daytime_server_DEPENDENCIES) iostreams/$(am__dirstamp)
+ @rm -f iostreams/daytime_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(iostreams_daytime_server_OBJECTS) $(iostreams_daytime_server_LDADD) $(LIBS)
+iostreams/http_client.$(OBJEXT): iostreams/$(am__dirstamp) \
+ iostreams/$(DEPDIR)/$(am__dirstamp)
+
+iostreams/http_client$(EXEEXT): $(iostreams_http_client_OBJECTS) $(iostreams_http_client_DEPENDENCIES) $(EXTRA_iostreams_http_client_DEPENDENCIES) iostreams/$(am__dirstamp)
+ @rm -f iostreams/http_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(iostreams_http_client_OBJECTS) $(iostreams_http_client_LDADD) $(LIBS)
+local/$(am__dirstamp):
+ @$(MKDIR_P) local
+ @: > local/$(am__dirstamp)
+local/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) local/$(DEPDIR)
+ @: > local/$(DEPDIR)/$(am__dirstamp)
+local/connect_pair.$(OBJEXT): local/$(am__dirstamp) \
+ local/$(DEPDIR)/$(am__dirstamp)
+
+local/connect_pair$(EXEEXT): $(local_connect_pair_OBJECTS) $(local_connect_pair_DEPENDENCIES) $(EXTRA_local_connect_pair_DEPENDENCIES) local/$(am__dirstamp)
+ @rm -f local/connect_pair$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(local_connect_pair_OBJECTS) $(local_connect_pair_LDADD) $(LIBS)
+local/fd_passing_stream_client.$(OBJEXT): local/$(am__dirstamp) \
+ local/$(DEPDIR)/$(am__dirstamp)
+
+local/fd_passing_stream_client$(EXEEXT): $(local_fd_passing_stream_client_OBJECTS) $(local_fd_passing_stream_client_DEPENDENCIES) $(EXTRA_local_fd_passing_stream_client_DEPENDENCIES) local/$(am__dirstamp)
+ @rm -f local/fd_passing_stream_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(local_fd_passing_stream_client_OBJECTS) $(local_fd_passing_stream_client_LDADD) $(LIBS)
+local/fd_passing_stream_server.$(OBJEXT): local/$(am__dirstamp) \
+ local/$(DEPDIR)/$(am__dirstamp)
+
+local/fd_passing_stream_server$(EXEEXT): $(local_fd_passing_stream_server_OBJECTS) $(local_fd_passing_stream_server_DEPENDENCIES) $(EXTRA_local_fd_passing_stream_server_DEPENDENCIES) local/$(am__dirstamp)
+ @rm -f local/fd_passing_stream_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(local_fd_passing_stream_server_OBJECTS) $(local_fd_passing_stream_server_LDADD) $(LIBS)
+local/iostream_client.$(OBJEXT): local/$(am__dirstamp) \
+ local/$(DEPDIR)/$(am__dirstamp)
+
+local/iostream_client$(EXEEXT): $(local_iostream_client_OBJECTS) $(local_iostream_client_DEPENDENCIES) $(EXTRA_local_iostream_client_DEPENDENCIES) local/$(am__dirstamp)
+ @rm -f local/iostream_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(local_iostream_client_OBJECTS) $(local_iostream_client_LDADD) $(LIBS)
+local/stream_client.$(OBJEXT): local/$(am__dirstamp) \
+ local/$(DEPDIR)/$(am__dirstamp)
+
+local/stream_client$(EXEEXT): $(local_stream_client_OBJECTS) $(local_stream_client_DEPENDENCIES) $(EXTRA_local_stream_client_DEPENDENCIES) local/$(am__dirstamp)
+ @rm -f local/stream_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(local_stream_client_OBJECTS) $(local_stream_client_LDADD) $(LIBS)
+local/stream_server.$(OBJEXT): local/$(am__dirstamp) \
+ local/$(DEPDIR)/$(am__dirstamp)
+
+local/stream_server$(EXEEXT): $(local_stream_server_OBJECTS) $(local_stream_server_DEPENDENCIES) $(EXTRA_local_stream_server_DEPENDENCIES) local/$(am__dirstamp)
+ @rm -f local/stream_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(local_stream_server_OBJECTS) $(local_stream_server_LDADD) $(LIBS)
+multicast/$(am__dirstamp):
+ @$(MKDIR_P) multicast
+ @: > multicast/$(am__dirstamp)
+multicast/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) multicast/$(DEPDIR)
+ @: > multicast/$(DEPDIR)/$(am__dirstamp)
+multicast/receiver.$(OBJEXT): multicast/$(am__dirstamp) \
+ multicast/$(DEPDIR)/$(am__dirstamp)
+
+multicast/receiver$(EXEEXT): $(multicast_receiver_OBJECTS) $(multicast_receiver_DEPENDENCIES) $(EXTRA_multicast_receiver_DEPENDENCIES) multicast/$(am__dirstamp)
+ @rm -f multicast/receiver$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(multicast_receiver_OBJECTS) $(multicast_receiver_LDADD) $(LIBS)
+multicast/sender.$(OBJEXT): multicast/$(am__dirstamp) \
+ multicast/$(DEPDIR)/$(am__dirstamp)
+
+multicast/sender$(EXEEXT): $(multicast_sender_OBJECTS) $(multicast_sender_DEPENDENCIES) $(EXTRA_multicast_sender_DEPENDENCIES) multicast/$(am__dirstamp)
+ @rm -f multicast/sender$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(multicast_sender_OBJECTS) $(multicast_sender_LDADD) $(LIBS)
+nonblocking/$(am__dirstamp):
+ @$(MKDIR_P) nonblocking
+ @: > nonblocking/$(am__dirstamp)
+nonblocking/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) nonblocking/$(DEPDIR)
+ @: > nonblocking/$(DEPDIR)/$(am__dirstamp)
+nonblocking/third_party_lib.$(OBJEXT): nonblocking/$(am__dirstamp) \
+ nonblocking/$(DEPDIR)/$(am__dirstamp)
+
+nonblocking/third_party_lib$(EXEEXT): $(nonblocking_third_party_lib_OBJECTS) $(nonblocking_third_party_lib_DEPENDENCIES) $(EXTRA_nonblocking_third_party_lib_DEPENDENCIES) nonblocking/$(am__dirstamp)
+ @rm -f nonblocking/third_party_lib$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(nonblocking_third_party_lib_OBJECTS) $(nonblocking_third_party_lib_LDADD) $(LIBS)
+operations/$(am__dirstamp):
+ @$(MKDIR_P) operations
+ @: > operations/$(am__dirstamp)
+operations/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) operations/$(DEPDIR)
+ @: > operations/$(DEPDIR)/$(am__dirstamp)
+operations/composed_1.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_1$(EXEEXT): $(operations_composed_1_OBJECTS) $(operations_composed_1_DEPENDENCIES) $(EXTRA_operations_composed_1_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_1_OBJECTS) $(operations_composed_1_LDADD) $(LIBS)
+operations/composed_2.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_2$(EXEEXT): $(operations_composed_2_OBJECTS) $(operations_composed_2_DEPENDENCIES) $(EXTRA_operations_composed_2_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_2_OBJECTS) $(operations_composed_2_LDADD) $(LIBS)
+operations/composed_3.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_3$(EXEEXT): $(operations_composed_3_OBJECTS) $(operations_composed_3_DEPENDENCIES) $(EXTRA_operations_composed_3_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_3_OBJECTS) $(operations_composed_3_LDADD) $(LIBS)
+operations/composed_4.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_4$(EXEEXT): $(operations_composed_4_OBJECTS) $(operations_composed_4_DEPENDENCIES) $(EXTRA_operations_composed_4_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_4_OBJECTS) $(operations_composed_4_LDADD) $(LIBS)
+operations/composed_5.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_5$(EXEEXT): $(operations_composed_5_OBJECTS) $(operations_composed_5_DEPENDENCIES) $(EXTRA_operations_composed_5_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_5$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_5_OBJECTS) $(operations_composed_5_LDADD) $(LIBS)
+operations/composed_6.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_6$(EXEEXT): $(operations_composed_6_OBJECTS) $(operations_composed_6_DEPENDENCIES) $(EXTRA_operations_composed_6_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_6$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_6_OBJECTS) $(operations_composed_6_LDADD) $(LIBS)
+operations/composed_7.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_7$(EXEEXT): $(operations_composed_7_OBJECTS) $(operations_composed_7_DEPENDENCIES) $(EXTRA_operations_composed_7_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_7$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_7_OBJECTS) $(operations_composed_7_LDADD) $(LIBS)
+operations/composed_8.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_8$(EXEEXT): $(operations_composed_8_OBJECTS) $(operations_composed_8_DEPENDENCIES) $(EXTRA_operations_composed_8_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_8$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_8_OBJECTS) $(operations_composed_8_LDADD) $(LIBS)
+parallel_group/$(am__dirstamp):
+ @$(MKDIR_P) parallel_group
+ @: > parallel_group/$(am__dirstamp)
+parallel_group/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) parallel_group/$(DEPDIR)
+ @: > parallel_group/$(DEPDIR)/$(am__dirstamp)
+parallel_group/ranged_wait_for_all.$(OBJEXT): \
+ parallel_group/$(am__dirstamp) \
+ parallel_group/$(DEPDIR)/$(am__dirstamp)
+
+parallel_group/ranged_wait_for_all$(EXEEXT): $(parallel_group_ranged_wait_for_all_OBJECTS) $(parallel_group_ranged_wait_for_all_DEPENDENCIES) $(EXTRA_parallel_group_ranged_wait_for_all_DEPENDENCIES) parallel_group/$(am__dirstamp)
+ @rm -f parallel_group/ranged_wait_for_all$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parallel_group_ranged_wait_for_all_OBJECTS) $(parallel_group_ranged_wait_for_all_LDADD) $(LIBS)
+parallel_group/wait_for_all.$(OBJEXT): parallel_group/$(am__dirstamp) \
+ parallel_group/$(DEPDIR)/$(am__dirstamp)
+
+parallel_group/wait_for_all$(EXEEXT): $(parallel_group_wait_for_all_OBJECTS) $(parallel_group_wait_for_all_DEPENDENCIES) $(EXTRA_parallel_group_wait_for_all_DEPENDENCIES) parallel_group/$(am__dirstamp)
+ @rm -f parallel_group/wait_for_all$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parallel_group_wait_for_all_OBJECTS) $(parallel_group_wait_for_all_LDADD) $(LIBS)
+parallel_group/wait_for_one.$(OBJEXT): parallel_group/$(am__dirstamp) \
+ parallel_group/$(DEPDIR)/$(am__dirstamp)
+
+parallel_group/wait_for_one$(EXEEXT): $(parallel_group_wait_for_one_OBJECTS) $(parallel_group_wait_for_one_DEPENDENCIES) $(EXTRA_parallel_group_wait_for_one_DEPENDENCIES) parallel_group/$(am__dirstamp)
+ @rm -f parallel_group/wait_for_one$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parallel_group_wait_for_one_OBJECTS) $(parallel_group_wait_for_one_LDADD) $(LIBS)
+parallel_group/wait_for_one_error.$(OBJEXT): \
+ parallel_group/$(am__dirstamp) \
+ parallel_group/$(DEPDIR)/$(am__dirstamp)
+
+parallel_group/wait_for_one_error$(EXEEXT): $(parallel_group_wait_for_one_error_OBJECTS) $(parallel_group_wait_for_one_error_DEPENDENCIES) $(EXTRA_parallel_group_wait_for_one_error_DEPENDENCIES) parallel_group/$(am__dirstamp)
+ @rm -f parallel_group/wait_for_one_error$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parallel_group_wait_for_one_error_OBJECTS) $(parallel_group_wait_for_one_error_LDADD) $(LIBS)
+parallel_group/wait_for_one_success.$(OBJEXT): \
+ parallel_group/$(am__dirstamp) \
+ parallel_group/$(DEPDIR)/$(am__dirstamp)
+
+parallel_group/wait_for_one_success$(EXEEXT): $(parallel_group_wait_for_one_success_OBJECTS) $(parallel_group_wait_for_one_success_DEPENDENCIES) $(EXTRA_parallel_group_wait_for_one_success_DEPENDENCIES) parallel_group/$(am__dirstamp)
+ @rm -f parallel_group/wait_for_one_success$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parallel_group_wait_for_one_success_OBJECTS) $(parallel_group_wait_for_one_success_LDADD) $(LIBS)
+porthopper/$(am__dirstamp):
+ @$(MKDIR_P) porthopper
+ @: > porthopper/$(am__dirstamp)
+porthopper/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) porthopper/$(DEPDIR)
+ @: > porthopper/$(DEPDIR)/$(am__dirstamp)
+porthopper/client.$(OBJEXT): porthopper/$(am__dirstamp) \
+ porthopper/$(DEPDIR)/$(am__dirstamp)
+
+porthopper/client$(EXEEXT): $(porthopper_client_OBJECTS) $(porthopper_client_DEPENDENCIES) $(EXTRA_porthopper_client_DEPENDENCIES) porthopper/$(am__dirstamp)
+ @rm -f porthopper/client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(porthopper_client_OBJECTS) $(porthopper_client_LDADD) $(LIBS)
+porthopper/server.$(OBJEXT): porthopper/$(am__dirstamp) \
+ porthopper/$(DEPDIR)/$(am__dirstamp)
+
+porthopper/server$(EXEEXT): $(porthopper_server_OBJECTS) $(porthopper_server_DEPENDENCIES) $(EXTRA_porthopper_server_DEPENDENCIES) porthopper/$(am__dirstamp)
+ @rm -f porthopper/server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(porthopper_server_OBJECTS) $(porthopper_server_LDADD) $(LIBS)
+services/$(am__dirstamp):
+ @$(MKDIR_P) services
+ @: > services/$(am__dirstamp)
+services/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) services/$(DEPDIR)
+ @: > services/$(DEPDIR)/$(am__dirstamp)
+services/daytime_client.$(OBJEXT): services/$(am__dirstamp) \
+ services/$(DEPDIR)/$(am__dirstamp)
+services/logger_service.$(OBJEXT): services/$(am__dirstamp) \
+ services/$(DEPDIR)/$(am__dirstamp)
+
+services/daytime_client$(EXEEXT): $(services_daytime_client_OBJECTS) $(services_daytime_client_DEPENDENCIES) $(EXTRA_services_daytime_client_DEPENDENCIES) services/$(am__dirstamp)
+ @rm -f services/daytime_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(services_daytime_client_OBJECTS) $(services_daytime_client_LDADD) $(LIBS)
+socks4/$(am__dirstamp):
+ @$(MKDIR_P) socks4
+ @: > socks4/$(am__dirstamp)
+socks4/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) socks4/$(DEPDIR)
+ @: > socks4/$(DEPDIR)/$(am__dirstamp)
+socks4/sync_client.$(OBJEXT): socks4/$(am__dirstamp) \
+ socks4/$(DEPDIR)/$(am__dirstamp)
+
+socks4/sync_client$(EXEEXT): $(socks4_sync_client_OBJECTS) $(socks4_sync_client_DEPENDENCIES) $(EXTRA_socks4_sync_client_DEPENDENCIES) socks4/$(am__dirstamp)
+ @rm -f socks4/sync_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(socks4_sync_client_OBJECTS) $(socks4_sync_client_LDADD) $(LIBS)
+spawn/$(am__dirstamp):
+ @$(MKDIR_P) spawn
+ @: > spawn/$(am__dirstamp)
+spawn/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) spawn/$(DEPDIR)
+ @: > spawn/$(DEPDIR)/$(am__dirstamp)
+spawn/echo_server.$(OBJEXT): spawn/$(am__dirstamp) \
+ spawn/$(DEPDIR)/$(am__dirstamp)
+
+spawn/echo_server$(EXEEXT): $(spawn_echo_server_OBJECTS) $(spawn_echo_server_DEPENDENCIES) $(EXTRA_spawn_echo_server_DEPENDENCIES) spawn/$(am__dirstamp)
+ @rm -f spawn/echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(spawn_echo_server_OBJECTS) $(spawn_echo_server_LDADD) $(LIBS)
+spawn/parallel_grep.$(OBJEXT): spawn/$(am__dirstamp) \
+ spawn/$(DEPDIR)/$(am__dirstamp)
+
+spawn/parallel_grep$(EXEEXT): $(spawn_parallel_grep_OBJECTS) $(spawn_parallel_grep_DEPENDENCIES) $(EXTRA_spawn_parallel_grep_DEPENDENCIES) spawn/$(am__dirstamp)
+ @rm -f spawn/parallel_grep$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(spawn_parallel_grep_OBJECTS) $(spawn_parallel_grep_LDADD) $(LIBS)
+ssl/$(am__dirstamp):
+ @$(MKDIR_P) ssl
+ @: > ssl/$(am__dirstamp)
+ssl/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) ssl/$(DEPDIR)
+ @: > ssl/$(DEPDIR)/$(am__dirstamp)
+ssl/client.$(OBJEXT): ssl/$(am__dirstamp) \
+ ssl/$(DEPDIR)/$(am__dirstamp)
+
+ssl/client$(EXEEXT): $(ssl_client_OBJECTS) $(ssl_client_DEPENDENCIES) $(EXTRA_ssl_client_DEPENDENCIES) ssl/$(am__dirstamp)
+ @rm -f ssl/client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ssl_client_OBJECTS) $(ssl_client_LDADD) $(LIBS)
+ssl/server.$(OBJEXT): ssl/$(am__dirstamp) \
+ ssl/$(DEPDIR)/$(am__dirstamp)
+
+ssl/server$(EXEEXT): $(ssl_server_OBJECTS) $(ssl_server_DEPENDENCIES) $(EXTRA_ssl_server_DEPENDENCIES) ssl/$(am__dirstamp)
+ @rm -f ssl/server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(ssl_server_OBJECTS) $(ssl_server_LDADD) $(LIBS)
+timeouts/$(am__dirstamp):
+ @$(MKDIR_P) timeouts
+ @: > timeouts/$(am__dirstamp)
+timeouts/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) timeouts/$(DEPDIR)
+ @: > timeouts/$(DEPDIR)/$(am__dirstamp)
+timeouts/async_tcp_client.$(OBJEXT): timeouts/$(am__dirstamp) \
+ timeouts/$(DEPDIR)/$(am__dirstamp)
+
+timeouts/async_tcp_client$(EXEEXT): $(timeouts_async_tcp_client_OBJECTS) $(timeouts_async_tcp_client_DEPENDENCIES) $(EXTRA_timeouts_async_tcp_client_DEPENDENCIES) timeouts/$(am__dirstamp)
+ @rm -f timeouts/async_tcp_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timeouts_async_tcp_client_OBJECTS) $(timeouts_async_tcp_client_LDADD) $(LIBS)
+timeouts/blocking_tcp_client.$(OBJEXT): timeouts/$(am__dirstamp) \
+ timeouts/$(DEPDIR)/$(am__dirstamp)
+
+timeouts/blocking_tcp_client$(EXEEXT): $(timeouts_blocking_tcp_client_OBJECTS) $(timeouts_blocking_tcp_client_DEPENDENCIES) $(EXTRA_timeouts_blocking_tcp_client_DEPENDENCIES) timeouts/$(am__dirstamp)
+ @rm -f timeouts/blocking_tcp_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timeouts_blocking_tcp_client_OBJECTS) $(timeouts_blocking_tcp_client_LDADD) $(LIBS)
+timeouts/blocking_token_tcp_client.$(OBJEXT): \
+ timeouts/$(am__dirstamp) timeouts/$(DEPDIR)/$(am__dirstamp)
+
+timeouts/blocking_token_tcp_client$(EXEEXT): $(timeouts_blocking_token_tcp_client_OBJECTS) $(timeouts_blocking_token_tcp_client_DEPENDENCIES) $(EXTRA_timeouts_blocking_token_tcp_client_DEPENDENCIES) timeouts/$(am__dirstamp)
+ @rm -f timeouts/blocking_token_tcp_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timeouts_blocking_token_tcp_client_OBJECTS) $(timeouts_blocking_token_tcp_client_LDADD) $(LIBS)
+timeouts/blocking_udp_client.$(OBJEXT): timeouts/$(am__dirstamp) \
+ timeouts/$(DEPDIR)/$(am__dirstamp)
+
+timeouts/blocking_udp_client$(EXEEXT): $(timeouts_blocking_udp_client_OBJECTS) $(timeouts_blocking_udp_client_DEPENDENCIES) $(EXTRA_timeouts_blocking_udp_client_DEPENDENCIES) timeouts/$(am__dirstamp)
+ @rm -f timeouts/blocking_udp_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timeouts_blocking_udp_client_OBJECTS) $(timeouts_blocking_udp_client_LDADD) $(LIBS)
+timeouts/server.$(OBJEXT): timeouts/$(am__dirstamp) \
+ timeouts/$(DEPDIR)/$(am__dirstamp)
+
+timeouts/server$(EXEEXT): $(timeouts_server_OBJECTS) $(timeouts_server_DEPENDENCIES) $(EXTRA_timeouts_server_DEPENDENCIES) timeouts/$(am__dirstamp)
+ @rm -f timeouts/server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timeouts_server_OBJECTS) $(timeouts_server_LDADD) $(LIBS)
+timers/$(am__dirstamp):
+ @$(MKDIR_P) timers
+ @: > timers/$(am__dirstamp)
+timers/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) timers/$(DEPDIR)
+ @: > timers/$(DEPDIR)/$(am__dirstamp)
+timers/time_t_timer.$(OBJEXT): timers/$(am__dirstamp) \
+ timers/$(DEPDIR)/$(am__dirstamp)
+
+timers/time_t_timer$(EXEEXT): $(timers_time_t_timer_OBJECTS) $(timers_time_t_timer_DEPENDENCIES) $(EXTRA_timers_time_t_timer_DEPENDENCIES) timers/$(am__dirstamp)
+ @rm -f timers/time_t_timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(timers_time_t_timer_OBJECTS) $(timers_time_t_timer_LDADD) $(LIBS)
+tutorial/daytime1/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime1
+ @: > tutorial/daytime1/$(am__dirstamp)
+tutorial/daytime1/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime1/$(DEPDIR)
+ @: > tutorial/daytime1/$(DEPDIR)/$(am__dirstamp)
+tutorial/daytime1/client.$(OBJEXT): tutorial/daytime1/$(am__dirstamp) \
+ tutorial/daytime1/$(DEPDIR)/$(am__dirstamp)
+
+tutorial/daytime1/client$(EXEEXT): $(tutorial_daytime1_client_OBJECTS) $(tutorial_daytime1_client_DEPENDENCIES) $(EXTRA_tutorial_daytime1_client_DEPENDENCIES) tutorial/daytime1/$(am__dirstamp)
+ @rm -f tutorial/daytime1/client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime1_client_OBJECTS) $(tutorial_daytime1_client_LDADD) $(LIBS)
+tutorial/daytime2/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime2
+ @: > tutorial/daytime2/$(am__dirstamp)
+tutorial/daytime2/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime2/$(DEPDIR)
+ @: > tutorial/daytime2/$(DEPDIR)/$(am__dirstamp)
+tutorial/daytime2/server.$(OBJEXT): tutorial/daytime2/$(am__dirstamp) \
+ tutorial/daytime2/$(DEPDIR)/$(am__dirstamp)
+
+tutorial/daytime2/server$(EXEEXT): $(tutorial_daytime2_server_OBJECTS) $(tutorial_daytime2_server_DEPENDENCIES) $(EXTRA_tutorial_daytime2_server_DEPENDENCIES) tutorial/daytime2/$(am__dirstamp)
+ @rm -f tutorial/daytime2/server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime2_server_OBJECTS) $(tutorial_daytime2_server_LDADD) $(LIBS)
+tutorial/daytime3/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime3
+ @: > tutorial/daytime3/$(am__dirstamp)
+tutorial/daytime3/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime3/$(DEPDIR)
+ @: > tutorial/daytime3/$(DEPDIR)/$(am__dirstamp)
+tutorial/daytime3/server.$(OBJEXT): tutorial/daytime3/$(am__dirstamp) \
+ tutorial/daytime3/$(DEPDIR)/$(am__dirstamp)
+
+tutorial/daytime3/server$(EXEEXT): $(tutorial_daytime3_server_OBJECTS) $(tutorial_daytime3_server_DEPENDENCIES) $(EXTRA_tutorial_daytime3_server_DEPENDENCIES) tutorial/daytime3/$(am__dirstamp)
+ @rm -f tutorial/daytime3/server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime3_server_OBJECTS) $(tutorial_daytime3_server_LDADD) $(LIBS)
+tutorial/daytime4/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime4
+ @: > tutorial/daytime4/$(am__dirstamp)
+tutorial/daytime4/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime4/$(DEPDIR)
+ @: > tutorial/daytime4/$(DEPDIR)/$(am__dirstamp)
+tutorial/daytime4/client.$(OBJEXT): tutorial/daytime4/$(am__dirstamp) \
+ tutorial/daytime4/$(DEPDIR)/$(am__dirstamp)
+
+tutorial/daytime4/client$(EXEEXT): $(tutorial_daytime4_client_OBJECTS) $(tutorial_daytime4_client_DEPENDENCIES) $(EXTRA_tutorial_daytime4_client_DEPENDENCIES) tutorial/daytime4/$(am__dirstamp)
+ @rm -f tutorial/daytime4/client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime4_client_OBJECTS) $(tutorial_daytime4_client_LDADD) $(LIBS)
+tutorial/daytime5/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime5
+ @: > tutorial/daytime5/$(am__dirstamp)
+tutorial/daytime5/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime5/$(DEPDIR)
+ @: > tutorial/daytime5/$(DEPDIR)/$(am__dirstamp)
+tutorial/daytime5/server.$(OBJEXT): tutorial/daytime5/$(am__dirstamp) \
+ tutorial/daytime5/$(DEPDIR)/$(am__dirstamp)
+
+tutorial/daytime5/server$(EXEEXT): $(tutorial_daytime5_server_OBJECTS) $(tutorial_daytime5_server_DEPENDENCIES) $(EXTRA_tutorial_daytime5_server_DEPENDENCIES) tutorial/daytime5/$(am__dirstamp)
+ @rm -f tutorial/daytime5/server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime5_server_OBJECTS) $(tutorial_daytime5_server_LDADD) $(LIBS)
+tutorial/daytime6/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime6
+ @: > tutorial/daytime6/$(am__dirstamp)
+tutorial/daytime6/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime6/$(DEPDIR)
+ @: > tutorial/daytime6/$(DEPDIR)/$(am__dirstamp)
+tutorial/daytime6/server.$(OBJEXT): tutorial/daytime6/$(am__dirstamp) \
+ tutorial/daytime6/$(DEPDIR)/$(am__dirstamp)
+
+tutorial/daytime6/server$(EXEEXT): $(tutorial_daytime6_server_OBJECTS) $(tutorial_daytime6_server_DEPENDENCIES) $(EXTRA_tutorial_daytime6_server_DEPENDENCIES) tutorial/daytime6/$(am__dirstamp)
+ @rm -f tutorial/daytime6/server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime6_server_OBJECTS) $(tutorial_daytime6_server_LDADD) $(LIBS)
+tutorial/daytime7/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime7
+ @: > tutorial/daytime7/$(am__dirstamp)
+tutorial/daytime7/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/daytime7/$(DEPDIR)
+ @: > tutorial/daytime7/$(DEPDIR)/$(am__dirstamp)
+tutorial/daytime7/server.$(OBJEXT): tutorial/daytime7/$(am__dirstamp) \
+ tutorial/daytime7/$(DEPDIR)/$(am__dirstamp)
+
+tutorial/daytime7/server$(EXEEXT): $(tutorial_daytime7_server_OBJECTS) $(tutorial_daytime7_server_DEPENDENCIES) $(EXTRA_tutorial_daytime7_server_DEPENDENCIES) tutorial/daytime7/$(am__dirstamp)
+ @rm -f tutorial/daytime7/server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tutorial_daytime7_server_OBJECTS) $(tutorial_daytime7_server_LDADD) $(LIBS)
+tutorial/timer1/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/timer1
+ @: > tutorial/timer1/$(am__dirstamp)
+tutorial/timer1/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/timer1/$(DEPDIR)
+ @: > tutorial/timer1/$(DEPDIR)/$(am__dirstamp)
+tutorial/timer1/timer.$(OBJEXT): tutorial/timer1/$(am__dirstamp) \
+ tutorial/timer1/$(DEPDIR)/$(am__dirstamp)
+
+tutorial/timer1/timer$(EXEEXT): $(tutorial_timer1_timer_OBJECTS) $(tutorial_timer1_timer_DEPENDENCIES) $(EXTRA_tutorial_timer1_timer_DEPENDENCIES) tutorial/timer1/$(am__dirstamp)
+ @rm -f tutorial/timer1/timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tutorial_timer1_timer_OBJECTS) $(tutorial_timer1_timer_LDADD) $(LIBS)
+tutorial/timer2/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/timer2
+ @: > tutorial/timer2/$(am__dirstamp)
+tutorial/timer2/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/timer2/$(DEPDIR)
+ @: > tutorial/timer2/$(DEPDIR)/$(am__dirstamp)
+tutorial/timer2/timer.$(OBJEXT): tutorial/timer2/$(am__dirstamp) \
+ tutorial/timer2/$(DEPDIR)/$(am__dirstamp)
+
+tutorial/timer2/timer$(EXEEXT): $(tutorial_timer2_timer_OBJECTS) $(tutorial_timer2_timer_DEPENDENCIES) $(EXTRA_tutorial_timer2_timer_DEPENDENCIES) tutorial/timer2/$(am__dirstamp)
+ @rm -f tutorial/timer2/timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tutorial_timer2_timer_OBJECTS) $(tutorial_timer2_timer_LDADD) $(LIBS)
+tutorial/timer3/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/timer3
+ @: > tutorial/timer3/$(am__dirstamp)
+tutorial/timer3/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/timer3/$(DEPDIR)
+ @: > tutorial/timer3/$(DEPDIR)/$(am__dirstamp)
+tutorial/timer3/timer.$(OBJEXT): tutorial/timer3/$(am__dirstamp) \
+ tutorial/timer3/$(DEPDIR)/$(am__dirstamp)
+
+tutorial/timer3/timer$(EXEEXT): $(tutorial_timer3_timer_OBJECTS) $(tutorial_timer3_timer_DEPENDENCIES) $(EXTRA_tutorial_timer3_timer_DEPENDENCIES) tutorial/timer3/$(am__dirstamp)
+ @rm -f tutorial/timer3/timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tutorial_timer3_timer_OBJECTS) $(tutorial_timer3_timer_LDADD) $(LIBS)
+tutorial/timer4/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/timer4
+ @: > tutorial/timer4/$(am__dirstamp)
+tutorial/timer4/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/timer4/$(DEPDIR)
+ @: > tutorial/timer4/$(DEPDIR)/$(am__dirstamp)
+tutorial/timer4/timer.$(OBJEXT): tutorial/timer4/$(am__dirstamp) \
+ tutorial/timer4/$(DEPDIR)/$(am__dirstamp)
+
+tutorial/timer4/timer$(EXEEXT): $(tutorial_timer4_timer_OBJECTS) $(tutorial_timer4_timer_DEPENDENCIES) $(EXTRA_tutorial_timer4_timer_DEPENDENCIES) tutorial/timer4/$(am__dirstamp)
+ @rm -f tutorial/timer4/timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tutorial_timer4_timer_OBJECTS) $(tutorial_timer4_timer_LDADD) $(LIBS)
+tutorial/timer5/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/timer5
+ @: > tutorial/timer5/$(am__dirstamp)
+tutorial/timer5/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) tutorial/timer5/$(DEPDIR)
+ @: > tutorial/timer5/$(DEPDIR)/$(am__dirstamp)
+tutorial/timer5/timer.$(OBJEXT): tutorial/timer5/$(am__dirstamp) \
+ tutorial/timer5/$(DEPDIR)/$(am__dirstamp)
+
+tutorial/timer5/timer$(EXEEXT): $(tutorial_timer5_timer_OBJECTS) $(tutorial_timer5_timer_DEPENDENCIES) $(EXTRA_tutorial_timer5_timer_DEPENDENCIES) tutorial/timer5/$(am__dirstamp)
+ @rm -f tutorial/timer5/timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(tutorial_timer5_timer_OBJECTS) $(tutorial_timer5_timer_LDADD) $(LIBS)
+type_erasure/$(am__dirstamp):
+ @$(MKDIR_P) type_erasure
+ @: > type_erasure/$(am__dirstamp)
+type_erasure/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) type_erasure/$(DEPDIR)
+ @: > type_erasure/$(DEPDIR)/$(am__dirstamp)
+type_erasure/main.$(OBJEXT): type_erasure/$(am__dirstamp) \
+ type_erasure/$(DEPDIR)/$(am__dirstamp)
+type_erasure/stdin_line_reader.$(OBJEXT): \
+ type_erasure/$(am__dirstamp) \
+ type_erasure/$(DEPDIR)/$(am__dirstamp)
+type_erasure/sleep.$(OBJEXT): type_erasure/$(am__dirstamp) \
+ type_erasure/$(DEPDIR)/$(am__dirstamp)
+
+type_erasure/type_erasure$(EXEEXT): $(type_erasure_type_erasure_OBJECTS) $(type_erasure_type_erasure_DEPENDENCIES) $(EXTRA_type_erasure_type_erasure_DEPENDENCIES) type_erasure/$(am__dirstamp)
+ @rm -f type_erasure/type_erasure$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(type_erasure_type_erasure_OBJECTS) $(type_erasure_type_erasure_LDADD) $(LIBS)
+windows/$(am__dirstamp):
+ @$(MKDIR_P) windows
+ @: > windows/$(am__dirstamp)
+windows/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) windows/$(DEPDIR)
+ @: > windows/$(DEPDIR)/$(am__dirstamp)
+windows/transmit_file.$(OBJEXT): windows/$(am__dirstamp) \
+ windows/$(DEPDIR)/$(am__dirstamp)
+
+windows/transmit_file$(EXEEXT): $(windows_transmit_file_OBJECTS) $(windows_transmit_file_DEPENDENCIES) $(EXTRA_windows_transmit_file_DEPENDENCIES) windows/$(am__dirstamp)
+ @rm -f windows/transmit_file$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(windows_transmit_file_OBJECTS) $(windows_transmit_file_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+ -rm -f ../../*.$(OBJEXT)
+ -rm -f allocation/*.$(OBJEXT)
+ -rm -f buffers/*.$(OBJEXT)
+ -rm -f chat/*.$(OBJEXT)
+ -rm -f deferred/*.$(OBJEXT)
+ -rm -f echo/*.$(OBJEXT)
+ -rm -f executors/*.$(OBJEXT)
+ -rm -f files/*.$(OBJEXT)
+ -rm -f fork/*.$(OBJEXT)
+ -rm -f futures/*.$(OBJEXT)
+ -rm -f handler_tracking/*.$(OBJEXT)
+ -rm -f http/client/*.$(OBJEXT)
+ -rm -f http/server/*.$(OBJEXT)
+ -rm -f http/server2/*.$(OBJEXT)
+ -rm -f http/server3/*.$(OBJEXT)
+ -rm -f http/server4/*.$(OBJEXT)
+ -rm -f icmp/*.$(OBJEXT)
+ -rm -f invocation/*.$(OBJEXT)
+ -rm -f iostreams/*.$(OBJEXT)
+ -rm -f local/*.$(OBJEXT)
+ -rm -f multicast/*.$(OBJEXT)
+ -rm -f nonblocking/*.$(OBJEXT)
+ -rm -f operations/*.$(OBJEXT)
+ -rm -f parallel_group/*.$(OBJEXT)
+ -rm -f porthopper/*.$(OBJEXT)
+ -rm -f services/*.$(OBJEXT)
+ -rm -f socks4/*.$(OBJEXT)
+ -rm -f spawn/*.$(OBJEXT)
+ -rm -f ssl/*.$(OBJEXT)
+ -rm -f timeouts/*.$(OBJEXT)
+ -rm -f timers/*.$(OBJEXT)
+ -rm -f tutorial/daytime1/*.$(OBJEXT)
+ -rm -f tutorial/daytime2/*.$(OBJEXT)
+ -rm -f tutorial/daytime3/*.$(OBJEXT)
+ -rm -f tutorial/daytime4/*.$(OBJEXT)
+ -rm -f tutorial/daytime5/*.$(OBJEXT)
+ -rm -f tutorial/daytime6/*.$(OBJEXT)
+ -rm -f tutorial/daytime7/*.$(OBJEXT)
+ -rm -f tutorial/timer1/*.$(OBJEXT)
+ -rm -f tutorial/timer2/*.$(OBJEXT)
+ -rm -f tutorial/timer3/*.$(OBJEXT)
+ -rm -f tutorial/timer4/*.$(OBJEXT)
+ -rm -f tutorial/timer5/*.$(OBJEXT)
+ -rm -f type_erasure/*.$(OBJEXT)
+ -rm -f windows/*.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio_ssl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@allocation/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@buffers/$(DEPDIR)/reference_counted.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@chat/$(DEPDIR)/chat_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@chat/$(DEPDIR)/chat_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@chat/$(DEPDIR)/posix_chat_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@deferred/$(DEPDIR)/deferred_1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@deferred/$(DEPDIR)/deferred_2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/async_tcp_echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/async_udp_echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_tcp_echo_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_tcp_echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_udp_echo_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_udp_echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/actor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/bank_account_1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/bank_account_2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/fork_join.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/pipeline.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/priority_scheduler.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@files/$(DEPDIR)/async_file_copy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@files/$(DEPDIR)/blocking_file_copy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@fork/$(DEPDIR)/daemon.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@fork/$(DEPDIR)/process_per_connection.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@futures/$(DEPDIR)/daytime_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@handler_tracking/$(DEPDIR)/async_tcp_echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/client/$(DEPDIR)/async_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/client/$(DEPDIR)/sync_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/connection.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/connection_manager.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/mime_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/reply.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/request_handler.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/request_parser.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/connection.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/io_context_pool.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/mime_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/reply.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/request_handler.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/request_parser.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server2/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/connection.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/mime_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/reply.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/request_handler.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/request_parser.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server3/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server4/$(DEPDIR)/file_handler.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server4/$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server4/$(DEPDIR)/mime_types.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server4/$(DEPDIR)/reply.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server4/$(DEPDIR)/request_parser.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@http/server4/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@icmp/$(DEPDIR)/ping.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@invocation/$(DEPDIR)/prioritised_handlers.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@iostreams/$(DEPDIR)/daytime_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@iostreams/$(DEPDIR)/daytime_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@iostreams/$(DEPDIR)/http_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/connect_pair.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/fd_passing_stream_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/fd_passing_stream_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/iostream_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/stream_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@local/$(DEPDIR)/stream_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@multicast/$(DEPDIR)/receiver.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@multicast/$(DEPDIR)/sender.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@nonblocking/$(DEPDIR)/third_party_lib.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_3.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_4.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_5.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_6.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_7.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_8.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@parallel_group/$(DEPDIR)/ranged_wait_for_all.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@parallel_group/$(DEPDIR)/wait_for_all.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@parallel_group/$(DEPDIR)/wait_for_one.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@parallel_group/$(DEPDIR)/wait_for_one_error.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@parallel_group/$(DEPDIR)/wait_for_one_success.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@porthopper/$(DEPDIR)/client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@porthopper/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@services/$(DEPDIR)/daytime_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@services/$(DEPDIR)/logger_service.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@socks4/$(DEPDIR)/sync_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@spawn/$(DEPDIR)/echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@spawn/$(DEPDIR)/parallel_grep.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@ssl/$(DEPDIR)/client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@ssl/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/async_tcp_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/blocking_tcp_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/blocking_token_tcp_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/blocking_udp_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@timeouts/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@timers/$(DEPDIR)/time_t_timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime1/$(DEPDIR)/client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime2/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime3/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime4/$(DEPDIR)/client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime5/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime6/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tutorial/daytime7/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tutorial/timer1/$(DEPDIR)/timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tutorial/timer2/$(DEPDIR)/timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tutorial/timer3/$(DEPDIR)/timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tutorial/timer4/$(DEPDIR)/timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@tutorial/timer5/$(DEPDIR)/timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@type_erasure/$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@type_erasure/$(DEPDIR)/sleep.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@type_erasure/$(DEPDIR)/stdin_line_reader.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@windows/$(DEPDIR)/transmit_file.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(LIBRARIES) $(HEADERS)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -rm -f ../../$(DEPDIR)/$(am__dirstamp)
+ -rm -f ../../$(am__dirstamp)
+ -rm -f allocation/$(DEPDIR)/$(am__dirstamp)
+ -rm -f allocation/$(am__dirstamp)
+ -rm -f buffers/$(DEPDIR)/$(am__dirstamp)
+ -rm -f buffers/$(am__dirstamp)
+ -rm -f chat/$(DEPDIR)/$(am__dirstamp)
+ -rm -f chat/$(am__dirstamp)
+ -rm -f deferred/$(DEPDIR)/$(am__dirstamp)
+ -rm -f deferred/$(am__dirstamp)
+ -rm -f echo/$(DEPDIR)/$(am__dirstamp)
+ -rm -f echo/$(am__dirstamp)
+ -rm -f executors/$(DEPDIR)/$(am__dirstamp)
+ -rm -f executors/$(am__dirstamp)
+ -rm -f files/$(DEPDIR)/$(am__dirstamp)
+ -rm -f files/$(am__dirstamp)
+ -rm -f fork/$(DEPDIR)/$(am__dirstamp)
+ -rm -f fork/$(am__dirstamp)
+ -rm -f futures/$(DEPDIR)/$(am__dirstamp)
+ -rm -f futures/$(am__dirstamp)
+ -rm -f handler_tracking/$(DEPDIR)/$(am__dirstamp)
+ -rm -f handler_tracking/$(am__dirstamp)
+ -rm -f http/client/$(DEPDIR)/$(am__dirstamp)
+ -rm -f http/client/$(am__dirstamp)
+ -rm -f http/server/$(DEPDIR)/$(am__dirstamp)
+ -rm -f http/server/$(am__dirstamp)
+ -rm -f http/server2/$(DEPDIR)/$(am__dirstamp)
+ -rm -f http/server2/$(am__dirstamp)
+ -rm -f http/server3/$(DEPDIR)/$(am__dirstamp)
+ -rm -f http/server3/$(am__dirstamp)
+ -rm -f http/server4/$(DEPDIR)/$(am__dirstamp)
+ -rm -f http/server4/$(am__dirstamp)
+ -rm -f icmp/$(DEPDIR)/$(am__dirstamp)
+ -rm -f icmp/$(am__dirstamp)
+ -rm -f invocation/$(DEPDIR)/$(am__dirstamp)
+ -rm -f invocation/$(am__dirstamp)
+ -rm -f iostreams/$(DEPDIR)/$(am__dirstamp)
+ -rm -f iostreams/$(am__dirstamp)
+ -rm -f local/$(DEPDIR)/$(am__dirstamp)
+ -rm -f local/$(am__dirstamp)
+ -rm -f multicast/$(DEPDIR)/$(am__dirstamp)
+ -rm -f multicast/$(am__dirstamp)
+ -rm -f nonblocking/$(DEPDIR)/$(am__dirstamp)
+ -rm -f nonblocking/$(am__dirstamp)
+ -rm -f operations/$(DEPDIR)/$(am__dirstamp)
+ -rm -f operations/$(am__dirstamp)
+ -rm -f parallel_group/$(DEPDIR)/$(am__dirstamp)
+ -rm -f parallel_group/$(am__dirstamp)
+ -rm -f porthopper/$(DEPDIR)/$(am__dirstamp)
+ -rm -f porthopper/$(am__dirstamp)
+ -rm -f services/$(DEPDIR)/$(am__dirstamp)
+ -rm -f services/$(am__dirstamp)
+ -rm -f socks4/$(DEPDIR)/$(am__dirstamp)
+ -rm -f socks4/$(am__dirstamp)
+ -rm -f spawn/$(DEPDIR)/$(am__dirstamp)
+ -rm -f spawn/$(am__dirstamp)
+ -rm -f ssl/$(DEPDIR)/$(am__dirstamp)
+ -rm -f ssl/$(am__dirstamp)
+ -rm -f timeouts/$(DEPDIR)/$(am__dirstamp)
+ -rm -f timeouts/$(am__dirstamp)
+ -rm -f timers/$(DEPDIR)/$(am__dirstamp)
+ -rm -f timers/$(am__dirstamp)
+ -rm -f tutorial/daytime1/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tutorial/daytime1/$(am__dirstamp)
+ -rm -f tutorial/daytime2/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tutorial/daytime2/$(am__dirstamp)
+ -rm -f tutorial/daytime3/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tutorial/daytime3/$(am__dirstamp)
+ -rm -f tutorial/daytime4/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tutorial/daytime4/$(am__dirstamp)
+ -rm -f tutorial/daytime5/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tutorial/daytime5/$(am__dirstamp)
+ -rm -f tutorial/daytime6/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tutorial/daytime6/$(am__dirstamp)
+ -rm -f tutorial/daytime7/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tutorial/daytime7/$(am__dirstamp)
+ -rm -f tutorial/timer1/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tutorial/timer1/$(am__dirstamp)
+ -rm -f tutorial/timer2/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tutorial/timer2/$(am__dirstamp)
+ -rm -f tutorial/timer3/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tutorial/timer3/$(am__dirstamp)
+ -rm -f tutorial/timer4/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tutorial/timer4/$(am__dirstamp)
+ -rm -f tutorial/timer5/$(DEPDIR)/$(am__dirstamp)
+ -rm -f tutorial/timer5/$(am__dirstamp)
+ -rm -f type_erasure/$(DEPDIR)/$(am__dirstamp)
+ -rm -f type_erasure/$(am__dirstamp)
+ -rm -f windows/$(DEPDIR)/$(am__dirstamp)
+ -rm -f windows/$(am__dirstamp)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ../../$(DEPDIR)/asio.Po
+ -rm -f ../../$(DEPDIR)/asio_ssl.Po
+ -rm -f allocation/$(DEPDIR)/server.Po
+ -rm -f buffers/$(DEPDIR)/reference_counted.Po
+ -rm -f chat/$(DEPDIR)/chat_client.Po
+ -rm -f chat/$(DEPDIR)/chat_server.Po
+ -rm -f chat/$(DEPDIR)/posix_chat_client.Po
+ -rm -f deferred/$(DEPDIR)/deferred_1.Po
+ -rm -f deferred/$(DEPDIR)/deferred_2.Po
+ -rm -f echo/$(DEPDIR)/async_tcp_echo_server.Po
+ -rm -f echo/$(DEPDIR)/async_udp_echo_server.Po
+ -rm -f echo/$(DEPDIR)/blocking_tcp_echo_client.Po
+ -rm -f echo/$(DEPDIR)/blocking_tcp_echo_server.Po
+ -rm -f echo/$(DEPDIR)/blocking_udp_echo_client.Po
+ -rm -f echo/$(DEPDIR)/blocking_udp_echo_server.Po
+ -rm -f executors/$(DEPDIR)/actor.Po
+ -rm -f executors/$(DEPDIR)/bank_account_1.Po
+ -rm -f executors/$(DEPDIR)/bank_account_2.Po
+ -rm -f executors/$(DEPDIR)/fork_join.Po
+ -rm -f executors/$(DEPDIR)/pipeline.Po
+ -rm -f executors/$(DEPDIR)/priority_scheduler.Po
+ -rm -f files/$(DEPDIR)/async_file_copy.Po
+ -rm -f files/$(DEPDIR)/blocking_file_copy.Po
+ -rm -f fork/$(DEPDIR)/daemon.Po
+ -rm -f fork/$(DEPDIR)/process_per_connection.Po
+ -rm -f futures/$(DEPDIR)/daytime_client.Po
+ -rm -f handler_tracking/$(DEPDIR)/async_tcp_echo_server.Po
+ -rm -f http/client/$(DEPDIR)/async_client.Po
+ -rm -f http/client/$(DEPDIR)/sync_client.Po
+ -rm -f http/server/$(DEPDIR)/connection.Po
+ -rm -f http/server/$(DEPDIR)/connection_manager.Po
+ -rm -f http/server/$(DEPDIR)/main.Po
+ -rm -f http/server/$(DEPDIR)/mime_types.Po
+ -rm -f http/server/$(DEPDIR)/reply.Po
+ -rm -f http/server/$(DEPDIR)/request_handler.Po
+ -rm -f http/server/$(DEPDIR)/request_parser.Po
+ -rm -f http/server/$(DEPDIR)/server.Po
+ -rm -f http/server2/$(DEPDIR)/connection.Po
+ -rm -f http/server2/$(DEPDIR)/io_context_pool.Po
+ -rm -f http/server2/$(DEPDIR)/main.Po
+ -rm -f http/server2/$(DEPDIR)/mime_types.Po
+ -rm -f http/server2/$(DEPDIR)/reply.Po
+ -rm -f http/server2/$(DEPDIR)/request_handler.Po
+ -rm -f http/server2/$(DEPDIR)/request_parser.Po
+ -rm -f http/server2/$(DEPDIR)/server.Po
+ -rm -f http/server3/$(DEPDIR)/connection.Po
+ -rm -f http/server3/$(DEPDIR)/main.Po
+ -rm -f http/server3/$(DEPDIR)/mime_types.Po
+ -rm -f http/server3/$(DEPDIR)/reply.Po
+ -rm -f http/server3/$(DEPDIR)/request_handler.Po
+ -rm -f http/server3/$(DEPDIR)/request_parser.Po
+ -rm -f http/server3/$(DEPDIR)/server.Po
+ -rm -f http/server4/$(DEPDIR)/file_handler.Po
+ -rm -f http/server4/$(DEPDIR)/main.Po
+ -rm -f http/server4/$(DEPDIR)/mime_types.Po
+ -rm -f http/server4/$(DEPDIR)/reply.Po
+ -rm -f http/server4/$(DEPDIR)/request_parser.Po
+ -rm -f http/server4/$(DEPDIR)/server.Po
+ -rm -f icmp/$(DEPDIR)/ping.Po
+ -rm -f invocation/$(DEPDIR)/prioritised_handlers.Po
+ -rm -f iostreams/$(DEPDIR)/daytime_client.Po
+ -rm -f iostreams/$(DEPDIR)/daytime_server.Po
+ -rm -f iostreams/$(DEPDIR)/http_client.Po
+ -rm -f local/$(DEPDIR)/connect_pair.Po
+ -rm -f local/$(DEPDIR)/fd_passing_stream_client.Po
+ -rm -f local/$(DEPDIR)/fd_passing_stream_server.Po
+ -rm -f local/$(DEPDIR)/iostream_client.Po
+ -rm -f local/$(DEPDIR)/stream_client.Po
+ -rm -f local/$(DEPDIR)/stream_server.Po
+ -rm -f multicast/$(DEPDIR)/receiver.Po
+ -rm -f multicast/$(DEPDIR)/sender.Po
+ -rm -f nonblocking/$(DEPDIR)/third_party_lib.Po
+ -rm -f operations/$(DEPDIR)/composed_1.Po
+ -rm -f operations/$(DEPDIR)/composed_2.Po
+ -rm -f operations/$(DEPDIR)/composed_3.Po
+ -rm -f operations/$(DEPDIR)/composed_4.Po
+ -rm -f operations/$(DEPDIR)/composed_5.Po
+ -rm -f operations/$(DEPDIR)/composed_6.Po
+ -rm -f operations/$(DEPDIR)/composed_7.Po
+ -rm -f operations/$(DEPDIR)/composed_8.Po
+ -rm -f parallel_group/$(DEPDIR)/ranged_wait_for_all.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_all.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_one.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_one_error.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_one_success.Po
+ -rm -f porthopper/$(DEPDIR)/client.Po
+ -rm -f porthopper/$(DEPDIR)/server.Po
+ -rm -f services/$(DEPDIR)/daytime_client.Po
+ -rm -f services/$(DEPDIR)/logger_service.Po
+ -rm -f socks4/$(DEPDIR)/sync_client.Po
+ -rm -f spawn/$(DEPDIR)/echo_server.Po
+ -rm -f spawn/$(DEPDIR)/parallel_grep.Po
+ -rm -f ssl/$(DEPDIR)/client.Po
+ -rm -f ssl/$(DEPDIR)/server.Po
+ -rm -f timeouts/$(DEPDIR)/async_tcp_client.Po
+ -rm -f timeouts/$(DEPDIR)/blocking_tcp_client.Po
+ -rm -f timeouts/$(DEPDIR)/blocking_token_tcp_client.Po
+ -rm -f timeouts/$(DEPDIR)/blocking_udp_client.Po
+ -rm -f timeouts/$(DEPDIR)/server.Po
+ -rm -f timers/$(DEPDIR)/time_t_timer.Po
+ -rm -f tutorial/daytime1/$(DEPDIR)/client.Po
+ -rm -f tutorial/daytime2/$(DEPDIR)/server.Po
+ -rm -f tutorial/daytime3/$(DEPDIR)/server.Po
+ -rm -f tutorial/daytime4/$(DEPDIR)/client.Po
+ -rm -f tutorial/daytime5/$(DEPDIR)/server.Po
+ -rm -f tutorial/daytime6/$(DEPDIR)/server.Po
+ -rm -f tutorial/daytime7/$(DEPDIR)/server.Po
+ -rm -f tutorial/timer1/$(DEPDIR)/timer.Po
+ -rm -f tutorial/timer2/$(DEPDIR)/timer.Po
+ -rm -f tutorial/timer3/$(DEPDIR)/timer.Po
+ -rm -f tutorial/timer4/$(DEPDIR)/timer.Po
+ -rm -f tutorial/timer5/$(DEPDIR)/timer.Po
+ -rm -f type_erasure/$(DEPDIR)/main.Po
+ -rm -f type_erasure/$(DEPDIR)/sleep.Po
+ -rm -f type_erasure/$(DEPDIR)/stdin_line_reader.Po
+ -rm -f windows/$(DEPDIR)/transmit_file.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ../../$(DEPDIR)/asio.Po
+ -rm -f ../../$(DEPDIR)/asio_ssl.Po
+ -rm -f allocation/$(DEPDIR)/server.Po
+ -rm -f buffers/$(DEPDIR)/reference_counted.Po
+ -rm -f chat/$(DEPDIR)/chat_client.Po
+ -rm -f chat/$(DEPDIR)/chat_server.Po
+ -rm -f chat/$(DEPDIR)/posix_chat_client.Po
+ -rm -f deferred/$(DEPDIR)/deferred_1.Po
+ -rm -f deferred/$(DEPDIR)/deferred_2.Po
+ -rm -f echo/$(DEPDIR)/async_tcp_echo_server.Po
+ -rm -f echo/$(DEPDIR)/async_udp_echo_server.Po
+ -rm -f echo/$(DEPDIR)/blocking_tcp_echo_client.Po
+ -rm -f echo/$(DEPDIR)/blocking_tcp_echo_server.Po
+ -rm -f echo/$(DEPDIR)/blocking_udp_echo_client.Po
+ -rm -f echo/$(DEPDIR)/blocking_udp_echo_server.Po
+ -rm -f executors/$(DEPDIR)/actor.Po
+ -rm -f executors/$(DEPDIR)/bank_account_1.Po
+ -rm -f executors/$(DEPDIR)/bank_account_2.Po
+ -rm -f executors/$(DEPDIR)/fork_join.Po
+ -rm -f executors/$(DEPDIR)/pipeline.Po
+ -rm -f executors/$(DEPDIR)/priority_scheduler.Po
+ -rm -f files/$(DEPDIR)/async_file_copy.Po
+ -rm -f files/$(DEPDIR)/blocking_file_copy.Po
+ -rm -f fork/$(DEPDIR)/daemon.Po
+ -rm -f fork/$(DEPDIR)/process_per_connection.Po
+ -rm -f futures/$(DEPDIR)/daytime_client.Po
+ -rm -f handler_tracking/$(DEPDIR)/async_tcp_echo_server.Po
+ -rm -f http/client/$(DEPDIR)/async_client.Po
+ -rm -f http/client/$(DEPDIR)/sync_client.Po
+ -rm -f http/server/$(DEPDIR)/connection.Po
+ -rm -f http/server/$(DEPDIR)/connection_manager.Po
+ -rm -f http/server/$(DEPDIR)/main.Po
+ -rm -f http/server/$(DEPDIR)/mime_types.Po
+ -rm -f http/server/$(DEPDIR)/reply.Po
+ -rm -f http/server/$(DEPDIR)/request_handler.Po
+ -rm -f http/server/$(DEPDIR)/request_parser.Po
+ -rm -f http/server/$(DEPDIR)/server.Po
+ -rm -f http/server2/$(DEPDIR)/connection.Po
+ -rm -f http/server2/$(DEPDIR)/io_context_pool.Po
+ -rm -f http/server2/$(DEPDIR)/main.Po
+ -rm -f http/server2/$(DEPDIR)/mime_types.Po
+ -rm -f http/server2/$(DEPDIR)/reply.Po
+ -rm -f http/server2/$(DEPDIR)/request_handler.Po
+ -rm -f http/server2/$(DEPDIR)/request_parser.Po
+ -rm -f http/server2/$(DEPDIR)/server.Po
+ -rm -f http/server3/$(DEPDIR)/connection.Po
+ -rm -f http/server3/$(DEPDIR)/main.Po
+ -rm -f http/server3/$(DEPDIR)/mime_types.Po
+ -rm -f http/server3/$(DEPDIR)/reply.Po
+ -rm -f http/server3/$(DEPDIR)/request_handler.Po
+ -rm -f http/server3/$(DEPDIR)/request_parser.Po
+ -rm -f http/server3/$(DEPDIR)/server.Po
+ -rm -f http/server4/$(DEPDIR)/file_handler.Po
+ -rm -f http/server4/$(DEPDIR)/main.Po
+ -rm -f http/server4/$(DEPDIR)/mime_types.Po
+ -rm -f http/server4/$(DEPDIR)/reply.Po
+ -rm -f http/server4/$(DEPDIR)/request_parser.Po
+ -rm -f http/server4/$(DEPDIR)/server.Po
+ -rm -f icmp/$(DEPDIR)/ping.Po
+ -rm -f invocation/$(DEPDIR)/prioritised_handlers.Po
+ -rm -f iostreams/$(DEPDIR)/daytime_client.Po
+ -rm -f iostreams/$(DEPDIR)/daytime_server.Po
+ -rm -f iostreams/$(DEPDIR)/http_client.Po
+ -rm -f local/$(DEPDIR)/connect_pair.Po
+ -rm -f local/$(DEPDIR)/fd_passing_stream_client.Po
+ -rm -f local/$(DEPDIR)/fd_passing_stream_server.Po
+ -rm -f local/$(DEPDIR)/iostream_client.Po
+ -rm -f local/$(DEPDIR)/stream_client.Po
+ -rm -f local/$(DEPDIR)/stream_server.Po
+ -rm -f multicast/$(DEPDIR)/receiver.Po
+ -rm -f multicast/$(DEPDIR)/sender.Po
+ -rm -f nonblocking/$(DEPDIR)/third_party_lib.Po
+ -rm -f operations/$(DEPDIR)/composed_1.Po
+ -rm -f operations/$(DEPDIR)/composed_2.Po
+ -rm -f operations/$(DEPDIR)/composed_3.Po
+ -rm -f operations/$(DEPDIR)/composed_4.Po
+ -rm -f operations/$(DEPDIR)/composed_5.Po
+ -rm -f operations/$(DEPDIR)/composed_6.Po
+ -rm -f operations/$(DEPDIR)/composed_7.Po
+ -rm -f operations/$(DEPDIR)/composed_8.Po
+ -rm -f parallel_group/$(DEPDIR)/ranged_wait_for_all.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_all.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_one.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_one_error.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_one_success.Po
+ -rm -f porthopper/$(DEPDIR)/client.Po
+ -rm -f porthopper/$(DEPDIR)/server.Po
+ -rm -f services/$(DEPDIR)/daytime_client.Po
+ -rm -f services/$(DEPDIR)/logger_service.Po
+ -rm -f socks4/$(DEPDIR)/sync_client.Po
+ -rm -f spawn/$(DEPDIR)/echo_server.Po
+ -rm -f spawn/$(DEPDIR)/parallel_grep.Po
+ -rm -f ssl/$(DEPDIR)/client.Po
+ -rm -f ssl/$(DEPDIR)/server.Po
+ -rm -f timeouts/$(DEPDIR)/async_tcp_client.Po
+ -rm -f timeouts/$(DEPDIR)/blocking_tcp_client.Po
+ -rm -f timeouts/$(DEPDIR)/blocking_token_tcp_client.Po
+ -rm -f timeouts/$(DEPDIR)/blocking_udp_client.Po
+ -rm -f timeouts/$(DEPDIR)/server.Po
+ -rm -f timers/$(DEPDIR)/time_t_timer.Po
+ -rm -f tutorial/daytime1/$(DEPDIR)/client.Po
+ -rm -f tutorial/daytime2/$(DEPDIR)/server.Po
+ -rm -f tutorial/daytime3/$(DEPDIR)/server.Po
+ -rm -f tutorial/daytime4/$(DEPDIR)/client.Po
+ -rm -f tutorial/daytime5/$(DEPDIR)/server.Po
+ -rm -f tutorial/daytime6/$(DEPDIR)/server.Po
+ -rm -f tutorial/daytime7/$(DEPDIR)/server.Po
+ -rm -f tutorial/timer1/$(DEPDIR)/timer.Po
+ -rm -f tutorial/timer2/$(DEPDIR)/timer.Po
+ -rm -f tutorial/timer3/$(DEPDIR)/timer.Po
+ -rm -f tutorial/timer4/$(DEPDIR)/timer.Po
+ -rm -f tutorial/timer5/$(DEPDIR)/timer.Po
+ -rm -f type_erasure/$(DEPDIR)/main.Po
+ -rm -f type_erasure/$(DEPDIR)/sleep.Po
+ -rm -f type_erasure/$(DEPDIR)/stdin_line_reader.Po
+ -rm -f windows/$(DEPDIR)/transmit_file.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/3rdparty/asio/src/examples/cpp11/allocation/server.cpp b/3rdparty/asio/src/examples/cpp11/allocation/server.cpp
new file mode 100644
index 00000000000..48bc119c1c5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/allocation/server.cpp
@@ -0,0 +1,217 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <array>
+#include <cstdlib>
+#include <iostream>
+#include <memory>
+#include <type_traits>
+#include <utility>
+#include "asio.hpp"
+
+using asio::ip::tcp;
+
+// Class to manage the memory to be used for handler-based custom allocation.
+// It contains a single block of memory which may be returned for allocation
+// requests. If the memory is in use when an allocation request is made, the
+// allocator delegates allocation to the global heap.
+class handler_memory
+{
+public:
+ handler_memory()
+ : in_use_(false)
+ {
+ }
+
+ handler_memory(const handler_memory&) = delete;
+ handler_memory& operator=(const handler_memory&) = delete;
+
+ void* allocate(std::size_t size)
+ {
+ if (!in_use_ && size < sizeof(storage_))
+ {
+ in_use_ = true;
+ return &storage_;
+ }
+ else
+ {
+ return ::operator new(size);
+ }
+ }
+
+ void deallocate(void* pointer)
+ {
+ if (pointer == &storage_)
+ {
+ in_use_ = false;
+ }
+ else
+ {
+ ::operator delete(pointer);
+ }
+ }
+
+private:
+ // Storage space used for handler-based custom memory allocation.
+ typename std::aligned_storage<1024>::type storage_;
+
+ // Whether the handler-based custom allocation storage has been used.
+ bool in_use_;
+};
+
+// The allocator to be associated with the handler objects. This allocator only
+// needs to satisfy the C++11 minimal allocator requirements.
+template <typename T>
+class handler_allocator
+{
+public:
+ using value_type = T;
+
+ explicit handler_allocator(handler_memory& mem)
+ : memory_(mem)
+ {
+ }
+
+ template <typename U>
+ handler_allocator(const handler_allocator<U>& other) noexcept
+ : memory_(other.memory_)
+ {
+ }
+
+ bool operator==(const handler_allocator& other) const noexcept
+ {
+ return &memory_ == &other.memory_;
+ }
+
+ bool operator!=(const handler_allocator& other) const noexcept
+ {
+ return &memory_ != &other.memory_;
+ }
+
+ T* allocate(std::size_t n) const
+ {
+ return static_cast<T*>(memory_.allocate(sizeof(T) * n));
+ }
+
+ void deallocate(T* p, std::size_t /*n*/) const
+ {
+ return memory_.deallocate(p);
+ }
+
+private:
+ template <typename> friend class handler_allocator;
+
+ // The underlying memory.
+ handler_memory& memory_;
+};
+
+class session
+ : public std::enable_shared_from_this<session>
+{
+public:
+ session(tcp::socket socket)
+ : socket_(std::move(socket))
+ {
+ }
+
+ void start()
+ {
+ do_read();
+ }
+
+private:
+ void do_read()
+ {
+ auto self(shared_from_this());
+ socket_.async_read_some(asio::buffer(data_),
+ asio::bind_allocator(
+ handler_allocator<int>(handler_memory_),
+ [this, self](std::error_code ec, std::size_t length)
+ {
+ if (!ec)
+ {
+ do_write(length);
+ }
+ }));
+ }
+
+ void do_write(std::size_t length)
+ {
+ auto self(shared_from_this());
+ asio::async_write(socket_, asio::buffer(data_, length),
+ asio::bind_allocator(
+ handler_allocator<int>(handler_memory_),
+ [this, self](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ {
+ do_read();
+ }
+ }));
+ }
+
+ // The socket used to communicate with the client.
+ tcp::socket socket_;
+
+ // Buffer used to store data received from the client.
+ std::array<char, 1024> data_;
+
+ // The memory to use for handler-based custom memory allocation.
+ handler_memory handler_memory_;
+};
+
+class server
+{
+public:
+ server(asio::io_context& io_context, short port)
+ : acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
+ {
+ do_accept();
+ }
+
+private:
+ void do_accept()
+ {
+ acceptor_.async_accept(
+ [this](std::error_code ec, tcp::socket socket)
+ {
+ if (!ec)
+ {
+ std::make_shared<session>(std::move(socket))->start();
+ }
+
+ do_accept();
+ });
+ }
+
+ tcp::acceptor acceptor_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+ server s(io_context, std::atoi(argv[1]));
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/buffers/reference_counted.cpp b/3rdparty/asio/src/examples/cpp11/buffers/reference_counted.cpp
new file mode 100644
index 00000000000..cee56ff786b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/buffers/reference_counted.cpp
@@ -0,0 +1,122 @@
+//
+// reference_counted.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+#include <memory>
+#include <utility>
+#include <vector>
+#include <ctime>
+
+using asio::ip::tcp;
+
+// A reference-counted non-modifiable buffer class.
+class shared_const_buffer
+{
+public:
+ // Construct from a std::string.
+ explicit shared_const_buffer(const std::string& data)
+ : data_(new std::vector<char>(data.begin(), data.end())),
+ buffer_(asio::buffer(*data_))
+ {
+ }
+
+ // Implement the ConstBufferSequence requirements.
+ typedef asio::const_buffer value_type;
+ typedef const asio::const_buffer* const_iterator;
+ const asio::const_buffer* begin() const { return &buffer_; }
+ const asio::const_buffer* end() const { return &buffer_ + 1; }
+
+private:
+ std::shared_ptr<std::vector<char> > data_;
+ asio::const_buffer buffer_;
+};
+
+class session
+ : public std::enable_shared_from_this<session>
+{
+public:
+ session(tcp::socket socket)
+ : socket_(std::move(socket))
+ {
+ }
+
+ void start()
+ {
+ do_write();
+ }
+
+private:
+ void do_write()
+ {
+ std::time_t now = std::time(0);
+ shared_const_buffer buffer(std::ctime(&now));
+
+ auto self(shared_from_this());
+ asio::async_write(socket_, buffer,
+ [self](std::error_code /*ec*/, std::size_t /*length*/)
+ {
+ });
+ }
+
+ // The socket used to communicate with the client.
+ tcp::socket socket_;
+};
+
+class server
+{
+public:
+ server(asio::io_context& io_context, short port)
+ : acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
+ {
+ do_accept();
+ }
+
+private:
+ void do_accept()
+ {
+ acceptor_.async_accept(
+ [this](std::error_code ec, tcp::socket socket)
+ {
+ if (!ec)
+ {
+ std::make_shared<session>(std::move(socket))->start();
+ }
+
+ do_accept();
+ });
+ }
+
+ tcp::acceptor acceptor_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: reference_counted <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ server s(io_context, std::atoi(argv[1]));
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/chat/chat_client.cpp b/3rdparty/asio/src/examples/cpp11/chat/chat_client.cpp
new file mode 100644
index 00000000000..c0393ee8266
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/chat/chat_client.cpp
@@ -0,0 +1,167 @@
+//
+// chat_client.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <deque>
+#include <iostream>
+#include <thread>
+#include "asio.hpp"
+#include "chat_message.hpp"
+
+using asio::ip::tcp;
+
+typedef std::deque<chat_message> chat_message_queue;
+
+class chat_client
+{
+public:
+ chat_client(asio::io_context& io_context,
+ const tcp::resolver::results_type& endpoints)
+ : io_context_(io_context),
+ socket_(io_context)
+ {
+ do_connect(endpoints);
+ }
+
+ void write(const chat_message& msg)
+ {
+ asio::post(io_context_,
+ [this, msg]()
+ {
+ bool write_in_progress = !write_msgs_.empty();
+ write_msgs_.push_back(msg);
+ if (!write_in_progress)
+ {
+ do_write();
+ }
+ });
+ }
+
+ void close()
+ {
+ asio::post(io_context_, [this]() { socket_.close(); });
+ }
+
+private:
+ void do_connect(const tcp::resolver::results_type& endpoints)
+ {
+ asio::async_connect(socket_, endpoints,
+ [this](std::error_code ec, tcp::endpoint)
+ {
+ if (!ec)
+ {
+ do_read_header();
+ }
+ });
+ }
+
+ void do_read_header()
+ {
+ asio::async_read(socket_,
+ asio::buffer(read_msg_.data(), chat_message::header_length),
+ [this](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec && read_msg_.decode_header())
+ {
+ do_read_body();
+ }
+ else
+ {
+ socket_.close();
+ }
+ });
+ }
+
+ void do_read_body()
+ {
+ asio::async_read(socket_,
+ asio::buffer(read_msg_.body(), read_msg_.body_length()),
+ [this](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ {
+ std::cout.write(read_msg_.body(), read_msg_.body_length());
+ std::cout << "\n";
+ do_read_header();
+ }
+ else
+ {
+ socket_.close();
+ }
+ });
+ }
+
+ void do_write()
+ {
+ asio::async_write(socket_,
+ asio::buffer(write_msgs_.front().data(),
+ write_msgs_.front().length()),
+ [this](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ {
+ write_msgs_.pop_front();
+ if (!write_msgs_.empty())
+ {
+ do_write();
+ }
+ }
+ else
+ {
+ socket_.close();
+ }
+ });
+ }
+
+private:
+ asio::io_context& io_context_;
+ tcp::socket socket_;
+ chat_message read_msg_;
+ chat_message_queue write_msgs_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: chat_client <host> <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ tcp::resolver resolver(io_context);
+ auto endpoints = resolver.resolve(argv[1], argv[2]);
+ chat_client c(io_context, endpoints);
+
+ std::thread t([&io_context](){ io_context.run(); });
+
+ char line[chat_message::max_body_length + 1];
+ while (std::cin.getline(line, chat_message::max_body_length + 1))
+ {
+ chat_message msg;
+ msg.body_length(std::strlen(line));
+ std::memcpy(msg.body(), line, msg.body_length());
+ msg.encode_header();
+ c.write(msg);
+ }
+
+ c.close();
+ t.join();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/chat/chat_message.hpp b/3rdparty/asio/src/examples/cpp11/chat/chat_message.hpp
new file mode 100644
index 00000000000..2ae82fa1257
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/chat/chat_message.hpp
@@ -0,0 +1,91 @@
+//
+// chat_message.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef CHAT_MESSAGE_HPP
+#define CHAT_MESSAGE_HPP
+
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+
+class chat_message
+{
+public:
+ static constexpr std::size_t header_length = 4;
+ static constexpr std::size_t max_body_length = 512;
+
+ chat_message()
+ : body_length_(0)
+ {
+ }
+
+ const char* data() const
+ {
+ return data_;
+ }
+
+ char* data()
+ {
+ return data_;
+ }
+
+ std::size_t length() const
+ {
+ return header_length + body_length_;
+ }
+
+ const char* body() const
+ {
+ return data_ + header_length;
+ }
+
+ char* body()
+ {
+ return data_ + header_length;
+ }
+
+ std::size_t body_length() const
+ {
+ return body_length_;
+ }
+
+ void body_length(std::size_t new_length)
+ {
+ body_length_ = new_length;
+ if (body_length_ > max_body_length)
+ body_length_ = max_body_length;
+ }
+
+ bool decode_header()
+ {
+ char header[header_length + 1] = "";
+ std::strncat(header, data_, header_length);
+ body_length_ = std::atoi(header);
+ if (body_length_ > max_body_length)
+ {
+ body_length_ = 0;
+ return false;
+ }
+ return true;
+ }
+
+ void encode_header()
+ {
+ char header[header_length + 1] = "";
+ std::sprintf(header, "%4d", static_cast<int>(body_length_));
+ std::memcpy(data_, header, header_length);
+ }
+
+private:
+ char data_[header_length + max_body_length];
+ std::size_t body_length_;
+};
+
+#endif // CHAT_MESSAGE_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/chat/chat_server.cpp b/3rdparty/asio/src/examples/cpp11/chat/chat_server.cpp
new file mode 100644
index 00000000000..7a5dfe33d4f
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/chat/chat_server.cpp
@@ -0,0 +1,227 @@
+//
+// chat_server.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <deque>
+#include <iostream>
+#include <list>
+#include <memory>
+#include <set>
+#include <utility>
+#include "asio.hpp"
+#include "chat_message.hpp"
+
+using asio::ip::tcp;
+
+//----------------------------------------------------------------------
+
+typedef std::deque<chat_message> chat_message_queue;
+
+//----------------------------------------------------------------------
+
+class chat_participant
+{
+public:
+ virtual ~chat_participant() {}
+ virtual void deliver(const chat_message& msg) = 0;
+};
+
+typedef std::shared_ptr<chat_participant> chat_participant_ptr;
+
+//----------------------------------------------------------------------
+
+class chat_room
+{
+public:
+ void join(chat_participant_ptr participant)
+ {
+ participants_.insert(participant);
+ for (auto msg: recent_msgs_)
+ participant->deliver(msg);
+ }
+
+ void leave(chat_participant_ptr participant)
+ {
+ participants_.erase(participant);
+ }
+
+ void deliver(const chat_message& msg)
+ {
+ recent_msgs_.push_back(msg);
+ while (recent_msgs_.size() > max_recent_msgs)
+ recent_msgs_.pop_front();
+
+ for (auto participant: participants_)
+ participant->deliver(msg);
+ }
+
+private:
+ std::set<chat_participant_ptr> participants_;
+ enum { max_recent_msgs = 100 };
+ chat_message_queue recent_msgs_;
+};
+
+//----------------------------------------------------------------------
+
+class chat_session
+ : public chat_participant,
+ public std::enable_shared_from_this<chat_session>
+{
+public:
+ chat_session(tcp::socket socket, chat_room& room)
+ : socket_(std::move(socket)),
+ room_(room)
+ {
+ }
+
+ void start()
+ {
+ room_.join(shared_from_this());
+ do_read_header();
+ }
+
+ void deliver(const chat_message& msg)
+ {
+ bool write_in_progress = !write_msgs_.empty();
+ write_msgs_.push_back(msg);
+ if (!write_in_progress)
+ {
+ do_write();
+ }
+ }
+
+private:
+ void do_read_header()
+ {
+ auto self(shared_from_this());
+ asio::async_read(socket_,
+ asio::buffer(read_msg_.data(), chat_message::header_length),
+ [this, self](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec && read_msg_.decode_header())
+ {
+ do_read_body();
+ }
+ else
+ {
+ room_.leave(shared_from_this());
+ }
+ });
+ }
+
+ void do_read_body()
+ {
+ auto self(shared_from_this());
+ asio::async_read(socket_,
+ asio::buffer(read_msg_.body(), read_msg_.body_length()),
+ [this, self](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ {
+ room_.deliver(read_msg_);
+ do_read_header();
+ }
+ else
+ {
+ room_.leave(shared_from_this());
+ }
+ });
+ }
+
+ void do_write()
+ {
+ auto self(shared_from_this());
+ asio::async_write(socket_,
+ asio::buffer(write_msgs_.front().data(),
+ write_msgs_.front().length()),
+ [this, self](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ {
+ write_msgs_.pop_front();
+ if (!write_msgs_.empty())
+ {
+ do_write();
+ }
+ }
+ else
+ {
+ room_.leave(shared_from_this());
+ }
+ });
+ }
+
+ tcp::socket socket_;
+ chat_room& room_;
+ chat_message read_msg_;
+ chat_message_queue write_msgs_;
+};
+
+//----------------------------------------------------------------------
+
+class chat_server
+{
+public:
+ chat_server(asio::io_context& io_context,
+ const tcp::endpoint& endpoint)
+ : acceptor_(io_context, endpoint)
+ {
+ do_accept();
+ }
+
+private:
+ void do_accept()
+ {
+ acceptor_.async_accept(
+ [this](std::error_code ec, tcp::socket socket)
+ {
+ if (!ec)
+ {
+ std::make_shared<chat_session>(std::move(socket), room_)->start();
+ }
+
+ do_accept();
+ });
+ }
+
+ tcp::acceptor acceptor_;
+ chat_room room_;
+};
+
+//----------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc < 2)
+ {
+ std::cerr << "Usage: chat_server <port> [<port> ...]\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ std::list<chat_server> servers;
+ for (int i = 1; i < argc; ++i)
+ {
+ tcp::endpoint endpoint(tcp::v4(), std::atoi(argv[i]));
+ servers.emplace_back(io_context, endpoint);
+ }
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/chat/posix_chat_client.cpp b/3rdparty/asio/src/examples/cpp11/chat/posix_chat_client.cpp
new file mode 100644
index 00000000000..a77b8cfb001
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/chat/posix_chat_client.cpp
@@ -0,0 +1,198 @@
+//
+// posix_chat_client.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <array>
+#include <cstdlib>
+#include <cstring>
+#include <iostream>
+#include "asio.hpp"
+#include "chat_message.hpp"
+
+#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+
+using asio::ip::tcp;
+namespace posix = asio::posix;
+
+class posix_chat_client
+{
+public:
+ posix_chat_client(asio::io_context& io_context,
+ const tcp::resolver::results_type& endpoints)
+ : socket_(io_context),
+ input_(io_context, ::dup(STDIN_FILENO)),
+ output_(io_context, ::dup(STDOUT_FILENO)),
+ input_buffer_(chat_message::max_body_length)
+ {
+ do_connect(endpoints);
+ }
+
+private:
+ void do_connect(const tcp::resolver::results_type& endpoints)
+ {
+ asio::async_connect(socket_, endpoints,
+ [this](std::error_code ec, tcp::endpoint)
+ {
+ if (!ec)
+ {
+ do_read_header();
+ do_read_input();
+ }
+ });
+ }
+
+ void do_read_header()
+ {
+ asio::async_read(socket_,
+ asio::buffer(read_msg_.data(), chat_message::header_length),
+ [this](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec && read_msg_.decode_header())
+ {
+ do_read_body();
+ }
+ else
+ {
+ close();
+ }
+ });
+ }
+
+ void do_read_body()
+ {
+ asio::async_read(socket_,
+ asio::buffer(read_msg_.body(), read_msg_.body_length()),
+ [this](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ {
+ do_write_output();
+ }
+ else
+ {
+ close();
+ }
+ });
+ }
+
+ void do_write_output()
+ {
+ // Write out the message we just received, terminated by a newline.
+ static char eol[] = { '\n' };
+ std::array<asio::const_buffer, 2> buffers = {{
+ asio::buffer(read_msg_.body(), read_msg_.body_length()),
+ asio::buffer(eol) }};
+ asio::async_write(output_, buffers,
+ [this](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ {
+ do_read_header();
+ }
+ else
+ {
+ close();
+ }
+ });
+ }
+
+ void do_read_input()
+ {
+ // Read a line of input entered by the user.
+ asio::async_read_until(input_, input_buffer_, '\n',
+ [this](std::error_code ec, std::size_t length)
+ {
+ if (!ec)
+ {
+ // Write the message (minus the newline) to the server.
+ write_msg_.body_length(length - 1);
+ input_buffer_.sgetn(write_msg_.body(), length - 1);
+ input_buffer_.consume(1); // Remove newline from input.
+ write_msg_.encode_header();
+ do_write_message();
+ }
+ else if (ec == asio::error::not_found)
+ {
+ // Didn't get a newline. Send whatever we have.
+ write_msg_.body_length(input_buffer_.size());
+ input_buffer_.sgetn(write_msg_.body(), input_buffer_.size());
+ write_msg_.encode_header();
+ do_write_message();
+ }
+ else
+ {
+ close();
+ }
+ });
+ }
+
+ void do_write_message()
+ {
+ asio::async_write(socket_,
+ asio::buffer(write_msg_.data(), write_msg_.length()),
+ [this](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ {
+ do_read_input();
+ }
+ else
+ {
+ close();
+ }
+ });
+ }
+
+ void close()
+ {
+ // Cancel all outstanding asynchronous operations.
+ socket_.close();
+ input_.close();
+ output_.close();
+ }
+
+private:
+ tcp::socket socket_;
+ posix::stream_descriptor input_;
+ posix::stream_descriptor output_;
+ chat_message read_msg_;
+ chat_message write_msg_;
+ asio::streambuf input_buffer_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: posix_chat_client <host> <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ tcp::resolver resolver(io_context);
+ tcp::resolver::results_type endpoints = resolver.resolve(argv[1], argv[2]);
+
+ posix_chat_client c(io_context, endpoints);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
+
+#else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+int main() {}
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
diff --git a/3rdparty/asio/src/examples/cpp11/deferred/deferred_1.cpp b/3rdparty/asio/src/examples/cpp11/deferred/deferred_1.cpp
new file mode 100644
index 00000000000..db9213eb3be
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/deferred/deferred_1.cpp
@@ -0,0 +1,35 @@
+//
+// deferred_1.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+
+using asio::deferred;
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::steady_timer timer(ctx);
+ timer.expires_after(std::chrono::seconds(1));
+
+ auto deferred_op = timer.async_wait(deferred);
+
+ std::move(deferred_op)(
+ [](std::error_code ec)
+ {
+ std::cout << "timer wait finished: " << ec.message() << "\n";
+ }
+ );
+
+ ctx.run();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/deferred/deferred_2.cpp b/3rdparty/asio/src/examples/cpp11/deferred/deferred_2.cpp
new file mode 100644
index 00000000000..07528282de5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/deferred/deferred_2.cpp
@@ -0,0 +1,44 @@
+//
+// deferred_2.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+
+using asio::deferred;
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::steady_timer timer(ctx);
+ timer.expires_after(std::chrono::seconds(1));
+
+ auto deferred_op = timer.async_wait(
+ deferred(
+ [&](std::error_code ec)
+ {
+ std::cout << "first timer wait finished: " << ec.message() << "\n";
+ timer.expires_after(std::chrono::seconds(1));
+ return timer.async_wait(deferred);
+ }
+ )
+ );
+
+ std::move(deferred_op)(
+ [](std::error_code ec)
+ {
+ std::cout << "second timer wait finished: " << ec.message() << "\n";
+ }
+ );
+
+ ctx.run();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/echo/async_tcp_echo_server.cpp b/3rdparty/asio/src/examples/cpp11/echo/async_tcp_echo_server.cpp
new file mode 100644
index 00000000000..b8ba5337697
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/echo/async_tcp_echo_server.cpp
@@ -0,0 +1,114 @@
+//
+// async_tcp_echo_server.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <iostream>
+#include <memory>
+#include <utility>
+#include "asio.hpp"
+
+using asio::ip::tcp;
+
+class session
+ : public std::enable_shared_from_this<session>
+{
+public:
+ session(tcp::socket socket)
+ : socket_(std::move(socket))
+ {
+ }
+
+ void start()
+ {
+ do_read();
+ }
+
+private:
+ void do_read()
+ {
+ auto self(shared_from_this());
+ socket_.async_read_some(asio::buffer(data_, max_length),
+ [this, self](std::error_code ec, std::size_t length)
+ {
+ if (!ec)
+ {
+ do_write(length);
+ }
+ });
+ }
+
+ void do_write(std::size_t length)
+ {
+ auto self(shared_from_this());
+ asio::async_write(socket_, asio::buffer(data_, length),
+ [this, self](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ {
+ do_read();
+ }
+ });
+ }
+
+ tcp::socket socket_;
+ enum { max_length = 1024 };
+ char data_[max_length];
+};
+
+class server
+{
+public:
+ server(asio::io_context& io_context, short port)
+ : acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
+ {
+ do_accept();
+ }
+
+private:
+ void do_accept()
+ {
+ acceptor_.async_accept(
+ [this](std::error_code ec, tcp::socket socket)
+ {
+ if (!ec)
+ {
+ std::make_shared<session>(std::move(socket))->start();
+ }
+
+ do_accept();
+ });
+ }
+
+ tcp::acceptor acceptor_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: async_tcp_echo_server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ server s(io_context, std::atoi(argv[1]));
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/echo/async_udp_echo_server.cpp b/3rdparty/asio/src/examples/cpp11/echo/async_udp_echo_server.cpp
new file mode 100644
index 00000000000..8e5c26fba2a
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/echo/async_udp_echo_server.cpp
@@ -0,0 +1,82 @@
+//
+// async_udp_echo_server.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <iostream>
+#include "asio.hpp"
+
+using asio::ip::udp;
+
+class server
+{
+public:
+ server(asio::io_context& io_context, short port)
+ : socket_(io_context, udp::endpoint(udp::v4(), port))
+ {
+ do_receive();
+ }
+
+ void do_receive()
+ {
+ socket_.async_receive_from(
+ asio::buffer(data_, max_length), sender_endpoint_,
+ [this](std::error_code ec, std::size_t bytes_recvd)
+ {
+ if (!ec && bytes_recvd > 0)
+ {
+ do_send(bytes_recvd);
+ }
+ else
+ {
+ do_receive();
+ }
+ });
+ }
+
+ void do_send(std::size_t length)
+ {
+ socket_.async_send_to(
+ asio::buffer(data_, length), sender_endpoint_,
+ [this](std::error_code /*ec*/, std::size_t /*bytes_sent*/)
+ {
+ do_receive();
+ });
+ }
+
+private:
+ udp::socket socket_;
+ udp::endpoint sender_endpoint_;
+ enum { max_length = 1024 };
+ char data_[max_length];
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: async_udp_echo_server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ server s(io_context, std::atoi(argv[1]));
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/echo/blocking_tcp_echo_client.cpp b/3rdparty/asio/src/examples/cpp11/echo/blocking_tcp_echo_client.cpp
new file mode 100644
index 00000000000..8a281203f89
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/echo/blocking_tcp_echo_client.cpp
@@ -0,0 +1,55 @@
+//
+// blocking_tcp_echo_client.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <cstring>
+#include <iostream>
+#include "asio.hpp"
+
+using asio::ip::tcp;
+
+enum { max_length = 1024 };
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: blocking_tcp_echo_client <host> <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ tcp::socket s(io_context);
+ tcp::resolver resolver(io_context);
+ asio::connect(s, resolver.resolve(argv[1], argv[2]));
+
+ std::cout << "Enter message: ";
+ char request[max_length];
+ std::cin.getline(request, max_length);
+ size_t request_length = std::strlen(request);
+ asio::write(s, asio::buffer(request, request_length));
+
+ char reply[max_length];
+ size_t reply_length = asio::read(s,
+ asio::buffer(reply, request_length));
+ std::cout << "Reply is: ";
+ std::cout.write(reply, reply_length);
+ std::cout << "\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/echo/blocking_tcp_echo_server.cpp b/3rdparty/asio/src/examples/cpp11/echo/blocking_tcp_echo_server.cpp
new file mode 100644
index 00000000000..34e5f221695
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/echo/blocking_tcp_echo_server.cpp
@@ -0,0 +1,74 @@
+//
+// blocking_tcp_echo_server.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <iostream>
+#include <thread>
+#include <utility>
+#include "asio.hpp"
+
+using asio::ip::tcp;
+
+const int max_length = 1024;
+
+void session(tcp::socket sock)
+{
+ try
+ {
+ for (;;)
+ {
+ char data[max_length];
+
+ std::error_code error;
+ size_t length = sock.read_some(asio::buffer(data), error);
+ if (error == asio::error::eof)
+ break; // Connection closed cleanly by peer.
+ else if (error)
+ throw std::system_error(error); // Some other error.
+
+ asio::write(sock, asio::buffer(data, length));
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception in thread: " << e.what() << "\n";
+ }
+}
+
+void server(asio::io_context& io_context, unsigned short port)
+{
+ tcp::acceptor a(io_context, tcp::endpoint(tcp::v4(), port));
+ for (;;)
+ {
+ std::thread(session, a.accept()).detach();
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: blocking_tcp_echo_server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ server(io_context, std::atoi(argv[1]));
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/echo/blocking_udp_echo_client.cpp b/3rdparty/asio/src/examples/cpp11/echo/blocking_udp_echo_client.cpp
new file mode 100644
index 00000000000..3f2b60e3ccc
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/echo/blocking_udp_echo_client.cpp
@@ -0,0 +1,58 @@
+//
+// blocking_udp_echo_client.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <cstring>
+#include <iostream>
+#include "asio.hpp"
+
+using asio::ip::udp;
+
+enum { max_length = 1024 };
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: blocking_udp_echo_client <host> <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ udp::socket s(io_context, udp::endpoint(udp::v4(), 0));
+
+ udp::resolver resolver(io_context);
+ udp::resolver::results_type endpoints =
+ resolver.resolve(udp::v4(), argv[1], argv[2]);
+
+ std::cout << "Enter message: ";
+ char request[max_length];
+ std::cin.getline(request, max_length);
+ size_t request_length = std::strlen(request);
+ s.send_to(asio::buffer(request, request_length), *endpoints.begin());
+
+ char reply[max_length];
+ udp::endpoint sender_endpoint;
+ size_t reply_length = s.receive_from(
+ asio::buffer(reply, max_length), sender_endpoint);
+ std::cout << "Reply is: ";
+ std::cout.write(reply, reply_length);
+ std::cout << "\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/echo/blocking_udp_echo_server.cpp b/3rdparty/asio/src/examples/cpp11/echo/blocking_udp_echo_server.cpp
new file mode 100644
index 00000000000..64c6defb885
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/echo/blocking_udp_echo_server.cpp
@@ -0,0 +1,52 @@
+//
+// blocking_udp_echo_server.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <iostream>
+#include "asio.hpp"
+
+using asio::ip::udp;
+
+enum { max_length = 1024 };
+
+void server(asio::io_context& io_context, unsigned short port)
+{
+ udp::socket sock(io_context, udp::endpoint(udp::v4(), port));
+ for (;;)
+ {
+ char data[max_length];
+ udp::endpoint sender_endpoint;
+ size_t length = sock.receive_from(
+ asio::buffer(data, max_length), sender_endpoint);
+ sock.send_to(asio::buffer(data, length), sender_endpoint);
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: blocking_udp_echo_server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ server(io_context, std::atoi(argv[1]));
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/executors/actor.cpp b/3rdparty/asio/src/examples/cpp11/executors/actor.cpp
new file mode 100644
index 00000000000..1f0e2c11308
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/executors/actor.cpp
@@ -0,0 +1,286 @@
+#include <asio/any_io_executor.hpp>
+#include <asio/defer.hpp>
+#include <asio/post.hpp>
+#include <asio/strand.hpp>
+#include <asio/system_executor.hpp>
+#include <condition_variable>
+#include <deque>
+#include <memory>
+#include <mutex>
+#include <typeinfo>
+#include <vector>
+
+using asio::any_io_executor;
+using asio::defer;
+using asio::post;
+using asio::strand;
+using asio::system_executor;
+
+//------------------------------------------------------------------------------
+// A tiny actor framework
+// ~~~~~~~~~~~~~~~~~~~~~~
+
+class actor;
+
+// Used to identify the sender and recipient of messages.
+typedef actor* actor_address;
+
+// Base class for all registered message handlers.
+class message_handler_base
+{
+public:
+ virtual ~message_handler_base() {}
+
+ // Used to determine which message handlers receive an incoming message.
+ virtual const std::type_info& message_id() const = 0;
+};
+
+// Base class for a handler for a specific message type.
+template <class Message>
+class message_handler : public message_handler_base
+{
+public:
+ // Handle an incoming message.
+ virtual void handle_message(Message msg, actor_address from) = 0;
+};
+
+// Concrete message handler for a specific message type.
+template <class Actor, class Message>
+class mf_message_handler : public message_handler<Message>
+{
+public:
+ // Construct a message handler to invoke the specified member function.
+ mf_message_handler(void (Actor::* mf)(Message, actor_address), Actor* a)
+ : function_(mf), actor_(a)
+ {
+ }
+
+ // Used to determine which message handlers receive an incoming message.
+ virtual const std::type_info& message_id() const
+ {
+ return typeid(Message);
+ }
+
+ // Handle an incoming message.
+ virtual void handle_message(Message msg, actor_address from)
+ {
+ (actor_->*function_)(std::move(msg), from);
+ }
+
+ // Determine whether the message handler represents the specified function.
+ bool is_function(void (Actor::* mf)(Message, actor_address)) const
+ {
+ return mf == function_;
+ }
+
+private:
+ void (Actor::* function_)(Message, actor_address);
+ Actor* actor_;
+};
+
+// Base class for all actors.
+class actor
+{
+public:
+ virtual ~actor()
+ {
+ }
+
+ // Obtain the actor's address for use as a message sender or recipient.
+ actor_address address()
+ {
+ return this;
+ }
+
+ // Send a message from one actor to another.
+ template <class Message>
+ friend void send(Message msg, actor_address from, actor_address to)
+ {
+ // Execute the message handler in the context of the target's executor.
+ post(to->executor_,
+ [=]
+ {
+ to->call_handler(std::move(msg), from);
+ });
+ }
+
+protected:
+ // Construct the actor to use the specified executor for all message handlers.
+ actor(any_io_executor e)
+ : executor_(std::move(e))
+ {
+ }
+
+ // Register a handler for a specific message type. Duplicates are permitted.
+ template <class Actor, class Message>
+ void register_handler(void (Actor::* mf)(Message, actor_address))
+ {
+ handlers_.push_back(
+ std::make_shared<mf_message_handler<Actor, Message>>(
+ mf, static_cast<Actor*>(this)));
+ }
+
+ // Deregister a handler. Removes only the first matching handler.
+ template <class Actor, class Message>
+ void deregister_handler(void (Actor::* mf)(Message, actor_address))
+ {
+ const std::type_info& id = typeid(Message);
+ for (auto iter = handlers_.begin(); iter != handlers_.end(); ++iter)
+ {
+ if ((*iter)->message_id() == id)
+ {
+ auto mh = static_cast<mf_message_handler<Actor, Message>*>(iter->get());
+ if (mh->is_function(mf))
+ {
+ handlers_.erase(iter);
+ return;
+ }
+ }
+ }
+ }
+
+ // Send a message from within a message handler.
+ template <class Message>
+ void tail_send(Message msg, actor_address to)
+ {
+ // Execute the message handler in the context of the target's executor.
+ actor* from = this;
+ defer(to->executor_,
+ [=]
+ {
+ to->call_handler(std::move(msg), from);
+ });
+ }
+
+private:
+ // Find the matching message handlers, if any, and call them.
+ template <class Message>
+ void call_handler(Message msg, actor_address from)
+ {
+ const std::type_info& message_id = typeid(Message);
+ for (auto& h: handlers_)
+ {
+ if (h->message_id() == message_id)
+ {
+ auto mh = static_cast<message_handler<Message>*>(h.get());
+ mh->handle_message(msg, from);
+ }
+ }
+ }
+
+ // All messages associated with a single actor object should be processed
+ // non-concurrently. We use a strand to ensure non-concurrent execution even
+ // if the underlying executor may use multiple threads.
+ strand<any_io_executor> executor_;
+
+ std::vector<std::shared_ptr<message_handler_base>> handlers_;
+};
+
+// A concrete actor that allows synchronous message retrieval.
+template <class Message>
+class receiver : public actor
+{
+public:
+ receiver()
+ : actor(system_executor())
+ {
+ register_handler(&receiver::message_handler);
+ }
+
+ // Block until a message has been received.
+ Message wait()
+ {
+ std::unique_lock<std::mutex> lock(mutex_);
+ condition_.wait(lock, [this]{ return !message_queue_.empty(); });
+ Message msg(std::move(message_queue_.front()));
+ message_queue_.pop_front();
+ return msg;
+ }
+
+private:
+ // Handle a new message by adding it to the queue and waking a waiter.
+ void message_handler(Message msg, actor_address /* from */)
+ {
+ std::lock_guard<std::mutex> lock(mutex_);
+ message_queue_.push_back(std::move(msg));
+ condition_.notify_one();
+ }
+
+ std::mutex mutex_;
+ std::condition_variable condition_;
+ std::deque<Message> message_queue_;
+};
+
+//------------------------------------------------------------------------------
+
+#include <asio/thread_pool.hpp>
+#include <iostream>
+
+using asio::thread_pool;
+
+class member : public actor
+{
+public:
+ explicit member(any_io_executor e)
+ : actor(std::move(e))
+ {
+ register_handler(&member::init_handler);
+ }
+
+private:
+ void init_handler(actor_address next, actor_address from)
+ {
+ next_ = next;
+ caller_ = from;
+
+ register_handler(&member::token_handler);
+ deregister_handler(&member::init_handler);
+ }
+
+ void token_handler(int token, actor_address /*from*/)
+ {
+ int msg(token);
+ actor_address to(caller_);
+
+ if (token > 0)
+ {
+ msg = token - 1;
+ to = next_;
+ }
+
+ tail_send(msg, to);
+ }
+
+ actor_address next_;
+ actor_address caller_;
+};
+
+int main()
+{
+ const std::size_t num_threads = 16;
+ const int num_hops = 50000000;
+ const std::size_t num_actors = 503;
+ const int token_value = (num_hops + num_actors - 1) / num_actors;
+ const std::size_t actors_per_thread = num_actors / num_threads;
+
+ struct single_thread_pool : thread_pool { single_thread_pool() : thread_pool(1) {} };
+ single_thread_pool pools[num_threads];
+ std::vector<std::shared_ptr<member>> members(num_actors);
+ receiver<int> rcvr;
+
+ // Create the member actors.
+ for (std::size_t i = 0; i < num_actors; ++i)
+ members[i] = std::make_shared<member>(pools[(i / actors_per_thread) % num_threads].get_executor());
+
+ // Initialise the actors by passing each one the address of the next actor in the ring.
+ for (std::size_t i = num_actors, next_i = 0; i > 0; next_i = --i)
+ send(members[next_i]->address(), rcvr.address(), members[i - 1]->address());
+
+ // Send exactly one token to each actor, all with the same initial value, rounding up if required.
+ for (std::size_t i = 0; i < num_actors; ++i)
+ send(token_value, rcvr.address(), members[i]->address());
+
+ // Wait for all signal messages, indicating the tokens have all reached zero.
+ for (std::size_t i = 0; i < num_actors; ++i)
+ rcvr.wait();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/executors/bank_account_1.cpp b/3rdparty/asio/src/examples/cpp11/executors/bank_account_1.cpp
new file mode 100644
index 00000000000..a63d7fc059b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/executors/bank_account_1.cpp
@@ -0,0 +1,57 @@
+#include <asio/execution.hpp>
+#include <asio/static_thread_pool.hpp>
+#include <iostream>
+
+using asio::static_thread_pool;
+namespace execution = asio::execution;
+
+// Traditional active object pattern.
+// Member functions do not block.
+
+class bank_account
+{
+ int balance_ = 0;
+ mutable static_thread_pool pool_{1};
+
+public:
+ void deposit(int amount)
+ {
+ pool_.executor().execute(
+ [this, amount]
+ {
+ balance_ += amount;
+ });
+ }
+
+ void withdraw(int amount)
+ {
+ pool_.executor().execute(
+ [this, amount]
+ {
+ if (balance_ >= amount)
+ balance_ -= amount;
+ });
+ }
+
+ void print_balance() const
+ {
+ pool_.executor().execute(
+ [this]
+ {
+ std::cout << "balance = " << balance_ << "\n";
+ });
+ }
+
+ ~bank_account()
+ {
+ pool_.wait();
+ }
+};
+
+int main()
+{
+ bank_account acct;
+ acct.deposit(20);
+ acct.withdraw(10);
+ acct.print_balance();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/executors/bank_account_2.cpp b/3rdparty/asio/src/examples/cpp11/executors/bank_account_2.cpp
new file mode 100644
index 00000000000..45a24abc352
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/executors/bank_account_2.cpp
@@ -0,0 +1,54 @@
+#include <asio/execution.hpp>
+#include <asio/static_thread_pool.hpp>
+#include <iostream>
+
+using asio::static_thread_pool;
+namespace execution = asio::execution;
+
+// Traditional active object pattern.
+// Member functions block until operation is finished.
+
+class bank_account
+{
+ int balance_ = 0;
+ mutable static_thread_pool pool_{1};
+
+public:
+ void deposit(int amount)
+ {
+ asio::require(pool_.executor(), execution::blocking.always).execute(
+ [this, amount]
+ {
+ balance_ += amount;
+ });
+ }
+
+ void withdraw(int amount)
+ {
+ asio::require(pool_.executor(), execution::blocking.always).execute(
+ [this, amount]
+ {
+ if (balance_ >= amount)
+ balance_ -= amount;
+ });
+ }
+
+ int balance() const
+ {
+ int result = 0;
+ asio::require(pool_.executor(), execution::blocking.always).execute(
+ [this, &result]
+ {
+ result = balance_;
+ });
+ return result;
+ }
+};
+
+int main()
+{
+ bank_account acct;
+ acct.deposit(20);
+ acct.withdraw(10);
+ std::cout << "balance = " << acct.balance() << "\n";
+}
diff --git a/3rdparty/asio/src/examples/cpp11/executors/fork_join.cpp b/3rdparty/asio/src/examples/cpp11/executors/fork_join.cpp
new file mode 100644
index 00000000000..7e8a827356d
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/executors/fork_join.cpp
@@ -0,0 +1,289 @@
+#include <asio/execution.hpp>
+#include <asio/static_thread_pool.hpp>
+#include <algorithm>
+#include <condition_variable>
+#include <memory>
+#include <mutex>
+#include <queue>
+#include <thread>
+#include <numeric>
+
+using asio::static_thread_pool;
+namespace execution = asio::execution;
+
+// A fixed-size thread pool used to implement fork/join semantics. Functions
+// are scheduled using a simple FIFO queue. Implementing work stealing, or
+// using a queue based on atomic operations, are left as tasks for the reader.
+class fork_join_pool
+{
+public:
+ // The constructor starts a thread pool with the specified number of threads.
+ // Note that the thread_count is not a fixed limit on the pool's concurrency.
+ // Additional threads may temporarily be added to the pool if they join a
+ // fork_executor.
+ explicit fork_join_pool(
+ std::size_t thread_count = std::max(std::thread::hardware_concurrency(), 1u) * 2)
+ : use_count_(1),
+ threads_(thread_count)
+ {
+ try
+ {
+ // Ask each thread in the pool to dequeue and execute functions until
+ // it is time to shut down, i.e. the use count is zero.
+ for (thread_count_ = 0; thread_count_ < thread_count; ++thread_count_)
+ {
+ threads_.executor().execute(
+ [this]
+ {
+ std::unique_lock<std::mutex> lock(mutex_);
+ while (use_count_ > 0)
+ if (!execute_next(lock))
+ condition_.wait(lock);
+ });
+ }
+ }
+ catch (...)
+ {
+ stop_threads();
+ threads_.wait();
+ throw;
+ }
+ }
+
+ // The destructor waits for the pool to finish executing functions.
+ ~fork_join_pool()
+ {
+ stop_threads();
+ threads_.wait();
+ }
+
+private:
+ friend class fork_executor;
+
+ // The base for all functions that are queued in the pool.
+ struct function_base
+ {
+ std::shared_ptr<std::size_t> work_count_;
+ void (*execute_)(std::shared_ptr<function_base>& p);
+ };
+
+ // Execute the next function from the queue, if any. Returns true if a
+ // function was executed, and false if the queue was empty.
+ bool execute_next(std::unique_lock<std::mutex>& lock)
+ {
+ if (queue_.empty())
+ return false;
+ auto p(queue_.front());
+ queue_.pop();
+ lock.unlock();
+ execute(lock, p);
+ return true;
+ }
+
+ // Execute a function and decrement the outstanding work.
+ void execute(std::unique_lock<std::mutex>& lock,
+ std::shared_ptr<function_base>& p)
+ {
+ std::shared_ptr<std::size_t> work_count(std::move(p->work_count_));
+ try
+ {
+ p->execute_(p);
+ lock.lock();
+ do_work_finished(work_count);
+ }
+ catch (...)
+ {
+ lock.lock();
+ do_work_finished(work_count);
+ throw;
+ }
+ }
+
+ // Increment outstanding work.
+ void do_work_started(const std::shared_ptr<std::size_t>& work_count) noexcept
+ {
+ if (++(*work_count) == 1)
+ ++use_count_;
+ }
+
+ // Decrement outstanding work. Notify waiting threads if we run out.
+ void do_work_finished(const std::shared_ptr<std::size_t>& work_count) noexcept
+ {
+ if (--(*work_count) == 0)
+ {
+ --use_count_;
+ condition_.notify_all();
+ }
+ }
+
+ // Dispatch a function, executing it immediately if the queue is already
+ // loaded. Otherwise adds the function to the queue and wakes a thread.
+ void do_execute(std::shared_ptr<function_base> p,
+ const std::shared_ptr<std::size_t>& work_count)
+ {
+ std::unique_lock<std::mutex> lock(mutex_);
+ if (queue_.size() > thread_count_ * 16)
+ {
+ do_work_started(work_count);
+ lock.unlock();
+ execute(lock, p);
+ }
+ else
+ {
+ queue_.push(p);
+ do_work_started(work_count);
+ condition_.notify_one();
+ }
+ }
+
+ // Ask all threads to shut down.
+ void stop_threads()
+ {
+ std::lock_guard<std::mutex> lock(mutex_);
+ --use_count_;
+ condition_.notify_all();
+ }
+
+ std::mutex mutex_;
+ std::condition_variable condition_;
+ std::queue<std::shared_ptr<function_base>> queue_;
+ std::size_t use_count_;
+ std::size_t thread_count_;
+ static_thread_pool threads_;
+};
+
+// A class that satisfies the Executor requirements. Every function or piece of
+// work associated with a fork_executor is part of a single, joinable group.
+class fork_executor
+{
+public:
+ fork_executor(fork_join_pool& ctx)
+ : context_(ctx),
+ work_count_(std::make_shared<std::size_t>(0))
+ {
+ }
+
+ fork_join_pool& query(execution::context_t) const noexcept
+ {
+ return context_;
+ }
+
+ template <class Func>
+ void execute(Func f) const
+ {
+ auto p(std::make_shared<function<Func>>(std::move(f), work_count_));
+ context_.do_execute(p, work_count_);
+ }
+
+ friend bool operator==(const fork_executor& a,
+ const fork_executor& b) noexcept
+ {
+ return a.work_count_ == b.work_count_;
+ }
+
+ friend bool operator!=(const fork_executor& a,
+ const fork_executor& b) noexcept
+ {
+ return a.work_count_ != b.work_count_;
+ }
+
+ // Block until all work associated with the executor is complete. While it is
+ // waiting, the thread may be borrowed to execute functions from the queue.
+ void join() const
+ {
+ std::unique_lock<std::mutex> lock(context_.mutex_);
+ while (*work_count_ > 0)
+ if (!context_.execute_next(lock))
+ context_.condition_.wait(lock);
+ }
+
+private:
+ template <class Func>
+ struct function : fork_join_pool::function_base
+ {
+ explicit function(Func f, const std::shared_ptr<std::size_t>& w)
+ : function_(std::move(f))
+ {
+ work_count_ = w;
+ execute_ = [](std::shared_ptr<fork_join_pool::function_base>& p)
+ {
+ Func tmp(std::move(static_cast<function*>(p.get())->function_));
+ p.reset();
+ tmp();
+ };
+ }
+
+ Func function_;
+ };
+
+ fork_join_pool& context_;
+ std::shared_ptr<std::size_t> work_count_;
+};
+
+// Helper class to automatically join a fork_executor when exiting a scope.
+class join_guard
+{
+public:
+ explicit join_guard(const fork_executor& ex) : ex_(ex) {}
+ join_guard(const join_guard&) = delete;
+ join_guard(join_guard&&) = delete;
+ ~join_guard() { ex_.join(); }
+
+private:
+ fork_executor ex_;
+};
+
+//------------------------------------------------------------------------------
+
+#include <algorithm>
+#include <iostream>
+#include <random>
+#include <vector>
+
+fork_join_pool pool;
+
+template <class Iterator>
+void fork_join_sort(Iterator begin, Iterator end)
+{
+ std::size_t n = end - begin;
+ if (n > 32768)
+ {
+ {
+ fork_executor fork(pool);
+ join_guard join(fork);
+ fork.execute([=]{ fork_join_sort(begin, begin + n / 2); });
+ fork.execute([=]{ fork_join_sort(begin + n / 2, end); });
+ }
+ std::inplace_merge(begin, begin + n / 2, end);
+ }
+ else
+ {
+ std::sort(begin, end);
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ if (argc != 2)
+ {
+ std::cerr << "Usage: fork_join <size>\n";
+ return 1;
+ }
+
+ std::vector<double> vec(std::atoll(argv[1]));
+ std::iota(vec.begin(), vec.end(), 0);
+
+ std::random_device rd;
+ std::mt19937 g(rd());
+ std::shuffle(vec.begin(), vec.end(), g);
+
+ std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
+
+ fork_join_sort(vec.begin(), vec.end());
+
+ std::chrono::steady_clock::duration elapsed = std::chrono::steady_clock::now() - start;
+
+ std::cout << "sort took ";
+ std::cout << std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
+ std::cout << " microseconds" << std::endl;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/executors/pipeline.cpp b/3rdparty/asio/src/examples/cpp11/executors/pipeline.cpp
new file mode 100644
index 00000000000..f441e322688
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/executors/pipeline.cpp
@@ -0,0 +1,288 @@
+#include <asio/associated_executor.hpp>
+#include <asio/bind_executor.hpp>
+#include <asio/execution_context.hpp>
+#include <asio/post.hpp>
+#include <asio/system_executor.hpp>
+#include <asio/use_future.hpp>
+#include <condition_variable>
+#include <future>
+#include <memory>
+#include <mutex>
+#include <queue>
+#include <thread>
+#include <vector>
+#include <cctype>
+
+using asio::execution_context;
+using asio::executor_binder;
+using asio::get_associated_executor;
+using asio::post;
+using asio::system_executor;
+using asio::use_future;
+using asio::use_service;
+namespace execution = asio::execution;
+
+// An executor that launches a new thread for each function submitted to it.
+// This class satisfies the executor requirements.
+class thread_executor
+{
+private:
+ // Service to track all threads started through a thread_executor.
+ class thread_bag : public execution_context::service
+ {
+ public:
+ typedef thread_bag key_type;
+
+ explicit thread_bag(execution_context& ctx)
+ : execution_context::service(ctx)
+ {
+ }
+
+ void add_thread(std::thread&& t)
+ {
+ std::unique_lock<std::mutex> lock(mutex_);
+ threads_.push_back(std::move(t));
+ }
+
+ private:
+ virtual void shutdown()
+ {
+ for (auto& t : threads_)
+ t.join();
+ }
+
+ std::mutex mutex_;
+ std::vector<std::thread> threads_;
+ };
+
+public:
+ execution_context& query(execution::context_t) const
+ {
+ return asio::query(system_executor(), execution::context);
+ }
+
+ execution::blocking_t query(execution::blocking_t) const
+ {
+ return execution::blocking.never;
+ }
+
+ thread_executor require(execution::blocking_t::never_t) const
+ {
+ return *this;
+ }
+
+ template <class Func>
+ void execute(Func f) const
+ {
+ thread_bag& bag = use_service<thread_bag>(query(execution::context));
+ bag.add_thread(std::thread(std::move(f)));
+ }
+
+ friend bool operator==(const thread_executor&,
+ const thread_executor&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const thread_executor&,
+ const thread_executor&) noexcept
+ {
+ return false;
+ }
+};
+
+// Base class for all thread-safe queue implementations.
+class queue_impl_base
+{
+ template <class> friend class queue_front;
+ template <class> friend class queue_back;
+ std::mutex mutex_;
+ std::condition_variable condition_;
+ bool stop_ = false;
+};
+
+// Underlying implementation of a thread-safe queue, shared between the
+// queue_front and queue_back classes.
+template <class T>
+class queue_impl : public queue_impl_base
+{
+ template <class> friend class queue_front;
+ template <class> friend class queue_back;
+ std::queue<T> queue_;
+};
+
+// The front end of a queue between consecutive pipeline stages.
+template <class T>
+class queue_front
+{
+public:
+ typedef T value_type;
+
+ explicit queue_front(std::shared_ptr<queue_impl<T>> impl)
+ : impl_(impl)
+ {
+ }
+
+ void push(T t)
+ {
+ std::unique_lock<std::mutex> lock(impl_->mutex_);
+ impl_->queue_.push(std::move(t));
+ impl_->condition_.notify_one();
+ }
+
+ void stop()
+ {
+ std::unique_lock<std::mutex> lock(impl_->mutex_);
+ impl_->stop_ = true;
+ impl_->condition_.notify_one();
+ }
+
+private:
+ std::shared_ptr<queue_impl<T>> impl_;
+};
+
+// The back end of a queue between consecutive pipeline stages.
+template <class T>
+class queue_back
+{
+public:
+ typedef T value_type;
+
+ explicit queue_back(std::shared_ptr<queue_impl<T>> impl)
+ : impl_(impl)
+ {
+ }
+
+ bool pop(T& t)
+ {
+ std::unique_lock<std::mutex> lock(impl_->mutex_);
+ while (impl_->queue_.empty() && !impl_->stop_)
+ impl_->condition_.wait(lock);
+ if (!impl_->queue_.empty())
+ {
+ t = impl_->queue_.front();
+ impl_->queue_.pop();
+ return true;
+ }
+ return false;
+ }
+
+private:
+ std::shared_ptr<queue_impl<T>> impl_;
+};
+
+// Launch the last stage in a pipeline.
+template <class T, class F>
+std::future<void> pipeline(queue_back<T> in, F f)
+{
+ // Get the function's associated executor, defaulting to thread_executor.
+ auto ex = get_associated_executor(f, thread_executor());
+
+ // Run the function, and as we're the last stage return a future so that the
+ // caller can wait for the pipeline to finish.
+ return post(ex, use_future([in, f]() mutable { f(in); }));
+}
+
+// Launch an intermediate stage in a pipeline.
+template <class T, class F, class... Tail>
+std::future<void> pipeline(queue_back<T> in, F f, Tail... t)
+{
+ // Determine the output queue type.
+ typedef typename executor_binder<F, thread_executor>::second_argument_type::value_type output_value_type;
+
+ // Create the output queue and its implementation.
+ auto out_impl = std::make_shared<queue_impl<output_value_type>>();
+ queue_front<output_value_type> out(out_impl);
+ queue_back<output_value_type> next_in(out_impl);
+
+ // Get the function's associated executor, defaulting to thread_executor.
+ auto ex = get_associated_executor(f, thread_executor());
+
+ // Run the function.
+ post(ex, [in, out, f]() mutable
+ {
+ f(in, out);
+ out.stop();
+ });
+
+ // Launch the rest of the pipeline.
+ return pipeline(next_in, std::move(t)...);
+}
+
+// Launch the first stage in a pipeline.
+template <class F, class... Tail>
+std::future<void> pipeline(F f, Tail... t)
+{
+ // Determine the output queue type.
+ typedef typename executor_binder<F, thread_executor>::argument_type::value_type output_value_type;
+
+ // Create the output queue and its implementation.
+ auto out_impl = std::make_shared<queue_impl<output_value_type>>();
+ queue_front<output_value_type> out(out_impl);
+ queue_back<output_value_type> next_in(out_impl);
+
+ // Get the function's associated executor, defaulting to thread_executor.
+ auto ex = get_associated_executor(f, thread_executor());
+
+ // Run the function.
+ post(ex, [out, f]() mutable
+ {
+ f(out);
+ out.stop();
+ });
+
+ // Launch the rest of the pipeline.
+ return pipeline(next_in, std::move(t)...);
+}
+
+//------------------------------------------------------------------------------
+
+#include <asio/thread_pool.hpp>
+#include <iostream>
+#include <string>
+
+using asio::bind_executor;
+using asio::thread_pool;
+
+void reader(queue_front<std::string> out)
+{
+ std::string line;
+ while (std::getline(std::cin, line))
+ out.push(line);
+}
+
+void filter(queue_back<std::string> in, queue_front<std::string> out)
+{
+ std::string line;
+ while (in.pop(line))
+ if (line.length() > 5)
+ out.push(line);
+}
+
+void upper(queue_back<std::string> in, queue_front<std::string> out)
+{
+ std::string line;
+ while (in.pop(line))
+ {
+ std::string new_line;
+ for (char c : line)
+ new_line.push_back(std::toupper(c));
+ out.push(new_line);
+ }
+}
+
+void writer(queue_back<std::string> in)
+{
+ std::size_t count = 0;
+ std::string line;
+ while (in.pop(line))
+ std::cout << count++ << ": " << line << std::endl;
+}
+
+int main()
+{
+ thread_pool pool(1);
+
+ auto f = pipeline(reader, filter, bind_executor(pool, upper), writer);
+ f.wait();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/executors/priority_scheduler.cpp b/3rdparty/asio/src/examples/cpp11/executors/priority_scheduler.cpp
new file mode 100644
index 00000000000..d8ef79f3a51
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/executors/priority_scheduler.cpp
@@ -0,0 +1,148 @@
+#include <asio/dispatch.hpp>
+#include <asio/execution_context.hpp>
+#include <condition_variable>
+#include <iostream>
+#include <memory>
+#include <mutex>
+#include <queue>
+
+using asio::dispatch;
+using asio::execution_context;
+namespace execution = asio::execution;
+
+class priority_scheduler : public execution_context
+{
+public:
+ // A class that satisfies the Executor requirements.
+ class executor_type
+ {
+ public:
+ executor_type(priority_scheduler& ctx, int pri) noexcept
+ : context_(ctx), priority_(pri)
+ {
+ }
+
+ priority_scheduler& query(execution::context_t) const noexcept
+ {
+ return context_;
+ }
+
+ template <class Func>
+ void execute(Func f) const
+ {
+ auto p(std::make_shared<item<Func>>(priority_, std::move(f)));
+ std::lock_guard<std::mutex> lock(context_.mutex_);
+ context_.queue_.push(p);
+ context_.condition_.notify_one();
+ }
+
+ friend bool operator==(const executor_type& a,
+ const executor_type& b) noexcept
+ {
+ return &a.context_ == &b.context_;
+ }
+
+ friend bool operator!=(const executor_type& a,
+ const executor_type& b) noexcept
+ {
+ return &a.context_ != &b.context_;
+ }
+
+ private:
+ priority_scheduler& context_;
+ int priority_;
+ };
+
+ ~priority_scheduler() noexcept
+ {
+ shutdown();
+ destroy();
+ }
+
+ executor_type get_executor(int pri = 0) noexcept
+ {
+ return executor_type(*const_cast<priority_scheduler*>(this), pri);
+ }
+
+ void run()
+ {
+ std::unique_lock<std::mutex> lock(mutex_);
+ for (;;)
+ {
+ condition_.wait(lock, [&]{ return stopped_ || !queue_.empty(); });
+ if (stopped_)
+ return;
+ auto p(queue_.top());
+ queue_.pop();
+ lock.unlock();
+ p->execute_(p);
+ lock.lock();
+ }
+ }
+
+ void stop()
+ {
+ std::lock_guard<std::mutex> lock(mutex_);
+ stopped_ = true;
+ condition_.notify_all();
+ }
+
+private:
+ struct item_base
+ {
+ int priority_;
+ void (*execute_)(std::shared_ptr<item_base>&);
+ };
+
+ template <class Func>
+ struct item : item_base
+ {
+ item(int pri, Func f) : function_(std::move(f))
+ {
+ priority_ = pri;
+ execute_ = [](std::shared_ptr<item_base>& p)
+ {
+ Func tmp(std::move(static_cast<item*>(p.get())->function_));
+ p.reset();
+ tmp();
+ };
+ }
+
+ Func function_;
+ };
+
+ struct item_comp
+ {
+ bool operator()(
+ const std::shared_ptr<item_base>& a,
+ const std::shared_ptr<item_base>& b)
+ {
+ return a->priority_ < b->priority_;
+ }
+ };
+
+ std::mutex mutex_;
+ std::condition_variable condition_;
+ std::priority_queue<
+ std::shared_ptr<item_base>,
+ std::vector<std::shared_ptr<item_base>>,
+ item_comp> queue_;
+ bool stopped_ = false;
+};
+
+int main()
+{
+ priority_scheduler sched;
+ auto low = sched.get_executor(0);
+ auto med = sched.get_executor(1);
+ auto high = sched.get_executor(2);
+ dispatch(low, []{ std::cout << "1\n"; });
+ dispatch(low, []{ std::cout << "11\n"; });
+ dispatch(med, []{ std::cout << "2\n"; });
+ dispatch(med, []{ std::cout << "22\n"; });
+ dispatch(high, []{ std::cout << "3\n"; });
+ dispatch(high, []{ std::cout << "33\n"; });
+ dispatch(high, []{ std::cout << "333\n"; });
+ dispatch(sched.get_executor(-1), [&]{ sched.stop(); });
+ sched.run();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/files/async_file_copy.cpp b/3rdparty/asio/src/examples/cpp11/files/async_file_copy.cpp
new file mode 100644
index 00000000000..edfb2765ed5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/files/async_file_copy.cpp
@@ -0,0 +1,101 @@
+//
+// async_file_copy.cpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include "asio.hpp"
+
+#if defined(ASIO_HAS_FILE)
+
+class file_copier
+{
+public:
+ file_copier(asio::io_context& io_context,
+ const char* from, const char* to)
+ : from_file_(io_context, from,
+ asio::stream_file::read_only),
+ to_file_(io_context, to,
+ asio::stream_file::write_only
+ | asio::stream_file::create
+ | asio::stream_file::truncate)
+ {
+ }
+
+ void start()
+ {
+ do_read();
+ }
+
+private:
+ void do_read()
+ {
+ from_file_.async_read_some(asio::buffer(data_),
+ [this](std::error_code error, std::size_t n)
+ {
+ if (!error)
+ {
+ do_write(n);
+ }
+ else if (error != asio::error::eof)
+ {
+ std::cerr << "Error copying file: " << error.message() << "\n";
+ }
+ });
+ }
+
+ void do_write(std::size_t n)
+ {
+ asio::async_write(to_file_, asio::buffer(data_, n),
+ [this](std::error_code error, std::size_t /*n*/)
+ {
+ if (!error)
+ {
+ do_read();
+ }
+ else
+ {
+ std::cerr << "Error copying file: " << error.message() << "\n";
+ }
+ });
+ }
+
+ asio::stream_file from_file_;
+ asio::stream_file to_file_;
+ char data_[4096];
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: async_file_copy <from> <to>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ file_copier copier(io_context, argv[1], argv[2]);
+ copier.start();
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ return 1;
+ }
+
+ return 0;
+}
+
+#else // defined(ASIO_HAS_FILE)
+int main() {}
+#endif // defined(ASIO_HAS_FILE)
diff --git a/3rdparty/asio/src/examples/cpp11/files/blocking_file_copy.cpp b/3rdparty/asio/src/examples/cpp11/files/blocking_file_copy.cpp
new file mode 100644
index 00000000000..6e111b4909d
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/files/blocking_file_copy.cpp
@@ -0,0 +1,65 @@
+//
+// blocking_file_copy.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include "asio.hpp"
+
+#if defined(ASIO_HAS_FILE)
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: blocking_file_copy <from> <to>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ asio::stream_file from_file(io_context, argv[1],
+ asio::stream_file::read_only);
+
+ asio::stream_file to_file(io_context, argv[2],
+ asio::stream_file::write_only
+ | asio::stream_file::create
+ | asio::stream_file::truncate);
+
+ char data[4096];
+ std::error_code error;
+ for (;;)
+ {
+ std::size_t n = from_file.read_some(asio::buffer(data), error);
+ if (error)
+ break;
+ asio::write(to_file, asio::buffer(data, n), error);
+ if (error)
+ break;
+ }
+
+ if (error && error != asio::error::eof)
+ {
+ std::cerr << "Error copying file: " << error.message() << "\n";
+ return 1;
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ return 1;
+ }
+
+ return 0;
+}
+
+#else // defined(ASIO_HAS_FILE)
+int main() {}
+#endif // defined(ASIO_HAS_FILE)
diff --git a/3rdparty/asio/src/examples/cpp11/fork/daemon.cpp b/3rdparty/asio/src/examples/cpp11/fork/daemon.cpp
new file mode 100644
index 00000000000..547acb33a5a
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/fork/daemon.cpp
@@ -0,0 +1,189 @@
+//
+// daemon.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/io_context.hpp>
+#include <asio/ip/udp.hpp>
+#include <asio/signal_set.hpp>
+#include <array>
+#include <ctime>
+#include <iostream>
+#include <syslog.h>
+#include <unistd.h>
+
+using asio::ip::udp;
+
+class udp_daytime_server
+{
+public:
+ udp_daytime_server(asio::io_context& io_context)
+ : socket_(io_context, {udp::v4(), 13})
+ {
+ receive();
+ }
+
+private:
+ void receive()
+ {
+ socket_.async_receive_from(
+ asio::buffer(recv_buffer_), remote_endpoint_,
+ [this](std::error_code ec, std::size_t /*n*/)
+ {
+ if (!ec)
+ {
+ using namespace std; // For time_t, time and ctime;
+ time_t now = time(0);
+ std::string message = ctime(&now);
+
+ std::error_code ignored_ec;
+ socket_.send_to(asio::buffer(message),
+ remote_endpoint_, 0, ignored_ec);
+ }
+
+ receive();
+ });
+ }
+
+ udp::socket socket_;
+ udp::endpoint remote_endpoint_;
+ std::array<char, 1> recv_buffer_;
+};
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context;
+
+ // Initialise the server before becoming a daemon. If the process is
+ // started from a shell, this means any errors will be reported back to the
+ // user.
+ udp_daytime_server server(io_context);
+
+ // Register signal handlers so that the daemon may be shut down. You may
+ // also want to register for other signals, such as SIGHUP to trigger a
+ // re-read of a configuration file.
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait(
+ [&](std::error_code /*ec*/, int /*signo*/)
+ {
+ io_context.stop();
+ });
+
+ // Inform the io_context that we are about to become a daemon. The
+ // io_context cleans up any internal resources, such as threads, that may
+ // interfere with forking.
+ io_context.notify_fork(asio::io_context::fork_prepare);
+
+ // Fork the process and have the parent exit. If the process was started
+ // from a shell, this returns control to the user. Forking a new process is
+ // also a prerequisite for the subsequent call to setsid().
+ if (pid_t pid = fork())
+ {
+ if (pid > 0)
+ {
+ // We're in the parent process and need to exit.
+ //
+ // When the exit() function is used, the program terminates without
+ // invoking local variables' destructors. Only global variables are
+ // destroyed. As the io_context object is a local variable, this means
+ // we do not have to call:
+ //
+ // io_context.notify_fork(asio::io_context::fork_parent);
+ //
+ // However, this line should be added before each call to exit() if
+ // using a global io_context object. An additional call:
+ //
+ // io_context.notify_fork(asio::io_context::fork_prepare);
+ //
+ // should also precede the second fork().
+ exit(0);
+ }
+ else
+ {
+ syslog(LOG_ERR | LOG_USER, "First fork failed: %m");
+ return 1;
+ }
+ }
+
+ // Make the process a new session leader. This detaches it from the
+ // terminal.
+ setsid();
+
+ // A process inherits its working directory from its parent. This could be
+ // on a mounted filesystem, which means that the running daemon would
+ // prevent this filesystem from being unmounted. Changing to the root
+ // directory avoids this problem.
+ chdir("/");
+
+ // The file mode creation mask is also inherited from the parent process.
+ // We don't want to restrict the permissions on files created by the
+ // daemon, so the mask is cleared.
+ umask(0);
+
+ // A second fork ensures the process cannot acquire a controlling terminal.
+ if (pid_t pid = fork())
+ {
+ if (pid > 0)
+ {
+ exit(0);
+ }
+ else
+ {
+ syslog(LOG_ERR | LOG_USER, "Second fork failed: %m");
+ return 1;
+ }
+ }
+
+ // Close the standard streams. This decouples the daemon from the terminal
+ // that started it.
+ close(0);
+ close(1);
+ close(2);
+
+ // We don't want the daemon to have any standard input.
+ if (open("/dev/null", O_RDONLY) < 0)
+ {
+ syslog(LOG_ERR | LOG_USER, "Unable to open /dev/null: %m");
+ return 1;
+ }
+
+ // Send standard output to a log file.
+ const char* output = "/tmp/asio.daemon.out";
+ const int flags = O_WRONLY | O_CREAT | O_APPEND;
+ const mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
+ if (open(output, flags, mode) < 0)
+ {
+ syslog(LOG_ERR | LOG_USER, "Unable to open output file %s: %m", output);
+ return 1;
+ }
+
+ // Also send standard error to the same log file.
+ if (dup(1) < 0)
+ {
+ syslog(LOG_ERR | LOG_USER, "Unable to dup output descriptor: %m");
+ return 1;
+ }
+
+ // Inform the io_context that we have finished becoming a daemon. The
+ // io_context uses this opportunity to create any internal file descriptors
+ // that need to be private to the new process.
+ io_context.notify_fork(asio::io_context::fork_child);
+
+ // The io_context can now be used normally.
+ syslog(LOG_INFO | LOG_USER, "Daemon started");
+ io_context.run();
+ syslog(LOG_INFO | LOG_USER, "Daemon stopped");
+ }
+ catch (std::exception& e)
+ {
+ syslog(LOG_ERR | LOG_USER, "Exception: %s", e.what());
+ std::cerr << "Exception: " << e.what() << std::endl;
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp11/fork/process_per_connection.cpp b/3rdparty/asio/src/examples/cpp11/fork/process_per_connection.cpp
new file mode 100644
index 00000000000..cad52e7ab9f
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/fork/process_per_connection.cpp
@@ -0,0 +1,162 @@
+//
+// process_per_connection.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdlib>
+#include <iostream>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+using asio::ip::tcp;
+
+class server
+{
+public:
+ server(asio::io_context& io_context, unsigned short port)
+ : io_context_(io_context),
+ signal_(io_context, SIGCHLD),
+ acceptor_(io_context, {tcp::v4(), port}),
+ socket_(io_context)
+ {
+ wait_for_signal();
+ accept();
+ }
+
+private:
+ void wait_for_signal()
+ {
+ signal_.async_wait(
+ [this](std::error_code /*ec*/, int /*signo*/)
+ {
+ // Only the parent process should check for this signal. We can
+ // determine whether we are in the parent by checking if the acceptor
+ // is still open.
+ if (acceptor_.is_open())
+ {
+ // Reap completed child processes so that we don't end up with
+ // zombies.
+ int status = 0;
+ while (waitpid(-1, &status, WNOHANG) > 0) {}
+
+ wait_for_signal();
+ }
+ });
+ }
+
+ void accept()
+ {
+ acceptor_.async_accept(
+ [this](std::error_code ec, tcp::socket new_socket)
+ {
+ if (!ec)
+ {
+ // Take ownership of the newly accepted socket.
+ socket_ = std::move(new_socket);
+
+ // Inform the io_context that we are about to fork. The io_context
+ // cleans up any internal resources, such as threads, that may
+ // interfere with forking.
+ io_context_.notify_fork(asio::io_context::fork_prepare);
+
+ if (fork() == 0)
+ {
+ // Inform the io_context that the fork is finished and that this
+ // is the child process. The io_context uses this opportunity to
+ // create any internal file descriptors that must be private to
+ // the new process.
+ io_context_.notify_fork(asio::io_context::fork_child);
+
+ // The child won't be accepting new connections, so we can close
+ // the acceptor. It remains open in the parent.
+ acceptor_.close();
+
+ // The child process is not interested in processing the SIGCHLD
+ // signal.
+ signal_.cancel();
+
+ read();
+ }
+ else
+ {
+
+ // Inform the io_context that the fork is finished (or failed)
+ // and that this is the parent process. The io_context uses this
+ // opportunity to recreate any internal resources that were
+ // cleaned up during preparation for the fork.
+ io_context_.notify_fork(asio::io_context::fork_parent);
+
+ // The parent process can now close the newly accepted socket. It
+ // remains open in the child.
+ socket_.close();
+
+ accept();
+ }
+ }
+ else
+ {
+ std::cerr << "Accept error: " << ec.message() << std::endl;
+ accept();
+ }
+ });
+ }
+
+ void read()
+ {
+ socket_.async_read_some(asio::buffer(data_),
+ [this](std::error_code ec, std::size_t length)
+ {
+ if (!ec)
+ write(length);
+ });
+ }
+
+ void write(std::size_t length)
+ {
+ asio::async_write(socket_, asio::buffer(data_, length),
+ [this](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ read();
+ });
+ }
+
+ asio::io_context& io_context_;
+ asio::signal_set signal_;
+ tcp::acceptor acceptor_;
+ tcp::socket socket_;
+ std::array<char, 1024> data_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: process_per_connection <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ using namespace std; // For atoi.
+ server s(io_context, atoi(argv[1]));
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << std::endl;
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp11/futures/daytime_client.cpp b/3rdparty/asio/src/examples/cpp11/futures/daytime_client.cpp
new file mode 100644
index 00000000000..2f5314ede39
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/futures/daytime_client.cpp
@@ -0,0 +1,94 @@
+//
+// daytime_client.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <array>
+#include <future>
+#include <iostream>
+#include <thread>
+#include <asio/io_context.hpp>
+#include <asio/ip/udp.hpp>
+#include <asio/use_future.hpp>
+
+using asio::ip::udp;
+
+void get_daytime(asio::io_context& io_context, const char* hostname)
+{
+ try
+ {
+ udp::resolver resolver(io_context);
+
+ std::future<udp::resolver::results_type> endpoints =
+ resolver.async_resolve(
+ udp::v4(), hostname, "daytime",
+ asio::use_future);
+
+ // The async_resolve operation above returns the endpoints as a future
+ // value that is not retrieved ...
+
+ udp::socket socket(io_context, udp::v4());
+
+ std::array<char, 1> send_buf = {{ 0 }};
+ std::future<std::size_t> send_length =
+ socket.async_send_to(asio::buffer(send_buf),
+ *endpoints.get().begin(), // ... until here. This call may block.
+ asio::use_future);
+
+ // Do other things here while the send completes.
+
+ send_length.get(); // Blocks until the send is complete. Throws any errors.
+
+ std::array<char, 128> recv_buf;
+ udp::endpoint sender_endpoint;
+ std::future<std::size_t> recv_length =
+ socket.async_receive_from(
+ asio::buffer(recv_buf),
+ sender_endpoint,
+ asio::use_future);
+
+ // Do other things here while the receive completes.
+
+ std::cout.write(
+ recv_buf.data(),
+ recv_length.get()); // Blocks until receive is complete.
+ }
+ catch (std::system_error& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: daytime_client <host>" << std::endl;
+ return 1;
+ }
+
+ // We run the io_context off in its own thread so that it operates
+ // completely asynchronously with respect to the rest of the program.
+ asio::io_context io_context;
+ auto work = asio::make_work_guard(io_context);
+ std::thread thread([&io_context](){ io_context.run(); });
+
+ get_daytime(io_context, argv[1]);
+
+ io_context.stop();
+ thread.join();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/handler_tracking/async_tcp_echo_server.cpp b/3rdparty/asio/src/examples/cpp11/handler_tracking/async_tcp_echo_server.cpp
new file mode 100644
index 00000000000..42a31f7b316
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/handler_tracking/async_tcp_echo_server.cpp
@@ -0,0 +1,135 @@
+//
+// async_tcp_echo_server.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <iostream>
+#include <memory>
+#include <utility>
+#include <asio.hpp>
+
+using asio::ip::tcp;
+
+// Define a helper macro to invoke ASIO_HANDLER_LOCATION with the current
+// file name, line number, and function name. For the function name, you might
+// also consider using __PRETTY_FUNCTION__, BOOST_CURRENT_FUNCTION, or a hand-
+// crafted name. For C++20 or later, you may also use std::source_location.
+#define HANDLER_LOCATION \
+ ASIO_HANDLER_LOCATION((__FILE__, __LINE__, __func__))
+
+class session
+ : public std::enable_shared_from_this<session>
+{
+public:
+ session(tcp::socket socket)
+ : socket_(std::move(socket))
+ {
+ }
+
+ void start()
+ {
+ HANDLER_LOCATION;
+
+ do_read();
+ }
+
+private:
+ void do_read()
+ {
+ HANDLER_LOCATION;
+
+ auto self(shared_from_this());
+ socket_.async_read_some(asio::buffer(data_, max_length),
+ [this, self](std::error_code ec, std::size_t length)
+ {
+ HANDLER_LOCATION;
+
+ if (!ec)
+ {
+ do_write(length);
+ }
+ });
+ }
+
+ void do_write(std::size_t length)
+ {
+ HANDLER_LOCATION;
+
+ auto self(shared_from_this());
+ asio::async_write(socket_, asio::buffer(data_, length),
+ [this, self](std::error_code ec, std::size_t /*length*/)
+ {
+ HANDLER_LOCATION;
+
+ if (!ec)
+ {
+ do_read();
+ }
+ });
+ }
+
+ tcp::socket socket_;
+ enum { max_length = 1024 };
+ char data_[max_length];
+};
+
+class server
+{
+public:
+ server(asio::io_context& io_context, short port)
+ : acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
+ {
+ do_accept();
+ }
+
+private:
+ void do_accept()
+ {
+ HANDLER_LOCATION;
+
+ acceptor_.async_accept(
+ [this](std::error_code ec, tcp::socket socket)
+ {
+ HANDLER_LOCATION;
+
+ if (!ec)
+ {
+ std::make_shared<session>(std::move(socket))->start();
+ }
+
+ do_accept();
+ });
+ }
+
+ tcp::acceptor acceptor_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: async_tcp_echo_server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ server s(io_context, std::atoi(argv[1]));
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/handler_tracking/custom_tracking.hpp b/3rdparty/asio/src/examples/cpp11/handler_tracking/custom_tracking.hpp
new file mode 100644
index 00000000000..57b162a51e8
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/handler_tracking/custom_tracking.hpp
@@ -0,0 +1,211 @@
+//
+// custom_tracking.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef CUSTOM_TRACKING_HPP
+#define CUSTOM_TRACKING_HPP
+
+#include <cinttypes>
+#include <cstdint>
+#include <cstdio>
+
+# define ASIO_INHERIT_TRACKED_HANDLER \
+ : public ::custom_tracking::tracked_handler
+
+# define ASIO_ALSO_INHERIT_TRACKED_HANDLER \
+ , public ::custom_tracking::tracked_handler
+
+# define ASIO_HANDLER_TRACKING_INIT \
+ ::custom_tracking::init()
+
+# define ASIO_HANDLER_LOCATION(args) \
+ ::custom_tracking::location args
+
+# define ASIO_HANDLER_CREATION(args) \
+ ::custom_tracking::creation args
+
+# define ASIO_HANDLER_COMPLETION(args) \
+ ::custom_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) \
+ ::custom_tracking::operation args
+
+# define ASIO_HANDLER_REACTOR_REGISTRATION(args) \
+ ::custom_tracking::reactor_registration args
+
+# define ASIO_HANDLER_REACTOR_DEREGISTRATION(args) \
+ ::custom_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) \
+ ::custom_tracking::reactor_events args
+
+# define ASIO_HANDLER_REACTOR_OPERATION(args) \
+ ::custom_tracking::reactor_operation args
+
+struct custom_tracking
+{
+ // Base class for objects containing tracked handlers.
+ struct tracked_handler
+ {
+ std::uintmax_t handler_id_ = 0; // To uniquely identify a handler.
+ std::uintmax_t tree_id_ = 0; // To identify related handlers.
+ const char* object_type_; // The object type associated with the handler.
+ std::uintmax_t native_handle_; // Native handle, if any.
+ };
+
+ // Initialise the tracking system.
+ static void init()
+ {
+ }
+
+ // Record a source location.
+ static void location(const char* file_name,
+ int line, const char* function_name)
+ {
+ std::printf("At location %s:%d in %s\n", file_name, line, function_name);
+ }
+
+ // Record the creation of a tracked handler.
+ static void creation(asio::execution_context& /*ctx*/,
+ tracked_handler& h, const char* object_type, void* /*object*/,
+ std::uintmax_t native_handle, const char* op_name)
+ {
+ // Generate a unique id for the new handler.
+ static std::atomic<std::uintmax_t> next_handler_id{1};
+ h.handler_id_ = next_handler_id++;
+
+ // Copy the tree identifier forward from the current handler.
+ if (*current_completion())
+ h.tree_id_ = (*current_completion())->handler_.tree_id_;
+
+ // Store various attributes of the operation to use in later output.
+ h.object_type_ = object_type;
+ h.native_handle_ = native_handle;
+
+ std::printf(
+ "Starting operation %s.%s for native_handle = %" PRIuMAX
+ ", handler = %" PRIuMAX ", tree = %" PRIuMAX "\n",
+ object_type, op_name, h.native_handle_, h.handler_id_, h.tree_id_);
+ }
+
+ struct completion
+ {
+ explicit completion(const tracked_handler& h)
+ : handler_(h),
+ next_(*current_completion())
+ {
+ *current_completion() = this;
+ }
+
+ completion(const completion&) = delete;
+ completion& operator=(const completion&) = delete;
+
+ // Destructor records only when an exception is thrown from the handler, or
+ // if the memory is being freed without the handler having been invoked.
+ ~completion()
+ {
+ *current_completion() = next_;
+ }
+
+ // Records that handler is to be invoked with the specified arguments.
+ template <class... Args>
+ void invocation_begin(Args&&... /*args*/)
+ {
+ std::printf("Entering handler %" PRIuMAX " in tree %" PRIuMAX "\n",
+ handler_.handler_id_, handler_.tree_id_);
+ }
+
+ // Record that handler invocation has ended.
+ void invocation_end()
+ {
+ std::printf("Leaving handler %" PRIuMAX " in tree %" PRIuMAX "\n",
+ handler_.handler_id_, handler_.tree_id_);
+ }
+
+ tracked_handler handler_;
+
+ // Completions may nest. Here we stash a pointer to the outer completion.
+ completion* next_;
+ };
+
+ static completion** current_completion()
+ {
+ static ASIO_THREAD_KEYWORD completion* current = nullptr;
+ return &current;
+ }
+
+ // Record an operation that is not directly associated with a handler.
+ static void operation(asio::execution_context& /*ctx*/,
+ const char* /*object_type*/, void* /*object*/,
+ std::uintmax_t /*native_handle*/, const char* /*op_name*/)
+ {
+ }
+
+ // Record that a descriptor has been registered with the reactor.
+ static void reactor_registration(asio::execution_context& context,
+ uintmax_t native_handle, uintmax_t registration)
+ {
+ std::printf("Adding to reactor native_handle = %" PRIuMAX
+ ", registration = %" PRIuMAX "\n", native_handle, registration);
+ }
+
+ // Record that a descriptor has been deregistered from the reactor.
+ static void reactor_deregistration(asio::execution_context& context,
+ uintmax_t native_handle, uintmax_t registration)
+ {
+ std::printf("Removing from reactor native_handle = %" PRIuMAX
+ ", registration = %" PRIuMAX "\n", native_handle, registration);
+ }
+
+ // Record reactor-based readiness events associated with a descriptor.
+ static void reactor_events(asio::execution_context& context,
+ uintmax_t registration, unsigned events)
+ {
+ std::printf(
+ "Reactor readiness for registration = %" PRIuMAX ", events =%s%s%s\n",
+ registration,
+ (events & ASIO_HANDLER_REACTOR_READ_EVENT) ? " read" : "",
+ (events & ASIO_HANDLER_REACTOR_WRITE_EVENT) ? " write" : "",
+ (events & ASIO_HANDLER_REACTOR_ERROR_EVENT) ? " error" : "");
+ }
+
+ // Record a reactor-based operation that is associated with a handler.
+ static void reactor_operation(const tracked_handler& h,
+ const char* op_name, const std::error_code& ec)
+ {
+ std::printf(
+ "Performed operation %s.%s for native_handle = %" PRIuMAX
+ ", ec = %s:%d\n", h.object_type_, op_name, h.native_handle_,
+ ec.category().name(), ec.value());
+ }
+
+ // Record a reactor-based operation that is associated with a handler.
+ static void reactor_operation(const tracked_handler& h,
+ const char* op_name, const std::error_code& ec,
+ std::size_t bytes_transferred)
+ {
+ std::printf(
+ "Performed operation %s.%s for native_handle = %" PRIuMAX
+ ", ec = %s:%d, n = %" PRIuMAX "\n", h.object_type_, op_name,
+ h.native_handle_, ec.category().name(), ec.value(),
+ static_cast<uintmax_t>(bytes_transferred));
+ }
+};
+
+#endif // CUSTOM_TRACKING_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/client/async_client.cpp b/3rdparty/asio/src/examples/cpp11/http/client/async_client.cpp
new file mode 100644
index 00000000000..309ae252147
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/client/async_client.cpp
@@ -0,0 +1,204 @@
+//
+// async_client.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <functional>
+#include <iostream>
+#include <istream>
+#include <ostream>
+#include <string>
+#include <asio.hpp>
+
+using asio::ip::tcp;
+
+class client
+{
+public:
+ client(asio::io_context& io_context,
+ const std::string& server, const std::string& path)
+ : resolver_(io_context),
+ socket_(io_context)
+ {
+ // Form the request. We specify the "Connection: close" header so that the
+ // server will close the socket after transmitting the response. This will
+ // allow us to treat all data up until the EOF as the content.
+ std::ostream request_stream(&request_);
+ request_stream << "GET " << path << " HTTP/1.0\r\n";
+ request_stream << "Host: " << server << "\r\n";
+ request_stream << "Accept: */*\r\n";
+ request_stream << "Connection: close\r\n\r\n";
+
+ // Start an asynchronous resolve to translate the server and service names
+ // into a list of endpoints.
+ resolver_.async_resolve(server, "http",
+ std::bind(&client::handle_resolve, this,
+ asio::placeholders::error,
+ asio::placeholders::results));
+ }
+
+private:
+ void handle_resolve(const std::error_code& err,
+ const tcp::resolver::results_type& endpoints)
+ {
+ if (!err)
+ {
+ // Attempt a connection to each endpoint in the list until we
+ // successfully establish a connection.
+ asio::async_connect(socket_, endpoints,
+ std::bind(&client::handle_connect, this,
+ asio::placeholders::error));
+ }
+ else
+ {
+ std::cout << "Error: " << err.message() << "\n";
+ }
+ }
+
+ void handle_connect(const std::error_code& err)
+ {
+ if (!err)
+ {
+ // The connection was successful. Send the request.
+ asio::async_write(socket_, request_,
+ std::bind(&client::handle_write_request, this,
+ asio::placeholders::error));
+ }
+ else
+ {
+ std::cout << "Error: " << err.message() << "\n";
+ }
+ }
+
+ void handle_write_request(const std::error_code& err)
+ {
+ if (!err)
+ {
+ // Read the response status line. The response_ streambuf will
+ // automatically grow to accommodate the entire line. The growth may be
+ // limited by passing a maximum size to the streambuf constructor.
+ asio::async_read_until(socket_, response_, "\r\n",
+ std::bind(&client::handle_read_status_line, this,
+ asio::placeholders::error));
+ }
+ else
+ {
+ std::cout << "Error: " << err.message() << "\n";
+ }
+ }
+
+ void handle_read_status_line(const std::error_code& err)
+ {
+ if (!err)
+ {
+ // Check that response is OK.
+ std::istream response_stream(&response_);
+ std::string http_version;
+ response_stream >> http_version;
+ unsigned int status_code;
+ response_stream >> status_code;
+ std::string status_message;
+ std::getline(response_stream, status_message);
+ if (!response_stream || http_version.substr(0, 5) != "HTTP/")
+ {
+ std::cout << "Invalid response\n";
+ return;
+ }
+ if (status_code != 200)
+ {
+ std::cout << "Response returned with status code ";
+ std::cout << status_code << "\n";
+ return;
+ }
+
+ // Read the response headers, which are terminated by a blank line.
+ asio::async_read_until(socket_, response_, "\r\n\r\n",
+ std::bind(&client::handle_read_headers, this,
+ asio::placeholders::error));
+ }
+ else
+ {
+ std::cout << "Error: " << err << "\n";
+ }
+ }
+
+ void handle_read_headers(const std::error_code& err)
+ {
+ if (!err)
+ {
+ // Process the response headers.
+ std::istream response_stream(&response_);
+ std::string header;
+ while (std::getline(response_stream, header) && header != "\r")
+ std::cout << header << "\n";
+ std::cout << "\n";
+
+ // Write whatever content we already have to output.
+ if (response_.size() > 0)
+ std::cout << &response_;
+
+ // Start reading remaining data until EOF.
+ asio::async_read(socket_, response_,
+ asio::transfer_at_least(1),
+ std::bind(&client::handle_read_content, this,
+ asio::placeholders::error));
+ }
+ else
+ {
+ std::cout << "Error: " << err << "\n";
+ }
+ }
+
+ void handle_read_content(const std::error_code& err)
+ {
+ if (!err)
+ {
+ // Write all of the data that has been read so far.
+ std::cout << &response_;
+
+ // Continue reading remaining data until EOF.
+ asio::async_read(socket_, response_,
+ asio::transfer_at_least(1),
+ std::bind(&client::handle_read_content, this,
+ asio::placeholders::error));
+ }
+ else if (err != asio::error::eof)
+ {
+ std::cout << "Error: " << err << "\n";
+ }
+ }
+
+ tcp::resolver resolver_;
+ tcp::socket socket_;
+ asio::streambuf request_;
+ asio::streambuf response_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cout << "Usage: async_client <server> <path>\n";
+ std::cout << "Example:\n";
+ std::cout << " async_client www.boost.org /LICENSE_1_0.txt\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+ client c(io_context, argv[1], argv[2]);
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/http/client/sync_client.cpp b/3rdparty/asio/src/examples/cpp11/http/client/sync_client.cpp
new file mode 100644
index 00000000000..4f5ad099317
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/client/sync_client.cpp
@@ -0,0 +1,106 @@
+//
+// sync_client.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include <istream>
+#include <ostream>
+#include <string>
+#include <asio.hpp>
+
+using asio::ip::tcp;
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cout << "Usage: sync_client <server> <path>\n";
+ std::cout << "Example:\n";
+ std::cout << " sync_client www.boost.org /LICENSE_1_0.txt\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ // Get a list of endpoints corresponding to the server name.
+ tcp::resolver resolver(io_context);
+ tcp::resolver::results_type endpoints = resolver.resolve(argv[1], "http");
+
+ // Try each endpoint until we successfully establish a connection.
+ tcp::socket socket(io_context);
+ asio::connect(socket, endpoints);
+
+ // Form the request. We specify the "Connection: close" header so that the
+ // server will close the socket after transmitting the response. This will
+ // allow us to treat all data up until the EOF as the content.
+ asio::streambuf request;
+ std::ostream request_stream(&request);
+ request_stream << "GET " << argv[2] << " HTTP/1.0\r\n";
+ request_stream << "Host: " << argv[1] << "\r\n";
+ request_stream << "Accept: */*\r\n";
+ request_stream << "Connection: close\r\n\r\n";
+
+ // Send the request.
+ asio::write(socket, request);
+
+ // Read the response status line. The response streambuf will automatically
+ // grow to accommodate the entire line. The growth may be limited by passing
+ // a maximum size to the streambuf constructor.
+ asio::streambuf response;
+ asio::read_until(socket, response, "\r\n");
+
+ // Check that response is OK.
+ std::istream response_stream(&response);
+ std::string http_version;
+ response_stream >> http_version;
+ unsigned int status_code;
+ response_stream >> status_code;
+ std::string status_message;
+ std::getline(response_stream, status_message);
+ if (!response_stream || http_version.substr(0, 5) != "HTTP/")
+ {
+ std::cout << "Invalid response\n";
+ return 1;
+ }
+ if (status_code != 200)
+ {
+ std::cout << "Response returned with status code " << status_code << "\n";
+ return 1;
+ }
+
+ // Read the response headers, which are terminated by a blank line.
+ asio::read_until(socket, response, "\r\n\r\n");
+
+ // Process the response headers.
+ std::string header;
+ while (std::getline(response_stream, header) && header != "\r")
+ std::cout << header << "\n";
+ std::cout << "\n";
+
+ // Write whatever content we already have to output.
+ if (response.size() > 0)
+ std::cout << &response;
+
+ // Read until EOF, writing data to output as we go.
+ std::error_code error;
+ while (asio::read(socket, response,
+ asio::transfer_at_least(1), error))
+ std::cout << &response;
+ if (error != asio::error::eof)
+ throw std::system_error(error);
+ }
+ catch (std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/connection.cpp b/3rdparty/asio/src/examples/cpp11/http/server/connection.cpp
new file mode 100644
index 00000000000..58d619fec76
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/connection.cpp
@@ -0,0 +1,93 @@
+//
+// connection.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "connection.hpp"
+#include <utility>
+#include "connection_manager.hpp"
+#include "request_handler.hpp"
+
+namespace http {
+namespace server {
+
+connection::connection(asio::ip::tcp::socket socket,
+ connection_manager& manager, request_handler& handler)
+ : socket_(std::move(socket)),
+ connection_manager_(manager),
+ request_handler_(handler)
+{
+}
+
+void connection::start()
+{
+ do_read();
+}
+
+void connection::stop()
+{
+ socket_.close();
+}
+
+void connection::do_read()
+{
+ auto self(shared_from_this());
+ socket_.async_read_some(asio::buffer(buffer_),
+ [this, self](std::error_code ec, std::size_t bytes_transferred)
+ {
+ if (!ec)
+ {
+ request_parser::result_type result;
+ std::tie(result, std::ignore) = request_parser_.parse(
+ request_, buffer_.data(), buffer_.data() + bytes_transferred);
+
+ if (result == request_parser::good)
+ {
+ request_handler_.handle_request(request_, reply_);
+ do_write();
+ }
+ else if (result == request_parser::bad)
+ {
+ reply_ = reply::stock_reply(reply::bad_request);
+ do_write();
+ }
+ else
+ {
+ do_read();
+ }
+ }
+ else if (ec != asio::error::operation_aborted)
+ {
+ connection_manager_.stop(shared_from_this());
+ }
+ });
+}
+
+void connection::do_write()
+{
+ auto self(shared_from_this());
+ asio::async_write(socket_, reply_.to_buffers(),
+ [this, self](std::error_code ec, std::size_t)
+ {
+ if (!ec)
+ {
+ // Initiate graceful connection closure.
+ std::error_code ignored_ec;
+ socket_.shutdown(asio::ip::tcp::socket::shutdown_both,
+ ignored_ec);
+ }
+
+ if (ec != asio::error::operation_aborted)
+ {
+ connection_manager_.stop(shared_from_this());
+ }
+ });
+}
+
+} // namespace server
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/connection.hpp b/3rdparty/asio/src/examples/cpp11/http/server/connection.hpp
new file mode 100644
index 00000000000..1d671ebdcbe
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/connection.hpp
@@ -0,0 +1,79 @@
+//
+// connection.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_CONNECTION_HPP
+#define HTTP_CONNECTION_HPP
+
+#include <asio.hpp>
+#include <array>
+#include <memory>
+#include "reply.hpp"
+#include "request.hpp"
+#include "request_handler.hpp"
+#include "request_parser.hpp"
+
+namespace http {
+namespace server {
+
+class connection_manager;
+
+/// Represents a single connection from a client.
+class connection
+ : public std::enable_shared_from_this<connection>
+{
+public:
+ connection(const connection&) = delete;
+ connection& operator=(const connection&) = delete;
+
+ /// Construct a connection with the given socket.
+ explicit connection(asio::ip::tcp::socket socket,
+ connection_manager& manager, request_handler& handler);
+
+ /// Start the first asynchronous operation for the connection.
+ void start();
+
+ /// Stop all asynchronous operations associated with the connection.
+ void stop();
+
+private:
+ /// Perform an asynchronous read operation.
+ void do_read();
+
+ /// Perform an asynchronous write operation.
+ void do_write();
+
+ /// Socket for the connection.
+ asio::ip::tcp::socket socket_;
+
+ /// The manager for this connection.
+ connection_manager& connection_manager_;
+
+ /// The handler used to process the incoming request.
+ request_handler& request_handler_;
+
+ /// Buffer for incoming data.
+ std::array<char, 8192> buffer_;
+
+ /// The incoming request.
+ request request_;
+
+ /// The parser for the incoming request.
+ request_parser request_parser_;
+
+ /// The reply to be sent back to the client.
+ reply reply_;
+};
+
+typedef std::shared_ptr<connection> connection_ptr;
+
+} // namespace server
+} // namespace http
+
+#endif // HTTP_CONNECTION_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/connection_manager.cpp b/3rdparty/asio/src/examples/cpp11/http/server/connection_manager.cpp
new file mode 100644
index 00000000000..88161919330
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/connection_manager.cpp
@@ -0,0 +1,40 @@
+//
+// connection_manager.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "connection_manager.hpp"
+
+namespace http {
+namespace server {
+
+connection_manager::connection_manager()
+{
+}
+
+void connection_manager::start(connection_ptr c)
+{
+ connections_.insert(c);
+ c->start();
+}
+
+void connection_manager::stop(connection_ptr c)
+{
+ connections_.erase(c);
+ c->stop();
+}
+
+void connection_manager::stop_all()
+{
+ for (auto c: connections_)
+ c->stop();
+ connections_.clear();
+}
+
+} // namespace server
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/connection_manager.hpp b/3rdparty/asio/src/examples/cpp11/http/server/connection_manager.hpp
new file mode 100644
index 00000000000..0b35408fae5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/connection_manager.hpp
@@ -0,0 +1,48 @@
+//
+// connection_manager.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_CONNECTION_MANAGER_HPP
+#define HTTP_CONNECTION_MANAGER_HPP
+
+#include <set>
+#include "connection.hpp"
+
+namespace http {
+namespace server {
+
+/// Manages open connections so that they may be cleanly stopped when the server
+/// needs to shut down.
+class connection_manager
+{
+public:
+ connection_manager(const connection_manager&) = delete;
+ connection_manager& operator=(const connection_manager&) = delete;
+
+ /// Construct a connection manager.
+ connection_manager();
+
+ /// Add the specified connection to the manager and start it.
+ void start(connection_ptr c);
+
+ /// Stop the specified connection.
+ void stop(connection_ptr c);
+
+ /// Stop all connections.
+ void stop_all();
+
+private:
+ /// The managed connections.
+ std::set<connection_ptr> connections_;
+};
+
+} // namespace server
+} // namespace http
+
+#endif // HTTP_CONNECTION_MANAGER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/header.hpp b/3rdparty/asio/src/examples/cpp11/http/server/header.hpp
new file mode 100644
index 00000000000..e91e6ff23a2
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/header.hpp
@@ -0,0 +1,28 @@
+//
+// header.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_HEADER_HPP
+#define HTTP_HEADER_HPP
+
+#include <string>
+
+namespace http {
+namespace server {
+
+struct header
+{
+ std::string name;
+ std::string value;
+};
+
+} // namespace server
+} // namespace http
+
+#endif // HTTP_HEADER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/main.cpp b/3rdparty/asio/src/examples/cpp11/http/server/main.cpp
new file mode 100644
index 00000000000..b76044a96cd
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/main.cpp
@@ -0,0 +1,43 @@
+//
+// main.cpp
+// ~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include <string>
+#include <asio.hpp>
+#include "server.hpp"
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ // Check command line arguments.
+ if (argc != 4)
+ {
+ std::cerr << "Usage: http_server <address> <port> <doc_root>\n";
+ std::cerr << " For IPv4, try:\n";
+ std::cerr << " receiver 0.0.0.0 80 .\n";
+ std::cerr << " For IPv6, try:\n";
+ std::cerr << " receiver 0::0 80 .\n";
+ return 1;
+ }
+
+ // Initialise the server.
+ http::server::server s(argv[1], argv[2], argv[3]);
+
+ // Run the server until stopped.
+ s.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/mime_types.cpp b/3rdparty/asio/src/examples/cpp11/http/server/mime_types.cpp
new file mode 100644
index 00000000000..23153caa1df
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/mime_types.cpp
@@ -0,0 +1,45 @@
+//
+// mime_types.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "mime_types.hpp"
+
+namespace http {
+namespace server {
+namespace mime_types {
+
+struct mapping
+{
+ const char* extension;
+ const char* mime_type;
+} mappings[] =
+{
+ { "gif", "image/gif" },
+ { "htm", "text/html" },
+ { "html", "text/html" },
+ { "jpg", "image/jpeg" },
+ { "png", "image/png" }
+};
+
+std::string extension_to_type(const std::string& extension)
+{
+ for (mapping m: mappings)
+ {
+ if (m.extension == extension)
+ {
+ return m.mime_type;
+ }
+ }
+
+ return "text/plain";
+}
+
+} // namespace mime_types
+} // namespace server
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/mime_types.hpp b/3rdparty/asio/src/examples/cpp11/http/server/mime_types.hpp
new file mode 100644
index 00000000000..fcefce5437b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/mime_types.hpp
@@ -0,0 +1,27 @@
+//
+// mime_types.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_MIME_TYPES_HPP
+#define HTTP_MIME_TYPES_HPP
+
+#include <string>
+
+namespace http {
+namespace server {
+namespace mime_types {
+
+/// Convert a file extension into a MIME type.
+std::string extension_to_type(const std::string& extension);
+
+} // namespace mime_types
+} // namespace server
+} // namespace http
+
+#endif // HTTP_MIME_TYPES_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/reply.cpp b/3rdparty/asio/src/examples/cpp11/http/server/reply.cpp
new file mode 100644
index 00000000000..9d8f04e2ae1
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/reply.cpp
@@ -0,0 +1,255 @@
+//
+// reply.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "reply.hpp"
+#include <string>
+
+namespace http {
+namespace server {
+
+namespace status_strings {
+
+const std::string ok =
+ "HTTP/1.0 200 OK\r\n";
+const std::string created =
+ "HTTP/1.0 201 Created\r\n";
+const std::string accepted =
+ "HTTP/1.0 202 Accepted\r\n";
+const std::string no_content =
+ "HTTP/1.0 204 No Content\r\n";
+const std::string multiple_choices =
+ "HTTP/1.0 300 Multiple Choices\r\n";
+const std::string moved_permanently =
+ "HTTP/1.0 301 Moved Permanently\r\n";
+const std::string moved_temporarily =
+ "HTTP/1.0 302 Moved Temporarily\r\n";
+const std::string not_modified =
+ "HTTP/1.0 304 Not Modified\r\n";
+const std::string bad_request =
+ "HTTP/1.0 400 Bad Request\r\n";
+const std::string unauthorized =
+ "HTTP/1.0 401 Unauthorized\r\n";
+const std::string forbidden =
+ "HTTP/1.0 403 Forbidden\r\n";
+const std::string not_found =
+ "HTTP/1.0 404 Not Found\r\n";
+const std::string internal_server_error =
+ "HTTP/1.0 500 Internal Server Error\r\n";
+const std::string not_implemented =
+ "HTTP/1.0 501 Not Implemented\r\n";
+const std::string bad_gateway =
+ "HTTP/1.0 502 Bad Gateway\r\n";
+const std::string service_unavailable =
+ "HTTP/1.0 503 Service Unavailable\r\n";
+
+asio::const_buffer to_buffer(reply::status_type status)
+{
+ switch (status)
+ {
+ case reply::ok:
+ return asio::buffer(ok);
+ case reply::created:
+ return asio::buffer(created);
+ case reply::accepted:
+ return asio::buffer(accepted);
+ case reply::no_content:
+ return asio::buffer(no_content);
+ case reply::multiple_choices:
+ return asio::buffer(multiple_choices);
+ case reply::moved_permanently:
+ return asio::buffer(moved_permanently);
+ case reply::moved_temporarily:
+ return asio::buffer(moved_temporarily);
+ case reply::not_modified:
+ return asio::buffer(not_modified);
+ case reply::bad_request:
+ return asio::buffer(bad_request);
+ case reply::unauthorized:
+ return asio::buffer(unauthorized);
+ case reply::forbidden:
+ return asio::buffer(forbidden);
+ case reply::not_found:
+ return asio::buffer(not_found);
+ case reply::internal_server_error:
+ return asio::buffer(internal_server_error);
+ case reply::not_implemented:
+ return asio::buffer(not_implemented);
+ case reply::bad_gateway:
+ return asio::buffer(bad_gateway);
+ case reply::service_unavailable:
+ return asio::buffer(service_unavailable);
+ default:
+ return asio::buffer(internal_server_error);
+ }
+}
+
+} // namespace status_strings
+
+namespace misc_strings {
+
+const char name_value_separator[] = { ':', ' ' };
+const char crlf[] = { '\r', '\n' };
+
+} // namespace misc_strings
+
+std::vector<asio::const_buffer> reply::to_buffers()
+{
+ std::vector<asio::const_buffer> buffers;
+ buffers.push_back(status_strings::to_buffer(status));
+ for (std::size_t i = 0; i < headers.size(); ++i)
+ {
+ header& h = headers[i];
+ buffers.push_back(asio::buffer(h.name));
+ buffers.push_back(asio::buffer(misc_strings::name_value_separator));
+ buffers.push_back(asio::buffer(h.value));
+ buffers.push_back(asio::buffer(misc_strings::crlf));
+ }
+ buffers.push_back(asio::buffer(misc_strings::crlf));
+ buffers.push_back(asio::buffer(content));
+ return buffers;
+}
+
+namespace stock_replies {
+
+const char ok[] = "";
+const char created[] =
+ "<html>"
+ "<head><title>Created</title></head>"
+ "<body><h1>201 Created</h1></body>"
+ "</html>";
+const char accepted[] =
+ "<html>"
+ "<head><title>Accepted</title></head>"
+ "<body><h1>202 Accepted</h1></body>"
+ "</html>";
+const char no_content[] =
+ "<html>"
+ "<head><title>No Content</title></head>"
+ "<body><h1>204 Content</h1></body>"
+ "</html>";
+const char multiple_choices[] =
+ "<html>"
+ "<head><title>Multiple Choices</title></head>"
+ "<body><h1>300 Multiple Choices</h1></body>"
+ "</html>";
+const char moved_permanently[] =
+ "<html>"
+ "<head><title>Moved Permanently</title></head>"
+ "<body><h1>301 Moved Permanently</h1></body>"
+ "</html>";
+const char moved_temporarily[] =
+ "<html>"
+ "<head><title>Moved Temporarily</title></head>"
+ "<body><h1>302 Moved Temporarily</h1></body>"
+ "</html>";
+const char not_modified[] =
+ "<html>"
+ "<head><title>Not Modified</title></head>"
+ "<body><h1>304 Not Modified</h1></body>"
+ "</html>";
+const char bad_request[] =
+ "<html>"
+ "<head><title>Bad Request</title></head>"
+ "<body><h1>400 Bad Request</h1></body>"
+ "</html>";
+const char unauthorized[] =
+ "<html>"
+ "<head><title>Unauthorized</title></head>"
+ "<body><h1>401 Unauthorized</h1></body>"
+ "</html>";
+const char forbidden[] =
+ "<html>"
+ "<head><title>Forbidden</title></head>"
+ "<body><h1>403 Forbidden</h1></body>"
+ "</html>";
+const char not_found[] =
+ "<html>"
+ "<head><title>Not Found</title></head>"
+ "<body><h1>404 Not Found</h1></body>"
+ "</html>";
+const char internal_server_error[] =
+ "<html>"
+ "<head><title>Internal Server Error</title></head>"
+ "<body><h1>500 Internal Server Error</h1></body>"
+ "</html>";
+const char not_implemented[] =
+ "<html>"
+ "<head><title>Not Implemented</title></head>"
+ "<body><h1>501 Not Implemented</h1></body>"
+ "</html>";
+const char bad_gateway[] =
+ "<html>"
+ "<head><title>Bad Gateway</title></head>"
+ "<body><h1>502 Bad Gateway</h1></body>"
+ "</html>";
+const char service_unavailable[] =
+ "<html>"
+ "<head><title>Service Unavailable</title></head>"
+ "<body><h1>503 Service Unavailable</h1></body>"
+ "</html>";
+
+std::string to_string(reply::status_type status)
+{
+ switch (status)
+ {
+ case reply::ok:
+ return ok;
+ case reply::created:
+ return created;
+ case reply::accepted:
+ return accepted;
+ case reply::no_content:
+ return no_content;
+ case reply::multiple_choices:
+ return multiple_choices;
+ case reply::moved_permanently:
+ return moved_permanently;
+ case reply::moved_temporarily:
+ return moved_temporarily;
+ case reply::not_modified:
+ return not_modified;
+ case reply::bad_request:
+ return bad_request;
+ case reply::unauthorized:
+ return unauthorized;
+ case reply::forbidden:
+ return forbidden;
+ case reply::not_found:
+ return not_found;
+ case reply::internal_server_error:
+ return internal_server_error;
+ case reply::not_implemented:
+ return not_implemented;
+ case reply::bad_gateway:
+ return bad_gateway;
+ case reply::service_unavailable:
+ return service_unavailable;
+ default:
+ return internal_server_error;
+ }
+}
+
+} // namespace stock_replies
+
+reply reply::stock_reply(reply::status_type status)
+{
+ reply rep;
+ rep.status = status;
+ rep.content = stock_replies::to_string(status);
+ rep.headers.resize(2);
+ rep.headers[0].name = "Content-Length";
+ rep.headers[0].value = std::to_string(rep.content.size());
+ rep.headers[1].name = "Content-Type";
+ rep.headers[1].value = "text/html";
+ return rep;
+}
+
+} // namespace server
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/reply.hpp b/3rdparty/asio/src/examples/cpp11/http/server/reply.hpp
new file mode 100644
index 00000000000..f1eee1f891b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/reply.hpp
@@ -0,0 +1,64 @@
+//
+// reply.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_REPLY_HPP
+#define HTTP_REPLY_HPP
+
+#include <string>
+#include <vector>
+#include <asio.hpp>
+#include "header.hpp"
+
+namespace http {
+namespace server {
+
+/// A reply to be sent to a client.
+struct reply
+{
+ /// The status of the reply.
+ enum status_type
+ {
+ ok = 200,
+ created = 201,
+ accepted = 202,
+ no_content = 204,
+ multiple_choices = 300,
+ moved_permanently = 301,
+ moved_temporarily = 302,
+ not_modified = 304,
+ bad_request = 400,
+ unauthorized = 401,
+ forbidden = 403,
+ not_found = 404,
+ internal_server_error = 500,
+ not_implemented = 501,
+ bad_gateway = 502,
+ service_unavailable = 503
+ } status;
+
+ /// The headers to be included in the reply.
+ std::vector<header> headers;
+
+ /// The content to be sent in the reply.
+ std::string content;
+
+ /// Convert the reply into a vector of buffers. The buffers do not own the
+ /// underlying memory blocks, therefore the reply object must remain valid and
+ /// not be changed until the write operation has completed.
+ std::vector<asio::const_buffer> to_buffers();
+
+ /// Get a stock reply.
+ static reply stock_reply(status_type status);
+};
+
+} // namespace server
+} // namespace http
+
+#endif // HTTP_REPLY_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/request.hpp b/3rdparty/asio/src/examples/cpp11/http/server/request.hpp
new file mode 100644
index 00000000000..93a96db12b4
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/request.hpp
@@ -0,0 +1,34 @@
+//
+// request.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_REQUEST_HPP
+#define HTTP_REQUEST_HPP
+
+#include <string>
+#include <vector>
+#include "header.hpp"
+
+namespace http {
+namespace server {
+
+/// A request received from a client.
+struct request
+{
+ std::string method;
+ std::string uri;
+ int http_version_major;
+ int http_version_minor;
+ std::vector<header> headers;
+};
+
+} // namespace server
+} // namespace http
+
+#endif // HTTP_REQUEST_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/request_handler.cpp b/3rdparty/asio/src/examples/cpp11/http/server/request_handler.cpp
new file mode 100644
index 00000000000..97b4ac6a8e6
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/request_handler.cpp
@@ -0,0 +1,121 @@
+//
+// request_handler.cpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "request_handler.hpp"
+#include <fstream>
+#include <sstream>
+#include <string>
+#include "mime_types.hpp"
+#include "reply.hpp"
+#include "request.hpp"
+
+namespace http {
+namespace server {
+
+request_handler::request_handler(const std::string& doc_root)
+ : doc_root_(doc_root)
+{
+}
+
+void request_handler::handle_request(const request& req, reply& rep)
+{
+ // Decode url to path.
+ std::string request_path;
+ if (!url_decode(req.uri, request_path))
+ {
+ rep = reply::stock_reply(reply::bad_request);
+ return;
+ }
+
+ // Request path must be absolute and not contain "..".
+ if (request_path.empty() || request_path[0] != '/'
+ || request_path.find("..") != std::string::npos)
+ {
+ rep = reply::stock_reply(reply::bad_request);
+ return;
+ }
+
+ // If path ends in slash (i.e. is a directory) then add "index.html".
+ if (request_path[request_path.size() - 1] == '/')
+ {
+ request_path += "index.html";
+ }
+
+ // Determine the file extension.
+ std::size_t last_slash_pos = request_path.find_last_of("/");
+ std::size_t last_dot_pos = request_path.find_last_of(".");
+ std::string extension;
+ if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos)
+ {
+ extension = request_path.substr(last_dot_pos + 1);
+ }
+
+ // Open the file to send back.
+ std::string full_path = doc_root_ + request_path;
+ std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary);
+ if (!is)
+ {
+ rep = reply::stock_reply(reply::not_found);
+ return;
+ }
+
+ // Fill out the reply to be sent to the client.
+ rep.status = reply::ok;
+ char buf[512];
+ while (is.read(buf, sizeof(buf)).gcount() > 0)
+ rep.content.append(buf, is.gcount());
+ rep.headers.resize(2);
+ rep.headers[0].name = "Content-Length";
+ rep.headers[0].value = std::to_string(rep.content.size());
+ rep.headers[1].name = "Content-Type";
+ rep.headers[1].value = mime_types::extension_to_type(extension);
+}
+
+bool request_handler::url_decode(const std::string& in, std::string& out)
+{
+ out.clear();
+ out.reserve(in.size());
+ for (std::size_t i = 0; i < in.size(); ++i)
+ {
+ if (in[i] == '%')
+ {
+ if (i + 3 <= in.size())
+ {
+ int value = 0;
+ std::istringstream is(in.substr(i + 1, 2));
+ if (is >> std::hex >> value)
+ {
+ out += static_cast<char>(value);
+ i += 2;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else if (in[i] == '+')
+ {
+ out += ' ';
+ }
+ else
+ {
+ out += in[i];
+ }
+ }
+ return true;
+}
+
+} // namespace server
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/request_handler.hpp b/3rdparty/asio/src/examples/cpp11/http/server/request_handler.hpp
new file mode 100644
index 00000000000..978b37ca537
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/request_handler.hpp
@@ -0,0 +1,47 @@
+//
+// request_handler.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_REQUEST_HANDLER_HPP
+#define HTTP_REQUEST_HANDLER_HPP
+
+#include <string>
+
+namespace http {
+namespace server {
+
+struct reply;
+struct request;
+
+/// The common handler for all incoming requests.
+class request_handler
+{
+public:
+ request_handler(const request_handler&) = delete;
+ request_handler& operator=(const request_handler&) = delete;
+
+ /// Construct with a directory containing files to be served.
+ explicit request_handler(const std::string& doc_root);
+
+ /// Handle a request and produce a reply.
+ void handle_request(const request& req, reply& rep);
+
+private:
+ /// The directory containing the files to be served.
+ std::string doc_root_;
+
+ /// Perform URL-decoding on a string. Returns false if the encoding was
+ /// invalid.
+ static bool url_decode(const std::string& in, std::string& out);
+};
+
+} // namespace server
+} // namespace http
+
+#endif // HTTP_REQUEST_HANDLER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/request_parser.cpp b/3rdparty/asio/src/examples/cpp11/http/server/request_parser.cpp
new file mode 100644
index 00000000000..ff56e9c618a
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/request_parser.cpp
@@ -0,0 +1,315 @@
+//
+// request_parser.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "request_parser.hpp"
+#include "request.hpp"
+
+namespace http {
+namespace server {
+
+request_parser::request_parser()
+ : state_(method_start)
+{
+}
+
+void request_parser::reset()
+{
+ state_ = method_start;
+}
+
+request_parser::result_type request_parser::consume(request& req, char input)
+{
+ switch (state_)
+ {
+ case method_start:
+ if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ state_ = method;
+ req.method.push_back(input);
+ return indeterminate;
+ }
+ case method:
+ if (input == ' ')
+ {
+ state_ = uri;
+ return indeterminate;
+ }
+ else if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.method.push_back(input);
+ return indeterminate;
+ }
+ case uri:
+ if (input == ' ')
+ {
+ state_ = http_version_h;
+ return indeterminate;
+ }
+ else if (is_ctl(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.uri.push_back(input);
+ return indeterminate;
+ }
+ case http_version_h:
+ if (input == 'H')
+ {
+ state_ = http_version_t_1;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_t_1:
+ if (input == 'T')
+ {
+ state_ = http_version_t_2;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_t_2:
+ if (input == 'T')
+ {
+ state_ = http_version_p;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_p:
+ if (input == 'P')
+ {
+ state_ = http_version_slash;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_slash:
+ if (input == '/')
+ {
+ req.http_version_major = 0;
+ req.http_version_minor = 0;
+ state_ = http_version_major_start;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_major_start:
+ if (is_digit(input))
+ {
+ req.http_version_major = req.http_version_major * 10 + input - '0';
+ state_ = http_version_major;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_major:
+ if (input == '.')
+ {
+ state_ = http_version_minor_start;
+ return indeterminate;
+ }
+ else if (is_digit(input))
+ {
+ req.http_version_major = req.http_version_major * 10 + input - '0';
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_minor_start:
+ if (is_digit(input))
+ {
+ req.http_version_minor = req.http_version_minor * 10 + input - '0';
+ state_ = http_version_minor;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_minor:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_1;
+ return indeterminate;
+ }
+ else if (is_digit(input))
+ {
+ req.http_version_minor = req.http_version_minor * 10 + input - '0';
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case expecting_newline_1:
+ if (input == '\n')
+ {
+ state_ = header_line_start;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case header_line_start:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_3;
+ return indeterminate;
+ }
+ else if (!req.headers.empty() && (input == ' ' || input == '\t'))
+ {
+ state_ = header_lws;
+ return indeterminate;
+ }
+ else if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.headers.push_back(header());
+ req.headers.back().name.push_back(input);
+ state_ = header_name;
+ return indeterminate;
+ }
+ case header_lws:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_2;
+ return indeterminate;
+ }
+ else if (input == ' ' || input == '\t')
+ {
+ return indeterminate;
+ }
+ else if (is_ctl(input))
+ {
+ return bad;
+ }
+ else
+ {
+ state_ = header_value;
+ req.headers.back().value.push_back(input);
+ return indeterminate;
+ }
+ case header_name:
+ if (input == ':')
+ {
+ state_ = space_before_header_value;
+ return indeterminate;
+ }
+ else if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.headers.back().name.push_back(input);
+ return indeterminate;
+ }
+ case space_before_header_value:
+ if (input == ' ')
+ {
+ state_ = header_value;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case header_value:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_2;
+ return indeterminate;
+ }
+ else if (is_ctl(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.headers.back().value.push_back(input);
+ return indeterminate;
+ }
+ case expecting_newline_2:
+ if (input == '\n')
+ {
+ state_ = header_line_start;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case expecting_newline_3:
+ return (input == '\n') ? good : bad;
+ default:
+ return bad;
+ }
+}
+
+bool request_parser::is_char(int c)
+{
+ return c >= 0 && c <= 127;
+}
+
+bool request_parser::is_ctl(int c)
+{
+ return (c >= 0 && c <= 31) || (c == 127);
+}
+
+bool request_parser::is_tspecial(int c)
+{
+ switch (c)
+ {
+ case '(': case ')': case '<': case '>': case '@':
+ case ',': case ';': case ':': case '\\': case '"':
+ case '/': case '[': case ']': case '?': case '=':
+ case '{': case '}': case ' ': case '\t':
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool request_parser::is_digit(int c)
+{
+ return c >= '0' && c <= '9';
+}
+
+} // namespace server
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/request_parser.hpp b/3rdparty/asio/src/examples/cpp11/http/server/request_parser.hpp
new file mode 100644
index 00000000000..260e8759acb
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/request_parser.hpp
@@ -0,0 +1,96 @@
+//
+// request_parser.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_REQUEST_PARSER_HPP
+#define HTTP_REQUEST_PARSER_HPP
+
+#include <tuple>
+
+namespace http {
+namespace server {
+
+struct request;
+
+/// Parser for incoming requests.
+class request_parser
+{
+public:
+ /// Construct ready to parse the request method.
+ request_parser();
+
+ /// Reset to initial parser state.
+ void reset();
+
+ /// Result of parse.
+ enum result_type { good, bad, indeterminate };
+
+ /// Parse some data. The enum return value is good when a complete request has
+ /// been parsed, bad if the data is invalid, indeterminate when more data is
+ /// required. The InputIterator return value indicates how much of the input
+ /// has been consumed.
+ template <typename InputIterator>
+ std::tuple<result_type, InputIterator> parse(request& req,
+ InputIterator begin, InputIterator end)
+ {
+ while (begin != end)
+ {
+ result_type result = consume(req, *begin++);
+ if (result == good || result == bad)
+ return std::make_tuple(result, begin);
+ }
+ return std::make_tuple(indeterminate, begin);
+ }
+
+private:
+ /// Handle the next character of input.
+ result_type consume(request& req, char input);
+
+ /// Check if a byte is an HTTP character.
+ static bool is_char(int c);
+
+ /// Check if a byte is an HTTP control character.
+ static bool is_ctl(int c);
+
+ /// Check if a byte is defined as an HTTP tspecial character.
+ static bool is_tspecial(int c);
+
+ /// Check if a byte is a digit.
+ static bool is_digit(int c);
+
+ /// The current state of the parser.
+ enum state
+ {
+ method_start,
+ method,
+ uri,
+ http_version_h,
+ http_version_t_1,
+ http_version_t_2,
+ http_version_p,
+ http_version_slash,
+ http_version_major_start,
+ http_version_major,
+ http_version_minor_start,
+ http_version_minor,
+ expecting_newline_1,
+ header_line_start,
+ header_lws,
+ header_name,
+ space_before_header_value,
+ header_value,
+ expecting_newline_2,
+ expecting_newline_3
+ } state_;
+};
+
+} // namespace server
+} // namespace http
+
+#endif // HTTP_REQUEST_PARSER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/server.cpp b/3rdparty/asio/src/examples/cpp11/http/server/server.cpp
new file mode 100644
index 00000000000..d824ebbf229
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/server.cpp
@@ -0,0 +1,94 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "server.hpp"
+#include <signal.h>
+#include <utility>
+
+namespace http {
+namespace server {
+
+server::server(const std::string& address, const std::string& port,
+ const std::string& doc_root)
+ : io_context_(1),
+ signals_(io_context_),
+ acceptor_(io_context_),
+ connection_manager_(),
+ request_handler_(doc_root)
+{
+ // Register to handle the signals that indicate when the server should exit.
+ // It is safe to register for the same signal multiple times in a program,
+ // provided all registration for the specified signal is made through Asio.
+ signals_.add(SIGINT);
+ signals_.add(SIGTERM);
+#if defined(SIGQUIT)
+ signals_.add(SIGQUIT);
+#endif // defined(SIGQUIT)
+
+ do_await_stop();
+
+ // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
+ asio::ip::tcp::resolver resolver(io_context_);
+ asio::ip::tcp::endpoint endpoint =
+ *resolver.resolve(address, port).begin();
+ acceptor_.open(endpoint.protocol());
+ acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(true));
+ acceptor_.bind(endpoint);
+ acceptor_.listen();
+
+ do_accept();
+}
+
+void server::run()
+{
+ // The io_context::run() call will block until all asynchronous operations
+ // have finished. While the server is running, there is always at least one
+ // asynchronous operation outstanding: the asynchronous accept call waiting
+ // for new incoming connections.
+ io_context_.run();
+}
+
+void server::do_accept()
+{
+ acceptor_.async_accept(
+ [this](std::error_code ec, asio::ip::tcp::socket socket)
+ {
+ // Check whether the server was stopped by a signal before this
+ // completion handler had a chance to run.
+ if (!acceptor_.is_open())
+ {
+ return;
+ }
+
+ if (!ec)
+ {
+ connection_manager_.start(std::make_shared<connection>(
+ std::move(socket), connection_manager_, request_handler_));
+ }
+
+ do_accept();
+ });
+}
+
+void server::do_await_stop()
+{
+ signals_.async_wait(
+ [this](std::error_code /*ec*/, int /*signo*/)
+ {
+ // The server is stopped by cancelling all outstanding asynchronous
+ // operations. Once all operations have finished the io_context::run()
+ // call will exit.
+ acceptor_.close();
+ connection_manager_.stop_all();
+ });
+}
+
+} // namespace server
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server/server.hpp b/3rdparty/asio/src/examples/cpp11/http/server/server.hpp
new file mode 100644
index 00000000000..c88d0149114
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server/server.hpp
@@ -0,0 +1,64 @@
+//
+// server.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER_HPP
+#define HTTP_SERVER_HPP
+
+#include <asio.hpp>
+#include <string>
+#include "connection.hpp"
+#include "connection_manager.hpp"
+#include "request_handler.hpp"
+
+namespace http {
+namespace server {
+
+/// The top-level class of the HTTP server.
+class server
+{
+public:
+ server(const server&) = delete;
+ server& operator=(const server&) = delete;
+
+ /// Construct the server to listen on the specified TCP address and port, and
+ /// serve up files from the given directory.
+ explicit server(const std::string& address, const std::string& port,
+ const std::string& doc_root);
+
+ /// Run the server's io_context loop.
+ void run();
+
+private:
+ /// Perform an asynchronous accept operation.
+ void do_accept();
+
+ /// Wait for a request to stop the server.
+ void do_await_stop();
+
+ /// The io_context used to perform asynchronous operations.
+ asio::io_context io_context_;
+
+ /// The signal_set is used to register for process termination notifications.
+ asio::signal_set signals_;
+
+ /// Acceptor used to listen for incoming connections.
+ asio::ip::tcp::acceptor acceptor_;
+
+ /// The connection manager which owns all live connections.
+ connection_manager connection_manager_;
+
+ /// The handler for all incoming requests.
+ request_handler request_handler_;
+};
+
+} // namespace server
+} // namespace http
+
+#endif // HTTP_SERVER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/connection.cpp b/3rdparty/asio/src/examples/cpp11/http/server2/connection.cpp
new file mode 100644
index 00000000000..ab8ab9e0524
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/connection.cpp
@@ -0,0 +1,89 @@
+//
+// connection.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "connection.hpp"
+#include <utility>
+#include "request_handler.hpp"
+
+namespace http {
+namespace server2 {
+
+connection::connection(asio::ip::tcp::socket socket,
+ request_handler& handler)
+ : socket_(std::move(socket)),
+ request_handler_(handler)
+{
+}
+
+void connection::start()
+{
+ do_read();
+}
+
+void connection::do_read()
+{
+ auto self(shared_from_this());
+ socket_.async_read_some(asio::buffer(buffer_),
+ [this, self](std::error_code ec, std::size_t bytes_transferred)
+ {
+ if (!ec)
+ {
+ request_parser::result_type result;
+ std::tie(result, std::ignore) = request_parser_.parse(
+ request_, buffer_.data(), buffer_.data() + bytes_transferred);
+
+ if (result == request_parser::good)
+ {
+ request_handler_.handle_request(request_, reply_);
+ do_write();
+ }
+ else if (result == request_parser::bad)
+ {
+ reply_ = reply::stock_reply(reply::bad_request);
+ do_write();
+ }
+ else
+ {
+ do_read();
+ }
+ }
+
+ // If an error occurs then no new asynchronous operations are
+ // started. This means that all shared_ptr references to the
+ // connection object will disappear and the object will be
+ // destroyed automatically after this handler returns. The
+ // connection class's destructor closes the socket.
+ });
+}
+
+void connection::do_write()
+{
+ auto self(shared_from_this());
+ asio::async_write(socket_, reply_.to_buffers(),
+ [this, self](std::error_code ec, std::size_t)
+ {
+ if (!ec)
+ {
+ // Initiate graceful connection closure.
+ std::error_code ignored_ec;
+ socket_.shutdown(asio::ip::tcp::socket::shutdown_both,
+ ignored_ec);
+ }
+
+ // No new asynchronous operations are started. This means that
+ // all shared_ptr references to the connection object will
+ // disappear and the object will be destroyed automatically after
+ // this handler returns. The connection class's destructor closes
+ // the socket.
+ });
+}
+
+} // namespace server2
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/connection.hpp b/3rdparty/asio/src/examples/cpp11/http/server2/connection.hpp
new file mode 100644
index 00000000000..7d4a4735754
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/connection.hpp
@@ -0,0 +1,71 @@
+//
+// connection.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER2_CONNECTION_HPP
+#define HTTP_SERVER2_CONNECTION_HPP
+
+#include <asio.hpp>
+#include <array>
+#include <memory>
+#include "reply.hpp"
+#include "request.hpp"
+#include "request_handler.hpp"
+#include "request_parser.hpp"
+
+namespace http {
+namespace server2 {
+
+/// Represents a single connection from a client.
+class connection
+ : public std::enable_shared_from_this<connection>
+{
+public:
+ connection(const connection&) = delete;
+ connection& operator=(const connection&) = delete;
+
+ /// Construct a connection with the given socket.
+ explicit connection(asio::ip::tcp::socket socket,
+ request_handler& handler);
+
+ /// Start the first asynchronous operation for the connection.
+ void start();
+
+private:
+ /// Perform an asynchronous read operation.
+ void do_read();
+
+ /// Perform an asynchronous write operation.
+ void do_write();
+
+ /// Socket for the connection.
+ asio::ip::tcp::socket socket_;
+
+ /// The handler used to process the incoming request.
+ request_handler& request_handler_;
+
+ /// Buffer for incoming data.
+ std::array<char, 8192> buffer_;
+
+ /// The incoming request.
+ request request_;
+
+ /// The parser for the incoming request.
+ request_parser request_parser_;
+
+ /// The reply to be sent back to the client.
+ reply reply_;
+};
+
+typedef std::shared_ptr<connection> connection_ptr;
+
+} // namespace server2
+} // namespace http
+
+#endif // HTTP_SERVER2_CONNECTION_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/header.hpp b/3rdparty/asio/src/examples/cpp11/http/server2/header.hpp
new file mode 100644
index 00000000000..f888dde03c0
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/header.hpp
@@ -0,0 +1,28 @@
+//
+// header.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER2_HEADER_HPP
+#define HTTP_SERVER2_HEADER_HPP
+
+#include <string>
+
+namespace http {
+namespace server2 {
+
+struct header
+{
+ std::string name;
+ std::string value;
+};
+
+} // namespace server2
+} // namespace http
+
+#endif // HTTP_SERVER2_HEADER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/io_context_pool.cpp b/3rdparty/asio/src/examples/cpp11/http/server2/io_context_pool.cpp
new file mode 100644
index 00000000000..bea08903087
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/io_context_pool.cpp
@@ -0,0 +1,64 @@
+//
+// io_context_pool.cpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "server.hpp"
+#include <stdexcept>
+#include <thread>
+
+namespace http {
+namespace server2 {
+
+io_context_pool::io_context_pool(std::size_t pool_size)
+ : next_io_context_(0)
+{
+ if (pool_size == 0)
+ throw std::runtime_error("io_context_pool size is 0");
+
+ // Give all the io_contexts work to do so that their run() functions will not
+ // exit until they are explicitly stopped.
+ for (std::size_t i = 0; i < pool_size; ++i)
+ {
+ io_context_ptr io_context(new asio::io_context);
+ io_contexts_.push_back(io_context);
+ work_.push_back(asio::make_work_guard(*io_context));
+ }
+}
+
+void io_context_pool::run()
+{
+ // Create a pool of threads to run all of the io_contexts.
+ std::vector<std::thread> threads;
+ for (std::size_t i = 0; i < io_contexts_.size(); ++i)
+ threads.emplace_back([this, i]{ io_contexts_[i]->run(); });
+
+ // Wait for all threads in the pool to exit.
+ for (std::size_t i = 0; i < threads.size(); ++i)
+ threads[i].join();
+}
+
+void io_context_pool::stop()
+{
+ // Explicitly stop all io_contexts.
+ for (std::size_t i = 0; i < io_contexts_.size(); ++i)
+ io_contexts_[i]->stop();
+}
+
+asio::io_context& io_context_pool::get_io_context()
+{
+ // Use a round-robin scheme to choose the next io_context to use.
+ asio::io_context& io_context = *io_contexts_[next_io_context_];
+ ++next_io_context_;
+ if (next_io_context_ == io_contexts_.size())
+ next_io_context_ = 0;
+ return io_context;
+}
+
+} // namespace server2
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/io_context_pool.hpp b/3rdparty/asio/src/examples/cpp11/http/server2/io_context_pool.hpp
new file mode 100644
index 00000000000..0946ba6e484
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/io_context_pool.hpp
@@ -0,0 +1,59 @@
+//
+// io_context_pool.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER2_IO_SERVICE_POOL_HPP
+#define HTTP_SERVER2_IO_SERVICE_POOL_HPP
+
+#include <asio.hpp>
+#include <list>
+#include <memory>
+#include <vector>
+
+namespace http {
+namespace server2 {
+
+/// A pool of io_context objects.
+class io_context_pool
+{
+public:
+ /// Construct the io_context pool.
+ explicit io_context_pool(std::size_t pool_size);
+
+ /// Run all io_context objects in the pool.
+ void run();
+
+ /// Stop all io_context objects in the pool.
+ void stop();
+
+ /// Get an io_context to use.
+ asio::io_context& get_io_context();
+
+private:
+ io_context_pool(const io_context_pool&) = delete;
+ io_context_pool& operator=(const io_context_pool&) = delete;
+
+ typedef std::shared_ptr<asio::io_context> io_context_ptr;
+ typedef asio::executor_work_guard<
+ asio::io_context::executor_type> io_context_work;
+
+ /// The pool of io_contexts.
+ std::vector<io_context_ptr> io_contexts_;
+
+ /// The work that keeps the io_contexts running.
+ std::list<io_context_work> work_;
+
+ /// The next io_context to use for a connection.
+ std::size_t next_io_context_;
+};
+
+} // namespace server2
+} // namespace http
+
+#endif // HTTP_SERVER2_IO_SERVICE_POOL_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/main.cpp b/3rdparty/asio/src/examples/cpp11/http/server2/main.cpp
new file mode 100644
index 00000000000..5b6a9a36cb3
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/main.cpp
@@ -0,0 +1,44 @@
+//
+// main.cpp
+// ~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include <string>
+#include <asio.hpp>
+#include "server.hpp"
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ // Check command line arguments.
+ if (argc != 5)
+ {
+ std::cerr << "Usage: http_server <address> <port> <threads> <doc_root>\n";
+ std::cerr << " For IPv4, try:\n";
+ std::cerr << " receiver 0.0.0.0 80 1 .\n";
+ std::cerr << " For IPv6, try:\n";
+ std::cerr << " receiver 0::0 80 1 .\n";
+ return 1;
+ }
+
+ // Initialise the server.
+ std::size_t num_threads = std::stoi(argv[3]);
+ http::server2::server s(argv[1], argv[2], argv[4], num_threads);
+
+ // Run the server until stopped.
+ s.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/mime_types.cpp b/3rdparty/asio/src/examples/cpp11/http/server2/mime_types.cpp
new file mode 100644
index 00000000000..03079331e93
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/mime_types.cpp
@@ -0,0 +1,46 @@
+//
+// mime_types.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "mime_types.hpp"
+
+namespace http {
+namespace server2 {
+namespace mime_types {
+
+struct mapping
+{
+ const char* extension;
+ const char* mime_type;
+} mappings[] =
+{
+ { "gif", "image/gif" },
+ { "htm", "text/html" },
+ { "html", "text/html" },
+ { "jpg", "image/jpeg" },
+ { "png", "image/png" },
+ { 0, 0 } // Marks end of list.
+};
+
+std::string extension_to_type(const std::string& extension)
+{
+ for (mapping* m = mappings; m->extension; ++m)
+ {
+ if (m->extension == extension)
+ {
+ return m->mime_type;
+ }
+ }
+
+ return "text/plain";
+}
+
+} // namespace mime_types
+} // namespace server2
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/mime_types.hpp b/3rdparty/asio/src/examples/cpp11/http/server2/mime_types.hpp
new file mode 100644
index 00000000000..32985c18e59
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/mime_types.hpp
@@ -0,0 +1,27 @@
+//
+// mime_types.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER2_MIME_TYPES_HPP
+#define HTTP_SERVER2_MIME_TYPES_HPP
+
+#include <string>
+
+namespace http {
+namespace server2 {
+namespace mime_types {
+
+/// Convert a file extension into a MIME type.
+std::string extension_to_type(const std::string& extension);
+
+} // namespace mime_types
+} // namespace server2
+} // namespace http
+
+#endif // HTTP_SERVER2_MIME_TYPES_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/reply.cpp b/3rdparty/asio/src/examples/cpp11/http/server2/reply.cpp
new file mode 100644
index 00000000000..d48bfd9e463
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/reply.cpp
@@ -0,0 +1,255 @@
+//
+// reply.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "reply.hpp"
+#include <string>
+
+namespace http {
+namespace server2 {
+
+namespace status_strings {
+
+const std::string ok =
+ "HTTP/1.0 200 OK\r\n";
+const std::string created =
+ "HTTP/1.0 201 Created\r\n";
+const std::string accepted =
+ "HTTP/1.0 202 Accepted\r\n";
+const std::string no_content =
+ "HTTP/1.0 204 No Content\r\n";
+const std::string multiple_choices =
+ "HTTP/1.0 300 Multiple Choices\r\n";
+const std::string moved_permanently =
+ "HTTP/1.0 301 Moved Permanently\r\n";
+const std::string moved_temporarily =
+ "HTTP/1.0 302 Moved Temporarily\r\n";
+const std::string not_modified =
+ "HTTP/1.0 304 Not Modified\r\n";
+const std::string bad_request =
+ "HTTP/1.0 400 Bad Request\r\n";
+const std::string unauthorized =
+ "HTTP/1.0 401 Unauthorized\r\n";
+const std::string forbidden =
+ "HTTP/1.0 403 Forbidden\r\n";
+const std::string not_found =
+ "HTTP/1.0 404 Not Found\r\n";
+const std::string internal_server_error =
+ "HTTP/1.0 500 Internal Server Error\r\n";
+const std::string not_implemented =
+ "HTTP/1.0 501 Not Implemented\r\n";
+const std::string bad_gateway =
+ "HTTP/1.0 502 Bad Gateway\r\n";
+const std::string service_unavailable =
+ "HTTP/1.0 503 Service Unavailable\r\n";
+
+asio::const_buffer to_buffer(reply::status_type status)
+{
+ switch (status)
+ {
+ case reply::ok:
+ return asio::buffer(ok);
+ case reply::created:
+ return asio::buffer(created);
+ case reply::accepted:
+ return asio::buffer(accepted);
+ case reply::no_content:
+ return asio::buffer(no_content);
+ case reply::multiple_choices:
+ return asio::buffer(multiple_choices);
+ case reply::moved_permanently:
+ return asio::buffer(moved_permanently);
+ case reply::moved_temporarily:
+ return asio::buffer(moved_temporarily);
+ case reply::not_modified:
+ return asio::buffer(not_modified);
+ case reply::bad_request:
+ return asio::buffer(bad_request);
+ case reply::unauthorized:
+ return asio::buffer(unauthorized);
+ case reply::forbidden:
+ return asio::buffer(forbidden);
+ case reply::not_found:
+ return asio::buffer(not_found);
+ case reply::internal_server_error:
+ return asio::buffer(internal_server_error);
+ case reply::not_implemented:
+ return asio::buffer(not_implemented);
+ case reply::bad_gateway:
+ return asio::buffer(bad_gateway);
+ case reply::service_unavailable:
+ return asio::buffer(service_unavailable);
+ default:
+ return asio::buffer(internal_server_error);
+ }
+}
+
+} // namespace status_strings
+
+namespace misc_strings {
+
+const char name_value_separator[] = { ':', ' ' };
+const char crlf[] = { '\r', '\n' };
+
+} // namespace misc_strings
+
+std::vector<asio::const_buffer> reply::to_buffers()
+{
+ std::vector<asio::const_buffer> buffers;
+ buffers.push_back(status_strings::to_buffer(status));
+ for (std::size_t i = 0; i < headers.size(); ++i)
+ {
+ header& h = headers[i];
+ buffers.push_back(asio::buffer(h.name));
+ buffers.push_back(asio::buffer(misc_strings::name_value_separator));
+ buffers.push_back(asio::buffer(h.value));
+ buffers.push_back(asio::buffer(misc_strings::crlf));
+ }
+ buffers.push_back(asio::buffer(misc_strings::crlf));
+ buffers.push_back(asio::buffer(content));
+ return buffers;
+}
+
+namespace stock_replies {
+
+const char ok[] = "";
+const char created[] =
+ "<html>"
+ "<head><title>Created</title></head>"
+ "<body><h1>201 Created</h1></body>"
+ "</html>";
+const char accepted[] =
+ "<html>"
+ "<head><title>Accepted</title></head>"
+ "<body><h1>202 Accepted</h1></body>"
+ "</html>";
+const char no_content[] =
+ "<html>"
+ "<head><title>No Content</title></head>"
+ "<body><h1>204 Content</h1></body>"
+ "</html>";
+const char multiple_choices[] =
+ "<html>"
+ "<head><title>Multiple Choices</title></head>"
+ "<body><h1>300 Multiple Choices</h1></body>"
+ "</html>";
+const char moved_permanently[] =
+ "<html>"
+ "<head><title>Moved Permanently</title></head>"
+ "<body><h1>301 Moved Permanently</h1></body>"
+ "</html>";
+const char moved_temporarily[] =
+ "<html>"
+ "<head><title>Moved Temporarily</title></head>"
+ "<body><h1>302 Moved Temporarily</h1></body>"
+ "</html>";
+const char not_modified[] =
+ "<html>"
+ "<head><title>Not Modified</title></head>"
+ "<body><h1>304 Not Modified</h1></body>"
+ "</html>";
+const char bad_request[] =
+ "<html>"
+ "<head><title>Bad Request</title></head>"
+ "<body><h1>400 Bad Request</h1></body>"
+ "</html>";
+const char unauthorized[] =
+ "<html>"
+ "<head><title>Unauthorized</title></head>"
+ "<body><h1>401 Unauthorized</h1></body>"
+ "</html>";
+const char forbidden[] =
+ "<html>"
+ "<head><title>Forbidden</title></head>"
+ "<body><h1>403 Forbidden</h1></body>"
+ "</html>";
+const char not_found[] =
+ "<html>"
+ "<head><title>Not Found</title></head>"
+ "<body><h1>404 Not Found</h1></body>"
+ "</html>";
+const char internal_server_error[] =
+ "<html>"
+ "<head><title>Internal Server Error</title></head>"
+ "<body><h1>500 Internal Server Error</h1></body>"
+ "</html>";
+const char not_implemented[] =
+ "<html>"
+ "<head><title>Not Implemented</title></head>"
+ "<body><h1>501 Not Implemented</h1></body>"
+ "</html>";
+const char bad_gateway[] =
+ "<html>"
+ "<head><title>Bad Gateway</title></head>"
+ "<body><h1>502 Bad Gateway</h1></body>"
+ "</html>";
+const char service_unavailable[] =
+ "<html>"
+ "<head><title>Service Unavailable</title></head>"
+ "<body><h1>503 Service Unavailable</h1></body>"
+ "</html>";
+
+std::string to_string(reply::status_type status)
+{
+ switch (status)
+ {
+ case reply::ok:
+ return ok;
+ case reply::created:
+ return created;
+ case reply::accepted:
+ return accepted;
+ case reply::no_content:
+ return no_content;
+ case reply::multiple_choices:
+ return multiple_choices;
+ case reply::moved_permanently:
+ return moved_permanently;
+ case reply::moved_temporarily:
+ return moved_temporarily;
+ case reply::not_modified:
+ return not_modified;
+ case reply::bad_request:
+ return bad_request;
+ case reply::unauthorized:
+ return unauthorized;
+ case reply::forbidden:
+ return forbidden;
+ case reply::not_found:
+ return not_found;
+ case reply::internal_server_error:
+ return internal_server_error;
+ case reply::not_implemented:
+ return not_implemented;
+ case reply::bad_gateway:
+ return bad_gateway;
+ case reply::service_unavailable:
+ return service_unavailable;
+ default:
+ return internal_server_error;
+ }
+}
+
+} // namespace stock_replies
+
+reply reply::stock_reply(reply::status_type status)
+{
+ reply rep;
+ rep.status = status;
+ rep.content = stock_replies::to_string(status);
+ rep.headers.resize(2);
+ rep.headers[0].name = "Content-Length";
+ rep.headers[0].value = std::to_string(rep.content.size());
+ rep.headers[1].name = "Content-Type";
+ rep.headers[1].value = "text/html";
+ return rep;
+}
+
+} // namespace server2
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/reply.hpp b/3rdparty/asio/src/examples/cpp11/http/server2/reply.hpp
new file mode 100644
index 00000000000..f4be7ca94fe
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/reply.hpp
@@ -0,0 +1,64 @@
+//
+// reply.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER2_REPLY_HPP
+#define HTTP_SERVER2_REPLY_HPP
+
+#include <string>
+#include <vector>
+#include <asio.hpp>
+#include "header.hpp"
+
+namespace http {
+namespace server2 {
+
+/// A reply to be sent to a client.
+struct reply
+{
+ /// The status of the reply.
+ enum status_type
+ {
+ ok = 200,
+ created = 201,
+ accepted = 202,
+ no_content = 204,
+ multiple_choices = 300,
+ moved_permanently = 301,
+ moved_temporarily = 302,
+ not_modified = 304,
+ bad_request = 400,
+ unauthorized = 401,
+ forbidden = 403,
+ not_found = 404,
+ internal_server_error = 500,
+ not_implemented = 501,
+ bad_gateway = 502,
+ service_unavailable = 503
+ } status;
+
+ /// The headers to be included in the reply.
+ std::vector<header> headers;
+
+ /// The content to be sent in the reply.
+ std::string content;
+
+ /// Convert the reply into a vector of buffers. The buffers do not own the
+ /// underlying memory blocks, therefore the reply object must remain valid and
+ /// not be changed until the write operation has completed.
+ std::vector<asio::const_buffer> to_buffers();
+
+ /// Get a stock reply.
+ static reply stock_reply(status_type status);
+};
+
+} // namespace server2
+} // namespace http
+
+#endif // HTTP_SERVER2_REPLY_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/request.hpp b/3rdparty/asio/src/examples/cpp11/http/server2/request.hpp
new file mode 100644
index 00000000000..b0000b00967
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/request.hpp
@@ -0,0 +1,34 @@
+//
+// request.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER2_REQUEST_HPP
+#define HTTP_SERVER2_REQUEST_HPP
+
+#include <string>
+#include <vector>
+#include "header.hpp"
+
+namespace http {
+namespace server2 {
+
+/// A request received from a client.
+struct request
+{
+ std::string method;
+ std::string uri;
+ int http_version_major;
+ int http_version_minor;
+ std::vector<header> headers;
+};
+
+} // namespace server2
+} // namespace http
+
+#endif // HTTP_SERVER2_REQUEST_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/request_handler.cpp b/3rdparty/asio/src/examples/cpp11/http/server2/request_handler.cpp
new file mode 100644
index 00000000000..c57fa9757f5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/request_handler.cpp
@@ -0,0 +1,121 @@
+//
+// request_handler.cpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "request_handler.hpp"
+#include <fstream>
+#include <sstream>
+#include <string>
+#include "mime_types.hpp"
+#include "reply.hpp"
+#include "request.hpp"
+
+namespace http {
+namespace server2 {
+
+request_handler::request_handler(const std::string& doc_root)
+ : doc_root_(doc_root)
+{
+}
+
+void request_handler::handle_request(const request& req, reply& rep)
+{
+ // Decode url to path.
+ std::string request_path;
+ if (!url_decode(req.uri, request_path))
+ {
+ rep = reply::stock_reply(reply::bad_request);
+ return;
+ }
+
+ // Request path must be absolute and not contain "..".
+ if (request_path.empty() || request_path[0] != '/'
+ || request_path.find("..") != std::string::npos)
+ {
+ rep = reply::stock_reply(reply::bad_request);
+ return;
+ }
+
+ // If path ends in slash (i.e. is a directory) then add "index.html".
+ if (request_path[request_path.size() - 1] == '/')
+ {
+ request_path += "index.html";
+ }
+
+ // Determine the file extension.
+ std::size_t last_slash_pos = request_path.find_last_of("/");
+ std::size_t last_dot_pos = request_path.find_last_of(".");
+ std::string extension;
+ if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos)
+ {
+ extension = request_path.substr(last_dot_pos + 1);
+ }
+
+ // Open the file to send back.
+ std::string full_path = doc_root_ + request_path;
+ std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary);
+ if (!is)
+ {
+ rep = reply::stock_reply(reply::not_found);
+ return;
+ }
+
+ // Fill out the reply to be sent to the client.
+ rep.status = reply::ok;
+ char buf[512];
+ while (is.read(buf, sizeof(buf)).gcount() > 0)
+ rep.content.append(buf, is.gcount());
+ rep.headers.resize(2);
+ rep.headers[0].name = "Content-Length";
+ rep.headers[0].value = std::to_string(rep.content.size());
+ rep.headers[1].name = "Content-Type";
+ rep.headers[1].value = mime_types::extension_to_type(extension);
+}
+
+bool request_handler::url_decode(const std::string& in, std::string& out)
+{
+ out.clear();
+ out.reserve(in.size());
+ for (std::size_t i = 0; i < in.size(); ++i)
+ {
+ if (in[i] == '%')
+ {
+ if (i + 3 <= in.size())
+ {
+ int value = 0;
+ std::istringstream is(in.substr(i + 1, 2));
+ if (is >> std::hex >> value)
+ {
+ out += static_cast<char>(value);
+ i += 2;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else if (in[i] == '+')
+ {
+ out += ' ';
+ }
+ else
+ {
+ out += in[i];
+ }
+ }
+ return true;
+}
+
+} // namespace server2
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/request_handler.hpp b/3rdparty/asio/src/examples/cpp11/http/server2/request_handler.hpp
new file mode 100644
index 00000000000..c9e9ebf418f
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/request_handler.hpp
@@ -0,0 +1,47 @@
+//
+// request_handler.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER2_REQUEST_HANDLER_HPP
+#define HTTP_SERVER2_REQUEST_HANDLER_HPP
+
+#include <string>
+
+namespace http {
+namespace server2 {
+
+struct reply;
+struct request;
+
+/// The common handler for all incoming requests.
+class request_handler
+{
+public:
+ request_handler(const request_handler&) = delete;
+ request_handler& operator=(const request_handler&) = delete;
+
+ /// Construct with a directory containing files to be served.
+ explicit request_handler(const std::string& doc_root);
+
+ /// Handle a request and produce a reply.
+ void handle_request(const request& req, reply& rep);
+
+private:
+ /// The directory containing the files to be served.
+ std::string doc_root_;
+
+ /// Perform URL-decoding on a string. Returns false if the encoding was
+ /// invalid.
+ static bool url_decode(const std::string& in, std::string& out);
+};
+
+} // namespace server2
+} // namespace http
+
+#endif // HTTP_SERVER2_REQUEST_HANDLER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/request_parser.cpp b/3rdparty/asio/src/examples/cpp11/http/server2/request_parser.cpp
new file mode 100644
index 00000000000..2cd8ac00b47
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/request_parser.cpp
@@ -0,0 +1,315 @@
+//
+// request_parser.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "request_parser.hpp"
+#include "request.hpp"
+
+namespace http {
+namespace server2 {
+
+request_parser::request_parser()
+ : state_(method_start)
+{
+}
+
+void request_parser::reset()
+{
+ state_ = method_start;
+}
+
+request_parser::result_type request_parser::consume(request& req, char input)
+{
+ switch (state_)
+ {
+ case method_start:
+ if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ state_ = method;
+ req.method.push_back(input);
+ return indeterminate;
+ }
+ case method:
+ if (input == ' ')
+ {
+ state_ = uri;
+ return indeterminate;
+ }
+ else if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.method.push_back(input);
+ return indeterminate;
+ }
+ case uri:
+ if (input == ' ')
+ {
+ state_ = http_version_h;
+ return indeterminate;
+ }
+ else if (is_ctl(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.uri.push_back(input);
+ return indeterminate;
+ }
+ case http_version_h:
+ if (input == 'H')
+ {
+ state_ = http_version_t_1;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_t_1:
+ if (input == 'T')
+ {
+ state_ = http_version_t_2;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_t_2:
+ if (input == 'T')
+ {
+ state_ = http_version_p;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_p:
+ if (input == 'P')
+ {
+ state_ = http_version_slash;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_slash:
+ if (input == '/')
+ {
+ req.http_version_major = 0;
+ req.http_version_minor = 0;
+ state_ = http_version_major_start;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_major_start:
+ if (is_digit(input))
+ {
+ req.http_version_major = req.http_version_major * 10 + input - '0';
+ state_ = http_version_major;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_major:
+ if (input == '.')
+ {
+ state_ = http_version_minor_start;
+ return indeterminate;
+ }
+ else if (is_digit(input))
+ {
+ req.http_version_major = req.http_version_major * 10 + input - '0';
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_minor_start:
+ if (is_digit(input))
+ {
+ req.http_version_minor = req.http_version_minor * 10 + input - '0';
+ state_ = http_version_minor;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_minor:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_1;
+ return indeterminate;
+ }
+ else if (is_digit(input))
+ {
+ req.http_version_minor = req.http_version_minor * 10 + input - '0';
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case expecting_newline_1:
+ if (input == '\n')
+ {
+ state_ = header_line_start;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case header_line_start:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_3;
+ return indeterminate;
+ }
+ else if (!req.headers.empty() && (input == ' ' || input == '\t'))
+ {
+ state_ = header_lws;
+ return indeterminate;
+ }
+ else if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.headers.push_back(header());
+ req.headers.back().name.push_back(input);
+ state_ = header_name;
+ return indeterminate;
+ }
+ case header_lws:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_2;
+ return indeterminate;
+ }
+ else if (input == ' ' || input == '\t')
+ {
+ return indeterminate;
+ }
+ else if (is_ctl(input))
+ {
+ return bad;
+ }
+ else
+ {
+ state_ = header_value;
+ req.headers.back().value.push_back(input);
+ return indeterminate;
+ }
+ case header_name:
+ if (input == ':')
+ {
+ state_ = space_before_header_value;
+ return indeterminate;
+ }
+ else if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.headers.back().name.push_back(input);
+ return indeterminate;
+ }
+ case space_before_header_value:
+ if (input == ' ')
+ {
+ state_ = header_value;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case header_value:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_2;
+ return indeterminate;
+ }
+ else if (is_ctl(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.headers.back().value.push_back(input);
+ return indeterminate;
+ }
+ case expecting_newline_2:
+ if (input == '\n')
+ {
+ state_ = header_line_start;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case expecting_newline_3:
+ return (input == '\n') ? good : bad;
+ default:
+ return bad;
+ }
+}
+
+bool request_parser::is_char(int c)
+{
+ return c >= 0 && c <= 127;
+}
+
+bool request_parser::is_ctl(int c)
+{
+ return (c >= 0 && c <= 31) || (c == 127);
+}
+
+bool request_parser::is_tspecial(int c)
+{
+ switch (c)
+ {
+ case '(': case ')': case '<': case '>': case '@':
+ case ',': case ';': case ':': case '\\': case '"':
+ case '/': case '[': case ']': case '?': case '=':
+ case '{': case '}': case ' ': case '\t':
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool request_parser::is_digit(int c)
+{
+ return c >= '0' && c <= '9';
+}
+
+} // namespace server2
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/request_parser.hpp b/3rdparty/asio/src/examples/cpp11/http/server2/request_parser.hpp
new file mode 100644
index 00000000000..1d11168b72d
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/request_parser.hpp
@@ -0,0 +1,96 @@
+//
+// request_parser.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER2_REQUEST_PARSER_HPP
+#define HTTP_SERVER2_REQUEST_PARSER_HPP
+
+#include <tuple>
+
+namespace http {
+namespace server2 {
+
+struct request;
+
+/// Parser for incoming requests.
+class request_parser
+{
+public:
+ /// Construct ready to parse the request method.
+ request_parser();
+
+ /// Reset to initial parser state.
+ void reset();
+
+ /// Result of parse.
+ enum result_type { good, bad, indeterminate };
+
+ /// Parse some data. The enum return value is good when a complete request has
+ /// been parsed, bad if the data is invalid, indeterminate when more data is
+ /// required. The InputIterator return value indicates how much of the input
+ /// has been consumed.
+ template <typename InputIterator>
+ std::tuple<result_type, InputIterator> parse(request& req,
+ InputIterator begin, InputIterator end)
+ {
+ while (begin != end)
+ {
+ result_type result = consume(req, *begin++);
+ if (result == good || result == bad)
+ return std::make_tuple(result, begin);
+ }
+ return std::make_tuple(indeterminate, begin);
+ }
+
+private:
+ /// Handle the next character of input.
+ result_type consume(request& req, char input);
+
+ /// Check if a byte is an HTTP character.
+ static bool is_char(int c);
+
+ /// Check if a byte is an HTTP control character.
+ static bool is_ctl(int c);
+
+ /// Check if a byte is defined as an HTTP tspecial character.
+ static bool is_tspecial(int c);
+
+ /// Check if a byte is a digit.
+ static bool is_digit(int c);
+
+ /// The current state of the parser.
+ enum state
+ {
+ method_start,
+ method,
+ uri,
+ http_version_h,
+ http_version_t_1,
+ http_version_t_2,
+ http_version_p,
+ http_version_slash,
+ http_version_major_start,
+ http_version_major,
+ http_version_minor_start,
+ http_version_minor,
+ expecting_newline_1,
+ header_line_start,
+ header_lws,
+ header_name,
+ space_before_header_value,
+ header_value,
+ expecting_newline_2,
+ expecting_newline_3
+ } state_;
+};
+
+} // namespace server2
+} // namespace http
+
+#endif // HTTP_SERVER2_REQUEST_PARSER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/server.cpp b/3rdparty/asio/src/examples/cpp11/http/server2/server.cpp
new file mode 100644
index 00000000000..2ae733086a5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/server.cpp
@@ -0,0 +1,86 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "server.hpp"
+#include <signal.h>
+#include <utility>
+#include "connection.hpp"
+
+namespace http {
+namespace server2 {
+
+server::server(const std::string& address, const std::string& port,
+ const std::string& doc_root, std::size_t io_context_pool_size)
+ : io_context_pool_(io_context_pool_size),
+ signals_(io_context_pool_.get_io_context()),
+ acceptor_(io_context_pool_.get_io_context()),
+ request_handler_(doc_root)
+{
+ // Register to handle the signals that indicate when the server should exit.
+ // It is safe to register for the same signal multiple times in a program,
+ // provided all registration for the specified signal is made through Asio.
+ signals_.add(SIGINT);
+ signals_.add(SIGTERM);
+#if defined(SIGQUIT)
+ signals_.add(SIGQUIT);
+#endif // defined(SIGQUIT)
+
+ do_await_stop();
+
+ // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
+ asio::ip::tcp::resolver resolver(acceptor_.get_executor());
+ asio::ip::tcp::endpoint endpoint =
+ *resolver.resolve(address, port).begin();
+ acceptor_.open(endpoint.protocol());
+ acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(true));
+ acceptor_.bind(endpoint);
+ acceptor_.listen();
+
+ do_accept();
+}
+
+void server::run()
+{
+ io_context_pool_.run();
+}
+
+void server::do_accept()
+{
+ acceptor_.async_accept(io_context_pool_.get_io_context(),
+ [this](std::error_code ec, asio::ip::tcp::socket socket)
+ {
+ // Check whether the server was stopped by a signal before this
+ // completion handler had a chance to run.
+ if (!acceptor_.is_open())
+ {
+ return;
+ }
+
+ if (!ec)
+ {
+ std::make_shared<connection>(
+ std::move(socket), request_handler_)->start();
+ }
+
+ do_accept();
+ });
+}
+
+void server::do_await_stop()
+{
+ signals_.async_wait(
+ [this](std::error_code /*ec*/, int /*signo*/)
+ {
+ io_context_pool_.stop();
+ });
+}
+
+} // namespace server2
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server2/server.hpp b/3rdparty/asio/src/examples/cpp11/http/server2/server.hpp
new file mode 100644
index 00000000000..9d34a77ed7c
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server2/server.hpp
@@ -0,0 +1,60 @@
+//
+// server.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER2_SERVER_HPP
+#define HTTP_SERVER2_SERVER_HPP
+
+#include <asio.hpp>
+#include <string>
+#include "io_context_pool.hpp"
+#include "request_handler.hpp"
+
+namespace http {
+namespace server2 {
+
+/// The top-level class of the HTTP server.
+class server
+{
+public:
+ server(const server&) = delete;
+ server& operator=(const server&) = delete;
+
+ /// Construct the server to listen on the specified TCP address and port, and
+ /// serve up files from the given directory.
+ explicit server(const std::string& address, const std::string& port,
+ const std::string& doc_root, std::size_t io_context_pool_size);
+
+ /// Run the server's io_context loop.
+ void run();
+
+private:
+ /// Perform an asynchronous accept operation.
+ void do_accept();
+
+ /// Wait for a request to stop the server.
+ void do_await_stop();
+
+ /// The pool of io_context objects used to perform asynchronous operations.
+ io_context_pool io_context_pool_;
+
+ /// The signal_set is used to register for process termination notifications.
+ asio::signal_set signals_;
+
+ /// Acceptor used to listen for incoming connections.
+ asio::ip::tcp::acceptor acceptor_;
+
+ /// The handler for all incoming requests.
+ request_handler request_handler_;
+};
+
+} // namespace server2
+} // namespace http
+
+#endif // HTTP_SERVER2_SERVER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/connection.cpp b/3rdparty/asio/src/examples/cpp11/http/server3/connection.cpp
new file mode 100644
index 00000000000..d4070364fb4
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/connection.cpp
@@ -0,0 +1,89 @@
+//
+// connection.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "connection.hpp"
+#include <utility>
+#include "request_handler.hpp"
+
+namespace http {
+namespace server3 {
+
+connection::connection(asio::ip::tcp::socket socket,
+ request_handler& handler)
+ : socket_(std::move(socket)),
+ request_handler_(handler)
+{
+}
+
+void connection::start()
+{
+ do_read();
+}
+
+void connection::do_read()
+{
+ auto self(shared_from_this());
+ socket_.async_read_some(asio::buffer(buffer_),
+ [this, self](std::error_code ec, std::size_t bytes_transferred)
+ {
+ if (!ec)
+ {
+ request_parser::result_type result;
+ std::tie(result, std::ignore) = request_parser_.parse(
+ request_, buffer_.data(), buffer_.data() + bytes_transferred);
+
+ if (result == request_parser::good)
+ {
+ request_handler_.handle_request(request_, reply_);
+ do_write();
+ }
+ else if (result == request_parser::bad)
+ {
+ reply_ = reply::stock_reply(reply::bad_request);
+ do_write();
+ }
+ else
+ {
+ do_read();
+ }
+ }
+
+ // If an error occurs then no new asynchronous operations are
+ // started. This means that all shared_ptr references to the
+ // connection object will disappear and the object will be
+ // destroyed automatically after this handler returns. The
+ // connection class's destructor closes the socket.
+ });
+}
+
+void connection::do_write()
+{
+ auto self(shared_from_this());
+ asio::async_write(socket_, reply_.to_buffers(),
+ [this, self](std::error_code ec, std::size_t)
+ {
+ if (!ec)
+ {
+ // Initiate graceful connection closure.
+ std::error_code ignored_ec;
+ socket_.shutdown(asio::ip::tcp::socket::shutdown_both,
+ ignored_ec);
+ }
+
+ // No new asynchronous operations are started. This means that
+ // all shared_ptr references to the connection object will
+ // disappear and the object will be destroyed automatically after
+ // this handler returns. The connection class's destructor closes
+ // the socket.
+ });
+}
+
+} // namespace server3
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/connection.hpp b/3rdparty/asio/src/examples/cpp11/http/server3/connection.hpp
new file mode 100644
index 00000000000..878cd45d366
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/connection.hpp
@@ -0,0 +1,71 @@
+//
+// connection.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER3_CONNECTION_HPP
+#define HTTP_SERVER3_CONNECTION_HPP
+
+#include <asio.hpp>
+#include <array>
+#include <memory>
+#include "reply.hpp"
+#include "request.hpp"
+#include "request_handler.hpp"
+#include "request_parser.hpp"
+
+namespace http {
+namespace server3 {
+
+/// Represents a single connection from a client.
+class connection
+ : public std::enable_shared_from_this<connection>
+{
+public:
+ connection(const connection&) = delete;
+ connection& operator=(const connection&) = delete;
+
+ /// Construct a connection with the given socket.
+ explicit connection(asio::ip::tcp::socket socket,
+ request_handler& handler);
+
+ /// Start the first asynchronous operation for the connection.
+ void start();
+
+private:
+ /// Perform an asynchronous read operation.
+ void do_read();
+
+ /// Perform an asynchronous write operation.
+ void do_write();
+
+ /// Socket for the connection.
+ asio::ip::tcp::socket socket_;
+
+ /// The handler used to process the incoming request.
+ request_handler& request_handler_;
+
+ /// Buffer for incoming data.
+ std::array<char, 8192> buffer_;
+
+ /// The incoming request.
+ request request_;
+
+ /// The parser for the incoming request.
+ request_parser request_parser_;
+
+ /// The reply to be sent back to the client.
+ reply reply_;
+};
+
+typedef std::shared_ptr<connection> connection_ptr;
+
+} // namespace server3
+} // namespace http
+
+#endif // HTTP_SERVER3_CONNECTION_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/header.hpp b/3rdparty/asio/src/examples/cpp11/http/server3/header.hpp
new file mode 100644
index 00000000000..8ab5d145a6d
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/header.hpp
@@ -0,0 +1,28 @@
+//
+// header.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER3_HEADER_HPP
+#define HTTP_SERVER3_HEADER_HPP
+
+#include <string>
+
+namespace http {
+namespace server3 {
+
+struct header
+{
+ std::string name;
+ std::string value;
+};
+
+} // namespace server3
+} // namespace http
+
+#endif // HTTP_SERVER3_HEADER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/main.cpp b/3rdparty/asio/src/examples/cpp11/http/server3/main.cpp
new file mode 100644
index 00000000000..243de69bc75
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/main.cpp
@@ -0,0 +1,44 @@
+//
+// main.cpp
+// ~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include <string>
+#include <asio.hpp>
+#include "server.hpp"
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ // Check command line arguments.
+ if (argc != 5)
+ {
+ std::cerr << "Usage: http_server <address> <port> <threads> <doc_root>\n";
+ std::cerr << " For IPv4, try:\n";
+ std::cerr << " receiver 0.0.0.0 80 1 .\n";
+ std::cerr << " For IPv6, try:\n";
+ std::cerr << " receiver 0::0 80 1 .\n";
+ return 1;
+ }
+
+ // Initialise the server.
+ std::size_t num_threads = std::stoi(argv[3]);
+ http::server3::server s(argv[1], argv[2], argv[4], num_threads);
+
+ // Run the server until stopped.
+ s.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/mime_types.cpp b/3rdparty/asio/src/examples/cpp11/http/server3/mime_types.cpp
new file mode 100644
index 00000000000..d0d804c7caa
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/mime_types.cpp
@@ -0,0 +1,46 @@
+//
+// mime_types.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "mime_types.hpp"
+
+namespace http {
+namespace server3 {
+namespace mime_types {
+
+struct mapping
+{
+ const char* extension;
+ const char* mime_type;
+} mappings[] =
+{
+ { "gif", "image/gif" },
+ { "htm", "text/html" },
+ { "html", "text/html" },
+ { "jpg", "image/jpeg" },
+ { "png", "image/png" },
+ { 0, 0 } // Marks end of list.
+};
+
+std::string extension_to_type(const std::string& extension)
+{
+ for (mapping* m = mappings; m->extension; ++m)
+ {
+ if (m->extension == extension)
+ {
+ return m->mime_type;
+ }
+ }
+
+ return "text/plain";
+}
+
+} // namespace mime_types
+} // namespace server3
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/mime_types.hpp b/3rdparty/asio/src/examples/cpp11/http/server3/mime_types.hpp
new file mode 100644
index 00000000000..a144c8677e6
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/mime_types.hpp
@@ -0,0 +1,27 @@
+//
+// mime_types.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER3_MIME_TYPES_HPP
+#define HTTP_SERVER3_MIME_TYPES_HPP
+
+#include <string>
+
+namespace http {
+namespace server3 {
+namespace mime_types {
+
+/// Convert a file extension into a MIME type.
+std::string extension_to_type(const std::string& extension);
+
+} // namespace mime_types
+} // namespace server3
+} // namespace http
+
+#endif // HTTP_SERVER3_MIME_TYPES_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/reply.cpp b/3rdparty/asio/src/examples/cpp11/http/server3/reply.cpp
new file mode 100644
index 00000000000..4695d4a8da2
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/reply.cpp
@@ -0,0 +1,255 @@
+//
+// reply.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "reply.hpp"
+#include <string>
+
+namespace http {
+namespace server3 {
+
+namespace status_strings {
+
+const std::string ok =
+ "HTTP/1.0 200 OK\r\n";
+const std::string created =
+ "HTTP/1.0 201 Created\r\n";
+const std::string accepted =
+ "HTTP/1.0 202 Accepted\r\n";
+const std::string no_content =
+ "HTTP/1.0 204 No Content\r\n";
+const std::string multiple_choices =
+ "HTTP/1.0 300 Multiple Choices\r\n";
+const std::string moved_permanently =
+ "HTTP/1.0 301 Moved Permanently\r\n";
+const std::string moved_temporarily =
+ "HTTP/1.0 302 Moved Temporarily\r\n";
+const std::string not_modified =
+ "HTTP/1.0 304 Not Modified\r\n";
+const std::string bad_request =
+ "HTTP/1.0 400 Bad Request\r\n";
+const std::string unauthorized =
+ "HTTP/1.0 401 Unauthorized\r\n";
+const std::string forbidden =
+ "HTTP/1.0 403 Forbidden\r\n";
+const std::string not_found =
+ "HTTP/1.0 404 Not Found\r\n";
+const std::string internal_server_error =
+ "HTTP/1.0 500 Internal Server Error\r\n";
+const std::string not_implemented =
+ "HTTP/1.0 501 Not Implemented\r\n";
+const std::string bad_gateway =
+ "HTTP/1.0 502 Bad Gateway\r\n";
+const std::string service_unavailable =
+ "HTTP/1.0 503 Service Unavailable\r\n";
+
+asio::const_buffer to_buffer(reply::status_type status)
+{
+ switch (status)
+ {
+ case reply::ok:
+ return asio::buffer(ok);
+ case reply::created:
+ return asio::buffer(created);
+ case reply::accepted:
+ return asio::buffer(accepted);
+ case reply::no_content:
+ return asio::buffer(no_content);
+ case reply::multiple_choices:
+ return asio::buffer(multiple_choices);
+ case reply::moved_permanently:
+ return asio::buffer(moved_permanently);
+ case reply::moved_temporarily:
+ return asio::buffer(moved_temporarily);
+ case reply::not_modified:
+ return asio::buffer(not_modified);
+ case reply::bad_request:
+ return asio::buffer(bad_request);
+ case reply::unauthorized:
+ return asio::buffer(unauthorized);
+ case reply::forbidden:
+ return asio::buffer(forbidden);
+ case reply::not_found:
+ return asio::buffer(not_found);
+ case reply::internal_server_error:
+ return asio::buffer(internal_server_error);
+ case reply::not_implemented:
+ return asio::buffer(not_implemented);
+ case reply::bad_gateway:
+ return asio::buffer(bad_gateway);
+ case reply::service_unavailable:
+ return asio::buffer(service_unavailable);
+ default:
+ return asio::buffer(internal_server_error);
+ }
+}
+
+} // namespace status_strings
+
+namespace misc_strings {
+
+const char name_value_separator[] = { ':', ' ' };
+const char crlf[] = { '\r', '\n' };
+
+} // namespace misc_strings
+
+std::vector<asio::const_buffer> reply::to_buffers()
+{
+ std::vector<asio::const_buffer> buffers;
+ buffers.push_back(status_strings::to_buffer(status));
+ for (std::size_t i = 0; i < headers.size(); ++i)
+ {
+ header& h = headers[i];
+ buffers.push_back(asio::buffer(h.name));
+ buffers.push_back(asio::buffer(misc_strings::name_value_separator));
+ buffers.push_back(asio::buffer(h.value));
+ buffers.push_back(asio::buffer(misc_strings::crlf));
+ }
+ buffers.push_back(asio::buffer(misc_strings::crlf));
+ buffers.push_back(asio::buffer(content));
+ return buffers;
+}
+
+namespace stock_replies {
+
+const char ok[] = "";
+const char created[] =
+ "<html>"
+ "<head><title>Created</title></head>"
+ "<body><h1>201 Created</h1></body>"
+ "</html>";
+const char accepted[] =
+ "<html>"
+ "<head><title>Accepted</title></head>"
+ "<body><h1>202 Accepted</h1></body>"
+ "</html>";
+const char no_content[] =
+ "<html>"
+ "<head><title>No Content</title></head>"
+ "<body><h1>204 Content</h1></body>"
+ "</html>";
+const char multiple_choices[] =
+ "<html>"
+ "<head><title>Multiple Choices</title></head>"
+ "<body><h1>300 Multiple Choices</h1></body>"
+ "</html>";
+const char moved_permanently[] =
+ "<html>"
+ "<head><title>Moved Permanently</title></head>"
+ "<body><h1>301 Moved Permanently</h1></body>"
+ "</html>";
+const char moved_temporarily[] =
+ "<html>"
+ "<head><title>Moved Temporarily</title></head>"
+ "<body><h1>302 Moved Temporarily</h1></body>"
+ "</html>";
+const char not_modified[] =
+ "<html>"
+ "<head><title>Not Modified</title></head>"
+ "<body><h1>304 Not Modified</h1></body>"
+ "</html>";
+const char bad_request[] =
+ "<html>"
+ "<head><title>Bad Request</title></head>"
+ "<body><h1>400 Bad Request</h1></body>"
+ "</html>";
+const char unauthorized[] =
+ "<html>"
+ "<head><title>Unauthorized</title></head>"
+ "<body><h1>401 Unauthorized</h1></body>"
+ "</html>";
+const char forbidden[] =
+ "<html>"
+ "<head><title>Forbidden</title></head>"
+ "<body><h1>403 Forbidden</h1></body>"
+ "</html>";
+const char not_found[] =
+ "<html>"
+ "<head><title>Not Found</title></head>"
+ "<body><h1>404 Not Found</h1></body>"
+ "</html>";
+const char internal_server_error[] =
+ "<html>"
+ "<head><title>Internal Server Error</title></head>"
+ "<body><h1>500 Internal Server Error</h1></body>"
+ "</html>";
+const char not_implemented[] =
+ "<html>"
+ "<head><title>Not Implemented</title></head>"
+ "<body><h1>501 Not Implemented</h1></body>"
+ "</html>";
+const char bad_gateway[] =
+ "<html>"
+ "<head><title>Bad Gateway</title></head>"
+ "<body><h1>502 Bad Gateway</h1></body>"
+ "</html>";
+const char service_unavailable[] =
+ "<html>"
+ "<head><title>Service Unavailable</title></head>"
+ "<body><h1>503 Service Unavailable</h1></body>"
+ "</html>";
+
+std::string to_string(reply::status_type status)
+{
+ switch (status)
+ {
+ case reply::ok:
+ return ok;
+ case reply::created:
+ return created;
+ case reply::accepted:
+ return accepted;
+ case reply::no_content:
+ return no_content;
+ case reply::multiple_choices:
+ return multiple_choices;
+ case reply::moved_permanently:
+ return moved_permanently;
+ case reply::moved_temporarily:
+ return moved_temporarily;
+ case reply::not_modified:
+ return not_modified;
+ case reply::bad_request:
+ return bad_request;
+ case reply::unauthorized:
+ return unauthorized;
+ case reply::forbidden:
+ return forbidden;
+ case reply::not_found:
+ return not_found;
+ case reply::internal_server_error:
+ return internal_server_error;
+ case reply::not_implemented:
+ return not_implemented;
+ case reply::bad_gateway:
+ return bad_gateway;
+ case reply::service_unavailable:
+ return service_unavailable;
+ default:
+ return internal_server_error;
+ }
+}
+
+} // namespace stock_replies
+
+reply reply::stock_reply(reply::status_type status)
+{
+ reply rep;
+ rep.status = status;
+ rep.content = stock_replies::to_string(status);
+ rep.headers.resize(2);
+ rep.headers[0].name = "Content-Length";
+ rep.headers[0].value = std::to_string(rep.content.size());
+ rep.headers[1].name = "Content-Type";
+ rep.headers[1].value = "text/html";
+ return rep;
+}
+
+} // namespace server3
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/reply.hpp b/3rdparty/asio/src/examples/cpp11/http/server3/reply.hpp
new file mode 100644
index 00000000000..fd9c7ed9ed5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/reply.hpp
@@ -0,0 +1,64 @@
+//
+// reply.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER3_REPLY_HPP
+#define HTTP_SERVER3_REPLY_HPP
+
+#include <string>
+#include <vector>
+#include <asio.hpp>
+#include "header.hpp"
+
+namespace http {
+namespace server3 {
+
+/// A reply to be sent to a client.
+struct reply
+{
+ /// The status of the reply.
+ enum status_type
+ {
+ ok = 200,
+ created = 201,
+ accepted = 202,
+ no_content = 204,
+ multiple_choices = 300,
+ moved_permanently = 301,
+ moved_temporarily = 302,
+ not_modified = 304,
+ bad_request = 400,
+ unauthorized = 401,
+ forbidden = 403,
+ not_found = 404,
+ internal_server_error = 500,
+ not_implemented = 501,
+ bad_gateway = 502,
+ service_unavailable = 503
+ } status;
+
+ /// The headers to be included in the reply.
+ std::vector<header> headers;
+
+ /// The content to be sent in the reply.
+ std::string content;
+
+ /// Convert the reply into a vector of buffers. The buffers do not own the
+ /// underlying memory blocks, therefore the reply object must remain valid and
+ /// not be changed until the write operation has completed.
+ std::vector<asio::const_buffer> to_buffers();
+
+ /// Get a stock reply.
+ static reply stock_reply(status_type status);
+};
+
+} // namespace server3
+} // namespace http
+
+#endif // HTTP_SERVER3_REPLY_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/request.hpp b/3rdparty/asio/src/examples/cpp11/http/server3/request.hpp
new file mode 100644
index 00000000000..89a2f285b7a
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/request.hpp
@@ -0,0 +1,34 @@
+//
+// request.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER3_REQUEST_HPP
+#define HTTP_SERVER3_REQUEST_HPP
+
+#include <string>
+#include <vector>
+#include "header.hpp"
+
+namespace http {
+namespace server3 {
+
+/// A request received from a client.
+struct request
+{
+ std::string method;
+ std::string uri;
+ int http_version_major;
+ int http_version_minor;
+ std::vector<header> headers;
+};
+
+} // namespace server3
+} // namespace http
+
+#endif // HTTP_SERVER3_REQUEST_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/request_handler.cpp b/3rdparty/asio/src/examples/cpp11/http/server3/request_handler.cpp
new file mode 100644
index 00000000000..bdc6bd60892
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/request_handler.cpp
@@ -0,0 +1,121 @@
+//
+// request_handler.cpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "request_handler.hpp"
+#include <fstream>
+#include <sstream>
+#include <string>
+#include "mime_types.hpp"
+#include "reply.hpp"
+#include "request.hpp"
+
+namespace http {
+namespace server3 {
+
+request_handler::request_handler(const std::string& doc_root)
+ : doc_root_(doc_root)
+{
+}
+
+void request_handler::handle_request(const request& req, reply& rep)
+{
+ // Decode url to path.
+ std::string request_path;
+ if (!url_decode(req.uri, request_path))
+ {
+ rep = reply::stock_reply(reply::bad_request);
+ return;
+ }
+
+ // Request path must be absolute and not contain "..".
+ if (request_path.empty() || request_path[0] != '/'
+ || request_path.find("..") != std::string::npos)
+ {
+ rep = reply::stock_reply(reply::bad_request);
+ return;
+ }
+
+ // If path ends in slash (i.e. is a directory) then add "index.html".
+ if (request_path[request_path.size() - 1] == '/')
+ {
+ request_path += "index.html";
+ }
+
+ // Determine the file extension.
+ std::size_t last_slash_pos = request_path.find_last_of("/");
+ std::size_t last_dot_pos = request_path.find_last_of(".");
+ std::string extension;
+ if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos)
+ {
+ extension = request_path.substr(last_dot_pos + 1);
+ }
+
+ // Open the file to send back.
+ std::string full_path = doc_root_ + request_path;
+ std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary);
+ if (!is)
+ {
+ rep = reply::stock_reply(reply::not_found);
+ return;
+ }
+
+ // Fill out the reply to be sent to the client.
+ rep.status = reply::ok;
+ char buf[512];
+ while (is.read(buf, sizeof(buf)).gcount() > 0)
+ rep.content.append(buf, is.gcount());
+ rep.headers.resize(2);
+ rep.headers[0].name = "Content-Length";
+ rep.headers[0].value = std::to_string(rep.content.size());
+ rep.headers[1].name = "Content-Type";
+ rep.headers[1].value = mime_types::extension_to_type(extension);
+}
+
+bool request_handler::url_decode(const std::string& in, std::string& out)
+{
+ out.clear();
+ out.reserve(in.size());
+ for (std::size_t i = 0; i < in.size(); ++i)
+ {
+ if (in[i] == '%')
+ {
+ if (i + 3 <= in.size())
+ {
+ int value = 0;
+ std::istringstream is(in.substr(i + 1, 2));
+ if (is >> std::hex >> value)
+ {
+ out += static_cast<char>(value);
+ i += 2;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else if (in[i] == '+')
+ {
+ out += ' ';
+ }
+ else
+ {
+ out += in[i];
+ }
+ }
+ return true;
+}
+
+} // namespace server3
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/request_handler.hpp b/3rdparty/asio/src/examples/cpp11/http/server3/request_handler.hpp
new file mode 100644
index 00000000000..e3fe84ed0cb
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/request_handler.hpp
@@ -0,0 +1,47 @@
+//
+// request_handler.hpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER3_REQUEST_HANDLER_HPP
+#define HTTP_SERVER3_REQUEST_HANDLER_HPP
+
+#include <string>
+
+namespace http {
+namespace server3 {
+
+struct reply;
+struct request;
+
+/// The common handler for all incoming requests.
+class request_handler
+{
+public:
+ request_handler(const request_handler&) = delete;
+ request_handler& operator=(const request_handler&) = delete;
+
+ /// Construct with a directory containing files to be served.
+ explicit request_handler(const std::string& doc_root);
+
+ /// Handle a request and produce a reply.
+ void handle_request(const request& req, reply& rep);
+
+private:
+ /// The directory containing the files to be served.
+ std::string doc_root_;
+
+ /// Perform URL-decoding on a string. Returns false if the encoding was
+ /// invalid.
+ static bool url_decode(const std::string& in, std::string& out);
+};
+
+} // namespace server3
+} // namespace http
+
+#endif // HTTP_SERVER3_REQUEST_HANDLER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/request_parser.cpp b/3rdparty/asio/src/examples/cpp11/http/server3/request_parser.cpp
new file mode 100644
index 00000000000..9fb6424fad7
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/request_parser.cpp
@@ -0,0 +1,315 @@
+//
+// request_parser.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "request_parser.hpp"
+#include "request.hpp"
+
+namespace http {
+namespace server3 {
+
+request_parser::request_parser()
+ : state_(method_start)
+{
+}
+
+void request_parser::reset()
+{
+ state_ = method_start;
+}
+
+request_parser::result_type request_parser::consume(request& req, char input)
+{
+ switch (state_)
+ {
+ case method_start:
+ if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ state_ = method;
+ req.method.push_back(input);
+ return indeterminate;
+ }
+ case method:
+ if (input == ' ')
+ {
+ state_ = uri;
+ return indeterminate;
+ }
+ else if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.method.push_back(input);
+ return indeterminate;
+ }
+ case uri:
+ if (input == ' ')
+ {
+ state_ = http_version_h;
+ return indeterminate;
+ }
+ else if (is_ctl(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.uri.push_back(input);
+ return indeterminate;
+ }
+ case http_version_h:
+ if (input == 'H')
+ {
+ state_ = http_version_t_1;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_t_1:
+ if (input == 'T')
+ {
+ state_ = http_version_t_2;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_t_2:
+ if (input == 'T')
+ {
+ state_ = http_version_p;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_p:
+ if (input == 'P')
+ {
+ state_ = http_version_slash;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_slash:
+ if (input == '/')
+ {
+ req.http_version_major = 0;
+ req.http_version_minor = 0;
+ state_ = http_version_major_start;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_major_start:
+ if (is_digit(input))
+ {
+ req.http_version_major = req.http_version_major * 10 + input - '0';
+ state_ = http_version_major;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_major:
+ if (input == '.')
+ {
+ state_ = http_version_minor_start;
+ return indeterminate;
+ }
+ else if (is_digit(input))
+ {
+ req.http_version_major = req.http_version_major * 10 + input - '0';
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_minor_start:
+ if (is_digit(input))
+ {
+ req.http_version_minor = req.http_version_minor * 10 + input - '0';
+ state_ = http_version_minor;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_minor:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_1;
+ return indeterminate;
+ }
+ else if (is_digit(input))
+ {
+ req.http_version_minor = req.http_version_minor * 10 + input - '0';
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case expecting_newline_1:
+ if (input == '\n')
+ {
+ state_ = header_line_start;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case header_line_start:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_3;
+ return indeterminate;
+ }
+ else if (!req.headers.empty() && (input == ' ' || input == '\t'))
+ {
+ state_ = header_lws;
+ return indeterminate;
+ }
+ else if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.headers.push_back(header());
+ req.headers.back().name.push_back(input);
+ state_ = header_name;
+ return indeterminate;
+ }
+ case header_lws:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_2;
+ return indeterminate;
+ }
+ else if (input == ' ' || input == '\t')
+ {
+ return indeterminate;
+ }
+ else if (is_ctl(input))
+ {
+ return bad;
+ }
+ else
+ {
+ state_ = header_value;
+ req.headers.back().value.push_back(input);
+ return indeterminate;
+ }
+ case header_name:
+ if (input == ':')
+ {
+ state_ = space_before_header_value;
+ return indeterminate;
+ }
+ else if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.headers.back().name.push_back(input);
+ return indeterminate;
+ }
+ case space_before_header_value:
+ if (input == ' ')
+ {
+ state_ = header_value;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case header_value:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_2;
+ return indeterminate;
+ }
+ else if (is_ctl(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.headers.back().value.push_back(input);
+ return indeterminate;
+ }
+ case expecting_newline_2:
+ if (input == '\n')
+ {
+ state_ = header_line_start;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case expecting_newline_3:
+ return (input == '\n') ? good : bad;
+ default:
+ return bad;
+ }
+}
+
+bool request_parser::is_char(int c)
+{
+ return c >= 0 && c <= 127;
+}
+
+bool request_parser::is_ctl(int c)
+{
+ return (c >= 0 && c <= 31) || (c == 127);
+}
+
+bool request_parser::is_tspecial(int c)
+{
+ switch (c)
+ {
+ case '(': case ')': case '<': case '>': case '@':
+ case ',': case ';': case ':': case '\\': case '"':
+ case '/': case '[': case ']': case '?': case '=':
+ case '{': case '}': case ' ': case '\t':
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool request_parser::is_digit(int c)
+{
+ return c >= '0' && c <= '9';
+}
+
+} // namespace server3
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/request_parser.hpp b/3rdparty/asio/src/examples/cpp11/http/server3/request_parser.hpp
new file mode 100644
index 00000000000..a8334ed13ee
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/request_parser.hpp
@@ -0,0 +1,96 @@
+//
+// request_parser.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER3_REQUEST_PARSER_HPP
+#define HTTP_SERVER3_REQUEST_PARSER_HPP
+
+#include <tuple>
+
+namespace http {
+namespace server3 {
+
+struct request;
+
+/// Parser for incoming requests.
+class request_parser
+{
+public:
+ /// Construct ready to parse the request method.
+ request_parser();
+
+ /// Reset to initial parser state.
+ void reset();
+
+ /// Result of parse.
+ enum result_type { good, bad, indeterminate };
+
+ /// Parse some data. The enum return value is good when a complete request has
+ /// been parsed, bad if the data is invalid, indeterminate when more data is
+ /// required. The InputIterator return value indicates how much of the input
+ /// has been consumed.
+ template <typename InputIterator>
+ std::tuple<result_type, InputIterator> parse(request& req,
+ InputIterator begin, InputIterator end)
+ {
+ while (begin != end)
+ {
+ result_type result = consume(req, *begin++);
+ if (result == good || result == bad)
+ return std::make_tuple(result, begin);
+ }
+ return std::make_tuple(indeterminate, begin);
+ }
+
+private:
+ /// Handle the next character of input.
+ result_type consume(request& req, char input);
+
+ /// Check if a byte is an HTTP character.
+ static bool is_char(int c);
+
+ /// Check if a byte is an HTTP control character.
+ static bool is_ctl(int c);
+
+ /// Check if a byte is defined as an HTTP tspecial character.
+ static bool is_tspecial(int c);
+
+ /// Check if a byte is a digit.
+ static bool is_digit(int c);
+
+ /// The current state of the parser.
+ enum state
+ {
+ method_start,
+ method,
+ uri,
+ http_version_h,
+ http_version_t_1,
+ http_version_t_2,
+ http_version_p,
+ http_version_slash,
+ http_version_major_start,
+ http_version_major,
+ http_version_minor_start,
+ http_version_minor,
+ expecting_newline_1,
+ header_line_start,
+ header_lws,
+ header_name,
+ space_before_header_value,
+ header_value,
+ expecting_newline_2,
+ expecting_newline_3
+ } state_;
+};
+
+} // namespace server3
+} // namespace http
+
+#endif // HTTP_SERVER3_REQUEST_PARSER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/server.cpp b/3rdparty/asio/src/examples/cpp11/http/server3/server.cpp
new file mode 100644
index 00000000000..c8da4b4f4db
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/server.cpp
@@ -0,0 +1,97 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "server.hpp"
+#include <signal.h>
+#include <thread>
+#include <utility>
+#include <vector>
+#include "connection.hpp"
+
+namespace http {
+namespace server3 {
+
+server::server(const std::string& address, const std::string& port,
+ const std::string& doc_root, std::size_t thread_pool_size)
+ : thread_pool_size_(thread_pool_size),
+ signals_(io_context_),
+ acceptor_(io_context_),
+ request_handler_(doc_root)
+{
+ // Register to handle the signals that indicate when the server should exit.
+ // It is safe to register for the same signal multiple times in a program,
+ // provided all registration for the specified signal is made through Asio.
+ signals_.add(SIGINT);
+ signals_.add(SIGTERM);
+#if defined(SIGQUIT)
+ signals_.add(SIGQUIT);
+#endif // defined(SIGQUIT)
+
+ do_await_stop();
+
+ // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
+ asio::ip::tcp::resolver resolver(io_context_);
+ asio::ip::tcp::endpoint endpoint =
+ *resolver.resolve(address, port).begin();
+ acceptor_.open(endpoint.protocol());
+ acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(true));
+ acceptor_.bind(endpoint);
+ acceptor_.listen();
+
+ do_accept();
+}
+
+void server::run()
+{
+ // Create a pool of threads to run the io_context.
+ std::vector<std::thread> threads;
+ for (std::size_t i = 0; i < thread_pool_size_; ++i)
+ threads.emplace_back([this]{ io_context_.run(); });
+
+ // Wait for all threads in the pool to exit.
+ for (std::size_t i = 0; i < threads.size(); ++i)
+ threads[i].join();
+}
+
+void server::do_accept()
+{
+ // The newly accepted socket is put into its own strand to ensure that all
+ // completion handlers associated with the connection do not run concurrently.
+ acceptor_.async_accept(asio::make_strand(io_context_),
+ [this](std::error_code ec, asio::ip::tcp::socket socket)
+ {
+ // Check whether the server was stopped by a signal before this
+ // completion handler had a chance to run.
+ if (!acceptor_.is_open())
+ {
+ return;
+ }
+
+ if (!ec)
+ {
+ std::make_shared<connection>(
+ std::move(socket), request_handler_)->start();
+ }
+
+ do_accept();
+ });
+}
+
+void server::do_await_stop()
+{
+ signals_.async_wait(
+ [this](std::error_code /*ec*/, int /*signo*/)
+ {
+ io_context_.stop();
+ });
+}
+
+} // namespace server3
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server3/server.hpp b/3rdparty/asio/src/examples/cpp11/http/server3/server.hpp
new file mode 100644
index 00000000000..2948cadbf17
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server3/server.hpp
@@ -0,0 +1,62 @@
+//
+// server.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER3_SERVER_HPP
+#define HTTP_SERVER3_SERVER_HPP
+
+#include <asio.hpp>
+#include <string>
+#include "request_handler.hpp"
+
+namespace http {
+namespace server3 {
+
+/// The top-level class of the HTTP server.
+class server
+{
+public:
+ server(const server&) = delete;
+ server& operator=(const server&) = delete;
+
+ /// Construct the server to listen on the specified TCP address and port, and
+ /// serve up files from the given directory.
+ explicit server(const std::string& address, const std::string& port,
+ const std::string& doc_root, std::size_t thread_pool_size);
+
+ /// Run the server's io_context loop.
+ void run();
+
+private:
+ /// Perform an asynchronous accept operation.
+ void do_accept();
+
+ /// Wait for a request to stop the server.
+ void do_await_stop();
+
+ /// The number of threads that will call io_context::run().
+ std::size_t thread_pool_size_;
+
+ /// The io_context used to perform asynchronous operations.
+ asio::io_context io_context_;
+
+ /// The signal_set is used to register for process termination notifications.
+ asio::signal_set signals_;
+
+ /// Acceptor used to listen for incoming connections.
+ asio::ip::tcp::acceptor acceptor_;
+
+ /// The handler for all incoming requests.
+ request_handler request_handler_;
+};
+
+} // namespace server3
+} // namespace http
+
+#endif // HTTP_SERVER3_SERVER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/file_handler.cpp b/3rdparty/asio/src/examples/cpp11/http/server4/file_handler.cpp
new file mode 100644
index 00000000000..ad982e58b26
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/file_handler.cpp
@@ -0,0 +1,121 @@
+//
+// file_handler.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "file_handler.hpp"
+#include <fstream>
+#include <sstream>
+#include <string>
+#include "mime_types.hpp"
+#include "reply.hpp"
+#include "request.hpp"
+
+namespace http {
+namespace server4 {
+
+file_handler::file_handler(const std::string& doc_root)
+ : doc_root_(doc_root)
+{
+}
+
+void file_handler::operator()(const request& req, reply& rep)
+{
+ // Decode url to path.
+ std::string request_path;
+ if (!url_decode(req.uri, request_path))
+ {
+ rep = reply::stock_reply(reply::bad_request);
+ return;
+ }
+
+ // Request path must be absolute and not contain "..".
+ if (request_path.empty() || request_path[0] != '/'
+ || request_path.find("..") != std::string::npos)
+ {
+ rep = reply::stock_reply(reply::bad_request);
+ return;
+ }
+
+ // If path ends in slash (i.e. is a directory) then add "index.html".
+ if (request_path[request_path.size() - 1] == '/')
+ {
+ request_path += "index.html";
+ }
+
+ // Determine the file extension.
+ std::size_t last_slash_pos = request_path.find_last_of("/");
+ std::size_t last_dot_pos = request_path.find_last_of(".");
+ std::string extension;
+ if (last_dot_pos != std::string::npos && last_dot_pos > last_slash_pos)
+ {
+ extension = request_path.substr(last_dot_pos + 1);
+ }
+
+ // Open the file to send back.
+ std::string full_path = doc_root_ + request_path;
+ std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary);
+ if (!is)
+ {
+ rep = reply::stock_reply(reply::not_found);
+ return;
+ }
+
+ // Fill out the reply to be sent to the client.
+ rep.status = reply::ok;
+ char buf[512];
+ while (is.read(buf, sizeof(buf)).gcount() > 0)
+ rep.content.append(buf, is.gcount());
+ rep.headers.resize(2);
+ rep.headers[0].name = "Content-Length";
+ rep.headers[0].value = std::to_string(rep.content.size());
+ rep.headers[1].name = "Content-Type";
+ rep.headers[1].value = mime_types::extension_to_type(extension);
+}
+
+bool file_handler::url_decode(const std::string& in, std::string& out)
+{
+ out.clear();
+ out.reserve(in.size());
+ for (std::size_t i = 0; i < in.size(); ++i)
+ {
+ if (in[i] == '%')
+ {
+ if (i + 3 <= in.size())
+ {
+ int value = 0;
+ std::istringstream is(in.substr(i + 1, 2));
+ if (is >> std::hex >> value)
+ {
+ out += static_cast<char>(value);
+ i += 2;
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else
+ {
+ return false;
+ }
+ }
+ else if (in[i] == '+')
+ {
+ out += ' ';
+ }
+ else
+ {
+ out += in[i];
+ }
+ }
+ return true;
+}
+
+} // namespace server4
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/file_handler.hpp b/3rdparty/asio/src/examples/cpp11/http/server4/file_handler.hpp
new file mode 100644
index 00000000000..a16e5b6905c
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/file_handler.hpp
@@ -0,0 +1,44 @@
+//
+// file_handler.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER4_FILE_HANDLER_HPP
+#define HTTP_SERVER4_FILE_HANDLER_HPP
+
+#include <string>
+
+namespace http {
+namespace server4 {
+
+struct reply;
+struct request;
+
+/// The common handler for all incoming requests.
+class file_handler
+{
+public:
+ /// Construct with a directory containing files to be served.
+ explicit file_handler(const std::string& doc_root);
+
+ /// Handle a request and produce a reply.
+ void operator()(const request& req, reply& rep);
+
+private:
+ /// The directory containing the files to be served.
+ std::string doc_root_;
+
+ /// Perform URL-decoding on a string. Returns false if the encoding was
+ /// invalid.
+ static bool url_decode(const std::string& in, std::string& out);
+};
+
+} // namespace server4
+} // namespace http
+
+#endif // HTTP_SERVER4_FILE_HANDLER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/header.hpp b/3rdparty/asio/src/examples/cpp11/http/server4/header.hpp
new file mode 100644
index 00000000000..a4148e5d910
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/header.hpp
@@ -0,0 +1,28 @@
+//
+// header.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER4_HEADER_HPP
+#define HTTP_SERVER4_HEADER_HPP
+
+#include <string>
+
+namespace http {
+namespace server4 {
+
+struct header
+{
+ std::string name;
+ std::string value;
+};
+
+} // namespace server4
+} // namespace http
+
+#endif // HTTP_SERVER4_HEADER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/main.cpp b/3rdparty/asio/src/examples/cpp11/http/server4/main.cpp
new file mode 100644
index 00000000000..29706e6a335
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/main.cpp
@@ -0,0 +1,60 @@
+//
+// main.cpp
+// ~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include <asio.hpp>
+#include <signal.h>
+#include "server.hpp"
+#include "file_handler.hpp"
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ // Check command line arguments.
+ if (argc != 4)
+ {
+ std::cerr << "Usage: http_server <address> <port> <doc_root>\n";
+ std::cerr << " For IPv4, try:\n";
+ std::cerr << " receiver 0.0.0.0 80 .\n";
+ std::cerr << " For IPv6, try:\n";
+ std::cerr << " receiver 0::0 80 .\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ // Launch the initial server coroutine.
+ http::server4::server(io_context, argv[1], argv[2],
+ http::server4::file_handler(argv[3]))();
+
+ // Wait for signals indicating time to shut down.
+ asio::signal_set signals(io_context);
+ signals.add(SIGINT);
+ signals.add(SIGTERM);
+#if defined(SIGQUIT)
+ signals.add(SIGQUIT);
+#endif // defined(SIGQUIT)
+ signals.async_wait(
+ [&io_context](std::error_code, int)
+ {
+ io_context.stop();
+ });
+
+ // Run the server.
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/mime_types.cpp b/3rdparty/asio/src/examples/cpp11/http/server4/mime_types.cpp
new file mode 100644
index 00000000000..6cf11e383d8
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/mime_types.cpp
@@ -0,0 +1,46 @@
+//
+// mime_types.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "mime_types.hpp"
+
+namespace http {
+namespace server4 {
+namespace mime_types {
+
+struct mapping
+{
+ const char* extension;
+ const char* mime_type;
+} mappings[] =
+{
+ { "gif", "image/gif" },
+ { "htm", "text/html" },
+ { "html", "text/html" },
+ { "jpg", "image/jpeg" },
+ { "png", "image/png" },
+ { 0, 0 } // Marks end of list.
+};
+
+std::string extension_to_type(const std::string& extension)
+{
+ for (mapping* m = mappings; m->extension; ++m)
+ {
+ if (m->extension == extension)
+ {
+ return m->mime_type;
+ }
+ }
+
+ return "text/plain";
+}
+
+} // namespace mime_types
+} // namespace server4
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/mime_types.hpp b/3rdparty/asio/src/examples/cpp11/http/server4/mime_types.hpp
new file mode 100644
index 00000000000..6086fce22eb
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/mime_types.hpp
@@ -0,0 +1,27 @@
+//
+// mime_types.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER4_MIME_TYPES_HPP
+#define HTTP_SERVER4_MIME_TYPES_HPP
+
+#include <string>
+
+namespace http {
+namespace server4 {
+namespace mime_types {
+
+/// Convert a file extension into a MIME type.
+std::string extension_to_type(const std::string& extension);
+
+} // namespace mime_types
+} // namespace server4
+} // namespace http
+
+#endif // HTTP_SERVER4_MIME_TYPES_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/reply.cpp b/3rdparty/asio/src/examples/cpp11/http/server4/reply.cpp
new file mode 100644
index 00000000000..4e5752ea7d0
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/reply.cpp
@@ -0,0 +1,255 @@
+//
+// reply.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "reply.hpp"
+#include <string>
+
+namespace http {
+namespace server4 {
+
+namespace status_strings {
+
+const std::string ok =
+ "HTTP/1.0 200 OK\r\n";
+const std::string created =
+ "HTTP/1.0 201 Created\r\n";
+const std::string accepted =
+ "HTTP/1.0 202 Accepted\r\n";
+const std::string no_content =
+ "HTTP/1.0 204 No Content\r\n";
+const std::string multiple_choices =
+ "HTTP/1.0 300 Multiple Choices\r\n";
+const std::string moved_permanently =
+ "HTTP/1.0 301 Moved Permanently\r\n";
+const std::string moved_temporarily =
+ "HTTP/1.0 302 Moved Temporarily\r\n";
+const std::string not_modified =
+ "HTTP/1.0 304 Not Modified\r\n";
+const std::string bad_request =
+ "HTTP/1.0 400 Bad Request\r\n";
+const std::string unauthorized =
+ "HTTP/1.0 401 Unauthorized\r\n";
+const std::string forbidden =
+ "HTTP/1.0 403 Forbidden\r\n";
+const std::string not_found =
+ "HTTP/1.0 404 Not Found\r\n";
+const std::string internal_server_error =
+ "HTTP/1.0 500 Internal Server Error\r\n";
+const std::string not_implemented =
+ "HTTP/1.0 501 Not Implemented\r\n";
+const std::string bad_gateway =
+ "HTTP/1.0 502 Bad Gateway\r\n";
+const std::string service_unavailable =
+ "HTTP/1.0 503 Service Unavailable\r\n";
+
+asio::const_buffer to_buffer(reply::status_type status)
+{
+ switch (status)
+ {
+ case reply::ok:
+ return asio::buffer(ok);
+ case reply::created:
+ return asio::buffer(created);
+ case reply::accepted:
+ return asio::buffer(accepted);
+ case reply::no_content:
+ return asio::buffer(no_content);
+ case reply::multiple_choices:
+ return asio::buffer(multiple_choices);
+ case reply::moved_permanently:
+ return asio::buffer(moved_permanently);
+ case reply::moved_temporarily:
+ return asio::buffer(moved_temporarily);
+ case reply::not_modified:
+ return asio::buffer(not_modified);
+ case reply::bad_request:
+ return asio::buffer(bad_request);
+ case reply::unauthorized:
+ return asio::buffer(unauthorized);
+ case reply::forbidden:
+ return asio::buffer(forbidden);
+ case reply::not_found:
+ return asio::buffer(not_found);
+ case reply::internal_server_error:
+ return asio::buffer(internal_server_error);
+ case reply::not_implemented:
+ return asio::buffer(not_implemented);
+ case reply::bad_gateway:
+ return asio::buffer(bad_gateway);
+ case reply::service_unavailable:
+ return asio::buffer(service_unavailable);
+ default:
+ return asio::buffer(internal_server_error);
+ }
+}
+
+} // namespace status_strings
+
+namespace misc_strings {
+
+const char name_value_separator[] = { ':', ' ' };
+const char crlf[] = { '\r', '\n' };
+
+} // namespace misc_strings
+
+std::vector<asio::const_buffer> reply::to_buffers()
+{
+ std::vector<asio::const_buffer> buffers;
+ buffers.push_back(status_strings::to_buffer(status));
+ for (std::size_t i = 0; i < headers.size(); ++i)
+ {
+ header& h = headers[i];
+ buffers.push_back(asio::buffer(h.name));
+ buffers.push_back(asio::buffer(misc_strings::name_value_separator));
+ buffers.push_back(asio::buffer(h.value));
+ buffers.push_back(asio::buffer(misc_strings::crlf));
+ }
+ buffers.push_back(asio::buffer(misc_strings::crlf));
+ buffers.push_back(asio::buffer(content));
+ return buffers;
+}
+
+namespace stock_replies {
+
+const char ok[] = "";
+const char created[] =
+ "<html>"
+ "<head><title>Created</title></head>"
+ "<body><h1>201 Created</h1></body>"
+ "</html>";
+const char accepted[] =
+ "<html>"
+ "<head><title>Accepted</title></head>"
+ "<body><h1>202 Accepted</h1></body>"
+ "</html>";
+const char no_content[] =
+ "<html>"
+ "<head><title>No Content</title></head>"
+ "<body><h1>204 Content</h1></body>"
+ "</html>";
+const char multiple_choices[] =
+ "<html>"
+ "<head><title>Multiple Choices</title></head>"
+ "<body><h1>300 Multiple Choices</h1></body>"
+ "</html>";
+const char moved_permanently[] =
+ "<html>"
+ "<head><title>Moved Permanently</title></head>"
+ "<body><h1>301 Moved Permanently</h1></body>"
+ "</html>";
+const char moved_temporarily[] =
+ "<html>"
+ "<head><title>Moved Temporarily</title></head>"
+ "<body><h1>302 Moved Temporarily</h1></body>"
+ "</html>";
+const char not_modified[] =
+ "<html>"
+ "<head><title>Not Modified</title></head>"
+ "<body><h1>304 Not Modified</h1></body>"
+ "</html>";
+const char bad_request[] =
+ "<html>"
+ "<head><title>Bad Request</title></head>"
+ "<body><h1>400 Bad Request</h1></body>"
+ "</html>";
+const char unauthorized[] =
+ "<html>"
+ "<head><title>Unauthorized</title></head>"
+ "<body><h1>401 Unauthorized</h1></body>"
+ "</html>";
+const char forbidden[] =
+ "<html>"
+ "<head><title>Forbidden</title></head>"
+ "<body><h1>403 Forbidden</h1></body>"
+ "</html>";
+const char not_found[] =
+ "<html>"
+ "<head><title>Not Found</title></head>"
+ "<body><h1>404 Not Found</h1></body>"
+ "</html>";
+const char internal_server_error[] =
+ "<html>"
+ "<head><title>Internal Server Error</title></head>"
+ "<body><h1>500 Internal Server Error</h1></body>"
+ "</html>";
+const char not_implemented[] =
+ "<html>"
+ "<head><title>Not Implemented</title></head>"
+ "<body><h1>501 Not Implemented</h1></body>"
+ "</html>";
+const char bad_gateway[] =
+ "<html>"
+ "<head><title>Bad Gateway</title></head>"
+ "<body><h1>502 Bad Gateway</h1></body>"
+ "</html>";
+const char service_unavailable[] =
+ "<html>"
+ "<head><title>Service Unavailable</title></head>"
+ "<body><h1>503 Service Unavailable</h1></body>"
+ "</html>";
+
+std::string to_string(reply::status_type status)
+{
+ switch (status)
+ {
+ case reply::ok:
+ return ok;
+ case reply::created:
+ return created;
+ case reply::accepted:
+ return accepted;
+ case reply::no_content:
+ return no_content;
+ case reply::multiple_choices:
+ return multiple_choices;
+ case reply::moved_permanently:
+ return moved_permanently;
+ case reply::moved_temporarily:
+ return moved_temporarily;
+ case reply::not_modified:
+ return not_modified;
+ case reply::bad_request:
+ return bad_request;
+ case reply::unauthorized:
+ return unauthorized;
+ case reply::forbidden:
+ return forbidden;
+ case reply::not_found:
+ return not_found;
+ case reply::internal_server_error:
+ return internal_server_error;
+ case reply::not_implemented:
+ return not_implemented;
+ case reply::bad_gateway:
+ return bad_gateway;
+ case reply::service_unavailable:
+ return service_unavailable;
+ default:
+ return internal_server_error;
+ }
+}
+
+} // namespace stock_replies
+
+reply reply::stock_reply(reply::status_type status)
+{
+ reply rep;
+ rep.status = status;
+ rep.content = stock_replies::to_string(status);
+ rep.headers.resize(2);
+ rep.headers[0].name = "Content-Length";
+ rep.headers[0].value = std::to_string(rep.content.size());
+ rep.headers[1].name = "Content-Type";
+ rep.headers[1].value = "text/html";
+ return rep;
+}
+
+} // namespace server4
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/reply.hpp b/3rdparty/asio/src/examples/cpp11/http/server4/reply.hpp
new file mode 100644
index 00000000000..d08579a3339
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/reply.hpp
@@ -0,0 +1,64 @@
+//
+// reply.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER4_REPLY_HPP
+#define HTTP_SERVER4_REPLY_HPP
+
+#include <string>
+#include <vector>
+#include <asio.hpp>
+#include "header.hpp"
+
+namespace http {
+namespace server4 {
+
+/// A reply to be sent to a client.
+struct reply
+{
+ /// The status of the reply.
+ enum status_type
+ {
+ ok = 200,
+ created = 201,
+ accepted = 202,
+ no_content = 204,
+ multiple_choices = 300,
+ moved_permanently = 301,
+ moved_temporarily = 302,
+ not_modified = 304,
+ bad_request = 400,
+ unauthorized = 401,
+ forbidden = 403,
+ not_found = 404,
+ internal_server_error = 500,
+ not_implemented = 501,
+ bad_gateway = 502,
+ service_unavailable = 503
+ } status;
+
+ /// The headers to be included in the reply.
+ std::vector<header> headers;
+
+ /// The content to be sent in the reply.
+ std::string content;
+
+ /// Convert the reply into a vector of buffers. The buffers do not own the
+ /// underlying memory blocks, therefore the reply object must remain valid and
+ /// not be changed until the write operation has completed.
+ std::vector<asio::const_buffer> to_buffers();
+
+ /// Get a stock reply.
+ static reply stock_reply(status_type status);
+};
+
+} // namespace server4
+} // namespace http
+
+#endif // HTTP_SERVER4_REPLY_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/request.hpp b/3rdparty/asio/src/examples/cpp11/http/server4/request.hpp
new file mode 100644
index 00000000000..8b20c4db0db
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/request.hpp
@@ -0,0 +1,34 @@
+//
+// request.hpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER4_REQUEST_HPP
+#define HTTP_SERVER4_REQUEST_HPP
+
+#include <string>
+#include <vector>
+#include "header.hpp"
+
+namespace http {
+namespace server4 {
+
+/// A request received from a client.
+struct request
+{
+ std::string method;
+ std::string uri;
+ int http_version_major;
+ int http_version_minor;
+ std::vector<header> headers;
+};
+
+} // namespace server4
+} // namespace http
+
+#endif // HTTP_SERVER4_REQUEST_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/request_parser.cpp b/3rdparty/asio/src/examples/cpp11/http/server4/request_parser.cpp
new file mode 100644
index 00000000000..ec557fccdd6
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/request_parser.cpp
@@ -0,0 +1,315 @@
+//
+// request_parser.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "request_parser.hpp"
+#include "request.hpp"
+
+namespace http {
+namespace server4 {
+
+request_parser::request_parser()
+ : state_(method_start)
+{
+}
+
+void request_parser::reset()
+{
+ state_ = method_start;
+}
+
+request_parser::result_type request_parser::consume(request& req, char input)
+{
+ switch (state_)
+ {
+ case method_start:
+ if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ state_ = method;
+ req.method.push_back(input);
+ return indeterminate;
+ }
+ case method:
+ if (input == ' ')
+ {
+ state_ = uri;
+ return indeterminate;
+ }
+ else if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.method.push_back(input);
+ return indeterminate;
+ }
+ case uri:
+ if (input == ' ')
+ {
+ state_ = http_version_h;
+ return indeterminate;
+ }
+ else if (is_ctl(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.uri.push_back(input);
+ return indeterminate;
+ }
+ case http_version_h:
+ if (input == 'H')
+ {
+ state_ = http_version_t_1;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_t_1:
+ if (input == 'T')
+ {
+ state_ = http_version_t_2;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_t_2:
+ if (input == 'T')
+ {
+ state_ = http_version_p;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_p:
+ if (input == 'P')
+ {
+ state_ = http_version_slash;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_slash:
+ if (input == '/')
+ {
+ req.http_version_major = 0;
+ req.http_version_minor = 0;
+ state_ = http_version_major_start;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_major_start:
+ if (is_digit(input))
+ {
+ req.http_version_major = req.http_version_major * 10 + input - '0';
+ state_ = http_version_major;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_major:
+ if (input == '.')
+ {
+ state_ = http_version_minor_start;
+ return indeterminate;
+ }
+ else if (is_digit(input))
+ {
+ req.http_version_major = req.http_version_major * 10 + input - '0';
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_minor_start:
+ if (is_digit(input))
+ {
+ req.http_version_minor = req.http_version_minor * 10 + input - '0';
+ state_ = http_version_minor;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case http_version_minor:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_1;
+ return indeterminate;
+ }
+ else if (is_digit(input))
+ {
+ req.http_version_minor = req.http_version_minor * 10 + input - '0';
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case expecting_newline_1:
+ if (input == '\n')
+ {
+ state_ = header_line_start;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case header_line_start:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_3;
+ return indeterminate;
+ }
+ else if (!req.headers.empty() && (input == ' ' || input == '\t'))
+ {
+ state_ = header_lws;
+ return indeterminate;
+ }
+ else if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.headers.push_back(header());
+ req.headers.back().name.push_back(input);
+ state_ = header_name;
+ return indeterminate;
+ }
+ case header_lws:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_2;
+ return indeterminate;
+ }
+ else if (input == ' ' || input == '\t')
+ {
+ return indeterminate;
+ }
+ else if (is_ctl(input))
+ {
+ return bad;
+ }
+ else
+ {
+ state_ = header_value;
+ req.headers.back().value.push_back(input);
+ return indeterminate;
+ }
+ case header_name:
+ if (input == ':')
+ {
+ state_ = space_before_header_value;
+ return indeterminate;
+ }
+ else if (!is_char(input) || is_ctl(input) || is_tspecial(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.headers.back().name.push_back(input);
+ return indeterminate;
+ }
+ case space_before_header_value:
+ if (input == ' ')
+ {
+ state_ = header_value;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case header_value:
+ if (input == '\r')
+ {
+ state_ = expecting_newline_2;
+ return indeterminate;
+ }
+ else if (is_ctl(input))
+ {
+ return bad;
+ }
+ else
+ {
+ req.headers.back().value.push_back(input);
+ return indeterminate;
+ }
+ case expecting_newline_2:
+ if (input == '\n')
+ {
+ state_ = header_line_start;
+ return indeterminate;
+ }
+ else
+ {
+ return bad;
+ }
+ case expecting_newline_3:
+ return (input == '\n') ? good : bad;
+ default:
+ return bad;
+ }
+}
+
+bool request_parser::is_char(int c)
+{
+ return c >= 0 && c <= 127;
+}
+
+bool request_parser::is_ctl(int c)
+{
+ return (c >= 0 && c <= 31) || (c == 127);
+}
+
+bool request_parser::is_tspecial(int c)
+{
+ switch (c)
+ {
+ case '(': case ')': case '<': case '>': case '@':
+ case ',': case ';': case ':': case '\\': case '"':
+ case '/': case '[': case ']': case '?': case '=':
+ case '{': case '}': case ' ': case '\t':
+ return true;
+ default:
+ return false;
+ }
+}
+
+bool request_parser::is_digit(int c)
+{
+ return c >= '0' && c <= '9';
+}
+
+} // namespace server4
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/request_parser.hpp b/3rdparty/asio/src/examples/cpp11/http/server4/request_parser.hpp
new file mode 100644
index 00000000000..4129c489b51
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/request_parser.hpp
@@ -0,0 +1,96 @@
+//
+// request_parser.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER4_REQUEST_PARSER_HPP
+#define HTTP_SERVER4_REQUEST_PARSER_HPP
+
+#include <tuple>
+
+namespace http {
+namespace server4 {
+
+struct request;
+
+/// Parser for incoming requests.
+class request_parser
+{
+public:
+ /// Construct ready to parse the request method.
+ request_parser();
+
+ /// Reset to initial parser state.
+ void reset();
+
+ /// Result of parse.
+ enum result_type { good, bad, indeterminate };
+
+ /// Parse some data. The enum return value is good when a complete request has
+ /// been parsed, bad if the data is invalid, indeterminate when more data is
+ /// required. The InputIterator return value indicates how much of the input
+ /// has been consumed.
+ template <typename InputIterator>
+ std::tuple<result_type, InputIterator> parse(request& req,
+ InputIterator begin, InputIterator end)
+ {
+ while (begin != end)
+ {
+ result_type result = consume(req, *begin++);
+ if (result == good || result == bad)
+ return std::make_tuple(result, begin);
+ }
+ return std::make_tuple(indeterminate, begin);
+ }
+
+private:
+ /// Handle the next character of input.
+ result_type consume(request& req, char input);
+
+ /// Check if a byte is an HTTP character.
+ static bool is_char(int c);
+
+ /// Check if a byte is an HTTP control character.
+ static bool is_ctl(int c);
+
+ /// Check if a byte is defined as an HTTP tspecial character.
+ static bool is_tspecial(int c);
+
+ /// Check if a byte is a digit.
+ static bool is_digit(int c);
+
+ /// The current state of the parser.
+ enum state
+ {
+ method_start,
+ method,
+ uri,
+ http_version_h,
+ http_version_t_1,
+ http_version_t_2,
+ http_version_p,
+ http_version_slash,
+ http_version_major_start,
+ http_version_major,
+ http_version_minor_start,
+ http_version_minor,
+ expecting_newline_1,
+ header_line_start,
+ header_lws,
+ header_name,
+ space_before_header_value,
+ header_value,
+ expecting_newline_2,
+ expecting_newline_3
+ } state_;
+};
+
+} // namespace server4
+} // namespace http
+
+#endif // HTTP_SERVER4_REQUEST_PARSER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/server.cpp b/3rdparty/asio/src/examples/cpp11/http/server4/server.cpp
new file mode 100644
index 00000000000..9c75f75e982
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/server.cpp
@@ -0,0 +1,122 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "server.hpp"
+#include "request.hpp"
+#include "reply.hpp"
+
+namespace http {
+namespace server4 {
+
+server::server(asio::io_context& io_context,
+ const std::string& address, const std::string& port,
+ std::function<void(const request&, reply&)> request_handler)
+ : request_handler_(request_handler)
+{
+ tcp::resolver resolver(io_context);
+ asio::ip::tcp::endpoint endpoint =
+ *resolver.resolve(address, port).begin();
+ acceptor_.reset(new tcp::acceptor(io_context, endpoint));
+}
+
+// Enable the pseudo-keywords reenter, yield and fork.
+#include <asio/yield.hpp>
+
+void server::operator()(std::error_code ec, std::size_t length)
+{
+ // In this example we keep the error handling code in one place by
+ // hoisting it outside the coroutine. An alternative approach would be to
+ // check the value of ec after each yield for an asynchronous operation.
+ if (!ec)
+ {
+ // On reentering a coroutine, control jumps to the location of the last
+ // yield or fork. The argument to the "reenter" pseudo-keyword can be a
+ // pointer or reference to an object of type coroutine.
+ reenter (this)
+ {
+ // Loop to accept incoming connections.
+ do
+ {
+ // Create a new socket for the next incoming connection.
+ socket_.reset(new tcp::socket(acceptor_->get_executor()));
+
+ // Accept a new connection. The "yield" pseudo-keyword saves the current
+ // line number and exits the coroutine's "reenter" block. We use the
+ // server coroutine as the completion handler for the async_accept
+ // operation. When the asynchronous operation completes, the io_context
+ // invokes the function call operator, we "reenter" the coroutine, and
+ // then control resumes at the following line.
+ yield acceptor_->async_accept(*socket_, *this);
+
+ // We "fork" by cloning a new server coroutine to handle the connection.
+ // After forking we have a parent coroutine and a child coroutine. Both
+ // parent and child continue execution at the following line. They can
+ // be distinguished using the functions coroutine::is_parent() and
+ // coroutine::is_child().
+ fork server(*this)();
+
+ // The parent continues looping to accept the next incoming connection.
+ // The child exits the loop and processes the connection.
+ } while (is_parent());
+
+ // Create the objects needed to receive a request on the connection.
+ buffer_.reset(new std::array<char, 8192>);
+ request_.reset(new request);
+
+ // Loop until a complete request (or an invalid one) has been received.
+ do
+ {
+ // Receive some more data. When control resumes at the following line,
+ // the ec and length parameters reflect the result of the asynchronous
+ // operation.
+ yield socket_->async_read_some(asio::buffer(*buffer_), *this);
+
+ // Parse the data we just received.
+ std::tie(parse_result_, std::ignore)
+ = request_parser_.parse(*request_,
+ buffer_->data(), buffer_->data() + length);
+
+ // An indeterminate result means we need more data, so keep looping.
+ } while (parse_result_ == request_parser::indeterminate);
+
+ // Create the reply object that will be sent back to the client.
+ reply_.reset(new reply);
+
+ if (parse_result_ == request_parser::good)
+ {
+ // A valid request was received. Call the user-supplied function object
+ // to process the request and compose a reply.
+ request_handler_(*request_, *reply_);
+ }
+ else
+ {
+ // The request was invalid.
+ *reply_ = reply::stock_reply(reply::bad_request);
+ }
+
+ // Send the reply back to the client.
+ yield asio::async_write(*socket_, reply_->to_buffers(), *this);
+
+ // Initiate graceful connection closure.
+ socket_->shutdown(tcp::socket::shutdown_both, ec);
+ }
+ }
+
+ // If an error occurs then the coroutine is not reentered. Consequently, no
+ // new asynchronous operations are started. This means that all shared_ptr
+ // references will disappear and the resources associated with the coroutine
+ // will be destroyed automatically after this function call returns.
+}
+
+// Disable the pseudo-keywords reenter, yield and fork.
+#include <asio/unyield.hpp>
+
+} // namespace server4
+} // namespace http
diff --git a/3rdparty/asio/src/examples/cpp11/http/server4/server.hpp b/3rdparty/asio/src/examples/cpp11/http/server4/server.hpp
new file mode 100644
index 00000000000..54d67832ba6
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/http/server4/server.hpp
@@ -0,0 +1,73 @@
+//
+// server.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HTTP_SERVER4_SERVER_HPP
+#define HTTP_SERVER4_SERVER_HPP
+
+#include <asio.hpp>
+#include <array>
+#include <functional>
+#include <memory>
+#include <string>
+#include "request_parser.hpp"
+
+namespace http {
+namespace server4 {
+
+struct request;
+struct reply;
+
+/// The top-level coroutine of the HTTP server.
+class server : asio::coroutine
+{
+public:
+ /// Construct the server to listen on the specified TCP address and port, and
+ /// serve up files from the given directory.
+ explicit server(asio::io_context& io_context,
+ const std::string& address, const std::string& port,
+ std::function<void(const request&, reply&)> request_handler);
+
+ /// Perform work associated with the server.
+ void operator()(
+ std::error_code ec = std::error_code(),
+ std::size_t length = 0);
+
+private:
+ typedef asio::ip::tcp tcp;
+
+ /// The user-supplied handler for all incoming requests.
+ std::function<void(const request&, reply&)> request_handler_;
+
+ /// Acceptor used to listen for incoming connections.
+ std::shared_ptr<tcp::acceptor> acceptor_;
+
+ /// The current connection from a client.
+ std::shared_ptr<tcp::socket> socket_;
+
+ /// Buffer for incoming data.
+ std::shared_ptr<std::array<char, 8192>> buffer_;
+
+ /// The incoming request.
+ std::shared_ptr<request> request_;
+
+ /// Whether the request is valid or not.
+ request_parser::result_type parse_result_;
+
+ /// The parser for the incoming request.
+ request_parser request_parser_;
+
+ /// The reply to be sent back to the client.
+ std::shared_ptr<reply> reply_;
+};
+
+} // namespace server4
+} // namespace http
+
+#endif // HTTP_SERVER4_SERVER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/icmp/icmp_header.hpp b/3rdparty/asio/src/examples/cpp11/icmp/icmp_header.hpp
new file mode 100644
index 00000000000..369511c6267
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/icmp/icmp_header.hpp
@@ -0,0 +1,94 @@
+//
+// icmp_header.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ICMP_HEADER_HPP
+#define ICMP_HEADER_HPP
+
+#include <istream>
+#include <ostream>
+#include <algorithm>
+
+// ICMP header for both IPv4 and IPv6.
+//
+// The wire format of an ICMP header is:
+//
+// 0 8 16 31
+// +---------------+---------------+------------------------------+ ---
+// | | | | ^
+// | type | code | checksum | |
+// | | | | |
+// +---------------+---------------+------------------------------+ 8 bytes
+// | | | |
+// | identifier | sequence number | |
+// | | | v
+// +-------------------------------+------------------------------+ ---
+
+class icmp_header
+{
+public:
+ enum { echo_reply = 0, destination_unreachable = 3, source_quench = 4,
+ redirect = 5, echo_request = 8, time_exceeded = 11, parameter_problem = 12,
+ timestamp_request = 13, timestamp_reply = 14, info_request = 15,
+ info_reply = 16, address_request = 17, address_reply = 18 };
+
+ icmp_header() { std::fill(rep_, rep_ + sizeof(rep_), 0); }
+
+ unsigned char type() const { return rep_[0]; }
+ unsigned char code() const { return rep_[1]; }
+ unsigned short checksum() const { return decode(2, 3); }
+ unsigned short identifier() const { return decode(4, 5); }
+ unsigned short sequence_number() const { return decode(6, 7); }
+
+ void type(unsigned char n) { rep_[0] = n; }
+ void code(unsigned char n) { rep_[1] = n; }
+ void checksum(unsigned short n) { encode(2, 3, n); }
+ void identifier(unsigned short n) { encode(4, 5, n); }
+ void sequence_number(unsigned short n) { encode(6, 7, n); }
+
+ friend std::istream& operator>>(std::istream& is, icmp_header& header)
+ { return is.read(reinterpret_cast<char*>(header.rep_), 8); }
+
+ friend std::ostream& operator<<(std::ostream& os, const icmp_header& header)
+ { return os.write(reinterpret_cast<const char*>(header.rep_), 8); }
+
+private:
+ unsigned short decode(int a, int b) const
+ { return (rep_[a] << 8) + rep_[b]; }
+
+ void encode(int a, int b, unsigned short n)
+ {
+ rep_[a] = static_cast<unsigned char>(n >> 8);
+ rep_[b] = static_cast<unsigned char>(n & 0xFF);
+ }
+
+ unsigned char rep_[8];
+};
+
+template <typename Iterator>
+void compute_checksum(icmp_header& header,
+ Iterator body_begin, Iterator body_end)
+{
+ unsigned int sum = (header.type() << 8) + header.code()
+ + header.identifier() + header.sequence_number();
+
+ Iterator body_iter = body_begin;
+ while (body_iter != body_end)
+ {
+ sum += (static_cast<unsigned char>(*body_iter++) << 8);
+ if (body_iter != body_end)
+ sum += static_cast<unsigned char>(*body_iter++);
+ }
+
+ sum = (sum >> 16) + (sum & 0xFFFF);
+ sum += (sum >> 16);
+ header.checksum(static_cast<unsigned short>(~sum));
+}
+
+#endif // ICMP_HEADER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/icmp/ipv4_header.hpp b/3rdparty/asio/src/examples/cpp11/icmp/ipv4_header.hpp
new file mode 100644
index 00000000000..d296571938f
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/icmp/ipv4_header.hpp
@@ -0,0 +1,102 @@
+//
+// ipv4_header.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef IPV4_HEADER_HPP
+#define IPV4_HEADER_HPP
+
+#include <algorithm>
+#include <asio/ip/address_v4.hpp>
+
+// Packet header for IPv4.
+//
+// The wire format of an IPv4 header is:
+//
+// 0 8 16 31
+// +-------+-------+---------------+------------------------------+ ---
+// | | | | | ^
+// |version|header | type of | total length in bytes | |
+// | (4) | length| service | | |
+// +-------+-------+---------------+-+-+-+------------------------+ |
+// | | | | | | |
+// | identification |0|D|M| fragment offset | |
+// | | |F|F| | |
+// +---------------+---------------+-+-+-+------------------------+ |
+// | | | | |
+// | time to live | protocol | header checksum | 20 bytes
+// | | | | |
+// +---------------+---------------+------------------------------+ |
+// | | |
+// | source IPv4 address | |
+// | | |
+// +--------------------------------------------------------------+ |
+// | | |
+// | destination IPv4 address | |
+// | | v
+// +--------------------------------------------------------------+ ---
+// | | ^
+// | | |
+// / options (if any) / 0 - 40
+// / / bytes
+// | | |
+// | | v
+// +--------------------------------------------------------------+ ---
+
+class ipv4_header
+{
+public:
+ ipv4_header() { std::fill(rep_, rep_ + sizeof(rep_), 0); }
+
+ unsigned char version() const { return (rep_[0] >> 4) & 0xF; }
+ unsigned short header_length() const { return (rep_[0] & 0xF) * 4; }
+ unsigned char type_of_service() const { return rep_[1]; }
+ unsigned short total_length() const { return decode(2, 3); }
+ unsigned short identification() const { return decode(4, 5); }
+ bool dont_fragment() const { return (rep_[6] & 0x40) != 0; }
+ bool more_fragments() const { return (rep_[6] & 0x20) != 0; }
+ unsigned short fragment_offset() const { return decode(6, 7) & 0x1FFF; }
+ unsigned int time_to_live() const { return rep_[8]; }
+ unsigned char protocol() const { return rep_[9]; }
+ unsigned short header_checksum() const { return decode(10, 11); }
+
+ asio::ip::address_v4 source_address() const
+ {
+ asio::ip::address_v4::bytes_type bytes
+ = { { rep_[12], rep_[13], rep_[14], rep_[15] } };
+ return asio::ip::address_v4(bytes);
+ }
+
+ asio::ip::address_v4 destination_address() const
+ {
+ asio::ip::address_v4::bytes_type bytes
+ = { { rep_[16], rep_[17], rep_[18], rep_[19] } };
+ return asio::ip::address_v4(bytes);
+ }
+
+ friend std::istream& operator>>(std::istream& is, ipv4_header& header)
+ {
+ is.read(reinterpret_cast<char*>(header.rep_), 20);
+ if (header.version() != 4)
+ is.setstate(std::ios::failbit);
+ std::streamsize options_length = header.header_length() - 20;
+ if (options_length < 0 || options_length > 40)
+ is.setstate(std::ios::failbit);
+ else
+ is.read(reinterpret_cast<char*>(header.rep_) + 20, options_length);
+ return is;
+ }
+
+private:
+ unsigned short decode(int a, int b) const
+ { return (rep_[a] << 8) + rep_[b]; }
+
+ unsigned char rep_[60];
+};
+
+#endif // IPV4_HEADER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/icmp/ping.cpp b/3rdparty/asio/src/examples/cpp11/icmp/ping.cpp
new file mode 100644
index 00000000000..f179ea3461b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/icmp/ping.cpp
@@ -0,0 +1,162 @@
+//
+// ping.cpp
+// ~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <istream>
+#include <iostream>
+#include <ostream>
+
+#include "icmp_header.hpp"
+#include "ipv4_header.hpp"
+
+using asio::ip::icmp;
+using asio::steady_timer;
+namespace chrono = asio::chrono;
+
+class pinger
+{
+public:
+ pinger(asio::io_context& io_context, const char* destination)
+ : resolver_(io_context), socket_(io_context, icmp::v4()),
+ timer_(io_context), sequence_number_(0), num_replies_(0)
+ {
+ destination_ = *resolver_.resolve(icmp::v4(), destination, "").begin();
+
+ start_send();
+ start_receive();
+ }
+
+private:
+ void start_send()
+ {
+ std::string body("\"Hello!\" from Asio ping.");
+
+ // Create an ICMP header for an echo request.
+ icmp_header echo_request;
+ echo_request.type(icmp_header::echo_request);
+ echo_request.code(0);
+ echo_request.identifier(get_identifier());
+ echo_request.sequence_number(++sequence_number_);
+ compute_checksum(echo_request, body.begin(), body.end());
+
+ // Encode the request packet.
+ asio::streambuf request_buffer;
+ std::ostream os(&request_buffer);
+ os << echo_request << body;
+
+ // Send the request.
+ time_sent_ = steady_timer::clock_type::now();
+ socket_.send_to(request_buffer.data(), destination_);
+
+ // Wait up to five seconds for a reply.
+ num_replies_ = 0;
+ timer_.expires_at(time_sent_ + chrono::seconds(5));
+ timer_.async_wait(std::bind(&pinger::handle_timeout, this));
+ }
+
+ void handle_timeout()
+ {
+ if (num_replies_ == 0)
+ std::cout << "Request timed out" << std::endl;
+
+ // Requests must be sent no less than one second apart.
+ timer_.expires_at(time_sent_ + chrono::seconds(1));
+ timer_.async_wait(std::bind(&pinger::start_send, this));
+ }
+
+ void start_receive()
+ {
+ // Discard any data already in the buffer.
+ reply_buffer_.consume(reply_buffer_.size());
+
+ // Wait for a reply. We prepare the buffer to receive up to 64KB.
+ socket_.async_receive(reply_buffer_.prepare(65536),
+ std::bind(&pinger::handle_receive, this, std::placeholders::_2));
+ }
+
+ void handle_receive(std::size_t length)
+ {
+ // The actual number of bytes received is committed to the buffer so that we
+ // can extract it using a std::istream object.
+ reply_buffer_.commit(length);
+
+ // Decode the reply packet.
+ std::istream is(&reply_buffer_);
+ ipv4_header ipv4_hdr;
+ icmp_header icmp_hdr;
+ is >> ipv4_hdr >> icmp_hdr;
+
+ // We can receive all ICMP packets received by the host, so we need to
+ // filter out only the echo replies that match the our identifier and
+ // expected sequence number.
+ if (is && icmp_hdr.type() == icmp_header::echo_reply
+ && icmp_hdr.identifier() == get_identifier()
+ && icmp_hdr.sequence_number() == sequence_number_)
+ {
+ // If this is the first reply, interrupt the five second timeout.
+ if (num_replies_++ == 0)
+ timer_.cancel();
+
+ // Print out some information about the reply packet.
+ chrono::steady_clock::time_point now = chrono::steady_clock::now();
+ chrono::steady_clock::duration elapsed = now - time_sent_;
+ std::cout << length - ipv4_hdr.header_length()
+ << " bytes from " << ipv4_hdr.source_address()
+ << ": icmp_seq=" << icmp_hdr.sequence_number()
+ << ", ttl=" << ipv4_hdr.time_to_live()
+ << ", time="
+ << chrono::duration_cast<chrono::milliseconds>(elapsed).count()
+ << std::endl;
+ }
+
+ start_receive();
+ }
+
+ static unsigned short get_identifier()
+ {
+#if defined(ASIO_WINDOWS)
+ return static_cast<unsigned short>(::GetCurrentProcessId());
+#else
+ return static_cast<unsigned short>(::getpid());
+#endif
+ }
+
+ icmp::resolver resolver_;
+ icmp::endpoint destination_;
+ icmp::socket socket_;
+ steady_timer timer_;
+ unsigned short sequence_number_;
+ chrono::steady_clock::time_point time_sent_;
+ asio::streambuf reply_buffer_;
+ std::size_t num_replies_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: ping <host>" << std::endl;
+#if !defined(ASIO_WINDOWS)
+ std::cerr << "(You may need to run this program as root.)" << std::endl;
+#endif
+ return 1;
+ }
+
+ asio::io_context io_context;
+ pinger p(io_context, argv[1]);
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << std::endl;
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp11/invocation/prioritised_handlers.cpp b/3rdparty/asio/src/examples/cpp11/invocation/prioritised_handlers.cpp
new file mode 100644
index 00000000000..533bfd06861
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/invocation/prioritised_handlers.cpp
@@ -0,0 +1,202 @@
+//
+// prioritised_handlers.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio.hpp"
+#include <iostream>
+#include <memory>
+#include <queue>
+
+using asio::ip::tcp;
+
+class handler_priority_queue : public asio::execution_context
+{
+public:
+ template <typename Function>
+ void add(int priority, Function function)
+ {
+ std::unique_ptr<queued_handler_base> handler(
+ new queued_handler<Function>(
+ priority, std::move(function)));
+
+ handlers_.push(std::move(handler));
+ }
+
+ void execute_all()
+ {
+ while (!handlers_.empty())
+ {
+ handlers_.top()->execute();
+ handlers_.pop();
+ }
+ }
+
+ class executor
+ {
+ public:
+ executor(handler_priority_queue& q, int p)
+ : context_(q), priority_(p)
+ {
+ }
+
+ handler_priority_queue& context() const noexcept
+ {
+ return context_;
+ }
+
+ template <typename Function, typename Allocator>
+ void dispatch(Function f, const Allocator&) const
+ {
+ context_.add(priority_, std::move(f));
+ }
+
+ template <typename Function, typename Allocator>
+ void post(Function f, const Allocator&) const
+ {
+ context_.add(priority_, std::move(f));
+ }
+
+ template <typename Function, typename Allocator>
+ void defer(Function f, const Allocator&) const
+ {
+ context_.add(priority_, std::move(f));
+ }
+
+ void on_work_started() const noexcept {}
+ void on_work_finished() const noexcept {}
+
+ bool operator==(const executor& other) const noexcept
+ {
+ return &context_ == &other.context_ && priority_ == other.priority_;
+ }
+
+ bool operator!=(const executor& other) const noexcept
+ {
+ return !operator==(other);
+ }
+
+ private:
+ handler_priority_queue& context_;
+ int priority_;
+ };
+
+ template <typename Handler>
+ asio::executor_binder<Handler, executor>
+ wrap(int priority, Handler handler)
+ {
+ return asio::bind_executor(
+ executor(*this, priority), std::move(handler));
+ }
+
+private:
+ class queued_handler_base
+ {
+ public:
+ queued_handler_base(int p)
+ : priority_(p)
+ {
+ }
+
+ virtual ~queued_handler_base()
+ {
+ }
+
+ virtual void execute() = 0;
+
+ friend bool operator<(const std::unique_ptr<queued_handler_base>& a,
+ const std::unique_ptr<queued_handler_base>& b) noexcept
+ {
+ return a->priority_ < b->priority_;
+ }
+
+ private:
+ int priority_;
+ };
+
+ template <typename Function>
+ class queued_handler : public queued_handler_base
+ {
+ public:
+ queued_handler(int p, Function f)
+ : queued_handler_base(p), function_(std::move(f))
+ {
+ }
+
+ void execute() override
+ {
+ function_();
+ }
+
+ private:
+ Function function_;
+ };
+
+ std::priority_queue<std::unique_ptr<queued_handler_base>> handlers_;
+};
+
+//----------------------------------------------------------------------
+
+void high_priority_handler(const std::error_code& /*ec*/,
+ tcp::socket /*socket*/)
+{
+ std::cout << "High priority handler\n";
+}
+
+void middle_priority_handler(const std::error_code& /*ec*/)
+{
+ std::cout << "Middle priority handler\n";
+}
+
+struct low_priority_handler
+{
+ // Make the handler a move-only type.
+ low_priority_handler() = default;
+ low_priority_handler(const low_priority_handler&) = delete;
+ low_priority_handler(low_priority_handler&&) = default;
+
+ void operator()()
+ {
+ std::cout << "Low priority handler\n";
+ }
+};
+
+int main()
+{
+ asio::io_context io_context;
+
+ handler_priority_queue pri_queue;
+
+ // Post a completion handler to be run immediately.
+ asio::post(io_context, pri_queue.wrap(0, low_priority_handler()));
+
+ // Start an asynchronous accept that will complete immediately.
+ tcp::endpoint endpoint(asio::ip::address_v4::loopback(), 0);
+ tcp::acceptor acceptor(io_context, endpoint);
+ tcp::socket server_socket(io_context);
+ acceptor.async_accept(pri_queue.wrap(100, high_priority_handler));
+ tcp::socket client_socket(io_context);
+ client_socket.connect(acceptor.local_endpoint());
+
+ // Set a deadline timer to expire immediately.
+ asio::steady_timer timer(io_context);
+ timer.expires_at(asio::steady_timer::clock_type::time_point::min());
+ timer.async_wait(pri_queue.wrap(42, middle_priority_handler));
+
+ while (io_context.run_one())
+ {
+ // The custom invocation hook adds the handlers to the priority queue
+ // rather than executing them from within the poll_one() call.
+ while (io_context.poll_one())
+ ;
+
+ pri_queue.execute_all();
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/iostreams/daytime_client.cpp b/3rdparty/asio/src/examples/cpp11/iostreams/daytime_client.cpp
new file mode 100644
index 00000000000..0c8df192534
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/iostreams/daytime_client.cpp
@@ -0,0 +1,44 @@
+//
+// daytime_client.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include <string>
+#include <asio.hpp>
+
+using asio::ip::tcp;
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: daytime_client <host>" << std::endl;
+ return 1;
+ }
+
+ tcp::iostream s(argv[1], "daytime");
+ if (!s)
+ {
+ std::cout << "Unable to connect: " << s.error().message() << std::endl;
+ return 1;
+ }
+
+ std::string line;
+ std::getline(s, line);
+ std::cout << line << std::endl;
+ }
+ catch (std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/iostreams/daytime_server.cpp b/3rdparty/asio/src/examples/cpp11/iostreams/daytime_server.cpp
new file mode 100644
index 00000000000..1e644085ef1
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/iostreams/daytime_server.cpp
@@ -0,0 +1,51 @@
+//
+// daytime_server.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <ctime>
+#include <iostream>
+#include <string>
+#include <asio.hpp>
+
+using asio::ip::tcp;
+
+std::string make_daytime_string()
+{
+ using namespace std; // For time_t, time and ctime;
+ time_t now = time(0);
+ return ctime(&now);
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context;
+
+ tcp::endpoint endpoint(tcp::v4(), 13);
+ tcp::acceptor acceptor(io_context, endpoint);
+
+ for (;;)
+ {
+ tcp::iostream stream;
+ std::error_code ec;
+ acceptor.accept(stream.socket(), ec);
+ if (!ec)
+ {
+ stream << make_daytime_string();
+ }
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/iostreams/http_client.cpp b/3rdparty/asio/src/examples/cpp11/iostreams/http_client.cpp
new file mode 100644
index 00000000000..313f177bce4
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/iostreams/http_client.cpp
@@ -0,0 +1,91 @@
+//
+// http_client.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include <istream>
+#include <ostream>
+#include <string>
+#include <asio/ip/tcp.hpp>
+
+using asio::ip::tcp;
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cout << "Usage: http_client <server> <path>\n";
+ std::cout << "Example:\n";
+ std::cout << " http_client www.boost.org /LICENSE_1_0.txt\n";
+ return 1;
+ }
+
+ asio::ip::tcp::iostream s;
+
+ // The entire sequence of I/O operations must complete within 60 seconds.
+ // If an expiry occurs, the socket is automatically closed and the stream
+ // becomes bad.
+ s.expires_after(std::chrono::seconds(60));
+
+ // Establish a connection to the server.
+ s.connect(argv[1], "http");
+ if (!s)
+ {
+ std::cout << "Unable to connect: " << s.error().message() << "\n";
+ return 1;
+ }
+
+ // Send the request. We specify the "Connection: close" header so that the
+ // server will close the socket after transmitting the response. This will
+ // allow us to treat all data up until the EOF as the content.
+ s << "GET " << argv[2] << " HTTP/1.0\r\n";
+ s << "Host: " << argv[1] << "\r\n";
+ s << "Accept: */*\r\n";
+ s << "Connection: close\r\n\r\n";
+
+ // By default, the stream is tied with itself. This means that the stream
+ // automatically flush the buffered output before attempting a read. It is
+ // not necessary not explicitly flush the stream at this point.
+
+ // Check that response is OK.
+ std::string http_version;
+ s >> http_version;
+ unsigned int status_code;
+ s >> status_code;
+ std::string status_message;
+ std::getline(s, status_message);
+ if (!s || http_version.substr(0, 5) != "HTTP/")
+ {
+ std::cout << "Invalid response\n";
+ return 1;
+ }
+ if (status_code != 200)
+ {
+ std::cout << "Response returned with status code " << status_code << "\n";
+ return 1;
+ }
+
+ // Process the response headers, which are terminated by a blank line.
+ std::string header;
+ while (std::getline(s, header) && header != "\r")
+ std::cout << header << "\n";
+ std::cout << "\n";
+
+ // Write the remaining data to output.
+ std::cout << s.rdbuf();
+ }
+ catch (std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/local/connect_pair.cpp b/3rdparty/asio/src/examples/cpp11/local/connect_pair.cpp
new file mode 100644
index 00000000000..50d0a06712c
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/local/connect_pair.cpp
@@ -0,0 +1,129 @@
+//
+// connect_pair.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <array>
+#include <iostream>
+#include <string>
+#include <cctype>
+#include <asio.hpp>
+
+#if defined(ASIO_HAS_LOCAL_SOCKETS)
+
+using asio::local::stream_protocol;
+
+class uppercase_filter
+{
+public:
+ uppercase_filter(stream_protocol::socket sock)
+ : socket_(std::move(sock))
+ {
+ read();
+ }
+
+private:
+ void read()
+ {
+ socket_.async_read_some(asio::buffer(data_),
+ [this](std::error_code ec, std::size_t size)
+ {
+ if (!ec)
+ {
+ // Compute result.
+ for (std::size_t i = 0; i < size; ++i)
+ data_[i] = std::toupper(data_[i]);
+
+ // Send result.
+ write(size);
+ }
+ else
+ {
+ throw std::system_error(ec);
+ }
+ });
+ }
+
+ void write(std::size_t size)
+ {
+ asio::async_write(socket_, asio::buffer(data_, size),
+ [this](std::error_code ec, std::size_t /*size*/)
+ {
+ if (!ec)
+ {
+ // Wait for request.
+ read();
+ }
+ else
+ {
+ throw std::system_error(ec);
+ }
+ });
+ }
+
+ stream_protocol::socket socket_;
+ std::array<char, 512> data_;
+};
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context;
+
+ // Create a connected pair and pass one end to a filter.
+ stream_protocol::socket socket(io_context);
+ stream_protocol::socket filter_socket(io_context);
+ asio::local::connect_pair(socket, filter_socket);
+ uppercase_filter filter(std::move(filter_socket));
+
+ // The io_context runs in a background thread to perform filtering.
+ asio::thread thread(
+ [&io_context]()
+ {
+ try
+ {
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception in thread: " << e.what() << "\n";
+ std::exit(1);
+ }
+ });
+
+ for (;;)
+ {
+ // Collect request from user.
+ std::cout << "Enter a string: ";
+ std::string request;
+ std::getline(std::cin, request);
+
+ // Send request to filter.
+ asio::write(socket, asio::buffer(request));
+
+ // Wait for reply from filter.
+ std::vector<char> reply(request.size());
+ asio::read(socket, asio::buffer(reply));
+
+ // Show reply to user.
+ std::cout << "Result: ";
+ std::cout.write(&reply[0], request.size());
+ std::cout << std::endl;
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ std::exit(1);
+ }
+}
+
+#else // defined(ASIO_HAS_LOCAL_SOCKETS)
+# error Local sockets not available on this platform.
+#endif // defined(ASIO_HAS_LOCAL_SOCKETS)
diff --git a/3rdparty/asio/src/examples/cpp11/local/fd_passing_stream_client.cpp b/3rdparty/asio/src/examples/cpp11/local/fd_passing_stream_client.cpp
new file mode 100644
index 00000000000..229509f1c14
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/local/fd_passing_stream_client.cpp
@@ -0,0 +1,102 @@
+//
+// fd_passing_stream_client.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+// Copyright (c) 2021 Heiko Hund (heiko at openvpn dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Demonstrates how to pass file descriptors between processes with Asio.
+// The client send a file name (destfile) to the server. The server opens
+// the file and the associated file descriptor back to the client.
+
+#include <cstdlib>
+#include <cstring>
+#include <iostream>
+#include "asio.hpp"
+
+#if defined(ASIO_HAS_LOCAL_SOCKETS)
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+using asio::local::stream_protocol;
+
+constexpr std::size_t max_length = 1024;
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: fd_passing_stream_client <serversocket>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ stream_protocol::socket s(io_context);
+ s.connect(stream_protocol::endpoint(argv[1]));
+
+ std::cout << "Enter path to write to: ";
+ char request[max_length];
+ std::cin.getline(request, max_length);
+ size_t request_length = std::strlen(request);
+ asio::write(s, asio::buffer(request, request_length));
+
+ char reply[max_length];
+ struct msghdr msg = {};
+ struct iovec iov = { reply, sizeof(reply) };
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+
+ union
+ {
+ struct cmsghdr align;
+ char buf[CMSG_SPACE(sizeof(int))];
+ } cmsgu;
+ msg.msg_control = cmsgu.buf;
+ msg.msg_controllen = sizeof(cmsgu.buf);
+
+ ::recvmsg(s.native_handle(), &msg, 0);
+
+ int fd = -1;
+ struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
+ while (cmsg != NULL)
+ {
+ if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS)
+ {
+ std::memcpy(&fd, CMSG_DATA(cmsg), sizeof(fd));
+ break;
+ }
+ cmsg = CMSG_NXTHDR(&msg, cmsg);
+ }
+
+ if (fd != -1)
+ {
+ std::cout << "File descriptor received is: " << fd << "\n";
+ FILE* f(::fdopen(fd, "w+"));
+ if (f)
+ {
+ ::fprintf(f, "stream_client writing to received fd #%d\n", fd);
+ ::fclose(f);
+ }
+ else
+ ::close(fd);
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
+
+#else // defined(ASIO_HAS_LOCAL_SOCKETS)
+# error Local sockets not available on this platform.
+#endif // defined(ASIO_HAS_LOCAL_SOCKETS)
diff --git a/3rdparty/asio/src/examples/cpp11/local/fd_passing_stream_server.cpp b/3rdparty/asio/src/examples/cpp11/local/fd_passing_stream_server.cpp
new file mode 100644
index 00000000000..5082185e75c
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/local/fd_passing_stream_server.cpp
@@ -0,0 +1,160 @@
+//
+// fd_passing_stream_server.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+// Copyright (c) 2021 Heiko Hund (heiko at openvpn dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Demonstrates how to pass file descriptors between processes with Asio.
+// The client sends a file name to the server. The server opens the file and
+// passes the associated file descriptor back to the client.
+
+#include <array>
+#include <cstdio>
+#include <cassert>
+#include <iostream>
+#include <memory>
+#include "asio.hpp"
+
+#if defined(ASIO_HAS_LOCAL_SOCKETS)
+
+using asio::local::stream_protocol;
+
+class session
+ : public std::enable_shared_from_this<session>
+{
+public:
+ session(stream_protocol::socket sock)
+ : socket_(std::move(sock))
+ {
+ }
+
+ void start()
+ {
+ do_read();
+ }
+
+private:
+ void do_read()
+ {
+ auto self(shared_from_this());
+ socket_.async_read_some(asio::buffer(data_),
+ [this, self](std::error_code ec, std::size_t length)
+ {
+ if (ec)
+ return;
+
+ assert(length < data_.size());
+ data_[length] = 0;
+ do_write(data_.data());
+ });
+ }
+
+ void do_write(const char* filename)
+ {
+ auto self(shared_from_this());
+ socket_.async_wait(stream_protocol::socket::wait_write,
+ [this, self, filename](std::error_code ec)
+ {
+ if (ec)
+ return;
+
+ FILE* f(::fopen(filename, "w+"));
+ if (!f)
+ return;
+
+ struct msghdr msg = {};
+ char buf[] = { 0 };
+ struct iovec iov = { buf, sizeof(buf) };
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+
+ union
+ {
+ struct cmsghdr align;
+ char buf[CMSG_SPACE(sizeof(int))];
+ } cmsgu;
+ msg.msg_control = cmsgu.buf;
+ msg.msg_controllen = sizeof(cmsgu.buf);
+
+ struct cmsghdr* cmsg = CMSG_FIRSTHDR(&msg);
+ cmsg->cmsg_len = CMSG_LEN(sizeof(int));
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ int fd = ::fileno(f);
+ std::memcpy(CMSG_DATA(cmsg), &fd, sizeof(int));
+
+ ssize_t s(::sendmsg(socket_.native_handle(), &msg, 0));
+ ::fclose(f);
+ if (s != -1)
+ do_read();
+ });
+ }
+
+ // The socket used to communicate with the client.
+ stream_protocol::socket socket_;
+
+ // Buffer used to store data received from the client.
+ std::array<char, 1024> data_;
+};
+
+class server
+{
+public:
+ server(asio::io_context& io_context, const std::string& file)
+ : acceptor_(io_context, stream_protocol::endpoint(file))
+ {
+ do_accept();
+ }
+
+private:
+ void do_accept()
+ {
+ acceptor_.async_accept(
+ [this](std::error_code ec, stream_protocol::socket socket)
+ {
+ if (!ec)
+ {
+ std::make_shared<session>(std::move(socket))->start();
+ }
+
+ do_accept();
+ });
+ }
+
+ stream_protocol::acceptor acceptor_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: fd_passing_stream_server <socketfile>\n";
+ std::cerr << "*** WARNING: existing file is removed ***\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ std::remove(argv[1]);
+ server s(io_context, argv[1]);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
+
+#else // defined(ASIO_HAS_LOCAL_SOCKETS)
+# error Local sockets not available on this platform.
+#endif // defined(ASIO_HAS_LOCAL_SOCKETS)
diff --git a/3rdparty/asio/src/examples/cpp11/local/iostream_client.cpp b/3rdparty/asio/src/examples/cpp11/local/iostream_client.cpp
new file mode 100644
index 00000000000..932f29d3459
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/local/iostream_client.cpp
@@ -0,0 +1,61 @@
+//
+// stream_client.cpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstring>
+#include <iostream>
+#include "asio.hpp"
+
+#if defined(ASIO_HAS_LOCAL_SOCKETS)
+
+using asio::local::stream_protocol;
+
+constexpr std::size_t max_length = 1024;
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: iostream_client <file>\n";
+ return 1;
+ }
+
+ stream_protocol::endpoint ep(argv[1]);
+ stream_protocol::iostream s(ep);
+ if (!s)
+ {
+ std::cerr << "Unable to connect: " << s.error().message() << std::endl;
+ return 1;
+ }
+
+ std::cout << "Enter message: ";
+ char request[max_length];
+ std::cin.getline(request, max_length);
+ size_t length = std::strlen(request);
+ s << request;
+
+ char reply[max_length];
+ s.read(reply, length);
+ std::cout << "Reply is: ";
+ std::cout.write(reply, length);
+ std::cout << "\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
+
+#else // defined(ASIO_HAS_LOCAL_SOCKETS)
+# error Local sockets not available on this platform.
+#endif // defined(ASIO_HAS_LOCAL_SOCKETS)
diff --git a/3rdparty/asio/src/examples/cpp11/local/stream_client.cpp b/3rdparty/asio/src/examples/cpp11/local/stream_client.cpp
new file mode 100644
index 00000000000..32f408933ca
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/local/stream_client.cpp
@@ -0,0 +1,60 @@
+//
+// stream_client.cpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <cstring>
+#include <iostream>
+#include "asio.hpp"
+
+#if defined(ASIO_HAS_LOCAL_SOCKETS)
+
+using asio::local::stream_protocol;
+
+constexpr std::size_t max_length = 1024;
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: stream_client <file>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ stream_protocol::socket s(io_context);
+ s.connect(stream_protocol::endpoint(argv[1]));
+
+ std::cout << "Enter message: ";
+ char request[max_length];
+ std::cin.getline(request, max_length);
+ size_t request_length = std::strlen(request);
+ asio::write(s, asio::buffer(request, request_length));
+
+ char reply[max_length];
+ size_t reply_length = asio::read(s,
+ asio::buffer(reply, request_length));
+ std::cout << "Reply is: ";
+ std::cout.write(reply, reply_length);
+ std::cout << "\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
+
+#else // defined(ASIO_HAS_LOCAL_SOCKETS)
+# error Local sockets not available on this platform.
+#endif // defined(ASIO_HAS_LOCAL_SOCKETS)
diff --git a/3rdparty/asio/src/examples/cpp11/local/stream_server.cpp b/3rdparty/asio/src/examples/cpp11/local/stream_server.cpp
new file mode 100644
index 00000000000..85cd58f87d6
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/local/stream_server.cpp
@@ -0,0 +1,121 @@
+//
+// stream_server.cpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <array>
+#include <cstdio>
+#include <iostream>
+#include <memory>
+#include "asio.hpp"
+
+#if defined(ASIO_HAS_LOCAL_SOCKETS)
+
+using asio::local::stream_protocol;
+
+class session
+ : public std::enable_shared_from_this<session>
+{
+public:
+ session(stream_protocol::socket sock)
+ : socket_(std::move(sock))
+ {
+ }
+
+ void start()
+ {
+ do_read();
+ }
+
+private:
+ void do_read()
+ {
+ auto self(shared_from_this());
+ socket_.async_read_some(asio::buffer(data_),
+ [this, self](std::error_code ec, std::size_t length)
+ {
+ if (!ec)
+ do_write(length);
+ });
+ }
+
+ void do_write(std::size_t length)
+ {
+ auto self(shared_from_this());
+ asio::async_write(socket_,
+ asio::buffer(data_, length),
+ [this, self](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ do_read();
+ });
+ }
+
+ // The socket used to communicate with the client.
+ stream_protocol::socket socket_;
+
+ // Buffer used to store data received from the client.
+ std::array<char, 1024> data_;
+};
+
+class server
+{
+public:
+ server(asio::io_context& io_context, const std::string& file)
+ : acceptor_(io_context, stream_protocol::endpoint(file))
+ {
+ do_accept();
+ }
+
+private:
+ void do_accept()
+ {
+ acceptor_.async_accept(
+ [this](std::error_code ec, stream_protocol::socket socket)
+ {
+ if (!ec)
+ {
+ std::make_shared<session>(std::move(socket))->start();
+ }
+
+ do_accept();
+ });
+ }
+
+ stream_protocol::acceptor acceptor_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: stream_server <file>\n";
+ std::cerr << "*** WARNING: existing file is removed ***\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ std::remove(argv[1]);
+ server s(io_context, argv[1]);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
+
+#else // defined(ASIO_HAS_LOCAL_SOCKETS)
+# error Local sockets not available on this platform.
+#endif // defined(ASIO_HAS_LOCAL_SOCKETS)
diff --git a/3rdparty/asio/src/examples/cpp11/multicast/receiver.cpp b/3rdparty/asio/src/examples/cpp11/multicast/receiver.cpp
new file mode 100644
index 00000000000..5973bede5bb
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/multicast/receiver.cpp
@@ -0,0 +1,88 @@
+//
+// receiver.cpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <array>
+#include <iostream>
+#include <string>
+#include "asio.hpp"
+
+constexpr short multicast_port = 30001;
+
+class receiver
+{
+public:
+ receiver(asio::io_context& io_context,
+ const asio::ip::address& listen_address,
+ const asio::ip::address& multicast_address)
+ : socket_(io_context)
+ {
+ // Create the socket so that multiple may be bound to the same address.
+ asio::ip::udp::endpoint listen_endpoint(
+ listen_address, multicast_port);
+ socket_.open(listen_endpoint.protocol());
+ socket_.set_option(asio::ip::udp::socket::reuse_address(true));
+ socket_.bind(listen_endpoint);
+
+ // Join the multicast group.
+ socket_.set_option(
+ asio::ip::multicast::join_group(multicast_address));
+
+ do_receive();
+ }
+
+private:
+ void do_receive()
+ {
+ socket_.async_receive_from(
+ asio::buffer(data_), sender_endpoint_,
+ [this](std::error_code ec, std::size_t length)
+ {
+ if (!ec)
+ {
+ std::cout.write(data_.data(), length);
+ std::cout << std::endl;
+
+ do_receive();
+ }
+ });
+ }
+
+ asio::ip::udp::socket socket_;
+ asio::ip::udp::endpoint sender_endpoint_;
+ std::array<char, 1024> data_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: receiver <listen_address> <multicast_address>\n";
+ std::cerr << " For IPv4, try:\n";
+ std::cerr << " receiver 0.0.0.0 239.255.0.1\n";
+ std::cerr << " For IPv6, try:\n";
+ std::cerr << " receiver 0::0 ff31::8000:1234\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+ receiver r(io_context,
+ asio::ip::make_address(argv[1]),
+ asio::ip::make_address(argv[2]));
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/multicast/sender.cpp b/3rdparty/asio/src/examples/cpp11/multicast/sender.cpp
new file mode 100644
index 00000000000..dc3cf7fd0e7
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/multicast/sender.cpp
@@ -0,0 +1,91 @@
+//
+// sender.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include <sstream>
+#include <string>
+#include "asio.hpp"
+
+constexpr short multicast_port = 30001;
+constexpr int max_message_count = 10;
+
+class sender
+{
+public:
+ sender(asio::io_context& io_context,
+ const asio::ip::address& multicast_address)
+ : endpoint_(multicast_address, multicast_port),
+ socket_(io_context, endpoint_.protocol()),
+ timer_(io_context),
+ message_count_(0)
+ {
+ do_send();
+ }
+
+private:
+ void do_send()
+ {
+ std::ostringstream os;
+ os << "Message " << message_count_++;
+ message_ = os.str();
+
+ socket_.async_send_to(
+ asio::buffer(message_), endpoint_,
+ [this](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec && message_count_ < max_message_count)
+ do_timeout();
+ });
+ }
+
+ void do_timeout()
+ {
+ timer_.expires_after(std::chrono::seconds(1));
+ timer_.async_wait(
+ [this](std::error_code ec)
+ {
+ if (!ec)
+ do_send();
+ });
+ }
+
+private:
+ asio::ip::udp::endpoint endpoint_;
+ asio::ip::udp::socket socket_;
+ asio::steady_timer timer_;
+ int message_count_;
+ std::string message_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: sender <multicast_address>\n";
+ std::cerr << " For IPv4, try:\n";
+ std::cerr << " sender 239.255.0.1\n";
+ std::cerr << " For IPv6, try:\n";
+ std::cerr << " sender ff31::8000:1234\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+ sender s(io_context, asio::ip::make_address(argv[1]));
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/nonblocking/third_party_lib.cpp b/3rdparty/asio/src/examples/cpp11/nonblocking/third_party_lib.cpp
new file mode 100644
index 00000000000..7239a598532
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/nonblocking/third_party_lib.cpp
@@ -0,0 +1,212 @@
+//
+// third_party_lib.cpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <array>
+#include <iostream>
+#include <memory>
+
+using asio::ip::tcp;
+
+namespace third_party_lib {
+
+// Simulation of a third party library that wants to perform read and write
+// operations directly on a socket. It needs to be polled to determine whether
+// it requires a read or write operation, and notified when the socket is ready
+// for reading or writing.
+class session
+{
+public:
+ session(tcp::socket& socket)
+ : socket_(socket)
+ {
+ }
+
+ // Returns true if the third party library wants to be notified when the
+ // socket is ready for reading.
+ bool want_read() const
+ {
+ return state_ == reading;
+ }
+
+ // Notify that third party library that it should perform its read operation.
+ void do_read(std::error_code& ec)
+ {
+ if (std::size_t len = socket_.read_some(asio::buffer(data_), ec))
+ {
+ write_buffer_ = asio::buffer(data_, len);
+ state_ = writing;
+ }
+ }
+
+ // Returns true if the third party library wants to be notified when the
+ // socket is ready for writing.
+ bool want_write() const
+ {
+ return state_ == writing;
+ }
+
+ // Notify that third party library that it should perform its write operation.
+ void do_write(std::error_code& ec)
+ {
+ if (std::size_t len = socket_.write_some(
+ asio::buffer(write_buffer_), ec))
+ {
+ write_buffer_ = write_buffer_ + len;
+ state_ = asio::buffer_size(write_buffer_) > 0 ? writing : reading;
+ }
+ }
+
+private:
+ tcp::socket& socket_;
+ enum { reading, writing } state_ = reading;
+ std::array<char, 128> data_;
+ asio::const_buffer write_buffer_;
+};
+
+} // namespace third_party_lib
+
+// The glue between asio's sockets and the third party library.
+class connection
+ : public std::enable_shared_from_this<connection>
+{
+public:
+ connection(tcp::socket socket)
+ : socket_(std::move(socket))
+ {
+ }
+
+ void start()
+ {
+ // Put the socket into non-blocking mode.
+ socket_.non_blocking(true);
+
+ do_operations();
+ }
+
+private:
+ void do_operations()
+ {
+ auto self(shared_from_this());
+
+ // Start a read operation if the third party library wants one.
+ if (session_impl_.want_read() && !read_in_progress_)
+ {
+ read_in_progress_ = true;
+ socket_.async_wait(tcp::socket::wait_read,
+ [this, self](std::error_code ec)
+ {
+ read_in_progress_ = false;
+
+ // Notify third party library that it can perform a read.
+ if (!ec)
+ session_impl_.do_read(ec);
+
+ // The third party library successfully performed a read on the
+ // socket. Start new read or write operations based on what it now
+ // wants.
+ if (!ec || ec == asio::error::would_block)
+ do_operations();
+
+ // Otherwise, an error occurred. Closing the socket cancels any
+ // outstanding asynchronous read or write operations. The
+ // connection object will be destroyed automatically once those
+ // outstanding operations complete.
+ else
+ socket_.close();
+ });
+ }
+
+ // Start a write operation if the third party library wants one.
+ if (session_impl_.want_write() && !write_in_progress_)
+ {
+ write_in_progress_ = true;
+ socket_.async_wait(tcp::socket::wait_write,
+ [this, self](std::error_code ec)
+ {
+ write_in_progress_ = false;
+
+ // Notify third party library that it can perform a write.
+ if (!ec)
+ session_impl_.do_write(ec);
+
+ // The third party library successfully performed a write on the
+ // socket. Start new read or write operations based on what it now
+ // wants.
+ if (!ec || ec == asio::error::would_block)
+ do_operations();
+
+ // Otherwise, an error occurred. Closing the socket cancels any
+ // outstanding asynchronous read or write operations. The
+ // connection object will be destroyed automatically once those
+ // outstanding operations complete.
+ else
+ socket_.close();
+ });
+ }
+ }
+
+private:
+ tcp::socket socket_;
+ third_party_lib::session session_impl_{socket_};
+ bool read_in_progress_ = false;
+ bool write_in_progress_ = false;
+};
+
+class server
+{
+public:
+ server(asio::io_context& io_context, unsigned short port)
+ : acceptor_(io_context, {tcp::v4(), port})
+ {
+ do_accept();
+ }
+
+private:
+ void do_accept()
+ {
+ acceptor_.async_accept(
+ [this](std::error_code ec, tcp::socket socket)
+ {
+ if (!ec)
+ {
+ std::make_shared<connection>(std::move(socket))->start();
+ }
+
+ do_accept();
+ });
+ }
+
+ tcp::acceptor acceptor_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: third_party_lib <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ server s(io_context, std::atoi(argv[1]));
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/operations/composed_1.cpp b/3rdparty/asio/src/examples/cpp11/operations/composed_1.cpp
new file mode 100644
index 00000000000..054dbdbbc88
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/operations/composed_1.cpp
@@ -0,0 +1,159 @@
+//
+// composed_1.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <cstring>
+#include <iostream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+//------------------------------------------------------------------------------
+
+// This is the simplest example of a composed asynchronous operation, where we
+// simply repackage an existing operation. The asynchronous operation
+// requirements are met by delegating responsibility to the underlying
+// operation.
+
+template <typename CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const char* message, CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is void.
+ // However, when the completion token is asio::yield_context (used for
+ // stackful coroutines) the return type would be std::size_t, and when the
+ // completion token is asio::use_future it would be std::future<std::size_t>.
+ // When the completion token is asio::deferred, the return type differs for
+ // each asynchronous operation.
+ //
+ // In this example we are trivially delegating to an underlying asynchronous
+ // operation, so we can deduce the return type from that.
+ -> decltype(
+ asio::async_write(socket,
+ asio::buffer(message, std::strlen(message)),
+ std::forward<CompletionToken>(token)))
+{
+ // When delegating to the underlying operation we must take care to perfectly
+ // forward the completion token. This ensures that our operation works
+ // correctly with move-only function objects as callbacks, as well as other
+ // completion token types.
+ return asio::async_write(socket,
+ asio::buffer(message, std::strlen(message)),
+ std::forward<CompletionToken>(token));
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, "Testing callback\r\n",
+ [](const std::error_code& error, std::size_t n)
+ {
+ if (!error)
+ {
+ std::cout << n << " bytes transferred\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation and its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_message(socket,
+ "Testing deferred\r\n", asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error, std::size_t n)
+ {
+ if (!error)
+ {
+ std::cout << n << " bytes transferred\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<std::size_t> f = async_write_message(
+ socket, "Testing future\r\n", asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ std::size_t n = f.get();
+ std::cout << n << " bytes transferred\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/operations/composed_2.cpp b/3rdparty/asio/src/examples/cpp11/operations/composed_2.cpp
new file mode 100644
index 00000000000..306d4b343b4
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/operations/composed_2.cpp
@@ -0,0 +1,229 @@
+//
+// composed_2.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <cstring>
+#include <iostream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This next simplest example of a composed asynchronous operation involves
+// repackaging multiple operations but choosing to invoke just one of them. All
+// of these underlying operations have the same completion signature. The
+// asynchronous operation requirements are met by delegating responsibility to
+// the underlying operations.
+
+// In addition to determining the mechanism by which an asynchronous operation
+// delivers its result, a completion token also determines the time when the
+// operation commences. For example, when the completion token is a simple
+// callback the operation commences before the initiating function returns.
+// However, if the completion token's delivery mechanism uses a future, we
+// might instead want to defer initiation of the operation until the returned
+// future object is waited upon.
+//
+// To enable this, when implementing an asynchronous operation we must package
+// the initiation step as a function object.
+struct async_write_message_initiation
+{
+ // The initiation function object's call operator is passed the concrete
+ // completion handler produced by the completion token. This completion
+ // handler matches the asynchronous operation's completion handler signature,
+ // which in this example is:
+ //
+ // void(std::error_code error, std::size_t)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments as members in the initiaton function object. However, we should
+ // prefer to propagate them as function call arguments as this allows the
+ // completion token to optimise how they are passed. For example, a lazy
+ // future which defers initiation would need to make a decay-copy of the
+ // arguments, but when using a simple callback the arguments can be trivially
+ // forwarded straight through.)
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& completion_handler, tcp::socket& socket,
+ const char* message, bool allow_partial_write) const
+ {
+ if (allow_partial_write)
+ {
+ // When delegating to an underlying operation we must take care to
+ // perfectly forward the completion handler. This ensures that our
+ // operation works correctly with move-only function objects as
+ // callbacks.
+ return socket.async_write_some(
+ asio::buffer(message, std::strlen(message)),
+ std::forward<CompletionHandler>(completion_handler));
+ }
+ else
+ {
+ // As above, we must perfectly forward the completion handler when calling
+ // the alternate underlying operation.
+ return asio::async_write(socket,
+ asio::buffer(message, std::strlen(message)),
+ std::forward<CompletionHandler>(completion_handler));
+ }
+ }
+};
+
+template <typename CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const char* message, bool allow_partial_write,
+ CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is void.
+ // However, when the completion token is asio::yield_context (used for
+ // stackful coroutines) the return type would be std::size_t, and when the
+ // completion token is asio::use_future it would be std::future<std::size_t>.
+ // When the completion token is asio::deferred, the return type differs for
+ // each asynchronous operation.
+ //
+ // In C++11 we deduce the type from the call to asio::async_initiate.
+ -> decltype(
+ asio::async_initiate<
+ CompletionToken, void(std::error_code, std::size_t)>(
+ async_write_message_initiation(),
+ token, std::ref(socket), message, allow_partial_write))
+{
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code, std::size_t)>(
+ async_write_message_initiation(),
+ token, std::ref(socket), message, allow_partial_write);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, "Testing callback\r\n", false,
+ [](const std::error_code& error, std::size_t n)
+ {
+ if (!error)
+ {
+ std::cout << n << " bytes transferred\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation and its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_message(socket,
+ "Testing deferred\r\n", false, asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error, std::size_t n)
+ {
+ if (!error)
+ {
+ std::cout << n << " bytes transferred\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<std::size_t> f = async_write_message(
+ socket, "Testing future\r\n", false, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ std::size_t n = f.get();
+ std::cout << n << " bytes transferred\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/operations/composed_3.cpp b/3rdparty/asio/src/examples/cpp11/operations/composed_3.cpp
new file mode 100644
index 00000000000..e0b5ddca85b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/operations/composed_3.cpp
@@ -0,0 +1,238 @@
+//
+// composed_3.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/bind_executor.hpp>
+#include <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <cstring>
+#include <functional>
+#include <iostream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// In this composed operation we repackage an existing operation, but with a
+// different completion handler signature. The asynchronous operation
+// requirements are met by delegating responsibility to the underlying
+// operation.
+
+// In addition to determining the mechanism by which an asynchronous operation
+// delivers its result, a completion token also determines the time when the
+// operation commences. For example, when the completion token is a simple
+// callback the operation commences before the initiating function returns.
+// However, if the completion token's delivery mechanism uses a future, we
+// might instead want to defer initiation of the operation until the returned
+// future object is waited upon.
+//
+// To enable this, when implementing an asynchronous operation we must package
+// the initiation step as a function object.
+struct async_write_message_initiation
+{
+ // The initiation function object's call operator is passed the concrete
+ // completion handler produced by the completion token. This completion
+ // handler matches the asynchronous operation's completion handler signature,
+ // which in this example is:
+ //
+ // void(std::error_code error)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments as members in the initiaton function object. However, we should
+ // prefer to propagate them as function call arguments as this allows the
+ // completion token to optimise how they are passed. For example, a lazy
+ // future which defers initiation would need to make a decay-copy of the
+ // arguments, but when using a simple callback the arguments can be trivially
+ // forwarded straight through.)
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& completion_handler,
+ tcp::socket& socket, const char* message) const
+ {
+ // The async_write operation has a completion handler signature of:
+ //
+ // void(std::error_code error, std::size n)
+ //
+ // This differs from our operation's signature in that it is also passed
+ // the number of bytes transferred as an argument of type std::size_t. We
+ // will adapt our completion handler to async_write's completion handler
+ // signature by using std::bind, which drops the additional argument.
+ //
+ // However, it is essential to the correctness of our composed operation
+ // that we preserve the executor of the user-supplied completion handler.
+ // The std::bind function will not do this for us, so we must do this by
+ // first obtaining the completion handler's associated executor (defaulting
+ // to the I/O executor - in this case the executor of the socket - if the
+ // completion handler does not have its own) ...
+ auto executor = asio::get_associated_executor(
+ completion_handler, socket.get_executor());
+
+ // ... and then binding this executor to our adapted completion handler
+ // using the asio::bind_executor function.
+ asio::async_write(socket,
+ asio::buffer(message, std::strlen(message)),
+ asio::bind_executor(executor,
+ std::bind(std::forward<CompletionHandler>(
+ completion_handler), std::placeholders::_1)));
+ }
+};
+
+template <typename CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const char* message, CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++11 we deduce the type from the call to asio::async_initiate.
+ -> decltype(
+ asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ async_write_message_initiation(),
+ token, std::ref(socket), message))
+{
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ async_write_message_initiation(),
+ token, std::ref(socket), message);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, "Testing callback\r\n",
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation and its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_message(socket,
+ "Testing deferred\r\n", asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_message(
+ socket, "Testing future\r\n", asio::use_future);
+
+ io_context.run();
+
+ // Get the result of the operation.
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Message sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/operations/composed_4.cpp b/3rdparty/asio/src/examples/cpp11/operations/composed_4.cpp
new file mode 100644
index 00000000000..29fe26966e5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/operations/composed_4.cpp
@@ -0,0 +1,252 @@
+//
+// composed_4.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/bind_executor.hpp>
+#include <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <cstring>
+#include <functional>
+#include <iostream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// In this composed operation we repackage an existing operation, but with a
+// different completion handler signature. We will also intercept an empty
+// message as an invalid argument, and propagate the corresponding error to the
+// user. The asynchronous operation requirements are met by delegating
+// responsibility to the underlying operation.
+
+// In addition to determining the mechanism by which an asynchronous operation
+// delivers its result, a completion token also determines the time when the
+// operation commences. For example, when the completion token is a simple
+// callback the operation commences before the initiating function returns.
+// However, if the completion token's delivery mechanism uses a future, we
+// might instead want to defer initiation of the operation until the returned
+// future object is waited upon.
+//
+// To enable this, when implementing an asynchronous operation we must package
+// the initiation step as a function object.
+struct async_write_message_initiation
+{
+ // The initiation function object's call operator is passed the concrete
+ // completion handler produced by the completion token. This completion
+ // handler matches the asynchronous operation's completion handler signature,
+ // which in this example is:
+ //
+ // void(std::error_code error)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments as members in the initiaton function object. However, we should
+ // prefer to propagate them as function call arguments as this allows the
+ // completion token to optimise how they are passed. For example, a lazy
+ // future which defers initiation would need to make a decay-copy of the
+ // arguments, but when using a simple callback the arguments can be trivially
+ // forwarded straight through.)
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& completion_handler,
+ tcp::socket& socket, const char* message) const
+ {
+ // The post operation has a completion handler signature of:
+ //
+ // void()
+ //
+ // and the async_write operation has a completion handler signature of:
+ //
+ // void(std::error_code error, std::size n)
+ //
+ // Both of these operations' completion handler signatures differ from our
+ // operation's completion handler signature. We will adapt our completion
+ // handler to these signatures by using std::bind, which drops the
+ // additional arguments.
+ //
+ // However, it is essential to the correctness of our composed operation
+ // that we preserve the executor of the user-supplied completion handler.
+ // The std::bind function will not do this for us, so we must do this by
+ // first obtaining the completion handler's associated executor (defaulting
+ // to the I/O executor - in this case the executor of the socket - if the
+ // completion handler does not have its own) ...
+ auto executor = asio::get_associated_executor(
+ completion_handler, socket.get_executor());
+
+ // ... and then binding this executor to our adapted completion handler
+ // using the asio::bind_executor function.
+ std::size_t length = std::strlen(message);
+ if (length == 0)
+ {
+ asio::post(
+ asio::bind_executor(executor,
+ std::bind(std::forward<CompletionHandler>(completion_handler),
+ asio::error::invalid_argument)));
+ }
+ else
+ {
+ asio::async_write(socket,
+ asio::buffer(message, length),
+ asio::bind_executor(executor,
+ std::bind(std::forward<CompletionHandler>(completion_handler),
+ std::placeholders::_1)));
+ }
+ }
+};
+
+template <typename CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const char* message, CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++11 we deduce the type from the call to asio::async_initiate.
+ -> decltype(
+ asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ async_write_message_initiation(),
+ token, std::ref(socket), message))
+{
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ async_write_message_initiation(),
+ token, std::ref(socket), message);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, "",
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation and its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_message(socket, "", asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_message(
+ socket, "", asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Message sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/operations/composed_5.cpp b/3rdparty/asio/src/examples/cpp11/operations/composed_5.cpp
new file mode 100644
index 00000000000..06a7af40f41
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/operations/composed_5.cpp
@@ -0,0 +1,289 @@
+//
+// composed_5.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This composed operation automatically serialises a message, using its I/O
+// streams insertion operator, before sending it on the socket. To do this, it
+// must allocate a buffer for the encoded message and ensure this buffer's
+// validity until the underlying async_write operation completes.
+
+// In addition to determining the mechanism by which an asynchronous operation
+// delivers its result, a completion token also determines the time when the
+// operation commences. For example, when the completion token is a simple
+// callback the operation commences before the initiating function returns.
+// However, if the completion token's delivery mechanism uses a future, we
+// might instead want to defer initiation of the operation until the returned
+// future object is waited upon.
+//
+// To enable this, when implementing an asynchronous operation we must package
+// the initiation step as a function object.
+struct async_write_message_initiation
+{
+ // The initiation function object's call operator is passed the concrete
+ // completion handler produced by the completion token. This completion
+ // handler matches the asynchronous operation's completion handler signature,
+ // which in this example is:
+ //
+ // void(std::error_code error)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments as members in the initiaton function object. However, we should
+ // prefer to propagate them as function call arguments as this allows the
+ // completion token to optimise how they are passed. For example, a lazy
+ // future which defers initiation would need to make a decay-copy of the
+ // arguments, but when using a simple callback the arguments can be trivially
+ // forwarded straight through.)
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& completion_handler,
+ tcp::socket& socket, std::unique_ptr<std::string> encoded_message) const
+ {
+ // In this example, the composed operation's intermediate completion
+ // handler is implemented as a hand-crafted function object, rather than
+ // using a lambda or std::bind.
+ struct intermediate_completion_handler
+ {
+ // The intermediate completion handler holds a reference to the socket so
+ // that it can obtain the I/O executor (see get_executor below).
+ tcp::socket& socket_;
+
+ // The allocated buffer for the encoded message. The std::unique_ptr
+ // smart pointer is move-only, and as a consequence our intermediate
+ // completion handler is also move-only.
+ std::unique_ptr<std::string> encoded_message_;
+
+ // The user-supplied completion handler.
+ typename std::decay<CompletionHandler>::type handler_;
+
+ // The function call operator matches the completion signature of the
+ // async_write operation.
+ void operator()(const std::error_code& error, std::size_t /*n*/)
+ {
+ // Deallocate the encoded message before calling the user-supplied
+ // completion handler.
+ encoded_message_.reset();
+
+ // Call the user-supplied handler with the result of the operation.
+ // The arguments must match the completion signature of our composed
+ // operation.
+ handler_(error);
+ }
+
+ // It is essential to the correctness of our composed operation that we
+ // preserve the executor of the user-supplied completion handler. With a
+ // hand-crafted function object we can do this by defining a nested type
+ // executor_type and member function get_executor. These obtain the
+ // completion handler's associated executor, and default to the I/O
+ // executor - in this case the executor of the socket - if the completion
+ // handler does not have its own.
+ using executor_type = asio::associated_executor_t<
+ typename std::decay<CompletionHandler>::type,
+ tcp::socket::executor_type>;
+
+ executor_type get_executor() const noexcept
+ {
+ return asio::get_associated_executor(
+ handler_, socket_.get_executor());
+ }
+
+ // Although not necessary for correctness, we may also preserve the
+ // allocator of the user-supplied completion handler. This is achieved by
+ // defining a nested type allocator_type and member function
+ // get_allocator. These obtain the completion handler's associated
+ // allocator, and default to std::allocator<void> if the completion
+ // handler does not have its own.
+ using allocator_type = asio::associated_allocator_t<
+ typename std::decay<CompletionHandler>::type,
+ std::allocator<void>>;
+
+ allocator_type get_allocator() const noexcept
+ {
+ return asio::get_associated_allocator(
+ handler_, std::allocator<void>{});
+ }
+ };
+
+ // Initiate the underlying async_write operation using our intermediate
+ // completion handler.
+ auto encoded_message_buffer = asio::buffer(*encoded_message);
+ asio::async_write(socket, encoded_message_buffer,
+ intermediate_completion_handler{socket, std::move(encoded_message),
+ std::forward<CompletionHandler>(completion_handler)});
+ }
+};
+
+template <typename T, typename CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const T& message, CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++11 we deduce the type from the call to asio::async_initiate.
+ -> decltype(
+ asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ async_write_message_initiation(), token,
+ std::ref(socket), std::declval<std::unique_ptr<std::string>>()))
+{
+ // Encode the message and copy it into an allocated buffer. The buffer will
+ // be maintained for the lifetime of the asynchronous operation.
+ std::ostringstream os;
+ os << message;
+ std::unique_ptr<std::string> encoded_message(new std::string(os.str()));
+
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ async_write_message_initiation(), token,
+ std::ref(socket), std::move(encoded_message));
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, 123456,
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation and its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_message(socket,
+ std::string("abcdef"), asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_message(
+ socket, 654.321, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Message sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/operations/composed_6.cpp b/3rdparty/asio/src/examples/cpp11/operations/composed_6.cpp
new file mode 100644
index 00000000000..b948758d83a
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/operations/composed_6.cpp
@@ -0,0 +1,349 @@
+//
+// composed_6.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/deferred.hpp>
+#include <asio/executor_work_guard.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/steady_timer.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This composed operation shows composition of multiple underlying operations.
+// It automatically serialises a message, using its I/O streams insertion
+// operator, before sending it N times on the socket. To do this, it must
+// allocate a buffer for the encoded message and ensure this buffer's validity
+// until all underlying async_write operation complete. A one second delay is
+// inserted prior to each write operation, using a steady_timer.
+
+// In addition to determining the mechanism by which an asynchronous operation
+// delivers its result, a completion token also determines the time when the
+// operation commences. For example, when the completion token is a simple
+// callback the operation commences before the initiating function returns.
+// However, if the completion token's delivery mechanism uses a future, we
+// might instead want to defer initiation of the operation until the returned
+// future object is waited upon.
+//
+// To enable this, when implementing an asynchronous operation we must package
+// the initiation step as a function object.
+struct async_write_message_initiation
+{
+ // The initiation function object's call operator is passed the concrete
+ // completion handler produced by the completion token. This completion
+ // handler matches the asynchronous operation's completion handler signature,
+ // which in this example is:
+ //
+ // void(std::error_code error)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments as members in the initiaton function object. However, we should
+ // prefer to propagate them as function call arguments as this allows the
+ // completion token to optimise how they are passed. For example, a lazy
+ // future which defers initiation would need to make a decay-copy of the
+ // arguments, but when using a simple callback the arguments can be trivially
+ // forwarded straight through.)
+ template <typename CompletionHandler>
+ void operator()(CompletionHandler&& completion_handler, tcp::socket& socket,
+ std::unique_ptr<std::string> encoded_message, std::size_t repeat_count,
+ std::unique_ptr<asio::steady_timer> delay_timer) const
+ {
+ // In this example, the composed operation's intermediate completion
+ // handler is implemented as a hand-crafted function object.
+ struct intermediate_completion_handler
+ {
+ // The intermediate completion handler holds a reference to the socket as
+ // it is used for multiple async_write operations, as well as for
+ // obtaining the I/O executor (see get_executor below).
+ tcp::socket& socket_;
+
+ // The allocated buffer for the encoded message. The std::unique_ptr
+ // smart pointer is move-only, and as a consequence our intermediate
+ // completion handler is also move-only.
+ std::unique_ptr<std::string> encoded_message_;
+
+ // The repeat count remaining.
+ std::size_t repeat_count_;
+
+ // A steady timer used for introducing a delay.
+ std::unique_ptr<asio::steady_timer> delay_timer_;
+
+ // To manage the cycle between the multiple underlying asychronous
+ // operations, our intermediate completion handler is implemented as a
+ // state machine.
+ enum { starting, waiting, writing } state_;
+
+ // As our composed operation performs multiple underlying I/O operations,
+ // we should maintain a work object against the I/O executor. This tells
+ // the I/O executor that there is still more work to come in the future.
+ asio::executor_work_guard<tcp::socket::executor_type> io_work_;
+
+ // The user-supplied completion handler, called once only on completion
+ // of the entire composed operation.
+ typename std::decay<CompletionHandler>::type handler_;
+
+ // By having a default value for the second argument, this function call
+ // operator matches the completion signature of both the async_write and
+ // steady_timer::async_wait operations.
+ void operator()(const std::error_code& error, std::size_t = 0)
+ {
+ if (!error)
+ {
+ switch (state_)
+ {
+ case starting:
+ case writing:
+ if (repeat_count_ > 0)
+ {
+ --repeat_count_;
+ state_ = waiting;
+ delay_timer_->expires_after(std::chrono::seconds(1));
+ delay_timer_->async_wait(std::move(*this));
+ return; // Composed operation not yet complete.
+ }
+ break; // Composed operation complete, continue below.
+ case waiting:
+ state_ = writing;
+ asio::async_write(socket_,
+ asio::buffer(*encoded_message_), std::move(*this));
+ return; // Composed operation not yet complete.
+ }
+ }
+
+ // This point is reached only on completion of the entire composed
+ // operation.
+
+ // We no longer have any future work coming for the I/O executor.
+ io_work_.reset();
+
+ // Deallocate the encoded message before calling the user-supplied
+ // completion handler.
+ encoded_message_.reset();
+
+ // Call the user-supplied handler with the result of the operation.
+ handler_(error);
+ }
+
+ // It is essential to the correctness of our composed operation that we
+ // preserve the executor of the user-supplied completion handler. With a
+ // hand-crafted function object we can do this by defining a nested type
+ // executor_type and member function get_executor. These obtain the
+ // completion handler's associated executor, and default to the I/O
+ // executor - in this case the executor of the socket - if the completion
+ // handler does not have its own.
+ using executor_type = asio::associated_executor_t<
+ typename std::decay<CompletionHandler>::type,
+ tcp::socket::executor_type>;
+
+ executor_type get_executor() const noexcept
+ {
+ return asio::get_associated_executor(
+ handler_, socket_.get_executor());
+ }
+
+ // Although not necessary for correctness, we may also preserve the
+ // allocator of the user-supplied completion handler. This is achieved by
+ // defining a nested type allocator_type and member function
+ // get_allocator. These obtain the completion handler's associated
+ // allocator, and default to std::allocator<void> if the completion
+ // handler does not have its own.
+ using allocator_type = asio::associated_allocator_t<
+ typename std::decay<CompletionHandler>::type,
+ std::allocator<void>>;
+
+ allocator_type get_allocator() const noexcept
+ {
+ return asio::get_associated_allocator(
+ handler_, std::allocator<void>{});
+ }
+ };
+
+ // Initiate the underlying async_write operation using our intermediate
+ // completion handler.
+ auto encoded_message_buffer = asio::buffer(*encoded_message);
+ asio::async_write(socket, encoded_message_buffer,
+ intermediate_completion_handler{
+ socket, std::move(encoded_message),
+ repeat_count, std::move(delay_timer),
+ intermediate_completion_handler::starting,
+ asio::make_work_guard(socket.get_executor()),
+ std::forward<CompletionHandler>(completion_handler)});
+ }
+};
+
+template <typename T, typename CompletionToken>
+auto async_write_messages(tcp::socket& socket,
+ const T& message, std::size_t repeat_count,
+ CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++11 we deduce the type from the call to asio::async_initiate.
+ -> decltype(
+ asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ async_write_message_initiation(), token, std::ref(socket),
+ std::declval<std::unique_ptr<std::string>>(), repeat_count,
+ std::declval<std::unique_ptr<asio::steady_timer>>()))
+{
+ // Encode the message and copy it into an allocated buffer. The buffer will
+ // be maintained for the lifetime of the composed asynchronous operation.
+ std::ostringstream os;
+ os << message;
+ std::unique_ptr<std::string> encoded_message(new std::string(os.str()));
+
+ // Create a steady_timer to be used for the delay between messages.
+ std::unique_ptr<asio::steady_timer> delay_timer(
+ new asio::steady_timer(socket.get_executor()));
+
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ async_write_message_initiation(), token, std::ref(socket),
+ std::move(encoded_message), repeat_count, std::move(delay_timer));
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_messages(socket, "Testing callback\r\n", 5,
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation and its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_messages(socket,
+ "Testing deferred\r\n", 5, asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_messages(
+ socket, "Testing future\r\n", 5, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Messages sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/operations/composed_7.cpp b/3rdparty/asio/src/examples/cpp11/operations/composed_7.cpp
new file mode 100644
index 00000000000..8eb83dc7679
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/operations/composed_7.cpp
@@ -0,0 +1,268 @@
+//
+// composed_7.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/compose.hpp>
+#include <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/steady_timer.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_compose function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This composed operation shows composition of multiple underlying operations.
+// It automatically serialises a message, using its I/O streams insertion
+// operator, before sending it N times on the socket. To do this, it must
+// allocate a buffer for the encoded message and ensure this buffer's validity
+// until all underlying async_write operation complete. A one second delay is
+// inserted prior to each write operation, using a steady_timer.
+
+// In this example, the composed operation's logic is implemented as a state
+// machine within a hand-crafted function object.
+struct async_write_messages_implementation
+{
+ // The implementation holds a reference to the socket as it is used for
+ // multiple async_write operations.
+ tcp::socket& socket_;
+
+ // The allocated buffer for the encoded message. The std::unique_ptr smart
+ // pointer is move-only, and as a consequence our implementation is also
+ // move-only.
+ std::unique_ptr<std::string> encoded_message_;
+
+ // The repeat count remaining.
+ std::size_t repeat_count_;
+
+ // A steady timer used for introducing a delay.
+ std::unique_ptr<asio::steady_timer> delay_timer_;
+
+ // To manage the cycle between the multiple underlying asychronous
+ // operations, our implementation is a state machine.
+ enum { starting, waiting, writing } state_;
+
+ // The first argument to our function object's call operator is a reference
+ // to the enclosing intermediate completion handler. This intermediate
+ // completion handler is provided for us by the asio::async_compose
+ // function, and takes care of all the details required to implement a
+ // conforming asynchronous operation. When calling an underlying asynchronous
+ // operation, we pass it this enclosing intermediate completion handler
+ // as the completion token.
+ //
+ // All arguments after the first must be defaulted to allow the state machine
+ // to be started, as well as to allow the completion handler to match the
+ // completion signature of both the async_write and steady_timer::async_wait
+ // operations.
+ template <typename Self>
+ void operator()(Self& self,
+ const std::error_code& error = std::error_code(),
+ std::size_t = 0)
+ {
+ if (!error)
+ {
+ switch (state_)
+ {
+ case starting:
+ case writing:
+ if (repeat_count_ > 0)
+ {
+ --repeat_count_;
+ state_ = waiting;
+ delay_timer_->expires_after(std::chrono::seconds(1));
+ delay_timer_->async_wait(std::move(self));
+ return; // Composed operation not yet complete.
+ }
+ break; // Composed operation complete, continue below.
+ case waiting:
+ state_ = writing;
+ asio::async_write(socket_,
+ asio::buffer(*encoded_message_), std::move(self));
+ return; // Composed operation not yet complete.
+ }
+ }
+
+ // This point is reached only on completion of the entire composed
+ // operation.
+
+ // Deallocate the encoded message and delay timer before calling the
+ // user-supplied completion handler.
+ encoded_message_.reset();
+ delay_timer_.reset();
+
+ // Call the user-supplied handler with the result of the operation.
+ self.complete(error);
+ }
+};
+
+template <typename T, typename CompletionToken>
+auto async_write_messages(tcp::socket& socket,
+ const T& message, std::size_t repeat_count,
+ CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++11 we deduce the type from the call to asio::async_compose.
+ -> decltype(
+ asio::async_compose<
+ CompletionToken, void(std::error_code)>(
+ std::declval<async_write_messages_implementation>(),
+ token, socket))
+{
+ // Encode the message and copy it into an allocated buffer. The buffer will
+ // be maintained for the lifetime of the composed asynchronous operation.
+ std::ostringstream os;
+ os << message;
+ std::unique_ptr<std::string> encoded_message(new std::string(os.str()));
+
+ // Create a steady_timer to be used for the delay between messages.
+ std::unique_ptr<asio::steady_timer> delay_timer(
+ new asio::steady_timer(socket.get_executor()));
+
+ // The asio::async_compose function takes:
+ //
+ // - our asynchronous operation implementation,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any I/O objects (or executors) used by the operation
+ //
+ // It then wraps our implementation in an intermediate completion handler
+ // that meets the requirements of a conforming asynchronous operation. This
+ // includes tracking outstanding work against the I/O executors associated
+ // with the operation (in this example, this is the socket's executor).
+ return asio::async_compose<
+ CompletionToken, void(std::error_code)>(
+ async_write_messages_implementation{
+ socket, std::move(encoded_message),
+ repeat_count, std::move(delay_timer),
+ async_write_messages_implementation::starting},
+ token, socket);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_messages(socket, "Testing callback\r\n", 5,
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation and its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_messages(socket,
+ "Testing deferred\r\n", 5, asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_messages(
+ socket, "Testing future\r\n", 5, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Messages sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/operations/composed_8.cpp b/3rdparty/asio/src/examples/cpp11/operations/composed_8.cpp
new file mode 100644
index 00000000000..ce22a5b418d
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/operations/composed_8.cpp
@@ -0,0 +1,263 @@
+//
+// composed_8.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/compose.hpp>
+#include <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/steady_timer.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_compose function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This composed operation shows composition of multiple underlying operations,
+// using asio's stackless coroutines support to express the flow of control. It
+// automatically serialises a message, using its I/O streams insertion
+// operator, before sending it N times on the socket. To do this, it must
+// allocate a buffer for the encoded message and ensure this buffer's validity
+// until all underlying async_write operation complete. A one second delay is
+// inserted prior to each write operation, using a steady_timer.
+
+#include <asio/yield.hpp>
+
+// In this example, the composed operation's logic is implemented as a state
+// machine within a hand-crafted function object.
+struct async_write_messages_implementation
+{
+ // The implementation holds a reference to the socket as it is used for
+ // multiple async_write operations.
+ tcp::socket& socket_;
+
+ // The allocated buffer for the encoded message. The std::unique_ptr smart
+ // pointer is move-only, and as a consequence our implementation is also
+ // move-only.
+ std::unique_ptr<std::string> encoded_message_;
+
+ // The repeat count remaining.
+ std::size_t repeat_count_;
+
+ // A steady timer used for introducing a delay.
+ std::unique_ptr<asio::steady_timer> delay_timer_;
+
+ // The coroutine state.
+ asio::coroutine coro_;
+
+ // The first argument to our function object's call operator is a reference
+ // to the enclosing intermediate completion handler. This intermediate
+ // completion handler is provided for us by the asio::async_compose
+ // function, and takes care of all the details required to implement a
+ // conforming asynchronous operation. When calling an underlying asynchronous
+ // operation, we pass it this enclosing intermediate completion handler
+ // as the completion token.
+ //
+ // All arguments after the first must be defaulted to allow the state machine
+ // to be started, as well as to allow the completion handler to match the
+ // completion signature of both the async_write and steady_timer::async_wait
+ // operations.
+ template <typename Self>
+ void operator()(Self& self,
+ const std::error_code& error = std::error_code(),
+ std::size_t = 0)
+ {
+ reenter (coro_)
+ {
+ while (repeat_count_ > 0)
+ {
+ --repeat_count_;
+
+ delay_timer_->expires_after(std::chrono::seconds(1));
+ yield delay_timer_->async_wait(std::move(self));
+ if (error)
+ break;
+
+ yield asio::async_write(socket_,
+ asio::buffer(*encoded_message_), std::move(self));
+ if (error)
+ break;
+ }
+
+ // Deallocate the encoded message and delay timer before calling the
+ // user-supplied completion handler.
+ encoded_message_.reset();
+ delay_timer_.reset();
+
+ // Call the user-supplied handler with the result of the operation.
+ self.complete(error);
+ }
+ }
+};
+
+#include <asio/unyield.hpp>
+
+template <typename T, typename CompletionToken>
+auto async_write_messages(tcp::socket& socket,
+ const T& message, std::size_t repeat_count,
+ CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++11 we deduce the type from the call to asio::async_compose.
+ -> decltype(
+ asio::async_compose<
+ CompletionToken, void(std::error_code)>(
+ std::declval<async_write_messages_implementation>(),
+ token, socket))
+{
+ // Encode the message and copy it into an allocated buffer. The buffer will
+ // be maintained for the lifetime of the composed asynchronous operation.
+ std::ostringstream os;
+ os << message;
+ std::unique_ptr<std::string> encoded_message(new std::string(os.str()));
+
+ // Create a steady_timer to be used for the delay between messages.
+ std::unique_ptr<asio::steady_timer> delay_timer(
+ new asio::steady_timer(socket.get_executor()));
+
+ // The asio::async_compose function takes:
+ //
+ // - our asynchronous operation implementation,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any I/O objects (or executors) used by the operation
+ //
+ // It then wraps our implementation in an intermediate completion handler
+ // that meets the requirements of a conforming asynchronous operation. This
+ // includes tracking outstanding work against the I/O executors associated
+ // with the operation (in this example, this is the socket's executor).
+ return asio::async_compose<
+ CompletionToken, void(std::error_code)>(
+ async_write_messages_implementation{socket,
+ std::move(encoded_message), repeat_count,
+ std::move(delay_timer), asio::coroutine()},
+ token, socket);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_messages(socket, "Testing callback\r\n", 5,
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation and its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_messages(socket,
+ "Testing deferred\r\n", 5, asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_messages(
+ socket, "Testing future\r\n", 5, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Messages sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/parallel_group/ranged_wait_for_all.cpp b/3rdparty/asio/src/examples/cpp11/parallel_group/ranged_wait_for_all.cpp
new file mode 100644
index 00000000000..18772884072
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/parallel_group/ranged_wait_for_all.cpp
@@ -0,0 +1,70 @@
+//
+// ranged_wait_for_all.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/parallel_group.hpp>
+#include <iostream>
+#include <vector>
+
+#ifdef ASIO_HAS_POSIX_STREAM_DESCRIPTOR
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::posix::stream_descriptor out(ctx, ::dup(STDOUT_FILENO));
+ asio::posix::stream_descriptor err(ctx, ::dup(STDERR_FILENO));
+
+ using op_type = decltype(
+ out.async_write_some(
+ asio::buffer("", 0),
+ asio::deferred
+ )
+ );
+
+ std::vector<op_type> ops;
+
+ ops.push_back(
+ out.async_write_some(
+ asio::buffer("first\r\n", 7),
+ asio::deferred
+ )
+ );
+
+ ops.push_back(
+ err.async_write_some(
+ asio::buffer("second\r\n", 8),
+ asio::deferred
+ )
+ );
+
+ asio::experimental::make_parallel_group(ops).async_wait(
+ asio::experimental::wait_for_all(),
+ [](
+ std::vector<std::size_t> completion_order,
+ std::vector<std::error_code> ec,
+ std::vector<std::size_t> n
+ )
+ {
+ for (std::size_t i = 0; i < completion_order.size(); ++i)
+ {
+ std::size_t idx = completion_order[i];
+ std::cout << "operation " << idx << " finished: ";
+ std::cout << ec[idx] << ", " << n[idx] << "\n";
+ }
+ }
+ );
+
+ ctx.run();
+}
+
+#else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+int main() {}
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
diff --git a/3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_all.cpp b/3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_all.cpp
new file mode 100644
index 00000000000..a489a2966da
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_all.cpp
@@ -0,0 +1,62 @@
+//
+// wait_for_all.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/deferred.hpp>
+#include <asio/experimental/parallel_group.hpp>
+#include <iostream>
+
+#ifdef ASIO_HAS_POSIX_STREAM_DESCRIPTOR
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::posix::stream_descriptor in(ctx, ::dup(STDIN_FILENO));
+ asio::steady_timer timer(ctx, std::chrono::seconds(5));
+
+ char data[1024];
+
+ asio::experimental::make_parallel_group(
+ in.async_read_some(
+ asio::buffer(data),
+ asio::deferred),
+ timer.async_wait(
+ asio::deferred)
+ ).async_wait(
+ asio::experimental::wait_for_all(),
+ [](
+ std::array<std::size_t, 2> completion_order,
+ std::error_code ec1, std::size_t n1,
+ std::error_code ec2
+ )
+ {
+ switch (completion_order[0])
+ {
+ case 0:
+ {
+ std::cout << "descriptor finished: " << ec1 << ", " << n1 << "\n";
+ }
+ break;
+ case 1:
+ {
+ std::cout << "timer finished: " << ec2 << "\n";
+ }
+ break;
+ }
+ }
+ );
+
+ ctx.run();
+}
+
+#else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+int main() {}
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
diff --git a/3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_one.cpp b/3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_one.cpp
new file mode 100644
index 00000000000..499684af69f
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_one.cpp
@@ -0,0 +1,62 @@
+//
+// wait_for_one.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/deferred.hpp>
+#include <asio/experimental/parallel_group.hpp>
+#include <iostream>
+
+#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::posix::stream_descriptor in(ctx, ::dup(STDIN_FILENO));
+ asio::steady_timer timer(ctx, std::chrono::seconds(5));
+
+ char data[1024];
+
+ asio::experimental::make_parallel_group(
+ in.async_read_some(
+ asio::buffer(data),
+ asio::deferred),
+ timer.async_wait(
+ asio::deferred)
+ ).async_wait(
+ asio::experimental::wait_for_one(),
+ [](
+ std::array<std::size_t, 2> completion_order,
+ std::error_code ec1, std::size_t n1,
+ std::error_code ec2
+ )
+ {
+ switch (completion_order[0])
+ {
+ case 0:
+ {
+ std::cout << "descriptor finished: " << ec1 << ", " << n1 << "\n";
+ }
+ break;
+ case 1:
+ {
+ std::cout << "timer finished: " << ec2 << "\n";
+ }
+ break;
+ }
+ }
+ );
+
+ ctx.run();
+}
+
+#else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+int main() {}
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
diff --git a/3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_one_error.cpp b/3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_one_error.cpp
new file mode 100644
index 00000000000..f6e52d6ca0e
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_one_error.cpp
@@ -0,0 +1,62 @@
+//
+// wait_for_one_error.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/deferred.hpp>
+#include <asio/experimental/parallel_group.hpp>
+#include <iostream>
+
+#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::posix::stream_descriptor in(ctx, ::dup(STDIN_FILENO));
+ asio::steady_timer timer(ctx, std::chrono::seconds(5));
+
+ char data[1024];
+
+ asio::experimental::make_parallel_group(
+ in.async_read_some(
+ asio::buffer(data),
+ asio::deferred),
+ timer.async_wait(
+ asio::deferred)
+ ).async_wait(
+ asio::experimental::wait_for_one_error(),
+ [](
+ std::array<std::size_t, 2> completion_order,
+ std::error_code ec1, std::size_t n1,
+ std::error_code ec2
+ )
+ {
+ switch (completion_order[0])
+ {
+ case 0:
+ {
+ std::cout << "descriptor finished: " << ec1 << ", " << n1 << "\n";
+ }
+ break;
+ case 1:
+ {
+ std::cout << "timer finished: " << ec2 << "\n";
+ }
+ break;
+ }
+ }
+ );
+
+ ctx.run();
+}
+
+#else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+int main() {}
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
diff --git a/3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_one_success.cpp b/3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_one_success.cpp
new file mode 100644
index 00000000000..16fd2130ab8
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/parallel_group/wait_for_one_success.cpp
@@ -0,0 +1,62 @@
+//
+// wait_for_one_error.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/deferred.hpp>
+#include <asio/experimental/parallel_group.hpp>
+#include <iostream>
+
+#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::posix::stream_descriptor in(ctx, ::dup(STDIN_FILENO));
+ asio::steady_timer timer(ctx, std::chrono::seconds(5));
+
+ char data[1024];
+
+ asio::experimental::make_parallel_group(
+ in.async_read_some(
+ asio::buffer(data),
+ asio::deferred),
+ timer.async_wait(
+ asio::deferred)
+ ).async_wait(
+ asio::experimental::wait_for_one_success(),
+ [](
+ std::array<std::size_t, 2> completion_order,
+ std::error_code ec1, std::size_t n1,
+ std::error_code ec2
+ )
+ {
+ switch (completion_order[0])
+ {
+ case 0:
+ {
+ std::cout << "descriptor finished: " << ec1 << ", " << n1 << "\n";
+ }
+ break;
+ case 1:
+ {
+ std::cout << "timer finished: " << ec2 << "\n";
+ }
+ break;
+ }
+ }
+ );
+
+ ctx.run();
+}
+
+#else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+int main() {}
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
diff --git a/3rdparty/asio/src/examples/cpp11/porthopper/client.cpp b/3rdparty/asio/src/examples/cpp11/porthopper/client.cpp
new file mode 100644
index 00000000000..e0936128d72
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/porthopper/client.cpp
@@ -0,0 +1,188 @@
+//
+// client.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <exception>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <utility>
+#include "protocol.hpp"
+
+using asio::ip::tcp;
+using asio::ip::udp;
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: client <host> <port>\n";
+ return 1;
+ }
+ using namespace std; // For atoi.
+ std::string host_name = argv[1];
+ std::string port = argv[2];
+
+ asio::io_context io_context;
+
+ // Determine the location of the server.
+ tcp::resolver resolver(io_context);
+ tcp::endpoint remote_endpoint = *resolver.resolve(host_name, port).begin();
+
+ // Establish the control connection to the server.
+ tcp::socket control_socket(io_context);
+ control_socket.connect(remote_endpoint);
+
+ // Create a datagram socket to receive data from the server.
+ udp::socket data_socket(io_context, udp::endpoint(udp::v4(), 0));
+
+ // Determine what port we will receive data on.
+ udp::endpoint data_endpoint = data_socket.local_endpoint();
+
+ // Ask the server to start sending us data.
+ control_request start = control_request::start(data_endpoint.port());
+ asio::write(control_socket, start.to_buffers());
+
+ unsigned long last_frame_number = 0;
+ for (;;)
+ {
+ // Receive 50 messages on the current data socket.
+ for (int i = 0; i < 50; ++i)
+ {
+ // Receive a frame from the server.
+ frame f;
+ data_socket.receive(f.to_buffers(), 0);
+ if (f.number() > last_frame_number)
+ {
+ last_frame_number = f.number();
+ std::cout << "\n" << f.payload();
+ }
+ }
+
+ // Time to switch to a new socket. To ensure seamless handover we will
+ // continue to receive packets using the old socket until data arrives on
+ // the new one.
+ std::cout << " Starting renegotiation";
+
+ // Create the new data socket.
+ udp::socket new_data_socket(io_context, udp::endpoint(udp::v4(), 0));
+
+ // Determine the new port we will use to receive data.
+ udp::endpoint new_data_endpoint = new_data_socket.local_endpoint();
+
+ // Ask the server to switch over to the new port.
+ control_request change = control_request::change(
+ data_endpoint.port(), new_data_endpoint.port());
+ std::error_code control_result;
+ asio::async_write(control_socket, change.to_buffers(),
+ [&](std::error_code ec, std::size_t /*length*/)
+ {
+ control_result = ec;
+ });
+
+ // Try to receive a frame from the server on the new data socket. If we
+ // successfully receive a frame on this new data socket we can consider
+ // the renegotation complete. In that case we will close the old data
+ // socket, which will cause any outstanding receive operation on it to be
+ // cancelled.
+ frame f1;
+ std::error_code new_data_socket_result;
+ new_data_socket.async_receive(f1.to_buffers(),
+ [&](std::error_code ec, std::size_t /*length*/)
+ {
+ new_data_socket_result = ec;
+ if (!ec)
+ {
+ // We have successfully received a frame on the new data socket,
+ // so we can close the old data socket. This will cancel any
+ // outstanding receive operation on the old data socket.
+ data_socket.close();
+ }
+ });
+
+ // This loop will continue until we have successfully completed the
+ // renegotiation (i.e. received a frame on the new data socket), or some
+ // unrecoverable error occurs.
+ bool done = false;
+ while (!done)
+ {
+ // Even though we're performing a renegotation, we want to continue
+ // receiving data as smoothly as possible. Therefore we will continue to
+ // try to receive a frame from the server on the old data socket. If we
+ // receive a frame on this socket we will interrupt the io_context,
+ // print the frame, and resume waiting for the other operations to
+ // complete.
+ frame f2;
+ done = true; // Let's be optimistic.
+ if (data_socket.is_open()) // May have been closed by receive handler.
+ {
+ data_socket.async_receive(f2.to_buffers(), 0,
+ [&](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ {
+ // We have successfully received a frame on the old data
+ // socket. Stop the io_context so that we can print it.
+ io_context.stop();
+ done = false;
+ }
+ });
+ }
+
+ // Run the operations in parallel. This will block until all operations
+ // have finished, or until the io_context is interrupted. (No threads!)
+ io_context.restart();
+ io_context.run();
+
+ // If the io_context.run() was interrupted then we have received a frame
+ // on the old data socket. We need to keep waiting for the renegotation
+ // operations to complete.
+ if (!done)
+ {
+ if (f2.number() > last_frame_number)
+ {
+ last_frame_number = f2.number();
+ std::cout << "\n" << f2.payload();
+ }
+ }
+ }
+
+ // Since the loop has finished, we have either successfully completed
+ // the renegotation, or an error has occurred. First we'll check for
+ // errors.
+ if (control_result)
+ throw std::system_error(control_result);
+ if (new_data_socket_result)
+ throw std::system_error(new_data_socket_result);
+
+ // If we get here it means we have successfully started receiving data on
+ // the new data socket. This new data socket will be used from now on
+ // (until the next time we renegotiate).
+ std::cout << " Renegotiation complete";
+ data_socket = std::move(new_data_socket);
+ data_endpoint = new_data_endpoint;
+ if (f1.number() > last_frame_number)
+ {
+ last_frame_number = f1.number();
+ std::cout << "\n" << f1.payload();
+ }
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/porthopper/protocol.hpp b/3rdparty/asio/src/examples/cpp11/porthopper/protocol.hpp
new file mode 100644
index 00000000000..46f9938cad5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/porthopper/protocol.hpp
@@ -0,0 +1,156 @@
+//
+// protocol.hpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef PORTHOPPER_PROTOCOL_HPP
+#define PORTHOPPER_PROTOCOL_HPP
+
+#include <asio.hpp>
+#include <array>
+#include <cstring>
+#include <iomanip>
+#include <string>
+#include <strstream>
+
+// This request is sent by the client to the server over a TCP connection.
+// The client uses it to perform three functions:
+// - To request that data start being sent to a given port.
+// - To request that data is no longer sent to a given port.
+// - To change the target port to another.
+class control_request
+{
+public:
+ // Construct an empty request. Used when receiving.
+ control_request()
+ {
+ }
+
+ // Create a request to start sending data to a given port.
+ static const control_request start(unsigned short port)
+ {
+ return control_request(0, port);
+ }
+
+ // Create a request to stop sending data to a given port.
+ static const control_request stop(unsigned short port)
+ {
+ return control_request(port, 0);
+ }
+
+ // Create a request to change the port that data is sent to.
+ static const control_request change(
+ unsigned short old_port, unsigned short new_port)
+ {
+ return control_request(old_port, new_port);
+ }
+
+ // Get the old port. Returns 0 for start requests.
+ unsigned short old_port() const
+ {
+ std::istrstream is(data_, encoded_port_size);
+ unsigned short port = 0;
+ is >> std::setw(encoded_port_size) >> std::hex >> port;
+ return port;
+ }
+
+ // Get the new port. Returns 0 for stop requests.
+ unsigned short new_port() const
+ {
+ std::istrstream is(data_ + encoded_port_size, encoded_port_size);
+ unsigned short port = 0;
+ is >> std::setw(encoded_port_size) >> std::hex >> port;
+ return port;
+ }
+
+ // Obtain buffers for reading from or writing to a socket.
+ std::array<asio::mutable_buffer, 1> to_buffers()
+ {
+ std::array<asio::mutable_buffer, 1> buffers
+ = { { asio::buffer(data_) } };
+ return buffers;
+ }
+
+private:
+ // Construct with specified old and new ports.
+ control_request(unsigned short old_port_number,
+ unsigned short new_port_number)
+ {
+ std::ostrstream os(data_, control_request_size);
+ os << std::setw(encoded_port_size) << std::hex << old_port_number;
+ os << std::setw(encoded_port_size) << std::hex << new_port_number;
+ }
+
+ // The length in bytes of a control_request and its components.
+ enum
+ {
+ encoded_port_size = 4, // 16-bit port in hex.
+ control_request_size = encoded_port_size * 2
+ };
+
+ // The encoded request data.
+ char data_[control_request_size];
+};
+
+// This frame is sent from the server to subscribed clients over UDP.
+class frame
+{
+public:
+ // The maximum allowable length of the payload.
+ enum { payload_size = 32 };
+
+ // Construct an empty frame. Used when receiving.
+ frame()
+ {
+ }
+
+ // Construct a frame with specified frame number and payload.
+ frame(unsigned long frame_number, const std::string& payload_data)
+ {
+ std::ostrstream os(data_, frame_size);
+ os << std::setw(encoded_number_size) << std::hex << frame_number;
+ os << std::setw(payload_size)
+ << std::setfill(' ') << payload_data.substr(0, payload_size);
+ }
+
+ // Get the frame number.
+ unsigned long number() const
+ {
+ std::istrstream is(data_, encoded_number_size);
+ unsigned long frame_number = 0;
+ is >> std::setw(encoded_number_size) >> std::hex >> frame_number;
+ return frame_number;
+ }
+
+ // Get the payload data.
+ const std::string payload() const
+ {
+ return std::string(data_ + encoded_number_size, payload_size);
+ }
+
+ // Obtain buffers for reading from or writing to a socket.
+ std::array<asio::mutable_buffer, 1> to_buffers()
+ {
+ std::array<asio::mutable_buffer, 1> buffers
+ = { { asio::buffer(data_) } };
+ return buffers;
+ }
+
+private:
+ // The length in bytes of a frame and its components.
+ enum
+ {
+ encoded_number_size = 8, // Frame number in hex.
+ frame_size = encoded_number_size + payload_size
+ };
+
+ // The encoded frame data.
+ char data_[frame_size];
+};
+
+#endif // PORTHOPPER_PROTOCOL_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/porthopper/server.cpp b/3rdparty/asio/src/examples/cpp11/porthopper/server.cpp
new file mode 100644
index 00000000000..4a77622e593
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/porthopper/server.cpp
@@ -0,0 +1,187 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <cmath>
+#include <cstdlib>
+#include <exception>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <set>
+#include "protocol.hpp"
+
+using asio::ip::tcp;
+using asio::ip::udp;
+
+typedef std::shared_ptr<tcp::socket> tcp_socket_ptr;
+typedef std::shared_ptr<asio::steady_timer> timer_ptr;
+typedef std::shared_ptr<control_request> control_request_ptr;
+
+class server
+{
+public:
+ // Construct the server to wait for incoming control connections.
+ server(asio::io_context& io_context, unsigned short port)
+ : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)),
+ timer_(io_context),
+ udp_socket_(io_context, udp::endpoint(udp::v4(), 0)),
+ next_frame_number_(1)
+ {
+ // Start waiting for a new control connection.
+ tcp_socket_ptr new_socket(new tcp::socket(acceptor_.get_executor()));
+ acceptor_.async_accept(*new_socket,
+ std::bind(&server::handle_accept, this,
+ asio::placeholders::error, new_socket));
+
+ // Start the timer used to generate outgoing frames.
+ timer_.expires_after(asio::chrono::milliseconds(100));
+ timer_.async_wait(std::bind(&server::handle_timer, this));
+ }
+
+ // Handle a new control connection.
+ void handle_accept(const std::error_code& ec, tcp_socket_ptr socket)
+ {
+ if (!ec)
+ {
+ // Start receiving control requests on the connection.
+ control_request_ptr request(new control_request);
+ asio::async_read(*socket, request->to_buffers(),
+ std::bind(&server::handle_control_request, this,
+ asio::placeholders::error, socket, request));
+ }
+
+ // Start waiting for a new control connection.
+ tcp_socket_ptr new_socket(new tcp::socket(acceptor_.get_executor()));
+ acceptor_.async_accept(*new_socket,
+ std::bind(&server::handle_accept, this,
+ asio::placeholders::error, new_socket));
+ }
+
+ // Handle a new control request.
+ void handle_control_request(const std::error_code& ec,
+ tcp_socket_ptr socket, control_request_ptr request)
+ {
+ if (!ec)
+ {
+ // Delay handling of the control request to simulate network latency.
+ timer_ptr delay_timer(
+ new asio::steady_timer(acceptor_.get_executor()));
+ delay_timer->expires_after(asio::chrono::seconds(2));
+ delay_timer->async_wait(
+ std::bind(&server::handle_control_request_timer, this,
+ socket, request, delay_timer));
+ }
+ }
+
+ void handle_control_request_timer(tcp_socket_ptr socket,
+ control_request_ptr request, timer_ptr /*delay_timer*/)
+ {
+ // Determine what address this client is connected from, since
+ // subscriptions must be stored on the server as a complete endpoint, not
+ // just a port. We use the non-throwing overload of remote_endpoint() since
+ // it may fail if the socket is no longer connected.
+ std::error_code ec;
+ tcp::endpoint remote_endpoint = socket->remote_endpoint(ec);
+ if (!ec)
+ {
+ // Remove old port subscription, if any.
+ if (unsigned short old_port = request->old_port())
+ {
+ udp::endpoint old_endpoint(remote_endpoint.address(), old_port);
+ subscribers_.erase(old_endpoint);
+ std::cout << "Removing subscription " << old_endpoint << std::endl;
+ }
+
+ // Add new port subscription, if any.
+ if (unsigned short new_port = request->new_port())
+ {
+ udp::endpoint new_endpoint(remote_endpoint.address(), new_port);
+ subscribers_.insert(new_endpoint);
+ std::cout << "Adding subscription " << new_endpoint << std::endl;
+ }
+ }
+
+ // Wait for next control request on this connection.
+ asio::async_read(*socket, request->to_buffers(),
+ std::bind(&server::handle_control_request, this,
+ asio::placeholders::error, socket, request));
+ }
+
+ // Every time the timer fires we will generate a new frame and send it to all
+ // subscribers.
+ void handle_timer()
+ {
+ // Generate payload.
+ double x = next_frame_number_ * 0.2;
+ double y = std::sin(x);
+ int char_index = static_cast<int>((y + 1.0) * (frame::payload_size / 2));
+ std::string payload;
+ for (int i = 0; i < frame::payload_size; ++i)
+ payload += (i == char_index ? '*' : '.');
+
+ // Create the frame to be sent to all subscribers.
+ frame f(next_frame_number_++, payload);
+
+ // Send frame to all subscribers. We can use synchronous calls here since
+ // UDP send operations typically do not block.
+ std::set<udp::endpoint>::iterator j;
+ for (j = subscribers_.begin(); j != subscribers_.end(); ++j)
+ {
+ std::error_code ec;
+ udp_socket_.send_to(f.to_buffers(), *j, 0, ec);
+ }
+
+ // Wait for next timeout.
+ timer_.expires_after(asio::chrono::milliseconds(100));
+ timer_.async_wait(std::bind(&server::handle_timer, this));
+ }
+
+private:
+ // The acceptor used to accept incoming control connections.
+ tcp::acceptor acceptor_;
+
+ // The timer used for generating data.
+ asio::steady_timer timer_;
+
+ // The socket used to send data to subscribers.
+ udp::socket udp_socket_;
+
+ // The next frame number.
+ unsigned long next_frame_number_;
+
+ // The set of endpoints that are subscribed.
+ std::set<udp::endpoint> subscribers_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ using namespace std; // For atoi.
+ server s(io_context, atoi(argv[1]));
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/serialization/client.cpp b/3rdparty/asio/src/examples/cpp11/serialization/client.cpp
new file mode 100644
index 00000000000..10ec87f6da4
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/serialization/client.cpp
@@ -0,0 +1,125 @@
+//
+// client.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <functional>
+#include <iostream>
+#include <vector>
+#include "connection.hpp" // Must come before boost/serialization headers.
+#include <boost/serialization/vector.hpp>
+#include "stock.hpp"
+
+namespace s11n_example {
+
+/// Downloads stock quote information from a server.
+class client
+{
+public:
+ /// Constructor starts the asynchronous connect operation.
+ client(asio::io_context& io_context,
+ const std::string& host, const std::string& service)
+ : connection_(io_context.get_executor())
+ {
+ // Resolve the host name into an IP address.
+ asio::ip::tcp::resolver resolver(io_context);
+ asio::ip::tcp::resolver::query query(host, service);
+ asio::ip::tcp::resolver::iterator endpoint_iterator =
+ resolver.resolve(query);
+
+ // Start an asynchronous connect operation.
+ asio::async_connect(connection_.socket(), endpoint_iterator,
+ std::bind(&client::handle_connect, this,
+ asio::placeholders::error));
+ }
+
+ /// Handle completion of a connect operation.
+ void handle_connect(const asio::error_code& e)
+ {
+ if (!e)
+ {
+ // Successfully established connection. Start operation to read the list
+ // of stocks. The connection::async_read() function will automatically
+ // decode the data that is read from the underlying socket.
+ connection_.async_read(stocks_,
+ std::bind(&client::handle_read, this,
+ asio::placeholders::error));
+ }
+ else
+ {
+ // An error occurred. Log it and return. Since we are not starting a new
+ // operation the io_context will run out of work to do and the client will
+ // exit.
+ std::cerr << e.message() << std::endl;
+ }
+ }
+
+ /// Handle completion of a read operation.
+ void handle_read(const asio::error_code& e)
+ {
+ if (!e)
+ {
+ // Print out the data that was received.
+ for (std::size_t i = 0; i < stocks_.size(); ++i)
+ {
+ std::cout << "Stock number " << i << "\n";
+ std::cout << " code: " << stocks_[i].code << "\n";
+ std::cout << " name: " << stocks_[i].name << "\n";
+ std::cout << " open_price: " << stocks_[i].open_price << "\n";
+ std::cout << " high_price: " << stocks_[i].high_price << "\n";
+ std::cout << " low_price: " << stocks_[i].low_price << "\n";
+ std::cout << " last_price: " << stocks_[i].last_price << "\n";
+ std::cout << " buy_price: " << stocks_[i].buy_price << "\n";
+ std::cout << " buy_quantity: " << stocks_[i].buy_quantity << "\n";
+ std::cout << " sell_price: " << stocks_[i].sell_price << "\n";
+ std::cout << " sell_quantity: " << stocks_[i].sell_quantity << "\n";
+ }
+ }
+ else
+ {
+ // An error occurred.
+ std::cerr << e.message() << std::endl;
+ }
+
+ // Since we are not starting a new operation the io_context will run out of
+ // work to do and the client will exit.
+ }
+
+private:
+ /// The connection to the server.
+ connection connection_;
+
+ /// The data received from the server.
+ std::vector<stock> stocks_;
+};
+
+} // namespace s11n_example
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ // Check command line arguments.
+ if (argc != 3)
+ {
+ std::cerr << "Usage: client <host> <port>" << std::endl;
+ return 1;
+ }
+
+ asio::io_context io_context;
+ s11n_example::client client(io_context, argv[1], argv[2]);
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/serialization/connection.hpp b/3rdparty/asio/src/examples/cpp11/serialization/connection.hpp
new file mode 100644
index 00000000000..14d96f7597b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/serialization/connection.hpp
@@ -0,0 +1,184 @@
+//
+// connection.hpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef SERIALIZATION_CONNECTION_HPP
+#define SERIALIZATION_CONNECTION_HPP
+
+#include <asio.hpp>
+#include <boost/archive/text_iarchive.hpp>
+#include <boost/archive/text_oarchive.hpp>
+#include <functional>
+#include <iomanip>
+#include <memory>
+#include <string>
+#include <sstream>
+#include <tuple>
+#include <vector>
+
+namespace s11n_example {
+
+/// The connection class provides serialization primitives on top of a socket.
+/**
+ * Each message sent using this class consists of:
+ * @li An 8-byte header containing the length of the serialized data in
+ * hexadecimal.
+ * @li The serialized data.
+ */
+class connection
+{
+public:
+ /// Constructor.
+ connection(const asio::any_io_executor& ex)
+ : socket_(ex)
+ {
+ }
+
+ /// Get the underlying socket. Used for making a connection or for accepting
+ /// an incoming connection.
+ asio::ip::tcp::socket& socket()
+ {
+ return socket_;
+ }
+
+ /// Asynchronously write a data structure to the socket.
+ template <typename T, typename Handler>
+ void async_write(const T& t, Handler handler)
+ {
+ // Serialize the data first so we know how large it is.
+ std::ostringstream archive_stream;
+ boost::archive::text_oarchive archive(archive_stream);
+ archive << t;
+ outbound_data_ = archive_stream.str();
+
+ // Format the header.
+ std::ostringstream header_stream;
+ header_stream << std::setw(header_length)
+ << std::hex << outbound_data_.size();
+ if (!header_stream || header_stream.str().size() != header_length)
+ {
+ // Something went wrong, inform the caller.
+ std::error_code error(asio::error::invalid_argument);
+ asio::post(socket_.get_executor(), std::bind(handler, error));
+ return;
+ }
+ outbound_header_ = header_stream.str();
+
+ // Write the serialized data to the socket. We use "gather-write" to send
+ // both the header and the data in a single write operation.
+ std::vector<asio::const_buffer> buffers;
+ buffers.push_back(asio::buffer(outbound_header_));
+ buffers.push_back(asio::buffer(outbound_data_));
+ asio::async_write(socket_, buffers, handler);
+ }
+
+ /// Asynchronously read a data structure from the socket.
+ template <typename T, typename Handler>
+ void async_read(T& t, Handler handler)
+ {
+ // Issue a read operation to read exactly the number of bytes in a header.
+ void (connection::*f)(const std::error_code&, T&, std::tuple<Handler>)
+ = &connection::handle_read_header<T, Handler>;
+ asio::async_read(socket_, asio::buffer(inbound_header_),
+ std::bind(f,
+ this, asio::placeholders::error, std::ref(t),
+ std::make_tuple(handler)));
+ }
+
+ /// Handle a completed read of a message header.
+ template <typename T, typename Handler>
+ void handle_read_header(const std::error_code& e,
+ T& t, std::tuple<Handler> handler)
+ {
+ if (e)
+ {
+ std::get<0>(handler)(e);
+ }
+ else
+ {
+ // Determine the length of the serialized data.
+ std::istringstream is(std::string(inbound_header_, header_length));
+ std::size_t inbound_data_size = 0;
+ if (!(is >> std::hex >> inbound_data_size))
+ {
+ // Header doesn't seem to be valid. Inform the caller.
+ std::error_code error(asio::error::invalid_argument);
+ std::get<0>(handler)(error);
+ return;
+ }
+
+ // Start an asynchronous call to receive the data.
+ inbound_data_.resize(inbound_data_size);
+ void (connection::*f)(
+ const std::error_code&,
+ T&, std::tuple<Handler>)
+ = &connection::handle_read_data<T, Handler>;
+ asio::async_read(socket_, asio::buffer(inbound_data_),
+ std::bind(f, this,
+ asio::placeholders::error, std::ref(t), handler));
+ }
+ }
+
+ /// Handle a completed read of message data.
+ template <typename T, typename Handler>
+ void handle_read_data(const std::error_code& e,
+ T& t, std::tuple<Handler> handler)
+ {
+ if (e)
+ {
+ std::get<0>(handler)(e);
+ }
+ else
+ {
+ // Extract the data structure from the data just received.
+ try
+ {
+ std::string archive_data(&inbound_data_[0], inbound_data_.size());
+ std::istringstream archive_stream(archive_data);
+ boost::archive::text_iarchive archive(archive_stream);
+ archive >> t;
+ }
+ catch (std::exception& e)
+ {
+ // Unable to decode data.
+ std::error_code error(asio::error::invalid_argument);
+ std::get<0>(handler)(error);
+ return;
+ }
+
+ // Inform caller that data has been received ok.
+ std::get<0>(handler)(e);
+ }
+ }
+
+private:
+ /// The underlying socket.
+ asio::ip::tcp::socket socket_;
+
+ /// The size of a fixed length header.
+ enum { header_length = 8 };
+
+ /// Holds an outbound header.
+ std::string outbound_header_;
+
+ /// Holds the outbound data.
+ std::string outbound_data_;
+
+ /// Holds an inbound header.
+ char inbound_header_[header_length];
+
+ /// Holds the inbound data.
+ std::vector<char> inbound_data_;
+};
+
+typedef std::shared_ptr<connection> connection_ptr;
+
+} // namespace s11n_example
+
+#endif // SERIALIZATION_CONNECTION_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/serialization/server.cpp b/3rdparty/asio/src/examples/cpp11/serialization/server.cpp
new file mode 100644
index 00000000000..a032e86dc78
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/serialization/server.cpp
@@ -0,0 +1,122 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <functional>
+#include <iostream>
+#include <vector>
+#include "connection.hpp" // Must come before boost/serialization headers.
+#include <boost/serialization/vector.hpp>
+#include "stock.hpp"
+
+namespace s11n_example {
+
+/// Serves stock quote information to any client that connects to it.
+class server
+{
+public:
+ /// Constructor opens the acceptor and starts waiting for the first incoming
+ /// connection.
+ server(asio::io_context& io_context, unsigned short port)
+ : acceptor_(io_context,
+ asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port))
+ {
+ // Create the data to be sent to each client.
+ stock s;
+ s.code = "ABC";
+ s.name = "A Big Company";
+ s.open_price = 4.56;
+ s.high_price = 5.12;
+ s.low_price = 4.33;
+ s.last_price = 4.98;
+ s.buy_price = 4.96;
+ s.buy_quantity = 1000;
+ s.sell_price = 4.99;
+ s.sell_quantity = 2000;
+ stocks_.push_back(s);
+ s.code = "DEF";
+ s.name = "Developer Entertainment Firm";
+ s.open_price = 20.24;
+ s.high_price = 22.88;
+ s.low_price = 19.50;
+ s.last_price = 19.76;
+ s.buy_price = 19.72;
+ s.buy_quantity = 34000;
+ s.sell_price = 19.85;
+ s.sell_quantity = 45000;
+ stocks_.push_back(s);
+
+ // Start an accept operation for a new connection.
+ connection_ptr new_conn(new connection(acceptor_.get_executor()));
+ acceptor_.async_accept(new_conn->socket(),
+ std::bind(&server::handle_accept, this,
+ asio::placeholders::error, new_conn));
+ }
+
+ /// Handle completion of a accept operation.
+ void handle_accept(const std::error_code& e, connection_ptr conn)
+ {
+ if (!e)
+ {
+ // Successfully accepted a new connection. Send the list of stocks to the
+ // client. The connection::async_write() function will automatically
+ // serialize the data structure for us.
+ conn->async_write(stocks_,
+ std::bind(&server::handle_write, this,
+ asio::placeholders::error, conn));
+ }
+
+ // Start an accept operation for a new connection.
+ connection_ptr new_conn(new connection(acceptor_.get_executor()));
+ acceptor_.async_accept(new_conn->socket(),
+ std::bind(&server::handle_accept, this,
+ asio::placeholders::error, new_conn));
+ }
+
+ /// Handle completion of a write operation.
+ void handle_write(const std::error_code& e, connection_ptr conn)
+ {
+ // Nothing to do. The socket will be closed automatically when the last
+ // reference to the connection object goes away.
+ }
+
+private:
+ /// The acceptor object used to accept incoming socket connections.
+ asio::ip::tcp::acceptor acceptor_;
+
+ /// The data to be sent to each client.
+ std::vector<stock> stocks_;
+};
+
+} // namespace s11n_example
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ // Check command line arguments.
+ if (argc != 2)
+ {
+ std::cerr << "Usage: server <port>" << std::endl;
+ return 1;
+ }
+ unsigned short port = std::stoi(argv[1]);
+
+ asio::io_context io_context;
+ s11n_example::server server(io_context, port);
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/serialization/stock.hpp b/3rdparty/asio/src/examples/cpp11/serialization/stock.hpp
new file mode 100644
index 00000000000..bb305518cae
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/serialization/stock.hpp
@@ -0,0 +1,50 @@
+//
+// stock.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef SERIALIZATION_STOCK_HPP
+#define SERIALIZATION_STOCK_HPP
+
+#include <string>
+
+namespace s11n_example {
+
+/// Structure to hold information about a single stock.
+struct stock
+{
+ std::string code;
+ std::string name;
+ double open_price;
+ double high_price;
+ double low_price;
+ double last_price;
+ double buy_price;
+ int buy_quantity;
+ double sell_price;
+ int sell_quantity;
+
+ template <typename Archive>
+ void serialize(Archive& ar, const unsigned int version)
+ {
+ ar & code;
+ ar & name;
+ ar & open_price;
+ ar & high_price;
+ ar & low_price;
+ ar & last_price;
+ ar & buy_price;
+ ar & buy_quantity;
+ ar & sell_price;
+ ar & sell_quantity;
+ }
+};
+
+} // namespace s11n_example
+
+#endif // SERIALIZATION_STOCK_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/services/basic_logger.hpp b/3rdparty/asio/src/examples/cpp11/services/basic_logger.hpp
new file mode 100644
index 00000000000..6e4d7a0b05d
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/services/basic_logger.hpp
@@ -0,0 +1,78 @@
+//
+// basic_logger.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef SERVICES_BASIC_LOGGER_HPP
+#define SERVICES_BASIC_LOGGER_HPP
+
+#include <asio.hpp>
+#include <string>
+
+namespace services {
+
+/// Class to provide simple logging functionality. Use the services::logger
+/// typedef.
+template <typename Service>
+class basic_logger
+{
+public:
+ /// The type of the service that will be used to provide timer operations.
+ typedef Service service_type;
+
+ /// The native implementation type of the timer.
+ typedef typename service_type::impl_type impl_type;
+
+ /// Constructor.
+ /**
+ * This constructor creates a logger.
+ *
+ * @param context The execution context used to locate the logger service.
+ *
+ * @param identifier An identifier for this logger.
+ */
+ explicit basic_logger(asio::execution_context& context,
+ const std::string& identifier)
+ : service_(asio::use_service<Service>(context)),
+ impl_(service_.null())
+ {
+ service_.create(impl_, identifier);
+ }
+
+ basic_logger(const basic_logger&) = delete;
+ basic_logger& operator=(basic_logger&) = delete;
+
+ /// Destructor.
+ ~basic_logger()
+ {
+ service_.destroy(impl_);
+ }
+
+ /// Set the output file for all logger instances.
+ void use_file(const std::string& file)
+ {
+ service_.use_file(impl_, file);
+ }
+
+ /// Log a message.
+ void log(const std::string& message)
+ {
+ service_.log(impl_, message);
+ }
+
+private:
+ /// The backend service implementation.
+ service_type& service_;
+
+ /// The underlying native implementation.
+ impl_type impl_;
+};
+
+} // namespace services
+
+#endif // SERVICES_BASIC_LOGGER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/services/daytime_client.cpp b/3rdparty/asio/src/examples/cpp11/services/daytime_client.cpp
new file mode 100644
index 00000000000..360134f64c2
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/services/daytime_client.cpp
@@ -0,0 +1,101 @@
+//
+// daytime_client.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <functional>
+#include <iostream>
+#include "logger.hpp"
+
+using asio::ip::tcp;
+
+char read_buffer[1024];
+
+void read_handler(const asio::error_code& e,
+ std::size_t bytes_transferred, tcp::socket* s)
+{
+ if (!e)
+ {
+ std::cout.write(read_buffer, bytes_transferred);
+
+ s->async_read_some(asio::buffer(read_buffer),
+ std::bind(read_handler, asio::placeholders::error,
+ asio::placeholders::bytes_transferred, s));
+ }
+ else
+ {
+ asio::execution_context& context = asio::query(
+ s->get_executor(), asio::execution::context);
+ services::logger logger(context, "read_handler");
+
+ std::string msg = "Read error: ";
+ msg += e.message();
+ logger.log(msg);
+ }
+}
+
+void connect_handler(const asio::error_code& e, tcp::socket* s)
+{
+ asio::execution_context& context = asio::query(
+ s->get_executor(), asio::execution::context);
+ services::logger logger(context, "connect_handler");
+
+ if (!e)
+ {
+ logger.log("Connection established");
+
+ s->async_read_some(asio::buffer(read_buffer),
+ std::bind(read_handler, asio::placeholders::error,
+ asio::placeholders::bytes_transferred, s));
+ }
+ else
+ {
+ std::string msg = "Unable to establish connection: ";
+ msg += e.message();
+ logger.log(msg);
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: daytime_client <host>" << std::endl;
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ // Set the name of the file that all logger instances will use.
+ services::logger logger(io_context, "");
+ logger.use_file("log.txt");
+
+ // Resolve the address corresponding to the given host.
+ tcp::resolver resolver(io_context);
+ tcp::resolver::results_type endpoints =
+ resolver.resolve(argv[1], "daytime");
+
+ // Start an asynchronous connect.
+ tcp::socket socket(io_context);
+ asio::async_connect(socket, endpoints,
+ std::bind(connect_handler,
+ asio::placeholders::error, &socket));
+
+ // Run the io_context until all operations have finished.
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/services/logger.hpp b/3rdparty/asio/src/examples/cpp11/services/logger.hpp
new file mode 100644
index 00000000000..2ab366c83c6
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/services/logger.hpp
@@ -0,0 +1,24 @@
+//
+// logger.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef SERVICES_LOGGER_HPP
+#define SERVICES_LOGGER_HPP
+
+#include "basic_logger.hpp"
+#include "logger_service.hpp"
+
+namespace services {
+
+/// Typedef for typical logger usage.
+typedef basic_logger<logger_service> logger;
+
+} // namespace services
+
+#endif // SERVICES_LOGGER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/services/logger_service.cpp b/3rdparty/asio/src/examples/cpp11/services/logger_service.cpp
new file mode 100644
index 00000000000..74d67c75241
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/services/logger_service.cpp
@@ -0,0 +1,11 @@
+//
+// logger_service.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "logger_service.hpp"
diff --git a/3rdparty/asio/src/examples/cpp11/services/logger_service.hpp b/3rdparty/asio/src/examples/cpp11/services/logger_service.hpp
new file mode 100644
index 00000000000..d0beaf1d6c2
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/services/logger_service.hpp
@@ -0,0 +1,145 @@
+//
+// logger_service.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef SERVICES_LOGGER_SERVICE_HPP
+#define SERVICES_LOGGER_SERVICE_HPP
+
+#include <asio.hpp>
+#include <functional>
+#include <fstream>
+#include <sstream>
+#include <string>
+#include <thread>
+
+namespace services {
+
+/// Service implementation for the logger.
+class logger_service
+ : public asio::execution_context::service
+{
+public:
+ /// The type used to identify this service in the execution context.
+ typedef logger_service key_type;
+
+ /// The backend implementation of a logger.
+ struct logger_impl
+ {
+ explicit logger_impl(const std::string& ident) : identifier(ident) {}
+ std::string identifier;
+ };
+
+ /// The type for an implementation of the logger.
+ typedef logger_impl* impl_type;
+
+ /// Constructor creates a thread to run a private io_context.
+ logger_service(asio::execution_context& context)
+ : asio::execution_context::service(context),
+ work_io_context_(),
+ work_(asio::make_work_guard(work_io_context_)),
+ work_thread_([this]{ work_io_context_.run(); })
+ {
+ }
+
+ logger_service(const logger_service&) = delete;
+ logger_service& operator=(const logger_service&) = delete;;
+
+ /// Destructor shuts down the private io_context.
+ ~logger_service()
+ {
+ /// Indicate that we have finished with the private io_context. Its
+ /// io_context::run() function will exit once all other work has completed.
+ work_.reset();
+ if (work_thread_.joinable())
+ work_thread_.join();
+ }
+
+ /// Destroy all user-defined handler objects owned by the service.
+ void shutdown()
+ {
+ }
+
+ /// Return a null logger implementation.
+ impl_type null() const
+ {
+ return 0;
+ }
+
+ /// Create a new logger implementation.
+ void create(impl_type& impl, const std::string& identifier)
+ {
+ impl = new logger_impl(identifier);
+ }
+
+ /// Destroy a logger implementation.
+ void destroy(impl_type& impl)
+ {
+ delete impl;
+ impl = null();
+ }
+
+ /// Set the output file for the logger. The current implementation sets the
+ /// output file for all logger instances, and so the impl parameter is not
+ /// actually needed. It is retained here to illustrate how service functions
+ /// are typically defined.
+ void use_file(impl_type& /*impl*/, const std::string& file)
+ {
+ // Pass the work of opening the file to the background thread.
+ asio::post(work_io_context_,
+ std::bind(&logger_service::use_file_impl, this, file));
+ }
+
+ /// Log a message.
+ void log(impl_type& impl, const std::string& message)
+ {
+ // Format the text to be logged.
+ std::ostringstream os;
+ os << impl->identifier << ": " << message;
+
+ // Pass the work of writing to the file to the background thread.
+ asio::post(work_io_context_,
+ std::bind(&logger_service::log_impl, this, os.str()));
+ }
+
+private:
+ /// Helper function used to open the output file from within the private
+ /// io_context's thread.
+ void use_file_impl(const std::string& file)
+ {
+ ofstream_.close();
+ ofstream_.clear();
+ ofstream_.open(file.c_str());
+ }
+
+ /// Helper function used to log a message from within the private io_context's
+ /// thread.
+ void log_impl(const std::string& text)
+ {
+ ofstream_ << text << std::endl;
+ }
+
+ /// Private io_context used for performing logging operations.
+ asio::io_context work_io_context_;
+
+ /// Work for the private io_context to perform. If we do not give the
+ /// io_context some work to do then the io_context::run() function will exit
+ /// immediately.
+ asio::executor_work_guard<
+ asio::io_context::executor_type> work_;
+
+ /// Thread used for running the work io_context's run loop.
+ std::thread work_thread_;
+
+ /// The file to which log messages will be written.
+ std::ofstream ofstream_;
+};
+
+} // namespace services
+
+#endif // SERVICES_LOGGER_SERVICE_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/socks4/socks4.hpp b/3rdparty/asio/src/examples/cpp11/socks4/socks4.hpp
new file mode 100644
index 00000000000..ed7994021fc
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/socks4/socks4.hpp
@@ -0,0 +1,143 @@
+//
+// socks4.hpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef SOCKS4_HPP
+#define SOCKS4_HPP
+
+#include <array>
+#include <string>
+#include <asio/buffer.hpp>
+#include <asio/ip/tcp.hpp>
+
+namespace socks4 {
+
+const unsigned char version = 0x04;
+
+class request
+{
+public:
+ enum command_type
+ {
+ connect = 0x01,
+ bind = 0x02
+ };
+
+ request(command_type cmd, const asio::ip::tcp::endpoint& endpoint,
+ const std::string& user_id)
+ : version_(version),
+ command_(cmd),
+ user_id_(user_id),
+ null_byte_(0)
+ {
+ // Only IPv4 is supported by the SOCKS 4 protocol.
+ if (endpoint.protocol() != asio::ip::tcp::v4())
+ {
+ throw std::system_error(
+ asio::error::address_family_not_supported);
+ }
+
+ // Convert port number to network byte order.
+ unsigned short port = endpoint.port();
+ port_high_byte_ = (port >> 8) & 0xff;
+ port_low_byte_ = port & 0xff;
+
+ // Save IP address in network byte order.
+ address_ = endpoint.address().to_v4().to_bytes();
+ }
+
+ std::array<asio::const_buffer, 7> buffers() const
+ {
+ return
+ {
+ {
+ asio::buffer(&version_, 1),
+ asio::buffer(&command_, 1),
+ asio::buffer(&port_high_byte_, 1),
+ asio::buffer(&port_low_byte_, 1),
+ asio::buffer(address_),
+ asio::buffer(user_id_),
+ asio::buffer(&null_byte_, 1)
+ }
+ };
+ }
+
+private:
+ unsigned char version_;
+ unsigned char command_;
+ unsigned char port_high_byte_;
+ unsigned char port_low_byte_;
+ asio::ip::address_v4::bytes_type address_;
+ std::string user_id_;
+ unsigned char null_byte_;
+};
+
+class reply
+{
+public:
+ enum status_type
+ {
+ request_granted = 0x5a,
+ request_failed = 0x5b,
+ request_failed_no_identd = 0x5c,
+ request_failed_bad_user_id = 0x5d
+ };
+
+ reply()
+ : null_byte_(0),
+ status_()
+ {
+ }
+
+ std::array<asio::mutable_buffer, 5> buffers()
+ {
+ return
+ {
+ {
+ asio::buffer(&null_byte_, 1),
+ asio::buffer(&status_, 1),
+ asio::buffer(&port_high_byte_, 1),
+ asio::buffer(&port_low_byte_, 1),
+ asio::buffer(address_)
+ }
+ };
+ }
+
+ bool success() const
+ {
+ return null_byte_ == 0 && status_ == request_granted;
+ }
+
+ unsigned char status() const
+ {
+ return status_;
+ }
+
+ asio::ip::tcp::endpoint endpoint() const
+ {
+ unsigned short port = port_high_byte_;
+ port = (port << 8) & 0xff00;
+ port = port | port_low_byte_;
+
+ asio::ip::address_v4 address(address_);
+
+ return asio::ip::tcp::endpoint(address, port);
+ }
+
+private:
+ unsigned char null_byte_;
+ unsigned char status_;
+ unsigned char port_high_byte_;
+ unsigned char port_low_byte_;
+ asio::ip::address_v4::bytes_type address_;
+};
+
+} // namespace socks4
+
+#endif // SOCKS4_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/socks4/sync_client.cpp b/3rdparty/asio/src/examples/cpp11/socks4/sync_client.cpp
new file mode 100644
index 00000000000..f661aca8da5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/socks4/sync_client.cpp
@@ -0,0 +1,94 @@
+//
+// sync_client.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <array>
+#include <iostream>
+#include <iomanip>
+#include <ostream>
+#include <string>
+#include <asio.hpp>
+#include "socks4.hpp"
+
+using asio::ip::tcp;
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 4)
+ {
+ std::cout << "Usage: sync_client <socks4server> <socks4port> <user>\n";
+ std::cout << "Examples:\n";
+ std::cout << " sync_client 127.0.0.1 1080 chris\n";
+ std::cout << " sync_client localhost socks chris\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ // Get a list of endpoints corresponding to the SOCKS 4 server name.
+ tcp::resolver resolver(io_context);
+ auto endpoints = resolver.resolve(argv[1], argv[2]);
+
+ // Try each endpoint until we successfully establish a connection to the
+ // SOCKS 4 server.
+ tcp::socket socket(io_context);
+ asio::connect(socket, endpoints);
+
+ // Get an endpoint for the Boost website. This will be passed to the SOCKS
+ // 4 server. Explicitly specify IPv4 since SOCKS 4 does not support IPv6.
+ auto http_endpoint =
+ *resolver.resolve(tcp::v4(), "www.boost.org", "http").begin();
+
+ // Send the request to the SOCKS 4 server.
+ socks4::request socks_request(
+ socks4::request::connect, http_endpoint, argv[3]);
+ asio::write(socket, socks_request.buffers());
+
+ // Receive a response from the SOCKS 4 server.
+ socks4::reply socks_reply;
+ asio::read(socket, socks_reply.buffers());
+
+ // Check whether we successfully negotiated with the SOCKS 4 server.
+ if (!socks_reply.success())
+ {
+ std::cout << "Connection failed.\n";
+ std::cout << "status = 0x" << std::hex << socks_reply.status();
+ return 1;
+ }
+
+ // Form the HTTP request. We specify the "Connection: close" header so that
+ // the server will close the socket after transmitting the response. This
+ // will allow us to treat all data up until the EOF as the response.
+ std::string request =
+ "GET / HTTP/1.0\r\n"
+ "Host: www.boost.org\r\n"
+ "Accept: */*\r\n"
+ "Connection: close\r\n\r\n";
+
+ // Send the HTTP request.
+ asio::write(socket, asio::buffer(request));
+
+ // Read until EOF, writing data to output as we go.
+ std::array<char, 512> response;
+ std::error_code error;
+ while (std::size_t s = socket.read_some(
+ asio::buffer(response), error))
+ std::cout.write(response.data(), s);
+ if (error != asio::error::eof)
+ throw std::system_error(error);
+ }
+ catch (std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/spawn/echo_server.cpp b/3rdparty/asio/src/examples/cpp11/spawn/echo_server.cpp
new file mode 100644
index 00000000000..ae949d60bef
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/spawn/echo_server.cpp
@@ -0,0 +1,117 @@
+//
+// echo_server.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/spawn.hpp>
+#include <asio/steady_timer.hpp>
+#include <asio/write.hpp>
+#include <iostream>
+#include <memory>
+
+using asio::ip::tcp;
+
+class session : public std::enable_shared_from_this<session>
+{
+public:
+ explicit session(asio::io_context& io_context, tcp::socket socket)
+ : socket_(std::move(socket)),
+ timer_(io_context),
+ strand_(io_context.get_executor())
+ {
+ }
+
+ void go()
+ {
+ auto self(shared_from_this());
+ asio::spawn(strand_,
+ [this, self](asio::yield_context yield)
+ {
+ try
+ {
+ char data[128];
+ for (;;)
+ {
+ timer_.expires_after(std::chrono::seconds(10));
+ std::size_t n = socket_.async_read_some(asio::buffer(data), yield);
+ asio::async_write(socket_, asio::buffer(data, n), yield);
+ }
+ }
+ catch (std::exception& e)
+ {
+ socket_.close();
+ timer_.cancel();
+ }
+ }, asio::detached);
+
+ asio::spawn(strand_,
+ [this, self](asio::yield_context yield)
+ {
+ while (socket_.is_open())
+ {
+ std::error_code ignored_ec;
+ timer_.async_wait(yield[ignored_ec]);
+ if (timer_.expiry() <= asio::steady_timer::clock_type::now())
+ socket_.close();
+ }
+ }, asio::detached);
+ }
+
+private:
+ tcp::socket socket_;
+ asio::steady_timer timer_;
+ asio::strand<asio::io_context::executor_type> strand_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: echo_server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ asio::spawn(io_context,
+ [&](asio::yield_context yield)
+ {
+ tcp::acceptor acceptor(io_context,
+ tcp::endpoint(tcp::v4(), std::atoi(argv[1])));
+
+ for (;;)
+ {
+ std::error_code ec;
+ tcp::socket socket(io_context);
+ acceptor.async_accept(socket, yield[ec]);
+ if (!ec)
+ {
+ std::make_shared<session>(io_context, std::move(socket))->go();
+ }
+ }
+ },
+ [](std::exception_ptr e)
+ {
+ if (e)
+ std::rethrow_exception(e);
+ });
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/spawn/parallel_grep.cpp b/3rdparty/asio/src/examples/cpp11/spawn/parallel_grep.cpp
new file mode 100644
index 00000000000..f4a5b1136dc
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/spawn/parallel_grep.cpp
@@ -0,0 +1,86 @@
+//
+// parallel_grep.cpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/detached.hpp>
+#include <asio/dispatch.hpp>
+#include <asio/post.hpp>
+#include <asio/spawn.hpp>
+#include <asio/strand.hpp>
+#include <asio/thread_pool.hpp>
+#include <fstream>
+#include <iostream>
+#include <string>
+
+using asio::detached;
+using asio::dispatch;
+using asio::spawn;
+using asio::strand;
+using asio::thread_pool;
+using asio::yield_context;
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc < 2)
+ {
+ std::cerr << "Usage: parallel_grep <string> <files...>\n";
+ return 1;
+ }
+
+ // We use a fixed size pool of threads for reading the input files. The
+ // number of threads is automatically determined based on the number of
+ // CPUs available in the system.
+ thread_pool pool;
+
+ // To prevent the output from being garbled, we use a strand to synchronise
+ // printing.
+ strand<thread_pool::executor_type> output_strand(pool.get_executor());
+
+ // Spawn a new coroutine for each file specified on the command line.
+ std::string search_string = argv[1];
+ for (int argn = 2; argn < argc; ++argn)
+ {
+ std::string input_file = argv[argn];
+ spawn(pool,
+ [=](yield_context yield)
+ {
+ std::ifstream is(input_file.c_str());
+ std::string line;
+ std::size_t line_num = 0;
+ while (std::getline(is, line))
+ {
+ // If we find a match, send a message to the output.
+ if (line.find(search_string) != std::string::npos)
+ {
+ dispatch(output_strand,
+ [=]
+ {
+ std::cout << input_file << ':' << line << std::endl;
+ });
+ }
+
+ // Every so often we yield control to another coroutine.
+ if (++line_num % 10 == 0)
+ post(yield);
+ }
+ }, detached);
+ }
+
+ // Join the thread pool to wait for all the spawned tasks to complete.
+ pool.join();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/ssl/README b/3rdparty/asio/src/examples/cpp11/ssl/README
new file mode 100644
index 00000000000..8304d0603b6
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/ssl/README
@@ -0,0 +1,8 @@
+The passphrase for both the CA and server private keys is "test".
+
+
+-------------------------------------------------------------------------------
+Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+
+Distributed under the Boost Software License, Version 1.0. (See accompanying
+file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
diff --git a/3rdparty/asio/src/examples/cpp11/ssl/ca.pem b/3rdparty/asio/src/examples/cpp11/ssl/ca.pem
new file mode 100644
index 00000000000..4580bc11bcf
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/ssl/ca.pem
@@ -0,0 +1,50 @@
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIUX3cVQ47QyJp7SOy0RPzP743W9MwwDQYJKoZIhvcNAQEL
+BQAwOzELMAkGA1UEBhMCQVUxDDAKBgNVBAgMA05TVzEPMA0GA1UEBwwGU3lkbmV5
+MQ0wCwYDVQQKDARhc2lvMB4XDTIxMTExMTIxMTA1MloXDTI2MTExMDIxMTA1Mlow
+OzELMAkGA1UEBhMCQVUxDDAKBgNVBAgMA05TVzEPMA0GA1UEBwwGU3lkbmV5MQ0w
+CwYDVQQKDARhc2lvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyURD
+LjKxTCkapmWhY0bP1NaaOPzIJTTB0dzREOlmRmBmiHpW7DaRx7qBm6jYDKQ7OCbz
+30/j8K4TjHOLIwxzXhXMYTJOcN2giPHNUBvm9oEuDAhYgltArJQnBBEH+3C1hCIv
+1+uhTWo0HpGXTeJnvboTZ1YgmbOgr6lMhNiu9QmPX885DxWf6sDq8mRgCDX2x8sk
+Ls0HuLSo88Osjx532yEhnrZgexsByhoRD3yrKHV5mWpaunk5BMsP/XMuQHayFmbO
+siqnHJoL1znGVH003PcBGmEDmoIUqhLiBi2gWGu1pmckP9loqQUTEn0aLOVclHf4
+slWq344zh4tJCpQMfQIDAQABo1AwTjAdBgNVHQ4EFgQUfiX1CMQrGDi9mIBAg9cg
+m0RwLJUwHwYDVR0jBBgwFoAUfiX1CMQrGDi9mIBAg9cgm0RwLJUwDAYDVR0TBAUw
+AwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAnDnVNSb8z/pNFaZ6YAZ+ukfNT3jjbGm1
+10BOLqJj8s5A8/JkwjaWhky/DuGXDywgEvzXC18aNAxASeqO8h9pAZtszu6NWB4s
+h3r+dEQakMacxrZ+jBL/cYLrUv9r3KMPKxaDnplkamqFA/9eNmoV7vDyGtGPZuD6
+oTROtQqqDSrxthCkqnibAfusi7RmlCdvJa0kVK7krKJZAhi8W9f32+lBPv9oq3Ns
+dAxnOj/D3UnhNoIt0EdjqUdLo2U39dt5s5Syj2rFUAgfbc02Rwx65kq8AjTRlW/M
+KDpGsifwIB8b7wActMUO8c3GptptNVWmFm5+Mmk54P//P3tIAx9KXw==
+-----END CERTIFICATE-----
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIPcVUeQ7ZElgCAggA
+MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECGKlFVN6/gIlBIIEyJPeknsA5dvV
+WK27AZzs4wM6WrsD6ba+kPJyZTpon5pn4eoTiw4UCvo7C+21G9jCqbIbDrgTWHwH
+zu6YrBFTZgRUpdLkLsyUsp4UJrZ8xJ7N/jWlG763CyluFE5oBFLz2Vt/DSDSaWdA
+sKdxua/1kvw+KYoDqlObMFIspM5TrndcMnWkOgyvQAvnH0NZXFFBa4QGFrwWDrCo
+m12CzMLwaPMrNFBffCTqZnL1AajT+EYqPTi+cQ5mkRpZ2cuzhdug2eki1KkD12ZN
+3d8Ehl8bfbLEqRE/HnggleRRt7ia1xkzruqQp14JA2UsrioGMF5nvWgWrbyHfpui
+KrCsDwDelrArW/GCki53QBQMuH8Q1YmoNrRZwlG257eA1LiJvmxRyIjKYu0RP+Q8
+EOldycy51VsPVPApUbv9r4IJldrIJiwlmRxxM36uKtFhfojnsWzJORDYI8C37uKi
+UEPiD4GSEH6C0lGO94IoZPjl9z/rZ0qZx1VRHl3nxZc0AQvvj9bWMbyRwsgb6wod
+P8JSy6uEib9UxuenNHzTd48GcNhJbhOqd4IV0XKhi8W1Kil3mMdc3QAwKaLTx12/
+1GrbMui061uyeM6Rf6Xao0PApDnUNmxcFSTsoarG0yH7Q0WZMgKTDCCGhhtZKlE6
+x7pRsnxiFaIpoh32EVIRI+ZXh2rXBcwa2ew0aEccRXtPFvcmdjevkrHuCggc+M+Y
+seFqTHVGWf8eS6o08w095DboD0vFpZXZMRfycTbA7BiE4NYE/uc7v5cH3Ax9l2ef
+zG7o9idDt+/RX7OcetxDFw4eQbq7PfjvrfXS1DcRUEyJ04emh7oxlkAUUNsFtabN
+T0ggvHxcQWkYRE5oPlkbgpwKpK4LDcApXKFwCDKPur2W5Q7KHRfDLtSvZvYarJum
+8j2pGpEis/bdTih29ofNsX6a0Yo5Tlj+9+1c/6/Xi7XvRk/Vbgkoa3iVQ3ckdCuZ
+vO7cRYZBBs6W/Ti3hWFzPEX9FfcnSUp9bEnH4ASnmUcp8PDBJYeaI6HqpO3XbkbF
+l70eDNakd2cDNjQzkFpBT7HO+HtqU3xNt9K0z2gMB7iTDVFyIzh26joCR2O8tiqS
+wUJFkoLPb74GSB7WzE+gb4jXX6n9609PUoR3f896mM34uX3CsY8lA+/0ZGpHnFDA
+ToKdmz6WKIAw0E20nyzLuLwPZgj7HLcR7zza4raipe9QxIdyJr5O+jzGt+OjSM9b
+K1agibRE5DChqQ+P+ikOc6nG7UNyn+lKSjGEbwuzi8F0iugMgcTc/vYO8OWDNGpd
+D1euA5OuVPdfatFa16Fyr4MJJIfE83C4/kSj05fdoyb6pJkOjHhUppVMe+ES5kwl
+YI8RES2XVJzUSxnWsIM613YlMgIZ9xgcuIADnO7gaKJ4RQG+9wJ853Uo4+n89K7F
+Y6KzihuYAUkbAw1pPo1TODom7A/gB9stqRUSQlZWmIgtnJ8wPjt/we0gzPM8LQzb
+ye4KOLjH5iquFc4MU4TtN3gvp9P5R9UFrGeMImS5eMUmBQHckDNdIAtMj7M1wUpR
+JVrzDXWDjC21sLn95NtNMPb+FRlt/biTV3IE3ZmX0kbuCRoH7b7hhR41Zpoajwl0
+FqYigB5gnVodGUWuBgDUqA==
+-----END ENCRYPTED PRIVATE KEY-----
diff --git a/3rdparty/asio/src/examples/cpp11/ssl/client.cpp b/3rdparty/asio/src/examples/cpp11/ssl/client.cpp
new file mode 100644
index 00000000000..6799d2a98e1
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/ssl/client.cpp
@@ -0,0 +1,165 @@
+//
+// client.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <cstring>
+#include <functional>
+#include <iostream>
+#include "asio.hpp"
+#include "asio/ssl.hpp"
+
+using asio::ip::tcp;
+using std::placeholders::_1;
+using std::placeholders::_2;
+
+enum { max_length = 1024 };
+
+class client
+{
+public:
+ client(asio::io_context& io_context,
+ asio::ssl::context& context,
+ const tcp::resolver::results_type& endpoints)
+ : socket_(io_context, context)
+ {
+ socket_.set_verify_mode(asio::ssl::verify_peer);
+ socket_.set_verify_callback(
+ std::bind(&client::verify_certificate, this, _1, _2));
+
+ connect(endpoints);
+ }
+
+private:
+ bool verify_certificate(bool preverified,
+ asio::ssl::verify_context& ctx)
+ {
+ // The verify callback can be used to check whether the certificate that is
+ // being presented is valid for the peer. For example, RFC 2818 describes
+ // the steps involved in doing this for HTTPS. Consult the OpenSSL
+ // documentation for more details. Note that the callback is called once
+ // for each certificate in the certificate chain, starting from the root
+ // certificate authority.
+
+ // In this example we will simply print the certificate's subject name.
+ char subject_name[256];
+ X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle());
+ X509_NAME_oneline(X509_get_subject_name(cert), subject_name, 256);
+ std::cout << "Verifying " << subject_name << "\n";
+
+ return preverified;
+ }
+
+ void connect(const tcp::resolver::results_type& endpoints)
+ {
+ asio::async_connect(socket_.lowest_layer(), endpoints,
+ [this](const std::error_code& error,
+ const tcp::endpoint& /*endpoint*/)
+ {
+ if (!error)
+ {
+ handshake();
+ }
+ else
+ {
+ std::cout << "Connect failed: " << error.message() << "\n";
+ }
+ });
+ }
+
+ void handshake()
+ {
+ socket_.async_handshake(asio::ssl::stream_base::client,
+ [this](const std::error_code& error)
+ {
+ if (!error)
+ {
+ send_request();
+ }
+ else
+ {
+ std::cout << "Handshake failed: " << error.message() << "\n";
+ }
+ });
+ }
+
+ void send_request()
+ {
+ std::cout << "Enter message: ";
+ std::cin.getline(request_, max_length);
+ size_t request_length = std::strlen(request_);
+
+ asio::async_write(socket_,
+ asio::buffer(request_, request_length),
+ [this](const std::error_code& error, std::size_t length)
+ {
+ if (!error)
+ {
+ receive_response(length);
+ }
+ else
+ {
+ std::cout << "Write failed: " << error.message() << "\n";
+ }
+ });
+ }
+
+ void receive_response(std::size_t length)
+ {
+ asio::async_read(socket_,
+ asio::buffer(reply_, length),
+ [this](const std::error_code& error, std::size_t length)
+ {
+ if (!error)
+ {
+ std::cout << "Reply: ";
+ std::cout.write(reply_, length);
+ std::cout << "\n";
+ }
+ else
+ {
+ std::cout << "Read failed: " << error.message() << "\n";
+ }
+ });
+ }
+
+ asio::ssl::stream<tcp::socket> socket_;
+ char request_[max_length];
+ char reply_[max_length];
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: client <host> <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ tcp::resolver resolver(io_context);
+ auto endpoints = resolver.resolve(argv[1], argv[2]);
+
+ asio::ssl::context ctx(asio::ssl::context::sslv23);
+ ctx.load_verify_file("ca.pem");
+
+ client c(io_context, ctx, endpoints);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/ssl/dh4096.pem b/3rdparty/asio/src/examples/cpp11/ssl/dh4096.pem
new file mode 100644
index 00000000000..dc2559c5f82
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/ssl/dh4096.pem
@@ -0,0 +1,25 @@
+-----BEGIN X9.42 DH PARAMETERS-----
+MIIELQKCAgEA8eEBgatlTk0QKIwUqHsteHJXzEr0xAW7RLeNid8DdGjTnFw68eV+
+s1YbipEqQVTFG+VZPaof9v0CH2KOdbgWD0KRPC49HB8O/wARFKpy5eJltVe1r07w
++V1Vjciqkh/vGq/yFQsbqwyWJy6AelsbHdSC9Bg9pmu4+pbVGW15zK7PkfjfoO9V
+JYbhdqFIPg+9NRRWsl/U9UoyeeIGImI9I4k3fqtv311C6VVErFZylCj7nn45L7IY
+GfPcCO5E8FD6EqBv5WnhMNYHMJu9brRvOoAyAyWprqR+aVzHd+DFamDQdsuQjKTk
+3+r07znWJfjp6FVTzR5SvjrKg1knK5TibIksoKOlsFZ06bGkFWHjqXNAKhnSpCiU
+GJd0qe7pTD+TGQJGWskJpoph+tkICUa+6MyzP9+U6T9hISIY/BpVuWn/iwdLqsvV
+s5bg2RjRraww/4Rjm0NyEOTk2MxaLB9gcyu6zcrhX5XRiMgt+jhKwEMwJCEJYkxn
+C0yv08A5v6RceFm1jY+8FT0IzRqsWIGV7beNdqtE0B4LBTuN1yQ6x8CKEb6mbIHG
+d0XLGppELhD8QUwAr5HiVGTAsS9JlMGgXVkyDtxrVSeS1zHWt77skRQ9UlfJfYMm
+5wxHj5QCdQ7ma3oMMZBZutNlkevMzYHIxwqhZstf4ud0j0VMftwZ3GMCggIBAJL7
+cU6/YSxzYDGUcPc6WGT+FAghR0LdhT3Q3Xz1rQRBwSSMPm9NZhyJC3fb+hBl/44X
+AHOu1/3dYIWlXPMuHZZdtlt+hkD/sIob16By20Z0p81Kvh3HQglVDJGlFzTmQbTd
+CM/EP8eJFiNeMcJB0RgeKyzikRsV4r/acZZM56swTlsRvSDFMh3v9YyYTZbCTwxm
+PIVOsxI8uBoWRCzY3yWzjmlZ2u5TR+Z0IVonmNqk6XAKRgxV12YfQVXzzpPZQA9S
+GHoD/NQoMdBAi3p4pLEYJ5qMRLYPQbBfSNu5eP9e5uZOiBp/28bVnzEelDGuFupr
+lvywkZEVL1KaYtZ/dGkPFXt+A7mNsw5xeDTRjgL4uUJvCNIkjgVEfIrLdUf5IVsU
+V8BgunAvgfH+Hy6Tx89v/QGsUWJPhjkSZnXwJ7Ipcsm+Zg0zAZwKDZEQtDLXVPRL
+OfCfXMXvlw2u6OHlhSbqO69zZG3dJTlcnjy06n4JYcUim7Mj3Kduige6VWofeEk9
+M/kHrPqNdFE5tHLh2nHcw9yExKHN+l/OUGAvNDfOVS+S+fNSKT0RfC9dMpHLN+Ok
+fGuskGzLQAVYF+DYEcnJ++0LEFtd0J381ndSc0iJuH60rKDTqxoRqv7lcdwLFlEV
+sQSRoas8s+y+b3FfSu7j0p44qLG9oxZ/WFcWnuUyAiEAjvAD9p3bw8AH0s7dUrX/
+RT1Ge+J/n0tlsgw+LY3zafE=
+-----END X9.42 DH PARAMETERS-----
diff --git a/3rdparty/asio/src/examples/cpp11/ssl/server.cpp b/3rdparty/asio/src/examples/cpp11/ssl/server.cpp
new file mode 100644
index 00000000000..15e0d9eaf03
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/ssl/server.cpp
@@ -0,0 +1,145 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <functional>
+#include <iostream>
+#include "asio.hpp"
+#include "asio/ssl.hpp"
+
+using asio::ip::tcp;
+
+class session : public std::enable_shared_from_this<session>
+{
+public:
+ session(asio::ssl::stream<tcp::socket> socket)
+ : socket_(std::move(socket))
+ {
+ }
+
+ void start()
+ {
+ do_handshake();
+ }
+
+private:
+ void do_handshake()
+ {
+ auto self(shared_from_this());
+ socket_.async_handshake(asio::ssl::stream_base::server,
+ [this, self](const std::error_code& error)
+ {
+ if (!error)
+ {
+ do_read();
+ }
+ });
+ }
+
+ void do_read()
+ {
+ auto self(shared_from_this());
+ socket_.async_read_some(asio::buffer(data_),
+ [this, self](const std::error_code& ec, std::size_t length)
+ {
+ if (!ec)
+ {
+ do_write(length);
+ }
+ });
+ }
+
+ void do_write(std::size_t length)
+ {
+ auto self(shared_from_this());
+ asio::async_write(socket_, asio::buffer(data_, length),
+ [this, self](const std::error_code& ec,
+ std::size_t /*length*/)
+ {
+ if (!ec)
+ {
+ do_read();
+ }
+ });
+ }
+
+ asio::ssl::stream<tcp::socket> socket_;
+ char data_[1024];
+};
+
+class server
+{
+public:
+ server(asio::io_context& io_context, unsigned short port)
+ : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)),
+ context_(asio::ssl::context::sslv23)
+ {
+ context_.set_options(
+ asio::ssl::context::default_workarounds
+ | asio::ssl::context::no_sslv2
+ | asio::ssl::context::single_dh_use);
+ context_.set_password_callback(std::bind(&server::get_password, this));
+ context_.use_certificate_chain_file("server.pem");
+ context_.use_private_key_file("server.pem", asio::ssl::context::pem);
+ context_.use_tmp_dh_file("dh4096.pem");
+
+ do_accept();
+ }
+
+private:
+ std::string get_password() const
+ {
+ return "test";
+ }
+
+ void do_accept()
+ {
+ acceptor_.async_accept(
+ [this](const std::error_code& error, tcp::socket socket)
+ {
+ if (!error)
+ {
+ std::make_shared<session>(
+ asio::ssl::stream<tcp::socket>(
+ std::move(socket), context_))->start();
+ }
+
+ do_accept();
+ });
+ }
+
+ tcp::acceptor acceptor_;
+ asio::ssl::context context_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ using namespace std; // For atoi.
+ server s(io_context, atoi(argv[1]));
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/ssl/server.pem b/3rdparty/asio/src/examples/cpp11/ssl/server.pem
new file mode 100644
index 00000000000..a7bcba738a0
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/ssl/server.pem
@@ -0,0 +1,99 @@
+-----BEGIN CERTIFICATE-----
+MIIDDjCCAfYCFGGcJXlIeQHiq/qOakbISU5cihPvMA0GCSqGSIb3DQEBCwUAMDsx
+CzAJBgNVBAYTAkFVMQwwCgYDVQQIDANOU1cxDzANBgNVBAcMBlN5ZG5leTENMAsG
+A1UECgwEYXNpbzAeFw0yMTExMTEyMTExNDRaFw0yNjExMTAyMTExNDRaMEwxCzAJ
+BgNVBAYTAkFVMQwwCgYDVQQIDANOU1cxDzANBgNVBAcMBlN5ZG5leTENMAsGA1UE
+CgwEYXNpbzEPMA0GA1UECwwGc2VydmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAu67TzZCFNTZ5c1gKwXfdTH3bP0OB5n6dqXGK6jkPb699dyM4oPtY
+2f+OyxJspk8D5pX6HuZ+hLGAsHxfCN+A3RegVZJCR/gXrrMPl/6PfDxtkeFXWy+6
+NAPxqppMj8gbX/czTdNFwgW4J8/RLyH53utjAGQtCRr97EbBOsTSeOmyAxbw4mRt
+EvHjacKFcSZzJDlyxCia37791MulZ4lwOZZlke5NzoOqkBIAusQgg7fMWDvH27PD
+T+taIyBsYTVJWHf5kMklAlWYXZvNjZp/QGt13lDORg2aSc/P2pE4iLyhbZcpuW+W
+nHB7IY1wjDL55/ORCjz3VlNIAMXHP5YQxwIDAQABMA0GCSqGSIb3DQEBCwUAA4IB
+AQC3iiwQTgDP4ixulisYIGlJb8iuhxH9G41hm8dF/1qlIfXWxsbjb+g7M5U/3JCb
+fwCGoz7uBdj/CKkIb5wx83GVC1yVLbNSvCIS827qxic4GACEYGGAy4Ub5tUCQrLr
+JUQTP1WVJcgiKvk7OAcXdA+k/CcNXH153gUPDZz+/BedXe2VbM6LDsqPeSxXfbZN
+AWXARAuly7cQk/xkYkPldRRhx4htNCbnkG1qyEqNcYQN1SY9Qhbrm2HkAUntzQ7G
+umo4JdbIX6MJ5fYNs+yN/lJB7PiJP8Mz1AtOz4x9JxcLyuB6sapT8Tj53n9g/+m1
+Tqd8lHpWe6oM0sgdWfzdBNir
+-----END CERTIFICATE-----
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,9E0E6B9970E055F1
+
+oFvN3t50B2TSeNsRo1vwhVYlMmt0w3MD3Ar75fti4fRhBrWoH4rBPrSouWK4OMDK
+CakfVhzJIEvaMav843grS4V+ooAsfnAtiQiQj+5xjZ8PlCuWir5gyjgqeN4zN6ZT
+2s/oEy5Kx7Ru5AWMkv+NPW5l3iS3c+Hupfb/auITwECSCCsCBxgNtJ8z0iXjv9Dr
+hqvqcI+4F5DSiol3QhitbpQ/k2PKu92AZhPcr9e5HrqeUD7aqfX2q3i+tnJvxC93
+0mvy133bX2ZAGAKMheW/GuzcETfwU80wvmrwHXI9rnuAUaJhrDiIZQ79gubZ0Pcm
+w4Y6Z5xxeErb7zKBi+pHKst8MJ7rfSz/N878su6cpESRC/w1paVX7m8/q61kzBkj
++h2qe9DupXBejQkriN+Z858nFtBKbWlFsmAg1FLZonworTUfV2c7S9yzMV/29VOE
+T0Bt8BU1Hp+bCjreF4JGbnUJnRQoASpisfUkrD6Ar4GI56Edkkx6hkF0cXdcvfCN
+qyhxzcvf/aV1M2kcpBRX9mIfjoFMFNz7uRIxyqPLaDkigwJemoaBo3n9/W5F7N7B
+AGNEZ3QhUlc8EyWpGRZRzMevu5wdz1b2+MqItOhPXUo2XcLEj2iFkVDdbj/d9jQH
+9ZIe4hQTSf784tAzt2Jp2RHmm22390GB1jdzG/CzbGlAKmaTTEe4FJcd/eLOEZuD
+4+iFsEb/bWcCyXkBKkdEoDDMJW8xi5d/1ezJM03nqhvkekDqyhJUJPCbmY1SCX1X
+4AO40jJmWQxwj26Pnnncacz4tuecZNqovz+POpKQSIctrQSV4wgf35137KBt7/O7
+EU0N7Qj4xTigyGkEHCZt7BgD8fFrxiP1OkUmFRHEE7Dxiagz6omJV8ien+p9wIgS
+QcqkJlgKMwVepjuCuEyvg5oIkAPvp24yhePSJkEvvoDLvM2Kub/CM+UkN8dSgsZk
++ZBE9Oi62AWWow8/ib8Um5DNIEZsq+5CQLeBG7f5kTIBAoA9UceaEgbxzOVUCBcX
+L7QsJ3pZ/ei1qx/9tChO/OXa9tleXcjGg7/q/6i6pUyZuqZlt+hk+3HtFmTXIjsM
+chbUSMEJ2isv9MDamTtunt9N92A6OxUkAs68kCO/bzotldXMKZVjOohNnML5q/3U
+vpsuN8NNwaNHCAM7pjols4V7ebX1lDZFR1hbj+szKMhVKzFfig1lRHafgRrR6H6P
+mUK16lKzUbmvwv2IU/3wck+4UNeB/+lRmfAfBasQytnbt+5fwwNkVSrDY2Kxe0nz
+2k3eIYST+ygxGuNrW9rnFbBpTJb0OE5cpgun8xxDE91AmL550AcZff+9ulDBhZg1
+eMoKUALlEdDNPffVTH8Iupn0jMnJsjXynztcEVhx4h2aA5X6/2i035uEybCn33qP
+J7g30oe2C69BSC0YmkT3MjF6Wrhy+M8dU0dDggRhY6JSS8wESvwGenaPi7SZlbxb
+Elmc44bHros1YfGl/xDdhju134/aMBG1GlZlReI+Rwnp9DCp04xiiJb9YKyUNaGY
+7BTGWyie/WYYKbX1ZlxqWA9jxow8PM1XYHuanau1/aYT16L7E83HG3qkyuFIlLJh
+-----END RSA PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIUX3cVQ47QyJp7SOy0RPzP743W9MwwDQYJKoZIhvcNAQEL
+BQAwOzELMAkGA1UEBhMCQVUxDDAKBgNVBAgMA05TVzEPMA0GA1UEBwwGU3lkbmV5
+MQ0wCwYDVQQKDARhc2lvMB4XDTIxMTExMTIxMTA1MloXDTI2MTExMDIxMTA1Mlow
+OzELMAkGA1UEBhMCQVUxDDAKBgNVBAgMA05TVzEPMA0GA1UEBwwGU3lkbmV5MQ0w
+CwYDVQQKDARhc2lvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyURD
+LjKxTCkapmWhY0bP1NaaOPzIJTTB0dzREOlmRmBmiHpW7DaRx7qBm6jYDKQ7OCbz
+30/j8K4TjHOLIwxzXhXMYTJOcN2giPHNUBvm9oEuDAhYgltArJQnBBEH+3C1hCIv
+1+uhTWo0HpGXTeJnvboTZ1YgmbOgr6lMhNiu9QmPX885DxWf6sDq8mRgCDX2x8sk
+Ls0HuLSo88Osjx532yEhnrZgexsByhoRD3yrKHV5mWpaunk5BMsP/XMuQHayFmbO
+siqnHJoL1znGVH003PcBGmEDmoIUqhLiBi2gWGu1pmckP9loqQUTEn0aLOVclHf4
+slWq344zh4tJCpQMfQIDAQABo1AwTjAdBgNVHQ4EFgQUfiX1CMQrGDi9mIBAg9cg
+m0RwLJUwHwYDVR0jBBgwFoAUfiX1CMQrGDi9mIBAg9cgm0RwLJUwDAYDVR0TBAUw
+AwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAnDnVNSb8z/pNFaZ6YAZ+ukfNT3jjbGm1
+10BOLqJj8s5A8/JkwjaWhky/DuGXDywgEvzXC18aNAxASeqO8h9pAZtszu6NWB4s
+h3r+dEQakMacxrZ+jBL/cYLrUv9r3KMPKxaDnplkamqFA/9eNmoV7vDyGtGPZuD6
+oTROtQqqDSrxthCkqnibAfusi7RmlCdvJa0kVK7krKJZAhi8W9f32+lBPv9oq3Ns
+dAxnOj/D3UnhNoIt0EdjqUdLo2U39dt5s5Syj2rFUAgfbc02Rwx65kq8AjTRlW/M
+KDpGsifwIB8b7wActMUO8c3GptptNVWmFm5+Mmk54P//P3tIAx9KXw==
+-----END CERTIFICATE-----
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIPcVUeQ7ZElgCAggA
+MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECGKlFVN6/gIlBIIEyJPeknsA5dvV
+WK27AZzs4wM6WrsD6ba+kPJyZTpon5pn4eoTiw4UCvo7C+21G9jCqbIbDrgTWHwH
+zu6YrBFTZgRUpdLkLsyUsp4UJrZ8xJ7N/jWlG763CyluFE5oBFLz2Vt/DSDSaWdA
+sKdxua/1kvw+KYoDqlObMFIspM5TrndcMnWkOgyvQAvnH0NZXFFBa4QGFrwWDrCo
+m12CzMLwaPMrNFBffCTqZnL1AajT+EYqPTi+cQ5mkRpZ2cuzhdug2eki1KkD12ZN
+3d8Ehl8bfbLEqRE/HnggleRRt7ia1xkzruqQp14JA2UsrioGMF5nvWgWrbyHfpui
+KrCsDwDelrArW/GCki53QBQMuH8Q1YmoNrRZwlG257eA1LiJvmxRyIjKYu0RP+Q8
+EOldycy51VsPVPApUbv9r4IJldrIJiwlmRxxM36uKtFhfojnsWzJORDYI8C37uKi
+UEPiD4GSEH6C0lGO94IoZPjl9z/rZ0qZx1VRHl3nxZc0AQvvj9bWMbyRwsgb6wod
+P8JSy6uEib9UxuenNHzTd48GcNhJbhOqd4IV0XKhi8W1Kil3mMdc3QAwKaLTx12/
+1GrbMui061uyeM6Rf6Xao0PApDnUNmxcFSTsoarG0yH7Q0WZMgKTDCCGhhtZKlE6
+x7pRsnxiFaIpoh32EVIRI+ZXh2rXBcwa2ew0aEccRXtPFvcmdjevkrHuCggc+M+Y
+seFqTHVGWf8eS6o08w095DboD0vFpZXZMRfycTbA7BiE4NYE/uc7v5cH3Ax9l2ef
+zG7o9idDt+/RX7OcetxDFw4eQbq7PfjvrfXS1DcRUEyJ04emh7oxlkAUUNsFtabN
+T0ggvHxcQWkYRE5oPlkbgpwKpK4LDcApXKFwCDKPur2W5Q7KHRfDLtSvZvYarJum
+8j2pGpEis/bdTih29ofNsX6a0Yo5Tlj+9+1c/6/Xi7XvRk/Vbgkoa3iVQ3ckdCuZ
+vO7cRYZBBs6W/Ti3hWFzPEX9FfcnSUp9bEnH4ASnmUcp8PDBJYeaI6HqpO3XbkbF
+l70eDNakd2cDNjQzkFpBT7HO+HtqU3xNt9K0z2gMB7iTDVFyIzh26joCR2O8tiqS
+wUJFkoLPb74GSB7WzE+gb4jXX6n9609PUoR3f896mM34uX3CsY8lA+/0ZGpHnFDA
+ToKdmz6WKIAw0E20nyzLuLwPZgj7HLcR7zza4raipe9QxIdyJr5O+jzGt+OjSM9b
+K1agibRE5DChqQ+P+ikOc6nG7UNyn+lKSjGEbwuzi8F0iugMgcTc/vYO8OWDNGpd
+D1euA5OuVPdfatFa16Fyr4MJJIfE83C4/kSj05fdoyb6pJkOjHhUppVMe+ES5kwl
+YI8RES2XVJzUSxnWsIM613YlMgIZ9xgcuIADnO7gaKJ4RQG+9wJ853Uo4+n89K7F
+Y6KzihuYAUkbAw1pPo1TODom7A/gB9stqRUSQlZWmIgtnJ8wPjt/we0gzPM8LQzb
+ye4KOLjH5iquFc4MU4TtN3gvp9P5R9UFrGeMImS5eMUmBQHckDNdIAtMj7M1wUpR
+JVrzDXWDjC21sLn95NtNMPb+FRlt/biTV3IE3ZmX0kbuCRoH7b7hhR41Zpoajwl0
+FqYigB5gnVodGUWuBgDUqA==
+-----END ENCRYPTED PRIVATE KEY-----
diff --git a/3rdparty/asio/src/examples/cpp11/timeouts/async_tcp_client.cpp b/3rdparty/asio/src/examples/cpp11/timeouts/async_tcp_client.cpp
new file mode 100644
index 00000000000..b8f2cbe77d2
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/timeouts/async_tcp_client.cpp
@@ -0,0 +1,311 @@
+//
+// async_tcp_client.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/buffer.hpp"
+#include "asio/io_context.hpp"
+#include "asio/ip/tcp.hpp"
+#include "asio/read_until.hpp"
+#include "asio/steady_timer.hpp"
+#include "asio/write.hpp"
+#include <functional>
+#include <iostream>
+#include <string>
+
+using asio::steady_timer;
+using asio::ip::tcp;
+using std::placeholders::_1;
+using std::placeholders::_2;
+
+//
+// This class manages socket timeouts by applying the concept of a deadline.
+// Some asynchronous operations are given deadlines by which they must complete.
+// Deadlines are enforced by an "actor" that persists for the lifetime of the
+// client object:
+//
+// +----------------+
+// | |
+// | check_deadline |<---+
+// | | |
+// +----------------+ | async_wait()
+// | |
+// +---------+
+//
+// If the deadline actor determines that the deadline has expired, the socket
+// is closed and any outstanding operations are consequently cancelled.
+//
+// Connection establishment involves trying each endpoint in turn until a
+// connection is successful, or the available endpoints are exhausted. If the
+// deadline actor closes the socket, the connect actor is woken up and moves to
+// the next endpoint.
+//
+// +---------------+
+// | |
+// | start_connect |<---+
+// | | |
+// +---------------+ |
+// | |
+// async_- | +----------------+
+// connect() | | |
+// +--->| handle_connect |
+// | |
+// +----------------+
+// :
+// Once a connection is :
+// made, the connect :
+// actor forks in two - :
+// :
+// an actor for reading : and an actor for
+// inbound messages: : sending heartbeats:
+// :
+// +------------+ : +-------------+
+// | |<- - - - -+- - - - ->| |
+// | start_read | | start_write |<---+
+// | |<---+ | | |
+// +------------+ | +-------------+ | async_wait()
+// | | | |
+// async_- | +-------------+ async_- | +--------------+
+// read_- | | | write() | | |
+// until() +--->| handle_read | +--->| handle_write |
+// | | | |
+// +-------------+ +--------------+
+//
+// The input actor reads messages from the socket, where messages are delimited
+// by the newline character. The deadline for a complete message is 30 seconds.
+//
+// The heartbeat actor sends a heartbeat (a message that consists of a single
+// newline character) every 10 seconds. In this example, no deadline is applied
+// to message sending.
+//
+class client
+{
+public:
+ client(asio::io_context& io_context)
+ : socket_(io_context),
+ deadline_(io_context),
+ heartbeat_timer_(io_context)
+ {
+ }
+
+ // Called by the user of the client class to initiate the connection process.
+ // The endpoints will have been obtained using a tcp::resolver.
+ void start(tcp::resolver::results_type endpoints)
+ {
+ // Start the connect actor.
+ endpoints_ = endpoints;
+ start_connect(endpoints_.begin());
+
+ // Start the deadline actor. You will note that we're not setting any
+ // particular deadline here. Instead, the connect and input actors will
+ // update the deadline prior to each asynchronous operation.
+ deadline_.async_wait(std::bind(&client::check_deadline, this));
+ }
+
+ // This function terminates all the actors to shut down the connection. It
+ // may be called by the user of the client class, or by the class itself in
+ // response to graceful termination or an unrecoverable error.
+ void stop()
+ {
+ stopped_ = true;
+ std::error_code ignored_error;
+ socket_.close(ignored_error);
+ deadline_.cancel();
+ heartbeat_timer_.cancel();
+ }
+
+private:
+ void start_connect(tcp::resolver::results_type::iterator endpoint_iter)
+ {
+ if (endpoint_iter != endpoints_.end())
+ {
+ std::cout << "Trying " << endpoint_iter->endpoint() << "...\n";
+
+ // Set a deadline for the connect operation.
+ deadline_.expires_after(std::chrono::seconds(60));
+
+ // Start the asynchronous connect operation.
+ socket_.async_connect(endpoint_iter->endpoint(),
+ std::bind(&client::handle_connect,
+ this, _1, endpoint_iter));
+ }
+ else
+ {
+ // There are no more endpoints to try. Shut down the client.
+ stop();
+ }
+ }
+
+ void handle_connect(const std::error_code& error,
+ tcp::resolver::results_type::iterator endpoint_iter)
+ {
+ if (stopped_)
+ return;
+
+ // The async_connect() function automatically opens the socket at the start
+ // of the asynchronous operation. If the socket is closed at this time then
+ // the timeout handler must have run first.
+ if (!socket_.is_open())
+ {
+ std::cout << "Connect timed out\n";
+
+ // Try the next available endpoint.
+ start_connect(++endpoint_iter);
+ }
+
+ // Check if the connect operation failed before the deadline expired.
+ else if (error)
+ {
+ std::cout << "Connect error: " << error.message() << "\n";
+
+ // We need to close the socket used in the previous connection attempt
+ // before starting a new one.
+ socket_.close();
+
+ // Try the next available endpoint.
+ start_connect(++endpoint_iter);
+ }
+
+ // Otherwise we have successfully established a connection.
+ else
+ {
+ std::cout << "Connected to " << endpoint_iter->endpoint() << "\n";
+
+ // Start the input actor.
+ start_read();
+
+ // Start the heartbeat actor.
+ start_write();
+ }
+ }
+
+ void start_read()
+ {
+ // Set a deadline for the read operation.
+ deadline_.expires_after(std::chrono::seconds(30));
+
+ // Start an asynchronous operation to read a newline-delimited message.
+ asio::async_read_until(socket_,
+ asio::dynamic_buffer(input_buffer_), '\n',
+ std::bind(&client::handle_read, this, _1, _2));
+ }
+
+ void handle_read(const std::error_code& error, std::size_t n)
+ {
+ if (stopped_)
+ return;
+
+ if (!error)
+ {
+ // Extract the newline-delimited message from the buffer.
+ std::string line(input_buffer_.substr(0, n - 1));
+ input_buffer_.erase(0, n);
+
+ // Empty messages are heartbeats and so ignored.
+ if (!line.empty())
+ {
+ std::cout << "Received: " << line << "\n";
+ }
+
+ start_read();
+ }
+ else
+ {
+ std::cout << "Error on receive: " << error.message() << "\n";
+
+ stop();
+ }
+ }
+
+ void start_write()
+ {
+ if (stopped_)
+ return;
+
+ // Start an asynchronous operation to send a heartbeat message.
+ asio::async_write(socket_, asio::buffer("\n", 1),
+ std::bind(&client::handle_write, this, _1));
+ }
+
+ void handle_write(const std::error_code& error)
+ {
+ if (stopped_)
+ return;
+
+ if (!error)
+ {
+ // Wait 10 seconds before sending the next heartbeat.
+ heartbeat_timer_.expires_after(std::chrono::seconds(10));
+ heartbeat_timer_.async_wait(std::bind(&client::start_write, this));
+ }
+ else
+ {
+ std::cout << "Error on heartbeat: " << error.message() << "\n";
+
+ stop();
+ }
+ }
+
+ void check_deadline()
+ {
+ if (stopped_)
+ return;
+
+ // Check whether the deadline has passed. We compare the deadline against
+ // the current time since a new asynchronous operation may have moved the
+ // deadline before this actor had a chance to run.
+ if (deadline_.expiry() <= steady_timer::clock_type::now())
+ {
+ // The deadline has passed. The socket is closed so that any outstanding
+ // asynchronous operations are cancelled.
+ socket_.close();
+
+ // There is no longer an active deadline. The expiry is set to the
+ // maximum time point so that the actor takes no action until a new
+ // deadline is set.
+ deadline_.expires_at(steady_timer::time_point::max());
+ }
+
+ // Put the actor back to sleep.
+ deadline_.async_wait(std::bind(&client::check_deadline, this));
+ }
+
+private:
+ bool stopped_ = false;
+ tcp::resolver::results_type endpoints_;
+ tcp::socket socket_;
+ std::string input_buffer_;
+ steady_timer deadline_;
+ steady_timer heartbeat_timer_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: client <host> <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+ tcp::resolver r(io_context);
+ client c(io_context);
+
+ c.start(r.resolve(argv[1], argv[2]));
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/timeouts/blocking_tcp_client.cpp b/3rdparty/asio/src/examples/cpp11/timeouts/blocking_tcp_client.cpp
new file mode 100644
index 00000000000..e29edc2895f
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/timeouts/blocking_tcp_client.cpp
@@ -0,0 +1,192 @@
+//
+// blocking_tcp_client.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/buffer.hpp"
+#include "asio/connect.hpp"
+#include "asio/io_context.hpp"
+#include "asio/ip/tcp.hpp"
+#include "asio/read_until.hpp"
+#include "asio/system_error.hpp"
+#include "asio/write.hpp"
+#include <cstdlib>
+#include <iostream>
+#include <string>
+
+using asio::ip::tcp;
+
+//----------------------------------------------------------------------
+
+//
+// This class manages socket timeouts by running the io_context using the timed
+// io_context::run_for() member function. Each asynchronous operation is given
+// a timeout within which it must complete. The socket operations themselves
+// use lambdas as completion handlers. For a given socket operation, the client
+// object runs the io_context to block thread execution until the operation
+// completes or the timeout is reached. If the io_context::run_for() function
+// times out, the socket is closed and the outstanding asynchronous operation
+// is cancelled.
+//
+class client
+{
+public:
+ void connect(const std::string& host, const std::string& service,
+ std::chrono::steady_clock::duration timeout)
+ {
+ // Resolve the host name and service to a list of endpoints.
+ auto endpoints = tcp::resolver(io_context_).resolve(host, service);
+
+ // Start the asynchronous operation itself. The lambda that is used as a
+ // callback will update the error variable when the operation completes.
+ // The blocking_udp_client.cpp example shows how you can use std::bind
+ // rather than a lambda.
+ std::error_code error;
+ asio::async_connect(socket_, endpoints,
+ [&](const std::error_code& result_error,
+ const tcp::endpoint& /*result_endpoint*/)
+ {
+ error = result_error;
+ });
+
+ // Run the operation until it completes, or until the timeout.
+ run(timeout);
+
+ // Determine whether a connection was successfully established.
+ if (error)
+ throw std::system_error(error);
+ }
+
+ std::string read_line(std::chrono::steady_clock::duration timeout)
+ {
+ // Start the asynchronous operation. The lambda that is used as a callback
+ // will update the error and n variables when the operation completes. The
+ // blocking_udp_client.cpp example shows how you can use std::bind rather
+ // than a lambda.
+ std::error_code error;
+ std::size_t n = 0;
+ asio::async_read_until(socket_,
+ asio::dynamic_buffer(input_buffer_), '\n',
+ [&](const std::error_code& result_error,
+ std::size_t result_n)
+ {
+ error = result_error;
+ n = result_n;
+ });
+
+ // Run the operation until it completes, or until the timeout.
+ run(timeout);
+
+ // Determine whether the read completed successfully.
+ if (error)
+ throw std::system_error(error);
+
+ std::string line(input_buffer_.substr(0, n - 1));
+ input_buffer_.erase(0, n);
+ return line;
+ }
+
+ void write_line(const std::string& line,
+ std::chrono::steady_clock::duration timeout)
+ {
+ std::string data = line + "\n";
+
+ // Start the asynchronous operation itself. The lambda that is used as a
+ // callback will update the error variable when the operation completes.
+ // The blocking_udp_client.cpp example shows how you can use std::bind
+ // rather than a lambda.
+ std::error_code error;
+ asio::async_write(socket_, asio::buffer(data),
+ [&](const std::error_code& result_error,
+ std::size_t /*result_n*/)
+ {
+ error = result_error;
+ });
+
+ // Run the operation until it completes, or until the timeout.
+ run(timeout);
+
+ // Determine whether the read completed successfully.
+ if (error)
+ throw std::system_error(error);
+ }
+
+private:
+ void run(std::chrono::steady_clock::duration timeout)
+ {
+ // Restart the io_context, as it may have been left in the "stopped" state
+ // by a previous operation.
+ io_context_.restart();
+
+ // Block until the asynchronous operation has completed, or timed out. If
+ // the pending asynchronous operation is a composed operation, the deadline
+ // applies to the entire operation, rather than individual operations on
+ // the socket.
+ io_context_.run_for(timeout);
+
+ // If the asynchronous operation completed successfully then the io_context
+ // would have been stopped due to running out of work. If it was not
+ // stopped, then the io_context::run_for call must have timed out.
+ if (!io_context_.stopped())
+ {
+ // Close the socket to cancel the outstanding asynchronous operation.
+ socket_.close();
+
+ // Run the io_context again until the operation completes.
+ io_context_.run();
+ }
+ }
+
+ asio::io_context io_context_;
+ tcp::socket socket_{io_context_};
+ std::string input_buffer_;
+};
+
+//----------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 4)
+ {
+ std::cerr << "Usage: blocking_tcp_client <host> <port> <message>\n";
+ return 1;
+ }
+
+ client c;
+ c.connect(argv[1], argv[2], std::chrono::seconds(10));
+
+ auto time_sent = std::chrono::steady_clock::now();
+
+ c.write_line(argv[3], std::chrono::seconds(10));
+
+ for (;;)
+ {
+ std::string line = c.read_line(std::chrono::seconds(10));
+
+ // Keep going until we get back the line that was sent.
+ if (line == argv[3])
+ break;
+ }
+
+ auto time_received = std::chrono::steady_clock::now();
+
+ std::cout << "Round trip time: ";
+ std::cout << std::chrono::duration_cast<
+ std::chrono::microseconds>(
+ time_received - time_sent).count();
+ std::cout << " microseconds\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/timeouts/blocking_token_tcp_client.cpp b/3rdparty/asio/src/examples/cpp11/timeouts/blocking_token_tcp_client.cpp
new file mode 100644
index 00000000000..085570d8b78
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/timeouts/blocking_token_tcp_client.cpp
@@ -0,0 +1,171 @@
+//
+// blocking_token_tcp_client.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/connect.hpp"
+#include "asio/io_context.hpp"
+#include "asio/ip/tcp.hpp"
+#include "asio/read_until.hpp"
+#include "asio/streambuf.hpp"
+#include "asio/system_error.hpp"
+#include "asio/write.hpp"
+#include <cstdlib>
+#include <iostream>
+#include <memory>
+#include <string>
+
+using asio::ip::tcp;
+
+// NOTE: This example uses the new form of the asio::async_result trait.
+// For an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+// We will use our sockets only with an io_context.
+using tcp_socket = asio::basic_stream_socket<
+ tcp, asio::io_context::executor_type>;
+
+//----------------------------------------------------------------------
+
+// A custom completion token that makes asynchronous operations behave as
+// though they are blocking calls with a timeout.
+struct close_after
+{
+ close_after(std::chrono::steady_clock::duration t, tcp_socket& s)
+ : timeout_(t), socket_(s)
+ {
+ }
+
+ // The maximum time to wait for an asynchronous operation to complete.
+ std::chrono::steady_clock::duration timeout_;
+
+ // The socket to be closed if the operation does not complete in time.
+ tcp_socket& socket_;
+};
+
+namespace asio {
+
+// The async_result template is specialised to allow the close_after token to
+// be used with asynchronous operations that have a completion signature of
+// void(error_code, T). Generalising this for all completion signature forms is
+// left as an exercise for the reader.
+template <typename T>
+class async_result<close_after, void(std::error_code, T)>
+{
+public:
+ // The initiate() function is used to launch the asynchronous operation by
+ // calling the operation's initiation function object. For the close_after
+ // completion token, we use this function to run the io_context until the
+ // operation is complete.
+ template <typename Init, typename... Args>
+ static T initiate(Init init, close_after token, Args&&... args)
+ {
+ asio::io_context& io_context = asio::query(
+ token.socket_.get_executor(), asio::execution::context);
+
+ // Call the operation's initiation function object to start the operation.
+ // A lambda is supplied as the completion handler, to be called when the
+ // operation completes.
+ std::error_code error;
+ T result;
+ init([&](std::error_code e, T t)
+ {
+ error = e;
+ result = t;
+ }, std::forward<Args>(args)...);
+
+ // Restart the io_context, as it may have been left in the "stopped" state
+ // by a previous operation.
+ io_context.restart();
+
+ // Block until the asynchronous operation has completed, or timed out. If
+ // the pending asynchronous operation is a composed operation, the deadline
+ // applies to the entire operation, rather than individual operations on
+ // the socket.
+ io_context.run_for(token.timeout_);
+
+ // If the asynchronous operation completed successfully then the io_context
+ // would have been stopped due to running out of work. If it was not
+ // stopped, then the io_context::run_for call must have timed out and the
+ // operation is still incomplete.
+ if (!io_context.stopped())
+ {
+ // Close the socket to cancel the outstanding asynchronous operation.
+ token.socket_.close();
+
+ // Run the io_context again until the operation completes.
+ io_context.run();
+ }
+
+ // If the operation failed, throw an exception. Otherwise return the result.
+ return error ? throw std::system_error(error) : result;
+ }
+};
+
+} // namespace asio
+
+//----------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 4)
+ {
+ std::cerr << "Usage: blocking_tcp_client <host> <port> <message>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ // Resolve the host name and service to a list of endpoints.
+ auto endpoints = tcp::resolver(io_context).resolve(argv[1], argv[2]);
+
+ tcp_socket socket(io_context);
+
+ // Run an asynchronous connect operation with a timeout.
+ asio::async_connect(socket, endpoints,
+ close_after(std::chrono::seconds(10), socket));
+
+ auto time_sent = std::chrono::steady_clock::now();
+
+ // Run an asynchronous write operation with a timeout.
+ std::string msg = argv[3] + std::string("\n");
+ asio::async_write(socket, asio::buffer(msg),
+ close_after(std::chrono::seconds(10), socket));
+
+ for (std::string input_buffer;;)
+ {
+ // Run an asynchronous read operation with a timeout.
+ std::size_t n = asio::async_read_until(socket,
+ asio::dynamic_buffer(input_buffer), '\n',
+ close_after(std::chrono::seconds(10), socket));
+
+ std::string line(input_buffer.substr(0, n - 1));
+ input_buffer.erase(0, n);
+
+ // Keep going until we get back the line that was sent.
+ if (line == argv[3])
+ break;
+ }
+
+ auto time_received = std::chrono::steady_clock::now();
+
+ std::cout << "Round trip time: ";
+ std::cout << std::chrono::duration_cast<
+ std::chrono::microseconds>(
+ time_received - time_sent).count();
+ std::cout << " microseconds\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/timeouts/blocking_udp_client.cpp b/3rdparty/asio/src/examples/cpp11/timeouts/blocking_udp_client.cpp
new file mode 100644
index 00000000000..312f21ab656
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/timeouts/blocking_udp_client.cpp
@@ -0,0 +1,155 @@
+//
+// blocking_udp_client.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/buffer.hpp"
+#include "asio/io_context.hpp"
+#include "asio/ip/udp.hpp"
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+
+using asio::ip::udp;
+using std::placeholders::_1;
+using std::placeholders::_2;
+
+//----------------------------------------------------------------------
+
+//
+// This class manages socket timeouts by running the io_context using the timed
+// io_context::run_for() member function. Each asynchronous operation is given
+// a timeout within which it must complete. The socket operations themselves
+// use std::bind to specify the completion handler:
+//
+// +---------------+
+// | |
+// | receive |
+// | |
+// +---------------+
+// |
+// async_- | +----------------+
+// receive() | | |
+// +--->| handle_receive |
+// | |
+// +----------------+
+//
+// For a given socket operation, the client object runs the io_context to block
+// thread execution until the operation completes or the timeout is reached. If
+// the io_context::run_for() function times out, the socket is closed and the
+// outstanding asynchronous operation is cancelled.
+//
+class client
+{
+public:
+ client(const udp::endpoint& listen_endpoint)
+ : socket_(io_context_, listen_endpoint)
+ {
+ }
+
+ std::size_t receive(const asio::mutable_buffer& buffer,
+ std::chrono::steady_clock::duration timeout,
+ std::error_code& error)
+ {
+ // Start the asynchronous operation. The handle_receive function used as a
+ // callback will update the error and length variables.
+ std::size_t length = 0;
+ socket_.async_receive(asio::buffer(buffer),
+ std::bind(&client::handle_receive, _1, _2, &error, &length));
+
+ // Run the operation until it completes, or until the timeout.
+ run(timeout);
+
+ return length;
+ }
+
+private:
+ void run(std::chrono::steady_clock::duration timeout)
+ {
+ // Restart the io_context, as it may have been left in the "stopped" state
+ // by a previous operation.
+ io_context_.restart();
+
+ // Block until the asynchronous operation has completed, or timed out. If
+ // the pending asynchronous operation is a composed operation, the deadline
+ // applies to the entire operation, rather than individual operations on
+ // the socket.
+ io_context_.run_for(timeout);
+
+ // If the asynchronous operation completed successfully then the io_context
+ // would have been stopped due to running out of work. If it was not
+ // stopped, then the io_context::run_for call must have timed out.
+ if (!io_context_.stopped())
+ {
+ // Cancel the outstanding asynchronous operation.
+ socket_.cancel();
+
+ // Run the io_context again until the operation completes.
+ io_context_.run();
+ }
+ }
+
+ static void handle_receive(
+ const std::error_code& error, std::size_t length,
+ std::error_code* out_error, std::size_t* out_length)
+ {
+ *out_error = error;
+ *out_length = length;
+ }
+
+private:
+ asio::io_context io_context_;
+ udp::socket socket_;
+};
+
+//----------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ using namespace std; // For atoi.
+
+ if (argc != 3)
+ {
+ std::cerr << "Usage: blocking_udp_client <listen_addr> <listen_port>\n";
+ return 1;
+ }
+
+ udp::endpoint listen_endpoint(
+ asio::ip::make_address(argv[1]),
+ std::atoi(argv[2]));
+
+ client c(listen_endpoint);
+
+ for (;;)
+ {
+ char data[1024];
+ std::error_code error;
+ std::size_t n = c.receive(asio::buffer(data),
+ std::chrono::seconds(10), error);
+
+ if (error)
+ {
+ std::cout << "Receive error: " << error.message() << "\n";
+ }
+ else
+ {
+ std::cout << "Received: ";
+ std::cout.write(data, n);
+ std::cout << "\n";
+ }
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/timeouts/server.cpp b/3rdparty/asio/src/examples/cpp11/timeouts/server.cpp
new file mode 100644
index 00000000000..6e18fc60c2b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/timeouts/server.cpp
@@ -0,0 +1,433 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <algorithm>
+#include <cstdlib>
+#include <deque>
+#include <iostream>
+#include <memory>
+#include <set>
+#include <string>
+#include "asio/buffer.hpp"
+#include "asio/io_context.hpp"
+#include "asio/ip/tcp.hpp"
+#include "asio/ip/udp.hpp"
+#include "asio/read_until.hpp"
+#include "asio/steady_timer.hpp"
+#include "asio/write.hpp"
+
+using asio::steady_timer;
+using asio::ip::tcp;
+using asio::ip::udp;
+
+//----------------------------------------------------------------------
+
+class subscriber
+{
+public:
+ virtual ~subscriber() = default;
+ virtual void deliver(const std::string& msg) = 0;
+};
+
+typedef std::shared_ptr<subscriber> subscriber_ptr;
+
+//----------------------------------------------------------------------
+
+class channel
+{
+public:
+ void join(subscriber_ptr subscriber)
+ {
+ subscribers_.insert(subscriber);
+ }
+
+ void leave(subscriber_ptr subscriber)
+ {
+ subscribers_.erase(subscriber);
+ }
+
+ void deliver(const std::string& msg)
+ {
+ for (const auto& s : subscribers_)
+ {
+ s->deliver(msg);
+ }
+ }
+
+private:
+ std::set<subscriber_ptr> subscribers_;
+};
+
+//----------------------------------------------------------------------
+
+//
+// This class manages socket timeouts by applying the concept of a deadline.
+// Some asynchronous operations are given deadlines by which they must complete.
+// Deadlines are enforced by two "actors" that persist for the lifetime of the
+// session object, one for input and one for output:
+//
+// +----------------+ +----------------+
+// | | | |
+// | check_deadline |<-------+ | check_deadline |<-------+
+// | | | | | |
+// +----------------+ | +----------------+ |
+// | | | |
+// async_wait() | +----------------+ async_wait() | +----------------+
+// on input | | lambda | on output | | lambda |
+// deadline +--->| in | deadline +--->| in |
+// | check_deadline | | check_deadline |
+// +----------------+ +----------------+
+//
+// If either deadline actor determines that the corresponding deadline has
+// expired, the socket is closed and any outstanding operations are cancelled.
+//
+// The input actor reads messages from the socket, where messages are delimited
+// by the newline character:
+//
+// +-------------+
+// | |
+// | read_line |<----+
+// | | |
+// +-------------+ |
+// | |
+// async_- | +-------------+
+// read_- | | lambda |
+// until() +--->| in |
+// | read_line |
+// +-------------+
+//
+// The deadline for receiving a complete message is 30 seconds. If a non-empty
+// message is received, it is delivered to all subscribers. If a heartbeat (a
+// message that consists of a single newline character) is received, a heartbeat
+// is enqueued for the client, provided there are no other messages waiting to
+// be sent.
+//
+// The output actor is responsible for sending messages to the client:
+//
+// +----------------+
+// | |<---------------------+
+// | await_output | |
+// | |<-------+ |
+// +----------------+ | |
+// | | | |
+// | async_- | +----------------+ |
+// | wait() | | lambda | |
+// | +->| in | |
+// | | await_output | |
+// | +----------------+ |
+// V |
+// +--------------+ +--------------+
+// | | async_write() | lambda |
+// | write_line |-------------->| in |
+// | | | write_line |
+// +--------------+ +--------------+
+//
+// The output actor first waits for an output message to be enqueued. It does
+// this by using a steady_timer as an asynchronous condition variable. The
+// steady_timer will be signalled whenever the output queue is non-empty.
+//
+// Once a message is available, it is sent to the client. The deadline for
+// sending a complete message is 30 seconds. After the message is successfully
+// sent, the output actor again waits for the output queue to become non-empty.
+//
+class tcp_session
+ : public subscriber,
+ public std::enable_shared_from_this<tcp_session>
+{
+public:
+ tcp_session(tcp::socket socket, channel& ch)
+ : channel_(ch),
+ socket_(std::move(socket))
+ {
+ input_deadline_.expires_at(steady_timer::time_point::max());
+ output_deadline_.expires_at(steady_timer::time_point::max());
+
+ // The non_empty_output_queue_ steady_timer is set to the maximum time
+ // point whenever the output queue is empty. This ensures that the output
+ // actor stays asleep until a message is put into the queue.
+ non_empty_output_queue_.expires_at(steady_timer::time_point::max());
+ }
+
+ // Called by the server object to initiate the four actors.
+ void start()
+ {
+ channel_.join(shared_from_this());
+
+ read_line();
+ check_deadline(input_deadline_);
+
+ await_output();
+ check_deadline(output_deadline_);
+ }
+
+private:
+ void stop()
+ {
+ channel_.leave(shared_from_this());
+
+ std::error_code ignored_error;
+ socket_.close(ignored_error);
+ input_deadline_.cancel();
+ non_empty_output_queue_.cancel();
+ output_deadline_.cancel();
+ }
+
+ bool stopped() const
+ {
+ return !socket_.is_open();
+ }
+
+ void deliver(const std::string& msg) override
+ {
+ output_queue_.push_back(msg + "\n");
+
+ // Signal that the output queue contains messages. Modifying the expiry
+ // will wake the output actor, if it is waiting on the timer.
+ non_empty_output_queue_.expires_at(steady_timer::time_point::min());
+ }
+
+ void read_line()
+ {
+ // Set a deadline for the read operation.
+ input_deadline_.expires_after(std::chrono::seconds(30));
+
+ // Start an asynchronous operation to read a newline-delimited message.
+ auto self(shared_from_this());
+ asio::async_read_until(socket_,
+ asio::dynamic_buffer(input_buffer_), '\n',
+ [this, self](const std::error_code& error, std::size_t n)
+ {
+ // Check if the session was stopped while the operation was pending.
+ if (stopped())
+ return;
+
+ if (!error)
+ {
+ // Extract the newline-delimited message from the buffer.
+ std::string msg(input_buffer_.substr(0, n - 1));
+ input_buffer_.erase(0, n);
+
+ if (!msg.empty())
+ {
+ channel_.deliver(msg);
+ }
+ else
+ {
+
+ // We received a heartbeat message from the client. If there's
+ // nothing else being sent or ready to be sent, send a heartbeat
+ // right back.
+ if (output_queue_.empty())
+ {
+ output_queue_.push_back("\n");
+
+ // Signal that the output queue contains messages. Modifying
+ // the expiry will wake the output actor, if it is waiting on
+ // the timer.
+ non_empty_output_queue_.expires_at(
+ steady_timer::time_point::min());
+ }
+ }
+
+ read_line();
+ }
+ else
+ {
+ stop();
+ }
+ });
+ }
+
+ void await_output()
+ {
+ auto self(shared_from_this());
+ non_empty_output_queue_.async_wait(
+ [this, self](const std::error_code& /*error*/)
+ {
+ // Check if the session was stopped while the operation was pending.
+ if (stopped())
+ return;
+
+ if (output_queue_.empty())
+ {
+ // There are no messages that are ready to be sent. The actor goes
+ // to sleep by waiting on the non_empty_output_queue_ timer. When a
+ // new message is added, the timer will be modified and the actor
+ // will wake.
+ non_empty_output_queue_.expires_at(steady_timer::time_point::max());
+ await_output();
+ }
+ else
+ {
+ write_line();
+ }
+ });
+ }
+
+ void write_line()
+ {
+ // Set a deadline for the write operation.
+ output_deadline_.expires_after(std::chrono::seconds(30));
+
+ // Start an asynchronous operation to send a message.
+ auto self(shared_from_this());
+ asio::async_write(socket_,
+ asio::buffer(output_queue_.front()),
+ [this, self](const std::error_code& error, std::size_t /*n*/)
+ {
+ // Check if the session was stopped while the operation was pending.
+ if (stopped())
+ return;
+
+ if (!error)
+ {
+ output_queue_.pop_front();
+
+ await_output();
+ }
+ else
+ {
+ stop();
+ }
+ });
+ }
+
+ void check_deadline(steady_timer& deadline)
+ {
+ auto self(shared_from_this());
+ deadline.async_wait(
+ [this, self, &deadline](const std::error_code& /*error*/)
+ {
+ // Check if the session was stopped while the operation was pending.
+ if (stopped())
+ return;
+
+ // Check whether the deadline has passed. We compare the deadline
+ // against the current time since a new asynchronous operation may
+ // have moved the deadline before this actor had a chance to run.
+ if (deadline.expiry() <= steady_timer::clock_type::now())
+ {
+ // The deadline has passed. Stop the session. The other actors will
+ // terminate as soon as possible.
+ stop();
+ }
+ else
+ {
+ // Put the actor back to sleep.
+ check_deadline(deadline);
+ }
+ });
+ }
+
+ channel& channel_;
+ tcp::socket socket_;
+ std::string input_buffer_;
+ steady_timer input_deadline_{socket_.get_executor()};
+ std::deque<std::string> output_queue_;
+ steady_timer non_empty_output_queue_{socket_.get_executor()};
+ steady_timer output_deadline_{socket_.get_executor()};
+};
+
+typedef std::shared_ptr<tcp_session> tcp_session_ptr;
+
+//----------------------------------------------------------------------
+
+class udp_broadcaster
+ : public subscriber
+{
+public:
+ udp_broadcaster(asio::io_context& io_context,
+ const udp::endpoint& broadcast_endpoint)
+ : socket_(io_context)
+ {
+ socket_.connect(broadcast_endpoint);
+ socket_.set_option(udp::socket::broadcast(true));
+ }
+
+private:
+ void deliver(const std::string& msg)
+ {
+ std::error_code ignored_error;
+ socket_.send(asio::buffer(msg), 0, ignored_error);
+ }
+
+ udp::socket socket_;
+};
+
+//----------------------------------------------------------------------
+
+class server
+{
+public:
+ server(asio::io_context& io_context,
+ const tcp::endpoint& listen_endpoint,
+ const udp::endpoint& broadcast_endpoint)
+ : io_context_(io_context),
+ acceptor_(io_context, listen_endpoint)
+ {
+ channel_.join(
+ std::make_shared<udp_broadcaster>(
+ io_context_, broadcast_endpoint));
+
+ accept();
+ }
+
+private:
+ void accept()
+ {
+ acceptor_.async_accept(
+ [this](const std::error_code& error, tcp::socket socket)
+ {
+ if (!error)
+ {
+ std::make_shared<tcp_session>(std::move(socket), channel_)->start();
+ }
+
+ accept();
+ });
+ }
+
+ asio::io_context& io_context_;
+ tcp::acceptor acceptor_;
+ channel channel_;
+};
+
+//----------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ using namespace std; // For atoi.
+
+ if (argc != 4)
+ {
+ std::cerr << "Usage: server <listen_port> <bcast_address> <bcast_port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ tcp::endpoint listen_endpoint(tcp::v4(), atoi(argv[1]));
+
+ udp::endpoint broadcast_endpoint(
+ asio::ip::make_address(argv[2]), atoi(argv[3]));
+
+ server s(io_context, listen_endpoint, broadcast_endpoint);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/timers/time_t_timer.cpp b/3rdparty/asio/src/examples/cpp11/timers/time_t_timer.cpp
new file mode 100644
index 00000000000..bca436d31e7
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/timers/time_t_timer.cpp
@@ -0,0 +1,106 @@
+//
+// time_t_timer.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <ctime>
+#include <chrono>
+#include <iostream>
+
+// A custom implementation of the Clock concept from the standard C++ library.
+struct time_t_clock
+{
+ // The duration type.
+ typedef std::chrono::steady_clock::duration duration;
+
+ // The duration's underlying arithmetic representation.
+ typedef duration::rep rep;
+
+ // The ratio representing the duration's tick period.
+ typedef duration::period period;
+
+ // An absolute time point represented using the clock.
+ typedef std::chrono::time_point<time_t_clock> time_point;
+
+ // The clock is not monotonically increasing.
+ static constexpr bool is_steady = false;
+
+ // Get the current time.
+ static time_point now() noexcept
+ {
+ return time_point() + std::chrono::seconds(std::time(0));
+ }
+};
+
+// The asio::basic_waitable_timer template accepts an optional WaitTraits
+// template parameter. The underlying time_t clock has one-second granularity,
+// so these traits may be customised to reduce the latency between the clock
+// ticking over and a wait operation's completion. When the timeout is near
+// (less than one second away) we poll the clock more frequently to detect the
+// time change closer to when it occurs. The user can select the appropriate
+// trade off between accuracy and the increased CPU cost of polling. In extreme
+// cases, a zero duration may be returned to make the timers as accurate as
+// possible, albeit with 100% CPU usage.
+struct time_t_wait_traits
+{
+ // Determine how long until the clock should be next polled to determine
+ // whether the duration has elapsed.
+ static time_t_clock::duration to_wait_duration(
+ const time_t_clock::duration& d)
+ {
+ if (d > std::chrono::seconds(1))
+ return d - std::chrono::seconds(1);
+ else if (d > std::chrono::seconds(0))
+ return std::chrono::milliseconds(10);
+ else
+ return std::chrono::seconds(0);
+ }
+
+ // Determine how long until the clock should be next polled to determine
+ // whether the absoluate time has been reached.
+ static time_t_clock::duration to_wait_duration(
+ const time_t_clock::time_point& t)
+ {
+ return to_wait_duration(t - time_t_clock::now());
+ }
+};
+
+typedef asio::basic_waitable_timer<
+ time_t_clock, time_t_wait_traits> time_t_timer;
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context;
+
+ time_t_timer timer(io_context);
+
+ timer.expires_after(std::chrono::seconds(5));
+ std::cout << "Starting synchronous wait\n";
+ timer.wait();
+ std::cout << "Finished synchronous wait\n";
+
+ timer.expires_after(std::chrono::seconds(5));
+ std::cout << "Starting asynchronous wait\n";
+ timer.async_wait(
+ [](const std::error_code& /*error*/)
+ {
+ std::cout << "timeout\n";
+ });
+ io_context.run();
+ std::cout << "Finished asynchronous wait\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/tutorial/daytime1/client.cpp b/3rdparty/asio/src/examples/cpp11/tutorial/daytime1/client.cpp
new file mode 100644
index 00000000000..9d927759f5c
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/tutorial/daytime1/client.cpp
@@ -0,0 +1,57 @@
+//
+// client.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <array>
+#include <iostream>
+#include <asio.hpp>
+
+using asio::ip::tcp;
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: client <host>" << std::endl;
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ tcp::resolver resolver(io_context);
+ tcp::resolver::results_type endpoints =
+ resolver.resolve(argv[1], "daytime");
+
+ tcp::socket socket(io_context);
+ asio::connect(socket, endpoints);
+
+ for (;;)
+ {
+ std::array<char, 128> buf;
+ std::error_code error;
+
+ size_t len = socket.read_some(asio::buffer(buf), error);
+
+ if (error == asio::error::eof)
+ break; // Connection closed cleanly by peer.
+ else if (error)
+ throw std::system_error(error); // Some other error.
+
+ std::cout.write(buf.data(), len);
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/tutorial/daytime2/server.cpp b/3rdparty/asio/src/examples/cpp11/tutorial/daytime2/server.cpp
new file mode 100644
index 00000000000..971149d6e8d
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/tutorial/daytime2/server.cpp
@@ -0,0 +1,50 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <ctime>
+#include <iostream>
+#include <string>
+#include <asio.hpp>
+
+using asio::ip::tcp;
+
+std::string make_daytime_string()
+{
+ using namespace std; // For time_t, time and ctime;
+ time_t now = time(0);
+ return ctime(&now);
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 13));
+
+ for (;;)
+ {
+ tcp::socket socket(io_context);
+ acceptor.accept(socket);
+
+ std::string message = make_daytime_string();
+
+ std::error_code ignored_error;
+ asio::write(socket, asio::buffer(message), ignored_error);
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/tutorial/daytime3/server.cpp b/3rdparty/asio/src/examples/cpp11/tutorial/daytime3/server.cpp
new file mode 100644
index 00000000000..339de72d4a7
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/tutorial/daytime3/server.cpp
@@ -0,0 +1,118 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <ctime>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <asio.hpp>
+
+using asio::ip::tcp;
+
+std::string make_daytime_string()
+{
+ using namespace std; // For time_t, time and ctime;
+ time_t now = time(0);
+ return ctime(&now);
+}
+
+class tcp_connection
+ : public std::enable_shared_from_this<tcp_connection>
+{
+public:
+ typedef std::shared_ptr<tcp_connection> pointer;
+
+ static pointer create(asio::io_context& io_context)
+ {
+ return pointer(new tcp_connection(io_context));
+ }
+
+ tcp::socket& socket()
+ {
+ return socket_;
+ }
+
+ void start()
+ {
+ message_ = make_daytime_string();
+
+ asio::async_write(socket_, asio::buffer(message_),
+ std::bind(&tcp_connection::handle_write, shared_from_this(),
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred));
+ }
+
+private:
+ tcp_connection(asio::io_context& io_context)
+ : socket_(io_context)
+ {
+ }
+
+ void handle_write(const std::error_code& /*error*/,
+ size_t /*bytes_transferred*/)
+ {
+ }
+
+ tcp::socket socket_;
+ std::string message_;
+};
+
+class tcp_server
+{
+public:
+ tcp_server(asio::io_context& io_context)
+ : io_context_(io_context),
+ acceptor_(io_context, tcp::endpoint(tcp::v4(), 13))
+ {
+ start_accept();
+ }
+
+private:
+ void start_accept()
+ {
+ tcp_connection::pointer new_connection =
+ tcp_connection::create(io_context_);
+
+ acceptor_.async_accept(new_connection->socket(),
+ std::bind(&tcp_server::handle_accept, this, new_connection,
+ asio::placeholders::error));
+ }
+
+ void handle_accept(tcp_connection::pointer new_connection,
+ const std::error_code& error)
+ {
+ if (!error)
+ {
+ new_connection->start();
+ }
+
+ start_accept();
+ }
+
+ asio::io_context& io_context_;
+ tcp::acceptor acceptor_;
+};
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context;
+ tcp_server server(io_context);
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/tutorial/daytime4/client.cpp b/3rdparty/asio/src/examples/cpp11/tutorial/daytime4/client.cpp
new file mode 100644
index 00000000000..15f3d5d4e98
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/tutorial/daytime4/client.cpp
@@ -0,0 +1,52 @@
+//
+// client.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <array>
+#include <iostream>
+#include <asio.hpp>
+
+using asio::ip::udp;
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: client <host>" << std::endl;
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ udp::resolver resolver(io_context);
+ udp::endpoint receiver_endpoint =
+ *resolver.resolve(udp::v4(), argv[1], "daytime").begin();
+
+ udp::socket socket(io_context);
+ socket.open(udp::v4());
+
+ std::array<char, 1> send_buf = {{ 0 }};
+ socket.send_to(asio::buffer(send_buf), receiver_endpoint);
+
+ std::array<char, 128> recv_buf;
+ udp::endpoint sender_endpoint;
+ size_t len = socket.receive_from(
+ asio::buffer(recv_buf), sender_endpoint);
+
+ std::cout.write(recv_buf.data(), len);
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/tutorial/daytime5/server.cpp b/3rdparty/asio/src/examples/cpp11/tutorial/daytime5/server.cpp
new file mode 100644
index 00000000000..f47c9fa713b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/tutorial/daytime5/server.cpp
@@ -0,0 +1,53 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <array>
+#include <ctime>
+#include <iostream>
+#include <string>
+#include <asio.hpp>
+
+using asio::ip::udp;
+
+std::string make_daytime_string()
+{
+ using namespace std; // For time_t, time and ctime;
+ time_t now = time(0);
+ return ctime(&now);
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context;
+
+ udp::socket socket(io_context, udp::endpoint(udp::v4(), 13));
+
+ for (;;)
+ {
+ std::array<char, 1> recv_buf;
+ udp::endpoint remote_endpoint;
+ socket.receive_from(asio::buffer(recv_buf), remote_endpoint);
+
+ std::string message = make_daytime_string();
+
+ std::error_code ignored_error;
+ socket.send_to(asio::buffer(message),
+ remote_endpoint, 0, ignored_error);
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/tutorial/daytime6/server.cpp b/3rdparty/asio/src/examples/cpp11/tutorial/daytime6/server.cpp
new file mode 100644
index 00000000000..42c80795a9e
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/tutorial/daytime6/server.cpp
@@ -0,0 +1,89 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <array>
+#include <ctime>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <asio.hpp>
+
+using asio::ip::udp;
+
+std::string make_daytime_string()
+{
+ using namespace std; // For time_t, time and ctime;
+ time_t now = time(0);
+ return ctime(&now);
+}
+
+class udp_server
+{
+public:
+ udp_server(asio::io_context& io_context)
+ : socket_(io_context, udp::endpoint(udp::v4(), 13))
+ {
+ start_receive();
+ }
+
+private:
+ void start_receive()
+ {
+ socket_.async_receive_from(
+ asio::buffer(recv_buffer_), remote_endpoint_,
+ std::bind(&udp_server::handle_receive, this,
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred));
+ }
+
+ void handle_receive(const std::error_code& error,
+ std::size_t /*bytes_transferred*/)
+ {
+ if (!error)
+ {
+ std::shared_ptr<std::string> message(
+ new std::string(make_daytime_string()));
+
+ socket_.async_send_to(asio::buffer(*message), remote_endpoint_,
+ std::bind(&udp_server::handle_send, this, message,
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred));
+
+ start_receive();
+ }
+ }
+
+ void handle_send(std::shared_ptr<std::string> /*message*/,
+ const std::error_code& /*error*/,
+ std::size_t /*bytes_transferred*/)
+ {
+ }
+
+ udp::socket socket_;
+ udp::endpoint remote_endpoint_;
+ std::array<char, 1> recv_buffer_;
+};
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context;
+ udp_server server(io_context);
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/tutorial/daytime7/server.cpp b/3rdparty/asio/src/examples/cpp11/tutorial/daytime7/server.cpp
new file mode 100644
index 00000000000..9c9c22edeb2
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/tutorial/daytime7/server.cpp
@@ -0,0 +1,159 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <array>
+#include <ctime>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <asio.hpp>
+
+using asio::ip::tcp;
+using asio::ip::udp;
+
+std::string make_daytime_string()
+{
+ using namespace std; // For time_t, time and ctime;
+ time_t now = time(0);
+ return ctime(&now);
+}
+
+class tcp_connection
+ : public std::enable_shared_from_this<tcp_connection>
+{
+public:
+ typedef std::shared_ptr<tcp_connection> pointer;
+
+ static pointer create(asio::io_context& io_context)
+ {
+ return pointer(new tcp_connection(io_context));
+ }
+
+ tcp::socket& socket()
+ {
+ return socket_;
+ }
+
+ void start()
+ {
+ message_ = make_daytime_string();
+
+ asio::async_write(socket_, asio::buffer(message_),
+ std::bind(&tcp_connection::handle_write, shared_from_this()));
+ }
+
+private:
+ tcp_connection(asio::io_context& io_context)
+ : socket_(io_context)
+ {
+ }
+
+ void handle_write()
+ {
+ }
+
+ tcp::socket socket_;
+ std::string message_;
+};
+
+class tcp_server
+{
+public:
+ tcp_server(asio::io_context& io_context)
+ : io_context_(io_context),
+ acceptor_(io_context, tcp::endpoint(tcp::v4(), 13))
+ {
+ start_accept();
+ }
+
+private:
+ void start_accept()
+ {
+ tcp_connection::pointer new_connection =
+ tcp_connection::create(io_context_);
+
+ acceptor_.async_accept(new_connection->socket(),
+ std::bind(&tcp_server::handle_accept, this, new_connection,
+ asio::placeholders::error));
+ }
+
+ void handle_accept(tcp_connection::pointer new_connection,
+ const std::error_code& error)
+ {
+ if (!error)
+ {
+ new_connection->start();
+ }
+
+ start_accept();
+ }
+
+ asio::io_context& io_context_;
+ tcp::acceptor acceptor_;
+};
+
+class udp_server
+{
+public:
+ udp_server(asio::io_context& io_context)
+ : socket_(io_context, udp::endpoint(udp::v4(), 13))
+ {
+ start_receive();
+ }
+
+private:
+ void start_receive()
+ {
+ socket_.async_receive_from(
+ asio::buffer(recv_buffer_), remote_endpoint_,
+ std::bind(&udp_server::handle_receive, this,
+ asio::placeholders::error));
+ }
+
+ void handle_receive(const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::shared_ptr<std::string> message(
+ new std::string(make_daytime_string()));
+
+ socket_.async_send_to(asio::buffer(*message), remote_endpoint_,
+ std::bind(&udp_server::handle_send, this, message));
+
+ start_receive();
+ }
+ }
+
+ void handle_send(std::shared_ptr<std::string> /*message*/)
+ {
+ }
+
+ udp::socket socket_;
+ udp::endpoint remote_endpoint_;
+ std::array<char, 1> recv_buffer_;
+};
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context;
+ tcp_server server1(io_context);
+ udp_server server2(io_context);
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/tutorial/timer1/timer.cpp b/3rdparty/asio/src/examples/cpp11/tutorial/timer1/timer.cpp
new file mode 100644
index 00000000000..37577dcb65f
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/tutorial/timer1/timer.cpp
@@ -0,0 +1,24 @@
+//
+// timer.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include <asio.hpp>
+
+int main()
+{
+ asio::io_context io;
+
+ asio::steady_timer t(io, asio::chrono::seconds(5));
+ t.wait();
+
+ std::cout << "Hello, world!" << std::endl;
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/tutorial/timer2/timer.cpp b/3rdparty/asio/src/examples/cpp11/tutorial/timer2/timer.cpp
new file mode 100644
index 00000000000..c1620d78fa5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/tutorial/timer2/timer.cpp
@@ -0,0 +1,29 @@
+//
+// timer.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include <asio.hpp>
+
+void print(const std::error_code& /*e*/)
+{
+ std::cout << "Hello, world!" << std::endl;
+}
+
+int main()
+{
+ asio::io_context io;
+
+ asio::steady_timer t(io, asio::chrono::seconds(5));
+ t.async_wait(&print);
+
+ io.run();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/tutorial/timer3/timer.cpp b/3rdparty/asio/src/examples/cpp11/tutorial/timer3/timer.cpp
new file mode 100644
index 00000000000..990ea069739
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/tutorial/timer3/timer.cpp
@@ -0,0 +1,43 @@
+//
+// timer.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <functional>
+#include <iostream>
+#include <asio.hpp>
+
+void print(const std::error_code& /*e*/,
+ asio::steady_timer* t, int* count)
+{
+ if (*count < 5)
+ {
+ std::cout << *count << std::endl;
+ ++(*count);
+
+ t->expires_at(t->expiry() + asio::chrono::seconds(1));
+ t->async_wait(std::bind(print,
+ asio::placeholders::error, t, count));
+ }
+}
+
+int main()
+{
+ asio::io_context io;
+
+ int count = 0;
+ asio::steady_timer t(io, asio::chrono::seconds(1));
+ t.async_wait(std::bind(print,
+ asio::placeholders::error, &t, &count));
+
+ io.run();
+
+ std::cout << "Final count is " << count << std::endl;
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/tutorial/timer4/timer.cpp b/3rdparty/asio/src/examples/cpp11/tutorial/timer4/timer.cpp
new file mode 100644
index 00000000000..7bfdd3e43a8
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/tutorial/timer4/timer.cpp
@@ -0,0 +1,54 @@
+//
+// timer.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <functional>
+#include <iostream>
+#include <asio.hpp>
+
+class printer
+{
+public:
+ printer(asio::io_context& io)
+ : timer_(io, asio::chrono::seconds(1)),
+ count_(0)
+ {
+ timer_.async_wait(std::bind(&printer::print, this));
+ }
+
+ ~printer()
+ {
+ std::cout << "Final count is " << count_ << std::endl;
+ }
+
+ void print()
+ {
+ if (count_ < 5)
+ {
+ std::cout << count_ << std::endl;
+ ++count_;
+
+ timer_.expires_at(timer_.expiry() + asio::chrono::seconds(1));
+ timer_.async_wait(std::bind(&printer::print, this));
+ }
+ }
+
+private:
+ asio::steady_timer timer_;
+ int count_;
+};
+
+int main()
+{
+ asio::io_context io;
+ printer p(io);
+ io.run();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/tutorial/timer5/timer.cpp b/3rdparty/asio/src/examples/cpp11/tutorial/timer5/timer.cpp
new file mode 100644
index 00000000000..61830691e7a
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/tutorial/timer5/timer.cpp
@@ -0,0 +1,81 @@
+//
+// timer.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <functional>
+#include <iostream>
+#include <thread>
+#include <asio.hpp>
+
+class printer
+{
+public:
+ printer(asio::io_context& io)
+ : strand_(asio::make_strand(io)),
+ timer1_(io, asio::chrono::seconds(1)),
+ timer2_(io, asio::chrono::seconds(1)),
+ count_(0)
+ {
+ timer1_.async_wait(asio::bind_executor(strand_,
+ std::bind(&printer::print1, this)));
+
+ timer2_.async_wait(asio::bind_executor(strand_,
+ std::bind(&printer::print2, this)));
+ }
+
+ ~printer()
+ {
+ std::cout << "Final count is " << count_ << std::endl;
+ }
+
+ void print1()
+ {
+ if (count_ < 10)
+ {
+ std::cout << "Timer 1: " << count_ << std::endl;
+ ++count_;
+
+ timer1_.expires_at(timer1_.expiry() + asio::chrono::seconds(1));
+
+ timer1_.async_wait(asio::bind_executor(strand_,
+ std::bind(&printer::print1, this)));
+ }
+ }
+
+ void print2()
+ {
+ if (count_ < 10)
+ {
+ std::cout << "Timer 2: " << count_ << std::endl;
+ ++count_;
+
+ timer2_.expires_at(timer2_.expiry() + asio::chrono::seconds(1));
+
+ timer2_.async_wait(asio::bind_executor(strand_,
+ std::bind(&printer::print2, this)));
+ }
+ }
+
+private:
+ asio::strand<asio::io_context::executor_type> strand_;
+ asio::steady_timer timer1_;
+ asio::steady_timer timer2_;
+ int count_;
+};
+
+int main()
+{
+ asio::io_context io;
+ printer p(io);
+ std::thread t([&]{ io.run(); });
+ io.run();
+ t.join();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp11/type_erasure/line_reader.hpp b/3rdparty/asio/src/examples/cpp11/type_erasure/line_reader.hpp
new file mode 100644
index 00000000000..87f05486b79
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/type_erasure/line_reader.hpp
@@ -0,0 +1,48 @@
+//
+// line_reader.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef LINE_READER_HPP
+#define LINE_READER_HPP
+
+#include <asio/any_completion_handler.hpp>
+#include <asio/async_result.hpp>
+#include <asio/error.hpp>
+#include <string>
+
+class line_reader
+{
+private:
+ virtual void async_read_line_impl(std::string prompt,
+ asio::any_completion_handler<void(std::error_code, std::string)> handler) = 0;
+
+ struct initiate_read_line
+ {
+ template <typename Handler>
+ void operator()(Handler handler, line_reader* self, std::string prompt)
+ {
+ self->async_read_line_impl(std::move(prompt), std::move(handler));
+ }
+ };
+
+public:
+ virtual ~line_reader() {}
+
+ template <typename CompletionToken>
+ auto async_read_line(std::string prompt, CompletionToken&& token)
+ -> decltype(
+ asio::async_initiate<CompletionToken, void(std::error_code, std::string)>(
+ initiate_read_line(), token, this, prompt))
+ {
+ return asio::async_initiate<CompletionToken, void(std::error_code, std::string)>(
+ initiate_read_line(), token, this, prompt);
+ }
+};
+
+#endif // LINE_READER_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/type_erasure/main.cpp b/3rdparty/asio/src/examples/cpp11/type_erasure/main.cpp
new file mode 100644
index 00000000000..2111de6853b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/type_erasure/main.cpp
@@ -0,0 +1,60 @@
+//
+// main.cpp
+// ~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "line_reader.hpp"
+#include "sleep.hpp"
+#include "stdin_line_reader.hpp"
+#include <asio/coroutine.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/use_awaitable.hpp>
+#include <iostream>
+
+#include <asio/yield.hpp>
+
+class read_loop : asio::coroutine
+{
+public:
+ read_loop(asio::any_io_executor e, line_reader& r)
+ : executor(std::move(e)),
+ reader(r)
+ {
+ }
+
+ void operator()(std::error_code ec = {}, std::string line = {})
+ {
+ reenter (this)
+ {
+ for (i = 0; i < 10; ++i)
+ {
+ yield reader.async_read_line("Enter something: ", *this);
+ if (ec) break;
+ std::cout << line;
+ yield async_sleep(executor, std::chrono::seconds(1), *this);
+ if (ec) break;
+ }
+ }
+ }
+
+private:
+ asio::any_io_executor executor;
+ line_reader& reader;
+ int i;
+};
+
+#include <asio/unyield.hpp>
+
+int main()
+{
+ asio::io_context ctx{1};
+ stdin_line_reader reader{ctx.get_executor()};
+ read_loop(ctx.get_executor(), reader)();
+ ctx.run();
+}
diff --git a/3rdparty/asio/src/examples/cpp11/type_erasure/sleep.cpp b/3rdparty/asio/src/examples/cpp11/type_erasure/sleep.cpp
new file mode 100644
index 00000000000..b605866ebd7
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/type_erasure/sleep.cpp
@@ -0,0 +1,22 @@
+//
+// sleep.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "sleep.hpp"
+#include <asio/consign.hpp>
+#include <asio/steady_timer.hpp>
+#include <memory>
+
+void async_sleep_impl(
+ asio::any_completion_handler<void(std::error_code)> handler,
+ asio::any_io_executor ex, std::chrono::nanoseconds duration)
+{
+ auto timer = std::make_shared<asio::steady_timer>(ex, duration);
+ timer->async_wait(asio::consign(std::move(handler), timer));
+}
diff --git a/3rdparty/asio/src/examples/cpp11/type_erasure/sleep.hpp b/3rdparty/asio/src/examples/cpp11/type_erasure/sleep.hpp
new file mode 100644
index 00000000000..299397a833c
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/type_erasure/sleep.hpp
@@ -0,0 +1,35 @@
+//
+// sleep.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef SLEEP_HPP
+#define SLEEP_HPP
+
+#include <asio/any_completion_handler.hpp>
+#include <asio/any_io_executor.hpp>
+#include <asio/async_result.hpp>
+#include <asio/error.hpp>
+#include <chrono>
+
+void async_sleep_impl(
+ asio::any_completion_handler<void(std::error_code)> handler,
+ asio::any_io_executor ex, std::chrono::nanoseconds duration);
+
+template <typename CompletionToken>
+inline auto async_sleep(asio::any_io_executor ex,
+ std::chrono::nanoseconds duration, CompletionToken&& token)
+ -> decltype(
+ asio::async_initiate<CompletionToken, void(std::error_code)>(
+ async_sleep_impl, token, std::move(ex), duration))
+{
+ return asio::async_initiate<CompletionToken, void(std::error_code)>(
+ async_sleep_impl, token, std::move(ex), duration);
+}
+
+#endif // SLEEP_HPP
diff --git a/3rdparty/asio/src/examples/cpp11/type_erasure/stdin_line_reader.cpp b/3rdparty/asio/src/examples/cpp11/type_erasure/stdin_line_reader.cpp
new file mode 100644
index 00000000000..d2e25e437a6
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/type_erasure/stdin_line_reader.cpp
@@ -0,0 +1,44 @@
+//
+// stdin_line_reader.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "stdin_line_reader.hpp"
+#include <asio/deferred.hpp>
+#include <asio/read_until.hpp>
+#include <iostream>
+
+stdin_line_reader::stdin_line_reader(asio::any_io_executor ex)
+ : stdin_(ex, ::dup(STDIN_FILENO))
+{
+}
+
+void stdin_line_reader::async_read_line_impl(std::string prompt,
+ asio::any_completion_handler<void(std::error_code, std::string)> handler)
+{
+ std::cout << prompt;
+ std::cout.flush();
+
+ asio::async_read_until(stdin_, asio::dynamic_buffer(buffer_), '\n',
+ asio::deferred(
+ [this](std::error_code ec, std::size_t n)
+ {
+ if (!ec)
+ {
+ std::string result = buffer_.substr(0, n);
+ buffer_.erase(0, n);
+ return asio::deferred.values(ec, std::move(result));
+ }
+ else
+ {
+ return asio::deferred.values(ec, std::string{});
+ }
+ }
+ )
+ )(std::move(handler));
+}
diff --git a/3rdparty/asio/src/examples/cpp11/type_erasure/stdin_line_reader.hpp b/3rdparty/asio/src/examples/cpp11/type_erasure/stdin_line_reader.hpp
new file mode 100644
index 00000000000..43e67424367
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/type_erasure/stdin_line_reader.hpp
@@ -0,0 +1,30 @@
+//
+// stdin_line_reader.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef STDIN_LINE_READER_HPP
+#define STDIN_LINE_READER_HPP
+
+#include "line_reader.hpp"
+#include <asio/posix/stream_descriptor.hpp>
+
+class stdin_line_reader : public line_reader
+{
+public:
+ explicit stdin_line_reader(asio::any_io_executor ex);
+
+private:
+ void async_read_line_impl(std::string prompt,
+ asio::any_completion_handler<void(std::error_code, std::string)> handler) override;
+
+ asio::posix::stream_descriptor stdin_;
+ std::string buffer_;
+};
+
+#endif
diff --git a/3rdparty/asio/src/examples/cpp11/windows/transmit_file.cpp b/3rdparty/asio/src/examples/cpp11/windows/transmit_file.cpp
new file mode 100644
index 00000000000..0ffd0486c43
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp11/windows/transmit_file.cpp
@@ -0,0 +1,176 @@
+//
+// transmit_file.cpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <ctime>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include "asio.hpp"
+
+#if defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR)
+
+using asio::ip::tcp;
+using asio::windows::overlapped_ptr;
+using asio::windows::random_access_handle;
+
+typedef asio::basic_stream_socket<tcp,
+ asio::io_context::executor_type> tcp_socket;
+
+typedef asio::basic_socket_acceptor<tcp,
+ asio::io_context::executor_type> tcp_acceptor;
+
+// A wrapper for the TransmitFile overlapped I/O operation.
+template <typename Handler>
+void transmit_file(tcp_socket& socket,
+ random_access_handle& file, Handler handler)
+{
+ // Construct an OVERLAPPED-derived object to contain the handler.
+ overlapped_ptr overlapped(socket.get_executor().context(), handler);
+
+ // Initiate the TransmitFile operation.
+ BOOL ok = ::TransmitFile(socket.native_handle(),
+ file.native_handle(), 0, 0, overlapped.get(), 0, 0);
+ DWORD last_error = ::GetLastError();
+
+ // Check if the operation completed immediately.
+ if (!ok && last_error != ERROR_IO_PENDING)
+ {
+ // The operation completed immediately, so a completion notification needs
+ // to be posted. When complete() is called, ownership of the OVERLAPPED-
+ // derived object passes to the io_context.
+ std::error_code ec(last_error,
+ asio::error::get_system_category());
+ overlapped.complete(ec, 0);
+ }
+ else
+ {
+ // The operation was successfully initiated, so ownership of the
+ // OVERLAPPED-derived object has passed to the io_context.
+ overlapped.release();
+ }
+}
+
+class connection
+ : public std::enable_shared_from_this<connection>
+{
+public:
+ typedef std::shared_ptr<connection> pointer;
+
+ static pointer create(asio::io_context& io_context,
+ const std::string& filename)
+ {
+ return pointer(new connection(io_context, filename));
+ }
+
+ tcp_socket& socket()
+ {
+ return socket_;
+ }
+
+ void start()
+ {
+ std::error_code ec;
+ file_.assign(::CreateFile(filename_.c_str(), GENERIC_READ, 0, 0,
+ OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0), ec);
+ if (file_.is_open())
+ {
+ transmit_file(socket_, file_,
+ std::bind(&connection::handle_write, shared_from_this(),
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred));
+ }
+ }
+
+private:
+ connection(asio::io_context& io_context, const std::string& filename)
+ : socket_(io_context),
+ filename_(filename),
+ file_(io_context)
+ {
+ }
+
+ void handle_write(const std::error_code& /*error*/,
+ size_t /*bytes_transferred*/)
+ {
+ std::error_code ignored_ec;
+ socket_.shutdown(tcp_socket::shutdown_both, ignored_ec);
+ }
+
+ tcp_socket socket_;
+ std::string filename_;
+ random_access_handle file_;
+};
+
+class server
+{
+public:
+ server(asio::io_context& io_context,
+ unsigned short port, const std::string& filename)
+ : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)),
+ filename_(filename)
+ {
+ start_accept();
+ }
+
+private:
+ void start_accept()
+ {
+ connection::pointer new_connection =
+ connection::create(acceptor_.get_executor().context(), filename_);
+
+ acceptor_.async_accept(new_connection->socket(),
+ std::bind(&server::handle_accept, this, new_connection,
+ asio::placeholders::error));
+ }
+
+ void handle_accept(connection::pointer new_connection,
+ const std::error_code& error)
+ {
+ if (!error)
+ {
+ new_connection->start();
+ }
+
+ start_accept();
+ }
+
+ tcp_acceptor acceptor_;
+ std::string filename_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: transmit_file <port> <filename>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ using namespace std; // For atoi.
+ server s(io_context, atoi(argv[1]), argv[2]);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << e.what() << std::endl;
+ }
+
+ return 0;
+}
+
+#else // defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR)
+# error Overlapped I/O not available on this platform
+#endif // defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR)
diff --git a/3rdparty/asio/src/examples/cpp14/Makefile.am b/3rdparty/asio/src/examples/cpp14/Makefile.am
new file mode 100644
index 00000000000..2ddf12a8a2f
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/Makefile.am
@@ -0,0 +1,95 @@
+AUTOMAKE_OPTIONS = subdir-objects
+
+if SEPARATE_COMPILATION
+noinst_LIBRARIES = libasio.a
+libasio_a_SOURCES = ../../asio.cpp
+if HAVE_OPENSSL
+libasio_a_SOURCES += ../../asio_ssl.cpp
+endif
+LDADD = libasio.a
+endif
+
+noinst_PROGRAMS = \
+ deferred/deferred_1 \
+ deferred/deferred_2 \
+ deferred/deferred_3 \
+ deferred/deferred_4 \
+ deferred/deferred_5 \
+ deferred/deferred_6 \
+ deferred/deferred_7 \
+ echo/async_tcp_echo_server \
+ echo/async_udp_echo_server \
+ echo/blocking_tcp_echo_client \
+ echo/blocking_tcp_echo_server \
+ echo/blocking_udp_echo_client \
+ echo/blocking_udp_echo_server \
+ executors/actor \
+ executors/async_1 \
+ executors/async_2 \
+ executors/bank_account_1 \
+ executors/bank_account_2 \
+ executors/fork_join \
+ executors/pipeline \
+ executors/priority_scheduler \
+ iostreams/http_client \
+ operations/c_callback_wrapper \
+ operations/callback_wrapper \
+ operations/composed_1 \
+ operations/composed_1 \
+ operations/composed_2 \
+ operations/composed_3 \
+ operations/composed_4 \
+ operations/composed_5 \
+ operations/composed_6 \
+ operations/composed_7 \
+ operations/composed_8 \
+ parallel_group/parallel_sort \
+ parallel_group/ranged_wait_for_all \
+ parallel_group/wait_for_all \
+ parallel_group/wait_for_one \
+ parallel_group/wait_for_one_error \
+ parallel_group/wait_for_one_success
+
+AM_CXXFLAGS = -I$(srcdir)/../../../include
+
+deferred_deferred_1_SOURCES = deferred/deferred_1.cpp
+deferred_deferred_2_SOURCES = deferred/deferred_2.cpp
+deferred_deferred_3_SOURCES = deferred/deferred_3.cpp
+deferred_deferred_4_SOURCES = deferred/deferred_4.cpp
+deferred_deferred_5_SOURCES = deferred/deferred_5.cpp
+deferred_deferred_6_SOURCES = deferred/deferred_6.cpp
+deferred_deferred_7_SOURCES = deferred/deferred_7.cpp
+echo_async_tcp_echo_server_SOURCES = echo/async_tcp_echo_server.cpp
+echo_async_udp_echo_server_SOURCES = echo/async_udp_echo_server.cpp
+echo_blocking_tcp_echo_client_SOURCES = echo/blocking_tcp_echo_client.cpp
+echo_blocking_tcp_echo_server_SOURCES = echo/blocking_tcp_echo_server.cpp
+echo_blocking_udp_echo_client_SOURCES = echo/blocking_udp_echo_client.cpp
+echo_blocking_udp_echo_server_SOURCES = echo/blocking_udp_echo_server.cpp
+executors_actor_SOURCES = executors/actor.cpp
+executors_async_1_SOURCES = executors/async_1.cpp
+executors_async_2_SOURCES = executors/async_2.cpp
+executors_bank_account_1_SOURCES = executors/bank_account_1.cpp
+executors_bank_account_2_SOURCES = executors/bank_account_2.cpp
+executors_fork_join_SOURCES = executors/fork_join.cpp
+executors_pipeline_SOURCES = executors/pipeline.cpp
+executors_priority_scheduler_SOURCES = executors/priority_scheduler.cpp
+iostreams_http_client_SOURCES = iostreams/http_client.cpp
+operations_c_callback_wrapper_SOURCES = operations/c_callback_wrapper.cpp
+operations_callback_wrapper_SOURCES = operations/callback_wrapper.cpp
+operations_composed_1_SOURCES = operations/composed_1.cpp
+operations_composed_2_SOURCES = operations/composed_2.cpp
+operations_composed_3_SOURCES = operations/composed_3.cpp
+operations_composed_4_SOURCES = operations/composed_4.cpp
+operations_composed_5_SOURCES = operations/composed_5.cpp
+operations_composed_6_SOURCES = operations/composed_6.cpp
+operations_composed_7_SOURCES = operations/composed_7.cpp
+operations_composed_8_SOURCES = operations/composed_8.cpp
+parallel_group_parallel_sort_SOURCES = parallel_group/parallel_sort.cpp
+parallel_group_ranged_wait_for_all_SOURCES = parallel_group/ranged_wait_for_all.cpp
+parallel_group_wait_for_all_SOURCES = parallel_group/wait_for_all.cpp
+parallel_group_wait_for_one_SOURCES = parallel_group/wait_for_one.cpp
+parallel_group_wait_for_one_error_SOURCES = parallel_group/wait_for_one_error.cpp
+parallel_group_wait_for_one_success_SOURCES = parallel_group/wait_for_one_success.cpp
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
diff --git a/3rdparty/asio/src/examples/cpp14/Makefile.in b/3rdparty/asio/src/examples/cpp14/Makefile.in
new file mode 100644
index 00000000000..23fdb3fc1e2
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/Makefile.in
@@ -0,0 +1,1378 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__append_1 = ../../asio_ssl.cpp
+noinst_PROGRAMS = deferred/deferred_1$(EXEEXT) \
+ deferred/deferred_2$(EXEEXT) deferred/deferred_3$(EXEEXT) \
+ deferred/deferred_4$(EXEEXT) deferred/deferred_5$(EXEEXT) \
+ deferred/deferred_6$(EXEEXT) deferred/deferred_7$(EXEEXT) \
+ echo/async_tcp_echo_server$(EXEEXT) \
+ echo/async_udp_echo_server$(EXEEXT) \
+ echo/blocking_tcp_echo_client$(EXEEXT) \
+ echo/blocking_tcp_echo_server$(EXEEXT) \
+ echo/blocking_udp_echo_client$(EXEEXT) \
+ echo/blocking_udp_echo_server$(EXEEXT) \
+ executors/actor$(EXEEXT) executors/async_1$(EXEEXT) \
+ executors/async_2$(EXEEXT) executors/bank_account_1$(EXEEXT) \
+ executors/bank_account_2$(EXEEXT) executors/fork_join$(EXEEXT) \
+ executors/pipeline$(EXEEXT) \
+ executors/priority_scheduler$(EXEEXT) \
+ iostreams/http_client$(EXEEXT) \
+ operations/c_callback_wrapper$(EXEEXT) \
+ operations/callback_wrapper$(EXEEXT) \
+ operations/composed_1$(EXEEXT) operations/composed_1$(EXEEXT) \
+ operations/composed_2$(EXEEXT) operations/composed_3$(EXEEXT) \
+ operations/composed_4$(EXEEXT) operations/composed_5$(EXEEXT) \
+ operations/composed_6$(EXEEXT) operations/composed_7$(EXEEXT) \
+ operations/composed_8$(EXEEXT) \
+ parallel_group/parallel_sort$(EXEEXT) \
+ parallel_group/ranged_wait_for_all$(EXEEXT) \
+ parallel_group/wait_for_all$(EXEEXT) \
+ parallel_group/wait_for_one$(EXEEXT) \
+ parallel_group/wait_for_one_error$(EXEEXT) \
+ parallel_group/wait_for_one_success$(EXEEXT)
+subdir = src/examples/cpp14
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libasio_a_AR = $(AR) $(ARFLAGS)
+libasio_a_LIBADD =
+am__libasio_a_SOURCES_DIST = ../../asio.cpp ../../asio_ssl.cpp
+am__dirstamp = $(am__leading_dot)dirstamp
+@HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__objects_1 = ../../asio_ssl.$(OBJEXT)
+@SEPARATE_COMPILATION_TRUE@am_libasio_a_OBJECTS = \
+@SEPARATE_COMPILATION_TRUE@ ../../asio.$(OBJEXT) \
+@SEPARATE_COMPILATION_TRUE@ $(am__objects_1)
+libasio_a_OBJECTS = $(am_libasio_a_OBJECTS)
+am_deferred_deferred_1_OBJECTS = deferred/deferred_1.$(OBJEXT)
+deferred_deferred_1_OBJECTS = $(am_deferred_deferred_1_OBJECTS)
+deferred_deferred_1_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@deferred_deferred_1_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_deferred_deferred_2_OBJECTS = deferred/deferred_2.$(OBJEXT)
+deferred_deferred_2_OBJECTS = $(am_deferred_deferred_2_OBJECTS)
+deferred_deferred_2_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@deferred_deferred_2_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_deferred_deferred_3_OBJECTS = deferred/deferred_3.$(OBJEXT)
+deferred_deferred_3_OBJECTS = $(am_deferred_deferred_3_OBJECTS)
+deferred_deferred_3_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@deferred_deferred_3_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_deferred_deferred_4_OBJECTS = deferred/deferred_4.$(OBJEXT)
+deferred_deferred_4_OBJECTS = $(am_deferred_deferred_4_OBJECTS)
+deferred_deferred_4_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@deferred_deferred_4_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_deferred_deferred_5_OBJECTS = deferred/deferred_5.$(OBJEXT)
+deferred_deferred_5_OBJECTS = $(am_deferred_deferred_5_OBJECTS)
+deferred_deferred_5_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@deferred_deferred_5_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_deferred_deferred_6_OBJECTS = deferred/deferred_6.$(OBJEXT)
+deferred_deferred_6_OBJECTS = $(am_deferred_deferred_6_OBJECTS)
+deferred_deferred_6_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@deferred_deferred_6_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_deferred_deferred_7_OBJECTS = deferred/deferred_7.$(OBJEXT)
+deferred_deferred_7_OBJECTS = $(am_deferred_deferred_7_OBJECTS)
+deferred_deferred_7_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@deferred_deferred_7_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_echo_async_tcp_echo_server_OBJECTS = \
+ echo/async_tcp_echo_server.$(OBJEXT)
+echo_async_tcp_echo_server_OBJECTS = \
+ $(am_echo_async_tcp_echo_server_OBJECTS)
+echo_async_tcp_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@echo_async_tcp_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_echo_async_udp_echo_server_OBJECTS = \
+ echo/async_udp_echo_server.$(OBJEXT)
+echo_async_udp_echo_server_OBJECTS = \
+ $(am_echo_async_udp_echo_server_OBJECTS)
+echo_async_udp_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@echo_async_udp_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_echo_blocking_tcp_echo_client_OBJECTS = \
+ echo/blocking_tcp_echo_client.$(OBJEXT)
+echo_blocking_tcp_echo_client_OBJECTS = \
+ $(am_echo_blocking_tcp_echo_client_OBJECTS)
+echo_blocking_tcp_echo_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@echo_blocking_tcp_echo_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_echo_blocking_tcp_echo_server_OBJECTS = \
+ echo/blocking_tcp_echo_server.$(OBJEXT)
+echo_blocking_tcp_echo_server_OBJECTS = \
+ $(am_echo_blocking_tcp_echo_server_OBJECTS)
+echo_blocking_tcp_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@echo_blocking_tcp_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_echo_blocking_udp_echo_client_OBJECTS = \
+ echo/blocking_udp_echo_client.$(OBJEXT)
+echo_blocking_udp_echo_client_OBJECTS = \
+ $(am_echo_blocking_udp_echo_client_OBJECTS)
+echo_blocking_udp_echo_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@echo_blocking_udp_echo_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_echo_blocking_udp_echo_server_OBJECTS = \
+ echo/blocking_udp_echo_server.$(OBJEXT)
+echo_blocking_udp_echo_server_OBJECTS = \
+ $(am_echo_blocking_udp_echo_server_OBJECTS)
+echo_blocking_udp_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@echo_blocking_udp_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_executors_actor_OBJECTS = executors/actor.$(OBJEXT)
+executors_actor_OBJECTS = $(am_executors_actor_OBJECTS)
+executors_actor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_actor_DEPENDENCIES = libasio.a
+am_executors_async_1_OBJECTS = executors/async_1.$(OBJEXT)
+executors_async_1_OBJECTS = $(am_executors_async_1_OBJECTS)
+executors_async_1_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_async_1_DEPENDENCIES = libasio.a
+am_executors_async_2_OBJECTS = executors/async_2.$(OBJEXT)
+executors_async_2_OBJECTS = $(am_executors_async_2_OBJECTS)
+executors_async_2_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_async_2_DEPENDENCIES = libasio.a
+am_executors_bank_account_1_OBJECTS = \
+ executors/bank_account_1.$(OBJEXT)
+executors_bank_account_1_OBJECTS = \
+ $(am_executors_bank_account_1_OBJECTS)
+executors_bank_account_1_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_bank_account_1_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_executors_bank_account_2_OBJECTS = \
+ executors/bank_account_2.$(OBJEXT)
+executors_bank_account_2_OBJECTS = \
+ $(am_executors_bank_account_2_OBJECTS)
+executors_bank_account_2_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_bank_account_2_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_executors_fork_join_OBJECTS = executors/fork_join.$(OBJEXT)
+executors_fork_join_OBJECTS = $(am_executors_fork_join_OBJECTS)
+executors_fork_join_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_fork_join_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_executors_pipeline_OBJECTS = executors/pipeline.$(OBJEXT)
+executors_pipeline_OBJECTS = $(am_executors_pipeline_OBJECTS)
+executors_pipeline_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_pipeline_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_executors_priority_scheduler_OBJECTS = \
+ executors/priority_scheduler.$(OBJEXT)
+executors_priority_scheduler_OBJECTS = \
+ $(am_executors_priority_scheduler_OBJECTS)
+executors_priority_scheduler_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@executors_priority_scheduler_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_iostreams_http_client_OBJECTS = iostreams/http_client.$(OBJEXT)
+iostreams_http_client_OBJECTS = $(am_iostreams_http_client_OBJECTS)
+iostreams_http_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@iostreams_http_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_c_callback_wrapper_OBJECTS = \
+ operations/c_callback_wrapper.$(OBJEXT)
+operations_c_callback_wrapper_OBJECTS = \
+ $(am_operations_c_callback_wrapper_OBJECTS)
+operations_c_callback_wrapper_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_c_callback_wrapper_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_callback_wrapper_OBJECTS = \
+ operations/callback_wrapper.$(OBJEXT)
+operations_callback_wrapper_OBJECTS = \
+ $(am_operations_callback_wrapper_OBJECTS)
+operations_callback_wrapper_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_callback_wrapper_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_1_OBJECTS = operations/composed_1.$(OBJEXT)
+operations_composed_1_OBJECTS = $(am_operations_composed_1_OBJECTS)
+operations_composed_1_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_1_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_2_OBJECTS = operations/composed_2.$(OBJEXT)
+operations_composed_2_OBJECTS = $(am_operations_composed_2_OBJECTS)
+operations_composed_2_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_2_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_3_OBJECTS = operations/composed_3.$(OBJEXT)
+operations_composed_3_OBJECTS = $(am_operations_composed_3_OBJECTS)
+operations_composed_3_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_3_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_4_OBJECTS = operations/composed_4.$(OBJEXT)
+operations_composed_4_OBJECTS = $(am_operations_composed_4_OBJECTS)
+operations_composed_4_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_4_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_5_OBJECTS = operations/composed_5.$(OBJEXT)
+operations_composed_5_OBJECTS = $(am_operations_composed_5_OBJECTS)
+operations_composed_5_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_5_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_6_OBJECTS = operations/composed_6.$(OBJEXT)
+operations_composed_6_OBJECTS = $(am_operations_composed_6_OBJECTS)
+operations_composed_6_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_6_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_7_OBJECTS = operations/composed_7.$(OBJEXT)
+operations_composed_7_OBJECTS = $(am_operations_composed_7_OBJECTS)
+operations_composed_7_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_7_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_8_OBJECTS = operations/composed_8.$(OBJEXT)
+operations_composed_8_OBJECTS = $(am_operations_composed_8_OBJECTS)
+operations_composed_8_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_8_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_parallel_group_parallel_sort_OBJECTS = \
+ parallel_group/parallel_sort.$(OBJEXT)
+parallel_group_parallel_sort_OBJECTS = \
+ $(am_parallel_group_parallel_sort_OBJECTS)
+parallel_group_parallel_sort_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@parallel_group_parallel_sort_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_parallel_group_ranged_wait_for_all_OBJECTS = \
+ parallel_group/ranged_wait_for_all.$(OBJEXT)
+parallel_group_ranged_wait_for_all_OBJECTS = \
+ $(am_parallel_group_ranged_wait_for_all_OBJECTS)
+parallel_group_ranged_wait_for_all_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@parallel_group_ranged_wait_for_all_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_parallel_group_wait_for_all_OBJECTS = \
+ parallel_group/wait_for_all.$(OBJEXT)
+parallel_group_wait_for_all_OBJECTS = \
+ $(am_parallel_group_wait_for_all_OBJECTS)
+parallel_group_wait_for_all_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@parallel_group_wait_for_all_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_parallel_group_wait_for_one_OBJECTS = \
+ parallel_group/wait_for_one.$(OBJEXT)
+parallel_group_wait_for_one_OBJECTS = \
+ $(am_parallel_group_wait_for_one_OBJECTS)
+parallel_group_wait_for_one_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@parallel_group_wait_for_one_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_parallel_group_wait_for_one_error_OBJECTS = \
+ parallel_group/wait_for_one_error.$(OBJEXT)
+parallel_group_wait_for_one_error_OBJECTS = \
+ $(am_parallel_group_wait_for_one_error_OBJECTS)
+parallel_group_wait_for_one_error_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@parallel_group_wait_for_one_error_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_parallel_group_wait_for_one_success_OBJECTS = \
+ parallel_group/wait_for_one_success.$(OBJEXT)
+parallel_group_wait_for_one_success_OBJECTS = \
+ $(am_parallel_group_wait_for_one_success_OBJECTS)
+parallel_group_wait_for_one_success_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@parallel_group_wait_for_one_success_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ../../$(DEPDIR)/asio.Po \
+ ../../$(DEPDIR)/asio_ssl.Po deferred/$(DEPDIR)/deferred_1.Po \
+ deferred/$(DEPDIR)/deferred_2.Po \
+ deferred/$(DEPDIR)/deferred_3.Po \
+ deferred/$(DEPDIR)/deferred_4.Po \
+ deferred/$(DEPDIR)/deferred_5.Po \
+ deferred/$(DEPDIR)/deferred_6.Po \
+ deferred/$(DEPDIR)/deferred_7.Po \
+ echo/$(DEPDIR)/async_tcp_echo_server.Po \
+ echo/$(DEPDIR)/async_udp_echo_server.Po \
+ echo/$(DEPDIR)/blocking_tcp_echo_client.Po \
+ echo/$(DEPDIR)/blocking_tcp_echo_server.Po \
+ echo/$(DEPDIR)/blocking_udp_echo_client.Po \
+ echo/$(DEPDIR)/blocking_udp_echo_server.Po \
+ executors/$(DEPDIR)/actor.Po executors/$(DEPDIR)/async_1.Po \
+ executors/$(DEPDIR)/async_2.Po \
+ executors/$(DEPDIR)/bank_account_1.Po \
+ executors/$(DEPDIR)/bank_account_2.Po \
+ executors/$(DEPDIR)/fork_join.Po \
+ executors/$(DEPDIR)/pipeline.Po \
+ executors/$(DEPDIR)/priority_scheduler.Po \
+ iostreams/$(DEPDIR)/http_client.Po \
+ operations/$(DEPDIR)/c_callback_wrapper.Po \
+ operations/$(DEPDIR)/callback_wrapper.Po \
+ operations/$(DEPDIR)/composed_1.Po \
+ operations/$(DEPDIR)/composed_2.Po \
+ operations/$(DEPDIR)/composed_3.Po \
+ operations/$(DEPDIR)/composed_4.Po \
+ operations/$(DEPDIR)/composed_5.Po \
+ operations/$(DEPDIR)/composed_6.Po \
+ operations/$(DEPDIR)/composed_7.Po \
+ operations/$(DEPDIR)/composed_8.Po \
+ parallel_group/$(DEPDIR)/parallel_sort.Po \
+ parallel_group/$(DEPDIR)/ranged_wait_for_all.Po \
+ parallel_group/$(DEPDIR)/wait_for_all.Po \
+ parallel_group/$(DEPDIR)/wait_for_one.Po \
+ parallel_group/$(DEPDIR)/wait_for_one_error.Po \
+ parallel_group/$(DEPDIR)/wait_for_one_success.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(libasio_a_SOURCES) $(deferred_deferred_1_SOURCES) \
+ $(deferred_deferred_2_SOURCES) $(deferred_deferred_3_SOURCES) \
+ $(deferred_deferred_4_SOURCES) $(deferred_deferred_5_SOURCES) \
+ $(deferred_deferred_6_SOURCES) $(deferred_deferred_7_SOURCES) \
+ $(echo_async_tcp_echo_server_SOURCES) \
+ $(echo_async_udp_echo_server_SOURCES) \
+ $(echo_blocking_tcp_echo_client_SOURCES) \
+ $(echo_blocking_tcp_echo_server_SOURCES) \
+ $(echo_blocking_udp_echo_client_SOURCES) \
+ $(echo_blocking_udp_echo_server_SOURCES) \
+ $(executors_actor_SOURCES) $(executors_async_1_SOURCES) \
+ $(executors_async_2_SOURCES) \
+ $(executors_bank_account_1_SOURCES) \
+ $(executors_bank_account_2_SOURCES) \
+ $(executors_fork_join_SOURCES) $(executors_pipeline_SOURCES) \
+ $(executors_priority_scheduler_SOURCES) \
+ $(iostreams_http_client_SOURCES) \
+ $(operations_c_callback_wrapper_SOURCES) \
+ $(operations_callback_wrapper_SOURCES) \
+ $(operations_composed_1_SOURCES) \
+ $(operations_composed_2_SOURCES) \
+ $(operations_composed_3_SOURCES) \
+ $(operations_composed_4_SOURCES) \
+ $(operations_composed_5_SOURCES) \
+ $(operations_composed_6_SOURCES) \
+ $(operations_composed_7_SOURCES) \
+ $(operations_composed_8_SOURCES) \
+ $(parallel_group_parallel_sort_SOURCES) \
+ $(parallel_group_ranged_wait_for_all_SOURCES) \
+ $(parallel_group_wait_for_all_SOURCES) \
+ $(parallel_group_wait_for_one_SOURCES) \
+ $(parallel_group_wait_for_one_error_SOURCES) \
+ $(parallel_group_wait_for_one_success_SOURCES)
+DIST_SOURCES = $(am__libasio_a_SOURCES_DIST) \
+ $(deferred_deferred_1_SOURCES) $(deferred_deferred_2_SOURCES) \
+ $(deferred_deferred_3_SOURCES) $(deferred_deferred_4_SOURCES) \
+ $(deferred_deferred_5_SOURCES) $(deferred_deferred_6_SOURCES) \
+ $(deferred_deferred_7_SOURCES) \
+ $(echo_async_tcp_echo_server_SOURCES) \
+ $(echo_async_udp_echo_server_SOURCES) \
+ $(echo_blocking_tcp_echo_client_SOURCES) \
+ $(echo_blocking_tcp_echo_server_SOURCES) \
+ $(echo_blocking_udp_echo_client_SOURCES) \
+ $(echo_blocking_udp_echo_server_SOURCES) \
+ $(executors_actor_SOURCES) $(executors_async_1_SOURCES) \
+ $(executors_async_2_SOURCES) \
+ $(executors_bank_account_1_SOURCES) \
+ $(executors_bank_account_2_SOURCES) \
+ $(executors_fork_join_SOURCES) $(executors_pipeline_SOURCES) \
+ $(executors_priority_scheduler_SOURCES) \
+ $(iostreams_http_client_SOURCES) \
+ $(operations_c_callback_wrapper_SOURCES) \
+ $(operations_callback_wrapper_SOURCES) \
+ $(operations_composed_1_SOURCES) \
+ $(operations_composed_2_SOURCES) \
+ $(operations_composed_3_SOURCES) \
+ $(operations_composed_4_SOURCES) \
+ $(operations_composed_5_SOURCES) \
+ $(operations_composed_6_SOURCES) \
+ $(operations_composed_7_SOURCES) \
+ $(operations_composed_8_SOURCES) \
+ $(parallel_group_parallel_sort_SOURCES) \
+ $(parallel_group_ranged_wait_for_all_SOURCES) \
+ $(parallel_group_wait_for_all_SOURCES) \
+ $(parallel_group_wait_for_one_SOURCES) \
+ $(parallel_group_wait_for_one_error_SOURCES) \
+ $(parallel_group_wait_for_one_success_SOURCES)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = subdir-objects
+@SEPARATE_COMPILATION_TRUE@noinst_LIBRARIES = libasio.a
+@SEPARATE_COMPILATION_TRUE@libasio_a_SOURCES = ../../asio.cpp \
+@SEPARATE_COMPILATION_TRUE@ $(am__append_1)
+@SEPARATE_COMPILATION_TRUE@LDADD = libasio.a
+AM_CXXFLAGS = -I$(srcdir)/../../../include
+deferred_deferred_1_SOURCES = deferred/deferred_1.cpp
+deferred_deferred_2_SOURCES = deferred/deferred_2.cpp
+deferred_deferred_3_SOURCES = deferred/deferred_3.cpp
+deferred_deferred_4_SOURCES = deferred/deferred_4.cpp
+deferred_deferred_5_SOURCES = deferred/deferred_5.cpp
+deferred_deferred_6_SOURCES = deferred/deferred_6.cpp
+deferred_deferred_7_SOURCES = deferred/deferred_7.cpp
+echo_async_tcp_echo_server_SOURCES = echo/async_tcp_echo_server.cpp
+echo_async_udp_echo_server_SOURCES = echo/async_udp_echo_server.cpp
+echo_blocking_tcp_echo_client_SOURCES = echo/blocking_tcp_echo_client.cpp
+echo_blocking_tcp_echo_server_SOURCES = echo/blocking_tcp_echo_server.cpp
+echo_blocking_udp_echo_client_SOURCES = echo/blocking_udp_echo_client.cpp
+echo_blocking_udp_echo_server_SOURCES = echo/blocking_udp_echo_server.cpp
+executors_actor_SOURCES = executors/actor.cpp
+executors_async_1_SOURCES = executors/async_1.cpp
+executors_async_2_SOURCES = executors/async_2.cpp
+executors_bank_account_1_SOURCES = executors/bank_account_1.cpp
+executors_bank_account_2_SOURCES = executors/bank_account_2.cpp
+executors_fork_join_SOURCES = executors/fork_join.cpp
+executors_pipeline_SOURCES = executors/pipeline.cpp
+executors_priority_scheduler_SOURCES = executors/priority_scheduler.cpp
+iostreams_http_client_SOURCES = iostreams/http_client.cpp
+operations_c_callback_wrapper_SOURCES = operations/c_callback_wrapper.cpp
+operations_callback_wrapper_SOURCES = operations/callback_wrapper.cpp
+operations_composed_1_SOURCES = operations/composed_1.cpp
+operations_composed_2_SOURCES = operations/composed_2.cpp
+operations_composed_3_SOURCES = operations/composed_3.cpp
+operations_composed_4_SOURCES = operations/composed_4.cpp
+operations_composed_5_SOURCES = operations/composed_5.cpp
+operations_composed_6_SOURCES = operations/composed_6.cpp
+operations_composed_7_SOURCES = operations/composed_7.cpp
+operations_composed_8_SOURCES = operations/composed_8.cpp
+parallel_group_parallel_sort_SOURCES = parallel_group/parallel_sort.cpp
+parallel_group_ranged_wait_for_all_SOURCES = parallel_group/ranged_wait_for_all.cpp
+parallel_group_wait_for_all_SOURCES = parallel_group/wait_for_all.cpp
+parallel_group_wait_for_one_SOURCES = parallel_group/wait_for_one.cpp
+parallel_group_wait_for_one_error_SOURCES = parallel_group/wait_for_one_error.cpp
+parallel_group_wait_for_one_success_SOURCES = parallel_group/wait_for_one_success.cpp
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/examples/cpp14/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/examples/cpp14/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+ -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+../../$(am__dirstamp):
+ @$(MKDIR_P) ../..
+ @: > ../../$(am__dirstamp)
+../../$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) ../../$(DEPDIR)
+ @: > ../../$(DEPDIR)/$(am__dirstamp)
+../../asio.$(OBJEXT): ../../$(am__dirstamp) \
+ ../../$(DEPDIR)/$(am__dirstamp)
+../../asio_ssl.$(OBJEXT): ../../$(am__dirstamp) \
+ ../../$(DEPDIR)/$(am__dirstamp)
+
+libasio.a: $(libasio_a_OBJECTS) $(libasio_a_DEPENDENCIES) $(EXTRA_libasio_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libasio.a
+ $(AM_V_AR)$(libasio_a_AR) libasio.a $(libasio_a_OBJECTS) $(libasio_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libasio.a
+deferred/$(am__dirstamp):
+ @$(MKDIR_P) deferred
+ @: > deferred/$(am__dirstamp)
+deferred/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) deferred/$(DEPDIR)
+ @: > deferred/$(DEPDIR)/$(am__dirstamp)
+deferred/deferred_1.$(OBJEXT): deferred/$(am__dirstamp) \
+ deferred/$(DEPDIR)/$(am__dirstamp)
+
+deferred/deferred_1$(EXEEXT): $(deferred_deferred_1_OBJECTS) $(deferred_deferred_1_DEPENDENCIES) $(EXTRA_deferred_deferred_1_DEPENDENCIES) deferred/$(am__dirstamp)
+ @rm -f deferred/deferred_1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(deferred_deferred_1_OBJECTS) $(deferred_deferred_1_LDADD) $(LIBS)
+deferred/deferred_2.$(OBJEXT): deferred/$(am__dirstamp) \
+ deferred/$(DEPDIR)/$(am__dirstamp)
+
+deferred/deferred_2$(EXEEXT): $(deferred_deferred_2_OBJECTS) $(deferred_deferred_2_DEPENDENCIES) $(EXTRA_deferred_deferred_2_DEPENDENCIES) deferred/$(am__dirstamp)
+ @rm -f deferred/deferred_2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(deferred_deferred_2_OBJECTS) $(deferred_deferred_2_LDADD) $(LIBS)
+deferred/deferred_3.$(OBJEXT): deferred/$(am__dirstamp) \
+ deferred/$(DEPDIR)/$(am__dirstamp)
+
+deferred/deferred_3$(EXEEXT): $(deferred_deferred_3_OBJECTS) $(deferred_deferred_3_DEPENDENCIES) $(EXTRA_deferred_deferred_3_DEPENDENCIES) deferred/$(am__dirstamp)
+ @rm -f deferred/deferred_3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(deferred_deferred_3_OBJECTS) $(deferred_deferred_3_LDADD) $(LIBS)
+deferred/deferred_4.$(OBJEXT): deferred/$(am__dirstamp) \
+ deferred/$(DEPDIR)/$(am__dirstamp)
+
+deferred/deferred_4$(EXEEXT): $(deferred_deferred_4_OBJECTS) $(deferred_deferred_4_DEPENDENCIES) $(EXTRA_deferred_deferred_4_DEPENDENCIES) deferred/$(am__dirstamp)
+ @rm -f deferred/deferred_4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(deferred_deferred_4_OBJECTS) $(deferred_deferred_4_LDADD) $(LIBS)
+deferred/deferred_5.$(OBJEXT): deferred/$(am__dirstamp) \
+ deferred/$(DEPDIR)/$(am__dirstamp)
+
+deferred/deferred_5$(EXEEXT): $(deferred_deferred_5_OBJECTS) $(deferred_deferred_5_DEPENDENCIES) $(EXTRA_deferred_deferred_5_DEPENDENCIES) deferred/$(am__dirstamp)
+ @rm -f deferred/deferred_5$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(deferred_deferred_5_OBJECTS) $(deferred_deferred_5_LDADD) $(LIBS)
+deferred/deferred_6.$(OBJEXT): deferred/$(am__dirstamp) \
+ deferred/$(DEPDIR)/$(am__dirstamp)
+
+deferred/deferred_6$(EXEEXT): $(deferred_deferred_6_OBJECTS) $(deferred_deferred_6_DEPENDENCIES) $(EXTRA_deferred_deferred_6_DEPENDENCIES) deferred/$(am__dirstamp)
+ @rm -f deferred/deferred_6$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(deferred_deferred_6_OBJECTS) $(deferred_deferred_6_LDADD) $(LIBS)
+deferred/deferred_7.$(OBJEXT): deferred/$(am__dirstamp) \
+ deferred/$(DEPDIR)/$(am__dirstamp)
+
+deferred/deferred_7$(EXEEXT): $(deferred_deferred_7_OBJECTS) $(deferred_deferred_7_DEPENDENCIES) $(EXTRA_deferred_deferred_7_DEPENDENCIES) deferred/$(am__dirstamp)
+ @rm -f deferred/deferred_7$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(deferred_deferred_7_OBJECTS) $(deferred_deferred_7_LDADD) $(LIBS)
+echo/$(am__dirstamp):
+ @$(MKDIR_P) echo
+ @: > echo/$(am__dirstamp)
+echo/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) echo/$(DEPDIR)
+ @: > echo/$(DEPDIR)/$(am__dirstamp)
+echo/async_tcp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \
+ echo/$(DEPDIR)/$(am__dirstamp)
+
+echo/async_tcp_echo_server$(EXEEXT): $(echo_async_tcp_echo_server_OBJECTS) $(echo_async_tcp_echo_server_DEPENDENCIES) $(EXTRA_echo_async_tcp_echo_server_DEPENDENCIES) echo/$(am__dirstamp)
+ @rm -f echo/async_tcp_echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(echo_async_tcp_echo_server_OBJECTS) $(echo_async_tcp_echo_server_LDADD) $(LIBS)
+echo/async_udp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \
+ echo/$(DEPDIR)/$(am__dirstamp)
+
+echo/async_udp_echo_server$(EXEEXT): $(echo_async_udp_echo_server_OBJECTS) $(echo_async_udp_echo_server_DEPENDENCIES) $(EXTRA_echo_async_udp_echo_server_DEPENDENCIES) echo/$(am__dirstamp)
+ @rm -f echo/async_udp_echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(echo_async_udp_echo_server_OBJECTS) $(echo_async_udp_echo_server_LDADD) $(LIBS)
+echo/blocking_tcp_echo_client.$(OBJEXT): echo/$(am__dirstamp) \
+ echo/$(DEPDIR)/$(am__dirstamp)
+
+echo/blocking_tcp_echo_client$(EXEEXT): $(echo_blocking_tcp_echo_client_OBJECTS) $(echo_blocking_tcp_echo_client_DEPENDENCIES) $(EXTRA_echo_blocking_tcp_echo_client_DEPENDENCIES) echo/$(am__dirstamp)
+ @rm -f echo/blocking_tcp_echo_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_tcp_echo_client_OBJECTS) $(echo_blocking_tcp_echo_client_LDADD) $(LIBS)
+echo/blocking_tcp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \
+ echo/$(DEPDIR)/$(am__dirstamp)
+
+echo/blocking_tcp_echo_server$(EXEEXT): $(echo_blocking_tcp_echo_server_OBJECTS) $(echo_blocking_tcp_echo_server_DEPENDENCIES) $(EXTRA_echo_blocking_tcp_echo_server_DEPENDENCIES) echo/$(am__dirstamp)
+ @rm -f echo/blocking_tcp_echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_tcp_echo_server_OBJECTS) $(echo_blocking_tcp_echo_server_LDADD) $(LIBS)
+echo/blocking_udp_echo_client.$(OBJEXT): echo/$(am__dirstamp) \
+ echo/$(DEPDIR)/$(am__dirstamp)
+
+echo/blocking_udp_echo_client$(EXEEXT): $(echo_blocking_udp_echo_client_OBJECTS) $(echo_blocking_udp_echo_client_DEPENDENCIES) $(EXTRA_echo_blocking_udp_echo_client_DEPENDENCIES) echo/$(am__dirstamp)
+ @rm -f echo/blocking_udp_echo_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_udp_echo_client_OBJECTS) $(echo_blocking_udp_echo_client_LDADD) $(LIBS)
+echo/blocking_udp_echo_server.$(OBJEXT): echo/$(am__dirstamp) \
+ echo/$(DEPDIR)/$(am__dirstamp)
+
+echo/blocking_udp_echo_server$(EXEEXT): $(echo_blocking_udp_echo_server_OBJECTS) $(echo_blocking_udp_echo_server_DEPENDENCIES) $(EXTRA_echo_blocking_udp_echo_server_DEPENDENCIES) echo/$(am__dirstamp)
+ @rm -f echo/blocking_udp_echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(echo_blocking_udp_echo_server_OBJECTS) $(echo_blocking_udp_echo_server_LDADD) $(LIBS)
+executors/$(am__dirstamp):
+ @$(MKDIR_P) executors
+ @: > executors/$(am__dirstamp)
+executors/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) executors/$(DEPDIR)
+ @: > executors/$(DEPDIR)/$(am__dirstamp)
+executors/actor.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/actor$(EXEEXT): $(executors_actor_OBJECTS) $(executors_actor_DEPENDENCIES) $(EXTRA_executors_actor_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/actor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_actor_OBJECTS) $(executors_actor_LDADD) $(LIBS)
+executors/async_1.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/async_1$(EXEEXT): $(executors_async_1_OBJECTS) $(executors_async_1_DEPENDENCIES) $(EXTRA_executors_async_1_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/async_1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_async_1_OBJECTS) $(executors_async_1_LDADD) $(LIBS)
+executors/async_2.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/async_2$(EXEEXT): $(executors_async_2_OBJECTS) $(executors_async_2_DEPENDENCIES) $(EXTRA_executors_async_2_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/async_2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_async_2_OBJECTS) $(executors_async_2_LDADD) $(LIBS)
+executors/bank_account_1.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/bank_account_1$(EXEEXT): $(executors_bank_account_1_OBJECTS) $(executors_bank_account_1_DEPENDENCIES) $(EXTRA_executors_bank_account_1_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/bank_account_1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_bank_account_1_OBJECTS) $(executors_bank_account_1_LDADD) $(LIBS)
+executors/bank_account_2.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/bank_account_2$(EXEEXT): $(executors_bank_account_2_OBJECTS) $(executors_bank_account_2_DEPENDENCIES) $(EXTRA_executors_bank_account_2_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/bank_account_2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_bank_account_2_OBJECTS) $(executors_bank_account_2_LDADD) $(LIBS)
+executors/fork_join.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/fork_join$(EXEEXT): $(executors_fork_join_OBJECTS) $(executors_fork_join_DEPENDENCIES) $(EXTRA_executors_fork_join_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/fork_join$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_fork_join_OBJECTS) $(executors_fork_join_LDADD) $(LIBS)
+executors/pipeline.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/pipeline$(EXEEXT): $(executors_pipeline_OBJECTS) $(executors_pipeline_DEPENDENCIES) $(EXTRA_executors_pipeline_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/pipeline$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_pipeline_OBJECTS) $(executors_pipeline_LDADD) $(LIBS)
+executors/priority_scheduler.$(OBJEXT): executors/$(am__dirstamp) \
+ executors/$(DEPDIR)/$(am__dirstamp)
+
+executors/priority_scheduler$(EXEEXT): $(executors_priority_scheduler_OBJECTS) $(executors_priority_scheduler_DEPENDENCIES) $(EXTRA_executors_priority_scheduler_DEPENDENCIES) executors/$(am__dirstamp)
+ @rm -f executors/priority_scheduler$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(executors_priority_scheduler_OBJECTS) $(executors_priority_scheduler_LDADD) $(LIBS)
+iostreams/$(am__dirstamp):
+ @$(MKDIR_P) iostreams
+ @: > iostreams/$(am__dirstamp)
+iostreams/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) iostreams/$(DEPDIR)
+ @: > iostreams/$(DEPDIR)/$(am__dirstamp)
+iostreams/http_client.$(OBJEXT): iostreams/$(am__dirstamp) \
+ iostreams/$(DEPDIR)/$(am__dirstamp)
+
+iostreams/http_client$(EXEEXT): $(iostreams_http_client_OBJECTS) $(iostreams_http_client_DEPENDENCIES) $(EXTRA_iostreams_http_client_DEPENDENCIES) iostreams/$(am__dirstamp)
+ @rm -f iostreams/http_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(iostreams_http_client_OBJECTS) $(iostreams_http_client_LDADD) $(LIBS)
+operations/$(am__dirstamp):
+ @$(MKDIR_P) operations
+ @: > operations/$(am__dirstamp)
+operations/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) operations/$(DEPDIR)
+ @: > operations/$(DEPDIR)/$(am__dirstamp)
+operations/c_callback_wrapper.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/c_callback_wrapper$(EXEEXT): $(operations_c_callback_wrapper_OBJECTS) $(operations_c_callback_wrapper_DEPENDENCIES) $(EXTRA_operations_c_callback_wrapper_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/c_callback_wrapper$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_c_callback_wrapper_OBJECTS) $(operations_c_callback_wrapper_LDADD) $(LIBS)
+operations/callback_wrapper.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/callback_wrapper$(EXEEXT): $(operations_callback_wrapper_OBJECTS) $(operations_callback_wrapper_DEPENDENCIES) $(EXTRA_operations_callback_wrapper_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/callback_wrapper$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_callback_wrapper_OBJECTS) $(operations_callback_wrapper_LDADD) $(LIBS)
+operations/composed_1.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_1$(EXEEXT): $(operations_composed_1_OBJECTS) $(operations_composed_1_DEPENDENCIES) $(EXTRA_operations_composed_1_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_1_OBJECTS) $(operations_composed_1_LDADD) $(LIBS)
+operations/composed_2.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_2$(EXEEXT): $(operations_composed_2_OBJECTS) $(operations_composed_2_DEPENDENCIES) $(EXTRA_operations_composed_2_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_2_OBJECTS) $(operations_composed_2_LDADD) $(LIBS)
+operations/composed_3.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_3$(EXEEXT): $(operations_composed_3_OBJECTS) $(operations_composed_3_DEPENDENCIES) $(EXTRA_operations_composed_3_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_3_OBJECTS) $(operations_composed_3_LDADD) $(LIBS)
+operations/composed_4.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_4$(EXEEXT): $(operations_composed_4_OBJECTS) $(operations_composed_4_DEPENDENCIES) $(EXTRA_operations_composed_4_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_4_OBJECTS) $(operations_composed_4_LDADD) $(LIBS)
+operations/composed_5.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_5$(EXEEXT): $(operations_composed_5_OBJECTS) $(operations_composed_5_DEPENDENCIES) $(EXTRA_operations_composed_5_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_5$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_5_OBJECTS) $(operations_composed_5_LDADD) $(LIBS)
+operations/composed_6.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_6$(EXEEXT): $(operations_composed_6_OBJECTS) $(operations_composed_6_DEPENDENCIES) $(EXTRA_operations_composed_6_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_6$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_6_OBJECTS) $(operations_composed_6_LDADD) $(LIBS)
+operations/composed_7.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_7$(EXEEXT): $(operations_composed_7_OBJECTS) $(operations_composed_7_DEPENDENCIES) $(EXTRA_operations_composed_7_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_7$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_7_OBJECTS) $(operations_composed_7_LDADD) $(LIBS)
+operations/composed_8.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_8$(EXEEXT): $(operations_composed_8_OBJECTS) $(operations_composed_8_DEPENDENCIES) $(EXTRA_operations_composed_8_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_8$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_8_OBJECTS) $(operations_composed_8_LDADD) $(LIBS)
+parallel_group/$(am__dirstamp):
+ @$(MKDIR_P) parallel_group
+ @: > parallel_group/$(am__dirstamp)
+parallel_group/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) parallel_group/$(DEPDIR)
+ @: > parallel_group/$(DEPDIR)/$(am__dirstamp)
+parallel_group/parallel_sort.$(OBJEXT): \
+ parallel_group/$(am__dirstamp) \
+ parallel_group/$(DEPDIR)/$(am__dirstamp)
+
+parallel_group/parallel_sort$(EXEEXT): $(parallel_group_parallel_sort_OBJECTS) $(parallel_group_parallel_sort_DEPENDENCIES) $(EXTRA_parallel_group_parallel_sort_DEPENDENCIES) parallel_group/$(am__dirstamp)
+ @rm -f parallel_group/parallel_sort$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parallel_group_parallel_sort_OBJECTS) $(parallel_group_parallel_sort_LDADD) $(LIBS)
+parallel_group/ranged_wait_for_all.$(OBJEXT): \
+ parallel_group/$(am__dirstamp) \
+ parallel_group/$(DEPDIR)/$(am__dirstamp)
+
+parallel_group/ranged_wait_for_all$(EXEEXT): $(parallel_group_ranged_wait_for_all_OBJECTS) $(parallel_group_ranged_wait_for_all_DEPENDENCIES) $(EXTRA_parallel_group_ranged_wait_for_all_DEPENDENCIES) parallel_group/$(am__dirstamp)
+ @rm -f parallel_group/ranged_wait_for_all$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parallel_group_ranged_wait_for_all_OBJECTS) $(parallel_group_ranged_wait_for_all_LDADD) $(LIBS)
+parallel_group/wait_for_all.$(OBJEXT): parallel_group/$(am__dirstamp) \
+ parallel_group/$(DEPDIR)/$(am__dirstamp)
+
+parallel_group/wait_for_all$(EXEEXT): $(parallel_group_wait_for_all_OBJECTS) $(parallel_group_wait_for_all_DEPENDENCIES) $(EXTRA_parallel_group_wait_for_all_DEPENDENCIES) parallel_group/$(am__dirstamp)
+ @rm -f parallel_group/wait_for_all$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parallel_group_wait_for_all_OBJECTS) $(parallel_group_wait_for_all_LDADD) $(LIBS)
+parallel_group/wait_for_one.$(OBJEXT): parallel_group/$(am__dirstamp) \
+ parallel_group/$(DEPDIR)/$(am__dirstamp)
+
+parallel_group/wait_for_one$(EXEEXT): $(parallel_group_wait_for_one_OBJECTS) $(parallel_group_wait_for_one_DEPENDENCIES) $(EXTRA_parallel_group_wait_for_one_DEPENDENCIES) parallel_group/$(am__dirstamp)
+ @rm -f parallel_group/wait_for_one$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parallel_group_wait_for_one_OBJECTS) $(parallel_group_wait_for_one_LDADD) $(LIBS)
+parallel_group/wait_for_one_error.$(OBJEXT): \
+ parallel_group/$(am__dirstamp) \
+ parallel_group/$(DEPDIR)/$(am__dirstamp)
+
+parallel_group/wait_for_one_error$(EXEEXT): $(parallel_group_wait_for_one_error_OBJECTS) $(parallel_group_wait_for_one_error_DEPENDENCIES) $(EXTRA_parallel_group_wait_for_one_error_DEPENDENCIES) parallel_group/$(am__dirstamp)
+ @rm -f parallel_group/wait_for_one_error$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parallel_group_wait_for_one_error_OBJECTS) $(parallel_group_wait_for_one_error_LDADD) $(LIBS)
+parallel_group/wait_for_one_success.$(OBJEXT): \
+ parallel_group/$(am__dirstamp) \
+ parallel_group/$(DEPDIR)/$(am__dirstamp)
+
+parallel_group/wait_for_one_success$(EXEEXT): $(parallel_group_wait_for_one_success_OBJECTS) $(parallel_group_wait_for_one_success_DEPENDENCIES) $(EXTRA_parallel_group_wait_for_one_success_DEPENDENCIES) parallel_group/$(am__dirstamp)
+ @rm -f parallel_group/wait_for_one_success$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(parallel_group_wait_for_one_success_OBJECTS) $(parallel_group_wait_for_one_success_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+ -rm -f ../../*.$(OBJEXT)
+ -rm -f deferred/*.$(OBJEXT)
+ -rm -f echo/*.$(OBJEXT)
+ -rm -f executors/*.$(OBJEXT)
+ -rm -f iostreams/*.$(OBJEXT)
+ -rm -f operations/*.$(OBJEXT)
+ -rm -f parallel_group/*.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio_ssl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@deferred/$(DEPDIR)/deferred_1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@deferred/$(DEPDIR)/deferred_2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@deferred/$(DEPDIR)/deferred_3.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@deferred/$(DEPDIR)/deferred_4.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@deferred/$(DEPDIR)/deferred_5.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@deferred/$(DEPDIR)/deferred_6.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@deferred/$(DEPDIR)/deferred_7.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/async_tcp_echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/async_udp_echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_tcp_echo_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_tcp_echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_udp_echo_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@echo/$(DEPDIR)/blocking_udp_echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/actor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/async_1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/async_2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/bank_account_1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/bank_account_2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/fork_join.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/pipeline.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@executors/$(DEPDIR)/priority_scheduler.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@iostreams/$(DEPDIR)/http_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/c_callback_wrapper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/callback_wrapper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_3.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_4.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_5.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_6.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_7.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_8.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@parallel_group/$(DEPDIR)/parallel_sort.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@parallel_group/$(DEPDIR)/ranged_wait_for_all.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@parallel_group/$(DEPDIR)/wait_for_all.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@parallel_group/$(DEPDIR)/wait_for_one.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@parallel_group/$(DEPDIR)/wait_for_one_error.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@parallel_group/$(DEPDIR)/wait_for_one_success.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -rm -f ../../$(DEPDIR)/$(am__dirstamp)
+ -rm -f ../../$(am__dirstamp)
+ -rm -f deferred/$(DEPDIR)/$(am__dirstamp)
+ -rm -f deferred/$(am__dirstamp)
+ -rm -f echo/$(DEPDIR)/$(am__dirstamp)
+ -rm -f echo/$(am__dirstamp)
+ -rm -f executors/$(DEPDIR)/$(am__dirstamp)
+ -rm -f executors/$(am__dirstamp)
+ -rm -f iostreams/$(DEPDIR)/$(am__dirstamp)
+ -rm -f iostreams/$(am__dirstamp)
+ -rm -f operations/$(DEPDIR)/$(am__dirstamp)
+ -rm -f operations/$(am__dirstamp)
+ -rm -f parallel_group/$(DEPDIR)/$(am__dirstamp)
+ -rm -f parallel_group/$(am__dirstamp)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ../../$(DEPDIR)/asio.Po
+ -rm -f ../../$(DEPDIR)/asio_ssl.Po
+ -rm -f deferred/$(DEPDIR)/deferred_1.Po
+ -rm -f deferred/$(DEPDIR)/deferred_2.Po
+ -rm -f deferred/$(DEPDIR)/deferred_3.Po
+ -rm -f deferred/$(DEPDIR)/deferred_4.Po
+ -rm -f deferred/$(DEPDIR)/deferred_5.Po
+ -rm -f deferred/$(DEPDIR)/deferred_6.Po
+ -rm -f deferred/$(DEPDIR)/deferred_7.Po
+ -rm -f echo/$(DEPDIR)/async_tcp_echo_server.Po
+ -rm -f echo/$(DEPDIR)/async_udp_echo_server.Po
+ -rm -f echo/$(DEPDIR)/blocking_tcp_echo_client.Po
+ -rm -f echo/$(DEPDIR)/blocking_tcp_echo_server.Po
+ -rm -f echo/$(DEPDIR)/blocking_udp_echo_client.Po
+ -rm -f echo/$(DEPDIR)/blocking_udp_echo_server.Po
+ -rm -f executors/$(DEPDIR)/actor.Po
+ -rm -f executors/$(DEPDIR)/async_1.Po
+ -rm -f executors/$(DEPDIR)/async_2.Po
+ -rm -f executors/$(DEPDIR)/bank_account_1.Po
+ -rm -f executors/$(DEPDIR)/bank_account_2.Po
+ -rm -f executors/$(DEPDIR)/fork_join.Po
+ -rm -f executors/$(DEPDIR)/pipeline.Po
+ -rm -f executors/$(DEPDIR)/priority_scheduler.Po
+ -rm -f iostreams/$(DEPDIR)/http_client.Po
+ -rm -f operations/$(DEPDIR)/c_callback_wrapper.Po
+ -rm -f operations/$(DEPDIR)/callback_wrapper.Po
+ -rm -f operations/$(DEPDIR)/composed_1.Po
+ -rm -f operations/$(DEPDIR)/composed_2.Po
+ -rm -f operations/$(DEPDIR)/composed_3.Po
+ -rm -f operations/$(DEPDIR)/composed_4.Po
+ -rm -f operations/$(DEPDIR)/composed_5.Po
+ -rm -f operations/$(DEPDIR)/composed_6.Po
+ -rm -f operations/$(DEPDIR)/composed_7.Po
+ -rm -f operations/$(DEPDIR)/composed_8.Po
+ -rm -f parallel_group/$(DEPDIR)/parallel_sort.Po
+ -rm -f parallel_group/$(DEPDIR)/ranged_wait_for_all.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_all.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_one.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_one_error.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_one_success.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ../../$(DEPDIR)/asio.Po
+ -rm -f ../../$(DEPDIR)/asio_ssl.Po
+ -rm -f deferred/$(DEPDIR)/deferred_1.Po
+ -rm -f deferred/$(DEPDIR)/deferred_2.Po
+ -rm -f deferred/$(DEPDIR)/deferred_3.Po
+ -rm -f deferred/$(DEPDIR)/deferred_4.Po
+ -rm -f deferred/$(DEPDIR)/deferred_5.Po
+ -rm -f deferred/$(DEPDIR)/deferred_6.Po
+ -rm -f deferred/$(DEPDIR)/deferred_7.Po
+ -rm -f echo/$(DEPDIR)/async_tcp_echo_server.Po
+ -rm -f echo/$(DEPDIR)/async_udp_echo_server.Po
+ -rm -f echo/$(DEPDIR)/blocking_tcp_echo_client.Po
+ -rm -f echo/$(DEPDIR)/blocking_tcp_echo_server.Po
+ -rm -f echo/$(DEPDIR)/blocking_udp_echo_client.Po
+ -rm -f echo/$(DEPDIR)/blocking_udp_echo_server.Po
+ -rm -f executors/$(DEPDIR)/actor.Po
+ -rm -f executors/$(DEPDIR)/async_1.Po
+ -rm -f executors/$(DEPDIR)/async_2.Po
+ -rm -f executors/$(DEPDIR)/bank_account_1.Po
+ -rm -f executors/$(DEPDIR)/bank_account_2.Po
+ -rm -f executors/$(DEPDIR)/fork_join.Po
+ -rm -f executors/$(DEPDIR)/pipeline.Po
+ -rm -f executors/$(DEPDIR)/priority_scheduler.Po
+ -rm -f iostreams/$(DEPDIR)/http_client.Po
+ -rm -f operations/$(DEPDIR)/c_callback_wrapper.Po
+ -rm -f operations/$(DEPDIR)/callback_wrapper.Po
+ -rm -f operations/$(DEPDIR)/composed_1.Po
+ -rm -f operations/$(DEPDIR)/composed_2.Po
+ -rm -f operations/$(DEPDIR)/composed_3.Po
+ -rm -f operations/$(DEPDIR)/composed_4.Po
+ -rm -f operations/$(DEPDIR)/composed_5.Po
+ -rm -f operations/$(DEPDIR)/composed_6.Po
+ -rm -f operations/$(DEPDIR)/composed_7.Po
+ -rm -f operations/$(DEPDIR)/composed_8.Po
+ -rm -f parallel_group/$(DEPDIR)/parallel_sort.Po
+ -rm -f parallel_group/$(DEPDIR)/ranged_wait_for_all.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_all.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_one.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_one_error.Po
+ -rm -f parallel_group/$(DEPDIR)/wait_for_one_success.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/3rdparty/asio/src/examples/cpp14/deferred/deferred_1.cpp b/3rdparty/asio/src/examples/cpp14/deferred/deferred_1.cpp
new file mode 100644
index 00000000000..db9213eb3be
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/deferred/deferred_1.cpp
@@ -0,0 +1,35 @@
+//
+// deferred_1.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+
+using asio::deferred;
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::steady_timer timer(ctx);
+ timer.expires_after(std::chrono::seconds(1));
+
+ auto deferred_op = timer.async_wait(deferred);
+
+ std::move(deferred_op)(
+ [](std::error_code ec)
+ {
+ std::cout << "timer wait finished: " << ec.message() << "\n";
+ }
+ );
+
+ ctx.run();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/deferred/deferred_2.cpp b/3rdparty/asio/src/examples/cpp14/deferred/deferred_2.cpp
new file mode 100644
index 00000000000..07528282de5
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/deferred/deferred_2.cpp
@@ -0,0 +1,44 @@
+//
+// deferred_2.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+
+using asio::deferred;
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::steady_timer timer(ctx);
+ timer.expires_after(std::chrono::seconds(1));
+
+ auto deferred_op = timer.async_wait(
+ deferred(
+ [&](std::error_code ec)
+ {
+ std::cout << "first timer wait finished: " << ec.message() << "\n";
+ timer.expires_after(std::chrono::seconds(1));
+ return timer.async_wait(deferred);
+ }
+ )
+ );
+
+ std::move(deferred_op)(
+ [](std::error_code ec)
+ {
+ std::cout << "second timer wait finished: " << ec.message() << "\n";
+ }
+ );
+
+ ctx.run();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/deferred/deferred_3.cpp b/3rdparty/asio/src/examples/cpp14/deferred/deferred_3.cpp
new file mode 100644
index 00000000000..396e40840a1
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/deferred/deferred_3.cpp
@@ -0,0 +1,51 @@
+//
+// deferred_3.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+
+using asio::deferred;
+
+template <typename CompletionToken>
+auto async_wait_twice(asio::steady_timer& timer, CompletionToken&& token)
+{
+ return timer.async_wait(
+ deferred(
+ [&](std::error_code ec)
+ {
+ std::cout << "first timer wait finished: " << ec.message() << "\n";
+ timer.expires_after(std::chrono::seconds(1));
+ return timer.async_wait(deferred);
+ }
+ )
+ )(
+ std::forward<CompletionToken>(token)
+ );
+}
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::steady_timer timer(ctx);
+ timer.expires_after(std::chrono::seconds(1));
+
+ async_wait_twice(
+ timer,
+ [](std::error_code ec)
+ {
+ std::cout << "second timer wait finished: " << ec.message() << "\n";
+ }
+ );
+
+ ctx.run();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/deferred/deferred_4.cpp b/3rdparty/asio/src/examples/cpp14/deferred/deferred_4.cpp
new file mode 100644
index 00000000000..a8ea73336d2
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/deferred/deferred_4.cpp
@@ -0,0 +1,59 @@
+//
+// deferred_4.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+
+using asio::deferred;
+
+template <typename CompletionToken>
+auto async_wait_twice(asio::steady_timer& timer, CompletionToken&& token)
+{
+ return timer.async_wait(
+ deferred(
+ [&](std::error_code ec)
+ {
+ std::cout << "first timer wait finished: " << ec.message() << "\n";
+ timer.expires_after(std::chrono::seconds(1));
+ return timer.async_wait(deferred);
+ }
+ )
+ )(
+ deferred(
+ [&](std::error_code ec)
+ {
+ std::cout << "second timer wait finished: " << ec.message() << "\n";
+ return deferred.values(42);
+ }
+ )
+ )(
+ std::forward<CompletionToken>(token)
+ );
+}
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::steady_timer timer(ctx);
+ timer.expires_after(std::chrono::seconds(1));
+
+ async_wait_twice(
+ timer,
+ [](int result)
+ {
+ std::cout << "result is " << result << "\n";
+ }
+ );
+
+ ctx.run();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/deferred/deferred_5.cpp b/3rdparty/asio/src/examples/cpp14/deferred/deferred_5.cpp
new file mode 100644
index 00000000000..d262b977811
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/deferred/deferred_5.cpp
@@ -0,0 +1,66 @@
+//
+// deferred_5.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+
+using asio::deferred;
+
+template <typename CompletionToken>
+auto async_wait_twice(asio::steady_timer& timer, CompletionToken&& token)
+{
+ return timer.async_wait(
+ deferred(
+ [&](std::error_code ec)
+ {
+ std::cout << "first timer wait finished: " << ec.message() << "\n";
+ timer.expires_after(std::chrono::seconds(1));
+ return deferred.when(!ec)
+ .then(timer.async_wait(deferred))
+ .otherwise(deferred.values(ec));
+ }
+ )
+ )(
+ deferred(
+ [&](std::error_code ec)
+ {
+ std::cout << "second timer wait finished: " << ec.message() << "\n";
+ return deferred.when(!ec)
+ .then(deferred.values(42))
+ .otherwise(deferred.values(0));
+ }
+ )
+ )(
+ std::forward<CompletionToken>(token)
+ );
+}
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::steady_timer timer(ctx);
+ timer.expires_after(std::chrono::seconds(1));
+
+ async_wait_twice(
+ timer,
+ [](int result)
+ {
+ std::cout << "result is " << result << "\n";
+ }
+ );
+
+ // Uncomment the following line to trigger an error in async_wait_twice.
+ //timer.cancel();
+
+ ctx.run();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/deferred/deferred_6.cpp b/3rdparty/asio/src/examples/cpp14/deferred/deferred_6.cpp
new file mode 100644
index 00000000000..7ccef58cc5c
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/deferred/deferred_6.cpp
@@ -0,0 +1,75 @@
+//
+// deferred_6.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+
+using asio::append;
+using asio::deferred;
+
+template <typename CompletionToken>
+auto async_wait_twice(asio::steady_timer& timer, CompletionToken&& token)
+{
+ return deferred.values(&timer)(
+ deferred(
+ [](asio::steady_timer* timer)
+ {
+ timer->expires_after(std::chrono::seconds(1));
+ return timer->async_wait(append(deferred, timer));
+ }
+ )
+ )(
+ deferred(
+ [](std::error_code ec, asio::steady_timer* timer)
+ {
+ std::cout << "first timer wait finished: " << ec.message() << "\n";
+ timer->expires_after(std::chrono::seconds(1));
+ return deferred.when(!ec)
+ .then(timer->async_wait(deferred))
+ .otherwise(deferred.values(ec));
+ }
+ )
+ )(
+ deferred(
+ [](std::error_code ec)
+ {
+ std::cout << "second timer wait finished: " << ec.message() << "\n";
+ return deferred.when(!ec)
+ .then(deferred.values(42))
+ .otherwise(deferred.values(0));
+ }
+ )
+ )(
+ std::forward<CompletionToken>(token)
+ );
+}
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::steady_timer timer(ctx);
+ timer.expires_after(std::chrono::seconds(1));
+
+ async_wait_twice(
+ timer,
+ [](int result)
+ {
+ std::cout << "result is " << result << "\n";
+ }
+ );
+
+ // Uncomment the following line to trigger an error in async_wait_twice.
+ //timer.cancel();
+
+ ctx.run();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/deferred/deferred_7.cpp b/3rdparty/asio/src/examples/cpp14/deferred/deferred_7.cpp
new file mode 100644
index 00000000000..b0734542c79
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/deferred/deferred_7.cpp
@@ -0,0 +1,71 @@
+//
+// deferred_7.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+
+using asio::append;
+using asio::deferred;
+
+template <typename CompletionToken>
+auto async_wait_twice(asio::steady_timer& timer, CompletionToken&& token)
+{
+ return deferred.values(&timer)
+ | deferred(
+ [](asio::steady_timer* timer)
+ {
+ timer->expires_after(std::chrono::seconds(1));
+ return timer->async_wait(append(deferred, timer));
+ }
+ )
+ | deferred(
+ [](std::error_code ec, asio::steady_timer* timer)
+ {
+ std::cout << "first timer wait finished: " << ec.message() << "\n";
+ timer->expires_after(std::chrono::seconds(1));
+ return deferred.when(!ec)
+ .then(timer->async_wait(deferred))
+ .otherwise(deferred.values(ec));
+ }
+ )
+ | deferred(
+ [](std::error_code ec)
+ {
+ std::cout << "second timer wait finished: " << ec.message() << "\n";
+ return deferred.when(!ec)
+ .then(deferred.values(42))
+ .otherwise(deferred.values(0));
+ }
+ )
+ | std::forward<CompletionToken>(token);
+}
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::steady_timer timer(ctx);
+ timer.expires_after(std::chrono::seconds(1));
+
+ async_wait_twice(
+ timer,
+ [](int result)
+ {
+ std::cout << "result is " << result << "\n";
+ }
+ );
+
+ // Uncomment the following line to trigger an error in async_wait_twice.
+ //timer.cancel();
+
+ ctx.run();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/echo/async_tcp_echo_server.cpp b/3rdparty/asio/src/examples/cpp14/echo/async_tcp_echo_server.cpp
new file mode 100644
index 00000000000..9bd1b727500
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/echo/async_tcp_echo_server.cpp
@@ -0,0 +1,117 @@
+//
+// async_tcp_echo_server.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <iostream>
+#include <memory>
+#include <utility>
+#include <asio/ts/buffer.hpp>
+#include <asio/ts/internet.hpp>
+
+using asio::ip::tcp;
+
+class session
+ : public std::enable_shared_from_this<session>
+{
+public:
+ session(tcp::socket socket)
+ : socket_(std::move(socket))
+ {
+ }
+
+ void start()
+ {
+ do_read();
+ }
+
+private:
+ void do_read()
+ {
+ auto self(shared_from_this());
+ socket_.async_read_some(asio::buffer(data_, max_length),
+ [this, self](std::error_code ec, std::size_t length)
+ {
+ if (!ec)
+ {
+ do_write(length);
+ }
+ });
+ }
+
+ void do_write(std::size_t length)
+ {
+ auto self(shared_from_this());
+ asio::async_write(socket_, asio::buffer(data_, length),
+ [this, self](std::error_code ec, std::size_t /*length*/)
+ {
+ if (!ec)
+ {
+ do_read();
+ }
+ });
+ }
+
+ tcp::socket socket_;
+ enum { max_length = 1024 };
+ char data_[max_length];
+};
+
+class server
+{
+public:
+ server(asio::io_context& io_context, short port)
+ : acceptor_(io_context, tcp::endpoint(tcp::v4(), port)),
+ socket_(io_context)
+ {
+ do_accept();
+ }
+
+private:
+ void do_accept()
+ {
+ acceptor_.async_accept(socket_,
+ [this](std::error_code ec)
+ {
+ if (!ec)
+ {
+ std::make_shared<session>(std::move(socket_))->start();
+ }
+
+ do_accept();
+ });
+ }
+
+ tcp::acceptor acceptor_;
+ tcp::socket socket_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: async_tcp_echo_server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ server s(io_context, std::atoi(argv[1]));
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/echo/async_udp_echo_server.cpp b/3rdparty/asio/src/examples/cpp14/echo/async_udp_echo_server.cpp
new file mode 100644
index 00000000000..b059af95b82
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/echo/async_udp_echo_server.cpp
@@ -0,0 +1,83 @@
+//
+// async_udp_echo_server.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <iostream>
+#include <asio/ts/buffer.hpp>
+#include <asio/ts/internet.hpp>
+
+using asio::ip::udp;
+
+class server
+{
+public:
+ server(asio::io_context& io_context, short port)
+ : socket_(io_context, udp::endpoint(udp::v4(), port))
+ {
+ do_receive();
+ }
+
+ void do_receive()
+ {
+ socket_.async_receive_from(
+ asio::buffer(data_, max_length), sender_endpoint_,
+ [this](std::error_code ec, std::size_t bytes_recvd)
+ {
+ if (!ec && bytes_recvd > 0)
+ {
+ do_send(bytes_recvd);
+ }
+ else
+ {
+ do_receive();
+ }
+ });
+ }
+
+ void do_send(std::size_t length)
+ {
+ socket_.async_send_to(
+ asio::buffer(data_, length), sender_endpoint_,
+ [this](std::error_code /*ec*/, std::size_t /*bytes_sent*/)
+ {
+ do_receive();
+ });
+ }
+
+private:
+ udp::socket socket_;
+ udp::endpoint sender_endpoint_;
+ enum { max_length = 1024 };
+ char data_[max_length];
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: async_udp_echo_server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ server s(io_context, std::atoi(argv[1]));
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/echo/blocking_tcp_echo_client.cpp b/3rdparty/asio/src/examples/cpp14/echo/blocking_tcp_echo_client.cpp
new file mode 100644
index 00000000000..8a281203f89
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/echo/blocking_tcp_echo_client.cpp
@@ -0,0 +1,55 @@
+//
+// blocking_tcp_echo_client.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <cstring>
+#include <iostream>
+#include "asio.hpp"
+
+using asio::ip::tcp;
+
+enum { max_length = 1024 };
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: blocking_tcp_echo_client <host> <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ tcp::socket s(io_context);
+ tcp::resolver resolver(io_context);
+ asio::connect(s, resolver.resolve(argv[1], argv[2]));
+
+ std::cout << "Enter message: ";
+ char request[max_length];
+ std::cin.getline(request, max_length);
+ size_t request_length = std::strlen(request);
+ asio::write(s, asio::buffer(request, request_length));
+
+ char reply[max_length];
+ size_t reply_length = asio::read(s,
+ asio::buffer(reply, request_length));
+ std::cout << "Reply is: ";
+ std::cout.write(reply, reply_length);
+ std::cout << "\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/echo/blocking_tcp_echo_server.cpp b/3rdparty/asio/src/examples/cpp14/echo/blocking_tcp_echo_server.cpp
new file mode 100644
index 00000000000..2116712616a
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/echo/blocking_tcp_echo_server.cpp
@@ -0,0 +1,77 @@
+//
+// blocking_tcp_echo_server.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <iostream>
+#include <thread>
+#include <utility>
+#include <asio/ts/buffer.hpp>
+#include <asio/ts/internet.hpp>
+
+using asio::ip::tcp;
+
+const int max_length = 1024;
+
+void session(tcp::socket sock)
+{
+ try
+ {
+ for (;;)
+ {
+ char data[max_length];
+
+ std::error_code error;
+ size_t length = sock.read_some(asio::buffer(data), error);
+ if (error == asio::stream_errc::eof)
+ break; // Connection closed cleanly by peer.
+ else if (error)
+ throw std::system_error(error); // Some other error.
+
+ asio::write(sock, asio::buffer(data, length));
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception in thread: " << e.what() << "\n";
+ }
+}
+
+void server(asio::io_context& io_context, unsigned short port)
+{
+ tcp::acceptor a(io_context, tcp::endpoint(tcp::v4(), port));
+ for (;;)
+ {
+ tcp::socket sock(io_context);
+ a.accept(sock);
+ std::thread(session, std::move(sock)).detach();
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: blocking_tcp_echo_server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ server(io_context, std::atoi(argv[1]));
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/echo/blocking_udp_echo_client.cpp b/3rdparty/asio/src/examples/cpp14/echo/blocking_udp_echo_client.cpp
new file mode 100644
index 00000000000..4c8a2849d5b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/echo/blocking_udp_echo_client.cpp
@@ -0,0 +1,59 @@
+//
+// blocking_udp_echo_client.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <cstring>
+#include <iostream>
+#include <asio/ts/buffer.hpp>
+#include <asio/ts/internet.hpp>
+
+using asio::ip::udp;
+
+enum { max_length = 1024 };
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: blocking_udp_echo_client <host> <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ udp::socket s(io_context, udp::endpoint(udp::v4(), 0));
+
+ udp::resolver resolver(io_context);
+ udp::endpoint endpoint =
+ *resolver.resolve(udp::v4(), argv[1], argv[2]).begin();
+
+ std::cout << "Enter message: ";
+ char request[max_length];
+ std::cin.getline(request, max_length);
+ size_t request_length = std::strlen(request);
+ s.send_to(asio::buffer(request, request_length), endpoint);
+
+ char reply[max_length];
+ udp::endpoint sender_endpoint;
+ size_t reply_length = s.receive_from(
+ asio::buffer(reply, max_length), sender_endpoint);
+ std::cout << "Reply is: ";
+ std::cout.write(reply, reply_length);
+ std::cout << "\n";
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/echo/blocking_udp_echo_server.cpp b/3rdparty/asio/src/examples/cpp14/echo/blocking_udp_echo_server.cpp
new file mode 100644
index 00000000000..c3098bdb8fc
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/echo/blocking_udp_echo_server.cpp
@@ -0,0 +1,53 @@
+//
+// blocking_udp_echo_server.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <iostream>
+#include <asio/ts/buffer.hpp>
+#include <asio/ts/internet.hpp>
+
+using asio::ip::udp;
+
+enum { max_length = 1024 };
+
+void server(asio::io_context& io_context, unsigned short port)
+{
+ udp::socket sock(io_context, udp::endpoint(udp::v4(), port));
+ for (;;)
+ {
+ char data[max_length];
+ udp::endpoint sender_endpoint;
+ size_t length = sock.receive_from(
+ asio::buffer(data, max_length), sender_endpoint);
+ sock.send_to(asio::buffer(data, length), sender_endpoint);
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 2)
+ {
+ std::cerr << "Usage: blocking_udp_echo_server <port>\n";
+ return 1;
+ }
+
+ asio::io_context io_context;
+
+ server(io_context, std::atoi(argv[1]));
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/executors/actor.cpp b/3rdparty/asio/src/examples/cpp14/executors/actor.cpp
new file mode 100644
index 00000000000..a46caf45a68
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/executors/actor.cpp
@@ -0,0 +1,285 @@
+#include <asio/any_io_executor.hpp>
+#include <asio/defer.hpp>
+#include <asio/post.hpp>
+#include <asio/strand.hpp>
+#include <asio/system_executor.hpp>
+#include <condition_variable>
+#include <deque>
+#include <memory>
+#include <mutex>
+#include <typeinfo>
+#include <vector>
+
+using asio::any_io_executor;
+using asio::defer;
+using asio::post;
+using asio::strand;
+using asio::system_executor;
+
+//------------------------------------------------------------------------------
+// A tiny actor framework
+// ~~~~~~~~~~~~~~~~~~~~~~
+
+class actor;
+
+// Used to identify the sender and recipient of messages.
+typedef actor* actor_address;
+
+// Base class for all registered message handlers.
+class message_handler_base
+{
+public:
+ virtual ~message_handler_base() {}
+
+ // Used to determine which message handlers receive an incoming message.
+ virtual const std::type_info& message_id() const = 0;
+};
+
+// Base class for a handler for a specific message type.
+template <class Message>
+class message_handler : public message_handler_base
+{
+public:
+ // Handle an incoming message.
+ virtual void handle_message(Message msg, actor_address from) = 0;
+};
+
+// Concrete message handler for a specific message type.
+template <class Actor, class Message>
+class mf_message_handler : public message_handler<Message>
+{
+public:
+ // Construct a message handler to invoke the specified member function.
+ mf_message_handler(void (Actor::* mf)(Message, actor_address), Actor* a)
+ : function_(mf), actor_(a)
+ {
+ }
+
+ // Used to determine which message handlers receive an incoming message.
+ virtual const std::type_info& message_id() const
+ {
+ return typeid(Message);
+ }
+
+ // Handle an incoming message.
+ virtual void handle_message(Message msg, actor_address from)
+ {
+ (actor_->*function_)(std::move(msg), from);
+ }
+
+ // Determine whether the message handler represents the specified function.
+ bool is_function(void (Actor::* mf)(Message, actor_address)) const
+ {
+ return mf == function_;
+ }
+
+private:
+ void (Actor::* function_)(Message, actor_address);
+ Actor* actor_;
+};
+
+// Base class for all actors.
+class actor
+{
+public:
+ virtual ~actor()
+ {
+ }
+
+ // Obtain the actor's address for use as a message sender or recipient.
+ actor_address address()
+ {
+ return this;
+ }
+
+ // Send a message from one actor to another.
+ template <class Message>
+ friend void send(Message msg, actor_address from, actor_address to)
+ {
+ // Execute the message handler in the context of the target's executor.
+ post(to->executor_,
+ [=, msg=std::move(msg)]() mutable
+ {
+ to->call_handler(std::move(msg), from);
+ });
+ }
+
+protected:
+ // Construct the actor to use the specified executor for all message handlers.
+ actor(any_io_executor e)
+ : executor_(std::move(e))
+ {
+ }
+
+ // Register a handler for a specific message type. Duplicates are permitted.
+ template <class Actor, class Message>
+ void register_handler(void (Actor::* mf)(Message, actor_address))
+ {
+ handlers_.push_back(
+ std::make_shared<mf_message_handler<Actor, Message>>(
+ mf, static_cast<Actor*>(this)));
+ }
+
+ // Deregister a handler. Removes only the first matching handler.
+ template <class Actor, class Message>
+ void deregister_handler(void (Actor::* mf)(Message, actor_address))
+ {
+ const std::type_info& id = typeid(Message);
+ for (auto iter = handlers_.begin(); iter != handlers_.end(); ++iter)
+ {
+ if ((*iter)->message_id() == id)
+ {
+ auto mh = static_cast<mf_message_handler<Actor, Message>*>(iter->get());
+ if (mh->is_function(mf))
+ {
+ handlers_.erase(iter);
+ return;
+ }
+ }
+ }
+ }
+
+ // Send a message from within a message handler.
+ template <class Message>
+ void tail_send(Message msg, actor_address to)
+ {
+ // Execute the message handler in the context of the target's executor.
+ defer(to->executor_,
+ [=, msg=std::move(msg), from=this]
+ {
+ to->call_handler(std::move(msg), from);
+ });
+ }
+
+private:
+ // Find the matching message handlers, if any, and call them.
+ template <class Message>
+ void call_handler(Message msg, actor_address from)
+ {
+ const std::type_info& message_id = typeid(Message);
+ for (auto& h: handlers_)
+ {
+ if (h->message_id() == message_id)
+ {
+ auto mh = static_cast<message_handler<Message>*>(h.get());
+ mh->handle_message(msg, from);
+ }
+ }
+ }
+
+ // All messages associated with a single actor object should be processed
+ // non-concurrently. We use a strand to ensure non-concurrent execution even
+ // if the underlying executor may use multiple threads.
+ strand<any_io_executor> executor_;
+
+ std::vector<std::shared_ptr<message_handler_base>> handlers_;
+};
+
+// A concrete actor that allows synchronous message retrieval.
+template <class Message>
+class receiver : public actor
+{
+public:
+ receiver()
+ : actor(system_executor())
+ {
+ register_handler(&receiver::message_handler);
+ }
+
+ // Block until a message has been received.
+ Message wait()
+ {
+ std::unique_lock<std::mutex> lock(mutex_);
+ condition_.wait(lock, [this]{ return !message_queue_.empty(); });
+ Message msg(std::move(message_queue_.front()));
+ message_queue_.pop_front();
+ return msg;
+ }
+
+private:
+ // Handle a new message by adding it to the queue and waking a waiter.
+ void message_handler(Message msg, actor_address /* from */)
+ {
+ std::lock_guard<std::mutex> lock(mutex_);
+ message_queue_.push_back(std::move(msg));
+ condition_.notify_one();
+ }
+
+ std::mutex mutex_;
+ std::condition_variable condition_;
+ std::deque<Message> message_queue_;
+};
+
+//------------------------------------------------------------------------------
+
+#include <asio/thread_pool.hpp>
+#include <iostream>
+
+using asio::thread_pool;
+
+class member : public actor
+{
+public:
+ explicit member(any_io_executor e)
+ : actor(std::move(e))
+ {
+ register_handler(&member::init_handler);
+ }
+
+private:
+ void init_handler(actor_address next, actor_address from)
+ {
+ next_ = next;
+ caller_ = from;
+
+ register_handler(&member::token_handler);
+ deregister_handler(&member::init_handler);
+ }
+
+ void token_handler(int token, actor_address /*from*/)
+ {
+ int msg(token);
+ actor_address to(caller_);
+
+ if (token > 0)
+ {
+ msg = token - 1;
+ to = next_;
+ }
+
+ tail_send(msg, to);
+ }
+
+ actor_address next_;
+ actor_address caller_;
+};
+
+int main()
+{
+ const std::size_t num_threads = 16;
+ const int num_hops = 50000000;
+ const std::size_t num_actors = 503;
+ const int token_value = (num_hops + num_actors - 1) / num_actors;
+ const std::size_t actors_per_thread = num_actors / num_threads;
+
+ struct single_thread_pool : thread_pool { single_thread_pool() : thread_pool(1) {} };
+ single_thread_pool pools[num_threads];
+ std::vector<std::shared_ptr<member>> members(num_actors);
+ receiver<int> rcvr;
+
+ // Create the member actors.
+ for (std::size_t i = 0; i < num_actors; ++i)
+ members[i] = std::make_shared<member>(pools[(i / actors_per_thread) % num_threads].get_executor());
+
+ // Initialise the actors by passing each one the address of the next actor in the ring.
+ for (std::size_t i = num_actors, next_i = 0; i > 0; next_i = --i)
+ send(members[next_i]->address(), rcvr.address(), members[i - 1]->address());
+
+ // Send exactly one token to each actor, all with the same initial value, rounding up if required.
+ for (std::size_t i = 0; i < num_actors; ++i)
+ send(token_value, rcvr.address(), members[i]->address());
+
+ // Wait for all signal messages, indicating the tokens have all reached zero.
+ for (std::size_t i = 0; i < num_actors; ++i)
+ rcvr.wait();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/executors/async_1.cpp b/3rdparty/asio/src/examples/cpp14/executors/async_1.cpp
new file mode 100644
index 00000000000..0d1bdfcb8bd
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/executors/async_1.cpp
@@ -0,0 +1,54 @@
+#include <asio/associated_executor.hpp>
+#include <asio/bind_executor.hpp>
+#include <asio/execution.hpp>
+#include <asio/static_thread_pool.hpp>
+#include <iostream>
+#include <string>
+
+using asio::bind_executor;
+using asio::get_associated_executor;
+using asio::static_thread_pool;
+namespace execution = asio::execution;
+
+// A function to asynchronously read a single line from an input stream.
+template <class IoExecutor, class Handler>
+void async_getline(IoExecutor io_ex, std::istream& is, Handler handler)
+{
+ // Track work for the handler's associated executor.
+ auto work_ex = asio::prefer(
+ get_associated_executor(handler, io_ex),
+ execution::outstanding_work.tracked);
+
+ // Post a function object to do the work asynchronously.
+ asio::require(io_ex, execution::blocking.never).execute(
+ [&is, work_ex, handler=std::move(handler)]() mutable
+ {
+ std::string line;
+ std::getline(is, line);
+
+ // Pass the result to the handler, via the associated executor.
+ asio::prefer(work_ex, execution::blocking.possibly).execute(
+ [line=std::move(line), handler=std::move(handler)]() mutable
+ {
+ handler(std::move(line));
+ });
+ });
+}
+
+int main()
+{
+ static_thread_pool io_pool(1);
+ static_thread_pool completion_pool(1);
+
+ std::cout << "Enter a line: ";
+
+ async_getline(io_pool.executor(), std::cin,
+ bind_executor(completion_pool.executor(),
+ [](std::string line)
+ {
+ std::cout << "Line: " << line << "\n";
+ }));
+
+ io_pool.wait();
+ completion_pool.wait();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/executors/async_2.cpp b/3rdparty/asio/src/examples/cpp14/executors/async_2.cpp
new file mode 100644
index 00000000000..ee4a72e80c3
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/executors/async_2.cpp
@@ -0,0 +1,79 @@
+#include <asio/associated_executor.hpp>
+#include <asio/bind_executor.hpp>
+#include <asio/execution.hpp>
+#include <asio/static_thread_pool.hpp>
+#include <iostream>
+#include <string>
+
+using asio::bind_executor;
+using asio::get_associated_executor;
+using asio::static_thread_pool;
+namespace execution = asio::execution;
+
+// A function to asynchronously read a single line from an input stream.
+template <class IoExecutor, class Handler>
+void async_getline(IoExecutor io_ex, std::istream& is, Handler handler)
+{
+ // Track work for the handler's associated executor.
+ auto work_ex = asio::prefer(
+ get_associated_executor(handler, io_ex),
+ execution::outstanding_work.tracked);
+
+ // Post a function object to do the work asynchronously.
+ asio::require(io_ex, execution::blocking.never).execute(
+ [&is, work_ex, handler=std::move(handler)]() mutable
+ {
+ std::string line;
+ std::getline(is, line);
+
+ // Pass the result to the handler, via the associated executor.
+ asio::prefer(work_ex, execution::blocking.possibly).execute(
+ [line=std::move(line), handler=std::move(handler)]() mutable
+ {
+ handler(std::move(line));
+ });
+ });
+}
+
+// A function to asynchronously read multiple lines from an input stream.
+template <class IoExecutor, class Handler>
+void async_getlines(IoExecutor io_ex, std::istream& is, std::string init, Handler handler)
+{
+ // Track work for the I/O executor.
+ auto io_work_ex = asio::prefer(io_ex,
+ execution::outstanding_work.tracked);
+
+ // Track work for the handler's associated executor.
+ auto handler_work_ex = asio::prefer(
+ get_associated_executor(handler, io_ex),
+ execution::outstanding_work.tracked);
+
+ // Use the associated executor for each operation in the composition.
+ async_getline(io_work_ex, is,
+ bind_executor(handler_work_ex,
+ [io_work_ex, &is, lines=std::move(init), handler=std::move(handler)]
+ (std::string line) mutable
+ {
+ if (line.empty())
+ handler(lines);
+ else
+ async_getlines(io_work_ex, is, lines + line + "\n", std::move(handler));
+ }));
+}
+
+int main()
+{
+ static_thread_pool io_pool(1);
+ static_thread_pool completion_pool(1);
+
+ std::cout << "Enter text, terminating with a blank line:\n";
+
+ async_getlines(io_pool.executor(), std::cin, "",
+ bind_executor(completion_pool.executor(), [](std::string lines)
+ {
+ std::cout << "Lines:\n" << lines << "\n";
+ }));
+
+ io_pool.wait();
+ completion_pool.wait();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/executors/bank_account_1.cpp b/3rdparty/asio/src/examples/cpp14/executors/bank_account_1.cpp
new file mode 100644
index 00000000000..a63d7fc059b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/executors/bank_account_1.cpp
@@ -0,0 +1,57 @@
+#include <asio/execution.hpp>
+#include <asio/static_thread_pool.hpp>
+#include <iostream>
+
+using asio::static_thread_pool;
+namespace execution = asio::execution;
+
+// Traditional active object pattern.
+// Member functions do not block.
+
+class bank_account
+{
+ int balance_ = 0;
+ mutable static_thread_pool pool_{1};
+
+public:
+ void deposit(int amount)
+ {
+ pool_.executor().execute(
+ [this, amount]
+ {
+ balance_ += amount;
+ });
+ }
+
+ void withdraw(int amount)
+ {
+ pool_.executor().execute(
+ [this, amount]
+ {
+ if (balance_ >= amount)
+ balance_ -= amount;
+ });
+ }
+
+ void print_balance() const
+ {
+ pool_.executor().execute(
+ [this]
+ {
+ std::cout << "balance = " << balance_ << "\n";
+ });
+ }
+
+ ~bank_account()
+ {
+ pool_.wait();
+ }
+};
+
+int main()
+{
+ bank_account acct;
+ acct.deposit(20);
+ acct.withdraw(10);
+ acct.print_balance();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/executors/bank_account_2.cpp b/3rdparty/asio/src/examples/cpp14/executors/bank_account_2.cpp
new file mode 100644
index 00000000000..c2de05156e8
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/executors/bank_account_2.cpp
@@ -0,0 +1,55 @@
+#include <asio/execution.hpp>
+#include <asio/static_thread_pool.hpp>
+#include <iostream>
+
+using asio::static_thread_pool;
+namespace execution = asio::execution;
+
+// Traditional active object pattern.
+// Member functions block until operation is finished.
+
+class bank_account
+{
+ int balance_ = 0;
+ mutable static_thread_pool pool_{1};
+
+public:
+ void deposit(int amount)
+ {
+ asio::require(pool_.executor(), execution::blocking.always).execute(
+ [this, amount]
+ {
+ balance_ += amount;
+ });
+ }
+
+ void withdraw(int amount)
+ {
+ asio::require(pool_.executor(),
+ execution::blocking.always).execute(
+ [this, amount]
+ {
+ if (balance_ >= amount)
+ balance_ -= amount;
+ });
+ }
+
+ int balance() const
+ {
+ int result = 0;
+ asio::require(pool_.executor(), execution::blocking.always).execute(
+ [this, &result]
+ {
+ result = balance_;
+ });
+ return result;
+ }
+};
+
+int main()
+{
+ bank_account acct;
+ acct.deposit(20);
+ acct.withdraw(10);
+ std::cout << "balance = " << acct.balance() << "\n";
+}
diff --git a/3rdparty/asio/src/examples/cpp14/executors/fork_join.cpp b/3rdparty/asio/src/examples/cpp14/executors/fork_join.cpp
new file mode 100644
index 00000000000..7e8a827356d
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/executors/fork_join.cpp
@@ -0,0 +1,289 @@
+#include <asio/execution.hpp>
+#include <asio/static_thread_pool.hpp>
+#include <algorithm>
+#include <condition_variable>
+#include <memory>
+#include <mutex>
+#include <queue>
+#include <thread>
+#include <numeric>
+
+using asio::static_thread_pool;
+namespace execution = asio::execution;
+
+// A fixed-size thread pool used to implement fork/join semantics. Functions
+// are scheduled using a simple FIFO queue. Implementing work stealing, or
+// using a queue based on atomic operations, are left as tasks for the reader.
+class fork_join_pool
+{
+public:
+ // The constructor starts a thread pool with the specified number of threads.
+ // Note that the thread_count is not a fixed limit on the pool's concurrency.
+ // Additional threads may temporarily be added to the pool if they join a
+ // fork_executor.
+ explicit fork_join_pool(
+ std::size_t thread_count = std::max(std::thread::hardware_concurrency(), 1u) * 2)
+ : use_count_(1),
+ threads_(thread_count)
+ {
+ try
+ {
+ // Ask each thread in the pool to dequeue and execute functions until
+ // it is time to shut down, i.e. the use count is zero.
+ for (thread_count_ = 0; thread_count_ < thread_count; ++thread_count_)
+ {
+ threads_.executor().execute(
+ [this]
+ {
+ std::unique_lock<std::mutex> lock(mutex_);
+ while (use_count_ > 0)
+ if (!execute_next(lock))
+ condition_.wait(lock);
+ });
+ }
+ }
+ catch (...)
+ {
+ stop_threads();
+ threads_.wait();
+ throw;
+ }
+ }
+
+ // The destructor waits for the pool to finish executing functions.
+ ~fork_join_pool()
+ {
+ stop_threads();
+ threads_.wait();
+ }
+
+private:
+ friend class fork_executor;
+
+ // The base for all functions that are queued in the pool.
+ struct function_base
+ {
+ std::shared_ptr<std::size_t> work_count_;
+ void (*execute_)(std::shared_ptr<function_base>& p);
+ };
+
+ // Execute the next function from the queue, if any. Returns true if a
+ // function was executed, and false if the queue was empty.
+ bool execute_next(std::unique_lock<std::mutex>& lock)
+ {
+ if (queue_.empty())
+ return false;
+ auto p(queue_.front());
+ queue_.pop();
+ lock.unlock();
+ execute(lock, p);
+ return true;
+ }
+
+ // Execute a function and decrement the outstanding work.
+ void execute(std::unique_lock<std::mutex>& lock,
+ std::shared_ptr<function_base>& p)
+ {
+ std::shared_ptr<std::size_t> work_count(std::move(p->work_count_));
+ try
+ {
+ p->execute_(p);
+ lock.lock();
+ do_work_finished(work_count);
+ }
+ catch (...)
+ {
+ lock.lock();
+ do_work_finished(work_count);
+ throw;
+ }
+ }
+
+ // Increment outstanding work.
+ void do_work_started(const std::shared_ptr<std::size_t>& work_count) noexcept
+ {
+ if (++(*work_count) == 1)
+ ++use_count_;
+ }
+
+ // Decrement outstanding work. Notify waiting threads if we run out.
+ void do_work_finished(const std::shared_ptr<std::size_t>& work_count) noexcept
+ {
+ if (--(*work_count) == 0)
+ {
+ --use_count_;
+ condition_.notify_all();
+ }
+ }
+
+ // Dispatch a function, executing it immediately if the queue is already
+ // loaded. Otherwise adds the function to the queue and wakes a thread.
+ void do_execute(std::shared_ptr<function_base> p,
+ const std::shared_ptr<std::size_t>& work_count)
+ {
+ std::unique_lock<std::mutex> lock(mutex_);
+ if (queue_.size() > thread_count_ * 16)
+ {
+ do_work_started(work_count);
+ lock.unlock();
+ execute(lock, p);
+ }
+ else
+ {
+ queue_.push(p);
+ do_work_started(work_count);
+ condition_.notify_one();
+ }
+ }
+
+ // Ask all threads to shut down.
+ void stop_threads()
+ {
+ std::lock_guard<std::mutex> lock(mutex_);
+ --use_count_;
+ condition_.notify_all();
+ }
+
+ std::mutex mutex_;
+ std::condition_variable condition_;
+ std::queue<std::shared_ptr<function_base>> queue_;
+ std::size_t use_count_;
+ std::size_t thread_count_;
+ static_thread_pool threads_;
+};
+
+// A class that satisfies the Executor requirements. Every function or piece of
+// work associated with a fork_executor is part of a single, joinable group.
+class fork_executor
+{
+public:
+ fork_executor(fork_join_pool& ctx)
+ : context_(ctx),
+ work_count_(std::make_shared<std::size_t>(0))
+ {
+ }
+
+ fork_join_pool& query(execution::context_t) const noexcept
+ {
+ return context_;
+ }
+
+ template <class Func>
+ void execute(Func f) const
+ {
+ auto p(std::make_shared<function<Func>>(std::move(f), work_count_));
+ context_.do_execute(p, work_count_);
+ }
+
+ friend bool operator==(const fork_executor& a,
+ const fork_executor& b) noexcept
+ {
+ return a.work_count_ == b.work_count_;
+ }
+
+ friend bool operator!=(const fork_executor& a,
+ const fork_executor& b) noexcept
+ {
+ return a.work_count_ != b.work_count_;
+ }
+
+ // Block until all work associated with the executor is complete. While it is
+ // waiting, the thread may be borrowed to execute functions from the queue.
+ void join() const
+ {
+ std::unique_lock<std::mutex> lock(context_.mutex_);
+ while (*work_count_ > 0)
+ if (!context_.execute_next(lock))
+ context_.condition_.wait(lock);
+ }
+
+private:
+ template <class Func>
+ struct function : fork_join_pool::function_base
+ {
+ explicit function(Func f, const std::shared_ptr<std::size_t>& w)
+ : function_(std::move(f))
+ {
+ work_count_ = w;
+ execute_ = [](std::shared_ptr<fork_join_pool::function_base>& p)
+ {
+ Func tmp(std::move(static_cast<function*>(p.get())->function_));
+ p.reset();
+ tmp();
+ };
+ }
+
+ Func function_;
+ };
+
+ fork_join_pool& context_;
+ std::shared_ptr<std::size_t> work_count_;
+};
+
+// Helper class to automatically join a fork_executor when exiting a scope.
+class join_guard
+{
+public:
+ explicit join_guard(const fork_executor& ex) : ex_(ex) {}
+ join_guard(const join_guard&) = delete;
+ join_guard(join_guard&&) = delete;
+ ~join_guard() { ex_.join(); }
+
+private:
+ fork_executor ex_;
+};
+
+//------------------------------------------------------------------------------
+
+#include <algorithm>
+#include <iostream>
+#include <random>
+#include <vector>
+
+fork_join_pool pool;
+
+template <class Iterator>
+void fork_join_sort(Iterator begin, Iterator end)
+{
+ std::size_t n = end - begin;
+ if (n > 32768)
+ {
+ {
+ fork_executor fork(pool);
+ join_guard join(fork);
+ fork.execute([=]{ fork_join_sort(begin, begin + n / 2); });
+ fork.execute([=]{ fork_join_sort(begin + n / 2, end); });
+ }
+ std::inplace_merge(begin, begin + n / 2, end);
+ }
+ else
+ {
+ std::sort(begin, end);
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ if (argc != 2)
+ {
+ std::cerr << "Usage: fork_join <size>\n";
+ return 1;
+ }
+
+ std::vector<double> vec(std::atoll(argv[1]));
+ std::iota(vec.begin(), vec.end(), 0);
+
+ std::random_device rd;
+ std::mt19937 g(rd());
+ std::shuffle(vec.begin(), vec.end(), g);
+
+ std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
+
+ fork_join_sort(vec.begin(), vec.end());
+
+ std::chrono::steady_clock::duration elapsed = std::chrono::steady_clock::now() - start;
+
+ std::cout << "sort took ";
+ std::cout << std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
+ std::cout << " microseconds" << std::endl;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/executors/pipeline.cpp b/3rdparty/asio/src/examples/cpp14/executors/pipeline.cpp
new file mode 100644
index 00000000000..9754a27d425
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/executors/pipeline.cpp
@@ -0,0 +1,280 @@
+#include <asio/associated_executor.hpp>
+#include <asio/bind_executor.hpp>
+#include <asio/execution.hpp>
+#include <condition_variable>
+#include <future>
+#include <memory>
+#include <mutex>
+#include <queue>
+#include <thread>
+#include <vector>
+#include <cctype>
+
+using asio::executor_binder;
+using asio::get_associated_executor;
+namespace execution = asio::execution;
+
+// An executor that launches a new thread for each function submitted to it.
+// This class satisfies the executor requirements.
+class thread_executor
+{
+private:
+ // Singleton execution context that manages threads launched by the new_thread_executor.
+ class thread_bag
+ {
+ friend class thread_executor;
+
+ void add_thread(std::thread&& t)
+ {
+ std::unique_lock<std::mutex> lock(mutex_);
+ threads_.push_back(std::move(t));
+ }
+
+ thread_bag() = default;
+
+ ~thread_bag()
+ {
+ for (auto& t : threads_)
+ t.join();
+ }
+
+ std::mutex mutex_;
+ std::vector<std::thread> threads_;
+ };
+
+public:
+ static thread_bag& query(execution::context_t)
+ {
+ static thread_bag threads;
+ return threads;
+ }
+
+ static constexpr auto query(execution::blocking_t)
+ {
+ return execution::blocking.never;
+ }
+
+ template <class Func>
+ void execute(Func f) const
+ {
+ thread_bag& bag = query(execution::context);
+ bag.add_thread(std::thread(std::move(f)));
+ }
+
+ friend bool operator==(const thread_executor&,
+ const thread_executor&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const thread_executor&,
+ const thread_executor&) noexcept
+ {
+ return false;
+ }
+};
+
+// Base class for all thread-safe queue implementations.
+class queue_impl_base
+{
+ template <class> friend class queue_front;
+ template <class> friend class queue_back;
+ std::mutex mutex_;
+ std::condition_variable condition_;
+ bool stop_ = false;
+};
+
+// Underlying implementation of a thread-safe queue, shared between the
+// queue_front and queue_back classes.
+template <class T>
+class queue_impl : public queue_impl_base
+{
+ template <class> friend class queue_front;
+ template <class> friend class queue_back;
+ std::queue<T> queue_;
+};
+
+// The front end of a queue between consecutive pipeline stages.
+template <class T>
+class queue_front
+{
+public:
+ typedef T value_type;
+
+ explicit queue_front(std::shared_ptr<queue_impl<T>> impl)
+ : impl_(impl)
+ {
+ }
+
+ void push(T t)
+ {
+ std::unique_lock<std::mutex> lock(impl_->mutex_);
+ impl_->queue_.push(std::move(t));
+ impl_->condition_.notify_one();
+ }
+
+ void stop()
+ {
+ std::unique_lock<std::mutex> lock(impl_->mutex_);
+ impl_->stop_ = true;
+ impl_->condition_.notify_one();
+ }
+
+private:
+ std::shared_ptr<queue_impl<T>> impl_;
+};
+
+// The back end of a queue between consecutive pipeline stages.
+template <class T>
+class queue_back
+{
+public:
+ typedef T value_type;
+
+ explicit queue_back(std::shared_ptr<queue_impl<T>> impl)
+ : impl_(impl)
+ {
+ }
+
+ bool pop(T& t)
+ {
+ std::unique_lock<std::mutex> lock(impl_->mutex_);
+ while (impl_->queue_.empty() && !impl_->stop_)
+ impl_->condition_.wait(lock);
+ if (!impl_->queue_.empty())
+ {
+ t = impl_->queue_.front();
+ impl_->queue_.pop();
+ return true;
+ }
+ return false;
+ }
+
+private:
+ std::shared_ptr<queue_impl<T>> impl_;
+};
+
+// Launch the last stage in a pipeline.
+template <class T, class F>
+std::future<void> pipeline(queue_back<T> in, F f)
+{
+ // Get the function's associated executor, defaulting to thread_executor.
+ auto ex = get_associated_executor(f, thread_executor());
+
+ // Run the function, and as we're the last stage return a future so that the
+ // caller can wait for the pipeline to finish.
+ std::packaged_task<void()> task(
+ [in, f = std::move(f)]() mutable
+ {
+ f(in);
+ });
+ std::future<void> fut = task.get_future();
+ asio::require(ex, execution::blocking.never).execute(std::move(task));
+ return fut;
+}
+
+// Launch an intermediate stage in a pipeline.
+template <class T, class F, class... Tail>
+std::future<void> pipeline(queue_back<T> in, F f, Tail... t)
+{
+ // Determine the output queue type.
+ typedef typename executor_binder<F, thread_executor>::second_argument_type::value_type output_value_type;
+
+ // Create the output queue and its implementation.
+ auto out_impl = std::make_shared<queue_impl<output_value_type>>();
+ queue_front<output_value_type> out(out_impl);
+ queue_back<output_value_type> next_in(out_impl);
+
+ // Get the function's associated executor, defaulting to thread_executor.
+ auto ex = get_associated_executor(f, thread_executor());
+
+ // Run the function.
+ asio::require(ex, execution::blocking.never).execute(
+ [in, out, f = std::move(f)]() mutable
+ {
+ f(in, out);
+ out.stop();
+ });
+
+ // Launch the rest of the pipeline.
+ return pipeline(next_in, std::move(t)...);
+}
+
+// Launch the first stage in a pipeline.
+template <class F, class... Tail>
+std::future<void> pipeline(F f, Tail... t)
+{
+ // Determine the output queue type.
+ typedef typename executor_binder<F, thread_executor>::argument_type::value_type output_value_type;
+
+ // Create the output queue and its implementation.
+ auto out_impl = std::make_shared<queue_impl<output_value_type>>();
+ queue_front<output_value_type> out(out_impl);
+ queue_back<output_value_type> next_in(out_impl);
+
+ // Get the function's associated executor, defaulting to thread_executor.
+ auto ex = get_associated_executor(f, thread_executor());
+
+ // Run the function.
+ asio::require(ex, execution::blocking.never).execute(
+ [out, f = std::move(f)]() mutable
+ {
+ f(out);
+ out.stop();
+ });
+
+ // Launch the rest of the pipeline.
+ return pipeline(next_in, std::move(t)...);
+}
+
+//------------------------------------------------------------------------------
+
+#include <asio/static_thread_pool.hpp>
+#include <iostream>
+#include <string>
+
+using asio::bind_executor;
+using asio::static_thread_pool;
+
+void reader(queue_front<std::string> out)
+{
+ std::string line;
+ while (std::getline(std::cin, line))
+ out.push(line);
+}
+
+void filter(queue_back<std::string> in, queue_front<std::string> out)
+{
+ std::string line;
+ while (in.pop(line))
+ if (line.length() > 5)
+ out.push(line);
+}
+
+void upper(queue_back<std::string> in, queue_front<std::string> out)
+{
+ std::string line;
+ while (in.pop(line))
+ {
+ std::string new_line;
+ for (char c : line)
+ new_line.push_back(std::toupper(c));
+ out.push(new_line);
+ }
+}
+
+void writer(queue_back<std::string> in)
+{
+ std::size_t count = 0;
+ std::string line;
+ while (in.pop(line))
+ std::cout << count++ << ": " << line << std::endl;
+}
+
+int main()
+{
+ static_thread_pool pool(1);
+
+ auto f = pipeline(reader, filter, bind_executor(pool.executor(), upper), writer);
+ f.wait();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/executors/priority_scheduler.cpp b/3rdparty/asio/src/examples/cpp14/executors/priority_scheduler.cpp
new file mode 100644
index 00000000000..20d36db933a
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/executors/priority_scheduler.cpp
@@ -0,0 +1,181 @@
+#include <asio/execution.hpp>
+#include <condition_variable>
+#include <iostream>
+#include <memory>
+#include <mutex>
+#include <queue>
+
+namespace execution = asio::execution;
+
+namespace custom_props {
+
+ struct priority
+ {
+ template <typename T>
+ static constexpr bool is_applicable_property_v =
+ execution::is_executor<T>::value;
+
+ static constexpr bool is_requirable = true;
+ static constexpr bool is_preferable = true;
+
+ using polymorphic_query_result_type = int;
+
+ int value() const { return value_; }
+
+ int value_ = 1;
+ };
+
+ constexpr priority low_priority{0};
+ constexpr priority normal_priority{1};
+ constexpr priority high_priority{2};
+
+} // namespace custom_props
+
+class priority_scheduler
+{
+public:
+ // A class that satisfies the Executor requirements.
+ class executor_type
+ {
+ public:
+ executor_type(priority_scheduler& ctx) noexcept
+ : context_(ctx), priority_(custom_props::normal_priority.value())
+ {
+ }
+
+ priority_scheduler& query(execution::context_t) const noexcept
+ {
+ return context_;
+ }
+
+ int query(custom_props::priority) const noexcept
+ {
+ return priority_;
+ }
+
+ executor_type require(custom_props::priority pri) const
+ {
+ executor_type new_ex(*this);
+ new_ex.priority_ = pri.value();
+ return new_ex;
+ }
+
+ template <class Func>
+ void execute(Func f) const
+ {
+ auto p(std::make_shared<item<Func>>(priority_, std::move(f)));
+ std::lock_guard<std::mutex> lock(context_.mutex_);
+ context_.queue_.push(p);
+ context_.condition_.notify_one();
+ }
+
+ friend bool operator==(const executor_type& a,
+ const executor_type& b) noexcept
+ {
+ return &a.context_ == &b.context_;
+ }
+
+ friend bool operator!=(const executor_type& a,
+ const executor_type& b) noexcept
+ {
+ return &a.context_ != &b.context_;
+ }
+
+ private:
+ priority_scheduler& context_;
+ int priority_;
+ };
+
+ executor_type executor() noexcept
+ {
+ return executor_type(*const_cast<priority_scheduler*>(this));
+ }
+
+ void run()
+ {
+ std::unique_lock<std::mutex> lock(mutex_);
+ for (;;)
+ {
+ condition_.wait(lock, [&]{ return stopped_ || !queue_.empty(); });
+ if (stopped_)
+ return;
+ auto p(queue_.top());
+ queue_.pop();
+ lock.unlock();
+ p->execute_(p);
+ lock.lock();
+ }
+ }
+
+ void stop()
+ {
+ std::lock_guard<std::mutex> lock(mutex_);
+ stopped_ = true;
+ condition_.notify_all();
+ }
+
+private:
+ struct item_base
+ {
+ int priority_;
+ void (*execute_)(std::shared_ptr<item_base>&);
+ };
+
+ template <class Func>
+ struct item : item_base
+ {
+ item(int pri, Func f) : function_(std::move(f))
+ {
+ priority_ = pri;
+ execute_ = [](std::shared_ptr<item_base>& p)
+ {
+ Func tmp(std::move(static_cast<item*>(p.get())->function_));
+ p.reset();
+ tmp();
+ };
+ }
+
+ Func function_;
+ };
+
+ struct item_comp
+ {
+ bool operator()(
+ const std::shared_ptr<item_base>& a,
+ const std::shared_ptr<item_base>& b)
+ {
+ return a->priority_ < b->priority_;
+ }
+ };
+
+ std::mutex mutex_;
+ std::condition_variable condition_;
+ std::priority_queue<
+ std::shared_ptr<item_base>,
+ std::vector<std::shared_ptr<item_base>>,
+ item_comp> queue_;
+ bool stopped_ = false;
+};
+
+int main()
+{
+ priority_scheduler sched;
+ auto ex = sched.executor();
+ auto prefer_low = asio::prefer(ex, custom_props::low_priority);
+ auto low = asio::require(ex, custom_props::low_priority);
+ auto med = asio::require(ex, custom_props::normal_priority);
+ auto high = asio::require(ex, custom_props::high_priority);
+ execution::any_executor<custom_props::priority> poly_high(high);
+ prefer_low.execute([]{ std::cout << "1\n"; });
+ low.execute([]{ std::cout << "11\n"; });
+ low.execute([]{ std::cout << "111\n"; });
+ med.execute([]{ std::cout << "2\n"; });
+ med.execute([]{ std::cout << "22\n"; });
+ high.execute([]{ std::cout << "3\n"; });
+ high.execute([]{ std::cout << "33\n"; });
+ high.execute([]{ std::cout << "333\n"; });
+ poly_high.execute([]{ std::cout << "3333\n"; });
+ asio::require(ex, custom_props::priority{-1}).execute([&]{ sched.stop(); });
+ sched.run();
+ std::cout << "polymorphic query result = " << asio::query(poly_high, custom_props::priority{}) << "\n";
+}
diff --git a/3rdparty/asio/src/examples/cpp14/iostreams/http_client.cpp b/3rdparty/asio/src/examples/cpp14/iostreams/http_client.cpp
new file mode 100644
index 00000000000..3ae02e4f825
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/iostreams/http_client.cpp
@@ -0,0 +1,91 @@
+//
+// http_client.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <iostream>
+#include <istream>
+#include <ostream>
+#include <string>
+#include <asio/ts/internet.hpp>
+
+using asio::ip::tcp;
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cout << "Usage: http_client <server> <path>\n";
+ std::cout << "Example:\n";
+ std::cout << " http_client www.boost.org /LICENSE_1_0.txt\n";
+ return 1;
+ }
+
+ asio::ip::tcp::iostream s;
+
+ // The entire sequence of I/O operations must complete within 60 seconds.
+ // If an expiry occurs, the socket is automatically closed and the stream
+ // becomes bad.
+ s.expires_after(std::chrono::seconds(60));
+
+ // Establish a connection to the server.
+ s.connect(argv[1], "http");
+ if (!s)
+ {
+ std::cout << "Unable to connect: " << s.error().message() << "\n";
+ return 1;
+ }
+
+ // Send the request. We specify the "Connection: close" header so that the
+ // server will close the socket after transmitting the response. This will
+ // allow us to treat all data up until the EOF as the content.
+ s << "GET " << argv[2] << " HTTP/1.0\r\n";
+ s << "Host: " << argv[1] << "\r\n";
+ s << "Accept: */*\r\n";
+ s << "Connection: close\r\n\r\n";
+
+ // By default, the stream is tied with itself. This means that the stream
+ // automatically flush the buffered output before attempting a read. It is
+ // not necessary not explicitly flush the stream at this point.
+
+ // Check that response is OK.
+ std::string http_version;
+ s >> http_version;
+ unsigned int status_code;
+ s >> status_code;
+ std::string status_message;
+ std::getline(s, status_message);
+ if (!s || http_version.substr(0, 5) != "HTTP/")
+ {
+ std::cout << "Invalid response\n";
+ return 1;
+ }
+ if (status_code != 200)
+ {
+ std::cout << "Response returned with status code " << status_code << "\n";
+ return 1;
+ }
+
+ // Process the response headers, which are terminated by a blank line.
+ std::string header;
+ while (std::getline(s, header) && header != "\r")
+ std::cout << header << "\n";
+ std::cout << "\n";
+
+ // Write the remaining data to output.
+ std::cout << s.rdbuf();
+ }
+ catch (std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp14/operations/c_callback_wrapper.cpp b/3rdparty/asio/src/examples/cpp14/operations/c_callback_wrapper.cpp
new file mode 100644
index 00000000000..33b1c26e8ae
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/operations/c_callback_wrapper.cpp
@@ -0,0 +1,230 @@
+//
+// c_callback_wrapper.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+#include <memory>
+#include <new>
+
+//------------------------------------------------------------------------------
+
+// This is a mock implementation of a C-based API that uses the function pointer
+// plus void* context idiom for exposing a callback.
+
+void read_input(const char* prompt, void (*cb)(void*, const char*), void* arg)
+{
+ std::thread(
+ [prompt = std::string(prompt), cb, arg]
+ {
+ std::cout << prompt << ": ";
+ std::cout.flush();
+ std::string line;
+ std::getline(std::cin, line);
+ cb(arg, line.c_str());
+ }).detach();
+}
+
+//------------------------------------------------------------------------------
+
+// This is an asynchronous operation that wraps the C-based API.
+
+// To map our completion handler into a function pointer / void* callback, we
+// need to allocate some state that will live for the duration of the
+// operation. A pointer to this state will be passed to the C-based API.
+template <typename Handler>
+class read_input_state
+{
+public:
+ read_input_state(Handler&& handler)
+ : handler_(std::move(handler)),
+ work_(asio::make_work_guard(handler_))
+ {
+ }
+
+ // Create the state using the handler's associated allocator.
+ static read_input_state* create(Handler&& handler)
+ {
+ // A unique_ptr deleter that is used to destroy uninitialised objects.
+ struct deleter
+ {
+ // Get the handler's associated allocator type. If the handler does not
+ // specify an associated allocator, we will use a recycling allocator as
+ // the default. As the associated allocator is a proto-allocator, we must
+ // rebind it to the correct type before we can use it to allocate objects.
+ typename std::allocator_traits<
+ asio::associated_allocator_t<Handler,
+ asio::recycling_allocator<void>>>::template
+ rebind_alloc<read_input_state> alloc;
+
+ void operator()(read_input_state* ptr)
+ {
+ std::allocator_traits<decltype(alloc)>::deallocate(alloc, ptr, 1);
+ }
+ } d{asio::get_associated_allocator(handler,
+ asio::recycling_allocator<void>())};
+
+ // Allocate memory for the state.
+ std::unique_ptr<read_input_state, deleter> uninit_ptr(
+ std::allocator_traits<decltype(d.alloc)>::allocate(d.alloc, 1), d);
+
+ // Construct the state into the newly allocated memory. This might throw.
+ read_input_state* ptr =
+ new (uninit_ptr.get()) read_input_state(std::move(handler));
+
+ // Release ownership of the memory and return the newly allocated state.
+ uninit_ptr.release();
+ return ptr;
+ }
+
+ static void callback(void* arg, const char* result)
+ {
+ read_input_state* self = static_cast<read_input_state*>(arg);
+
+ // A unique_ptr deleter that is used to destroy initialised objects.
+ struct deleter
+ {
+ // Get the handler's associated allocator type. If the handler does not
+ // specify an associated allocator, we will use a recycling allocator as
+ // the default. As the associated allocator is a proto-allocator, we must
+ // rebind it to the correct type before we can use it to allocate objects.
+ typename std::allocator_traits<
+ asio::associated_allocator_t<Handler,
+ asio::recycling_allocator<void>>>::template
+ rebind_alloc<read_input_state> alloc;
+
+ void operator()(read_input_state* ptr)
+ {
+ std::allocator_traits<decltype(alloc)>::destroy(alloc, ptr);
+ std::allocator_traits<decltype(alloc)>::deallocate(alloc, ptr, 1);
+ }
+ } d{asio::get_associated_allocator(self->handler_,
+ asio::recycling_allocator<void>())};
+
+ // To conform to the rules regarding asynchronous operations and memory
+ // allocation, we must make a copy of the state and deallocate the memory
+ // before dispatching the completion handler.
+ std::unique_ptr<read_input_state, deleter> state_ptr(self, d);
+ read_input_state state(std::move(*self));
+ state_ptr.reset();
+
+ // Dispatch the completion handler through the handler's associated
+ // executor, using the handler's associated allocator.
+ asio::dispatch(state.work_.get_executor(),
+ asio::bind_allocator(d.alloc,
+ [
+ handler = std::move(state.handler_),
+ result = std::string(result)
+ ]() mutable
+ {
+ std::move(handler)(result);
+ }));
+ }
+
+private:
+ Handler handler_;
+
+ // According to the rules for asynchronous operations, we need to track
+ // outstanding work against the handler's associated executor until the
+ // asynchronous operation is complete.
+ asio::executor_work_guard<
+ asio::associated_executor_t<Handler>> work_;
+};
+
+// The initiating function for the asynchronous operation.
+template <typename CompletionToken>
+auto async_read_input(const std::string& prompt, CompletionToken&& token)
+{
+ // Define a function object that contains the code to launch the asynchronous
+ // operation. This is passed the concrete completion handler, followed by any
+ // additional arguments that were passed through the call to async_initiate.
+ auto init = [](auto handler, const std::string& prompt)
+ {
+ // The body of the initiation function object creates the long-lived state
+ // and passes it to the C-based API, along with the function pointer.
+ using state_type = read_input_state<decltype(handler)>;
+ read_input(prompt.c_str(), &state_type::callback,
+ state_type::create(std::move(handler)));
+ };
+
+ // The async_initiate function is used to transform the supplied completion
+ // token to the completion handler. When calling this function we explicitly
+ // specify the completion signature of the operation. We must also return the
+ // result of the call since the completion token may produce a return value,
+ // such as a future.
+ return asio::async_initiate<CompletionToken, void(std::string)>(
+ init, // First, pass the function object that launches the operation,
+ token, // then the completion token that will be transformed to a handler,
+ prompt); // and, finally, any additional arguments to the function object.
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ // Test our asynchronous operation using a lambda as a callback. We will use
+ // an io_context to obtain an associated executor.
+ async_read_input("Enter your name",
+ asio::bind_executor(io_context,
+ [](const std::string& result)
+ {
+ std::cout << "Hello " << result << "\n";
+ }));
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_read_input("Enter your name", asio::deferred);
+
+ // Launch our asynchronous operation using a lambda as a callback. We will use
+ // an io_context to obtain an associated executor.
+ std::move(op)(
+ asio::bind_executor(io_context,
+ [](const std::string& result)
+ {
+ std::cout << "Hello " << result << "\n";
+ }));
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<std::string> f =
+ async_read_input("Enter your name", asio::use_future);
+
+ std::string result = f.get();
+ std::cout << "Hello " << result << "\n";
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/operations/callback_wrapper.cpp b/3rdparty/asio/src/examples/cpp14/operations/callback_wrapper.cpp
new file mode 100644
index 00000000000..3d5774c7421
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/operations/callback_wrapper.cpp
@@ -0,0 +1,152 @@
+//
+// callback_wrapper.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+
+//------------------------------------------------------------------------------
+
+// This is a mock implementation of an API that uses a move-only function object
+// for exposing a callback. The callback has the signature void(std::string).
+
+template <typename Callback>
+void read_input(const std::string& prompt, Callback cb)
+{
+ std::thread(
+ [prompt, cb = std::move(cb)]() mutable
+ {
+ std::cout << prompt << ": ";
+ std::cout.flush();
+ std::string line;
+ std::getline(std::cin, line);
+ std::move(cb)(std::move(line));
+ }).detach();
+}
+
+//------------------------------------------------------------------------------
+
+// This is an asynchronous operation that wraps the callback-based API.
+
+// The initiating function for the asynchronous operation.
+template <typename CompletionToken>
+auto async_read_input(const std::string& prompt, CompletionToken&& token)
+{
+ // Define a function object that contains the code to launch the asynchronous
+ // operation. This is passed the concrete completion handler, followed by any
+ // additional arguments that were passed through the call to async_initiate.
+ auto init = [](auto handler, const std::string& prompt)
+ {
+ // According to the rules for asynchronous operations, we need to track
+ // outstanding work against the handler's associated executor until the
+ // asynchronous operation is complete.
+ auto work = asio::make_work_guard(handler);
+
+ // Launch the operation with a callback that will receive the result and
+ // pass it through to the asynchronous operation's completion handler.
+ read_input(prompt,
+ [
+ handler = std::move(handler),
+ work = std::move(work)
+ ](std::string result) mutable
+ {
+ // Get the handler's associated allocator. If the handler does not
+ // specify an allocator, use the recycling allocator as the default.
+ auto alloc = asio::get_associated_allocator(
+ handler, asio::recycling_allocator<void>());
+
+ // Dispatch the completion handler through the handler's associated
+ // executor, using the handler's associated allocator.
+ asio::dispatch(work.get_executor(),
+ asio::bind_allocator(alloc,
+ [
+ handler = std::move(handler),
+ result = std::string(result)
+ ]() mutable
+ {
+ std::move(handler)(result);
+ }));
+ });
+ };
+
+ // The async_initiate function is used to transform the supplied completion
+ // token to the completion handler. When calling this function we explicitly
+ // specify the completion signature of the operation. We must also return the
+ // result of the call since the completion token may produce a return value,
+ // such as a future.
+ return asio::async_initiate<CompletionToken, void(std::string)>(
+ init, // First, pass the function object that launches the operation,
+ token, // then the completion token that will be transformed to a handler,
+ prompt); // and, finally, any additional arguments to the function object.
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ // Test our asynchronous operation using a lambda as a callback. We will use
+ // an io_context to specify an associated executor.
+ async_read_input("Enter your name",
+ asio::bind_executor(io_context,
+ [](const std::string& result)
+ {
+ std::cout << "Hello " << result << "\n";
+ }));
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_read_input("Enter your name", asio::deferred);
+
+ // Launch our asynchronous operation using a lambda as a callback. We will use
+ // an io_context to obtain an associated executor.
+ std::move(op)(
+ asio::bind_executor(io_context,
+ [](const std::string& result)
+ {
+ std::cout << "Hello " << result << "\n";
+ }));
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<std::string> f =
+ async_read_input("Enter your name", asio::use_future);
+
+ std::string result = f.get();
+ std::cout << "Hello " << result << "\n";
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/operations/composed_1.cpp b/3rdparty/asio/src/examples/cpp14/operations/composed_1.cpp
new file mode 100644
index 00000000000..80eaceddf71
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/operations/composed_1.cpp
@@ -0,0 +1,155 @@
+//
+// composed_1.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <cstring>
+#include <iostream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+//------------------------------------------------------------------------------
+
+// This is the simplest example of a composed asynchronous operation, where we
+// simply repackage an existing operation. The asynchronous operation
+// requirements are met by delegating responsibility to the underlying
+// operation.
+
+template <typename CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const char* message, CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is void.
+ // However, when the completion token is asio::yield_context (used for
+ // stackful coroutines) the return type would be std::size_t, and when the
+ // completion token is asio::use_future it would be std::future<std::size_t>.
+ // When the completion token is asio::deferred, the return type differs for
+ // each asynchronous operation.
+ //
+ // In C++14 we can omit the return type as it is automatically deduced from
+ // the return type of our underlying asynchronous operation.
+{
+ // When delegating to the underlying operation we must take care to perfectly
+ // forward the completion token. This ensures that our operation works
+ // correctly with move-only function objects as callbacks, as well as other
+ // completion token types.
+ return asio::async_write(socket,
+ asio::buffer(message, std::strlen(message)),
+ std::forward<CompletionToken>(token));
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, "Testing callback\r\n",
+ [](const std::error_code& error, std::size_t n)
+ {
+ if (!error)
+ {
+ std::cout << n << " bytes transferred\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_message(socket,
+ "Testing deferred\r\n", asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error, std::size_t n)
+ {
+ if (!error)
+ {
+ std::cout << n << " bytes transferred\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<std::size_t> f = async_write_message(
+ socket, "Testing future\r\n", asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ std::size_t n = f.get();
+ std::cout << n << " bytes transferred\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/operations/composed_2.cpp b/3rdparty/asio/src/examples/cpp14/operations/composed_2.cpp
new file mode 100644
index 00000000000..18086bd0627
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/operations/composed_2.cpp
@@ -0,0 +1,219 @@
+//
+// composed_2.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <cstring>
+#include <iostream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This next simplest example of a composed asynchronous operation involves
+// repackaging multiple operations but choosing to invoke just one of them. All
+// of these underlying operations have the same completion signature. The
+// asynchronous operation requirements are met by delegating responsibility to
+// the underlying operations.
+
+template <typename CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const char* message, bool allow_partial_write,
+ CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is void.
+ // However, when the completion token is asio::yield_context (used for
+ // stackful coroutines) the return type would be std::size_t, and when the
+ // completion token is asio::use_future it would be std::future<std::size_t>.
+ // When the completion token is asio::deferred, the return type differs for
+ // each asynchronous operation.
+ //
+ // In C++14 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_initiate.
+{
+ // In addition to determining the mechanism by which an asynchronous
+ // operation delivers its result, a completion token also determines the time
+ // when the operation commences. For example, when the completion token is a
+ // simple callback the operation commences before the initiating function
+ // returns. However, if the completion token's delivery mechanism uses a
+ // future, we might instead want to defer initiation of the operation until
+ // the returned future object is waited upon.
+ //
+ // To enable this, when implementing an asynchronous operation we must
+ // package the initiation step as a function object. The initiation function
+ // object's call operator is passed the concrete completion handler produced
+ // by the completion token. This completion handler matches the asynchronous
+ // operation's completion handler signature, which in this example is:
+ //
+ // void(std::error_code error, std::size_t)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments in the lambda capture set. However, we should prefer to
+ // propagate them as function call arguments as this allows the completion
+ // token to optimise how they are passed. For example, a lazy future which
+ // defers initiation would need to make a decay-copy of the arguments, but
+ // when using a simple callback the arguments can be trivially forwarded
+ // straight through.)
+ auto initiation = [](auto&& completion_handler, tcp::socket& socket,
+ const char* message, bool allow_partial_write)
+ {
+ if (allow_partial_write)
+ {
+ // When delegating to an underlying operation we must take care to
+ // perfectly forward the completion handler. This ensures that our
+ // operation works correctly with move-only function objects as
+ // callbacks.
+ return socket.async_write_some(
+ asio::buffer(message, std::strlen(message)),
+ std::forward<decltype(completion_handler)>(completion_handler));
+ }
+ else
+ {
+ // As above, we must perfectly forward the completion handler when calling
+ // the alternate underlying operation.
+ return asio::async_write(socket,
+ asio::buffer(message, std::strlen(message)),
+ std::forward<decltype(completion_handler)>(completion_handler));
+ }
+ };
+
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code, std::size_t)>(
+ initiation, token, std::ref(socket), message, allow_partial_write);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, "Testing callback\r\n", false,
+ [](const std::error_code& error, std::size_t n)
+ {
+ if (!error)
+ {
+ std::cout << n << " bytes transferred\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_message(socket,
+ "Testing deferred\r\n", false, asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error, std::size_t n)
+ {
+ if (!error)
+ {
+ std::cout << n << " bytes transferred\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<std::size_t> f = async_write_message(
+ socket, "Testing future\r\n", false, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ std::size_t n = f.get();
+ std::cout << n << " bytes transferred\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/operations/composed_3.cpp b/3rdparty/asio/src/examples/cpp14/operations/composed_3.cpp
new file mode 100644
index 00000000000..7b347944768
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/operations/composed_3.cpp
@@ -0,0 +1,228 @@
+//
+// composed_3.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/bind_executor.hpp>
+#include <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <cstring>
+#include <functional>
+#include <iostream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// In this composed operation we repackage an existing operation, but with a
+// different completion handler signature. The asynchronous operation
+// requirements are met by delegating responsibility to the underlying
+// operation.
+
+template <typename CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const char* message, CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++14 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_initiate.
+{
+ // In addition to determining the mechanism by which an asynchronous
+ // operation delivers its result, a completion token also determines the time
+ // when the operation commences. For example, when the completion token is a
+ // simple callback the operation commences before the initiating function
+ // returns. However, if the completion token's delivery mechanism uses a
+ // future, we might instead want to defer initiation of the operation until
+ // the returned future object is waited upon.
+ //
+ // To enable this, when implementing an asynchronous operation we must
+ // package the initiation step as a function object. The initiation function
+ // object's call operator is passed the concrete completion handler produced
+ // by the completion token. This completion handler matches the asynchronous
+ // operation's completion handler signature, which in this example is:
+ //
+ // void(std::error_code error)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments in the lambda capture set. However, we should prefer to
+ // propagate them as function call arguments as this allows the completion
+ // token to optimise how they are passed. For example, a lazy future which
+ // defers initiation would need to make a decay-copy of the arguments, but
+ // when using a simple callback the arguments can be trivially forwarded
+ // straight through.)
+ auto initiation = [](auto&& completion_handler,
+ tcp::socket& socket, const char* message)
+ {
+ // The async_write operation has a completion handler signature of:
+ //
+ // void(std::error_code error, std::size n)
+ //
+ // This differs from our operation's signature in that it is also passed
+ // the number of bytes transferred as an argument of type std::size_t. We
+ // will adapt our completion handler to async_write's completion handler
+ // signature by using std::bind, which drops the additional argument.
+ //
+ // However, it is essential to the correctness of our composed operation
+ // that we preserve the executor of the user-supplied completion handler.
+ // The std::bind function will not do this for us, so we must do this by
+ // first obtaining the completion handler's associated executor (defaulting
+ // to the I/O executor - in this case the executor of the socket - if the
+ // completion handler does not have its own) ...
+ auto executor = asio::get_associated_executor(
+ completion_handler, socket.get_executor());
+
+ // ... and then binding this executor to our adapted completion handler
+ // using the asio::bind_executor function.
+ asio::async_write(socket,
+ asio::buffer(message, std::strlen(message)),
+ asio::bind_executor(executor,
+ std::bind(std::forward<decltype(completion_handler)>(
+ completion_handler), std::placeholders::_1)));
+ };
+
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ initiation, token, std::ref(socket), message);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, "Testing callback\r\n",
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_message(socket,
+ "Testing deferred\r\n", asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_message(
+ socket, "Testing future\r\n", asio::use_future);
+
+ io_context.run();
+
+ // Get the result of the operation.
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Message sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/operations/composed_4.cpp b/3rdparty/asio/src/examples/cpp14/operations/composed_4.cpp
new file mode 100644
index 00000000000..808a179e2d3
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/operations/composed_4.cpp
@@ -0,0 +1,242 @@
+//
+// composed_4.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/bind_executor.hpp>
+#include <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <cstring>
+#include <functional>
+#include <iostream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// In this composed operation we repackage an existing operation, but with a
+// different completion handler signature. We will also intercept an empty
+// message as an invalid argument, and propagate the corresponding error to the
+// user. The asynchronous operation requirements are met by delegating
+// responsibility to the underlying operation.
+
+template <typename CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const char* message, CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++14 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_initiate.
+{
+ // In addition to determining the mechanism by which an asynchronous
+ // operation delivers its result, a completion token also determines the time
+ // when the operation commences. For example, when the completion token is a
+ // simple callback the operation commences before the initiating function
+ // returns. However, if the completion token's delivery mechanism uses a
+ // future, we might instead want to defer initiation of the operation until
+ // the returned future object is waited upon.
+ //
+ // To enable this, when implementing an asynchronous operation we must
+ // package the initiation step as a function object. The initiation function
+ // object's call operator is passed the concrete completion handler produced
+ // by the completion token. This completion handler matches the asynchronous
+ // operation's completion handler signature, which in this example is:
+ //
+ // void(std::error_code error)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments in the lambda capture set. However, we should prefer to
+ // propagate them as function call arguments as this allows the completion
+ // token to optimise how they are passed. For example, a lazy future which
+ // defers initiation would need to make a decay-copy of the arguments, but
+ // when using a simple callback the arguments can be trivially forwarded
+ // straight through.)
+ auto initiation = [](auto&& completion_handler,
+ tcp::socket& socket, const char* message)
+ {
+ // The post operation has a completion handler signature of:
+ //
+ // void()
+ //
+ // and the async_write operation has a completion handler signature of:
+ //
+ // void(std::error_code error, std::size n)
+ //
+ // Both of these operations' completion handler signatures differ from our
+ // operation's completion handler signature. We will adapt our completion
+ // handler to these signatures by using std::bind, which drops the
+ // additional arguments.
+ //
+ // However, it is essential to the correctness of our composed operation
+ // that we preserve the executor of the user-supplied completion handler.
+ // The std::bind function will not do this for us, so we must do this by
+ // first obtaining the completion handler's associated executor (defaulting
+ // to the I/O executor - in this case the executor of the socket - if the
+ // completion handler does not have its own) ...
+ auto executor = asio::get_associated_executor(
+ completion_handler, socket.get_executor());
+
+ // ... and then binding this executor to our adapted completion handler
+ // using the asio::bind_executor function.
+ std::size_t length = std::strlen(message);
+ if (length == 0)
+ {
+ asio::post(
+ asio::bind_executor(executor,
+ std::bind(std::forward<decltype(completion_handler)>(
+ completion_handler), asio::error::invalid_argument)));
+ }
+ else
+ {
+ asio::async_write(socket,
+ asio::buffer(message, length),
+ asio::bind_executor(executor,
+ std::bind(std::forward<decltype(completion_handler)>(
+ completion_handler), std::placeholders::_1)));
+ }
+ };
+
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ initiation, token, std::ref(socket), message);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, "",
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_message(socket, "", asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_message(
+ socket, "", asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Message sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/operations/composed_5.cpp b/3rdparty/asio/src/examples/cpp14/operations/composed_5.cpp
new file mode 100644
index 00000000000..c28cc8af129
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/operations/composed_5.cpp
@@ -0,0 +1,280 @@
+//
+// composed_5.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This composed operation automatically serialises a message, using its I/O
+// streams insertion operator, before sending it on the socket. To do this, it
+// must allocate a buffer for the encoded message and ensure this buffer's
+// validity until the underlying async_write operation completes.
+
+template <typename T, typename CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const T& message, CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++14 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_initiate.
+{
+ // In addition to determining the mechanism by which an asynchronous
+ // operation delivers its result, a completion token also determines the time
+ // when the operation commences. For example, when the completion token is a
+ // simple callback the operation commences before the initiating function
+ // returns. However, if the completion token's delivery mechanism uses a
+ // future, we might instead want to defer initiation of the operation until
+ // the returned future object is waited upon.
+ //
+ // To enable this, when implementing an asynchronous operation we must
+ // package the initiation step as a function object. The initiation function
+ // object's call operator is passed the concrete completion handler produced
+ // by the completion token. This completion handler matches the asynchronous
+ // operation's completion handler signature, which in this example is:
+ //
+ // void(std::error_code error)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments in the lambda capture set. However, we should prefer to
+ // propagate them as function call arguments as this allows the completion
+ // token to optimise how they are passed. For example, a lazy future which
+ // defers initiation would need to make a decay-copy of the arguments, but
+ // when using a simple callback the arguments can be trivially forwarded
+ // straight through.)
+ auto initiation = [](auto&& completion_handler,
+ tcp::socket& socket, std::unique_ptr<std::string> encoded_message)
+ {
+ // In this example, the composed operation's intermediate completion
+ // handler is implemented as a hand-crafted function object, rather than
+ // using a lambda or std::bind.
+ struct intermediate_completion_handler
+ {
+ // The intermediate completion handler holds a reference to the socket so
+ // that it can obtain the I/O executor (see get_executor below).
+ tcp::socket& socket_;
+
+ // The allocated buffer for the encoded message. The std::unique_ptr
+ // smart pointer is move-only, and as a consequence our intermediate
+ // completion handler is also move-only.
+ std::unique_ptr<std::string> encoded_message_;
+
+ // The user-supplied completion handler.
+ typename std::decay<decltype(completion_handler)>::type handler_;
+
+ // The function call operator matches the completion signature of the
+ // async_write operation.
+ void operator()(const std::error_code& error, std::size_t /*n*/)
+ {
+ // Deallocate the encoded message before calling the user-supplied
+ // completion handler.
+ encoded_message_.reset();
+
+ // Call the user-supplied handler with the result of the operation.
+ // The arguments must match the completion signature of our composed
+ // operation.
+ handler_(error);
+ }
+
+ // It is essential to the correctness of our composed operation that we
+ // preserve the executor of the user-supplied completion handler. With a
+ // hand-crafted function object we can do this by defining a nested type
+ // executor_type and member function get_executor. These obtain the
+ // completion handler's associated executor, and default to the I/O
+ // executor - in this case the executor of the socket - if the completion
+ // handler does not have its own.
+ using executor_type = asio::associated_executor_t<
+ typename std::decay<decltype(completion_handler)>::type,
+ tcp::socket::executor_type>;
+
+ executor_type get_executor() const noexcept
+ {
+ return asio::get_associated_executor(
+ handler_, socket_.get_executor());
+ }
+
+ // Although not necessary for correctness, we may also preserve the
+ // allocator of the user-supplied completion handler. This is achieved by
+ // defining a nested type allocator_type and member function
+ // get_allocator. These obtain the completion handler's associated
+ // allocator, and default to std::allocator<void> if the completion
+ // handler does not have its own.
+ using allocator_type = asio::associated_allocator_t<
+ typename std::decay<decltype(completion_handler)>::type,
+ std::allocator<void>>;
+
+ allocator_type get_allocator() const noexcept
+ {
+ return asio::get_associated_allocator(
+ handler_, std::allocator<void>{});
+ }
+ };
+
+ // Initiate the underlying async_write operation using our intermediate
+ // completion handler.
+ auto encoded_message_buffer = asio::buffer(*encoded_message);
+ asio::async_write(socket, encoded_message_buffer,
+ intermediate_completion_handler{socket, std::move(encoded_message),
+ std::forward<decltype(completion_handler)>(completion_handler)});
+ };
+
+ // Encode the message and copy it into an allocated buffer. The buffer will
+ // be maintained for the lifetime of the asynchronous operation.
+ std::ostringstream os;
+ os << message;
+ std::unique_ptr<std::string> encoded_message(new std::string(os.str()));
+
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ initiation, token, std::ref(socket),
+ std::move(encoded_message));
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, 123456,
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_message(socket,
+ std::string("abcdef"), asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_message(
+ socket, 654.321, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Message sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/operations/composed_6.cpp b/3rdparty/asio/src/examples/cpp14/operations/composed_6.cpp
new file mode 100644
index 00000000000..82c0cd72237
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/operations/composed_6.cpp
@@ -0,0 +1,340 @@
+//
+// composed_6.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/deferred.hpp>
+#include <asio/executor_work_guard.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/steady_timer.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This composed operation shows composition of multiple underlying operations.
+// It automatically serialises a message, using its I/O streams insertion
+// operator, before sending it N times on the socket. To do this, it must
+// allocate a buffer for the encoded message and ensure this buffer's validity
+// until all underlying async_write operation complete. A one second delay is
+// inserted prior to each write operation, using a steady_timer.
+
+template <typename T, typename CompletionToken>
+auto async_write_messages(tcp::socket& socket,
+ const T& message, std::size_t repeat_count,
+ CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++14 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_initiate.
+{
+ // In addition to determining the mechanism by which an asynchronous
+ // operation delivers its result, a completion token also determines the time
+ // when the operation commences. For example, when the completion token is a
+ // simple callback the operation commences before the initiating function
+ // returns. However, if the completion token's delivery mechanism uses a
+ // future, we might instead want to defer initiation of the operation until
+ // the returned future object is waited upon.
+ //
+ // To enable this, when implementing an asynchronous operation we must
+ // package the initiation step as a function object. The initiation function
+ // object's call operator is passed the concrete completion handler produced
+ // by the completion token. This completion handler matches the asynchronous
+ // operation's completion handler signature, which in this example is:
+ //
+ // void(std::error_code error)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments in the lambda capture set. However, we should prefer to
+ // propagate them as function call arguments as this allows the completion
+ // token to optimise how they are passed. For example, a lazy future which
+ // defers initiation would need to make a decay-copy of the arguments, but
+ // when using a simple callback the arguments can be trivially forwarded
+ // straight through.)
+ auto initiation = [](auto&& completion_handler, tcp::socket& socket,
+ std::unique_ptr<std::string> encoded_message, std::size_t repeat_count,
+ std::unique_ptr<asio::steady_timer> delay_timer)
+ {
+ // In this example, the composed operation's intermediate completion
+ // handler is implemented as a hand-crafted function object.
+ struct intermediate_completion_handler
+ {
+ // The intermediate completion handler holds a reference to the socket as
+ // it is used for multiple async_write operations, as well as for
+ // obtaining the I/O executor (see get_executor below).
+ tcp::socket& socket_;
+
+ // The allocated buffer for the encoded message. The std::unique_ptr
+ // smart pointer is move-only, and as a consequence our intermediate
+ // completion handler is also move-only.
+ std::unique_ptr<std::string> encoded_message_;
+
+ // The repeat count remaining.
+ std::size_t repeat_count_;
+
+ // A steady timer used for introducing a delay.
+ std::unique_ptr<asio::steady_timer> delay_timer_;
+
+ // To manage the cycle between the multiple underlying asychronous
+ // operations, our intermediate completion handler is implemented as a
+ // state machine.
+ enum { starting, waiting, writing } state_;
+
+ // As our composed operation performs multiple underlying I/O operations,
+ // we should maintain a work object against the I/O executor. This tells
+ // the I/O executor that there is still more work to come in the future.
+ asio::executor_work_guard<tcp::socket::executor_type> io_work_;
+
+ // The user-supplied completion handler, called once only on completion
+ // of the entire composed operation.
+ typename std::decay<decltype(completion_handler)>::type handler_;
+
+ // By having a default value for the second argument, this function call
+ // operator matches the completion signature of both the async_write and
+ // steady_timer::async_wait operations.
+ void operator()(const std::error_code& error, std::size_t = 0)
+ {
+ if (!error)
+ {
+ switch (state_)
+ {
+ case starting:
+ case writing:
+ if (repeat_count_ > 0)
+ {
+ --repeat_count_;
+ state_ = waiting;
+ delay_timer_->expires_after(std::chrono::seconds(1));
+ delay_timer_->async_wait(std::move(*this));
+ return; // Composed operation not yet complete.
+ }
+ break; // Composed operation complete, continue below.
+ case waiting:
+ state_ = writing;
+ asio::async_write(socket_,
+ asio::buffer(*encoded_message_), std::move(*this));
+ return; // Composed operation not yet complete.
+ }
+ }
+
+ // This point is reached only on completion of the entire composed
+ // operation.
+
+ // We no longer have any future work coming for the I/O executor.
+ io_work_.reset();
+
+ // Deallocate the encoded message before calling the user-supplied
+ // completion handler.
+ encoded_message_.reset();
+
+ // Call the user-supplied handler with the result of the operation.
+ handler_(error);
+ }
+
+ // It is essential to the correctness of our composed operation that we
+ // preserve the executor of the user-supplied completion handler. With a
+ // hand-crafted function object we can do this by defining a nested type
+ // executor_type and member function get_executor. These obtain the
+ // completion handler's associated executor, and default to the I/O
+ // executor - in this case the executor of the socket - if the completion
+ // handler does not have its own.
+ using executor_type = asio::associated_executor_t<
+ typename std::decay<decltype(completion_handler)>::type,
+ tcp::socket::executor_type>;
+
+ executor_type get_executor() const noexcept
+ {
+ return asio::get_associated_executor(
+ handler_, socket_.get_executor());
+ }
+
+ // Although not necessary for correctness, we may also preserve the
+ // allocator of the user-supplied completion handler. This is achieved by
+ // defining a nested type allocator_type and member function
+ // get_allocator. These obtain the completion handler's associated
+ // allocator, and default to std::allocator<void> if the completion
+ // handler does not have its own.
+ using allocator_type = asio::associated_allocator_t<
+ typename std::decay<decltype(completion_handler)>::type,
+ std::allocator<void>>;
+
+ allocator_type get_allocator() const noexcept
+ {
+ return asio::get_associated_allocator(
+ handler_, std::allocator<void>{});
+ }
+ };
+
+ // Initiate the underlying async_write operation using our intermediate
+ // completion handler.
+ auto encoded_message_buffer = asio::buffer(*encoded_message);
+ asio::async_write(socket, encoded_message_buffer,
+ intermediate_completion_handler{
+ socket, std::move(encoded_message),
+ repeat_count, std::move(delay_timer),
+ intermediate_completion_handler::starting,
+ asio::make_work_guard(socket.get_executor()),
+ std::forward<decltype(completion_handler)>(completion_handler)});
+ };
+
+ // Encode the message and copy it into an allocated buffer. The buffer will
+ // be maintained for the lifetime of the composed asynchronous operation.
+ std::ostringstream os;
+ os << message;
+ std::unique_ptr<std::string> encoded_message(new std::string(os.str()));
+
+ // Create a steady_timer to be used for the delay between messages.
+ std::unique_ptr<asio::steady_timer> delay_timer(
+ new asio::steady_timer(socket.get_executor()));
+
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ initiation, token, std::ref(socket),
+ std::move(encoded_message), repeat_count,
+ std::move(delay_timer));
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_messages(socket, "Testing callback\r\n", 5,
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_messages(socket,
+ "Testing deferred\r\n", 5, asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_messages(
+ socket, "Testing future\r\n", 5, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Messages sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/operations/composed_7.cpp b/3rdparty/asio/src/examples/cpp14/operations/composed_7.cpp
new file mode 100644
index 00000000000..841249bef5b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/operations/composed_7.cpp
@@ -0,0 +1,261 @@
+//
+// composed_7.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/compose.hpp>
+#include <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/steady_timer.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_compose function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This composed operation shows composition of multiple underlying operations.
+// It automatically serialises a message, using its I/O streams insertion
+// operator, before sending it N times on the socket. To do this, it must
+// allocate a buffer for the encoded message and ensure this buffer's validity
+// until all underlying async_write operation complete. A one second delay is
+// inserted prior to each write operation, using a steady_timer.
+
+template <typename T, typename CompletionToken>
+auto async_write_messages(tcp::socket& socket,
+ const T& message, std::size_t repeat_count,
+ CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++14 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_compose.
+{
+ // Encode the message and copy it into an allocated buffer. The buffer will
+ // be maintained for the lifetime of the composed asynchronous operation.
+ std::ostringstream os;
+ os << message;
+ std::unique_ptr<std::string> encoded_message(new std::string(os.str()));
+
+ // Create a steady_timer to be used for the delay between messages.
+ std::unique_ptr<asio::steady_timer> delay_timer(
+ new asio::steady_timer(socket.get_executor()));
+
+ // To manage the cycle between the multiple underlying asychronous
+ // operations, our implementation is a state machine.
+ enum { starting, waiting, writing };
+
+ // The asio::async_compose function takes:
+ //
+ // - our asynchronous operation implementation,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any I/O objects (or executors) used by the operation
+ //
+ // It then wraps our implementation, which is implemented here as a state
+ // machine in a lambda, in an intermediate completion handler that meets the
+ // requirements of a conforming asynchronous operation. This includes
+ // tracking outstanding work against the I/O executors associated with the
+ // operation (in this example, this is the socket's executor).
+ //
+ // The first argument to our lambda is a reference to the enclosing
+ // intermediate completion handler. This intermediate completion handler is
+ // provided for us by the asio::async_compose function, and takes care
+ // of all the details required to implement a conforming asynchronous
+ // operation. When calling an underlying asynchronous operation, we pass it
+ // this enclosing intermediate completion handler as the completion token.
+ //
+ // All arguments to our lambda after the first must be defaulted to allow the
+ // state machine to be started, as well as to allow the completion handler to
+ // match the completion signature of both the async_write and
+ // steady_timer::async_wait operations.
+ return asio::async_compose<
+ CompletionToken, void(std::error_code)>(
+ [
+ // The implementation holds a reference to the socket as it is used for
+ // multiple async_write operations.
+ &socket,
+
+ // The allocated buffer for the encoded message. The std::unique_ptr
+ // smart pointer is move-only, and as a consequence our lambda
+ // implementation is also move-only.
+ encoded_message = std::move(encoded_message),
+
+ // The repeat count remaining.
+ repeat_count,
+
+ // A steady timer used for introducing a delay.
+ delay_timer = std::move(delay_timer),
+
+ // To manage the cycle between the multiple underlying asychronous
+ // operations, our implementation is a state machine.
+ state = starting
+ ]
+ (
+ auto& self,
+ const std::error_code& error = {},
+ std::size_t = 0
+ ) mutable
+ {
+ if (!error)
+ {
+ switch (state)
+ {
+ case starting:
+ case writing:
+ if (repeat_count > 0)
+ {
+ --repeat_count;
+ state = waiting;
+ delay_timer->expires_after(std::chrono::seconds(1));
+ delay_timer->async_wait(std::move(self));
+ return; // Composed operation not yet complete.
+ }
+ break; // Composed operation complete, continue below.
+ case waiting:
+ state = writing;
+ asio::async_write(socket,
+ asio::buffer(*encoded_message), std::move(self));
+ return; // Composed operation not yet complete.
+ }
+ }
+
+ // This point is reached only on completion of the entire composed
+ // operation.
+
+ // Deallocate the encoded message and delay timer before calling the
+ // user-supplied completion handler.
+ encoded_message.reset();
+ delay_timer.reset();
+
+ // Call the user-supplied handler with the result of the operation.
+ self.complete(error);
+ },
+ token, socket);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_messages(socket, "Testing callback\r\n", 5,
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_messages(socket,
+ "Testing deferred\r\n", 5, asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_messages(
+ socket, "Testing future\r\n", 5, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Messages sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/operations/composed_8.cpp b/3rdparty/asio/src/examples/cpp14/operations/composed_8.cpp
new file mode 100644
index 00000000000..d1f46ddce54
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/operations/composed_8.cpp
@@ -0,0 +1,254 @@
+//
+// composed_8.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/compose.hpp>
+#include <asio/coroutine.hpp>
+#include <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/steady_timer.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_compose function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This composed operation shows composition of multiple underlying operations,
+// using asio's stackless coroutines support to express the flow of control. It
+// automatically serialises a message, using its I/O streams insertion
+// operator, before sending it N times on the socket. To do this, it must
+// allocate a buffer for the encoded message and ensure this buffer's validity
+// until all underlying async_write operation complete. A one second delay is
+// inserted prior to each write operation, using a steady_timer.
+
+#include <asio/yield.hpp>
+
+template <typename T, typename CompletionToken>
+auto async_write_messages(tcp::socket& socket,
+ const T& message, std::size_t repeat_count,
+ CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++14 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_compose.
+{
+ // Encode the message and copy it into an allocated buffer. The buffer will
+ // be maintained for the lifetime of the composed asynchronous operation.
+ std::ostringstream os;
+ os << message;
+ std::unique_ptr<std::string> encoded_message(new std::string(os.str()));
+
+ // Create a steady_timer to be used for the delay between messages.
+ std::unique_ptr<asio::steady_timer> delay_timer(
+ new asio::steady_timer(socket.get_executor()));
+
+ // The asio::async_compose function takes:
+ //
+ // - our asynchronous operation implementation,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any I/O objects (or executors) used by the operation
+ //
+ // It then wraps our implementation, which is implemented here as a stackless
+ // coroutine in a lambda, in an intermediate completion handler that meets the
+ // requirements of a conforming asynchronous operation. This includes
+ // tracking outstanding work against the I/O executors associated with the
+ // operation (in this example, this is the socket's executor).
+ //
+ // The first argument to our lambda is a reference to the enclosing
+ // intermediate completion handler. This intermediate completion handler is
+ // provided for us by the asio::async_compose function, and takes care
+ // of all the details required to implement a conforming asynchronous
+ // operation. When calling an underlying asynchronous operation, we pass it
+ // this enclosing intermediate completion handler as the completion token.
+ //
+ // All arguments to our lambda after the first must be defaulted to allow the
+ // state machine to be started, as well as to allow the completion handler to
+ // match the completion signature of both the async_write and
+ // steady_timer::async_wait operations.
+ return asio::async_compose<
+ CompletionToken, void(std::error_code)>(
+ [
+ // The implementation holds a reference to the socket as it is used for
+ // multiple async_write operations.
+ &socket,
+
+ // The allocated buffer for the encoded message. The std::unique_ptr
+ // smart pointer is move-only, and as a consequence our lambda
+ // implementation is also move-only.
+ encoded_message = std::move(encoded_message),
+
+ // The repeat count remaining.
+ repeat_count,
+
+ // A steady timer used for introducing a delay.
+ delay_timer = std::move(delay_timer),
+
+ // The coroutine state.
+ coro = asio::coroutine()
+ ]
+ (
+ auto& self,
+ const std::error_code& error = {},
+ std::size_t = 0
+ ) mutable
+ {
+ reenter (coro)
+ {
+ while (repeat_count > 0)
+ {
+ --repeat_count;
+
+ delay_timer->expires_after(std::chrono::seconds(1));
+ yield delay_timer->async_wait(std::move(self));
+ if (error)
+ break;
+
+ yield asio::async_write(socket,
+ asio::buffer(*encoded_message), std::move(self));
+ if (error)
+ break;
+ }
+
+ // Deallocate the encoded message and delay timer before calling the
+ // user-supplied completion handler.
+ encoded_message.reset();
+ delay_timer.reset();
+
+ // Call the user-supplied handler with the result of the operation.
+ self.complete(error);
+ }
+ },
+ token, socket);
+}
+
+#include <asio/unyield.hpp>
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_messages(socket, "Testing callback\r\n", 5,
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_write_messages(socket,
+ "Testing deferred\r\n", 5, asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_messages(
+ socket, "Testing future\r\n", 5, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Messages sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp14/parallel_group/parallel_sort.cpp b/3rdparty/asio/src/examples/cpp14/parallel_group/parallel_sort.cpp
new file mode 100644
index 00000000000..8bb7cdfd719
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/parallel_group/parallel_sort.cpp
@@ -0,0 +1,133 @@
+//
+// parallel_sort.cpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/parallel_group.hpp>
+#include <algorithm>
+#include <chrono>
+#include <functional>
+#include <iostream>
+#include <random>
+
+template <
+ typename Executor,
+ typename RandomAccessIterator,
+ ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
+auto parallel_sort(
+ Executor executor,
+ RandomAccessIterator begin,
+ RandomAccessIterator end,
+ CompletionToken&& token);
+
+template <
+ typename Executor,
+ typename RandomAccessIterator>
+void parallel_sort_impl(
+ Executor executor,
+ RandomAccessIterator begin,
+ RandomAccessIterator end,
+ std::function<void()> continuation)
+{
+ std::size_t n = end - begin;
+ if (n <= 16384)
+ {
+ asio::post(executor,
+ [=]
+ {
+ std::sort(begin, end);
+ continuation();
+ }
+ );
+ }
+ else
+ {
+ asio::experimental::make_parallel_group(
+ [=](auto token)
+ {
+ return parallel_sort(executor, begin, begin + n / 2, token);
+ },
+ [=](auto token)
+ {
+ return parallel_sort(executor, begin + n / 2, end, token);
+ }
+ ).async_wait(
+ asio::experimental::wait_for_all(),
+ [=](std::array<std::size_t, 2>)
+ {
+ std::inplace_merge(begin, begin + n / 2, end);
+ continuation();
+ }
+ );
+ }
+}
+
+template <
+ typename Executor,
+ typename RandomAccessIterator,
+ ASIO_COMPLETION_TOKEN_FOR(void()) CompletionToken>
+auto parallel_sort(
+ Executor executor,
+ RandomAccessIterator begin,
+ RandomAccessIterator end,
+ CompletionToken&& token)
+{
+ return asio::async_compose<CompletionToken, void()>(
+ [=](auto& self, auto... args)
+ {
+ if (sizeof...(args) == 0)
+ {
+ using self_type = std::decay_t<decltype(self)>;
+ parallel_sort_impl(executor, begin, end,
+ [self = std::make_shared<self_type>(std::move(self))]
+ {
+ asio::dispatch(
+ asio::append(
+ std::move(*self), 0));
+ }
+ );
+ }
+ else
+ {
+ self.complete();
+ }
+ },
+ token
+ );
+}
+
+int main()
+{
+ asio::thread_pool pool(4);
+
+ std::vector<int> values(100'000'000);
+
+ std::random_device random_device;
+ std::mt19937 rng(random_device());
+ std::uniform_int_distribution<int> dist(1, 1'000'000);
+ std::generate(values.begin(), values.end(), [&]{ return dist(rng); });
+
+ std::cout << "starting sort\n";
+
+ auto begin = std::chrono::high_resolution_clock::now();
+
+ parallel_sort(
+ pool.get_executor(),
+ values.begin(),
+ values.end(),
+ asio::use_future
+ ).get();
+
+ auto end = std::chrono::high_resolution_clock::now();
+
+ auto duration = end - begin;
+ std::cout << "sort took "
+ << std::chrono::duration_cast<std::chrono::microseconds>(duration).count()
+ << " microseconds\n";
+}
diff --git a/3rdparty/asio/src/examples/cpp14/parallel_group/ranged_wait_for_all.cpp b/3rdparty/asio/src/examples/cpp14/parallel_group/ranged_wait_for_all.cpp
new file mode 100644
index 00000000000..18772884072
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/parallel_group/ranged_wait_for_all.cpp
@@ -0,0 +1,70 @@
+//
+// ranged_wait_for_all.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/parallel_group.hpp>
+#include <iostream>
+#include <vector>
+
+#ifdef ASIO_HAS_POSIX_STREAM_DESCRIPTOR
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::posix::stream_descriptor out(ctx, ::dup(STDOUT_FILENO));
+ asio::posix::stream_descriptor err(ctx, ::dup(STDERR_FILENO));
+
+ using op_type = decltype(
+ out.async_write_some(
+ asio::buffer("", 0),
+ asio::deferred
+ )
+ );
+
+ std::vector<op_type> ops;
+
+ ops.push_back(
+ out.async_write_some(
+ asio::buffer("first\r\n", 7),
+ asio::deferred
+ )
+ );
+
+ ops.push_back(
+ err.async_write_some(
+ asio::buffer("second\r\n", 8),
+ asio::deferred
+ )
+ );
+
+ asio::experimental::make_parallel_group(ops).async_wait(
+ asio::experimental::wait_for_all(),
+ [](
+ std::vector<std::size_t> completion_order,
+ std::vector<std::error_code> ec,
+ std::vector<std::size_t> n
+ )
+ {
+ for (std::size_t i = 0; i < completion_order.size(); ++i)
+ {
+ std::size_t idx = completion_order[i];
+ std::cout << "operation " << idx << " finished: ";
+ std::cout << ec[idx] << ", " << n[idx] << "\n";
+ }
+ }
+ );
+
+ ctx.run();
+}
+
+#else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+int main() {}
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
diff --git a/3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_all.cpp b/3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_all.cpp
new file mode 100644
index 00000000000..f007326326b
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_all.cpp
@@ -0,0 +1,64 @@
+//
+// wait_for_all.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/parallel_group.hpp>
+#include <iostream>
+
+#ifdef ASIO_HAS_POSIX_STREAM_DESCRIPTOR
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::posix::stream_descriptor in(ctx, ::dup(STDIN_FILENO));
+ asio::steady_timer timer(ctx, std::chrono::seconds(5));
+
+ char data[1024];
+
+ asio::experimental::make_parallel_group(
+ [&](auto token)
+ {
+ return in.async_read_some(asio::buffer(data), token);
+ },
+ [&](auto token)
+ {
+ return timer.async_wait(token);
+ }
+ ).async_wait(
+ asio::experimental::wait_for_all(),
+ [](
+ std::array<std::size_t, 2> completion_order,
+ std::error_code ec1, std::size_t n1,
+ std::error_code ec2
+ )
+ {
+ switch (completion_order[0])
+ {
+ case 0:
+ {
+ std::cout << "descriptor finished: " << ec1 << ", " << n1 << "\n";
+ }
+ break;
+ case 1:
+ {
+ std::cout << "timer finished: " << ec2 << "\n";
+ }
+ break;
+ }
+ }
+ );
+
+ ctx.run();
+}
+
+#else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+int main() {}
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
diff --git a/3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_one.cpp b/3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_one.cpp
new file mode 100644
index 00000000000..7b25e26d678
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_one.cpp
@@ -0,0 +1,64 @@
+//
+// wait_for_one.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/parallel_group.hpp>
+#include <iostream>
+
+#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::posix::stream_descriptor in(ctx, ::dup(STDIN_FILENO));
+ asio::steady_timer timer(ctx, std::chrono::seconds(5));
+
+ char data[1024];
+
+ asio::experimental::make_parallel_group(
+ [&](auto token)
+ {
+ return in.async_read_some(asio::buffer(data), token);
+ },
+ [&](auto token)
+ {
+ return timer.async_wait(token);
+ }
+ ).async_wait(
+ asio::experimental::wait_for_one(),
+ [](
+ std::array<std::size_t, 2> completion_order,
+ std::error_code ec1, std::size_t n1,
+ std::error_code ec2
+ )
+ {
+ switch (completion_order[0])
+ {
+ case 0:
+ {
+ std::cout << "descriptor finished: " << ec1 << ", " << n1 << "\n";
+ }
+ break;
+ case 1:
+ {
+ std::cout << "timer finished: " << ec2 << "\n";
+ }
+ break;
+ }
+ }
+ );
+
+ ctx.run();
+}
+
+#else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+int main() {}
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
diff --git a/3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_one_error.cpp b/3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_one_error.cpp
new file mode 100644
index 00000000000..c157d0b3355
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_one_error.cpp
@@ -0,0 +1,64 @@
+//
+// wait_for_one_error.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/parallel_group.hpp>
+#include <iostream>
+
+#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::posix::stream_descriptor in(ctx, ::dup(STDIN_FILENO));
+ asio::steady_timer timer(ctx, std::chrono::seconds(5));
+
+ char data[1024];
+
+ asio::experimental::make_parallel_group(
+ [&](auto token)
+ {
+ return in.async_read_some(asio::buffer(data), token);
+ },
+ [&](auto token)
+ {
+ return timer.async_wait(token);
+ }
+ ).async_wait(
+ asio::experimental::wait_for_one_error(),
+ [](
+ std::array<std::size_t, 2> completion_order,
+ std::error_code ec1, std::size_t n1,
+ std::error_code ec2
+ )
+ {
+ switch (completion_order[0])
+ {
+ case 0:
+ {
+ std::cout << "descriptor finished: " << ec1 << ", " << n1 << "\n";
+ }
+ break;
+ case 1:
+ {
+ std::cout << "timer finished: " << ec2 << "\n";
+ }
+ break;
+ }
+ }
+ );
+
+ ctx.run();
+}
+
+#else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+int main() {}
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
diff --git a/3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_one_success.cpp b/3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_one_success.cpp
new file mode 100644
index 00000000000..a328600a9fc
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp14/parallel_group/wait_for_one_success.cpp
@@ -0,0 +1,64 @@
+//
+// wait_for_one_error.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/parallel_group.hpp>
+#include <iostream>
+
+#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+
+int main()
+{
+ asio::io_context ctx;
+
+ asio::posix::stream_descriptor in(ctx, ::dup(STDIN_FILENO));
+ asio::steady_timer timer(ctx, std::chrono::seconds(5));
+
+ char data[1024];
+
+ asio::experimental::make_parallel_group(
+ [&](auto token)
+ {
+ return in.async_read_some(asio::buffer(data), token);
+ },
+ [&](auto token)
+ {
+ return timer.async_wait(token);
+ }
+ ).async_wait(
+ asio::experimental::wait_for_one_success(),
+ [](
+ std::array<std::size_t, 2> completion_order,
+ std::error_code ec1, std::size_t n1,
+ std::error_code ec2
+ )
+ {
+ switch (completion_order[0])
+ {
+ case 0:
+ {
+ std::cout << "descriptor finished: " << ec1 << ", " << n1 << "\n";
+ }
+ break;
+ case 1:
+ {
+ std::cout << "timer finished: " << ec2 << "\n";
+ }
+ break;
+ }
+ }
+ );
+
+ ctx.run();
+}
+
+#else // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
+int main() {}
+#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR)
diff --git a/3rdparty/asio/src/examples/cpp17/Makefile.am b/3rdparty/asio/src/examples/cpp17/Makefile.am
new file mode 100644
index 00000000000..c3a571c02f4
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp17/Makefile.am
@@ -0,0 +1,37 @@
+AUTOMAKE_OPTIONS = subdir-objects
+
+if SEPARATE_COMPILATION
+noinst_LIBRARIES = libasio.a
+libasio_a_SOURCES = ../../asio.cpp
+if HAVE_OPENSSL
+libasio_a_SOURCES += ../../asio_ssl.cpp
+endif
+LDADD = libasio.a
+endif
+
+if HAVE_COROUTINES
+noinst_PROGRAMS = \
+ coroutines_ts/chat_server \
+ coroutines_ts/echo_server \
+ coroutines_ts/echo_server_with_default \
+ coroutines_ts/echo_server_with_as_single_default \
+ coroutines_ts/echo_server_with_as_tuple_default \
+ coroutines_ts/refactored_echo_server
+endif
+
+AM_CXXFLAGS = -I$(srcdir)/../../../include
+
+if HAVE_COROUTINES
+coroutines_ts_chat_server_SOURCES = coroutines_ts/chat_server.cpp
+coroutines_ts_echo_server_SOURCES = coroutines_ts/echo_server.cpp
+coroutines_ts_echo_server_with_default_SOURCES = coroutines_ts/echo_server_with_default.cpp
+coroutines_ts_echo_server_with_as_single_default_SOURCES = coroutines_ts/echo_server_with_as_single_default.cpp
+coroutines_ts_echo_server_with_as_tuple_default_SOURCES = coroutines_ts/echo_server_with_as_tuple_default.cpp
+coroutines_ts_refactored_echo_server_SOURCES = coroutines_ts/refactored_echo_server.cpp
+endif
+
+EXTRA_DIST = \
+ coroutines_ts/range_based_for.cpp
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
diff --git a/3rdparty/asio/src/examples/cpp17/Makefile.in b/3rdparty/asio/src/examples/cpp17/Makefile.in
new file mode 100644
index 00000000000..db35ec4f320
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp17/Makefile.in
@@ -0,0 +1,738 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__append_1 = ../../asio_ssl.cpp
+@HAVE_COROUTINES_TRUE@noinst_PROGRAMS = \
+@HAVE_COROUTINES_TRUE@ coroutines_ts/chat_server$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines_ts/echo_server$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines_ts/echo_server_with_default$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines_ts/echo_server_with_as_single_default$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines_ts/echo_server_with_as_tuple_default$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines_ts/refactored_echo_server$(EXEEXT)
+subdir = src/examples/cpp17
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+PROGRAMS = $(noinst_PROGRAMS)
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libasio_a_AR = $(AR) $(ARFLAGS)
+libasio_a_LIBADD =
+am__libasio_a_SOURCES_DIST = ../../asio.cpp ../../asio_ssl.cpp
+am__dirstamp = $(am__leading_dot)dirstamp
+@HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__objects_1 = ../../asio_ssl.$(OBJEXT)
+@SEPARATE_COMPILATION_TRUE@am_libasio_a_OBJECTS = \
+@SEPARATE_COMPILATION_TRUE@ ../../asio.$(OBJEXT) \
+@SEPARATE_COMPILATION_TRUE@ $(am__objects_1)
+libasio_a_OBJECTS = $(am_libasio_a_OBJECTS)
+am__coroutines_ts_chat_server_SOURCES_DIST = \
+ coroutines_ts/chat_server.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_ts_chat_server_OBJECTS = \
+@HAVE_COROUTINES_TRUE@ coroutines_ts/chat_server.$(OBJEXT)
+coroutines_ts_chat_server_OBJECTS = \
+ $(am_coroutines_ts_chat_server_OBJECTS)
+coroutines_ts_chat_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_ts_chat_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_ts_echo_server_SOURCES_DIST = \
+ coroutines_ts/echo_server.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_ts_echo_server_OBJECTS = \
+@HAVE_COROUTINES_TRUE@ coroutines_ts/echo_server.$(OBJEXT)
+coroutines_ts_echo_server_OBJECTS = \
+ $(am_coroutines_ts_echo_server_OBJECTS)
+coroutines_ts_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_ts_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_ts_echo_server_with_as_single_default_SOURCES_DIST = \
+ coroutines_ts/echo_server_with_as_single_default.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_ts_echo_server_with_as_single_default_OBJECTS = coroutines_ts/echo_server_with_as_single_default.$(OBJEXT)
+coroutines_ts_echo_server_with_as_single_default_OBJECTS = $(am_coroutines_ts_echo_server_with_as_single_default_OBJECTS)
+coroutines_ts_echo_server_with_as_single_default_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_ts_echo_server_with_as_single_default_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_ts_echo_server_with_as_tuple_default_SOURCES_DIST = \
+ coroutines_ts/echo_server_with_as_tuple_default.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_ts_echo_server_with_as_tuple_default_OBJECTS = coroutines_ts/echo_server_with_as_tuple_default.$(OBJEXT)
+coroutines_ts_echo_server_with_as_tuple_default_OBJECTS = \
+ $(am_coroutines_ts_echo_server_with_as_tuple_default_OBJECTS)
+coroutines_ts_echo_server_with_as_tuple_default_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_ts_echo_server_with_as_tuple_default_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_ts_echo_server_with_default_SOURCES_DIST = \
+ coroutines_ts/echo_server_with_default.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_ts_echo_server_with_default_OBJECTS = coroutines_ts/echo_server_with_default.$(OBJEXT)
+coroutines_ts_echo_server_with_default_OBJECTS = \
+ $(am_coroutines_ts_echo_server_with_default_OBJECTS)
+coroutines_ts_echo_server_with_default_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_ts_echo_server_with_default_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_ts_refactored_echo_server_SOURCES_DIST = \
+ coroutines_ts/refactored_echo_server.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_ts_refactored_echo_server_OBJECTS = coroutines_ts/refactored_echo_server.$(OBJEXT)
+coroutines_ts_refactored_echo_server_OBJECTS = \
+ $(am_coroutines_ts_refactored_echo_server_OBJECTS)
+coroutines_ts_refactored_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_ts_refactored_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ../../$(DEPDIR)/asio.Po \
+ ../../$(DEPDIR)/asio_ssl.Po \
+ coroutines_ts/$(DEPDIR)/chat_server.Po \
+ coroutines_ts/$(DEPDIR)/echo_server.Po \
+ coroutines_ts/$(DEPDIR)/echo_server_with_as_single_default.Po \
+ coroutines_ts/$(DEPDIR)/echo_server_with_as_tuple_default.Po \
+ coroutines_ts/$(DEPDIR)/echo_server_with_default.Po \
+ coroutines_ts/$(DEPDIR)/refactored_echo_server.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(libasio_a_SOURCES) $(coroutines_ts_chat_server_SOURCES) \
+ $(coroutines_ts_echo_server_SOURCES) \
+ $(coroutines_ts_echo_server_with_as_single_default_SOURCES) \
+ $(coroutines_ts_echo_server_with_as_tuple_default_SOURCES) \
+ $(coroutines_ts_echo_server_with_default_SOURCES) \
+ $(coroutines_ts_refactored_echo_server_SOURCES)
+DIST_SOURCES = $(am__libasio_a_SOURCES_DIST) \
+ $(am__coroutines_ts_chat_server_SOURCES_DIST) \
+ $(am__coroutines_ts_echo_server_SOURCES_DIST) \
+ $(am__coroutines_ts_echo_server_with_as_single_default_SOURCES_DIST) \
+ $(am__coroutines_ts_echo_server_with_as_tuple_default_SOURCES_DIST) \
+ $(am__coroutines_ts_echo_server_with_default_SOURCES_DIST) \
+ $(am__coroutines_ts_refactored_echo_server_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = subdir-objects
+@SEPARATE_COMPILATION_TRUE@noinst_LIBRARIES = libasio.a
+@SEPARATE_COMPILATION_TRUE@libasio_a_SOURCES = ../../asio.cpp \
+@SEPARATE_COMPILATION_TRUE@ $(am__append_1)
+@SEPARATE_COMPILATION_TRUE@LDADD = libasio.a
+AM_CXXFLAGS = -I$(srcdir)/../../../include
+@HAVE_COROUTINES_TRUE@coroutines_ts_chat_server_SOURCES = coroutines_ts/chat_server.cpp
+@HAVE_COROUTINES_TRUE@coroutines_ts_echo_server_SOURCES = coroutines_ts/echo_server.cpp
+@HAVE_COROUTINES_TRUE@coroutines_ts_echo_server_with_default_SOURCES = coroutines_ts/echo_server_with_default.cpp
+@HAVE_COROUTINES_TRUE@coroutines_ts_echo_server_with_as_single_default_SOURCES = coroutines_ts/echo_server_with_as_single_default.cpp
+@HAVE_COROUTINES_TRUE@coroutines_ts_echo_server_with_as_tuple_default_SOURCES = coroutines_ts/echo_server_with_as_tuple_default.cpp
+@HAVE_COROUTINES_TRUE@coroutines_ts_refactored_echo_server_SOURCES = coroutines_ts/refactored_echo_server.cpp
+EXTRA_DIST = \
+ coroutines_ts/range_based_for.cpp
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/examples/cpp17/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/examples/cpp17/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+ -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+../../$(am__dirstamp):
+ @$(MKDIR_P) ../..
+ @: > ../../$(am__dirstamp)
+../../$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) ../../$(DEPDIR)
+ @: > ../../$(DEPDIR)/$(am__dirstamp)
+../../asio.$(OBJEXT): ../../$(am__dirstamp) \
+ ../../$(DEPDIR)/$(am__dirstamp)
+../../asio_ssl.$(OBJEXT): ../../$(am__dirstamp) \
+ ../../$(DEPDIR)/$(am__dirstamp)
+
+libasio.a: $(libasio_a_OBJECTS) $(libasio_a_DEPENDENCIES) $(EXTRA_libasio_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libasio.a
+ $(AM_V_AR)$(libasio_a_AR) libasio.a $(libasio_a_OBJECTS) $(libasio_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libasio.a
+coroutines_ts/$(am__dirstamp):
+ @$(MKDIR_P) coroutines_ts
+ @: > coroutines_ts/$(am__dirstamp)
+coroutines_ts/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) coroutines_ts/$(DEPDIR)
+ @: > coroutines_ts/$(DEPDIR)/$(am__dirstamp)
+coroutines_ts/chat_server.$(OBJEXT): coroutines_ts/$(am__dirstamp) \
+ coroutines_ts/$(DEPDIR)/$(am__dirstamp)
+
+coroutines_ts/chat_server$(EXEEXT): $(coroutines_ts_chat_server_OBJECTS) $(coroutines_ts_chat_server_DEPENDENCIES) $(EXTRA_coroutines_ts_chat_server_DEPENDENCIES) coroutines_ts/$(am__dirstamp)
+ @rm -f coroutines_ts/chat_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_ts_chat_server_OBJECTS) $(coroutines_ts_chat_server_LDADD) $(LIBS)
+coroutines_ts/echo_server.$(OBJEXT): coroutines_ts/$(am__dirstamp) \
+ coroutines_ts/$(DEPDIR)/$(am__dirstamp)
+
+coroutines_ts/echo_server$(EXEEXT): $(coroutines_ts_echo_server_OBJECTS) $(coroutines_ts_echo_server_DEPENDENCIES) $(EXTRA_coroutines_ts_echo_server_DEPENDENCIES) coroutines_ts/$(am__dirstamp)
+ @rm -f coroutines_ts/echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_ts_echo_server_OBJECTS) $(coroutines_ts_echo_server_LDADD) $(LIBS)
+coroutines_ts/echo_server_with_as_single_default.$(OBJEXT): \
+ coroutines_ts/$(am__dirstamp) \
+ coroutines_ts/$(DEPDIR)/$(am__dirstamp)
+
+coroutines_ts/echo_server_with_as_single_default$(EXEEXT): $(coroutines_ts_echo_server_with_as_single_default_OBJECTS) $(coroutines_ts_echo_server_with_as_single_default_DEPENDENCIES) $(EXTRA_coroutines_ts_echo_server_with_as_single_default_DEPENDENCIES) coroutines_ts/$(am__dirstamp)
+ @rm -f coroutines_ts/echo_server_with_as_single_default$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_ts_echo_server_with_as_single_default_OBJECTS) $(coroutines_ts_echo_server_with_as_single_default_LDADD) $(LIBS)
+coroutines_ts/echo_server_with_as_tuple_default.$(OBJEXT): \
+ coroutines_ts/$(am__dirstamp) \
+ coroutines_ts/$(DEPDIR)/$(am__dirstamp)
+
+coroutines_ts/echo_server_with_as_tuple_default$(EXEEXT): $(coroutines_ts_echo_server_with_as_tuple_default_OBJECTS) $(coroutines_ts_echo_server_with_as_tuple_default_DEPENDENCIES) $(EXTRA_coroutines_ts_echo_server_with_as_tuple_default_DEPENDENCIES) coroutines_ts/$(am__dirstamp)
+ @rm -f coroutines_ts/echo_server_with_as_tuple_default$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_ts_echo_server_with_as_tuple_default_OBJECTS) $(coroutines_ts_echo_server_with_as_tuple_default_LDADD) $(LIBS)
+coroutines_ts/echo_server_with_default.$(OBJEXT): \
+ coroutines_ts/$(am__dirstamp) \
+ coroutines_ts/$(DEPDIR)/$(am__dirstamp)
+
+coroutines_ts/echo_server_with_default$(EXEEXT): $(coroutines_ts_echo_server_with_default_OBJECTS) $(coroutines_ts_echo_server_with_default_DEPENDENCIES) $(EXTRA_coroutines_ts_echo_server_with_default_DEPENDENCIES) coroutines_ts/$(am__dirstamp)
+ @rm -f coroutines_ts/echo_server_with_default$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_ts_echo_server_with_default_OBJECTS) $(coroutines_ts_echo_server_with_default_LDADD) $(LIBS)
+coroutines_ts/refactored_echo_server.$(OBJEXT): \
+ coroutines_ts/$(am__dirstamp) \
+ coroutines_ts/$(DEPDIR)/$(am__dirstamp)
+
+coroutines_ts/refactored_echo_server$(EXEEXT): $(coroutines_ts_refactored_echo_server_OBJECTS) $(coroutines_ts_refactored_echo_server_DEPENDENCIES) $(EXTRA_coroutines_ts_refactored_echo_server_DEPENDENCIES) coroutines_ts/$(am__dirstamp)
+ @rm -f coroutines_ts/refactored_echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_ts_refactored_echo_server_OBJECTS) $(coroutines_ts_refactored_echo_server_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+ -rm -f ../../*.$(OBJEXT)
+ -rm -f coroutines_ts/*.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio_ssl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines_ts/$(DEPDIR)/chat_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines_ts/$(DEPDIR)/echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines_ts/$(DEPDIR)/echo_server_with_as_single_default.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines_ts/$(DEPDIR)/echo_server_with_as_tuple_default.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines_ts/$(DEPDIR)/echo_server_with_default.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines_ts/$(DEPDIR)/refactored_echo_server.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -rm -f ../../$(DEPDIR)/$(am__dirstamp)
+ -rm -f ../../$(am__dirstamp)
+ -rm -f coroutines_ts/$(DEPDIR)/$(am__dirstamp)
+ -rm -f coroutines_ts/$(am__dirstamp)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ../../$(DEPDIR)/asio.Po
+ -rm -f ../../$(DEPDIR)/asio_ssl.Po
+ -rm -f coroutines_ts/$(DEPDIR)/chat_server.Po
+ -rm -f coroutines_ts/$(DEPDIR)/echo_server.Po
+ -rm -f coroutines_ts/$(DEPDIR)/echo_server_with_as_single_default.Po
+ -rm -f coroutines_ts/$(DEPDIR)/echo_server_with_as_tuple_default.Po
+ -rm -f coroutines_ts/$(DEPDIR)/echo_server_with_default.Po
+ -rm -f coroutines_ts/$(DEPDIR)/refactored_echo_server.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ../../$(DEPDIR)/asio.Po
+ -rm -f ../../$(DEPDIR)/asio_ssl.Po
+ -rm -f coroutines_ts/$(DEPDIR)/chat_server.Po
+ -rm -f coroutines_ts/$(DEPDIR)/echo_server.Po
+ -rm -f coroutines_ts/$(DEPDIR)/echo_server_with_as_single_default.Po
+ -rm -f coroutines_ts/$(DEPDIR)/echo_server_with_as_tuple_default.Po
+ -rm -f coroutines_ts/$(DEPDIR)/echo_server_with_default.Po
+ -rm -f coroutines_ts/$(DEPDIR)/refactored_echo_server.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/3rdparty/asio/src/examples/cpp17/coroutines_ts/chat_server.cpp b/3rdparty/asio/src/examples/cpp17/coroutines_ts/chat_server.cpp
new file mode 100644
index 00000000000..cd5fba32486
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp17/coroutines_ts/chat_server.cpp
@@ -0,0 +1,222 @@
+//
+// chat_server.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <deque>
+#include <iostream>
+#include <list>
+#include <memory>
+#include <set>
+#include <string>
+#include <utility>
+#include <asio/awaitable.hpp>
+#include <asio/detached.hpp>
+#include <asio/co_spawn.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/read_until.hpp>
+#include <asio/redirect_error.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/steady_timer.hpp>
+#include <asio/use_awaitable.hpp>
+#include <asio/write.hpp>
+
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::redirect_error;
+using asio::use_awaitable;
+
+//----------------------------------------------------------------------
+
+class chat_participant
+{
+public:
+ virtual ~chat_participant() {}
+ virtual void deliver(const std::string& msg) = 0;
+};
+
+typedef std::shared_ptr<chat_participant> chat_participant_ptr;
+
+//----------------------------------------------------------------------
+
+class chat_room
+{
+public:
+ void join(chat_participant_ptr participant)
+ {
+ participants_.insert(participant);
+ for (auto msg: recent_msgs_)
+ participant->deliver(msg);
+ }
+
+ void leave(chat_participant_ptr participant)
+ {
+ participants_.erase(participant);
+ }
+
+ void deliver(const std::string& msg)
+ {
+ recent_msgs_.push_back(msg);
+ while (recent_msgs_.size() > max_recent_msgs)
+ recent_msgs_.pop_front();
+
+ for (auto participant: participants_)
+ participant->deliver(msg);
+ }
+
+private:
+ std::set<chat_participant_ptr> participants_;
+ enum { max_recent_msgs = 100 };
+ std::deque<std::string> recent_msgs_;
+};
+
+//----------------------------------------------------------------------
+
+class chat_session
+ : public chat_participant,
+ public std::enable_shared_from_this<chat_session>
+{
+public:
+ chat_session(tcp::socket socket, chat_room& room)
+ : socket_(std::move(socket)),
+ timer_(socket_.get_executor()),
+ room_(room)
+ {
+ timer_.expires_at(std::chrono::steady_clock::time_point::max());
+ }
+
+ void start()
+ {
+ room_.join(shared_from_this());
+
+ co_spawn(socket_.get_executor(),
+ [self = shared_from_this()]{ return self->reader(); },
+ detached);
+
+ co_spawn(socket_.get_executor(),
+ [self = shared_from_this()]{ return self->writer(); },
+ detached);
+ }
+
+ void deliver(const std::string& msg)
+ {
+ write_msgs_.push_back(msg);
+ timer_.cancel_one();
+ }
+
+private:
+ awaitable<void> reader()
+ {
+ try
+ {
+ for (std::string read_msg;;)
+ {
+ std::size_t n = co_await asio::async_read_until(socket_,
+ asio::dynamic_buffer(read_msg, 1024), "\n", use_awaitable);
+
+ room_.deliver(read_msg.substr(0, n));
+ read_msg.erase(0, n);
+ }
+ }
+ catch (std::exception&)
+ {
+ stop();
+ }
+ }
+
+ awaitable<void> writer()
+ {
+ try
+ {
+ while (socket_.is_open())
+ {
+ if (write_msgs_.empty())
+ {
+ asio::error_code ec;
+ co_await timer_.async_wait(redirect_error(use_awaitable, ec));
+ }
+ else
+ {
+ co_await asio::async_write(socket_,
+ asio::buffer(write_msgs_.front()), use_awaitable);
+ write_msgs_.pop_front();
+ }
+ }
+ }
+ catch (std::exception&)
+ {
+ stop();
+ }
+ }
+
+ void stop()
+ {
+ room_.leave(shared_from_this());
+ socket_.close();
+ timer_.cancel();
+ }
+
+ tcp::socket socket_;
+ asio::steady_timer timer_;
+ chat_room& room_;
+ std::deque<std::string> write_msgs_;
+};
+
+//----------------------------------------------------------------------
+
+awaitable<void> listener(tcp::acceptor acceptor)
+{
+ chat_room room;
+
+ for (;;)
+ {
+ std::make_shared<chat_session>(
+ co_await acceptor.async_accept(use_awaitable),
+ room
+ )->start();
+ }
+}
+
+//----------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc < 2)
+ {
+ std::cerr << "Usage: chat_server <port> [<port> ...]\n";
+ return 1;
+ }
+
+ asio::io_context io_context(1);
+
+ for (int i = 1; i < argc; ++i)
+ {
+ unsigned short port = std::atoi(argv[i]);
+ co_spawn(io_context,
+ listener(tcp::acceptor(io_context, {tcp::v4(), port})),
+ detached);
+ }
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server.cpp b/3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server.cpp
new file mode 100644
index 00000000000..a9532459f77
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server.cpp
@@ -0,0 +1,76 @@
+//
+// echo_server.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/co_spawn.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::use_awaitable;
+namespace this_coro = asio::this_coro;
+
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# define use_awaitable \
+ asio::use_awaitable_t(__FILE__, __LINE__, __PRETTY_FUNCTION__)
+#endif
+
+awaitable<void> echo(tcp::socket socket)
+{
+ try
+ {
+ char data[1024];
+ for (;;)
+ {
+ std::size_t n = co_await socket.async_read_some(asio::buffer(data), use_awaitable);
+ co_await async_write(socket, asio::buffer(data, n), use_awaitable);
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::printf("echo Exception: %s\n", e.what());
+ }
+}
+
+awaitable<void> listener()
+{
+ auto executor = co_await this_coro::executor;
+ tcp::acceptor acceptor(executor, {tcp::v4(), 55555});
+ for (;;)
+ {
+ tcp::socket socket = co_await acceptor.async_accept(use_awaitable);
+ co_spawn(executor, echo(std::move(socket)), detached);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ co_spawn(io_context, listener(), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server_with_as_single_default.cpp b/3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server_with_as_single_default.cpp
new file mode 100644
index 00000000000..4a692acc872
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server_with_as_single_default.cpp
@@ -0,0 +1,71 @@
+//
+// echo_server_with_as_single_default.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/experimental/as_single.hpp>
+#include <asio/co_spawn.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::experimental::as_single_t;
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::use_awaitable_t;
+using default_token = as_single_t<use_awaitable_t<>>;
+using tcp_acceptor = default_token::as_default_on_t<tcp::acceptor>;
+using tcp_socket = default_token::as_default_on_t<tcp::socket>;
+namespace this_coro = asio::this_coro;
+
+awaitable<void> echo(tcp_socket socket)
+{
+ char data[1024];
+ for (;;)
+ {
+ auto [e1, nread] = co_await socket.async_read_some(asio::buffer(data));
+ if (nread == 0) break;
+ auto [e2, nwritten] = co_await async_write(socket, asio::buffer(data, nread));
+ if (nwritten != nread) break;
+ }
+}
+
+awaitable<void> listener()
+{
+ auto executor = co_await this_coro::executor;
+ tcp_acceptor acceptor(executor, {tcp::v4(), 55555});
+ for (;;)
+ {
+ if (auto [e, socket] = co_await acceptor.async_accept(); socket.is_open())
+ co_spawn(executor, echo(std::move(socket)), detached);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ co_spawn(io_context, listener(), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server_with_as_tuple_default.cpp b/3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server_with_as_tuple_default.cpp
new file mode 100644
index 00000000000..de162cad78e
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server_with_as_tuple_default.cpp
@@ -0,0 +1,71 @@
+//
+// echo_server_with_as_tuple_default.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/as_tuple.hpp>
+#include <asio/co_spawn.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::as_tuple_t;
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::use_awaitable_t;
+using default_token = as_tuple_t<use_awaitable_t<>>;
+using tcp_acceptor = default_token::as_default_on_t<tcp::acceptor>;
+using tcp_socket = default_token::as_default_on_t<tcp::socket>;
+namespace this_coro = asio::this_coro;
+
+awaitable<void> echo(tcp_socket socket)
+{
+ char data[1024];
+ for (;;)
+ {
+ auto [e1, nread] = co_await socket.async_read_some(asio::buffer(data));
+ if (nread == 0) break;
+ auto [e2, nwritten] = co_await async_write(socket, asio::buffer(data, nread));
+ if (nwritten != nread) break;
+ }
+}
+
+awaitable<void> listener()
+{
+ auto executor = co_await this_coro::executor;
+ tcp_acceptor acceptor(executor, {tcp::v4(), 55555});
+ for (;;)
+ {
+ if (auto [e, socket] = co_await acceptor.async_accept(); socket.is_open())
+ co_spawn(executor, echo(std::move(socket)), detached);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ co_spawn(io_context, listener(), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server_with_default.cpp b/3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server_with_default.cpp
new file mode 100644
index 00000000000..54344d94d56
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp17/coroutines_ts/echo_server_with_default.cpp
@@ -0,0 +1,73 @@
+//
+// echo_server_with_default.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/co_spawn.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::use_awaitable_t;
+using tcp_acceptor = use_awaitable_t<>::as_default_on_t<tcp::acceptor>;
+using tcp_socket = use_awaitable_t<>::as_default_on_t<tcp::socket>;
+namespace this_coro = asio::this_coro;
+
+awaitable<void> echo(tcp_socket socket)
+{
+ try
+ {
+ char data[1024];
+ for (;;)
+ {
+ std::size_t n = co_await socket.async_read_some(asio::buffer(data));
+ co_await async_write(socket, asio::buffer(data, n));
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::printf("echo Exception: %s\n", e.what());
+ }
+}
+
+awaitable<void> listener()
+{
+ auto executor = co_await this_coro::executor;
+ tcp_acceptor acceptor(executor, {tcp::v4(), 55555});
+ for (;;)
+ {
+ auto socket = co_await acceptor.async_accept();
+ co_spawn(executor, echo(std::move(socket)), detached);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ co_spawn(io_context, listener(), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp17/coroutines_ts/range_based_for.cpp b/3rdparty/asio/src/examples/cpp17/coroutines_ts/range_based_for.cpp
new file mode 100644
index 00000000000..599ed80cd3f
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp17/coroutines_ts/range_based_for.cpp
@@ -0,0 +1,102 @@
+//
+// range_based_for.cpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/co_spawn.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::use_awaitable;
+
+class connection_iter
+{
+ friend class connections;
+ tcp::acceptor* acceptor_ = nullptr;
+ tcp::socket socket_;
+
+ connection_iter(tcp::acceptor& a, tcp::socket s)
+ : acceptor_(&a), socket_(std::move(s)) {}
+
+public:
+ tcp::socket operator*()
+ {
+ return std::move(socket_);
+ }
+
+ awaitable<void> operator++()
+ {
+ socket_ = co_await acceptor_->async_accept(use_awaitable);
+ }
+
+ bool operator==(const connection_iter&) const noexcept
+ {
+ return false;
+ }
+
+ bool operator!=(const connection_iter&) const noexcept
+ {
+ return true;
+ }
+};
+
+class connections
+{
+ tcp::acceptor& acceptor_;
+
+public:
+ explicit connections(tcp::acceptor& a) : acceptor_(a) {}
+
+ awaitable<connection_iter> begin()
+ {
+ tcp::socket s = co_await acceptor_.async_accept(use_awaitable);
+ co_return connection_iter(acceptor_, std::move(s));
+ }
+
+ connection_iter end()
+ {
+ return connection_iter(acceptor_,
+ tcp::socket(acceptor_.get_executor()));
+ }
+};
+
+awaitable<void> listener(tcp::acceptor acceptor)
+{
+ for co_await (tcp::socket s : connections(acceptor))
+ {
+ co_await asio::async_write(s, asio::buffer("hello\r\n", 7), use_awaitable);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ co_spawn(io_context, listener(std::move(acceptor)), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp17/coroutines_ts/refactored_echo_server.cpp b/3rdparty/asio/src/examples/cpp17/coroutines_ts/refactored_echo_server.cpp
new file mode 100644
index 00000000000..dc7b03d86e2
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp17/coroutines_ts/refactored_echo_server.cpp
@@ -0,0 +1,80 @@
+//
+// refactored_echo_server.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/co_spawn.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::use_awaitable;
+namespace this_coro = asio::this_coro;
+
+awaitable<void> echo_once(tcp::socket& socket)
+{
+ char data[128];
+ std::size_t n = co_await socket.async_read_some(asio::buffer(data), use_awaitable);
+ co_await async_write(socket, asio::buffer(data, n), use_awaitable);
+}
+
+awaitable<void> echo(tcp::socket socket)
+{
+ try
+ {
+ for (;;)
+ {
+ // The asynchronous operations to echo a single chunk of data have been
+ // refactored into a separate function. When this function is called, the
+ // operations are still performed in the context of the current
+ // coroutine, and the behaviour is functionally equivalent.
+ co_await echo_once(socket);
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::printf("echo Exception: %s\n", e.what());
+ }
+}
+
+awaitable<void> listener()
+{
+ auto executor = co_await this_coro::executor;
+ tcp::acceptor acceptor(executor, {tcp::v4(), 55555});
+ for (;;)
+ {
+ tcp::socket socket = co_await acceptor.async_accept(use_awaitable);
+ co_spawn(executor, echo(std::move(socket)), detached);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ co_spawn(io_context, listener(), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp20/Makefile.am b/3rdparty/asio/src/examples/cpp20/Makefile.am
new file mode 100644
index 00000000000..619893c208e
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/Makefile.am
@@ -0,0 +1,79 @@
+AUTOMAKE_OPTIONS = subdir-objects
+
+if SEPARATE_COMPILATION
+noinst_LIBRARIES = libasio.a
+libasio_a_SOURCES = ../../asio.cpp
+if HAVE_OPENSSL
+libasio_a_SOURCES += ../../asio_ssl.cpp
+endif
+LDADD = libasio.a
+endif
+
+noinst_PROGRAMS = \
+ invocation/completion_executor \
+ operations/c_callback_wrapper \
+ operations/callback_wrapper \
+ operations/composed_1 \
+ operations/composed_1 \
+ operations/composed_2 \
+ operations/composed_3 \
+ operations/composed_4 \
+ operations/composed_5 \
+ operations/composed_6 \
+ operations/composed_7 \
+ operations/composed_8
+
+if HAVE_COROUTINES
+noinst_PROGRAMS += \
+ channels/mutual_exclusion_1 \
+ channels/mutual_exclusion_2 \
+ channels/throttling_proxy \
+ coroutines/chat_server \
+ coroutines/echo_server \
+ coroutines/echo_server_with_default \
+ coroutines/echo_server_with_deferred \
+ coroutines/echo_server_with_deferred_default \
+ coroutines/echo_server_with_as_single_default \
+ coroutines/echo_server_with_as_tuple_default \
+ coroutines/refactored_echo_server \
+ coroutines/timeout \
+ type_erasure/type_erasure
+endif
+
+AM_CXXFLAGS = -I$(srcdir)/../../../include
+
+invocation_completion_executor_SOURCES = invocation/completion_executor.cpp
+operations_c_callback_wrapper_SOURCES = operations/c_callback_wrapper.cpp
+operations_callback_wrapper_SOURCES = operations/callback_wrapper.cpp
+operations_composed_1_SOURCES = operations/composed_1.cpp
+operations_composed_2_SOURCES = operations/composed_2.cpp
+operations_composed_3_SOURCES = operations/composed_3.cpp
+operations_composed_4_SOURCES = operations/composed_4.cpp
+operations_composed_5_SOURCES = operations/composed_5.cpp
+operations_composed_6_SOURCES = operations/composed_6.cpp
+operations_composed_7_SOURCES = operations/composed_7.cpp
+operations_composed_8_SOURCES = operations/composed_8.cpp
+
+if HAVE_COROUTINES
+channels_mutual_exclusion_1_SOURCES = channels/mutual_exclusion_1.cpp
+channels_mutual_exclusion_2_SOURCES = channels/mutual_exclusion_2.cpp
+channels_throttling_proxy_SOURCES = channels/throttling_proxy.cpp
+coroutines_chat_server_SOURCES = coroutines/chat_server.cpp
+coroutines_echo_server_SOURCES = coroutines/echo_server.cpp
+coroutines_echo_server_with_default_SOURCES = coroutines/echo_server_with_default.cpp
+coroutines_echo_server_with_deferred_SOURCES = coroutines/echo_server_with_deferred.cpp
+coroutines_echo_server_with_deferred_default_SOURCES = coroutines/echo_server_with_deferred_default.cpp
+coroutines_echo_server_with_as_single_default_SOURCES = coroutines/echo_server_with_as_single_default.cpp
+coroutines_echo_server_with_as_tuple_default_SOURCES = coroutines/echo_server_with_as_tuple_default.cpp
+coroutines_refactored_echo_server_SOURCES = coroutines/refactored_echo_server.cpp
+coroutines_timeout_SOURCES = coroutines/timeout.cpp
+type_erasure_type_erasure_SOURCES = type_erasure/main.cpp type_erasure/stdin_line_reader.cpp type_erasure/sleep.cpp
+endif
+
+EXTRA_DIST = \
+ type_erasure/line_reader.hpp \
+ type_erasure/stdin_line_reader.hpp \
+ type_erasure/sleep.hpp
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
diff --git a/3rdparty/asio/src/examples/cpp20/Makefile.in b/3rdparty/asio/src/examples/cpp20/Makefile.in
new file mode 100644
index 00000000000..87311465ece
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/Makefile.in
@@ -0,0 +1,1173 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__append_1 = ../../asio_ssl.cpp
+noinst_PROGRAMS = invocation/completion_executor$(EXEEXT) \
+ operations/c_callback_wrapper$(EXEEXT) \
+ operations/callback_wrapper$(EXEEXT) \
+ operations/composed_1$(EXEEXT) operations/composed_1$(EXEEXT) \
+ operations/composed_2$(EXEEXT) operations/composed_3$(EXEEXT) \
+ operations/composed_4$(EXEEXT) operations/composed_5$(EXEEXT) \
+ operations/composed_6$(EXEEXT) operations/composed_7$(EXEEXT) \
+ operations/composed_8$(EXEEXT) $(am__EXEEXT_1)
+@HAVE_COROUTINES_TRUE@am__append_2 = \
+@HAVE_COROUTINES_TRUE@ channels/mutual_exclusion_1 \
+@HAVE_COROUTINES_TRUE@ channels/mutual_exclusion_2 \
+@HAVE_COROUTINES_TRUE@ channels/throttling_proxy \
+@HAVE_COROUTINES_TRUE@ coroutines/chat_server \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server_with_default \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server_with_deferred \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server_with_deferred_default \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server_with_as_single_default \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server_with_as_tuple_default \
+@HAVE_COROUTINES_TRUE@ coroutines/refactored_echo_server \
+@HAVE_COROUTINES_TRUE@ coroutines/timeout \
+@HAVE_COROUTINES_TRUE@ type_erasure/type_erasure
+
+subdir = src/examples/cpp20
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@HAVE_COROUTINES_TRUE@am__EXEEXT_1 = \
+@HAVE_COROUTINES_TRUE@ channels/mutual_exclusion_1$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ channels/mutual_exclusion_2$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ channels/throttling_proxy$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines/chat_server$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server_with_default$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server_with_deferred$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server_with_deferred_default$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server_with_as_single_default$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server_with_as_tuple_default$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines/refactored_echo_server$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ coroutines/timeout$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@ type_erasure/type_erasure$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libasio_a_AR = $(AR) $(ARFLAGS)
+libasio_a_LIBADD =
+am__libasio_a_SOURCES_DIST = ../../asio.cpp ../../asio_ssl.cpp
+am__dirstamp = $(am__leading_dot)dirstamp
+@HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__objects_1 = ../../asio_ssl.$(OBJEXT)
+@SEPARATE_COMPILATION_TRUE@am_libasio_a_OBJECTS = \
+@SEPARATE_COMPILATION_TRUE@ ../../asio.$(OBJEXT) \
+@SEPARATE_COMPILATION_TRUE@ $(am__objects_1)
+libasio_a_OBJECTS = $(am_libasio_a_OBJECTS)
+am__channels_mutual_exclusion_1_SOURCES_DIST = \
+ channels/mutual_exclusion_1.cpp
+@HAVE_COROUTINES_TRUE@am_channels_mutual_exclusion_1_OBJECTS = \
+@HAVE_COROUTINES_TRUE@ channels/mutual_exclusion_1.$(OBJEXT)
+channels_mutual_exclusion_1_OBJECTS = \
+ $(am_channels_mutual_exclusion_1_OBJECTS)
+channels_mutual_exclusion_1_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@channels_mutual_exclusion_1_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__channels_mutual_exclusion_2_SOURCES_DIST = \
+ channels/mutual_exclusion_2.cpp
+@HAVE_COROUTINES_TRUE@am_channels_mutual_exclusion_2_OBJECTS = \
+@HAVE_COROUTINES_TRUE@ channels/mutual_exclusion_2.$(OBJEXT)
+channels_mutual_exclusion_2_OBJECTS = \
+ $(am_channels_mutual_exclusion_2_OBJECTS)
+channels_mutual_exclusion_2_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@channels_mutual_exclusion_2_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__channels_throttling_proxy_SOURCES_DIST = \
+ channels/throttling_proxy.cpp
+@HAVE_COROUTINES_TRUE@am_channels_throttling_proxy_OBJECTS = \
+@HAVE_COROUTINES_TRUE@ channels/throttling_proxy.$(OBJEXT)
+channels_throttling_proxy_OBJECTS = \
+ $(am_channels_throttling_proxy_OBJECTS)
+channels_throttling_proxy_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@channels_throttling_proxy_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_chat_server_SOURCES_DIST = coroutines/chat_server.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_chat_server_OBJECTS = \
+@HAVE_COROUTINES_TRUE@ coroutines/chat_server.$(OBJEXT)
+coroutines_chat_server_OBJECTS = $(am_coroutines_chat_server_OBJECTS)
+coroutines_chat_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_chat_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_echo_server_SOURCES_DIST = coroutines/echo_server.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_echo_server_OBJECTS = \
+@HAVE_COROUTINES_TRUE@ coroutines/echo_server.$(OBJEXT)
+coroutines_echo_server_OBJECTS = $(am_coroutines_echo_server_OBJECTS)
+coroutines_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_echo_server_with_as_single_default_SOURCES_DIST = \
+ coroutines/echo_server_with_as_single_default.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_echo_server_with_as_single_default_OBJECTS = coroutines/echo_server_with_as_single_default.$(OBJEXT)
+coroutines_echo_server_with_as_single_default_OBJECTS = \
+ $(am_coroutines_echo_server_with_as_single_default_OBJECTS)
+coroutines_echo_server_with_as_single_default_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_echo_server_with_as_single_default_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_echo_server_with_as_tuple_default_SOURCES_DIST = \
+ coroutines/echo_server_with_as_tuple_default.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_echo_server_with_as_tuple_default_OBJECTS = coroutines/echo_server_with_as_tuple_default.$(OBJEXT)
+coroutines_echo_server_with_as_tuple_default_OBJECTS = \
+ $(am_coroutines_echo_server_with_as_tuple_default_OBJECTS)
+coroutines_echo_server_with_as_tuple_default_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_echo_server_with_as_tuple_default_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_echo_server_with_default_SOURCES_DIST = \
+ coroutines/echo_server_with_default.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_echo_server_with_default_OBJECTS = coroutines/echo_server_with_default.$(OBJEXT)
+coroutines_echo_server_with_default_OBJECTS = \
+ $(am_coroutines_echo_server_with_default_OBJECTS)
+coroutines_echo_server_with_default_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_echo_server_with_default_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_echo_server_with_deferred_SOURCES_DIST = \
+ coroutines/echo_server_with_deferred.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_echo_server_with_deferred_OBJECTS = coroutines/echo_server_with_deferred.$(OBJEXT)
+coroutines_echo_server_with_deferred_OBJECTS = \
+ $(am_coroutines_echo_server_with_deferred_OBJECTS)
+coroutines_echo_server_with_deferred_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_echo_server_with_deferred_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_echo_server_with_deferred_default_SOURCES_DIST = \
+ coroutines/echo_server_with_deferred_default.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_echo_server_with_deferred_default_OBJECTS = coroutines/echo_server_with_deferred_default.$(OBJEXT)
+coroutines_echo_server_with_deferred_default_OBJECTS = \
+ $(am_coroutines_echo_server_with_deferred_default_OBJECTS)
+coroutines_echo_server_with_deferred_default_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_echo_server_with_deferred_default_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_refactored_echo_server_SOURCES_DIST = \
+ coroutines/refactored_echo_server.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_refactored_echo_server_OBJECTS = coroutines/refactored_echo_server.$(OBJEXT)
+coroutines_refactored_echo_server_OBJECTS = \
+ $(am_coroutines_refactored_echo_server_OBJECTS)
+coroutines_refactored_echo_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_refactored_echo_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__coroutines_timeout_SOURCES_DIST = coroutines/timeout.cpp
+@HAVE_COROUTINES_TRUE@am_coroutines_timeout_OBJECTS = \
+@HAVE_COROUTINES_TRUE@ coroutines/timeout.$(OBJEXT)
+coroutines_timeout_OBJECTS = $(am_coroutines_timeout_OBJECTS)
+coroutines_timeout_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@coroutines_timeout_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_invocation_completion_executor_OBJECTS = \
+ invocation/completion_executor.$(OBJEXT)
+invocation_completion_executor_OBJECTS = \
+ $(am_invocation_completion_executor_OBJECTS)
+invocation_completion_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@invocation_completion_executor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_c_callback_wrapper_OBJECTS = \
+ operations/c_callback_wrapper.$(OBJEXT)
+operations_c_callback_wrapper_OBJECTS = \
+ $(am_operations_c_callback_wrapper_OBJECTS)
+operations_c_callback_wrapper_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_c_callback_wrapper_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_callback_wrapper_OBJECTS = \
+ operations/callback_wrapper.$(OBJEXT)
+operations_callback_wrapper_OBJECTS = \
+ $(am_operations_callback_wrapper_OBJECTS)
+operations_callback_wrapper_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_callback_wrapper_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_1_OBJECTS = operations/composed_1.$(OBJEXT)
+operations_composed_1_OBJECTS = $(am_operations_composed_1_OBJECTS)
+operations_composed_1_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_1_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_2_OBJECTS = operations/composed_2.$(OBJEXT)
+operations_composed_2_OBJECTS = $(am_operations_composed_2_OBJECTS)
+operations_composed_2_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_2_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_3_OBJECTS = operations/composed_3.$(OBJEXT)
+operations_composed_3_OBJECTS = $(am_operations_composed_3_OBJECTS)
+operations_composed_3_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_3_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_4_OBJECTS = operations/composed_4.$(OBJEXT)
+operations_composed_4_OBJECTS = $(am_operations_composed_4_OBJECTS)
+operations_composed_4_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_4_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_5_OBJECTS = operations/composed_5.$(OBJEXT)
+operations_composed_5_OBJECTS = $(am_operations_composed_5_OBJECTS)
+operations_composed_5_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_5_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_6_OBJECTS = operations/composed_6.$(OBJEXT)
+operations_composed_6_OBJECTS = $(am_operations_composed_6_OBJECTS)
+operations_composed_6_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_6_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_7_OBJECTS = operations/composed_7.$(OBJEXT)
+operations_composed_7_OBJECTS = $(am_operations_composed_7_OBJECTS)
+operations_composed_7_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_7_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_operations_composed_8_OBJECTS = operations/composed_8.$(OBJEXT)
+operations_composed_8_OBJECTS = $(am_operations_composed_8_OBJECTS)
+operations_composed_8_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@operations_composed_8_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__type_erasure_type_erasure_SOURCES_DIST = type_erasure/main.cpp \
+ type_erasure/stdin_line_reader.cpp type_erasure/sleep.cpp
+@HAVE_COROUTINES_TRUE@am_type_erasure_type_erasure_OBJECTS = \
+@HAVE_COROUTINES_TRUE@ type_erasure/main.$(OBJEXT) \
+@HAVE_COROUTINES_TRUE@ type_erasure/stdin_line_reader.$(OBJEXT) \
+@HAVE_COROUTINES_TRUE@ type_erasure/sleep.$(OBJEXT)
+type_erasure_type_erasure_OBJECTS = \
+ $(am_type_erasure_type_erasure_OBJECTS)
+type_erasure_type_erasure_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@type_erasure_type_erasure_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ../../$(DEPDIR)/asio.Po \
+ ../../$(DEPDIR)/asio_ssl.Po \
+ channels/$(DEPDIR)/mutual_exclusion_1.Po \
+ channels/$(DEPDIR)/mutual_exclusion_2.Po \
+ channels/$(DEPDIR)/throttling_proxy.Po \
+ coroutines/$(DEPDIR)/chat_server.Po \
+ coroutines/$(DEPDIR)/echo_server.Po \
+ coroutines/$(DEPDIR)/echo_server_with_as_single_default.Po \
+ coroutines/$(DEPDIR)/echo_server_with_as_tuple_default.Po \
+ coroutines/$(DEPDIR)/echo_server_with_default.Po \
+ coroutines/$(DEPDIR)/echo_server_with_deferred.Po \
+ coroutines/$(DEPDIR)/echo_server_with_deferred_default.Po \
+ coroutines/$(DEPDIR)/refactored_echo_server.Po \
+ coroutines/$(DEPDIR)/timeout.Po \
+ invocation/$(DEPDIR)/completion_executor.Po \
+ operations/$(DEPDIR)/c_callback_wrapper.Po \
+ operations/$(DEPDIR)/callback_wrapper.Po \
+ operations/$(DEPDIR)/composed_1.Po \
+ operations/$(DEPDIR)/composed_2.Po \
+ operations/$(DEPDIR)/composed_3.Po \
+ operations/$(DEPDIR)/composed_4.Po \
+ operations/$(DEPDIR)/composed_5.Po \
+ operations/$(DEPDIR)/composed_6.Po \
+ operations/$(DEPDIR)/composed_7.Po \
+ operations/$(DEPDIR)/composed_8.Po \
+ type_erasure/$(DEPDIR)/main.Po type_erasure/$(DEPDIR)/sleep.Po \
+ type_erasure/$(DEPDIR)/stdin_line_reader.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(libasio_a_SOURCES) $(channels_mutual_exclusion_1_SOURCES) \
+ $(channels_mutual_exclusion_2_SOURCES) \
+ $(channels_throttling_proxy_SOURCES) \
+ $(coroutines_chat_server_SOURCES) \
+ $(coroutines_echo_server_SOURCES) \
+ $(coroutines_echo_server_with_as_single_default_SOURCES) \
+ $(coroutines_echo_server_with_as_tuple_default_SOURCES) \
+ $(coroutines_echo_server_with_default_SOURCES) \
+ $(coroutines_echo_server_with_deferred_SOURCES) \
+ $(coroutines_echo_server_with_deferred_default_SOURCES) \
+ $(coroutines_refactored_echo_server_SOURCES) \
+ $(coroutines_timeout_SOURCES) \
+ $(invocation_completion_executor_SOURCES) \
+ $(operations_c_callback_wrapper_SOURCES) \
+ $(operations_callback_wrapper_SOURCES) \
+ $(operations_composed_1_SOURCES) \
+ $(operations_composed_2_SOURCES) \
+ $(operations_composed_3_SOURCES) \
+ $(operations_composed_4_SOURCES) \
+ $(operations_composed_5_SOURCES) \
+ $(operations_composed_6_SOURCES) \
+ $(operations_composed_7_SOURCES) \
+ $(operations_composed_8_SOURCES) \
+ $(type_erasure_type_erasure_SOURCES)
+DIST_SOURCES = $(am__libasio_a_SOURCES_DIST) \
+ $(am__channels_mutual_exclusion_1_SOURCES_DIST) \
+ $(am__channels_mutual_exclusion_2_SOURCES_DIST) \
+ $(am__channels_throttling_proxy_SOURCES_DIST) \
+ $(am__coroutines_chat_server_SOURCES_DIST) \
+ $(am__coroutines_echo_server_SOURCES_DIST) \
+ $(am__coroutines_echo_server_with_as_single_default_SOURCES_DIST) \
+ $(am__coroutines_echo_server_with_as_tuple_default_SOURCES_DIST) \
+ $(am__coroutines_echo_server_with_default_SOURCES_DIST) \
+ $(am__coroutines_echo_server_with_deferred_SOURCES_DIST) \
+ $(am__coroutines_echo_server_with_deferred_default_SOURCES_DIST) \
+ $(am__coroutines_refactored_echo_server_SOURCES_DIST) \
+ $(am__coroutines_timeout_SOURCES_DIST) \
+ $(invocation_completion_executor_SOURCES) \
+ $(operations_c_callback_wrapper_SOURCES) \
+ $(operations_callback_wrapper_SOURCES) \
+ $(operations_composed_1_SOURCES) \
+ $(operations_composed_2_SOURCES) \
+ $(operations_composed_3_SOURCES) \
+ $(operations_composed_4_SOURCES) \
+ $(operations_composed_5_SOURCES) \
+ $(operations_composed_6_SOURCES) \
+ $(operations_composed_7_SOURCES) \
+ $(operations_composed_8_SOURCES) \
+ $(am__type_erasure_type_erasure_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = subdir-objects
+@SEPARATE_COMPILATION_TRUE@noinst_LIBRARIES = libasio.a
+@SEPARATE_COMPILATION_TRUE@libasio_a_SOURCES = ../../asio.cpp \
+@SEPARATE_COMPILATION_TRUE@ $(am__append_1)
+@SEPARATE_COMPILATION_TRUE@LDADD = libasio.a
+AM_CXXFLAGS = -I$(srcdir)/../../../include
+invocation_completion_executor_SOURCES = invocation/completion_executor.cpp
+operations_c_callback_wrapper_SOURCES = operations/c_callback_wrapper.cpp
+operations_callback_wrapper_SOURCES = operations/callback_wrapper.cpp
+operations_composed_1_SOURCES = operations/composed_1.cpp
+operations_composed_2_SOURCES = operations/composed_2.cpp
+operations_composed_3_SOURCES = operations/composed_3.cpp
+operations_composed_4_SOURCES = operations/composed_4.cpp
+operations_composed_5_SOURCES = operations/composed_5.cpp
+operations_composed_6_SOURCES = operations/composed_6.cpp
+operations_composed_7_SOURCES = operations/composed_7.cpp
+operations_composed_8_SOURCES = operations/composed_8.cpp
+@HAVE_COROUTINES_TRUE@channels_mutual_exclusion_1_SOURCES = channels/mutual_exclusion_1.cpp
+@HAVE_COROUTINES_TRUE@channels_mutual_exclusion_2_SOURCES = channels/mutual_exclusion_2.cpp
+@HAVE_COROUTINES_TRUE@channels_throttling_proxy_SOURCES = channels/throttling_proxy.cpp
+@HAVE_COROUTINES_TRUE@coroutines_chat_server_SOURCES = coroutines/chat_server.cpp
+@HAVE_COROUTINES_TRUE@coroutines_echo_server_SOURCES = coroutines/echo_server.cpp
+@HAVE_COROUTINES_TRUE@coroutines_echo_server_with_default_SOURCES = coroutines/echo_server_with_default.cpp
+@HAVE_COROUTINES_TRUE@coroutines_echo_server_with_deferred_SOURCES = coroutines/echo_server_with_deferred.cpp
+@HAVE_COROUTINES_TRUE@coroutines_echo_server_with_deferred_default_SOURCES = coroutines/echo_server_with_deferred_default.cpp
+@HAVE_COROUTINES_TRUE@coroutines_echo_server_with_as_single_default_SOURCES = coroutines/echo_server_with_as_single_default.cpp
+@HAVE_COROUTINES_TRUE@coroutines_echo_server_with_as_tuple_default_SOURCES = coroutines/echo_server_with_as_tuple_default.cpp
+@HAVE_COROUTINES_TRUE@coroutines_refactored_echo_server_SOURCES = coroutines/refactored_echo_server.cpp
+@HAVE_COROUTINES_TRUE@coroutines_timeout_SOURCES = coroutines/timeout.cpp
+@HAVE_COROUTINES_TRUE@type_erasure_type_erasure_SOURCES = type_erasure/main.cpp type_erasure/stdin_line_reader.cpp type_erasure/sleep.cpp
+EXTRA_DIST = \
+ type_erasure/line_reader.hpp \
+ type_erasure/stdin_line_reader.hpp \
+ type_erasure/sleep.hpp
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/examples/cpp20/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/examples/cpp20/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-noinstPROGRAMS:
+ -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+../../$(am__dirstamp):
+ @$(MKDIR_P) ../..
+ @: > ../../$(am__dirstamp)
+../../$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) ../../$(DEPDIR)
+ @: > ../../$(DEPDIR)/$(am__dirstamp)
+../../asio.$(OBJEXT): ../../$(am__dirstamp) \
+ ../../$(DEPDIR)/$(am__dirstamp)
+../../asio_ssl.$(OBJEXT): ../../$(am__dirstamp) \
+ ../../$(DEPDIR)/$(am__dirstamp)
+
+libasio.a: $(libasio_a_OBJECTS) $(libasio_a_DEPENDENCIES) $(EXTRA_libasio_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libasio.a
+ $(AM_V_AR)$(libasio_a_AR) libasio.a $(libasio_a_OBJECTS) $(libasio_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libasio.a
+channels/$(am__dirstamp):
+ @$(MKDIR_P) channels
+ @: > channels/$(am__dirstamp)
+channels/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) channels/$(DEPDIR)
+ @: > channels/$(DEPDIR)/$(am__dirstamp)
+channels/mutual_exclusion_1.$(OBJEXT): channels/$(am__dirstamp) \
+ channels/$(DEPDIR)/$(am__dirstamp)
+
+channels/mutual_exclusion_1$(EXEEXT): $(channels_mutual_exclusion_1_OBJECTS) $(channels_mutual_exclusion_1_DEPENDENCIES) $(EXTRA_channels_mutual_exclusion_1_DEPENDENCIES) channels/$(am__dirstamp)
+ @rm -f channels/mutual_exclusion_1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(channels_mutual_exclusion_1_OBJECTS) $(channels_mutual_exclusion_1_LDADD) $(LIBS)
+channels/mutual_exclusion_2.$(OBJEXT): channels/$(am__dirstamp) \
+ channels/$(DEPDIR)/$(am__dirstamp)
+
+channels/mutual_exclusion_2$(EXEEXT): $(channels_mutual_exclusion_2_OBJECTS) $(channels_mutual_exclusion_2_DEPENDENCIES) $(EXTRA_channels_mutual_exclusion_2_DEPENDENCIES) channels/$(am__dirstamp)
+ @rm -f channels/mutual_exclusion_2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(channels_mutual_exclusion_2_OBJECTS) $(channels_mutual_exclusion_2_LDADD) $(LIBS)
+channels/throttling_proxy.$(OBJEXT): channels/$(am__dirstamp) \
+ channels/$(DEPDIR)/$(am__dirstamp)
+
+channels/throttling_proxy$(EXEEXT): $(channels_throttling_proxy_OBJECTS) $(channels_throttling_proxy_DEPENDENCIES) $(EXTRA_channels_throttling_proxy_DEPENDENCIES) channels/$(am__dirstamp)
+ @rm -f channels/throttling_proxy$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(channels_throttling_proxy_OBJECTS) $(channels_throttling_proxy_LDADD) $(LIBS)
+coroutines/$(am__dirstamp):
+ @$(MKDIR_P) coroutines
+ @: > coroutines/$(am__dirstamp)
+coroutines/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) coroutines/$(DEPDIR)
+ @: > coroutines/$(DEPDIR)/$(am__dirstamp)
+coroutines/chat_server.$(OBJEXT): coroutines/$(am__dirstamp) \
+ coroutines/$(DEPDIR)/$(am__dirstamp)
+
+coroutines/chat_server$(EXEEXT): $(coroutines_chat_server_OBJECTS) $(coroutines_chat_server_DEPENDENCIES) $(EXTRA_coroutines_chat_server_DEPENDENCIES) coroutines/$(am__dirstamp)
+ @rm -f coroutines/chat_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_chat_server_OBJECTS) $(coroutines_chat_server_LDADD) $(LIBS)
+coroutines/echo_server.$(OBJEXT): coroutines/$(am__dirstamp) \
+ coroutines/$(DEPDIR)/$(am__dirstamp)
+
+coroutines/echo_server$(EXEEXT): $(coroutines_echo_server_OBJECTS) $(coroutines_echo_server_DEPENDENCIES) $(EXTRA_coroutines_echo_server_DEPENDENCIES) coroutines/$(am__dirstamp)
+ @rm -f coroutines/echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_echo_server_OBJECTS) $(coroutines_echo_server_LDADD) $(LIBS)
+coroutines/echo_server_with_as_single_default.$(OBJEXT): \
+ coroutines/$(am__dirstamp) \
+ coroutines/$(DEPDIR)/$(am__dirstamp)
+
+coroutines/echo_server_with_as_single_default$(EXEEXT): $(coroutines_echo_server_with_as_single_default_OBJECTS) $(coroutines_echo_server_with_as_single_default_DEPENDENCIES) $(EXTRA_coroutines_echo_server_with_as_single_default_DEPENDENCIES) coroutines/$(am__dirstamp)
+ @rm -f coroutines/echo_server_with_as_single_default$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_echo_server_with_as_single_default_OBJECTS) $(coroutines_echo_server_with_as_single_default_LDADD) $(LIBS)
+coroutines/echo_server_with_as_tuple_default.$(OBJEXT): \
+ coroutines/$(am__dirstamp) \
+ coroutines/$(DEPDIR)/$(am__dirstamp)
+
+coroutines/echo_server_with_as_tuple_default$(EXEEXT): $(coroutines_echo_server_with_as_tuple_default_OBJECTS) $(coroutines_echo_server_with_as_tuple_default_DEPENDENCIES) $(EXTRA_coroutines_echo_server_with_as_tuple_default_DEPENDENCIES) coroutines/$(am__dirstamp)
+ @rm -f coroutines/echo_server_with_as_tuple_default$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_echo_server_with_as_tuple_default_OBJECTS) $(coroutines_echo_server_with_as_tuple_default_LDADD) $(LIBS)
+coroutines/echo_server_with_default.$(OBJEXT): \
+ coroutines/$(am__dirstamp) \
+ coroutines/$(DEPDIR)/$(am__dirstamp)
+
+coroutines/echo_server_with_default$(EXEEXT): $(coroutines_echo_server_with_default_OBJECTS) $(coroutines_echo_server_with_default_DEPENDENCIES) $(EXTRA_coroutines_echo_server_with_default_DEPENDENCIES) coroutines/$(am__dirstamp)
+ @rm -f coroutines/echo_server_with_default$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_echo_server_with_default_OBJECTS) $(coroutines_echo_server_with_default_LDADD) $(LIBS)
+coroutines/echo_server_with_deferred.$(OBJEXT): \
+ coroutines/$(am__dirstamp) \
+ coroutines/$(DEPDIR)/$(am__dirstamp)
+
+coroutines/echo_server_with_deferred$(EXEEXT): $(coroutines_echo_server_with_deferred_OBJECTS) $(coroutines_echo_server_with_deferred_DEPENDENCIES) $(EXTRA_coroutines_echo_server_with_deferred_DEPENDENCIES) coroutines/$(am__dirstamp)
+ @rm -f coroutines/echo_server_with_deferred$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_echo_server_with_deferred_OBJECTS) $(coroutines_echo_server_with_deferred_LDADD) $(LIBS)
+coroutines/echo_server_with_deferred_default.$(OBJEXT): \
+ coroutines/$(am__dirstamp) \
+ coroutines/$(DEPDIR)/$(am__dirstamp)
+
+coroutines/echo_server_with_deferred_default$(EXEEXT): $(coroutines_echo_server_with_deferred_default_OBJECTS) $(coroutines_echo_server_with_deferred_default_DEPENDENCIES) $(EXTRA_coroutines_echo_server_with_deferred_default_DEPENDENCIES) coroutines/$(am__dirstamp)
+ @rm -f coroutines/echo_server_with_deferred_default$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_echo_server_with_deferred_default_OBJECTS) $(coroutines_echo_server_with_deferred_default_LDADD) $(LIBS)
+coroutines/refactored_echo_server.$(OBJEXT): \
+ coroutines/$(am__dirstamp) \
+ coroutines/$(DEPDIR)/$(am__dirstamp)
+
+coroutines/refactored_echo_server$(EXEEXT): $(coroutines_refactored_echo_server_OBJECTS) $(coroutines_refactored_echo_server_DEPENDENCIES) $(EXTRA_coroutines_refactored_echo_server_DEPENDENCIES) coroutines/$(am__dirstamp)
+ @rm -f coroutines/refactored_echo_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_refactored_echo_server_OBJECTS) $(coroutines_refactored_echo_server_LDADD) $(LIBS)
+coroutines/timeout.$(OBJEXT): coroutines/$(am__dirstamp) \
+ coroutines/$(DEPDIR)/$(am__dirstamp)
+
+coroutines/timeout$(EXEEXT): $(coroutines_timeout_OBJECTS) $(coroutines_timeout_DEPENDENCIES) $(EXTRA_coroutines_timeout_DEPENDENCIES) coroutines/$(am__dirstamp)
+ @rm -f coroutines/timeout$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(coroutines_timeout_OBJECTS) $(coroutines_timeout_LDADD) $(LIBS)
+invocation/$(am__dirstamp):
+ @$(MKDIR_P) invocation
+ @: > invocation/$(am__dirstamp)
+invocation/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) invocation/$(DEPDIR)
+ @: > invocation/$(DEPDIR)/$(am__dirstamp)
+invocation/completion_executor.$(OBJEXT): invocation/$(am__dirstamp) \
+ invocation/$(DEPDIR)/$(am__dirstamp)
+
+invocation/completion_executor$(EXEEXT): $(invocation_completion_executor_OBJECTS) $(invocation_completion_executor_DEPENDENCIES) $(EXTRA_invocation_completion_executor_DEPENDENCIES) invocation/$(am__dirstamp)
+ @rm -f invocation/completion_executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(invocation_completion_executor_OBJECTS) $(invocation_completion_executor_LDADD) $(LIBS)
+operations/$(am__dirstamp):
+ @$(MKDIR_P) operations
+ @: > operations/$(am__dirstamp)
+operations/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) operations/$(DEPDIR)
+ @: > operations/$(DEPDIR)/$(am__dirstamp)
+operations/c_callback_wrapper.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/c_callback_wrapper$(EXEEXT): $(operations_c_callback_wrapper_OBJECTS) $(operations_c_callback_wrapper_DEPENDENCIES) $(EXTRA_operations_c_callback_wrapper_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/c_callback_wrapper$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_c_callback_wrapper_OBJECTS) $(operations_c_callback_wrapper_LDADD) $(LIBS)
+operations/callback_wrapper.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/callback_wrapper$(EXEEXT): $(operations_callback_wrapper_OBJECTS) $(operations_callback_wrapper_DEPENDENCIES) $(EXTRA_operations_callback_wrapper_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/callback_wrapper$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_callback_wrapper_OBJECTS) $(operations_callback_wrapper_LDADD) $(LIBS)
+operations/composed_1.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_1$(EXEEXT): $(operations_composed_1_OBJECTS) $(operations_composed_1_DEPENDENCIES) $(EXTRA_operations_composed_1_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_1$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_1_OBJECTS) $(operations_composed_1_LDADD) $(LIBS)
+operations/composed_2.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_2$(EXEEXT): $(operations_composed_2_OBJECTS) $(operations_composed_2_DEPENDENCIES) $(EXTRA_operations_composed_2_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_2$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_2_OBJECTS) $(operations_composed_2_LDADD) $(LIBS)
+operations/composed_3.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_3$(EXEEXT): $(operations_composed_3_OBJECTS) $(operations_composed_3_DEPENDENCIES) $(EXTRA_operations_composed_3_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_3$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_3_OBJECTS) $(operations_composed_3_LDADD) $(LIBS)
+operations/composed_4.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_4$(EXEEXT): $(operations_composed_4_OBJECTS) $(operations_composed_4_DEPENDENCIES) $(EXTRA_operations_composed_4_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_4_OBJECTS) $(operations_composed_4_LDADD) $(LIBS)
+operations/composed_5.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_5$(EXEEXT): $(operations_composed_5_OBJECTS) $(operations_composed_5_DEPENDENCIES) $(EXTRA_operations_composed_5_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_5$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_5_OBJECTS) $(operations_composed_5_LDADD) $(LIBS)
+operations/composed_6.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_6$(EXEEXT): $(operations_composed_6_OBJECTS) $(operations_composed_6_DEPENDENCIES) $(EXTRA_operations_composed_6_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_6$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_6_OBJECTS) $(operations_composed_6_LDADD) $(LIBS)
+operations/composed_7.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_7$(EXEEXT): $(operations_composed_7_OBJECTS) $(operations_composed_7_DEPENDENCIES) $(EXTRA_operations_composed_7_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_7$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_7_OBJECTS) $(operations_composed_7_LDADD) $(LIBS)
+operations/composed_8.$(OBJEXT): operations/$(am__dirstamp) \
+ operations/$(DEPDIR)/$(am__dirstamp)
+
+operations/composed_8$(EXEEXT): $(operations_composed_8_OBJECTS) $(operations_composed_8_DEPENDENCIES) $(EXTRA_operations_composed_8_DEPENDENCIES) operations/$(am__dirstamp)
+ @rm -f operations/composed_8$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(operations_composed_8_OBJECTS) $(operations_composed_8_LDADD) $(LIBS)
+type_erasure/$(am__dirstamp):
+ @$(MKDIR_P) type_erasure
+ @: > type_erasure/$(am__dirstamp)
+type_erasure/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) type_erasure/$(DEPDIR)
+ @: > type_erasure/$(DEPDIR)/$(am__dirstamp)
+type_erasure/main.$(OBJEXT): type_erasure/$(am__dirstamp) \
+ type_erasure/$(DEPDIR)/$(am__dirstamp)
+type_erasure/stdin_line_reader.$(OBJEXT): \
+ type_erasure/$(am__dirstamp) \
+ type_erasure/$(DEPDIR)/$(am__dirstamp)
+type_erasure/sleep.$(OBJEXT): type_erasure/$(am__dirstamp) \
+ type_erasure/$(DEPDIR)/$(am__dirstamp)
+
+type_erasure/type_erasure$(EXEEXT): $(type_erasure_type_erasure_OBJECTS) $(type_erasure_type_erasure_DEPENDENCIES) $(EXTRA_type_erasure_type_erasure_DEPENDENCIES) type_erasure/$(am__dirstamp)
+ @rm -f type_erasure/type_erasure$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(type_erasure_type_erasure_OBJECTS) $(type_erasure_type_erasure_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+ -rm -f ../../*.$(OBJEXT)
+ -rm -f channels/*.$(OBJEXT)
+ -rm -f coroutines/*.$(OBJEXT)
+ -rm -f invocation/*.$(OBJEXT)
+ -rm -f operations/*.$(OBJEXT)
+ -rm -f type_erasure/*.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../../$(DEPDIR)/asio_ssl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@channels/$(DEPDIR)/mutual_exclusion_1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@channels/$(DEPDIR)/mutual_exclusion_2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@channels/$(DEPDIR)/throttling_proxy.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines/$(DEPDIR)/chat_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines/$(DEPDIR)/echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines/$(DEPDIR)/echo_server_with_as_single_default.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines/$(DEPDIR)/echo_server_with_as_tuple_default.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines/$(DEPDIR)/echo_server_with_default.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines/$(DEPDIR)/echo_server_with_deferred.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines/$(DEPDIR)/echo_server_with_deferred_default.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines/$(DEPDIR)/refactored_echo_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@coroutines/$(DEPDIR)/timeout.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@invocation/$(DEPDIR)/completion_executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/c_callback_wrapper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/callback_wrapper.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_1.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_2.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_3.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_4.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_5.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_6.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_7.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@operations/$(DEPDIR)/composed_8.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@type_erasure/$(DEPDIR)/main.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@type_erasure/$(DEPDIR)/sleep.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@type_erasure/$(DEPDIR)/stdin_line_reader.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+check: check-am
+all-am: Makefile $(PROGRAMS) $(LIBRARIES)
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -rm -f ../../$(DEPDIR)/$(am__dirstamp)
+ -rm -f ../../$(am__dirstamp)
+ -rm -f channels/$(DEPDIR)/$(am__dirstamp)
+ -rm -f channels/$(am__dirstamp)
+ -rm -f coroutines/$(DEPDIR)/$(am__dirstamp)
+ -rm -f coroutines/$(am__dirstamp)
+ -rm -f invocation/$(DEPDIR)/$(am__dirstamp)
+ -rm -f invocation/$(am__dirstamp)
+ -rm -f operations/$(DEPDIR)/$(am__dirstamp)
+ -rm -f operations/$(am__dirstamp)
+ -rm -f type_erasure/$(DEPDIR)/$(am__dirstamp)
+ -rm -f type_erasure/$(am__dirstamp)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -f ../../$(DEPDIR)/asio.Po
+ -rm -f ../../$(DEPDIR)/asio_ssl.Po
+ -rm -f channels/$(DEPDIR)/mutual_exclusion_1.Po
+ -rm -f channels/$(DEPDIR)/mutual_exclusion_2.Po
+ -rm -f channels/$(DEPDIR)/throttling_proxy.Po
+ -rm -f coroutines/$(DEPDIR)/chat_server.Po
+ -rm -f coroutines/$(DEPDIR)/echo_server.Po
+ -rm -f coroutines/$(DEPDIR)/echo_server_with_as_single_default.Po
+ -rm -f coroutines/$(DEPDIR)/echo_server_with_as_tuple_default.Po
+ -rm -f coroutines/$(DEPDIR)/echo_server_with_default.Po
+ -rm -f coroutines/$(DEPDIR)/echo_server_with_deferred.Po
+ -rm -f coroutines/$(DEPDIR)/echo_server_with_deferred_default.Po
+ -rm -f coroutines/$(DEPDIR)/refactored_echo_server.Po
+ -rm -f coroutines/$(DEPDIR)/timeout.Po
+ -rm -f invocation/$(DEPDIR)/completion_executor.Po
+ -rm -f operations/$(DEPDIR)/c_callback_wrapper.Po
+ -rm -f operations/$(DEPDIR)/callback_wrapper.Po
+ -rm -f operations/$(DEPDIR)/composed_1.Po
+ -rm -f operations/$(DEPDIR)/composed_2.Po
+ -rm -f operations/$(DEPDIR)/composed_3.Po
+ -rm -f operations/$(DEPDIR)/composed_4.Po
+ -rm -f operations/$(DEPDIR)/composed_5.Po
+ -rm -f operations/$(DEPDIR)/composed_6.Po
+ -rm -f operations/$(DEPDIR)/composed_7.Po
+ -rm -f operations/$(DEPDIR)/composed_8.Po
+ -rm -f type_erasure/$(DEPDIR)/main.Po
+ -rm -f type_erasure/$(DEPDIR)/sleep.Po
+ -rm -f type_erasure/$(DEPDIR)/stdin_line_reader.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f ../../$(DEPDIR)/asio.Po
+ -rm -f ../../$(DEPDIR)/asio_ssl.Po
+ -rm -f channels/$(DEPDIR)/mutual_exclusion_1.Po
+ -rm -f channels/$(DEPDIR)/mutual_exclusion_2.Po
+ -rm -f channels/$(DEPDIR)/throttling_proxy.Po
+ -rm -f coroutines/$(DEPDIR)/chat_server.Po
+ -rm -f coroutines/$(DEPDIR)/echo_server.Po
+ -rm -f coroutines/$(DEPDIR)/echo_server_with_as_single_default.Po
+ -rm -f coroutines/$(DEPDIR)/echo_server_with_as_tuple_default.Po
+ -rm -f coroutines/$(DEPDIR)/echo_server_with_default.Po
+ -rm -f coroutines/$(DEPDIR)/echo_server_with_deferred.Po
+ -rm -f coroutines/$(DEPDIR)/echo_server_with_deferred_default.Po
+ -rm -f coroutines/$(DEPDIR)/refactored_echo_server.Po
+ -rm -f coroutines/$(DEPDIR)/timeout.Po
+ -rm -f invocation/$(DEPDIR)/completion_executor.Po
+ -rm -f operations/$(DEPDIR)/c_callback_wrapper.Po
+ -rm -f operations/$(DEPDIR)/callback_wrapper.Po
+ -rm -f operations/$(DEPDIR)/composed_1.Po
+ -rm -f operations/$(DEPDIR)/composed_2.Po
+ -rm -f operations/$(DEPDIR)/composed_3.Po
+ -rm -f operations/$(DEPDIR)/composed_4.Po
+ -rm -f operations/$(DEPDIR)/composed_5.Po
+ -rm -f operations/$(DEPDIR)/composed_6.Po
+ -rm -f operations/$(DEPDIR)/composed_7.Po
+ -rm -f operations/$(DEPDIR)/composed_8.Po
+ -rm -f type_erasure/$(DEPDIR)/main.Po
+ -rm -f type_erasure/$(DEPDIR)/sleep.Po
+ -rm -f type_erasure/$(DEPDIR)/stdin_line_reader.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \
+ clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \
+ cscopelist-am ctags ctags-am distclean distclean-compile \
+ distclean-generic distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-man install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \
+ uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/3rdparty/asio/src/examples/cpp20/channels/mutual_exclusion_1.cpp b/3rdparty/asio/src/examples/cpp20/channels/mutual_exclusion_1.cpp
new file mode 100644
index 00000000000..79654f1e8f1
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/channels/mutual_exclusion_1.cpp
@@ -0,0 +1,182 @@
+//
+// mutual_exclusion_1.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/channel.hpp>
+#include <iostream>
+#include <memory>
+
+using asio::as_tuple;
+using asio::awaitable;
+using asio::dynamic_buffer;
+using asio::co_spawn;
+using asio::deferred;
+using asio::detached;
+using asio::experimental::channel;
+using asio::io_context;
+using asio::ip::tcp;
+using asio::steady_timer;
+using namespace asio::buffer_literals;
+using namespace std::literals::chrono_literals;
+
+// This class implements a simple line-based protocol:
+//
+// * For event line that is received from the client, the session sends a
+// message header followed by the content of the line as the message body.
+//
+// * The session generates heartbeat messages once a second.
+//
+// This protocol is implemented using two actors, handle_messages() and
+// send_heartbeats(), each written as a coroutine.
+class line_based_echo_session :
+ public std::enable_shared_from_this<line_based_echo_session>
+{
+ // The socket used to read from and write to the client. This socket is a
+ // data member as it is shared between the two actors.
+ tcp::socket socket_;
+
+ // As both of the actors will write to the socket, we need a lock to prevent
+ // these writes from overlapping. To achieve this, we use a channel with a
+ // buffer size of one. The lock is claimed by sending a message to the
+ // channel, and then released by receiving this message back again. If the
+ // lock is not held then the channel's buffer is empty, and the send will
+ // complete without delay. Otherwise, if the lock is held by the other actor,
+ // then the send operation will not complete until the lock is released.
+ channel<void()> write_lock_{socket_.get_executor(), 1};
+
+public:
+ line_based_echo_session(tcp::socket socket)
+ : socket_{std::move(socket)}
+ {
+ socket_.set_option(tcp::no_delay(true));
+ }
+
+ void start()
+ {
+ co_spawn(socket_.get_executor(),
+ [self = shared_from_this()]{ return self->handle_messages(); },
+ detached);
+
+ co_spawn(socket_.get_executor(),
+ [self = shared_from_this()]{ return self->send_heartbeats(); },
+ detached);
+ }
+
+private:
+ void stop()
+ {
+ socket_.close();
+ write_lock_.cancel();
+ }
+
+ awaitable<void> handle_messages()
+ {
+ try
+ {
+ constexpr std::size_t max_line_length = 1024;
+ std::string data;
+ for (;;)
+ {
+ // Read an entire line from the client.
+ std::size_t length = co_await async_read_until(socket_,
+ dynamic_buffer(data, max_line_length), '\n', deferred);
+
+ // Claim the write lock by sending a message to the channel. Since the
+ // channel signature is void(), there are no arguments to send in the
+ // message itself.
+ co_await write_lock_.async_send(deferred);
+
+ // Respond to the client with a message, echoing the line they sent.
+ co_await async_write(socket_, "<line>"_buf, deferred);
+ co_await async_write(socket_, dynamic_buffer(data, length), deferred);
+
+ // Release the lock by receiving the message back again.
+ write_lock_.try_receive([](auto...){});
+ }
+ }
+ catch (const std::exception&)
+ {
+ stop();
+ }
+ }
+
+ awaitable<void> send_heartbeats()
+ {
+ steady_timer timer{socket_.get_executor()};
+ try
+ {
+ for (;;)
+ {
+ // Wait one second before trying to send the next heartbeat.
+ timer.expires_after(1s);
+ co_await timer.async_wait(deferred);
+
+ // Claim the write lock by sending a message to the channel. Since the
+ // channel signature is void(), there are no arguments to send in the
+ // message itself.
+ co_await write_lock_.async_send(deferred);
+
+ // Send a heartbeat to the client. As the content of the heartbeat
+ // message never varies, a buffer literal can be used to specify the
+ // bytes of the message. The memory associated with a buffer literal is
+ // valid for the lifetime of the program, which mean that the buffer
+ // can be safely passed as-is to the asynchronous operation.
+ co_await async_write(socket_, "<heartbeat>\n"_buf, deferred);
+
+ // Release the lock by receiving the message back again.
+ write_lock_.try_receive([](auto...){});
+ }
+ }
+ catch (const std::exception&)
+ {
+ stop();
+ }
+ }
+
+};
+
+awaitable<void> listen(tcp::acceptor& acceptor)
+{
+ for (;;)
+ {
+ auto [e, socket] = co_await acceptor.async_accept(as_tuple(deferred));
+ if (!e)
+ {
+ std::make_shared<line_based_echo_session>(std::move(socket))->start();
+ }
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: mutual_exclusion_1";
+ std::cerr << " <listen_address> <listen_port>\n";
+ return 1;
+ }
+
+ io_context ctx;
+
+ auto listen_endpoint =
+ *tcp::resolver(ctx).resolve(argv[1], argv[2],
+ tcp::resolver::passive).begin();
+
+ tcp::acceptor acceptor(ctx, listen_endpoint);
+ co_spawn(ctx, listen(acceptor), detached);
+ ctx.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp20/channels/mutual_exclusion_2.cpp b/3rdparty/asio/src/examples/cpp20/channels/mutual_exclusion_2.cpp
new file mode 100644
index 00000000000..46cfeb647a2
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/channels/mutual_exclusion_2.cpp
@@ -0,0 +1,192 @@
+//
+// mutual_exclusion_2.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/channel.hpp>
+#include <iostream>
+#include <memory>
+
+using asio::as_tuple;
+using asio::awaitable;
+using asio::dynamic_buffer;
+using asio::co_spawn;
+using asio::deferred;
+using asio::detached;
+using asio::experimental::channel;
+using asio::io_context;
+using asio::ip::tcp;
+using asio::steady_timer;
+using namespace asio::buffer_literals;
+using namespace std::literals::chrono_literals;
+
+// This class implements a simple line-based protocol:
+//
+// * For event line that is received from the client, the session sends a
+// message header followed by the content of the line as the message body.
+//
+// * The session generates heartbeat messages once a second.
+//
+// This protocol is implemented using two actors, handle_messages() and
+// send_heartbeats(), each written as a coroutine.
+class line_based_echo_session :
+ public std::enable_shared_from_this<line_based_echo_session>
+{
+ // The socket used to read from and write to the client. This socket is a
+ // data member as it is shared between the two actors.
+ tcp::socket socket_;
+
+ // As both of the actors will write to the socket, we need a lock to prevent
+ // these writes from overlapping. To achieve this, we use a channel with a
+ // buffer size of one. The lock is claimed by sending a message to the
+ // channel, and then released by receiving this message back again. If the
+ // lock is not held then the channel's buffer is empty, and the send will
+ // complete without delay. Otherwise, if the lock is held by the other actor,
+ // then the send operation will not complete until the lock is released.
+ channel<void()> write_lock_{socket_.get_executor(), 1};
+
+public:
+ line_based_echo_session(tcp::socket socket)
+ : socket_{std::move(socket)}
+ {
+ socket_.set_option(tcp::no_delay(true));
+ }
+
+ void start()
+ {
+ co_spawn(socket_.get_executor(),
+ [self = shared_from_this()]{ return self->handle_messages(); },
+ detached);
+
+ co_spawn(socket_.get_executor(),
+ [self = shared_from_this()]{ return self->send_heartbeats(); },
+ detached);
+ }
+
+private:
+ void stop()
+ {
+ socket_.close();
+ write_lock_.cancel();
+ }
+
+ awaitable<void> handle_messages()
+ {
+ try
+ {
+ constexpr std::size_t max_line_length = 1024;
+ std::string data;
+ for (;;)
+ {
+ // Read an entire line from the client.
+ std::size_t length = co_await async_read_until(socket_,
+ dynamic_buffer(data, max_line_length), '\n', deferred);
+
+ // Claim the write lock by sending a message to the channel. Since the
+ // channel signature is void(), there are no arguments to send in the
+ // message itself. In this example we optimise for the common case,
+ // where the lock is not held by the other actor, by first trying a
+ // non-blocking send.
+ if (!write_lock_.try_send())
+ {
+ co_await write_lock_.async_send(deferred);
+ }
+
+ // Respond to the client with a message, echoing the line they sent.
+ co_await async_write(socket_, "<line>"_buf, deferred);
+ co_await async_write(socket_, dynamic_buffer(data, length), deferred);
+
+ // Release the lock by receiving the message back again.
+ write_lock_.try_receive([](auto...){});
+ }
+ }
+ catch (const std::exception&)
+ {
+ stop();
+ }
+ }
+
+ awaitable<void> send_heartbeats()
+ {
+ steady_timer timer{socket_.get_executor()};
+ try
+ {
+ for (;;)
+ {
+ // Wait one second before trying to send the next heartbeat.
+ timer.expires_after(1s);
+ co_await timer.async_wait(deferred);
+
+ // Claim the write lock by sending a message to the channel. Since the
+ // channel signature is void(), there are no arguments to send in the
+ // message itself. In this example we optimise for the common case,
+ // where the lock is not held by the other actor, by first trying a
+ // non-blocking send.
+ if (!write_lock_.try_send())
+ {
+ co_await write_lock_.async_send(deferred);
+ }
+
+ // Send a heartbeat to the client. As the content of the heartbeat
+ // message never varies, a buffer literal can be used to specify the
+ // bytes of the message. The memory associated with a buffer literal is
+ // valid for the lifetime of the program, which mean that the buffer
+ // can be safely passed as-is to the asynchronous operation.
+ co_await async_write(socket_, "<heartbeat>\n"_buf, deferred);
+
+ // Release the lock by receiving the message back again.
+ write_lock_.try_receive([](auto...){});
+ }
+ }
+ catch (const std::exception&)
+ {
+ stop();
+ }
+ }
+
+};
+
+awaitable<void> listen(tcp::acceptor& acceptor)
+{
+ for (;;)
+ {
+ auto [e, socket] = co_await acceptor.async_accept(as_tuple(deferred));
+ if (!e)
+ {
+ std::make_shared<line_based_echo_session>(std::move(socket))->start();
+ }
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 3)
+ {
+ std::cerr << "Usage: mutual_exclusion_1";
+ std::cerr << " <listen_address> <listen_port>\n";
+ return 1;
+ }
+
+ io_context ctx;
+
+ auto listen_endpoint =
+ *tcp::resolver(ctx).resolve(argv[1], argv[2],
+ tcp::resolver::passive).begin();
+
+ tcp::acceptor acceptor(ctx, listen_endpoint);
+ co_spawn(ctx, listen(acceptor), detached);
+ ctx.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp20/channels/throttling_proxy.cpp b/3rdparty/asio/src/examples/cpp20/channels/throttling_proxy.cpp
new file mode 100644
index 00000000000..c54d2986af7
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/channels/throttling_proxy.cpp
@@ -0,0 +1,135 @@
+//
+// throttling_proxy.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/awaitable_operators.hpp>
+#include <asio/experimental/channel.hpp>
+#include <iostream>
+
+using asio::as_tuple;
+using asio::awaitable;
+using asio::buffer;
+using asio::co_spawn;
+using asio::detached;
+using asio::experimental::channel;
+using asio::io_context;
+using asio::ip::tcp;
+using asio::steady_timer;
+using asio::use_awaitable;
+namespace this_coro = asio::this_coro;
+using namespace asio::experimental::awaitable_operators;
+using namespace std::literals::chrono_literals;
+
+using token_channel = channel<void(asio::error_code, std::size_t)>;
+
+awaitable<void> produce_tokens(std::size_t bytes_per_token,
+ steady_timer::duration token_interval, token_channel& tokens)
+{
+ steady_timer timer(co_await this_coro::executor);
+ for (;;)
+ {
+ co_await tokens.async_send(
+ asio::error_code{}, bytes_per_token,
+ use_awaitable);
+
+ timer.expires_after(token_interval);
+ co_await timer.async_wait(use_awaitable);
+ }
+}
+
+awaitable<void> transfer(tcp::socket& from,
+ tcp::socket& to, token_channel& tokens)
+{
+ std::array<unsigned char, 4096> data;
+ for (;;)
+ {
+ std::size_t bytes_available = co_await tokens.async_receive(use_awaitable);
+ while (bytes_available > 0)
+ {
+ std::size_t n = co_await from.async_read_some(
+ buffer(data, bytes_available), use_awaitable);
+
+ co_await async_write(to, buffer(data, n), use_awaitable);
+
+ bytes_available -= n;
+ }
+ }
+}
+
+awaitable<void> proxy(tcp::socket client, tcp::endpoint target)
+{
+ constexpr std::size_t number_of_tokens = 100;
+ constexpr size_t bytes_per_token = 20 * 1024;
+ constexpr steady_timer::duration token_interval = 100ms;
+
+ auto ex = client.get_executor();
+ tcp::socket server(ex);
+ token_channel client_tokens(ex, number_of_tokens);
+ token_channel server_tokens(ex, number_of_tokens);
+
+ co_await server.async_connect(target, use_awaitable);
+ co_await (
+ produce_tokens(bytes_per_token, token_interval, client_tokens) &&
+ transfer(client, server, client_tokens) &&
+ produce_tokens(bytes_per_token, token_interval, server_tokens) &&
+ transfer(server, client, server_tokens)
+ );
+}
+
+awaitable<void> listen(tcp::acceptor& acceptor, tcp::endpoint target)
+{
+ for (;;)
+ {
+ auto [e, client] = co_await acceptor.async_accept(as_tuple(use_awaitable));
+ if (!e)
+ {
+ auto ex = client.get_executor();
+ co_spawn(ex, proxy(std::move(client), target), detached);
+ }
+ else
+ {
+ std::cerr << "Accept failed: " << e.message() << "\n";
+ steady_timer timer(co_await this_coro::executor);
+ timer.expires_after(100ms);
+ co_await timer.async_wait(use_awaitable);
+ }
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 5)
+ {
+ std::cerr << "Usage: throttling_proxy";
+ std::cerr << " <listen_address> <listen_port>";
+ std::cerr << " <target_address> <target_port>\n";
+ return 1;
+ }
+
+ io_context ctx;
+
+ auto listen_endpoint =
+ *tcp::resolver(ctx).resolve(argv[1], argv[2],
+ tcp::resolver::passive).begin();
+
+ auto target_endpoint =
+ *tcp::resolver(ctx).resolve(argv[3], argv[4]).begin();
+
+ tcp::acceptor acceptor(ctx, listen_endpoint);
+ co_spawn(ctx, listen(acceptor, target_endpoint), detached);
+ ctx.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp20/coroutines/chat_server.cpp b/3rdparty/asio/src/examples/cpp20/coroutines/chat_server.cpp
new file mode 100644
index 00000000000..cd5fba32486
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/coroutines/chat_server.cpp
@@ -0,0 +1,222 @@
+//
+// chat_server.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <cstdlib>
+#include <deque>
+#include <iostream>
+#include <list>
+#include <memory>
+#include <set>
+#include <string>
+#include <utility>
+#include <asio/awaitable.hpp>
+#include <asio/detached.hpp>
+#include <asio/co_spawn.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/read_until.hpp>
+#include <asio/redirect_error.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/steady_timer.hpp>
+#include <asio/use_awaitable.hpp>
+#include <asio/write.hpp>
+
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::redirect_error;
+using asio::use_awaitable;
+
+//----------------------------------------------------------------------
+
+class chat_participant
+{
+public:
+ virtual ~chat_participant() {}
+ virtual void deliver(const std::string& msg) = 0;
+};
+
+typedef std::shared_ptr<chat_participant> chat_participant_ptr;
+
+//----------------------------------------------------------------------
+
+class chat_room
+{
+public:
+ void join(chat_participant_ptr participant)
+ {
+ participants_.insert(participant);
+ for (auto msg: recent_msgs_)
+ participant->deliver(msg);
+ }
+
+ void leave(chat_participant_ptr participant)
+ {
+ participants_.erase(participant);
+ }
+
+ void deliver(const std::string& msg)
+ {
+ recent_msgs_.push_back(msg);
+ while (recent_msgs_.size() > max_recent_msgs)
+ recent_msgs_.pop_front();
+
+ for (auto participant: participants_)
+ participant->deliver(msg);
+ }
+
+private:
+ std::set<chat_participant_ptr> participants_;
+ enum { max_recent_msgs = 100 };
+ std::deque<std::string> recent_msgs_;
+};
+
+//----------------------------------------------------------------------
+
+class chat_session
+ : public chat_participant,
+ public std::enable_shared_from_this<chat_session>
+{
+public:
+ chat_session(tcp::socket socket, chat_room& room)
+ : socket_(std::move(socket)),
+ timer_(socket_.get_executor()),
+ room_(room)
+ {
+ timer_.expires_at(std::chrono::steady_clock::time_point::max());
+ }
+
+ void start()
+ {
+ room_.join(shared_from_this());
+
+ co_spawn(socket_.get_executor(),
+ [self = shared_from_this()]{ return self->reader(); },
+ detached);
+
+ co_spawn(socket_.get_executor(),
+ [self = shared_from_this()]{ return self->writer(); },
+ detached);
+ }
+
+ void deliver(const std::string& msg)
+ {
+ write_msgs_.push_back(msg);
+ timer_.cancel_one();
+ }
+
+private:
+ awaitable<void> reader()
+ {
+ try
+ {
+ for (std::string read_msg;;)
+ {
+ std::size_t n = co_await asio::async_read_until(socket_,
+ asio::dynamic_buffer(read_msg, 1024), "\n", use_awaitable);
+
+ room_.deliver(read_msg.substr(0, n));
+ read_msg.erase(0, n);
+ }
+ }
+ catch (std::exception&)
+ {
+ stop();
+ }
+ }
+
+ awaitable<void> writer()
+ {
+ try
+ {
+ while (socket_.is_open())
+ {
+ if (write_msgs_.empty())
+ {
+ asio::error_code ec;
+ co_await timer_.async_wait(redirect_error(use_awaitable, ec));
+ }
+ else
+ {
+ co_await asio::async_write(socket_,
+ asio::buffer(write_msgs_.front()), use_awaitable);
+ write_msgs_.pop_front();
+ }
+ }
+ }
+ catch (std::exception&)
+ {
+ stop();
+ }
+ }
+
+ void stop()
+ {
+ room_.leave(shared_from_this());
+ socket_.close();
+ timer_.cancel();
+ }
+
+ tcp::socket socket_;
+ asio::steady_timer timer_;
+ chat_room& room_;
+ std::deque<std::string> write_msgs_;
+};
+
+//----------------------------------------------------------------------
+
+awaitable<void> listener(tcp::acceptor acceptor)
+{
+ chat_room room;
+
+ for (;;)
+ {
+ std::make_shared<chat_session>(
+ co_await acceptor.async_accept(use_awaitable),
+ room
+ )->start();
+ }
+}
+
+//----------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc < 2)
+ {
+ std::cerr << "Usage: chat_server <port> [<port> ...]\n";
+ return 1;
+ }
+
+ asio::io_context io_context(1);
+
+ for (int i = 1; i < argc; ++i)
+ {
+ unsigned short port = std::atoi(argv[i]);
+ co_spawn(io_context,
+ listener(tcp::acceptor(io_context, {tcp::v4(), port})),
+ detached);
+ }
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp20/coroutines/echo_server.cpp b/3rdparty/asio/src/examples/cpp20/coroutines/echo_server.cpp
new file mode 100644
index 00000000000..a9532459f77
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/coroutines/echo_server.cpp
@@ -0,0 +1,76 @@
+//
+// echo_server.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/co_spawn.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::use_awaitable;
+namespace this_coro = asio::this_coro;
+
+#if defined(ASIO_ENABLE_HANDLER_TRACKING)
+# define use_awaitable \
+ asio::use_awaitable_t(__FILE__, __LINE__, __PRETTY_FUNCTION__)
+#endif
+
+awaitable<void> echo(tcp::socket socket)
+{
+ try
+ {
+ char data[1024];
+ for (;;)
+ {
+ std::size_t n = co_await socket.async_read_some(asio::buffer(data), use_awaitable);
+ co_await async_write(socket, asio::buffer(data, n), use_awaitable);
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::printf("echo Exception: %s\n", e.what());
+ }
+}
+
+awaitable<void> listener()
+{
+ auto executor = co_await this_coro::executor;
+ tcp::acceptor acceptor(executor, {tcp::v4(), 55555});
+ for (;;)
+ {
+ tcp::socket socket = co_await acceptor.async_accept(use_awaitable);
+ co_spawn(executor, echo(std::move(socket)), detached);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ co_spawn(io_context, listener(), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_as_single_default.cpp b/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_as_single_default.cpp
new file mode 100644
index 00000000000..4a692acc872
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_as_single_default.cpp
@@ -0,0 +1,71 @@
+//
+// echo_server_with_as_single_default.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/experimental/as_single.hpp>
+#include <asio/co_spawn.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::experimental::as_single_t;
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::use_awaitable_t;
+using default_token = as_single_t<use_awaitable_t<>>;
+using tcp_acceptor = default_token::as_default_on_t<tcp::acceptor>;
+using tcp_socket = default_token::as_default_on_t<tcp::socket>;
+namespace this_coro = asio::this_coro;
+
+awaitable<void> echo(tcp_socket socket)
+{
+ char data[1024];
+ for (;;)
+ {
+ auto [e1, nread] = co_await socket.async_read_some(asio::buffer(data));
+ if (nread == 0) break;
+ auto [e2, nwritten] = co_await async_write(socket, asio::buffer(data, nread));
+ if (nwritten != nread) break;
+ }
+}
+
+awaitable<void> listener()
+{
+ auto executor = co_await this_coro::executor;
+ tcp_acceptor acceptor(executor, {tcp::v4(), 55555});
+ for (;;)
+ {
+ if (auto [e, socket] = co_await acceptor.async_accept(); socket.is_open())
+ co_spawn(executor, echo(std::move(socket)), detached);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ co_spawn(io_context, listener(), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_as_tuple_default.cpp b/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_as_tuple_default.cpp
new file mode 100644
index 00000000000..de162cad78e
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_as_tuple_default.cpp
@@ -0,0 +1,71 @@
+//
+// echo_server_with_as_tuple_default.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/as_tuple.hpp>
+#include <asio/co_spawn.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::as_tuple_t;
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::use_awaitable_t;
+using default_token = as_tuple_t<use_awaitable_t<>>;
+using tcp_acceptor = default_token::as_default_on_t<tcp::acceptor>;
+using tcp_socket = default_token::as_default_on_t<tcp::socket>;
+namespace this_coro = asio::this_coro;
+
+awaitable<void> echo(tcp_socket socket)
+{
+ char data[1024];
+ for (;;)
+ {
+ auto [e1, nread] = co_await socket.async_read_some(asio::buffer(data));
+ if (nread == 0) break;
+ auto [e2, nwritten] = co_await async_write(socket, asio::buffer(data, nread));
+ if (nwritten != nread) break;
+ }
+}
+
+awaitable<void> listener()
+{
+ auto executor = co_await this_coro::executor;
+ tcp_acceptor acceptor(executor, {tcp::v4(), 55555});
+ for (;;)
+ {
+ if (auto [e, socket] = co_await acceptor.async_accept(); socket.is_open())
+ co_spawn(executor, echo(std::move(socket)), detached);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ co_spawn(io_context, listener(), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_default.cpp b/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_default.cpp
new file mode 100644
index 00000000000..54344d94d56
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_default.cpp
@@ -0,0 +1,73 @@
+//
+// echo_server_with_default.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/co_spawn.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::use_awaitable_t;
+using tcp_acceptor = use_awaitable_t<>::as_default_on_t<tcp::acceptor>;
+using tcp_socket = use_awaitable_t<>::as_default_on_t<tcp::socket>;
+namespace this_coro = asio::this_coro;
+
+awaitable<void> echo(tcp_socket socket)
+{
+ try
+ {
+ char data[1024];
+ for (;;)
+ {
+ std::size_t n = co_await socket.async_read_some(asio::buffer(data));
+ co_await async_write(socket, asio::buffer(data, n));
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::printf("echo Exception: %s\n", e.what());
+ }
+}
+
+awaitable<void> listener()
+{
+ auto executor = co_await this_coro::executor;
+ tcp_acceptor acceptor(executor, {tcp::v4(), 55555});
+ for (;;)
+ {
+ auto socket = co_await acceptor.async_accept();
+ co_spawn(executor, echo(std::move(socket)), detached);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ co_spawn(io_context, listener(), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_deferred.cpp b/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_deferred.cpp
new file mode 100644
index 00000000000..54469ba7aba
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_deferred.cpp
@@ -0,0 +1,72 @@
+//
+// echo_server.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/co_spawn.hpp>
+#include <asio/deferred.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::deferred;
+using asio::detached;
+namespace this_coro = asio::this_coro;
+
+awaitable<void> echo(tcp::socket socket)
+{
+ try
+ {
+ char data[1024];
+ for (;;)
+ {
+ std::size_t n = co_await socket.async_read_some(asio::buffer(data), deferred);
+ co_await async_write(socket, asio::buffer(data, n), deferred);
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::printf("echo Exception: %s\n", e.what());
+ }
+}
+
+awaitable<void> listener()
+{
+ auto executor = co_await this_coro::executor;
+ tcp::acceptor acceptor(executor, {tcp::v4(), 55555});
+ for (;;)
+ {
+ tcp::socket socket = co_await acceptor.async_accept(deferred);
+ co_spawn(executor, echo(std::move(socket)), detached);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ co_spawn(io_context, listener(), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_deferred_default.cpp b/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_deferred_default.cpp
new file mode 100644
index 00000000000..33c383311d2
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/coroutines/echo_server_with_deferred_default.cpp
@@ -0,0 +1,74 @@
+//
+// echo_server.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/co_spawn.hpp>
+#include <asio/deferred.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using default_token = asio::deferred_t;
+using tcp_acceptor = default_token::as_default_on_t<tcp::acceptor>;
+using tcp_socket = default_token::as_default_on_t<tcp::socket>;
+namespace this_coro = asio::this_coro;
+
+awaitable<void> echo(tcp_socket socket)
+{
+ try
+ {
+ char data[1024];
+ for (;;)
+ {
+ std::size_t n = co_await socket.async_read_some(asio::buffer(data));
+ co_await async_write(socket, asio::buffer(data, n));
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::printf("echo Exception: %s\n", e.what());
+ }
+}
+
+awaitable<void> listener()
+{
+ auto executor = co_await this_coro::executor;
+ tcp_acceptor acceptor(executor, {tcp::v4(), 55555});
+ for (;;)
+ {
+ tcp::socket socket = co_await acceptor.async_accept();
+ co_spawn(executor, echo(std::move(socket)), detached);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ co_spawn(io_context, listener(), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp20/coroutines/refactored_echo_server.cpp b/3rdparty/asio/src/examples/cpp20/coroutines/refactored_echo_server.cpp
new file mode 100644
index 00000000000..dc7b03d86e2
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/coroutines/refactored_echo_server.cpp
@@ -0,0 +1,80 @@
+//
+// refactored_echo_server.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/co_spawn.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/signal_set.hpp>
+#include <asio/write.hpp>
+#include <cstdio>
+
+using asio::ip::tcp;
+using asio::awaitable;
+using asio::co_spawn;
+using asio::detached;
+using asio::use_awaitable;
+namespace this_coro = asio::this_coro;
+
+awaitable<void> echo_once(tcp::socket& socket)
+{
+ char data[128];
+ std::size_t n = co_await socket.async_read_some(asio::buffer(data), use_awaitable);
+ co_await async_write(socket, asio::buffer(data, n), use_awaitable);
+}
+
+awaitable<void> echo(tcp::socket socket)
+{
+ try
+ {
+ for (;;)
+ {
+ // The asynchronous operations to echo a single chunk of data have been
+ // refactored into a separate function. When this function is called, the
+ // operations are still performed in the context of the current
+ // coroutine, and the behaviour is functionally equivalent.
+ co_await echo_once(socket);
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::printf("echo Exception: %s\n", e.what());
+ }
+}
+
+awaitable<void> listener()
+{
+ auto executor = co_await this_coro::executor;
+ tcp::acceptor acceptor(executor, {tcp::v4(), 55555});
+ for (;;)
+ {
+ tcp::socket socket = co_await acceptor.async_accept(use_awaitable);
+ co_spawn(executor, echo(std::move(socket)), detached);
+ }
+}
+
+int main()
+{
+ try
+ {
+ asio::io_context io_context(1);
+
+ asio::signal_set signals(io_context, SIGINT, SIGTERM);
+ signals.async_wait([&](auto, auto){ io_context.stop(); });
+
+ co_spawn(io_context, listener(), detached);
+
+ io_context.run();
+ }
+ catch (std::exception& e)
+ {
+ std::printf("Exception: %s\n", e.what());
+ }
+}
diff --git a/3rdparty/asio/src/examples/cpp20/coroutines/timeout.cpp b/3rdparty/asio/src/examples/cpp20/coroutines/timeout.cpp
new file mode 100644
index 00000000000..2ffcab7ad35
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/coroutines/timeout.cpp
@@ -0,0 +1,66 @@
+//
+// timeout.cpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <asio/experimental/awaitable_operators.hpp>
+
+using namespace asio;
+using namespace asio::experimental::awaitable_operators;
+using time_point = std::chrono::steady_clock::time_point;
+using ip::tcp;
+
+awaitable<void> echo(tcp::socket& sock, time_point& deadline)
+{
+ char data[4196];
+ for (;;)
+ {
+ deadline = std::chrono::steady_clock::now() + std::chrono::seconds(10);
+ auto n = co_await sock.async_read_some(buffer(data), use_awaitable);
+ co_await async_write(sock, buffer(data, n), use_awaitable);
+ }
+}
+
+awaitable<void> watchdog(time_point& deadline)
+{
+ steady_timer timer(co_await this_coro::executor);
+ auto now = std::chrono::steady_clock::now();
+ while (deadline > now)
+ {
+ timer.expires_at(deadline);
+ co_await timer.async_wait(use_awaitable);
+ now = std::chrono::steady_clock::now();
+ }
+ throw std::system_error(std::make_error_code(std::errc::timed_out));
+}
+
+awaitable<void> handle_connection(tcp::socket sock)
+{
+ time_point deadline{};
+ co_await (echo(sock, deadline) && watchdog(deadline));
+}
+
+awaitable<void> listen(tcp::acceptor& acceptor)
+{
+ for (;;)
+ {
+ co_spawn(
+ acceptor.get_executor(),
+ handle_connection(co_await acceptor.async_accept(use_awaitable)),
+ detached);
+ }
+}
+
+int main()
+{
+ io_context ctx;
+ tcp::acceptor acceptor(ctx, {tcp::v4(), 54321});
+ co_spawn(ctx, listen(acceptor), detached);
+ ctx.run();
+}
diff --git a/3rdparty/asio/src/examples/cpp20/invocation/completion_executor.cpp b/3rdparty/asio/src/examples/cpp20/invocation/completion_executor.cpp
new file mode 100644
index 00000000000..409be96d0f4
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/invocation/completion_executor.cpp
@@ -0,0 +1,83 @@
+//
+// completion_executor.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio.hpp"
+#include <concepts>
+#include <iostream>
+
+using asio::ip::tcp;
+
+//----------------------------------------------------------------------
+
+// The logging_executor class implements a minimal executor that satisfies the
+// requirements for use as a completion executor. This means it may be bound to
+// a handler using bind_executor.
+class logging_executor
+{
+public:
+ // All executors must be no-throw equality comparable.
+ bool operator==(const logging_executor&) const noexcept = default;
+
+ // All executors must provide a const member function execute().
+ void execute(std::invocable auto handler) const
+ {
+ try
+ {
+ std::cout << "handler invocation starting\n";
+ std::move(handler)();
+ std::cout << "handler invocation complete\n";
+ }
+ catch (...)
+ {
+ std::cout << "handler invocation completed with exception\n";
+ throw;
+ }
+ }
+};
+
+// Confirm that a logging_executor satisfies the executor requirements.
+static_assert(asio::execution::executor<logging_executor>);
+
+// Confirm that a logging_executor can be used as a completion executor.
+static_assert(std::convertible_to<
+ logging_executor, asio::any_completion_executor>);
+
+//----------------------------------------------------------------------
+
+int main()
+{
+ asio::io_context io_context(1);
+
+ // Post a completion handler to be run immediately.
+ asio::post(io_context,
+ asio::bind_executor(logging_executor{},
+ []{ std::cout << "post complete\n"; }));
+
+ // Start an asynchronous accept that will complete immediately.
+ tcp::endpoint endpoint(asio::ip::address_v4::loopback(), 0);
+ tcp::acceptor acceptor(io_context, endpoint);
+ tcp::socket server_socket(io_context);
+ acceptor.async_accept(
+ asio::bind_executor(logging_executor{},
+ [](auto...){ std::cout << "async_accept complete\n"; }));
+ tcp::socket client_socket(io_context);
+ client_socket.connect(acceptor.local_endpoint());
+
+ // Set a timer to expire immediately.
+ asio::steady_timer timer(io_context);
+ timer.expires_at(asio::steady_timer::clock_type::time_point::min());
+ timer.async_wait(
+ asio::bind_executor(logging_executor{},
+ [](auto){ std::cout << "async_wait complete\n"; }));
+
+ io_context.run();
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/examples/cpp20/operations/c_callback_wrapper.cpp b/3rdparty/asio/src/examples/cpp20/operations/c_callback_wrapper.cpp
new file mode 100644
index 00000000000..f4fbe2617ea
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/operations/c_callback_wrapper.cpp
@@ -0,0 +1,232 @@
+//
+// c_callback_wrapper.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+#include <memory>
+#include <new>
+
+//------------------------------------------------------------------------------
+
+// This is a mock implementation of a C-based API that uses the function pointer
+// plus void* context idiom for exposing a callback.
+
+void read_input(const char* prompt, void (*cb)(void*, const char*), void* arg)
+{
+ std::thread(
+ [prompt = std::string(prompt), cb, arg]
+ {
+ std::cout << prompt << ": ";
+ std::cout.flush();
+ std::string line;
+ std::getline(std::cin, line);
+ cb(arg, line.c_str());
+ }).detach();
+}
+
+//------------------------------------------------------------------------------
+
+// This is an asynchronous operation that wraps the C-based API.
+
+// To map our completion handler into a function pointer / void* callback, we
+// need to allocate some state that will live for the duration of the
+// operation. A pointer to this state will be passed to the C-based API.
+template <asio::completion_handler_for<void(std::string)> Handler>
+class read_input_state
+{
+public:
+ read_input_state(Handler&& handler)
+ : handler_(std::move(handler)),
+ work_(asio::make_work_guard(handler_))
+ {
+ }
+
+ // Create the state using the handler's associated allocator.
+ static read_input_state* create(Handler&& handler)
+ {
+ // A unique_ptr deleter that is used to destroy uninitialised objects.
+ struct deleter
+ {
+ // Get the handler's associated allocator type. If the handler does not
+ // specify an associated allocator, we will use a recycling allocator as
+ // the default. As the associated allocator is a proto-allocator, we must
+ // rebind it to the correct type before we can use it to allocate objects.
+ typename std::allocator_traits<
+ asio::associated_allocator_t<Handler,
+ asio::recycling_allocator<void>>>::template
+ rebind_alloc<read_input_state> alloc;
+
+ void operator()(read_input_state* ptr)
+ {
+ std::allocator_traits<decltype(alloc)>::deallocate(alloc, ptr, 1);
+ }
+ } d{asio::get_associated_allocator(handler,
+ asio::recycling_allocator<void>())};
+
+ // Allocate memory for the state.
+ std::unique_ptr<read_input_state, deleter> uninit_ptr(
+ std::allocator_traits<decltype(d.alloc)>::allocate(d.alloc, 1), d);
+
+ // Construct the state into the newly allocated memory. This might throw.
+ read_input_state* ptr =
+ new (uninit_ptr.get()) read_input_state(std::move(handler));
+
+ // Release ownership of the memory and return the newly allocated state.
+ uninit_ptr.release();
+ return ptr;
+ }
+
+ static void callback(void* arg, const char* result)
+ {
+ read_input_state* self = static_cast<read_input_state*>(arg);
+
+ // A unique_ptr deleter that is used to destroy initialised objects.
+ struct deleter
+ {
+ // Get the handler's associated allocator type. If the handler does not
+ // specify an associated allocator, we will use a recycling allocator as
+ // the default. As the associated allocator is a proto-allocator, we must
+ // rebind it to the correct type before we can use it to allocate objects.
+ typename std::allocator_traits<
+ asio::associated_allocator_t<Handler,
+ asio::recycling_allocator<void>>>::template
+ rebind_alloc<read_input_state> alloc;
+
+ void operator()(read_input_state* ptr)
+ {
+ std::allocator_traits<decltype(alloc)>::destroy(alloc, ptr);
+ std::allocator_traits<decltype(alloc)>::deallocate(alloc, ptr, 1);
+ }
+ } d{asio::get_associated_allocator(self->handler_,
+ asio::recycling_allocator<void>())};
+
+ // To conform to the rules regarding asynchronous operations and memory
+ // allocation, we must make a copy of the state and deallocate the memory
+ // before dispatching the completion handler.
+ std::unique_ptr<read_input_state, deleter> state_ptr(self, d);
+ read_input_state state(std::move(*self));
+ state_ptr.reset();
+
+ // Dispatch the completion handler through the handler's associated
+ // executor, using the handler's associated allocator.
+ asio::dispatch(state.work_.get_executor(),
+ asio::bind_allocator(d.alloc,
+ [
+ handler = std::move(state.handler_),
+ result = std::string(result)
+ ]() mutable
+ {
+ std::move(handler)(result);
+ }));
+ }
+
+private:
+ Handler handler_;
+
+ // According to the rules for asynchronous operations, we need to track
+ // outstanding work against the handler's associated executor until the
+ // asynchronous operation is complete.
+ asio::executor_work_guard<
+ asio::associated_executor_t<Handler>> work_;
+};
+
+// The initiating function for the asynchronous operation.
+template <asio::completion_token_for<void(std::string)> CompletionToken>
+auto async_read_input(const std::string& prompt, CompletionToken&& token)
+{
+ // Define a function object that contains the code to launch the asynchronous
+ // operation. This is passed the concrete completion handler, followed by any
+ // additional arguments that were passed through the call to async_initiate.
+ auto init = [](
+ asio::completion_handler_for<void(std::string)> auto handler,
+ const std::string& prompt)
+ {
+ // The body of the initiation function object creates the long-lived state
+ // and passes it to the C-based API, along with the function pointer.
+ using state_type = read_input_state<decltype(handler)>;
+ read_input(prompt.c_str(), &state_type::callback,
+ state_type::create(std::move(handler)));
+ };
+
+ // The async_initiate function is used to transform the supplied completion
+ // token to the completion handler. When calling this function we explicitly
+ // specify the completion signature of the operation. We must also return the
+ // result of the call since the completion token may produce a return value,
+ // such as a future.
+ return asio::async_initiate<CompletionToken, void(std::string)>(
+ init, // First, pass the function object that launches the operation,
+ token, // then the completion token that will be transformed to a handler,
+ prompt); // and, finally, any additional arguments to the function object.
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ // Test our asynchronous operation using a lambda as a callback. We will use
+ // an io_context to obtain an associated executor.
+ async_read_input("Enter your name",
+ asio::bind_executor(io_context,
+ [](const std::string& result)
+ {
+ std::cout << "Hello " << result << "\n";
+ }));
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_read_input("Enter your name", asio::deferred);
+
+ // Launch our asynchronous operation using a lambda as a callback. We will use
+ // an io_context to obtain an associated executor.
+ std::move(op)(
+ asio::bind_executor(io_context,
+ [](const std::string& result)
+ {
+ std::cout << "Hello " << result << "\n";
+ }));
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<std::string> f =
+ async_read_input("Enter your name", asio::use_future);
+
+ std::string result = f.get();
+ std::cout << "Hello " << result << "\n";
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp20/operations/callback_wrapper.cpp b/3rdparty/asio/src/examples/cpp20/operations/callback_wrapper.cpp
new file mode 100644
index 00000000000..f8f37b48944
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/operations/callback_wrapper.cpp
@@ -0,0 +1,154 @@
+//
+// callback_wrapper.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio.hpp>
+#include <iostream>
+
+//------------------------------------------------------------------------------
+
+// This is a mock implementation of an API that uses a move-only function object
+// for exposing a callback. The callback has the signature void(std::string).
+
+template <typename Callback>
+void read_input(const std::string& prompt, Callback cb)
+{
+ std::thread(
+ [prompt, cb = std::move(cb)]() mutable
+ {
+ std::cout << prompt << ": ";
+ std::cout.flush();
+ std::string line;
+ std::getline(std::cin, line);
+ std::move(cb)(std::move(line));
+ }).detach();
+}
+
+//------------------------------------------------------------------------------
+
+// This is an asynchronous operation that wraps the callback-based API.
+
+// The initiating function for the asynchronous operation.
+template <asio::completion_token_for<void(std::string)> CompletionToken>
+auto async_read_input(const std::string& prompt, CompletionToken&& token)
+{
+ // Define a function object that contains the code to launch the asynchronous
+ // operation. This is passed the concrete completion handler, followed by any
+ // additional arguments that were passed through the call to async_initiate.
+ auto init = [](
+ asio::completion_handler_for<void(std::string)> auto handler,
+ const std::string& prompt)
+ {
+ // According to the rules for asynchronous operations, we need to track
+ // outstanding work against the handler's associated executor until the
+ // asynchronous operation is complete.
+ auto work = asio::make_work_guard(handler);
+
+ // Launch the operation with a callback that will receive the result and
+ // pass it through to the asynchronous operation's completion handler.
+ read_input(prompt,
+ [
+ handler = std::move(handler),
+ work = std::move(work)
+ ](std::string result) mutable
+ {
+ // Get the handler's associated allocator. If the handler does not
+ // specify an allocator, use the recycling allocator as the default.
+ auto alloc = asio::get_associated_allocator(
+ handler, asio::recycling_allocator<void>());
+
+ // Dispatch the completion handler through the handler's associated
+ // executor, using the handler's associated allocator.
+ asio::dispatch(work.get_executor(),
+ asio::bind_allocator(alloc,
+ [
+ handler = std::move(handler),
+ result = std::string(result)
+ ]() mutable
+ {
+ std::move(handler)(result);
+ }));
+ });
+ };
+
+ // The async_initiate function is used to transform the supplied completion
+ // token to the completion handler. When calling this function we explicitly
+ // specify the completion signature of the operation. We must also return the
+ // result of the call since the completion token may produce a return value,
+ // such as a future.
+ return asio::async_initiate<CompletionToken, void(std::string)>(
+ init, // First, pass the function object that launches the operation,
+ token, // then the completion token that will be transformed to a handler,
+ prompt); // and, finally, any additional arguments to the function object.
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ // Test our asynchronous operation using a lambda as a callback. We will use
+ // an io_context to specify an associated executor.
+ async_read_input("Enter your name",
+ asio::bind_executor(io_context,
+ [](const std::string& result)
+ {
+ std::cout << "Hello " << result << "\n";
+ }));
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ auto op = async_read_input("Enter your name", asio::deferred);
+
+ // Launch our asynchronous operation using a lambda as a callback. We will use
+ // an io_context to obtain an associated executor.
+ std::move(op)(
+ asio::bind_executor(io_context,
+ [](const std::string& result)
+ {
+ std::cout << "Hello " << result << "\n";
+ }));
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<std::string> f =
+ async_read_input("Enter your name", asio::use_future);
+
+ std::string result = f.get();
+ std::cout << "Hello " << result << "\n";
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp20/operations/composed_1.cpp b/3rdparty/asio/src/examples/cpp20/operations/composed_1.cpp
new file mode 100644
index 00000000000..e7f795e1756
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/operations/composed_1.cpp
@@ -0,0 +1,157 @@
+//
+// composed_1.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <cstring>
+#include <iostream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+//------------------------------------------------------------------------------
+
+// This is the simplest example of a composed asynchronous operation, where we
+// simply repackage an existing operation. The asynchronous operation
+// requirements are met by delegating responsibility to the underlying
+// operation.
+
+template <
+ asio::completion_token_for<void(std::error_code, std::size_t)>
+ CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const char* message, CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is void.
+ // However, when the completion token is asio::yield_context (used for
+ // stackful coroutines) the return type would be std::size_t, and when the
+ // completion token is asio::use_future it would be std::future<std::size_t>.
+ // When the completion token is asio::deferred, the return type differs for
+ // each asynchronous operation.
+ //
+ // In C++20 we can omit the return type as it is automatically deduced from
+ // the return type of our underlying asynchronous operation.
+{
+ // When delegating to the underlying operation we must take care to perfectly
+ // forward the completion token. This ensures that our operation works
+ // correctly with move-only function objects as callbacks, as well as other
+ // completion token types.
+ return asio::async_write(socket,
+ asio::buffer(message, std::strlen(message)),
+ std::forward<CompletionToken>(token));
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, "Testing callback\r\n",
+ [](const std::error_code& error, std::size_t n)
+ {
+ if (!error)
+ {
+ std::cout << n << " bytes transferred\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ asio::async_operation auto op = async_write_message(
+ socket, "Testing deferred\r\n", asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error, std::size_t n)
+ {
+ if (!error)
+ {
+ std::cout << n << " bytes transferred\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<std::size_t> f = async_write_message(
+ socket, "Testing future\r\n", asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ std::size_t n = f.get();
+ std::cout << n << " bytes transferred\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp20/operations/composed_2.cpp b/3rdparty/asio/src/examples/cpp20/operations/composed_2.cpp
new file mode 100644
index 00000000000..ada029d38f0
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/operations/composed_2.cpp
@@ -0,0 +1,225 @@
+//
+// composed_2.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <cstring>
+#include <iostream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This next simplest example of a composed asynchronous operation involves
+// repackaging multiple operations but choosing to invoke just one of them. All
+// of these underlying operations have the same completion signature. The
+// asynchronous operation requirements are met by delegating responsibility to
+// the underlying operations.
+
+template <
+ asio::completion_token_for<void(std::error_code, std::size_t)>
+ CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const char* message, bool allow_partial_write,
+ CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is void.
+ // However, when the completion token is asio::yield_context (used for
+ // stackful coroutines) the return type would be std::size_t, and when the
+ // completion token is asio::use_future it would be std::future<std::size_t>.
+ // When the completion token is asio::deferred, the return type differs for
+ // each asynchronous operation.
+ //
+ // In C++20 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_initiate.
+{
+ // In addition to determining the mechanism by which an asynchronous
+ // operation delivers its result, a completion token also determines the time
+ // when the operation commences. For example, when the completion token is a
+ // simple callback the operation commences before the initiating function
+ // returns. However, if the completion token's delivery mechanism uses a
+ // future, we might instead want to defer initiation of the operation until
+ // the returned future object is waited upon.
+ //
+ // To enable this, when implementing an asynchronous operation we must
+ // package the initiation step as a function object. The initiation function
+ // object's call operator is passed the concrete completion handler produced
+ // by the completion token. This completion handler matches the asynchronous
+ // operation's completion handler signature, which in this example is:
+ //
+ // void(std::error_code error, std::size_t)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments in the lambda capture set. However, we should prefer to
+ // propagate them as function call arguments as this allows the completion
+ // token to optimise how they are passed. For example, a lazy future which
+ // defers initiation would need to make a decay-copy of the arguments, but
+ // when using a simple callback the arguments can be trivially forwarded
+ // straight through.)
+ auto initiation = [](
+ asio::completion_handler_for<void(std::error_code, std::size_t)>
+ auto&& completion_handler,
+ tcp::socket& socket,
+ const char* message,
+ bool allow_partial_write)
+ {
+ if (allow_partial_write)
+ {
+ // When delegating to an underlying operation we must take care to
+ // perfectly forward the completion handler. This ensures that our
+ // operation works correctly with move-only function objects as
+ // callbacks.
+ return socket.async_write_some(
+ asio::buffer(message, std::strlen(message)),
+ std::forward<decltype(completion_handler)>(completion_handler));
+ }
+ else
+ {
+ // As above, we must perfectly forward the completion handler when calling
+ // the alternate underlying operation.
+ return asio::async_write(socket,
+ asio::buffer(message, std::strlen(message)),
+ std::forward<decltype(completion_handler)>(completion_handler));
+ }
+ };
+
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code, std::size_t)>(
+ initiation, token, std::ref(socket), message, allow_partial_write);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, "Testing callback\r\n", false,
+ [](const std::error_code& error, std::size_t n)
+ {
+ if (!error)
+ {
+ std::cout << n << " bytes transferred\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ asio::async_operation auto op = async_write_message(
+ socket, "Testing deferred\r\n", false, asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error, std::size_t n)
+ {
+ if (!error)
+ {
+ std::cout << n << " bytes transferred\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<std::size_t> f = async_write_message(
+ socket, "Testing future\r\n", false, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ std::size_t n = f.get();
+ std::cout << n << " bytes transferred\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp20/operations/composed_3.cpp b/3rdparty/asio/src/examples/cpp20/operations/composed_3.cpp
new file mode 100644
index 00000000000..46436a68e28
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/operations/composed_3.cpp
@@ -0,0 +1,232 @@
+//
+// composed_3.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/bind_executor.hpp>
+#include <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <cstring>
+#include <functional>
+#include <iostream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// In this composed operation we repackage an existing operation, but with a
+// different completion handler signature. The asynchronous operation
+// requirements are met by delegating responsibility to the underlying
+// operation.
+
+template <
+ asio::completion_token_for<void(std::error_code)> CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const char* message, CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++20 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_initiate.
+{
+ // In addition to determining the mechanism by which an asynchronous
+ // operation delivers its result, a completion token also determines the time
+ // when the operation commences. For example, when the completion token is a
+ // simple callback the operation commences before the initiating function
+ // returns. However, if the completion token's delivery mechanism uses a
+ // future, we might instead want to defer initiation of the operation until
+ // the returned future object is waited upon.
+ //
+ // To enable this, when implementing an asynchronous operation we must
+ // package the initiation step as a function object. The initiation function
+ // object's call operator is passed the concrete completion handler produced
+ // by the completion token. This completion handler matches the asynchronous
+ // operation's completion handler signature, which in this example is:
+ //
+ // void(std::error_code error)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments in the lambda capture set. However, we should prefer to
+ // propagate them as function call arguments as this allows the completion
+ // token to optimise how they are passed. For example, a lazy future which
+ // defers initiation would need to make a decay-copy of the arguments, but
+ // when using a simple callback the arguments can be trivially forwarded
+ // straight through.)
+ auto initiation = [](
+ asio::completion_handler_for<void(std::error_code)>
+ auto&& completion_handler,
+ tcp::socket& socket,
+ const char* message)
+ {
+ // The async_write operation has a completion handler signature of:
+ //
+ // void(std::error_code error, std::size n)
+ //
+ // This differs from our operation's signature in that it is also passed
+ // the number of bytes transferred as an argument of type std::size_t. We
+ // will adapt our completion handler to async_write's completion handler
+ // signature by using std::bind, which drops the additional argument.
+ //
+ // However, it is essential to the correctness of our composed operation
+ // that we preserve the executor of the user-supplied completion handler.
+ // The std::bind function will not do this for us, so we must do this by
+ // first obtaining the completion handler's associated executor (defaulting
+ // to the I/O executor - in this case the executor of the socket - if the
+ // completion handler does not have its own) ...
+ auto executor = asio::get_associated_executor(
+ completion_handler, socket.get_executor());
+
+ // ... and then binding this executor to our adapted completion handler
+ // using the asio::bind_executor function.
+ asio::async_write(socket,
+ asio::buffer(message, std::strlen(message)),
+ asio::bind_executor(executor,
+ std::bind(std::forward<decltype(completion_handler)>(
+ completion_handler), std::placeholders::_1)));
+ };
+
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ initiation, token, std::ref(socket), message);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, "Testing callback\r\n",
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ asio::async_operation auto op = async_write_message(
+ socket, "Testing deferred\r\n", asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_message(
+ socket, "Testing future\r\n", asio::use_future);
+
+ io_context.run();
+
+ // Get the result of the operation.
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Message sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp20/operations/composed_4.cpp b/3rdparty/asio/src/examples/cpp20/operations/composed_4.cpp
new file mode 100644
index 00000000000..069f57ce1ac
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/operations/composed_4.cpp
@@ -0,0 +1,247 @@
+//
+// composed_4.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/bind_executor.hpp>
+#include <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <cstring>
+#include <functional>
+#include <iostream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// In this composed operation we repackage an existing operation, but with a
+// different completion handler signature. We will also intercept an empty
+// message as an invalid argument, and propagate the corresponding error to the
+// user. The asynchronous operation requirements are met by delegating
+// responsibility to the underlying operation.
+
+template <
+ asio::completion_token_for<void(std::error_code)> CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const char* message, CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++20 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_initiate.
+{
+ // In addition to determining the mechanism by which an asynchronous
+ // operation delivers its result, a completion token also determines the time
+ // when the operation commences. For example, when the completion token is a
+ // simple callback the operation commences before the initiating function
+ // returns. However, if the completion token's delivery mechanism uses a
+ // future, we might instead want to defer initiation of the operation until
+ // the returned future object is waited upon.
+ //
+ // To enable this, when implementing an asynchronous operation we must
+ // package the initiation step as a function object. The initiation function
+ // object's call operator is passed the concrete completion handler produced
+ // by the completion token. This completion handler matches the asynchronous
+ // operation's completion handler signature, which in this example is:
+ //
+ // void(std::error_code error)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments in the lambda capture set. However, we should prefer to
+ // propagate them as function call arguments as this allows the completion
+ // token to optimise how they are passed. For example, a lazy future which
+ // defers initiation would need to make a decay-copy of the arguments, but
+ // when using a simple callback the arguments can be trivially forwarded
+ // straight through.)
+ auto initiation = [](
+ asio::completion_handler_for<void(std::error_code)>
+ auto&& completion_handler,
+ tcp::socket& socket,
+ const char* message)
+ {
+ // The post operation has a completion handler signature of:
+ //
+ // void()
+ //
+ // and the async_write operation has a completion handler signature of:
+ //
+ // void(std::error_code error, std::size n)
+ //
+ // Both of these operations' completion handler signatures differ from our
+ // operation's completion handler signature. We will adapt our completion
+ // handler to these signatures by using std::bind, which drops the
+ // additional arguments.
+ //
+ // However, it is essential to the correctness of our composed operation
+ // that we preserve the executor of the user-supplied completion handler.
+ // The std::bind function will not do this for us, so we must do this by
+ // first obtaining the completion handler's associated executor (defaulting
+ // to the I/O executor - in this case the executor of the socket - if the
+ // completion handler does not have its own) ...
+ auto executor = asio::get_associated_executor(
+ completion_handler, socket.get_executor());
+
+ // ... and then binding this executor to our adapted completion handler
+ // using the asio::bind_executor function.
+ std::size_t length = std::strlen(message);
+ if (length == 0)
+ {
+ asio::post(
+ asio::bind_executor(executor,
+ std::bind(std::forward<decltype(completion_handler)>(
+ completion_handler), asio::error::invalid_argument)));
+ }
+ else
+ {
+ asio::async_write(socket,
+ asio::buffer(message, length),
+ asio::bind_executor(executor,
+ std::bind(std::forward<decltype(completion_handler)>(
+ completion_handler), std::placeholders::_1)));
+ }
+ };
+
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ initiation, token, std::ref(socket), message);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, "",
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ asio::async_operation auto op =
+ async_write_message(socket, "", asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_message(
+ socket, "", asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Message sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp20/operations/composed_5.cpp b/3rdparty/asio/src/examples/cpp20/operations/composed_5.cpp
new file mode 100644
index 00000000000..bec83ec3a59
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/operations/composed_5.cpp
@@ -0,0 +1,284 @@
+//
+// composed_5.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This composed operation automatically serialises a message, using its I/O
+// streams insertion operator, before sending it on the socket. To do this, it
+// must allocate a buffer for the encoded message and ensure this buffer's
+// validity until the underlying async_write operation completes.
+
+template <typename T,
+ asio::completion_token_for<void(std::error_code)> CompletionToken>
+auto async_write_message(tcp::socket& socket,
+ const T& message, CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++20 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_initiate.
+{
+ // In addition to determining the mechanism by which an asynchronous
+ // operation delivers its result, a completion token also determines the time
+ // when the operation commences. For example, when the completion token is a
+ // simple callback the operation commences before the initiating function
+ // returns. However, if the completion token's delivery mechanism uses a
+ // future, we might instead want to defer initiation of the operation until
+ // the returned future object is waited upon.
+ //
+ // To enable this, when implementing an asynchronous operation we must
+ // package the initiation step as a function object. The initiation function
+ // object's call operator is passed the concrete completion handler produced
+ // by the completion token. This completion handler matches the asynchronous
+ // operation's completion handler signature, which in this example is:
+ //
+ // void(std::error_code error)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments in the lambda capture set. However, we should prefer to
+ // propagate them as function call arguments as this allows the completion
+ // token to optimise how they are passed. For example, a lazy future which
+ // defers initiation would need to make a decay-copy of the arguments, but
+ // when using a simple callback the arguments can be trivially forwarded
+ // straight through.)
+ auto initiation = [](
+ asio::completion_handler_for<void(std::error_code)>
+ auto&& completion_handler,
+ tcp::socket& socket,
+ std::unique_ptr<std::string> encoded_message)
+ {
+ // In this example, the composed operation's intermediate completion
+ // handler is implemented as a hand-crafted function object, rather than
+ // using a lambda or std::bind.
+ struct intermediate_completion_handler
+ {
+ // The intermediate completion handler holds a reference to the socket so
+ // that it can obtain the I/O executor (see get_executor below).
+ tcp::socket& socket_;
+
+ // The allocated buffer for the encoded message. The std::unique_ptr
+ // smart pointer is move-only, and as a consequence our intermediate
+ // completion handler is also move-only.
+ std::unique_ptr<std::string> encoded_message_;
+
+ // The user-supplied completion handler.
+ typename std::decay<decltype(completion_handler)>::type handler_;
+
+ // The function call operator matches the completion signature of the
+ // async_write operation.
+ void operator()(const std::error_code& error, std::size_t /*n*/)
+ {
+ // Deallocate the encoded message before calling the user-supplied
+ // completion handler.
+ encoded_message_.reset();
+
+ // Call the user-supplied handler with the result of the operation.
+ // The arguments must match the completion signature of our composed
+ // operation.
+ handler_(error);
+ }
+
+ // It is essential to the correctness of our composed operation that we
+ // preserve the executor of the user-supplied completion handler. With a
+ // hand-crafted function object we can do this by defining a nested type
+ // executor_type and member function get_executor. These obtain the
+ // completion handler's associated executor, and default to the I/O
+ // executor - in this case the executor of the socket - if the completion
+ // handler does not have its own.
+ using executor_type = asio::associated_executor_t<
+ typename std::decay<decltype(completion_handler)>::type,
+ tcp::socket::executor_type>;
+
+ executor_type get_executor() const noexcept
+ {
+ return asio::get_associated_executor(
+ handler_, socket_.get_executor());
+ }
+
+ // Although not necessary for correctness, we may also preserve the
+ // allocator of the user-supplied completion handler. This is achieved by
+ // defining a nested type allocator_type and member function
+ // get_allocator. These obtain the completion handler's associated
+ // allocator, and default to std::allocator<void> if the completion
+ // handler does not have its own.
+ using allocator_type = asio::associated_allocator_t<
+ typename std::decay<decltype(completion_handler)>::type,
+ std::allocator<void>>;
+
+ allocator_type get_allocator() const noexcept
+ {
+ return asio::get_associated_allocator(
+ handler_, std::allocator<void>{});
+ }
+ };
+
+ // Initiate the underlying async_write operation using our intermediate
+ // completion handler.
+ auto encoded_message_buffer = asio::buffer(*encoded_message);
+ asio::async_write(socket, encoded_message_buffer,
+ intermediate_completion_handler{socket, std::move(encoded_message),
+ std::forward<decltype(completion_handler)>(completion_handler)});
+ };
+
+ // Encode the message and copy it into an allocated buffer. The buffer will
+ // be maintained for the lifetime of the asynchronous operation.
+ std::ostringstream os;
+ os << message;
+ std::unique_ptr<std::string> encoded_message(new std::string(os.str()));
+
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ initiation, token, std::ref(socket),
+ std::move(encoded_message));
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_message(socket, 123456,
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ asio::async_operation auto op = async_write_message(
+ socket, std::string("abcdef"), asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Message sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_message(
+ socket, 654.321, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Message sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Exception: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp20/operations/composed_6.cpp b/3rdparty/asio/src/examples/cpp20/operations/composed_6.cpp
new file mode 100644
index 00000000000..77e2f50f93e
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/operations/composed_6.cpp
@@ -0,0 +1,345 @@
+//
+// composed_6.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/deferred.hpp>
+#include <asio/executor_work_guard.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/steady_timer.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_initiate function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This composed operation shows composition of multiple underlying operations.
+// It automatically serialises a message, using its I/O streams insertion
+// operator, before sending it N times on the socket. To do this, it must
+// allocate a buffer for the encoded message and ensure this buffer's validity
+// until all underlying async_write operation complete. A one second delay is
+// inserted prior to each write operation, using a steady_timer.
+
+template <typename T,
+ asio::completion_token_for<void(std::error_code)> CompletionToken>
+auto async_write_messages(tcp::socket& socket,
+ const T& message, std::size_t repeat_count,
+ CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++20 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_initiate.
+{
+ // In addition to determining the mechanism by which an asynchronous
+ // operation delivers its result, a completion token also determines the time
+ // when the operation commences. For example, when the completion token is a
+ // simple callback the operation commences before the initiating function
+ // returns. However, if the completion token's delivery mechanism uses a
+ // future, we might instead want to defer initiation of the operation until
+ // the returned future object is waited upon.
+ //
+ // To enable this, when implementing an asynchronous operation we must
+ // package the initiation step as a function object. The initiation function
+ // object's call operator is passed the concrete completion handler produced
+ // by the completion token. This completion handler matches the asynchronous
+ // operation's completion handler signature, which in this example is:
+ //
+ // void(std::error_code error)
+ //
+ // The initiation function object also receives any additional arguments
+ // required to start the operation. (Note: We could have instead passed these
+ // arguments in the lambda capture set. However, we should prefer to
+ // propagate them as function call arguments as this allows the completion
+ // token to optimise how they are passed. For example, a lazy future which
+ // defers initiation would need to make a decay-copy of the arguments, but
+ // when using a simple callback the arguments can be trivially forwarded
+ // straight through.)
+ auto initiation = [](
+ asio::completion_handler_for<void(std::error_code)>
+ auto&& completion_handler,
+ tcp::socket& socket,
+ std::unique_ptr<std::string> encoded_message,
+ std::size_t repeat_count,
+ std::unique_ptr<asio::steady_timer> delay_timer)
+ {
+ // In this example, the composed operation's intermediate completion
+ // handler is implemented as a hand-crafted function object.
+ struct intermediate_completion_handler
+ {
+ // The intermediate completion handler holds a reference to the socket as
+ // it is used for multiple async_write operations, as well as for
+ // obtaining the I/O executor (see get_executor below).
+ tcp::socket& socket_;
+
+ // The allocated buffer for the encoded message. The std::unique_ptr
+ // smart pointer is move-only, and as a consequence our intermediate
+ // completion handler is also move-only.
+ std::unique_ptr<std::string> encoded_message_;
+
+ // The repeat count remaining.
+ std::size_t repeat_count_;
+
+ // A steady timer used for introducing a delay.
+ std::unique_ptr<asio::steady_timer> delay_timer_;
+
+ // To manage the cycle between the multiple underlying asychronous
+ // operations, our intermediate completion handler is implemented as a
+ // state machine.
+ enum { starting, waiting, writing } state_;
+
+ // As our composed operation performs multiple underlying I/O operations,
+ // we should maintain a work object against the I/O executor. This tells
+ // the I/O executor that there is still more work to come in the future.
+ asio::executor_work_guard<tcp::socket::executor_type> io_work_;
+
+ // The user-supplied completion handler, called once only on completion
+ // of the entire composed operation.
+ typename std::decay<decltype(completion_handler)>::type handler_;
+
+ // By having a default value for the second argument, this function call
+ // operator matches the completion signature of both the async_write and
+ // steady_timer::async_wait operations.
+ void operator()(const std::error_code& error, std::size_t = 0)
+ {
+ if (!error)
+ {
+ switch (state_)
+ {
+ case starting:
+ case writing:
+ if (repeat_count_ > 0)
+ {
+ --repeat_count_;
+ state_ = waiting;
+ delay_timer_->expires_after(std::chrono::seconds(1));
+ delay_timer_->async_wait(std::move(*this));
+ return; // Composed operation not yet complete.
+ }
+ break; // Composed operation complete, continue below.
+ case waiting:
+ state_ = writing;
+ asio::async_write(socket_,
+ asio::buffer(*encoded_message_), std::move(*this));
+ return; // Composed operation not yet complete.
+ }
+ }
+
+ // This point is reached only on completion of the entire composed
+ // operation.
+
+ // We no longer have any future work coming for the I/O executor.
+ io_work_.reset();
+
+ // Deallocate the encoded message before calling the user-supplied
+ // completion handler.
+ encoded_message_.reset();
+
+ // Call the user-supplied handler with the result of the operation.
+ handler_(error);
+ }
+
+ // It is essential to the correctness of our composed operation that we
+ // preserve the executor of the user-supplied completion handler. With a
+ // hand-crafted function object we can do this by defining a nested type
+ // executor_type and member function get_executor. These obtain the
+ // completion handler's associated executor, and default to the I/O
+ // executor - in this case the executor of the socket - if the completion
+ // handler does not have its own.
+ using executor_type = asio::associated_executor_t<
+ typename std::decay<decltype(completion_handler)>::type,
+ tcp::socket::executor_type>;
+
+ executor_type get_executor() const noexcept
+ {
+ return asio::get_associated_executor(
+ handler_, socket_.get_executor());
+ }
+
+ // Although not necessary for correctness, we may also preserve the
+ // allocator of the user-supplied completion handler. This is achieved by
+ // defining a nested type allocator_type and member function
+ // get_allocator. These obtain the completion handler's associated
+ // allocator, and default to std::allocator<void> if the completion
+ // handler does not have its own.
+ using allocator_type = asio::associated_allocator_t<
+ typename std::decay<decltype(completion_handler)>::type,
+ std::allocator<void>>;
+
+ allocator_type get_allocator() const noexcept
+ {
+ return asio::get_associated_allocator(
+ handler_, std::allocator<void>{});
+ }
+ };
+
+ // Initiate the underlying async_write operation using our intermediate
+ // completion handler.
+ auto encoded_message_buffer = asio::buffer(*encoded_message);
+ asio::async_write(socket, encoded_message_buffer,
+ intermediate_completion_handler{
+ socket, std::move(encoded_message),
+ repeat_count, std::move(delay_timer),
+ intermediate_completion_handler::starting,
+ asio::make_work_guard(socket.get_executor()),
+ std::forward<decltype(completion_handler)>(completion_handler)});
+ };
+
+ // Encode the message and copy it into an allocated buffer. The buffer will
+ // be maintained for the lifetime of the composed asynchronous operation.
+ std::ostringstream os;
+ os << message;
+ std::unique_ptr<std::string> encoded_message(new std::string(os.str()));
+
+ // Create a steady_timer to be used for the delay between messages.
+ std::unique_ptr<asio::steady_timer> delay_timer(
+ new asio::steady_timer(socket.get_executor()));
+
+ // The asio::async_initiate function takes:
+ //
+ // - our initiation function object,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any additional arguments we need to initiate the operation.
+ //
+ // It then asks the completion token to create a completion handler (i.e. a
+ // callback) with the specified signature, and invoke the initiation function
+ // object with this completion handler as well as the additional arguments.
+ // The return value of async_initiate is the result of our operation's
+ // initiating function.
+ //
+ // Note that we wrap non-const reference arguments in std::reference_wrapper
+ // to prevent incorrect decay-copies of these objects.
+ return asio::async_initiate<
+ CompletionToken, void(std::error_code)>(
+ initiation, token, std::ref(socket),
+ std::move(encoded_message), repeat_count,
+ std::move(delay_timer));
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_messages(socket, "Testing callback\r\n", 5,
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ asio::async_operation auto op = async_write_messages(
+ socket, "Testing deferred\r\n", 5, asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_messages(
+ socket, "Testing future\r\n", 5, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Messages sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp20/operations/composed_7.cpp b/3rdparty/asio/src/examples/cpp20/operations/composed_7.cpp
new file mode 100644
index 00000000000..9ae44c797fb
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/operations/composed_7.cpp
@@ -0,0 +1,262 @@
+//
+// composed_7.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/compose.hpp>
+#include <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/steady_timer.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_compose function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This composed operation shows composition of multiple underlying operations.
+// It automatically serialises a message, using its I/O streams insertion
+// operator, before sending it N times on the socket. To do this, it must
+// allocate a buffer for the encoded message and ensure this buffer's validity
+// until all underlying async_write operation complete. A one second delay is
+// inserted prior to each write operation, using a steady_timer.
+
+template <typename T,
+ asio::completion_token_for<void(std::error_code)> CompletionToken>
+auto async_write_messages(tcp::socket& socket,
+ const T& message, std::size_t repeat_count,
+ CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++20 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_compose.
+{
+ // Encode the message and copy it into an allocated buffer. The buffer will
+ // be maintained for the lifetime of the composed asynchronous operation.
+ std::ostringstream os;
+ os << message;
+ std::unique_ptr<std::string> encoded_message(new std::string(os.str()));
+
+ // Create a steady_timer to be used for the delay between messages.
+ std::unique_ptr<asio::steady_timer> delay_timer(
+ new asio::steady_timer(socket.get_executor()));
+
+ // To manage the cycle between the multiple underlying asychronous
+ // operations, our implementation is a state machine.
+ enum { starting, waiting, writing };
+
+ // The asio::async_compose function takes:
+ //
+ // - our asynchronous operation implementation,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any I/O objects (or executors) used by the operation
+ //
+ // It then wraps our implementation, which is implemented here as a state
+ // machine in a lambda, in an intermediate completion handler that meets the
+ // requirements of a conforming asynchronous operation. This includes
+ // tracking outstanding work against the I/O executors associated with the
+ // operation (in this example, this is the socket's executor).
+ //
+ // The first argument to our lambda is a reference to the enclosing
+ // intermediate completion handler. This intermediate completion handler is
+ // provided for us by the asio::async_compose function, and takes care
+ // of all the details required to implement a conforming asynchronous
+ // operation. When calling an underlying asynchronous operation, we pass it
+ // this enclosing intermediate completion handler as the completion token.
+ //
+ // All arguments to our lambda after the first must be defaulted to allow the
+ // state machine to be started, as well as to allow the completion handler to
+ // match the completion signature of both the async_write and
+ // steady_timer::async_wait operations.
+ return asio::async_compose<
+ CompletionToken, void(std::error_code)>(
+ [
+ // The implementation holds a reference to the socket as it is used for
+ // multiple async_write operations.
+ &socket,
+
+ // The allocated buffer for the encoded message. The std::unique_ptr
+ // smart pointer is move-only, and as a consequence our lambda
+ // implementation is also move-only.
+ encoded_message = std::move(encoded_message),
+
+ // The repeat count remaining.
+ repeat_count,
+
+ // A steady timer used for introducing a delay.
+ delay_timer = std::move(delay_timer),
+
+ // To manage the cycle between the multiple underlying asychronous
+ // operations, our implementation is a state machine.
+ state = starting
+ ]
+ (
+ auto& self,
+ const std::error_code& error = {},
+ std::size_t = 0
+ ) mutable
+ {
+ if (!error)
+ {
+ switch (state)
+ {
+ case starting:
+ case writing:
+ if (repeat_count > 0)
+ {
+ --repeat_count;
+ state = waiting;
+ delay_timer->expires_after(std::chrono::seconds(1));
+ delay_timer->async_wait(std::move(self));
+ return; // Composed operation not yet complete.
+ }
+ break; // Composed operation complete, continue below.
+ case waiting:
+ state = writing;
+ asio::async_write(socket,
+ asio::buffer(*encoded_message), std::move(self));
+ return; // Composed operation not yet complete.
+ }
+ }
+
+ // This point is reached only on completion of the entire composed
+ // operation.
+
+ // Deallocate the encoded message and delay timer before calling the
+ // user-supplied completion handler.
+ encoded_message.reset();
+ delay_timer.reset();
+
+ // Call the user-supplied handler with the result of the operation.
+ self.complete(error);
+ },
+ token, socket);
+}
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_messages(socket, "Testing callback\r\n", 5,
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ asio::async_operation auto op = async_write_messages(
+ socket, "Testing deferred\r\n", 5, asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_messages(
+ socket, "Testing future\r\n", 5, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Messages sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp20/operations/composed_8.cpp b/3rdparty/asio/src/examples/cpp20/operations/composed_8.cpp
new file mode 100644
index 00000000000..2735d74d047
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/operations/composed_8.cpp
@@ -0,0 +1,255 @@
+//
+// composed_8.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/compose.hpp>
+#include <asio/coroutine.hpp>
+#include <asio/deferred.hpp>
+#include <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/steady_timer.hpp>
+#include <asio/use_future.hpp>
+#include <asio/write.hpp>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+using asio::ip::tcp;
+
+// NOTE: This example requires the new asio::async_compose function. For
+// an example that works with the Networking TS style of completion tokens,
+// please see an older version of asio.
+
+//------------------------------------------------------------------------------
+
+// This composed operation shows composition of multiple underlying operations,
+// using asio's stackless coroutines support to express the flow of control. It
+// automatically serialises a message, using its I/O streams insertion
+// operator, before sending it N times on the socket. To do this, it must
+// allocate a buffer for the encoded message and ensure this buffer's validity
+// until all underlying async_write operation complete. A one second delay is
+// inserted prior to each write operation, using a steady_timer.
+
+#include <asio/yield.hpp>
+
+template <typename T,
+ asio::completion_token_for<void(std::error_code)> CompletionToken>
+auto async_write_messages(tcp::socket& socket,
+ const T& message, std::size_t repeat_count,
+ CompletionToken&& token)
+ // The return type of the initiating function is deduced from the combination
+ // of:
+ //
+ // - the CompletionToken type,
+ // - the completion handler signature, and
+ // - the asynchronous operation's initiation function object.
+ //
+ // When the completion token is a simple callback, the return type is always
+ // void. In this example, when the completion token is asio::yield_context
+ // (used for stackful coroutines) the return type would also be void, as
+ // there is no non-error argument to the completion handler. When the
+ // completion token is asio::use_future it would be std::future<void>. When
+ // the completion token is asio::deferred, the return type differs for each
+ // asynchronous operation.
+ //
+ // In C++20 we can omit the return type as it is automatically deduced from
+ // the return type of asio::async_compose.
+{
+ // Encode the message and copy it into an allocated buffer. The buffer will
+ // be maintained for the lifetime of the composed asynchronous operation.
+ std::ostringstream os;
+ os << message;
+ std::unique_ptr<std::string> encoded_message(new std::string(os.str()));
+
+ // Create a steady_timer to be used for the delay between messages.
+ std::unique_ptr<asio::steady_timer> delay_timer(
+ new asio::steady_timer(socket.get_executor()));
+
+ // The asio::async_compose function takes:
+ //
+ // - our asynchronous operation implementation,
+ // - the completion token,
+ // - the completion handler signature, and
+ // - any I/O objects (or executors) used by the operation
+ //
+ // It then wraps our implementation, which is implemented here as a stackless
+ // coroutine in a lambda, in an intermediate completion handler that meets the
+ // requirements of a conforming asynchronous operation. This includes
+ // tracking outstanding work against the I/O executors associated with the
+ // operation (in this example, this is the socket's executor).
+ //
+ // The first argument to our lambda is a reference to the enclosing
+ // intermediate completion handler. This intermediate completion handler is
+ // provided for us by the asio::async_compose function, and takes care
+ // of all the details required to implement a conforming asynchronous
+ // operation. When calling an underlying asynchronous operation, we pass it
+ // this enclosing intermediate completion handler as the completion token.
+ //
+ // All arguments to our lambda after the first must be defaulted to allow the
+ // state machine to be started, as well as to allow the completion handler to
+ // match the completion signature of both the async_write and
+ // steady_timer::async_wait operations.
+ return asio::async_compose<
+ CompletionToken, void(std::error_code)>(
+ [
+ // The implementation holds a reference to the socket as it is used for
+ // multiple async_write operations.
+ &socket,
+
+ // The allocated buffer for the encoded message. The std::unique_ptr
+ // smart pointer is move-only, and as a consequence our lambda
+ // implementation is also move-only.
+ encoded_message = std::move(encoded_message),
+
+ // The repeat count remaining.
+ repeat_count,
+
+ // A steady timer used for introducing a delay.
+ delay_timer = std::move(delay_timer),
+
+ // The coroutine state.
+ coro = asio::coroutine()
+ ]
+ (
+ auto& self,
+ const std::error_code& error = {},
+ std::size_t = 0
+ ) mutable
+ {
+ reenter (coro)
+ {
+ while (repeat_count > 0)
+ {
+ --repeat_count;
+
+ delay_timer->expires_after(std::chrono::seconds(1));
+ yield delay_timer->async_wait(std::move(self));
+ if (error)
+ break;
+
+ yield asio::async_write(socket,
+ asio::buffer(*encoded_message), std::move(self));
+ if (error)
+ break;
+ }
+
+ // Deallocate the encoded message and delay timer before calling the
+ // user-supplied completion handler.
+ encoded_message.reset();
+ delay_timer.reset();
+
+ // Call the user-supplied handler with the result of the operation.
+ self.complete(error);
+ }
+ },
+ token, socket);
+}
+
+#include <asio/unyield.hpp>
+
+//------------------------------------------------------------------------------
+
+void test_callback()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using a lambda as a callback.
+ async_write_messages(socket, "Testing callback\r\n", 5,
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_deferred()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the deferred completion token. This
+ // token causes the operation's initiating function to package up the
+ // operation with its arguments to return a function object, which may then be
+ // used to launch the asynchronous operation.
+ asio::async_operation auto op = async_write_messages(
+ socket, "Testing deferred\r\n", 5, asio::deferred);
+
+ // Launch the operation using a lambda as a callback.
+ std::move(op)(
+ [](const std::error_code& error)
+ {
+ if (!error)
+ {
+ std::cout << "Messages sent\n";
+ }
+ else
+ {
+ std::cout << "Error: " << error.message() << "\n";
+ }
+ });
+
+ io_context.run();
+}
+
+//------------------------------------------------------------------------------
+
+void test_future()
+{
+ asio::io_context io_context;
+
+ tcp::acceptor acceptor(io_context, {tcp::v4(), 55555});
+ tcp::socket socket = acceptor.accept();
+
+ // Test our asynchronous operation using the use_future completion token.
+ // This token causes the operation's initiating function to return a future,
+ // which may be used to synchronously wait for the result of the operation.
+ std::future<void> f = async_write_messages(
+ socket, "Testing future\r\n", 5, asio::use_future);
+
+ io_context.run();
+
+ try
+ {
+ // Get the result of the operation.
+ f.get();
+ std::cout << "Messages sent\n";
+ }
+ catch (const std::exception& e)
+ {
+ std::cout << "Error: " << e.what() << "\n";
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main()
+{
+ test_callback();
+ test_deferred();
+ test_future();
+}
diff --git a/3rdparty/asio/src/examples/cpp20/type_erasure/line_reader.hpp b/3rdparty/asio/src/examples/cpp20/type_erasure/line_reader.hpp
new file mode 100644
index 00000000000..fa19aec6b13
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/type_erasure/line_reader.hpp
@@ -0,0 +1,39 @@
+//
+// line_reader.hpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef LINE_READER_HPP
+#define LINE_READER_HPP
+
+#include <asio/any_completion_handler.hpp>
+#include <asio/async_result.hpp>
+#include <asio/error.hpp>
+#include <string>
+
+class line_reader
+{
+public:
+ virtual ~line_reader() {}
+
+ template <typename CompletionToken>
+ auto async_read_line(std::string prompt, CompletionToken&& token)
+ {
+ return asio::async_initiate<CompletionToken, void(asio::error_code, std::string)>(
+ [](auto handler, line_reader* self, std::string prompt)
+ {
+ self->async_read_line_impl(std::move(prompt), std::move(handler));
+ }, token, this, prompt);
+ }
+
+private:
+ virtual void async_read_line_impl(std::string prompt,
+ asio::any_completion_handler<void(asio::error_code, std::string)> handler) = 0;
+};
+
+#endif // LINE_READER_HPP
diff --git a/3rdparty/asio/src/examples/cpp20/type_erasure/main.cpp b/3rdparty/asio/src/examples/cpp20/type_erasure/main.cpp
new file mode 100644
index 00000000000..1b80dcd23ee
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/type_erasure/main.cpp
@@ -0,0 +1,35 @@
+//
+// main.cpp
+// ~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "line_reader.hpp"
+#include "sleep.hpp"
+#include "stdin_line_reader.hpp"
+#include <asio/co_spawn.hpp>
+#include <asio/detached.hpp>
+#include <asio/io_context.hpp>
+#include <asio/use_awaitable.hpp>
+#include <iostream>
+
+asio::awaitable<void> do_read(line_reader& reader)
+{
+ for (int i = 0; i < 10; ++i)
+ {
+ std::cout << co_await reader.async_read_line("Enter something: ", asio::use_awaitable);
+ co_await async_sleep(co_await asio::this_coro::executor, std::chrono::seconds(1), asio::use_awaitable);
+ }
+}
+
+int main()
+{
+ asio::io_context ctx{1};
+ stdin_line_reader reader{ctx.get_executor()};
+ co_spawn(ctx, do_read(reader), asio::detached);
+ ctx.run();
+}
diff --git a/3rdparty/asio/src/examples/cpp20/type_erasure/sleep.cpp b/3rdparty/asio/src/examples/cpp20/type_erasure/sleep.cpp
new file mode 100644
index 00000000000..b605866ebd7
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/type_erasure/sleep.cpp
@@ -0,0 +1,22 @@
+//
+// sleep.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "sleep.hpp"
+#include <asio/consign.hpp>
+#include <asio/steady_timer.hpp>
+#include <memory>
+
+void async_sleep_impl(
+ asio::any_completion_handler<void(std::error_code)> handler,
+ asio::any_io_executor ex, std::chrono::nanoseconds duration)
+{
+ auto timer = std::make_shared<asio::steady_timer>(ex, duration);
+ timer->async_wait(asio::consign(std::move(handler), timer));
+}
diff --git a/3rdparty/asio/src/examples/cpp20/type_erasure/sleep.hpp b/3rdparty/asio/src/examples/cpp20/type_erasure/sleep.hpp
new file mode 100644
index 00000000000..7e057fc5862
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/type_erasure/sleep.hpp
@@ -0,0 +1,32 @@
+//
+// sleep.hpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef SLEEP_HPP
+#define SLEEP_HPP
+
+#include <asio/any_completion_handler.hpp>
+#include <asio/any_io_executor.hpp>
+#include <asio/async_result.hpp>
+#include <asio/error.hpp>
+#include <chrono>
+
+void async_sleep_impl(
+ asio::any_completion_handler<void(std::error_code)> handler,
+ asio::any_io_executor ex, std::chrono::nanoseconds duration);
+
+template <typename CompletionToken>
+inline auto async_sleep(asio::any_io_executor ex,
+ std::chrono::nanoseconds duration, CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void(std::error_code)>(
+ async_sleep_impl, token, std::move(ex), duration);
+}
+
+#endif // SLEEP_HPP
diff --git a/3rdparty/asio/src/examples/cpp20/type_erasure/stdin_line_reader.cpp b/3rdparty/asio/src/examples/cpp20/type_erasure/stdin_line_reader.cpp
new file mode 100644
index 00000000000..7467e820e7a
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/type_erasure/stdin_line_reader.cpp
@@ -0,0 +1,44 @@
+//
+// stdin_line_reader.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "stdin_line_reader.hpp"
+#include <asio/deferred.hpp>
+#include <asio/read_until.hpp>
+#include <iostream>
+
+stdin_line_reader::stdin_line_reader(asio::any_io_executor ex)
+ : stdin_(ex, ::dup(STDIN_FILENO))
+{
+}
+
+void stdin_line_reader::async_read_line_impl(std::string prompt,
+ asio::any_completion_handler<void(asio::error_code, std::string)> handler)
+{
+ std::cout << prompt;
+ std::cout.flush();
+
+ asio::async_read_until(stdin_, asio::dynamic_buffer(buffer_), '\n',
+ asio::deferred(
+ [this](asio::error_code ec, std::size_t n)
+ {
+ if (!ec)
+ {
+ std::string result = buffer_.substr(0, n);
+ buffer_.erase(0, n);
+ return asio::deferred.values(ec, std::move(result));
+ }
+ else
+ {
+ return asio::deferred.values(ec, std::string{});
+ }
+ }
+ )
+ )(std::move(handler));
+}
diff --git a/3rdparty/asio/src/examples/cpp20/type_erasure/stdin_line_reader.hpp b/3rdparty/asio/src/examples/cpp20/type_erasure/stdin_line_reader.hpp
new file mode 100644
index 00000000000..fd54f707da0
--- /dev/null
+++ b/3rdparty/asio/src/examples/cpp20/type_erasure/stdin_line_reader.hpp
@@ -0,0 +1,30 @@
+//
+// stdin_line_reader.hpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef STDIN_LINE_READER_HPP
+#define STDIN_LINE_READER_HPP
+
+#include "line_reader.hpp"
+#include <asio/posix/stream_descriptor.hpp>
+
+class stdin_line_reader : public line_reader
+{
+public:
+ explicit stdin_line_reader(asio::any_io_executor ex);
+
+private:
+ void async_read_line_impl(std::string prompt,
+ asio::any_completion_handler<void(asio::error_code, std::string)> handler) override;
+
+ asio::posix::stream_descriptor stdin_;
+ std::string buffer_;
+};
+
+#endif
diff --git a/3rdparty/asio/src/tests/Makefile.am b/3rdparty/asio/src/tests/Makefile.am
new file mode 100644
index 00000000000..04f8a03a4ec
--- /dev/null
+++ b/3rdparty/asio/src/tests/Makefile.am
@@ -0,0 +1,656 @@
+AUTOMAKE_OPTIONS = subdir-objects
+
+if SEPARATE_COMPILATION
+noinst_LIBRARIES = libasio.a
+libasio_a_SOURCES = ../asio.cpp
+if HAVE_OPENSSL
+libasio_a_SOURCES += ../asio_ssl.cpp
+endif
+LDADD = libasio.a
+endif
+
+SUBDIRS = properties
+
+check_PROGRAMS = \
+ unit/any_completion_executor \
+ unit/any_completion_handler \
+ unit/any_io_executor \
+ unit/append \
+ unit/as_tuple \
+ unit/associated_allocator \
+ unit/associated_cancellation_slot \
+ unit/associated_executor \
+ unit/associated_immediate_executor \
+ unit/associator \
+ unit/async_result \
+ unit/awaitable \
+ unit/basic_datagram_socket \
+ unit/basic_deadline_timer \
+ unit/basic_file \
+ unit/basic_random_access_file \
+ unit/basic_raw_socket \
+ unit/basic_readable_pipe \
+ unit/basic_seq_packet_socket \
+ unit/basic_serial_port \
+ unit/basic_signal_set \
+ unit/basic_socket \
+ unit/basic_socket_acceptor \
+ unit/basic_stream_file \
+ unit/basic_stream_socket \
+ unit/basic_streambuf \
+ unit/basic_waitable_timer \
+ unit/basic_writable_pipe \
+ unit/bind_allocator \
+ unit/bind_cancellation_slot \
+ unit/bind_executor \
+ unit/bind_immediate_executor \
+ unit/buffered_read_stream \
+ unit/buffered_stream \
+ unit/buffered_write_stream \
+ unit/buffer \
+ unit/buffer_registration \
+ unit/buffers_iterator \
+ unit/cancellation_signal \
+ unit/cancellation_state \
+ unit/cancellation_type \
+ unit/co_spawn \
+ unit/completion_condition \
+ unit/compose \
+ unit/connect \
+ unit/connect_pipe \
+ unit/consign \
+ unit/coroutine \
+ unit/deadline_timer \
+ unit/defer \
+ unit/deferred \
+ unit/detached \
+ unit/dispatch \
+ unit/error \
+ unit/execution/any_executor \
+ unit/execution/blocking \
+ unit/execution/blocking_adaptation \
+ unit/execution/context_as \
+ unit/execution/executor \
+ unit/execution/invocable_archetype \
+ unit/execution/mapping \
+ unit/execution/outstanding_work \
+ unit/execution/prefer_only \
+ unit/execution/relationship \
+ unit/execution_context \
+ unit/executor \
+ unit/executor_work_guard \
+ unit/file_base \
+ unit/generic/basic_endpoint \
+ unit/generic/datagram_protocol \
+ unit/generic/raw_protocol \
+ unit/generic/seq_packet_protocol \
+ unit/generic/stream_protocol \
+ unit/high_resolution_timer \
+ unit/io_context \
+ unit/io_context_strand \
+ unit/ip/address \
+ unit/ip/address_v4 \
+ unit/ip/address_v4_iterator \
+ unit/ip/address_v4_range \
+ unit/ip/address_v6 \
+ unit/ip/address_v6_iterator \
+ unit/ip/address_v6_range \
+ unit/ip/basic_endpoint \
+ unit/ip/basic_resolver \
+ unit/ip/basic_resolver_entry \
+ unit/ip/basic_resolver_iterator \
+ unit/ip/basic_resolver_query \
+ unit/ip/host_name \
+ unit/ip/icmp \
+ unit/ip/multicast \
+ unit/ip/network_v4 \
+ unit/ip/network_v6 \
+ unit/ip/resolver_query_base \
+ unit/ip/tcp \
+ unit/ip/udp \
+ unit/ip/unicast \
+ unit/ip/v6_only \
+ unit/is_read_buffered \
+ unit/is_write_buffered \
+ unit/local/basic_endpoint \
+ unit/local/connect_pair \
+ unit/local/datagram_protocol \
+ unit/local/seq_packet_protocol \
+ unit/local/stream_protocol \
+ unit/packaged_task \
+ unit/placeholders \
+ unit/posix/basic_descriptor \
+ unit/posix/basic_stream_descriptor \
+ unit/posix/descriptor \
+ unit/posix/descriptor_base \
+ unit/posix/stream_descriptor \
+ unit/post \
+ unit/prepend \
+ unit/random_access_file \
+ unit/read \
+ unit/read_at \
+ unit/read_until \
+ unit/readable_pipe \
+ unit/recycling_allocator \
+ unit/redirect_error \
+ unit/registered_buffer \
+ unit/serial_port \
+ unit/serial_port_base \
+ unit/signal_set \
+ unit/signal_set_base \
+ unit/socket_base \
+ unit/static_thread_pool \
+ unit/steady_timer \
+ unit/strand \
+ unit/stream_file \
+ unit/streambuf \
+ unit/system_context \
+ unit/system_executor \
+ unit/system_timer \
+ unit/this_coro \
+ unit/thread \
+ unit/thread_pool \
+ unit/time_traits \
+ unit/ts/buffer \
+ unit/ts/executor \
+ unit/ts/internet \
+ unit/ts/io_context \
+ unit/ts/net \
+ unit/ts/netfwd \
+ unit/ts/socket \
+ unit/ts/timer \
+ unit/use_awaitable \
+ unit/use_future \
+ unit/uses_executor \
+ unit/wait_traits \
+ unit/windows/basic_object_handle \
+ unit/windows/basic_overlapped_handle \
+ unit/windows/basic_random_access_handle \
+ unit/windows/basic_stream_handle \
+ unit/windows/object_handle \
+ unit/windows/overlapped_handle \
+ unit/windows/overlapped_ptr \
+ unit/windows/random_access_handle \
+ unit/windows/stream_handle \
+ unit/writable_pipe \
+ unit/write \
+ unit/write_at
+
+if !STANDALONE
+noinst_PROGRAMS = \
+ latency/tcp_client \
+ latency/tcp_server \
+ latency/udp_client \
+ latency/udp_server \
+ performance/client \
+ performance/server
+endif
+
+if HAVE_CXX11
+check_PROGRAMS += \
+ unit/experimental/basic_channel \
+ unit/experimental/basic_concurrent_channel \
+ unit/experimental/channel \
+ unit/experimental/channel_traits \
+ unit/experimental/concurrent_channel \
+ unit/experimental/parallel_group
+endif
+
+if HAVE_CXX20
+check_PROGRAMS += \
+ unit/experimental/promise
+
+if HAVE_COROUTINES
+check_PROGRAMS += \
+ unit/experimental/awaitable_operators \
+ unit/experimental/co_composed \
+ unit/experimental/coro/allocator \
+ unit/experimental/coro/cancel \
+ unit/experimental/coro/co_spawn \
+ unit/experimental/coro/exception \
+ unit/experimental/coro/executor \
+ unit/experimental/coro/partial \
+ unit/experimental/coro/simple_test \
+ unit/experimental/coro/stack_test \
+ unit/experimental/coro/use_coro
+endif
+endif
+
+if HAVE_OPENSSL
+check_PROGRAMS += \
+ unit/ssl/context_base \
+ unit/ssl/context \
+ unit/ssl/error \
+ unit/ssl/host_name_verification \
+ unit/ssl/rfc2818_verification \
+ unit/ssl/stream_base \
+ unit/ssl/stream
+endif
+
+TESTS = \
+ unit/any_completion_executor \
+ unit/any_completion_handler \
+ unit/any_io_executor \
+ unit/append \
+ unit/as_tuple \
+ unit/associated_allocator \
+ unit/associated_cancellation_slot \
+ unit/associated_executor \
+ unit/associated_immediate_executor \
+ unit/associator \
+ unit/async_result \
+ unit/awaitable \
+ unit/basic_datagram_socket \
+ unit/basic_deadline_timer \
+ unit/basic_file \
+ unit/basic_random_access_file \
+ unit/basic_raw_socket \
+ unit/basic_readable_pipe \
+ unit/basic_seq_packet_socket \
+ unit/basic_serial_port \
+ unit/basic_signal_set \
+ unit/basic_socket \
+ unit/basic_socket_acceptor \
+ unit/basic_stream_file \
+ unit/basic_stream_socket \
+ unit/basic_streambuf \
+ unit/basic_waitable_timer \
+ unit/basic_writable_pipe \
+ unit/bind_allocator \
+ unit/bind_cancellation_slot \
+ unit/bind_executor \
+ unit/bind_immediate_executor \
+ unit/buffered_read_stream \
+ unit/buffered_stream \
+ unit/buffered_write_stream \
+ unit/buffer \
+ unit/buffer_registration \
+ unit/buffers_iterator \
+ unit/cancellation_signal \
+ unit/cancellation_state \
+ unit/cancellation_type \
+ unit/co_spawn \
+ unit/completion_condition \
+ unit/compose \
+ unit/connect \
+ unit/connect_pipe \
+ unit/consign \
+ unit/deadline_timer \
+ unit/defer \
+ unit/deferred \
+ unit/detached \
+ unit/dispatch \
+ unit/error \
+ unit/execution/any_executor \
+ unit/execution/blocking \
+ unit/execution/blocking_adaptation \
+ unit/execution/context_as \
+ unit/execution/executor \
+ unit/execution/invocable_archetype \
+ unit/execution/mapping \
+ unit/execution/outstanding_work \
+ unit/execution/prefer_only \
+ unit/execution/relationship \
+ unit/execution_context \
+ unit/executor \
+ unit/executor_work_guard \
+ unit/file_base \
+ unit/high_resolution_timer \
+ unit/io_context \
+ unit/io_context_strand \
+ unit/ip/address \
+ unit/ip/address_v4 \
+ unit/ip/address_v4_iterator \
+ unit/ip/address_v4_range \
+ unit/ip/address_v6 \
+ unit/ip/address_v6_iterator \
+ unit/ip/address_v6_range \
+ unit/ip/basic_endpoint \
+ unit/ip/basic_resolver \
+ unit/ip/basic_resolver_entry \
+ unit/ip/basic_resolver_iterator \
+ unit/ip/basic_resolver_query \
+ unit/ip/host_name \
+ unit/ip/icmp \
+ unit/ip/multicast \
+ unit/ip/network_v4 \
+ unit/ip/network_v6 \
+ unit/ip/resolver_query_base \
+ unit/ip/tcp \
+ unit/ip/udp \
+ unit/ip/unicast \
+ unit/ip/v6_only \
+ unit/is_read_buffered \
+ unit/is_write_buffered \
+ unit/local/basic_endpoint \
+ unit/local/connect_pair \
+ unit/local/datagram_protocol \
+ unit/local/seq_packet_protocol \
+ unit/local/stream_protocol \
+ unit/packaged_task \
+ unit/placeholders \
+ unit/posix/basic_descriptor\
+ unit/posix/basic_stream_descriptor\
+ unit/posix/descriptor\
+ unit/posix/descriptor_base \
+ unit/posix/stream_descriptor \
+ unit/post \
+ unit/prepend \
+ unit/random_access_file \
+ unit/read \
+ unit/read_at \
+ unit/read_until \
+ unit/readable_pipe \
+ unit/recycling_allocator \
+ unit/redirect_error \
+ unit/registered_buffer \
+ unit/serial_port \
+ unit/serial_port_base \
+ unit/signal_set \
+ unit/signal_set_base \
+ unit/socket_base \
+ unit/static_thread_pool \
+ unit/steady_timer \
+ unit/strand \
+ unit/stream_file \
+ unit/streambuf \
+ unit/system_context \
+ unit/system_executor \
+ unit/system_timer \
+ unit/this_coro \
+ unit/thread \
+ unit/thread_pool \
+ unit/time_traits \
+ unit/ts/buffer \
+ unit/ts/executor \
+ unit/ts/internet \
+ unit/ts/io_context \
+ unit/ts/net \
+ unit/ts/netfwd \
+ unit/ts/socket \
+ unit/ts/timer \
+ unit/use_awaitable \
+ unit/use_future \
+ unit/uses_executor \
+ unit/wait_traits \
+ unit/windows/basic_object_handle \
+ unit/windows/basic_overlapped_handle \
+ unit/windows/basic_random_access_handle \
+ unit/windows/basic_stream_handle \
+ unit/windows/object_handle \
+ unit/windows/overlapped_handle \
+ unit/windows/overlapped_ptr \
+ unit/windows/random_access_handle \
+ unit/windows/stream_handle \
+ unit/writable_pipe \
+ unit/write \
+ unit/write_at
+
+if HAVE_CXX11
+TESTS += \
+ unit/experimental/basic_channel \
+ unit/experimental/basic_concurrent_channel \
+ unit/experimental/channel \
+ unit/experimental/channel_traits \
+ unit/experimental/concurrent_channel \
+ unit/experimental/parallel_group
+endif
+
+if HAVE_CXX20
+TESTS += \
+ unit/experimental/promise
+
+if HAVE_COROUTINES
+TESTS += \
+ unit/experimental/awaitable_operators \
+ unit/experimental/co_composed \
+ unit/experimental/coro/allocator \
+ unit/experimental/coro/cancel \
+ unit/experimental/coro/co_spawn \
+ unit/experimental/coro/exception \
+ unit/experimental/coro/executor \
+ unit/experimental/coro/partial \
+ unit/experimental/coro/simple_test \
+ unit/experimental/coro/stack_test \
+ unit/experimental/coro/use_coro
+endif
+endif
+
+if HAVE_OPENSSL
+TESTS += \
+ unit/ssl/context_base \
+ unit/ssl/context \
+ unit/ssl/error \
+ unit/ssl/host_name_verification \
+ unit/ssl/rfc2818_verification \
+ unit/ssl/stream_base \
+ unit/ssl/stream
+endif
+
+noinst_HEADERS = \
+ latency/high_res_clock.hpp \
+ unit/unit_test.hpp
+
+AM_CXXFLAGS = -I$(srcdir)/../../include
+
+if !STANDALONE
+latency_tcp_client_SOURCES = latency/tcp_client.cpp
+latency_tcp_server_SOURCES = latency/tcp_server.cpp
+latency_udp_client_SOURCES = latency/udp_client.cpp
+latency_udp_server_SOURCES = latency/udp_server.cpp
+performance_client_SOURCES = performance/client.cpp
+performance_server_SOURCES = performance/server.cpp
+endif
+
+unit_any_completion_executor_SOURCES = unit/any_completion_executor.cpp
+unit_any_completion_handler_SOURCES = unit/any_completion_handler.cpp
+unit_any_io_executor_SOURCES = unit/any_io_executor.cpp
+unit_append_SOURCES = unit/append.cpp
+unit_as_tuple_SOURCES = unit/as_tuple.cpp
+unit_associated_allocator_SOURCES = unit/associated_allocator.cpp
+unit_associated_cancellation_slot_SOURCES = unit/associated_cancellation_slot.cpp
+unit_associated_executor_SOURCES = unit/associated_executor.cpp
+unit_associated_immediate_executor_SOURCES = unit/associated_immediate_executor.cpp
+unit_associator_SOURCES = unit/associator.cpp
+unit_async_result_SOURCES = unit/async_result.cpp
+unit_awaitable_SOURCES = unit/awaitable.cpp
+unit_basic_datagram_socket_SOURCES = unit/basic_datagram_socket.cpp
+unit_basic_deadline_timer_SOURCES = unit/basic_deadline_timer.cpp
+unit_basic_file_SOURCES = unit/basic_file.cpp
+unit_basic_random_access_file_SOURCES = unit/basic_random_access_file.cpp
+unit_basic_raw_socket_SOURCES = unit/basic_raw_socket.cpp
+unit_basic_readable_pipe_SOURCES = unit/basic_readable_pipe.cpp
+unit_basic_seq_packet_socket_SOURCES = unit/basic_seq_packet_socket.cpp
+unit_basic_serial_port_SOURCES = unit/basic_serial_port.cpp
+unit_basic_signal_set_SOURCES = unit/basic_signal_set.cpp
+unit_basic_socket_SOURCES = unit/basic_socket.cpp
+unit_basic_socket_acceptor_SOURCES = unit/basic_socket_acceptor.cpp
+unit_basic_stream_file_SOURCES = unit/basic_stream_file.cpp
+unit_basic_stream_socket_SOURCES = unit/basic_stream_socket.cpp
+unit_basic_streambuf_SOURCES = unit/basic_streambuf.cpp
+unit_basic_waitable_timer_SOURCES = unit/basic_waitable_timer.cpp
+unit_basic_writable_pipe_SOURCES = unit/basic_writable_pipe.cpp
+unit_bind_allocator_SOURCES = unit/bind_allocator.cpp
+unit_bind_cancellation_slot_SOURCES = unit/bind_cancellation_slot.cpp
+unit_bind_executor_SOURCES = unit/bind_executor.cpp
+unit_bind_immediate_executor_SOURCES = unit/bind_immediate_executor.cpp
+unit_buffer_SOURCES = unit/buffer.cpp
+unit_buffer_registration_SOURCES = unit/buffer_registration.cpp
+unit_buffers_iterator_SOURCES = unit/buffers_iterator.cpp
+unit_buffered_read_stream_SOURCES = unit/buffered_read_stream.cpp
+unit_buffered_stream_SOURCES = unit/buffered_stream.cpp
+unit_buffered_write_stream_SOURCES = unit/buffered_write_stream.cpp
+unit_cancellation_signal_SOURCES = unit/cancellation_signal.cpp
+unit_cancellation_state_SOURCES = unit/cancellation_state.cpp
+unit_cancellation_type_SOURCES = unit/cancellation_type.cpp
+unit_co_spawn_SOURCES = unit/co_spawn.cpp
+unit_completion_condition_SOURCES = unit/completion_condition.cpp
+unit_compose_SOURCES = unit/compose.cpp
+unit_connect_SOURCES = unit/connect.cpp
+unit_connect_pipe_SOURCES = unit/connect_pipe.cpp
+unit_consign_SOURCES = unit/consign.cpp
+unit_coroutine_SOURCES = unit/coroutine.cpp
+unit_deadline_timer_SOURCES = unit/deadline_timer.cpp
+unit_defer_SOURCES = unit/defer.cpp
+unit_deferred_SOURCES = unit/deferred.cpp
+unit_detached_SOURCES = unit/detached.cpp
+unit_dispatch_SOURCES = unit/dispatch.cpp
+unit_error_SOURCES = unit/error.cpp
+unit_execution_any_executor_SOURCES = unit/execution/any_executor.cpp
+unit_execution_blocking_SOURCES = unit/execution/blocking.cpp
+unit_execution_blocking_adaptation_SOURCES = unit/execution/blocking_adaptation.cpp
+unit_execution_context_as_SOURCES = unit/execution/context_as.cpp
+unit_execution_executor_SOURCES = unit/execution/executor.cpp
+unit_execution_invocable_archetype_SOURCES = unit/execution/invocable_archetype.cpp
+unit_execution_mapping_SOURCES = unit/execution/mapping.cpp
+unit_execution_outstanding_work_SOURCES = unit/execution/outstanding_work.cpp
+unit_execution_prefer_only_SOURCES = unit/execution/prefer_only.cpp
+unit_execution_relationship_SOURCES = unit/execution/relationship.cpp
+unit_execution_context_SOURCES = unit/execution_context.cpp
+unit_executor_SOURCES = unit/executor.cpp
+unit_executor_work_guard_SOURCES = unit/executor_work_guard.cpp
+unit_file_base_SOURCES = unit/file_base.cpp
+unit_generic_basic_endpoint_SOURCES = unit/generic/basic_endpoint.cpp
+unit_generic_datagram_protocol_SOURCES = unit/generic/datagram_protocol.cpp
+unit_generic_raw_protocol_SOURCES = unit/generic/raw_protocol.cpp
+unit_generic_seq_packet_protocol_SOURCES = unit/generic/seq_packet_protocol.cpp
+unit_generic_stream_protocol_SOURCES = unit/generic/stream_protocol.cpp
+unit_high_resolution_timer_SOURCES = unit/high_resolution_timer.cpp
+unit_io_context_SOURCES = unit/io_context.cpp
+unit_io_context_strand_SOURCES = unit/io_context_strand.cpp
+unit_ip_address_SOURCES = unit/ip/address.cpp
+unit_ip_address_v4_SOURCES = unit/ip/address_v4.cpp
+unit_ip_address_v4_iterator_SOURCES = unit/ip/address_v4_iterator.cpp
+unit_ip_address_v4_range_SOURCES = unit/ip/address_v4_range.cpp
+unit_ip_address_v6_SOURCES = unit/ip/address_v6.cpp
+unit_ip_address_v6_iterator_SOURCES = unit/ip/address_v6_iterator.cpp
+unit_ip_address_v6_range_SOURCES = unit/ip/address_v6_range.cpp
+unit_ip_basic_endpoint_SOURCES = unit/ip/basic_endpoint.cpp
+unit_ip_basic_resolver_SOURCES = unit/ip/basic_resolver.cpp
+unit_ip_basic_resolver_entry_SOURCES = unit/ip/basic_resolver_entry.cpp
+unit_ip_basic_resolver_iterator_SOURCES = unit/ip/basic_resolver_iterator.cpp
+unit_ip_basic_resolver_query_SOURCES = unit/ip/basic_resolver_query.cpp
+unit_ip_host_name_SOURCES = unit/ip/host_name.cpp
+unit_ip_icmp_SOURCES = unit/ip/icmp.cpp
+unit_ip_multicast_SOURCES = unit/ip/multicast.cpp
+unit_ip_network_v4_SOURCES = unit/ip/network_v4.cpp
+unit_ip_network_v6_SOURCES = unit/ip/network_v6.cpp
+unit_ip_resolver_query_base_SOURCES = unit/ip/resolver_query_base.cpp
+unit_ip_tcp_SOURCES = unit/ip/tcp.cpp
+unit_ip_udp_SOURCES = unit/ip/udp.cpp
+unit_ip_unicast_SOURCES = unit/ip/unicast.cpp
+unit_ip_v6_only_SOURCES = unit/ip/v6_only.cpp
+unit_is_read_buffered_SOURCES = unit/is_read_buffered.cpp
+unit_is_write_buffered_SOURCES = unit/is_write_buffered.cpp
+unit_local_basic_endpoint_SOURCES = unit/local/basic_endpoint.cpp
+unit_local_connect_pair_SOURCES = unit/local/connect_pair.cpp
+unit_local_datagram_protocol_SOURCES = unit/local/datagram_protocol.cpp
+unit_local_seq_packet_protocol_SOURCES = unit/local/seq_packet_protocol.cpp
+unit_local_stream_protocol_SOURCES = unit/local/stream_protocol.cpp
+unit_packaged_task_SOURCES = unit/packaged_task.cpp
+unit_placeholders_SOURCES = unit/placeholders.cpp
+unit_posix_basic_descriptor_SOURCES = unit/posix/basic_descriptor.cpp
+unit_posix_basic_stream_descriptor_SOURCES = unit/posix/basic_stream_descriptor.cpp
+unit_posix_descriptor_SOURCES = unit/posix/descriptor.cpp
+unit_posix_descriptor_base_SOURCES = unit/posix/descriptor_base.cpp
+unit_posix_stream_descriptor_SOURCES = unit/posix/stream_descriptor.cpp
+unit_post_SOURCES = unit/post.cpp
+unit_prepend_SOURCES = unit/prepend.cpp
+unit_random_access_file_SOURCES = unit/random_access_file.cpp
+unit_read_SOURCES = unit/read.cpp
+unit_read_at_SOURCES = unit/read_at.cpp
+unit_read_until_SOURCES = unit/read_until.cpp
+unit_readable_pipe_SOURCES = unit/readable_pipe.cpp
+unit_recycling_allocator_SOURCES = unit/recycling_allocator.cpp
+unit_redirect_error_SOURCES = unit/redirect_error.cpp
+unit_registered_buffer_SOURCES = unit/registered_buffer.cpp
+unit_serial_port_SOURCES = unit/serial_port.cpp
+unit_serial_port_base_SOURCES = unit/serial_port_base.cpp
+unit_signal_set_SOURCES = unit/signal_set.cpp
+unit_signal_set_base_SOURCES = unit/signal_set_base.cpp
+unit_socket_base_SOURCES = unit/socket_base.cpp
+unit_static_thread_pool_SOURCES = unit/static_thread_pool.cpp
+unit_steady_timer_SOURCES = unit/steady_timer.cpp
+unit_strand_SOURCES = unit/strand.cpp
+unit_stream_file_SOURCES = unit/stream_file.cpp
+unit_streambuf_SOURCES = unit/streambuf.cpp
+unit_system_context_SOURCES = unit/system_context.cpp
+unit_system_executor_SOURCES = unit/system_executor.cpp
+unit_system_timer_SOURCES = unit/system_timer.cpp
+unit_this_coro_SOURCES = unit/this_coro.cpp
+unit_thread_SOURCES = unit/thread.cpp
+unit_thread_pool_SOURCES = unit/thread_pool.cpp
+unit_time_traits_SOURCES = unit/time_traits.cpp
+unit_ts_buffer_SOURCES = unit/ts/buffer.cpp
+unit_ts_executor_SOURCES = unit/ts/executor.cpp
+unit_ts_internet_SOURCES = unit/ts/internet.cpp
+unit_ts_io_context_SOURCES = unit/ts/io_context.cpp
+unit_ts_net_SOURCES = unit/ts/net.cpp
+unit_ts_netfwd_SOURCES = unit/ts/netfwd.cpp
+unit_ts_socket_SOURCES = unit/ts/socket.cpp
+unit_ts_timer_SOURCES = unit/ts/timer.cpp
+unit_use_awaitable_SOURCES = unit/use_awaitable.cpp
+unit_use_future_SOURCES = unit/use_future.cpp
+unit_uses_executor_SOURCES = unit/uses_executor.cpp
+unit_wait_traits_SOURCES = unit/wait_traits.cpp
+unit_windows_basic_object_handle_SOURCES = unit/windows/basic_object_handle.cpp
+unit_windows_basic_overlapped_handle_SOURCES = unit/windows/basic_overlapped_handle.cpp
+unit_windows_basic_random_access_handle_SOURCES = unit/windows/basic_random_access_handle.cpp
+unit_windows_basic_stream_handle_SOURCES = unit/windows/basic_stream_handle.cpp
+unit_windows_object_handle_SOURCES = unit/windows/object_handle.cpp
+unit_windows_overlapped_handle_SOURCES = unit/windows/overlapped_handle.cpp
+unit_windows_overlapped_ptr_SOURCES = unit/windows/overlapped_ptr.cpp
+unit_windows_random_access_handle_SOURCES = unit/windows/random_access_handle.cpp
+unit_windows_stream_handle_SOURCES = unit/windows/stream_handle.cpp
+unit_writable_pipe_SOURCES = unit/writable_pipe.cpp
+unit_write_SOURCES = unit/write.cpp
+unit_write_at_SOURCES = unit/write_at.cpp
+
+if HAVE_CXX11
+unit_experimental_basic_channel_SOURCES = unit/experimental/basic_channel.cpp
+unit_experimental_basic_concurrent_channel_SOURCES = unit/experimental/basic_concurrent_channel.cpp
+unit_experimental_channel_SOURCES = unit/experimental/channel.cpp
+unit_experimental_channel_traits_SOURCES = unit/experimental/channel_traits.cpp
+unit_experimental_concurrent_channel_SOURCES = unit/experimental/concurrent_channel.cpp
+unit_experimental_parallel_group_SOURCES = unit/experimental/parallel_group.cpp
+endif
+
+if HAVE_CXX20
+unit_experimental_promise_SOURCES = unit/experimental/promise.cpp
+
+if HAVE_COROUTINES
+unit_experimental_awaitable_operators_SOURCES = unit/experimental/awaitable_operators.cpp
+unit_experimental_co_composed_SOURCES = unit/experimental/co_composed.cpp
+unit_experimental_coro_allocator_SOURCES = unit/experimental/coro/allocator.cpp
+unit_experimental_coro_cancel_SOURCES = unit/experimental/coro/cancel.cpp
+unit_experimental_coro_co_spawn_SOURCES = unit/experimental/coro/co_spawn.cpp
+unit_experimental_coro_exception_SOURCES = unit/experimental/coro/exception.cpp
+unit_experimental_coro_executor_SOURCES = unit/experimental/coro/executor.cpp
+unit_experimental_coro_partial_SOURCES = unit/experimental/coro/partial.cpp
+unit_experimental_coro_simple_test_SOURCES = unit/experimental/coro/simple_test.cpp
+unit_experimental_coro_stack_test_SOURCES = unit/experimental/coro/stack_test.cpp
+unit_experimental_coro_use_coro_SOURCES = unit/experimental/coro/use_coro.cpp
+endif
+endif
+
+if HAVE_OPENSSL
+unit_ssl_context_base_SOURCES = unit/ssl/context_base.cpp
+unit_ssl_context_SOURCES = unit/ssl/context.cpp
+unit_ssl_error_SOURCES = unit/ssl/error.cpp
+unit_ssl_stream_base_SOURCES = unit/ssl/stream_base.cpp
+unit_ssl_host_name_verification_SOURCES = unit/ssl/host_name_verification.cpp
+unit_ssl_rfc2818_verification_SOURCES = unit/ssl/rfc2818_verification.cpp
+unit_ssl_stream_SOURCES = unit/ssl/stream.cpp
+endif
+
+EXTRA_DIST = \
+ latency/allocator.hpp \
+ performance/handler_allocator.hpp \
+ unit/archetypes/async_ops.hpp \
+ unit/archetypes/async_result.hpp \
+ unit/archetypes/gettable_socket_option.hpp \
+ unit/archetypes/io_control_command.hpp \
+ unit/archetypes/settable_socket_option.hpp
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
diff --git a/3rdparty/asio/src/tests/Makefile.in b/3rdparty/asio/src/tests/Makefile.in
new file mode 100644
index 00000000000..a88bd89fec5
--- /dev/null
+++ b/3rdparty/asio/src/tests/Makefile.in
@@ -0,0 +1,6367 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+@HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__append_1 = ../asio_ssl.cpp
+check_PROGRAMS = unit/any_completion_executor$(EXEEXT) \
+ unit/any_completion_handler$(EXEEXT) \
+ unit/any_io_executor$(EXEEXT) unit/append$(EXEEXT) \
+ unit/as_tuple$(EXEEXT) unit/associated_allocator$(EXEEXT) \
+ unit/associated_cancellation_slot$(EXEEXT) \
+ unit/associated_executor$(EXEEXT) \
+ unit/associated_immediate_executor$(EXEEXT) \
+ unit/associator$(EXEEXT) unit/async_result$(EXEEXT) \
+ unit/awaitable$(EXEEXT) unit/basic_datagram_socket$(EXEEXT) \
+ unit/basic_deadline_timer$(EXEEXT) unit/basic_file$(EXEEXT) \
+ unit/basic_random_access_file$(EXEEXT) \
+ unit/basic_raw_socket$(EXEEXT) \
+ unit/basic_readable_pipe$(EXEEXT) \
+ unit/basic_seq_packet_socket$(EXEEXT) \
+ unit/basic_serial_port$(EXEEXT) unit/basic_signal_set$(EXEEXT) \
+ unit/basic_socket$(EXEEXT) unit/basic_socket_acceptor$(EXEEXT) \
+ unit/basic_stream_file$(EXEEXT) \
+ unit/basic_stream_socket$(EXEEXT) \
+ unit/basic_streambuf$(EXEEXT) \
+ unit/basic_waitable_timer$(EXEEXT) \
+ unit/basic_writable_pipe$(EXEEXT) unit/bind_allocator$(EXEEXT) \
+ unit/bind_cancellation_slot$(EXEEXT) \
+ unit/bind_executor$(EXEEXT) \
+ unit/bind_immediate_executor$(EXEEXT) \
+ unit/buffered_read_stream$(EXEEXT) \
+ unit/buffered_stream$(EXEEXT) \
+ unit/buffered_write_stream$(EXEEXT) unit/buffer$(EXEEXT) \
+ unit/buffer_registration$(EXEEXT) \
+ unit/buffers_iterator$(EXEEXT) \
+ unit/cancellation_signal$(EXEEXT) \
+ unit/cancellation_state$(EXEEXT) \
+ unit/cancellation_type$(EXEEXT) unit/co_spawn$(EXEEXT) \
+ unit/completion_condition$(EXEEXT) unit/compose$(EXEEXT) \
+ unit/connect$(EXEEXT) unit/connect_pipe$(EXEEXT) \
+ unit/consign$(EXEEXT) unit/coroutine$(EXEEXT) \
+ unit/deadline_timer$(EXEEXT) unit/defer$(EXEEXT) \
+ unit/deferred$(EXEEXT) unit/detached$(EXEEXT) \
+ unit/dispatch$(EXEEXT) unit/error$(EXEEXT) \
+ unit/execution/any_executor$(EXEEXT) \
+ unit/execution/blocking$(EXEEXT) \
+ unit/execution/blocking_adaptation$(EXEEXT) \
+ unit/execution/context_as$(EXEEXT) \
+ unit/execution/executor$(EXEEXT) \
+ unit/execution/invocable_archetype$(EXEEXT) \
+ unit/execution/mapping$(EXEEXT) \
+ unit/execution/outstanding_work$(EXEEXT) \
+ unit/execution/prefer_only$(EXEEXT) \
+ unit/execution/relationship$(EXEEXT) \
+ unit/execution_context$(EXEEXT) unit/executor$(EXEEXT) \
+ unit/executor_work_guard$(EXEEXT) unit/file_base$(EXEEXT) \
+ unit/generic/basic_endpoint$(EXEEXT) \
+ unit/generic/datagram_protocol$(EXEEXT) \
+ unit/generic/raw_protocol$(EXEEXT) \
+ unit/generic/seq_packet_protocol$(EXEEXT) \
+ unit/generic/stream_protocol$(EXEEXT) \
+ unit/high_resolution_timer$(EXEEXT) unit/io_context$(EXEEXT) \
+ unit/io_context_strand$(EXEEXT) unit/ip/address$(EXEEXT) \
+ unit/ip/address_v4$(EXEEXT) \
+ unit/ip/address_v4_iterator$(EXEEXT) \
+ unit/ip/address_v4_range$(EXEEXT) unit/ip/address_v6$(EXEEXT) \
+ unit/ip/address_v6_iterator$(EXEEXT) \
+ unit/ip/address_v6_range$(EXEEXT) \
+ unit/ip/basic_endpoint$(EXEEXT) \
+ unit/ip/basic_resolver$(EXEEXT) \
+ unit/ip/basic_resolver_entry$(EXEEXT) \
+ unit/ip/basic_resolver_iterator$(EXEEXT) \
+ unit/ip/basic_resolver_query$(EXEEXT) \
+ unit/ip/host_name$(EXEEXT) unit/ip/icmp$(EXEEXT) \
+ unit/ip/multicast$(EXEEXT) unit/ip/network_v4$(EXEEXT) \
+ unit/ip/network_v6$(EXEEXT) \
+ unit/ip/resolver_query_base$(EXEEXT) unit/ip/tcp$(EXEEXT) \
+ unit/ip/udp$(EXEEXT) unit/ip/unicast$(EXEEXT) \
+ unit/ip/v6_only$(EXEEXT) unit/is_read_buffered$(EXEEXT) \
+ unit/is_write_buffered$(EXEEXT) \
+ unit/local/basic_endpoint$(EXEEXT) \
+ unit/local/connect_pair$(EXEEXT) \
+ unit/local/datagram_protocol$(EXEEXT) \
+ unit/local/seq_packet_protocol$(EXEEXT) \
+ unit/local/stream_protocol$(EXEEXT) \
+ unit/packaged_task$(EXEEXT) unit/placeholders$(EXEEXT) \
+ unit/posix/basic_descriptor$(EXEEXT) \
+ unit/posix/basic_stream_descriptor$(EXEEXT) \
+ unit/posix/descriptor$(EXEEXT) \
+ unit/posix/descriptor_base$(EXEEXT) \
+ unit/posix/stream_descriptor$(EXEEXT) unit/post$(EXEEXT) \
+ unit/prepend$(EXEEXT) unit/random_access_file$(EXEEXT) \
+ unit/read$(EXEEXT) unit/read_at$(EXEEXT) \
+ unit/read_until$(EXEEXT) unit/readable_pipe$(EXEEXT) \
+ unit/recycling_allocator$(EXEEXT) unit/redirect_error$(EXEEXT) \
+ unit/registered_buffer$(EXEEXT) unit/serial_port$(EXEEXT) \
+ unit/serial_port_base$(EXEEXT) unit/signal_set$(EXEEXT) \
+ unit/signal_set_base$(EXEEXT) unit/socket_base$(EXEEXT) \
+ unit/static_thread_pool$(EXEEXT) unit/steady_timer$(EXEEXT) \
+ unit/strand$(EXEEXT) unit/stream_file$(EXEEXT) \
+ unit/streambuf$(EXEEXT) unit/system_context$(EXEEXT) \
+ unit/system_executor$(EXEEXT) unit/system_timer$(EXEEXT) \
+ unit/this_coro$(EXEEXT) unit/thread$(EXEEXT) \
+ unit/thread_pool$(EXEEXT) unit/time_traits$(EXEEXT) \
+ unit/ts/buffer$(EXEEXT) unit/ts/executor$(EXEEXT) \
+ unit/ts/internet$(EXEEXT) unit/ts/io_context$(EXEEXT) \
+ unit/ts/net$(EXEEXT) unit/ts/netfwd$(EXEEXT) \
+ unit/ts/socket$(EXEEXT) unit/ts/timer$(EXEEXT) \
+ unit/use_awaitable$(EXEEXT) unit/use_future$(EXEEXT) \
+ unit/uses_executor$(EXEEXT) unit/wait_traits$(EXEEXT) \
+ unit/windows/basic_object_handle$(EXEEXT) \
+ unit/windows/basic_overlapped_handle$(EXEEXT) \
+ unit/windows/basic_random_access_handle$(EXEEXT) \
+ unit/windows/basic_stream_handle$(EXEEXT) \
+ unit/windows/object_handle$(EXEEXT) \
+ unit/windows/overlapped_handle$(EXEEXT) \
+ unit/windows/overlapped_ptr$(EXEEXT) \
+ unit/windows/random_access_handle$(EXEEXT) \
+ unit/windows/stream_handle$(EXEEXT) \
+ unit/writable_pipe$(EXEEXT) unit/write$(EXEEXT) \
+ unit/write_at$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \
+ $(am__EXEEXT_3) $(am__EXEEXT_4)
+@STANDALONE_FALSE@noinst_PROGRAMS = latency/tcp_client$(EXEEXT) \
+@STANDALONE_FALSE@ latency/tcp_server$(EXEEXT) \
+@STANDALONE_FALSE@ latency/udp_client$(EXEEXT) \
+@STANDALONE_FALSE@ latency/udp_server$(EXEEXT) \
+@STANDALONE_FALSE@ performance/client$(EXEEXT) \
+@STANDALONE_FALSE@ performance/server$(EXEEXT)
+@HAVE_CXX11_TRUE@am__append_2 = \
+@HAVE_CXX11_TRUE@ unit/experimental/basic_channel \
+@HAVE_CXX11_TRUE@ unit/experimental/basic_concurrent_channel \
+@HAVE_CXX11_TRUE@ unit/experimental/channel \
+@HAVE_CXX11_TRUE@ unit/experimental/channel_traits \
+@HAVE_CXX11_TRUE@ unit/experimental/concurrent_channel \
+@HAVE_CXX11_TRUE@ unit/experimental/parallel_group
+
+@HAVE_CXX20_TRUE@am__append_3 = \
+@HAVE_CXX20_TRUE@ unit/experimental/promise
+
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am__append_4 = \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/awaitable_operators \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/co_composed \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/allocator \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/cancel \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/co_spawn \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/exception \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/executor \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/partial \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/simple_test \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/stack_test \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/use_coro
+
+@HAVE_OPENSSL_TRUE@am__append_5 = \
+@HAVE_OPENSSL_TRUE@ unit/ssl/context_base \
+@HAVE_OPENSSL_TRUE@ unit/ssl/context \
+@HAVE_OPENSSL_TRUE@ unit/ssl/error \
+@HAVE_OPENSSL_TRUE@ unit/ssl/host_name_verification \
+@HAVE_OPENSSL_TRUE@ unit/ssl/rfc2818_verification \
+@HAVE_OPENSSL_TRUE@ unit/ssl/stream_base \
+@HAVE_OPENSSL_TRUE@ unit/ssl/stream
+
+TESTS = unit/any_completion_executor$(EXEEXT) \
+ unit/any_completion_handler$(EXEEXT) \
+ unit/any_io_executor$(EXEEXT) unit/append$(EXEEXT) \
+ unit/as_tuple$(EXEEXT) unit/associated_allocator$(EXEEXT) \
+ unit/associated_cancellation_slot$(EXEEXT) \
+ unit/associated_executor$(EXEEXT) \
+ unit/associated_immediate_executor$(EXEEXT) \
+ unit/associator$(EXEEXT) unit/async_result$(EXEEXT) \
+ unit/awaitable$(EXEEXT) unit/basic_datagram_socket$(EXEEXT) \
+ unit/basic_deadline_timer$(EXEEXT) unit/basic_file$(EXEEXT) \
+ unit/basic_random_access_file$(EXEEXT) \
+ unit/basic_raw_socket$(EXEEXT) \
+ unit/basic_readable_pipe$(EXEEXT) \
+ unit/basic_seq_packet_socket$(EXEEXT) \
+ unit/basic_serial_port$(EXEEXT) unit/basic_signal_set$(EXEEXT) \
+ unit/basic_socket$(EXEEXT) unit/basic_socket_acceptor$(EXEEXT) \
+ unit/basic_stream_file$(EXEEXT) \
+ unit/basic_stream_socket$(EXEEXT) \
+ unit/basic_streambuf$(EXEEXT) \
+ unit/basic_waitable_timer$(EXEEXT) \
+ unit/basic_writable_pipe$(EXEEXT) unit/bind_allocator$(EXEEXT) \
+ unit/bind_cancellation_slot$(EXEEXT) \
+ unit/bind_executor$(EXEEXT) \
+ unit/bind_immediate_executor$(EXEEXT) \
+ unit/buffered_read_stream$(EXEEXT) \
+ unit/buffered_stream$(EXEEXT) \
+ unit/buffered_write_stream$(EXEEXT) unit/buffer$(EXEEXT) \
+ unit/buffer_registration$(EXEEXT) \
+ unit/buffers_iterator$(EXEEXT) \
+ unit/cancellation_signal$(EXEEXT) \
+ unit/cancellation_state$(EXEEXT) \
+ unit/cancellation_type$(EXEEXT) unit/co_spawn$(EXEEXT) \
+ unit/completion_condition$(EXEEXT) unit/compose$(EXEEXT) \
+ unit/connect$(EXEEXT) unit/connect_pipe$(EXEEXT) \
+ unit/consign$(EXEEXT) unit/deadline_timer$(EXEEXT) \
+ unit/defer$(EXEEXT) unit/deferred$(EXEEXT) \
+ unit/detached$(EXEEXT) unit/dispatch$(EXEEXT) \
+ unit/error$(EXEEXT) unit/execution/any_executor$(EXEEXT) \
+ unit/execution/blocking$(EXEEXT) \
+ unit/execution/blocking_adaptation$(EXEEXT) \
+ unit/execution/context_as$(EXEEXT) \
+ unit/execution/executor$(EXEEXT) \
+ unit/execution/invocable_archetype$(EXEEXT) \
+ unit/execution/mapping$(EXEEXT) \
+ unit/execution/outstanding_work$(EXEEXT) \
+ unit/execution/prefer_only$(EXEEXT) \
+ unit/execution/relationship$(EXEEXT) \
+ unit/execution_context$(EXEEXT) unit/executor$(EXEEXT) \
+ unit/executor_work_guard$(EXEEXT) unit/file_base$(EXEEXT) \
+ unit/high_resolution_timer$(EXEEXT) unit/io_context$(EXEEXT) \
+ unit/io_context_strand$(EXEEXT) unit/ip/address$(EXEEXT) \
+ unit/ip/address_v4$(EXEEXT) \
+ unit/ip/address_v4_iterator$(EXEEXT) \
+ unit/ip/address_v4_range$(EXEEXT) unit/ip/address_v6$(EXEEXT) \
+ unit/ip/address_v6_iterator$(EXEEXT) \
+ unit/ip/address_v6_range$(EXEEXT) \
+ unit/ip/basic_endpoint$(EXEEXT) \
+ unit/ip/basic_resolver$(EXEEXT) \
+ unit/ip/basic_resolver_entry$(EXEEXT) \
+ unit/ip/basic_resolver_iterator$(EXEEXT) \
+ unit/ip/basic_resolver_query$(EXEEXT) \
+ unit/ip/host_name$(EXEEXT) unit/ip/icmp$(EXEEXT) \
+ unit/ip/multicast$(EXEEXT) unit/ip/network_v4$(EXEEXT) \
+ unit/ip/network_v6$(EXEEXT) \
+ unit/ip/resolver_query_base$(EXEEXT) unit/ip/tcp$(EXEEXT) \
+ unit/ip/udp$(EXEEXT) unit/ip/unicast$(EXEEXT) \
+ unit/ip/v6_only$(EXEEXT) unit/is_read_buffered$(EXEEXT) \
+ unit/is_write_buffered$(EXEEXT) \
+ unit/local/basic_endpoint$(EXEEXT) \
+ unit/local/connect_pair$(EXEEXT) \
+ unit/local/datagram_protocol$(EXEEXT) \
+ unit/local/seq_packet_protocol$(EXEEXT) \
+ unit/local/stream_protocol$(EXEEXT) \
+ unit/packaged_task$(EXEEXT) unit/placeholders$(EXEEXT) \
+ unit/posix/basic_descriptor$(EXEEXT) \
+ unit/posix/basic_stream_descriptor$(EXEEXT) \
+ unit/posix/descriptor$(EXEEXT) \
+ unit/posix/descriptor_base$(EXEEXT) \
+ unit/posix/stream_descriptor$(EXEEXT) unit/post$(EXEEXT) \
+ unit/prepend$(EXEEXT) unit/random_access_file$(EXEEXT) \
+ unit/read$(EXEEXT) unit/read_at$(EXEEXT) \
+ unit/read_until$(EXEEXT) unit/readable_pipe$(EXEEXT) \
+ unit/recycling_allocator$(EXEEXT) unit/redirect_error$(EXEEXT) \
+ unit/registered_buffer$(EXEEXT) unit/serial_port$(EXEEXT) \
+ unit/serial_port_base$(EXEEXT) unit/signal_set$(EXEEXT) \
+ unit/signal_set_base$(EXEEXT) unit/socket_base$(EXEEXT) \
+ unit/static_thread_pool$(EXEEXT) unit/steady_timer$(EXEEXT) \
+ unit/strand$(EXEEXT) unit/stream_file$(EXEEXT) \
+ unit/streambuf$(EXEEXT) unit/system_context$(EXEEXT) \
+ unit/system_executor$(EXEEXT) unit/system_timer$(EXEEXT) \
+ unit/this_coro$(EXEEXT) unit/thread$(EXEEXT) \
+ unit/thread_pool$(EXEEXT) unit/time_traits$(EXEEXT) \
+ unit/ts/buffer$(EXEEXT) unit/ts/executor$(EXEEXT) \
+ unit/ts/internet$(EXEEXT) unit/ts/io_context$(EXEEXT) \
+ unit/ts/net$(EXEEXT) unit/ts/netfwd$(EXEEXT) \
+ unit/ts/socket$(EXEEXT) unit/ts/timer$(EXEEXT) \
+ unit/use_awaitable$(EXEEXT) unit/use_future$(EXEEXT) \
+ unit/uses_executor$(EXEEXT) unit/wait_traits$(EXEEXT) \
+ unit/windows/basic_object_handle$(EXEEXT) \
+ unit/windows/basic_overlapped_handle$(EXEEXT) \
+ unit/windows/basic_random_access_handle$(EXEEXT) \
+ unit/windows/basic_stream_handle$(EXEEXT) \
+ unit/windows/object_handle$(EXEEXT) \
+ unit/windows/overlapped_handle$(EXEEXT) \
+ unit/windows/overlapped_ptr$(EXEEXT) \
+ unit/windows/random_access_handle$(EXEEXT) \
+ unit/windows/stream_handle$(EXEEXT) \
+ unit/writable_pipe$(EXEEXT) unit/write$(EXEEXT) \
+ unit/write_at$(EXEEXT) $(am__EXEEXT_1) $(am__EXEEXT_2) \
+ $(am__EXEEXT_3) $(am__EXEEXT_4)
+@HAVE_CXX11_TRUE@am__append_6 = \
+@HAVE_CXX11_TRUE@ unit/experimental/basic_channel \
+@HAVE_CXX11_TRUE@ unit/experimental/basic_concurrent_channel \
+@HAVE_CXX11_TRUE@ unit/experimental/channel \
+@HAVE_CXX11_TRUE@ unit/experimental/channel_traits \
+@HAVE_CXX11_TRUE@ unit/experimental/concurrent_channel \
+@HAVE_CXX11_TRUE@ unit/experimental/parallel_group
+
+@HAVE_CXX20_TRUE@am__append_7 = \
+@HAVE_CXX20_TRUE@ unit/experimental/promise
+
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am__append_8 = \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/awaitable_operators \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/co_composed \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/allocator \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/cancel \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/co_spawn \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/exception \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/executor \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/partial \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/simple_test \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/stack_test \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/use_coro
+
+@HAVE_OPENSSL_TRUE@am__append_9 = \
+@HAVE_OPENSSL_TRUE@ unit/ssl/context_base \
+@HAVE_OPENSSL_TRUE@ unit/ssl/context \
+@HAVE_OPENSSL_TRUE@ unit/ssl/error \
+@HAVE_OPENSSL_TRUE@ unit/ssl/host_name_verification \
+@HAVE_OPENSSL_TRUE@ unit/ssl/rfc2818_verification \
+@HAVE_OPENSSL_TRUE@ unit/ssl/stream_base \
+@HAVE_OPENSSL_TRUE@ unit/ssl/stream
+
+subdir = src/tests
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
+ $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@HAVE_CXX11_TRUE@am__EXEEXT_1 = \
+@HAVE_CXX11_TRUE@ unit/experimental/basic_channel$(EXEEXT) \
+@HAVE_CXX11_TRUE@ unit/experimental/basic_concurrent_channel$(EXEEXT) \
+@HAVE_CXX11_TRUE@ unit/experimental/channel$(EXEEXT) \
+@HAVE_CXX11_TRUE@ unit/experimental/channel_traits$(EXEEXT) \
+@HAVE_CXX11_TRUE@ unit/experimental/concurrent_channel$(EXEEXT) \
+@HAVE_CXX11_TRUE@ unit/experimental/parallel_group$(EXEEXT)
+@HAVE_CXX20_TRUE@am__EXEEXT_2 = unit/experimental/promise$(EXEEXT)
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am__EXEEXT_3 = unit/experimental/awaitable_operators$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/co_composed$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/allocator$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/cancel$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/co_spawn$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/exception$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/executor$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/partial$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/simple_test$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/stack_test$(EXEEXT) \
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@ unit/experimental/coro/use_coro$(EXEEXT)
+@HAVE_OPENSSL_TRUE@am__EXEEXT_4 = unit/ssl/context_base$(EXEEXT) \
+@HAVE_OPENSSL_TRUE@ unit/ssl/context$(EXEEXT) \
+@HAVE_OPENSSL_TRUE@ unit/ssl/error$(EXEEXT) \
+@HAVE_OPENSSL_TRUE@ unit/ssl/host_name_verification$(EXEEXT) \
+@HAVE_OPENSSL_TRUE@ unit/ssl/rfc2818_verification$(EXEEXT) \
+@HAVE_OPENSSL_TRUE@ unit/ssl/stream_base$(EXEEXT) \
+@HAVE_OPENSSL_TRUE@ unit/ssl/stream$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+LIBRARIES = $(noinst_LIBRARIES)
+AR = ar
+ARFLAGS = cru
+AM_V_AR = $(am__v_AR_@AM_V@)
+am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@)
+am__v_AR_0 = @echo " AR " $@;
+am__v_AR_1 =
+libasio_a_AR = $(AR) $(ARFLAGS)
+libasio_a_LIBADD =
+am__libasio_a_SOURCES_DIST = ../asio.cpp ../asio_ssl.cpp
+am__dirstamp = $(am__leading_dot)dirstamp
+@HAVE_OPENSSL_TRUE@@SEPARATE_COMPILATION_TRUE@am__objects_1 = ../asio_ssl.$(OBJEXT)
+@SEPARATE_COMPILATION_TRUE@am_libasio_a_OBJECTS = ../asio.$(OBJEXT) \
+@SEPARATE_COMPILATION_TRUE@ $(am__objects_1)
+libasio_a_OBJECTS = $(am_libasio_a_OBJECTS)
+am__latency_tcp_client_SOURCES_DIST = latency/tcp_client.cpp
+@STANDALONE_FALSE@am_latency_tcp_client_OBJECTS = \
+@STANDALONE_FALSE@ latency/tcp_client.$(OBJEXT)
+latency_tcp_client_OBJECTS = $(am_latency_tcp_client_OBJECTS)
+latency_tcp_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@latency_tcp_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__latency_tcp_server_SOURCES_DIST = latency/tcp_server.cpp
+@STANDALONE_FALSE@am_latency_tcp_server_OBJECTS = \
+@STANDALONE_FALSE@ latency/tcp_server.$(OBJEXT)
+latency_tcp_server_OBJECTS = $(am_latency_tcp_server_OBJECTS)
+latency_tcp_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@latency_tcp_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__latency_udp_client_SOURCES_DIST = latency/udp_client.cpp
+@STANDALONE_FALSE@am_latency_udp_client_OBJECTS = \
+@STANDALONE_FALSE@ latency/udp_client.$(OBJEXT)
+latency_udp_client_OBJECTS = $(am_latency_udp_client_OBJECTS)
+latency_udp_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@latency_udp_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__latency_udp_server_SOURCES_DIST = latency/udp_server.cpp
+@STANDALONE_FALSE@am_latency_udp_server_OBJECTS = \
+@STANDALONE_FALSE@ latency/udp_server.$(OBJEXT)
+latency_udp_server_OBJECTS = $(am_latency_udp_server_OBJECTS)
+latency_udp_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@latency_udp_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__performance_client_SOURCES_DIST = performance/client.cpp
+@STANDALONE_FALSE@am_performance_client_OBJECTS = \
+@STANDALONE_FALSE@ performance/client.$(OBJEXT)
+performance_client_OBJECTS = $(am_performance_client_OBJECTS)
+performance_client_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@performance_client_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__performance_server_SOURCES_DIST = performance/server.cpp
+@STANDALONE_FALSE@am_performance_server_OBJECTS = \
+@STANDALONE_FALSE@ performance/server.$(OBJEXT)
+performance_server_OBJECTS = $(am_performance_server_OBJECTS)
+performance_server_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@performance_server_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_any_completion_executor_OBJECTS = \
+ unit/any_completion_executor.$(OBJEXT)
+unit_any_completion_executor_OBJECTS = \
+ $(am_unit_any_completion_executor_OBJECTS)
+unit_any_completion_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_any_completion_executor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_any_completion_handler_OBJECTS = \
+ unit/any_completion_handler.$(OBJEXT)
+unit_any_completion_handler_OBJECTS = \
+ $(am_unit_any_completion_handler_OBJECTS)
+unit_any_completion_handler_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_any_completion_handler_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_any_io_executor_OBJECTS = unit/any_io_executor.$(OBJEXT)
+unit_any_io_executor_OBJECTS = $(am_unit_any_io_executor_OBJECTS)
+unit_any_io_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_any_io_executor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_append_OBJECTS = unit/append.$(OBJEXT)
+unit_append_OBJECTS = $(am_unit_append_OBJECTS)
+unit_append_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_append_DEPENDENCIES = libasio.a
+am_unit_as_tuple_OBJECTS = unit/as_tuple.$(OBJEXT)
+unit_as_tuple_OBJECTS = $(am_unit_as_tuple_OBJECTS)
+unit_as_tuple_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_as_tuple_DEPENDENCIES = libasio.a
+am_unit_associated_allocator_OBJECTS = \
+ unit/associated_allocator.$(OBJEXT)
+unit_associated_allocator_OBJECTS = \
+ $(am_unit_associated_allocator_OBJECTS)
+unit_associated_allocator_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_associated_allocator_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_associated_cancellation_slot_OBJECTS = \
+ unit/associated_cancellation_slot.$(OBJEXT)
+unit_associated_cancellation_slot_OBJECTS = \
+ $(am_unit_associated_cancellation_slot_OBJECTS)
+unit_associated_cancellation_slot_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_associated_cancellation_slot_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_associated_executor_OBJECTS = \
+ unit/associated_executor.$(OBJEXT)
+unit_associated_executor_OBJECTS = \
+ $(am_unit_associated_executor_OBJECTS)
+unit_associated_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_associated_executor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_associated_immediate_executor_OBJECTS = \
+ unit/associated_immediate_executor.$(OBJEXT)
+unit_associated_immediate_executor_OBJECTS = \
+ $(am_unit_associated_immediate_executor_OBJECTS)
+unit_associated_immediate_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_associated_immediate_executor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_associator_OBJECTS = unit/associator.$(OBJEXT)
+unit_associator_OBJECTS = $(am_unit_associator_OBJECTS)
+unit_associator_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_associator_DEPENDENCIES = libasio.a
+am_unit_async_result_OBJECTS = unit/async_result.$(OBJEXT)
+unit_async_result_OBJECTS = $(am_unit_async_result_OBJECTS)
+unit_async_result_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_async_result_DEPENDENCIES = libasio.a
+am_unit_awaitable_OBJECTS = unit/awaitable.$(OBJEXT)
+unit_awaitable_OBJECTS = $(am_unit_awaitable_OBJECTS)
+unit_awaitable_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_awaitable_DEPENDENCIES = libasio.a
+am_unit_basic_datagram_socket_OBJECTS = \
+ unit/basic_datagram_socket.$(OBJEXT)
+unit_basic_datagram_socket_OBJECTS = \
+ $(am_unit_basic_datagram_socket_OBJECTS)
+unit_basic_datagram_socket_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_datagram_socket_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_deadline_timer_OBJECTS = \
+ unit/basic_deadline_timer.$(OBJEXT)
+unit_basic_deadline_timer_OBJECTS = \
+ $(am_unit_basic_deadline_timer_OBJECTS)
+unit_basic_deadline_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_deadline_timer_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_file_OBJECTS = unit/basic_file.$(OBJEXT)
+unit_basic_file_OBJECTS = $(am_unit_basic_file_OBJECTS)
+unit_basic_file_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_file_DEPENDENCIES = libasio.a
+am_unit_basic_random_access_file_OBJECTS = \
+ unit/basic_random_access_file.$(OBJEXT)
+unit_basic_random_access_file_OBJECTS = \
+ $(am_unit_basic_random_access_file_OBJECTS)
+unit_basic_random_access_file_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_random_access_file_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_raw_socket_OBJECTS = unit/basic_raw_socket.$(OBJEXT)
+unit_basic_raw_socket_OBJECTS = $(am_unit_basic_raw_socket_OBJECTS)
+unit_basic_raw_socket_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_raw_socket_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_readable_pipe_OBJECTS = \
+ unit/basic_readable_pipe.$(OBJEXT)
+unit_basic_readable_pipe_OBJECTS = \
+ $(am_unit_basic_readable_pipe_OBJECTS)
+unit_basic_readable_pipe_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_readable_pipe_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_seq_packet_socket_OBJECTS = \
+ unit/basic_seq_packet_socket.$(OBJEXT)
+unit_basic_seq_packet_socket_OBJECTS = \
+ $(am_unit_basic_seq_packet_socket_OBJECTS)
+unit_basic_seq_packet_socket_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_seq_packet_socket_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_serial_port_OBJECTS = unit/basic_serial_port.$(OBJEXT)
+unit_basic_serial_port_OBJECTS = $(am_unit_basic_serial_port_OBJECTS)
+unit_basic_serial_port_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_serial_port_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_signal_set_OBJECTS = unit/basic_signal_set.$(OBJEXT)
+unit_basic_signal_set_OBJECTS = $(am_unit_basic_signal_set_OBJECTS)
+unit_basic_signal_set_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_signal_set_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_socket_OBJECTS = unit/basic_socket.$(OBJEXT)
+unit_basic_socket_OBJECTS = $(am_unit_basic_socket_OBJECTS)
+unit_basic_socket_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_socket_DEPENDENCIES = libasio.a
+am_unit_basic_socket_acceptor_OBJECTS = \
+ unit/basic_socket_acceptor.$(OBJEXT)
+unit_basic_socket_acceptor_OBJECTS = \
+ $(am_unit_basic_socket_acceptor_OBJECTS)
+unit_basic_socket_acceptor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_socket_acceptor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_stream_file_OBJECTS = unit/basic_stream_file.$(OBJEXT)
+unit_basic_stream_file_OBJECTS = $(am_unit_basic_stream_file_OBJECTS)
+unit_basic_stream_file_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_stream_file_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_stream_socket_OBJECTS = \
+ unit/basic_stream_socket.$(OBJEXT)
+unit_basic_stream_socket_OBJECTS = \
+ $(am_unit_basic_stream_socket_OBJECTS)
+unit_basic_stream_socket_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_stream_socket_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_streambuf_OBJECTS = unit/basic_streambuf.$(OBJEXT)
+unit_basic_streambuf_OBJECTS = $(am_unit_basic_streambuf_OBJECTS)
+unit_basic_streambuf_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_streambuf_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_waitable_timer_OBJECTS = \
+ unit/basic_waitable_timer.$(OBJEXT)
+unit_basic_waitable_timer_OBJECTS = \
+ $(am_unit_basic_waitable_timer_OBJECTS)
+unit_basic_waitable_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_waitable_timer_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_basic_writable_pipe_OBJECTS = \
+ unit/basic_writable_pipe.$(OBJEXT)
+unit_basic_writable_pipe_OBJECTS = \
+ $(am_unit_basic_writable_pipe_OBJECTS)
+unit_basic_writable_pipe_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_basic_writable_pipe_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_bind_allocator_OBJECTS = unit/bind_allocator.$(OBJEXT)
+unit_bind_allocator_OBJECTS = $(am_unit_bind_allocator_OBJECTS)
+unit_bind_allocator_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_bind_allocator_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_bind_cancellation_slot_OBJECTS = \
+ unit/bind_cancellation_slot.$(OBJEXT)
+unit_bind_cancellation_slot_OBJECTS = \
+ $(am_unit_bind_cancellation_slot_OBJECTS)
+unit_bind_cancellation_slot_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_bind_cancellation_slot_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_bind_executor_OBJECTS = unit/bind_executor.$(OBJEXT)
+unit_bind_executor_OBJECTS = $(am_unit_bind_executor_OBJECTS)
+unit_bind_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_bind_executor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_bind_immediate_executor_OBJECTS = \
+ unit/bind_immediate_executor.$(OBJEXT)
+unit_bind_immediate_executor_OBJECTS = \
+ $(am_unit_bind_immediate_executor_OBJECTS)
+unit_bind_immediate_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_bind_immediate_executor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_buffer_OBJECTS = unit/buffer.$(OBJEXT)
+unit_buffer_OBJECTS = $(am_unit_buffer_OBJECTS)
+unit_buffer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_buffer_DEPENDENCIES = libasio.a
+am_unit_buffer_registration_OBJECTS = \
+ unit/buffer_registration.$(OBJEXT)
+unit_buffer_registration_OBJECTS = \
+ $(am_unit_buffer_registration_OBJECTS)
+unit_buffer_registration_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_buffer_registration_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_buffered_read_stream_OBJECTS = \
+ unit/buffered_read_stream.$(OBJEXT)
+unit_buffered_read_stream_OBJECTS = \
+ $(am_unit_buffered_read_stream_OBJECTS)
+unit_buffered_read_stream_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_buffered_read_stream_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_buffered_stream_OBJECTS = unit/buffered_stream.$(OBJEXT)
+unit_buffered_stream_OBJECTS = $(am_unit_buffered_stream_OBJECTS)
+unit_buffered_stream_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_buffered_stream_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_buffered_write_stream_OBJECTS = \
+ unit/buffered_write_stream.$(OBJEXT)
+unit_buffered_write_stream_OBJECTS = \
+ $(am_unit_buffered_write_stream_OBJECTS)
+unit_buffered_write_stream_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_buffered_write_stream_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_buffers_iterator_OBJECTS = unit/buffers_iterator.$(OBJEXT)
+unit_buffers_iterator_OBJECTS = $(am_unit_buffers_iterator_OBJECTS)
+unit_buffers_iterator_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_buffers_iterator_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_cancellation_signal_OBJECTS = \
+ unit/cancellation_signal.$(OBJEXT)
+unit_cancellation_signal_OBJECTS = \
+ $(am_unit_cancellation_signal_OBJECTS)
+unit_cancellation_signal_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_cancellation_signal_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_cancellation_state_OBJECTS = \
+ unit/cancellation_state.$(OBJEXT)
+unit_cancellation_state_OBJECTS = \
+ $(am_unit_cancellation_state_OBJECTS)
+unit_cancellation_state_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_cancellation_state_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_cancellation_type_OBJECTS = unit/cancellation_type.$(OBJEXT)
+unit_cancellation_type_OBJECTS = $(am_unit_cancellation_type_OBJECTS)
+unit_cancellation_type_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_cancellation_type_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_co_spawn_OBJECTS = unit/co_spawn.$(OBJEXT)
+unit_co_spawn_OBJECTS = $(am_unit_co_spawn_OBJECTS)
+unit_co_spawn_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_co_spawn_DEPENDENCIES = libasio.a
+am_unit_completion_condition_OBJECTS = \
+ unit/completion_condition.$(OBJEXT)
+unit_completion_condition_OBJECTS = \
+ $(am_unit_completion_condition_OBJECTS)
+unit_completion_condition_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_completion_condition_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_compose_OBJECTS = unit/compose.$(OBJEXT)
+unit_compose_OBJECTS = $(am_unit_compose_OBJECTS)
+unit_compose_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_compose_DEPENDENCIES = libasio.a
+am_unit_connect_OBJECTS = unit/connect.$(OBJEXT)
+unit_connect_OBJECTS = $(am_unit_connect_OBJECTS)
+unit_connect_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_connect_DEPENDENCIES = libasio.a
+am_unit_connect_pipe_OBJECTS = unit/connect_pipe.$(OBJEXT)
+unit_connect_pipe_OBJECTS = $(am_unit_connect_pipe_OBJECTS)
+unit_connect_pipe_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_connect_pipe_DEPENDENCIES = libasio.a
+am_unit_consign_OBJECTS = unit/consign.$(OBJEXT)
+unit_consign_OBJECTS = $(am_unit_consign_OBJECTS)
+unit_consign_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_consign_DEPENDENCIES = libasio.a
+am_unit_coroutine_OBJECTS = unit/coroutine.$(OBJEXT)
+unit_coroutine_OBJECTS = $(am_unit_coroutine_OBJECTS)
+unit_coroutine_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_coroutine_DEPENDENCIES = libasio.a
+am_unit_deadline_timer_OBJECTS = unit/deadline_timer.$(OBJEXT)
+unit_deadline_timer_OBJECTS = $(am_unit_deadline_timer_OBJECTS)
+unit_deadline_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_deadline_timer_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_defer_OBJECTS = unit/defer.$(OBJEXT)
+unit_defer_OBJECTS = $(am_unit_defer_OBJECTS)
+unit_defer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_defer_DEPENDENCIES = libasio.a
+am_unit_deferred_OBJECTS = unit/deferred.$(OBJEXT)
+unit_deferred_OBJECTS = $(am_unit_deferred_OBJECTS)
+unit_deferred_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_deferred_DEPENDENCIES = libasio.a
+am_unit_detached_OBJECTS = unit/detached.$(OBJEXT)
+unit_detached_OBJECTS = $(am_unit_detached_OBJECTS)
+unit_detached_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_detached_DEPENDENCIES = libasio.a
+am_unit_dispatch_OBJECTS = unit/dispatch.$(OBJEXT)
+unit_dispatch_OBJECTS = $(am_unit_dispatch_OBJECTS)
+unit_dispatch_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_dispatch_DEPENDENCIES = libasio.a
+am_unit_error_OBJECTS = unit/error.$(OBJEXT)
+unit_error_OBJECTS = $(am_unit_error_OBJECTS)
+unit_error_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_error_DEPENDENCIES = libasio.a
+am_unit_execution_any_executor_OBJECTS = \
+ unit/execution/any_executor.$(OBJEXT)
+unit_execution_any_executor_OBJECTS = \
+ $(am_unit_execution_any_executor_OBJECTS)
+unit_execution_any_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_execution_any_executor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_execution_blocking_OBJECTS = \
+ unit/execution/blocking.$(OBJEXT)
+unit_execution_blocking_OBJECTS = \
+ $(am_unit_execution_blocking_OBJECTS)
+unit_execution_blocking_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_execution_blocking_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_execution_blocking_adaptation_OBJECTS = \
+ unit/execution/blocking_adaptation.$(OBJEXT)
+unit_execution_blocking_adaptation_OBJECTS = \
+ $(am_unit_execution_blocking_adaptation_OBJECTS)
+unit_execution_blocking_adaptation_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_execution_blocking_adaptation_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_execution_context_as_OBJECTS = \
+ unit/execution/context_as.$(OBJEXT)
+unit_execution_context_as_OBJECTS = \
+ $(am_unit_execution_context_as_OBJECTS)
+unit_execution_context_as_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_execution_context_as_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_execution_executor_OBJECTS = \
+ unit/execution/executor.$(OBJEXT)
+unit_execution_executor_OBJECTS = \
+ $(am_unit_execution_executor_OBJECTS)
+unit_execution_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_execution_executor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_execution_invocable_archetype_OBJECTS = \
+ unit/execution/invocable_archetype.$(OBJEXT)
+unit_execution_invocable_archetype_OBJECTS = \
+ $(am_unit_execution_invocable_archetype_OBJECTS)
+unit_execution_invocable_archetype_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_execution_invocable_archetype_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_execution_mapping_OBJECTS = unit/execution/mapping.$(OBJEXT)
+unit_execution_mapping_OBJECTS = $(am_unit_execution_mapping_OBJECTS)
+unit_execution_mapping_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_execution_mapping_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_execution_outstanding_work_OBJECTS = \
+ unit/execution/outstanding_work.$(OBJEXT)
+unit_execution_outstanding_work_OBJECTS = \
+ $(am_unit_execution_outstanding_work_OBJECTS)
+unit_execution_outstanding_work_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_execution_outstanding_work_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_execution_prefer_only_OBJECTS = \
+ unit/execution/prefer_only.$(OBJEXT)
+unit_execution_prefer_only_OBJECTS = \
+ $(am_unit_execution_prefer_only_OBJECTS)
+unit_execution_prefer_only_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_execution_prefer_only_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_execution_relationship_OBJECTS = \
+ unit/execution/relationship.$(OBJEXT)
+unit_execution_relationship_OBJECTS = \
+ $(am_unit_execution_relationship_OBJECTS)
+unit_execution_relationship_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_execution_relationship_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_execution_context_OBJECTS = unit/execution_context.$(OBJEXT)
+unit_execution_context_OBJECTS = $(am_unit_execution_context_OBJECTS)
+unit_execution_context_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_execution_context_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_executor_OBJECTS = unit/executor.$(OBJEXT)
+unit_executor_OBJECTS = $(am_unit_executor_OBJECTS)
+unit_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_executor_DEPENDENCIES = libasio.a
+am_unit_executor_work_guard_OBJECTS = \
+ unit/executor_work_guard.$(OBJEXT)
+unit_executor_work_guard_OBJECTS = \
+ $(am_unit_executor_work_guard_OBJECTS)
+unit_executor_work_guard_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_executor_work_guard_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_awaitable_operators_SOURCES_DIST = \
+ unit/experimental/awaitable_operators.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am_unit_experimental_awaitable_operators_OBJECTS = unit/experimental/awaitable_operators.$(OBJEXT)
+unit_experimental_awaitable_operators_OBJECTS = \
+ $(am_unit_experimental_awaitable_operators_OBJECTS)
+unit_experimental_awaitable_operators_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_awaitable_operators_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_basic_channel_SOURCES_DIST = \
+ unit/experimental/basic_channel.cpp
+@HAVE_CXX11_TRUE@am_unit_experimental_basic_channel_OBJECTS = \
+@HAVE_CXX11_TRUE@ unit/experimental/basic_channel.$(OBJEXT)
+unit_experimental_basic_channel_OBJECTS = \
+ $(am_unit_experimental_basic_channel_OBJECTS)
+unit_experimental_basic_channel_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_basic_channel_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_basic_concurrent_channel_SOURCES_DIST = \
+ unit/experimental/basic_concurrent_channel.cpp
+@HAVE_CXX11_TRUE@am_unit_experimental_basic_concurrent_channel_OBJECTS = unit/experimental/basic_concurrent_channel.$(OBJEXT)
+unit_experimental_basic_concurrent_channel_OBJECTS = \
+ $(am_unit_experimental_basic_concurrent_channel_OBJECTS)
+unit_experimental_basic_concurrent_channel_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_basic_concurrent_channel_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_channel_SOURCES_DIST = \
+ unit/experimental/channel.cpp
+@HAVE_CXX11_TRUE@am_unit_experimental_channel_OBJECTS = \
+@HAVE_CXX11_TRUE@ unit/experimental/channel.$(OBJEXT)
+unit_experimental_channel_OBJECTS = \
+ $(am_unit_experimental_channel_OBJECTS)
+unit_experimental_channel_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_channel_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_channel_traits_SOURCES_DIST = \
+ unit/experimental/channel_traits.cpp
+@HAVE_CXX11_TRUE@am_unit_experimental_channel_traits_OBJECTS = \
+@HAVE_CXX11_TRUE@ unit/experimental/channel_traits.$(OBJEXT)
+unit_experimental_channel_traits_OBJECTS = \
+ $(am_unit_experimental_channel_traits_OBJECTS)
+unit_experimental_channel_traits_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_channel_traits_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_co_composed_SOURCES_DIST = \
+ unit/experimental/co_composed.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am_unit_experimental_co_composed_OBJECTS = unit/experimental/co_composed.$(OBJEXT)
+unit_experimental_co_composed_OBJECTS = \
+ $(am_unit_experimental_co_composed_OBJECTS)
+unit_experimental_co_composed_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_co_composed_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_concurrent_channel_SOURCES_DIST = \
+ unit/experimental/concurrent_channel.cpp
+@HAVE_CXX11_TRUE@am_unit_experimental_concurrent_channel_OBJECTS = unit/experimental/concurrent_channel.$(OBJEXT)
+unit_experimental_concurrent_channel_OBJECTS = \
+ $(am_unit_experimental_concurrent_channel_OBJECTS)
+unit_experimental_concurrent_channel_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_concurrent_channel_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_coro_allocator_SOURCES_DIST = \
+ unit/experimental/coro/allocator.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am_unit_experimental_coro_allocator_OBJECTS = unit/experimental/coro/allocator.$(OBJEXT)
+unit_experimental_coro_allocator_OBJECTS = \
+ $(am_unit_experimental_coro_allocator_OBJECTS)
+unit_experimental_coro_allocator_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_coro_allocator_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_coro_cancel_SOURCES_DIST = \
+ unit/experimental/coro/cancel.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am_unit_experimental_coro_cancel_OBJECTS = unit/experimental/coro/cancel.$(OBJEXT)
+unit_experimental_coro_cancel_OBJECTS = \
+ $(am_unit_experimental_coro_cancel_OBJECTS)
+unit_experimental_coro_cancel_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_coro_cancel_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_coro_co_spawn_SOURCES_DIST = \
+ unit/experimental/coro/co_spawn.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am_unit_experimental_coro_co_spawn_OBJECTS = unit/experimental/coro/co_spawn.$(OBJEXT)
+unit_experimental_coro_co_spawn_OBJECTS = \
+ $(am_unit_experimental_coro_co_spawn_OBJECTS)
+unit_experimental_coro_co_spawn_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_coro_co_spawn_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_coro_exception_SOURCES_DIST = \
+ unit/experimental/coro/exception.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am_unit_experimental_coro_exception_OBJECTS = unit/experimental/coro/exception.$(OBJEXT)
+unit_experimental_coro_exception_OBJECTS = \
+ $(am_unit_experimental_coro_exception_OBJECTS)
+unit_experimental_coro_exception_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_coro_exception_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_coro_executor_SOURCES_DIST = \
+ unit/experimental/coro/executor.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am_unit_experimental_coro_executor_OBJECTS = unit/experimental/coro/executor.$(OBJEXT)
+unit_experimental_coro_executor_OBJECTS = \
+ $(am_unit_experimental_coro_executor_OBJECTS)
+unit_experimental_coro_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_coro_executor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_coro_partial_SOURCES_DIST = \
+ unit/experimental/coro/partial.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am_unit_experimental_coro_partial_OBJECTS = unit/experimental/coro/partial.$(OBJEXT)
+unit_experimental_coro_partial_OBJECTS = \
+ $(am_unit_experimental_coro_partial_OBJECTS)
+unit_experimental_coro_partial_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_coro_partial_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_coro_simple_test_SOURCES_DIST = \
+ unit/experimental/coro/simple_test.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am_unit_experimental_coro_simple_test_OBJECTS = unit/experimental/coro/simple_test.$(OBJEXT)
+unit_experimental_coro_simple_test_OBJECTS = \
+ $(am_unit_experimental_coro_simple_test_OBJECTS)
+unit_experimental_coro_simple_test_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_coro_simple_test_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_coro_stack_test_SOURCES_DIST = \
+ unit/experimental/coro/stack_test.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am_unit_experimental_coro_stack_test_OBJECTS = unit/experimental/coro/stack_test.$(OBJEXT)
+unit_experimental_coro_stack_test_OBJECTS = \
+ $(am_unit_experimental_coro_stack_test_OBJECTS)
+unit_experimental_coro_stack_test_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_coro_stack_test_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_coro_use_coro_SOURCES_DIST = \
+ unit/experimental/coro/use_coro.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@am_unit_experimental_coro_use_coro_OBJECTS = unit/experimental/coro/use_coro.$(OBJEXT)
+unit_experimental_coro_use_coro_OBJECTS = \
+ $(am_unit_experimental_coro_use_coro_OBJECTS)
+unit_experimental_coro_use_coro_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_coro_use_coro_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_parallel_group_SOURCES_DIST = \
+ unit/experimental/parallel_group.cpp
+@HAVE_CXX11_TRUE@am_unit_experimental_parallel_group_OBJECTS = \
+@HAVE_CXX11_TRUE@ unit/experimental/parallel_group.$(OBJEXT)
+unit_experimental_parallel_group_OBJECTS = \
+ $(am_unit_experimental_parallel_group_OBJECTS)
+unit_experimental_parallel_group_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_parallel_group_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_experimental_promise_SOURCES_DIST = \
+ unit/experimental/promise.cpp
+@HAVE_CXX20_TRUE@am_unit_experimental_promise_OBJECTS = \
+@HAVE_CXX20_TRUE@ unit/experimental/promise.$(OBJEXT)
+unit_experimental_promise_OBJECTS = \
+ $(am_unit_experimental_promise_OBJECTS)
+unit_experimental_promise_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_experimental_promise_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_file_base_OBJECTS = unit/file_base.$(OBJEXT)
+unit_file_base_OBJECTS = $(am_unit_file_base_OBJECTS)
+unit_file_base_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_file_base_DEPENDENCIES = libasio.a
+am_unit_generic_basic_endpoint_OBJECTS = \
+ unit/generic/basic_endpoint.$(OBJEXT)
+unit_generic_basic_endpoint_OBJECTS = \
+ $(am_unit_generic_basic_endpoint_OBJECTS)
+unit_generic_basic_endpoint_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_generic_basic_endpoint_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_generic_datagram_protocol_OBJECTS = \
+ unit/generic/datagram_protocol.$(OBJEXT)
+unit_generic_datagram_protocol_OBJECTS = \
+ $(am_unit_generic_datagram_protocol_OBJECTS)
+unit_generic_datagram_protocol_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_generic_datagram_protocol_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_generic_raw_protocol_OBJECTS = \
+ unit/generic/raw_protocol.$(OBJEXT)
+unit_generic_raw_protocol_OBJECTS = \
+ $(am_unit_generic_raw_protocol_OBJECTS)
+unit_generic_raw_protocol_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_generic_raw_protocol_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_generic_seq_packet_protocol_OBJECTS = \
+ unit/generic/seq_packet_protocol.$(OBJEXT)
+unit_generic_seq_packet_protocol_OBJECTS = \
+ $(am_unit_generic_seq_packet_protocol_OBJECTS)
+unit_generic_seq_packet_protocol_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_generic_seq_packet_protocol_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_generic_stream_protocol_OBJECTS = \
+ unit/generic/stream_protocol.$(OBJEXT)
+unit_generic_stream_protocol_OBJECTS = \
+ $(am_unit_generic_stream_protocol_OBJECTS)
+unit_generic_stream_protocol_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_generic_stream_protocol_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_high_resolution_timer_OBJECTS = \
+ unit/high_resolution_timer.$(OBJEXT)
+unit_high_resolution_timer_OBJECTS = \
+ $(am_unit_high_resolution_timer_OBJECTS)
+unit_high_resolution_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_high_resolution_timer_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_io_context_OBJECTS = unit/io_context.$(OBJEXT)
+unit_io_context_OBJECTS = $(am_unit_io_context_OBJECTS)
+unit_io_context_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_io_context_DEPENDENCIES = libasio.a
+am_unit_io_context_strand_OBJECTS = unit/io_context_strand.$(OBJEXT)
+unit_io_context_strand_OBJECTS = $(am_unit_io_context_strand_OBJECTS)
+unit_io_context_strand_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_io_context_strand_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_address_OBJECTS = unit/ip/address.$(OBJEXT)
+unit_ip_address_OBJECTS = $(am_unit_ip_address_OBJECTS)
+unit_ip_address_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_address_DEPENDENCIES = libasio.a
+am_unit_ip_address_v4_OBJECTS = unit/ip/address_v4.$(OBJEXT)
+unit_ip_address_v4_OBJECTS = $(am_unit_ip_address_v4_OBJECTS)
+unit_ip_address_v4_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_address_v4_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_address_v4_iterator_OBJECTS = \
+ unit/ip/address_v4_iterator.$(OBJEXT)
+unit_ip_address_v4_iterator_OBJECTS = \
+ $(am_unit_ip_address_v4_iterator_OBJECTS)
+unit_ip_address_v4_iterator_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_address_v4_iterator_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_address_v4_range_OBJECTS = \
+ unit/ip/address_v4_range.$(OBJEXT)
+unit_ip_address_v4_range_OBJECTS = \
+ $(am_unit_ip_address_v4_range_OBJECTS)
+unit_ip_address_v4_range_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_address_v4_range_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_address_v6_OBJECTS = unit/ip/address_v6.$(OBJEXT)
+unit_ip_address_v6_OBJECTS = $(am_unit_ip_address_v6_OBJECTS)
+unit_ip_address_v6_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_address_v6_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_address_v6_iterator_OBJECTS = \
+ unit/ip/address_v6_iterator.$(OBJEXT)
+unit_ip_address_v6_iterator_OBJECTS = \
+ $(am_unit_ip_address_v6_iterator_OBJECTS)
+unit_ip_address_v6_iterator_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_address_v6_iterator_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_address_v6_range_OBJECTS = \
+ unit/ip/address_v6_range.$(OBJEXT)
+unit_ip_address_v6_range_OBJECTS = \
+ $(am_unit_ip_address_v6_range_OBJECTS)
+unit_ip_address_v6_range_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_address_v6_range_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_basic_endpoint_OBJECTS = unit/ip/basic_endpoint.$(OBJEXT)
+unit_ip_basic_endpoint_OBJECTS = $(am_unit_ip_basic_endpoint_OBJECTS)
+unit_ip_basic_endpoint_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_basic_endpoint_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_basic_resolver_OBJECTS = unit/ip/basic_resolver.$(OBJEXT)
+unit_ip_basic_resolver_OBJECTS = $(am_unit_ip_basic_resolver_OBJECTS)
+unit_ip_basic_resolver_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_basic_resolver_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_basic_resolver_entry_OBJECTS = \
+ unit/ip/basic_resolver_entry.$(OBJEXT)
+unit_ip_basic_resolver_entry_OBJECTS = \
+ $(am_unit_ip_basic_resolver_entry_OBJECTS)
+unit_ip_basic_resolver_entry_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_basic_resolver_entry_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_basic_resolver_iterator_OBJECTS = \
+ unit/ip/basic_resolver_iterator.$(OBJEXT)
+unit_ip_basic_resolver_iterator_OBJECTS = \
+ $(am_unit_ip_basic_resolver_iterator_OBJECTS)
+unit_ip_basic_resolver_iterator_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_basic_resolver_iterator_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_basic_resolver_query_OBJECTS = \
+ unit/ip/basic_resolver_query.$(OBJEXT)
+unit_ip_basic_resolver_query_OBJECTS = \
+ $(am_unit_ip_basic_resolver_query_OBJECTS)
+unit_ip_basic_resolver_query_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_basic_resolver_query_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_host_name_OBJECTS = unit/ip/host_name.$(OBJEXT)
+unit_ip_host_name_OBJECTS = $(am_unit_ip_host_name_OBJECTS)
+unit_ip_host_name_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_host_name_DEPENDENCIES = libasio.a
+am_unit_ip_icmp_OBJECTS = unit/ip/icmp.$(OBJEXT)
+unit_ip_icmp_OBJECTS = $(am_unit_ip_icmp_OBJECTS)
+unit_ip_icmp_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_icmp_DEPENDENCIES = libasio.a
+am_unit_ip_multicast_OBJECTS = unit/ip/multicast.$(OBJEXT)
+unit_ip_multicast_OBJECTS = $(am_unit_ip_multicast_OBJECTS)
+unit_ip_multicast_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_multicast_DEPENDENCIES = libasio.a
+am_unit_ip_network_v4_OBJECTS = unit/ip/network_v4.$(OBJEXT)
+unit_ip_network_v4_OBJECTS = $(am_unit_ip_network_v4_OBJECTS)
+unit_ip_network_v4_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_network_v4_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_network_v6_OBJECTS = unit/ip/network_v6.$(OBJEXT)
+unit_ip_network_v6_OBJECTS = $(am_unit_ip_network_v6_OBJECTS)
+unit_ip_network_v6_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_network_v6_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_resolver_query_base_OBJECTS = \
+ unit/ip/resolver_query_base.$(OBJEXT)
+unit_ip_resolver_query_base_OBJECTS = \
+ $(am_unit_ip_resolver_query_base_OBJECTS)
+unit_ip_resolver_query_base_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_resolver_query_base_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ip_tcp_OBJECTS = unit/ip/tcp.$(OBJEXT)
+unit_ip_tcp_OBJECTS = $(am_unit_ip_tcp_OBJECTS)
+unit_ip_tcp_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_tcp_DEPENDENCIES = libasio.a
+am_unit_ip_udp_OBJECTS = unit/ip/udp.$(OBJEXT)
+unit_ip_udp_OBJECTS = $(am_unit_ip_udp_OBJECTS)
+unit_ip_udp_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_udp_DEPENDENCIES = libasio.a
+am_unit_ip_unicast_OBJECTS = unit/ip/unicast.$(OBJEXT)
+unit_ip_unicast_OBJECTS = $(am_unit_ip_unicast_OBJECTS)
+unit_ip_unicast_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_unicast_DEPENDENCIES = libasio.a
+am_unit_ip_v6_only_OBJECTS = unit/ip/v6_only.$(OBJEXT)
+unit_ip_v6_only_OBJECTS = $(am_unit_ip_v6_only_OBJECTS)
+unit_ip_v6_only_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ip_v6_only_DEPENDENCIES = libasio.a
+am_unit_is_read_buffered_OBJECTS = unit/is_read_buffered.$(OBJEXT)
+unit_is_read_buffered_OBJECTS = $(am_unit_is_read_buffered_OBJECTS)
+unit_is_read_buffered_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_is_read_buffered_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_is_write_buffered_OBJECTS = unit/is_write_buffered.$(OBJEXT)
+unit_is_write_buffered_OBJECTS = $(am_unit_is_write_buffered_OBJECTS)
+unit_is_write_buffered_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_is_write_buffered_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_local_basic_endpoint_OBJECTS = \
+ unit/local/basic_endpoint.$(OBJEXT)
+unit_local_basic_endpoint_OBJECTS = \
+ $(am_unit_local_basic_endpoint_OBJECTS)
+unit_local_basic_endpoint_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_local_basic_endpoint_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_local_connect_pair_OBJECTS = \
+ unit/local/connect_pair.$(OBJEXT)
+unit_local_connect_pair_OBJECTS = \
+ $(am_unit_local_connect_pair_OBJECTS)
+unit_local_connect_pair_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_local_connect_pair_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_local_datagram_protocol_OBJECTS = \
+ unit/local/datagram_protocol.$(OBJEXT)
+unit_local_datagram_protocol_OBJECTS = \
+ $(am_unit_local_datagram_protocol_OBJECTS)
+unit_local_datagram_protocol_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_local_datagram_protocol_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_local_seq_packet_protocol_OBJECTS = \
+ unit/local/seq_packet_protocol.$(OBJEXT)
+unit_local_seq_packet_protocol_OBJECTS = \
+ $(am_unit_local_seq_packet_protocol_OBJECTS)
+unit_local_seq_packet_protocol_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_local_seq_packet_protocol_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_local_stream_protocol_OBJECTS = \
+ unit/local/stream_protocol.$(OBJEXT)
+unit_local_stream_protocol_OBJECTS = \
+ $(am_unit_local_stream_protocol_OBJECTS)
+unit_local_stream_protocol_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_local_stream_protocol_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_packaged_task_OBJECTS = unit/packaged_task.$(OBJEXT)
+unit_packaged_task_OBJECTS = $(am_unit_packaged_task_OBJECTS)
+unit_packaged_task_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_packaged_task_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_placeholders_OBJECTS = unit/placeholders.$(OBJEXT)
+unit_placeholders_OBJECTS = $(am_unit_placeholders_OBJECTS)
+unit_placeholders_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_placeholders_DEPENDENCIES = libasio.a
+am_unit_posix_basic_descriptor_OBJECTS = \
+ unit/posix/basic_descriptor.$(OBJEXT)
+unit_posix_basic_descriptor_OBJECTS = \
+ $(am_unit_posix_basic_descriptor_OBJECTS)
+unit_posix_basic_descriptor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_posix_basic_descriptor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_posix_basic_stream_descriptor_OBJECTS = \
+ unit/posix/basic_stream_descriptor.$(OBJEXT)
+unit_posix_basic_stream_descriptor_OBJECTS = \
+ $(am_unit_posix_basic_stream_descriptor_OBJECTS)
+unit_posix_basic_stream_descriptor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_posix_basic_stream_descriptor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_posix_descriptor_OBJECTS = unit/posix/descriptor.$(OBJEXT)
+unit_posix_descriptor_OBJECTS = $(am_unit_posix_descriptor_OBJECTS)
+unit_posix_descriptor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_posix_descriptor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_posix_descriptor_base_OBJECTS = \
+ unit/posix/descriptor_base.$(OBJEXT)
+unit_posix_descriptor_base_OBJECTS = \
+ $(am_unit_posix_descriptor_base_OBJECTS)
+unit_posix_descriptor_base_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_posix_descriptor_base_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_posix_stream_descriptor_OBJECTS = \
+ unit/posix/stream_descriptor.$(OBJEXT)
+unit_posix_stream_descriptor_OBJECTS = \
+ $(am_unit_posix_stream_descriptor_OBJECTS)
+unit_posix_stream_descriptor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_posix_stream_descriptor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_post_OBJECTS = unit/post.$(OBJEXT)
+unit_post_OBJECTS = $(am_unit_post_OBJECTS)
+unit_post_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_post_DEPENDENCIES = libasio.a
+am_unit_prepend_OBJECTS = unit/prepend.$(OBJEXT)
+unit_prepend_OBJECTS = $(am_unit_prepend_OBJECTS)
+unit_prepend_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_prepend_DEPENDENCIES = libasio.a
+am_unit_random_access_file_OBJECTS = \
+ unit/random_access_file.$(OBJEXT)
+unit_random_access_file_OBJECTS = \
+ $(am_unit_random_access_file_OBJECTS)
+unit_random_access_file_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_random_access_file_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_read_OBJECTS = unit/read.$(OBJEXT)
+unit_read_OBJECTS = $(am_unit_read_OBJECTS)
+unit_read_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_read_DEPENDENCIES = libasio.a
+am_unit_read_at_OBJECTS = unit/read_at.$(OBJEXT)
+unit_read_at_OBJECTS = $(am_unit_read_at_OBJECTS)
+unit_read_at_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_read_at_DEPENDENCIES = libasio.a
+am_unit_read_until_OBJECTS = unit/read_until.$(OBJEXT)
+unit_read_until_OBJECTS = $(am_unit_read_until_OBJECTS)
+unit_read_until_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_read_until_DEPENDENCIES = libasio.a
+am_unit_readable_pipe_OBJECTS = unit/readable_pipe.$(OBJEXT)
+unit_readable_pipe_OBJECTS = $(am_unit_readable_pipe_OBJECTS)
+unit_readable_pipe_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_readable_pipe_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_recycling_allocator_OBJECTS = \
+ unit/recycling_allocator.$(OBJEXT)
+unit_recycling_allocator_OBJECTS = \
+ $(am_unit_recycling_allocator_OBJECTS)
+unit_recycling_allocator_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_recycling_allocator_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_redirect_error_OBJECTS = unit/redirect_error.$(OBJEXT)
+unit_redirect_error_OBJECTS = $(am_unit_redirect_error_OBJECTS)
+unit_redirect_error_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_redirect_error_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_registered_buffer_OBJECTS = unit/registered_buffer.$(OBJEXT)
+unit_registered_buffer_OBJECTS = $(am_unit_registered_buffer_OBJECTS)
+unit_registered_buffer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_registered_buffer_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_serial_port_OBJECTS = unit/serial_port.$(OBJEXT)
+unit_serial_port_OBJECTS = $(am_unit_serial_port_OBJECTS)
+unit_serial_port_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_serial_port_DEPENDENCIES = libasio.a
+am_unit_serial_port_base_OBJECTS = unit/serial_port_base.$(OBJEXT)
+unit_serial_port_base_OBJECTS = $(am_unit_serial_port_base_OBJECTS)
+unit_serial_port_base_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_serial_port_base_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_signal_set_OBJECTS = unit/signal_set.$(OBJEXT)
+unit_signal_set_OBJECTS = $(am_unit_signal_set_OBJECTS)
+unit_signal_set_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_signal_set_DEPENDENCIES = libasio.a
+am_unit_signal_set_base_OBJECTS = unit/signal_set_base.$(OBJEXT)
+unit_signal_set_base_OBJECTS = $(am_unit_signal_set_base_OBJECTS)
+unit_signal_set_base_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_signal_set_base_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_socket_base_OBJECTS = unit/socket_base.$(OBJEXT)
+unit_socket_base_OBJECTS = $(am_unit_socket_base_OBJECTS)
+unit_socket_base_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_socket_base_DEPENDENCIES = libasio.a
+am__unit_ssl_context_SOURCES_DIST = unit/ssl/context.cpp
+@HAVE_OPENSSL_TRUE@am_unit_ssl_context_OBJECTS = \
+@HAVE_OPENSSL_TRUE@ unit/ssl/context.$(OBJEXT)
+unit_ssl_context_OBJECTS = $(am_unit_ssl_context_OBJECTS)
+unit_ssl_context_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ssl_context_DEPENDENCIES = libasio.a
+am__unit_ssl_context_base_SOURCES_DIST = unit/ssl/context_base.cpp
+@HAVE_OPENSSL_TRUE@am_unit_ssl_context_base_OBJECTS = \
+@HAVE_OPENSSL_TRUE@ unit/ssl/context_base.$(OBJEXT)
+unit_ssl_context_base_OBJECTS = $(am_unit_ssl_context_base_OBJECTS)
+unit_ssl_context_base_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ssl_context_base_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_ssl_error_SOURCES_DIST = unit/ssl/error.cpp
+@HAVE_OPENSSL_TRUE@am_unit_ssl_error_OBJECTS = \
+@HAVE_OPENSSL_TRUE@ unit/ssl/error.$(OBJEXT)
+unit_ssl_error_OBJECTS = $(am_unit_ssl_error_OBJECTS)
+unit_ssl_error_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ssl_error_DEPENDENCIES = libasio.a
+am__unit_ssl_host_name_verification_SOURCES_DIST = \
+ unit/ssl/host_name_verification.cpp
+@HAVE_OPENSSL_TRUE@am_unit_ssl_host_name_verification_OBJECTS = \
+@HAVE_OPENSSL_TRUE@ unit/ssl/host_name_verification.$(OBJEXT)
+unit_ssl_host_name_verification_OBJECTS = \
+ $(am_unit_ssl_host_name_verification_OBJECTS)
+unit_ssl_host_name_verification_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ssl_host_name_verification_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_ssl_rfc2818_verification_SOURCES_DIST = \
+ unit/ssl/rfc2818_verification.cpp
+@HAVE_OPENSSL_TRUE@am_unit_ssl_rfc2818_verification_OBJECTS = \
+@HAVE_OPENSSL_TRUE@ unit/ssl/rfc2818_verification.$(OBJEXT)
+unit_ssl_rfc2818_verification_OBJECTS = \
+ $(am_unit_ssl_rfc2818_verification_OBJECTS)
+unit_ssl_rfc2818_verification_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ssl_rfc2818_verification_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am__unit_ssl_stream_SOURCES_DIST = unit/ssl/stream.cpp
+@HAVE_OPENSSL_TRUE@am_unit_ssl_stream_OBJECTS = \
+@HAVE_OPENSSL_TRUE@ unit/ssl/stream.$(OBJEXT)
+unit_ssl_stream_OBJECTS = $(am_unit_ssl_stream_OBJECTS)
+unit_ssl_stream_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ssl_stream_DEPENDENCIES = libasio.a
+am__unit_ssl_stream_base_SOURCES_DIST = unit/ssl/stream_base.cpp
+@HAVE_OPENSSL_TRUE@am_unit_ssl_stream_base_OBJECTS = \
+@HAVE_OPENSSL_TRUE@ unit/ssl/stream_base.$(OBJEXT)
+unit_ssl_stream_base_OBJECTS = $(am_unit_ssl_stream_base_OBJECTS)
+unit_ssl_stream_base_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ssl_stream_base_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_static_thread_pool_OBJECTS = \
+ unit/static_thread_pool.$(OBJEXT)
+unit_static_thread_pool_OBJECTS = \
+ $(am_unit_static_thread_pool_OBJECTS)
+unit_static_thread_pool_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_static_thread_pool_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_steady_timer_OBJECTS = unit/steady_timer.$(OBJEXT)
+unit_steady_timer_OBJECTS = $(am_unit_steady_timer_OBJECTS)
+unit_steady_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_steady_timer_DEPENDENCIES = libasio.a
+am_unit_strand_OBJECTS = unit/strand.$(OBJEXT)
+unit_strand_OBJECTS = $(am_unit_strand_OBJECTS)
+unit_strand_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_strand_DEPENDENCIES = libasio.a
+am_unit_stream_file_OBJECTS = unit/stream_file.$(OBJEXT)
+unit_stream_file_OBJECTS = $(am_unit_stream_file_OBJECTS)
+unit_stream_file_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_stream_file_DEPENDENCIES = libasio.a
+am_unit_streambuf_OBJECTS = unit/streambuf.$(OBJEXT)
+unit_streambuf_OBJECTS = $(am_unit_streambuf_OBJECTS)
+unit_streambuf_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_streambuf_DEPENDENCIES = libasio.a
+am_unit_system_context_OBJECTS = unit/system_context.$(OBJEXT)
+unit_system_context_OBJECTS = $(am_unit_system_context_OBJECTS)
+unit_system_context_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_system_context_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_system_executor_OBJECTS = unit/system_executor.$(OBJEXT)
+unit_system_executor_OBJECTS = $(am_unit_system_executor_OBJECTS)
+unit_system_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_system_executor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_system_timer_OBJECTS = unit/system_timer.$(OBJEXT)
+unit_system_timer_OBJECTS = $(am_unit_system_timer_OBJECTS)
+unit_system_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_system_timer_DEPENDENCIES = libasio.a
+am_unit_this_coro_OBJECTS = unit/this_coro.$(OBJEXT)
+unit_this_coro_OBJECTS = $(am_unit_this_coro_OBJECTS)
+unit_this_coro_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_this_coro_DEPENDENCIES = libasio.a
+am_unit_thread_OBJECTS = unit/thread.$(OBJEXT)
+unit_thread_OBJECTS = $(am_unit_thread_OBJECTS)
+unit_thread_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_thread_DEPENDENCIES = libasio.a
+am_unit_thread_pool_OBJECTS = unit/thread_pool.$(OBJEXT)
+unit_thread_pool_OBJECTS = $(am_unit_thread_pool_OBJECTS)
+unit_thread_pool_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_thread_pool_DEPENDENCIES = libasio.a
+am_unit_time_traits_OBJECTS = unit/time_traits.$(OBJEXT)
+unit_time_traits_OBJECTS = $(am_unit_time_traits_OBJECTS)
+unit_time_traits_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_time_traits_DEPENDENCIES = libasio.a
+am_unit_ts_buffer_OBJECTS = unit/ts/buffer.$(OBJEXT)
+unit_ts_buffer_OBJECTS = $(am_unit_ts_buffer_OBJECTS)
+unit_ts_buffer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ts_buffer_DEPENDENCIES = libasio.a
+am_unit_ts_executor_OBJECTS = unit/ts/executor.$(OBJEXT)
+unit_ts_executor_OBJECTS = $(am_unit_ts_executor_OBJECTS)
+unit_ts_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ts_executor_DEPENDENCIES = libasio.a
+am_unit_ts_internet_OBJECTS = unit/ts/internet.$(OBJEXT)
+unit_ts_internet_OBJECTS = $(am_unit_ts_internet_OBJECTS)
+unit_ts_internet_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ts_internet_DEPENDENCIES = libasio.a
+am_unit_ts_io_context_OBJECTS = unit/ts/io_context.$(OBJEXT)
+unit_ts_io_context_OBJECTS = $(am_unit_ts_io_context_OBJECTS)
+unit_ts_io_context_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ts_io_context_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_ts_net_OBJECTS = unit/ts/net.$(OBJEXT)
+unit_ts_net_OBJECTS = $(am_unit_ts_net_OBJECTS)
+unit_ts_net_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ts_net_DEPENDENCIES = libasio.a
+am_unit_ts_netfwd_OBJECTS = unit/ts/netfwd.$(OBJEXT)
+unit_ts_netfwd_OBJECTS = $(am_unit_ts_netfwd_OBJECTS)
+unit_ts_netfwd_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ts_netfwd_DEPENDENCIES = libasio.a
+am_unit_ts_socket_OBJECTS = unit/ts/socket.$(OBJEXT)
+unit_ts_socket_OBJECTS = $(am_unit_ts_socket_OBJECTS)
+unit_ts_socket_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ts_socket_DEPENDENCIES = libasio.a
+am_unit_ts_timer_OBJECTS = unit/ts/timer.$(OBJEXT)
+unit_ts_timer_OBJECTS = $(am_unit_ts_timer_OBJECTS)
+unit_ts_timer_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_ts_timer_DEPENDENCIES = libasio.a
+am_unit_use_awaitable_OBJECTS = unit/use_awaitable.$(OBJEXT)
+unit_use_awaitable_OBJECTS = $(am_unit_use_awaitable_OBJECTS)
+unit_use_awaitable_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_use_awaitable_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_use_future_OBJECTS = unit/use_future.$(OBJEXT)
+unit_use_future_OBJECTS = $(am_unit_use_future_OBJECTS)
+unit_use_future_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_use_future_DEPENDENCIES = libasio.a
+am_unit_uses_executor_OBJECTS = unit/uses_executor.$(OBJEXT)
+unit_uses_executor_OBJECTS = $(am_unit_uses_executor_OBJECTS)
+unit_uses_executor_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_uses_executor_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_wait_traits_OBJECTS = unit/wait_traits.$(OBJEXT)
+unit_wait_traits_OBJECTS = $(am_unit_wait_traits_OBJECTS)
+unit_wait_traits_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_wait_traits_DEPENDENCIES = libasio.a
+am_unit_windows_basic_object_handle_OBJECTS = \
+ unit/windows/basic_object_handle.$(OBJEXT)
+unit_windows_basic_object_handle_OBJECTS = \
+ $(am_unit_windows_basic_object_handle_OBJECTS)
+unit_windows_basic_object_handle_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_windows_basic_object_handle_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_windows_basic_overlapped_handle_OBJECTS = \
+ unit/windows/basic_overlapped_handle.$(OBJEXT)
+unit_windows_basic_overlapped_handle_OBJECTS = \
+ $(am_unit_windows_basic_overlapped_handle_OBJECTS)
+unit_windows_basic_overlapped_handle_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_windows_basic_overlapped_handle_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_windows_basic_random_access_handle_OBJECTS = \
+ unit/windows/basic_random_access_handle.$(OBJEXT)
+unit_windows_basic_random_access_handle_OBJECTS = \
+ $(am_unit_windows_basic_random_access_handle_OBJECTS)
+unit_windows_basic_random_access_handle_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_windows_basic_random_access_handle_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_windows_basic_stream_handle_OBJECTS = \
+ unit/windows/basic_stream_handle.$(OBJEXT)
+unit_windows_basic_stream_handle_OBJECTS = \
+ $(am_unit_windows_basic_stream_handle_OBJECTS)
+unit_windows_basic_stream_handle_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_windows_basic_stream_handle_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_windows_object_handle_OBJECTS = \
+ unit/windows/object_handle.$(OBJEXT)
+unit_windows_object_handle_OBJECTS = \
+ $(am_unit_windows_object_handle_OBJECTS)
+unit_windows_object_handle_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_windows_object_handle_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_windows_overlapped_handle_OBJECTS = \
+ unit/windows/overlapped_handle.$(OBJEXT)
+unit_windows_overlapped_handle_OBJECTS = \
+ $(am_unit_windows_overlapped_handle_OBJECTS)
+unit_windows_overlapped_handle_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_windows_overlapped_handle_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_windows_overlapped_ptr_OBJECTS = \
+ unit/windows/overlapped_ptr.$(OBJEXT)
+unit_windows_overlapped_ptr_OBJECTS = \
+ $(am_unit_windows_overlapped_ptr_OBJECTS)
+unit_windows_overlapped_ptr_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_windows_overlapped_ptr_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_windows_random_access_handle_OBJECTS = \
+ unit/windows/random_access_handle.$(OBJEXT)
+unit_windows_random_access_handle_OBJECTS = \
+ $(am_unit_windows_random_access_handle_OBJECTS)
+unit_windows_random_access_handle_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_windows_random_access_handle_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_windows_stream_handle_OBJECTS = \
+ unit/windows/stream_handle.$(OBJEXT)
+unit_windows_stream_handle_OBJECTS = \
+ $(am_unit_windows_stream_handle_OBJECTS)
+unit_windows_stream_handle_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_windows_stream_handle_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_writable_pipe_OBJECTS = unit/writable_pipe.$(OBJEXT)
+unit_writable_pipe_OBJECTS = $(am_unit_writable_pipe_OBJECTS)
+unit_writable_pipe_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_writable_pipe_DEPENDENCIES = \
+@SEPARATE_COMPILATION_TRUE@ libasio.a
+am_unit_write_OBJECTS = unit/write.$(OBJEXT)
+unit_write_OBJECTS = $(am_unit_write_OBJECTS)
+unit_write_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_write_DEPENDENCIES = libasio.a
+am_unit_write_at_OBJECTS = unit/write_at.$(OBJEXT)
+unit_write_at_OBJECTS = $(am_unit_write_at_OBJECTS)
+unit_write_at_LDADD = $(LDADD)
+@SEPARATE_COMPILATION_TRUE@unit_write_at_DEPENDENCIES = libasio.a
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = ../$(DEPDIR)/asio.Po ../$(DEPDIR)/asio_ssl.Po \
+ latency/$(DEPDIR)/tcp_client.Po \
+ latency/$(DEPDIR)/tcp_server.Po \
+ latency/$(DEPDIR)/udp_client.Po \
+ latency/$(DEPDIR)/udp_server.Po \
+ performance/$(DEPDIR)/client.Po \
+ performance/$(DEPDIR)/server.Po \
+ unit/$(DEPDIR)/any_completion_executor.Po \
+ unit/$(DEPDIR)/any_completion_handler.Po \
+ unit/$(DEPDIR)/any_io_executor.Po unit/$(DEPDIR)/append.Po \
+ unit/$(DEPDIR)/as_tuple.Po \
+ unit/$(DEPDIR)/associated_allocator.Po \
+ unit/$(DEPDIR)/associated_cancellation_slot.Po \
+ unit/$(DEPDIR)/associated_executor.Po \
+ unit/$(DEPDIR)/associated_immediate_executor.Po \
+ unit/$(DEPDIR)/associator.Po unit/$(DEPDIR)/async_result.Po \
+ unit/$(DEPDIR)/awaitable.Po \
+ unit/$(DEPDIR)/basic_datagram_socket.Po \
+ unit/$(DEPDIR)/basic_deadline_timer.Po \
+ unit/$(DEPDIR)/basic_file.Po \
+ unit/$(DEPDIR)/basic_random_access_file.Po \
+ unit/$(DEPDIR)/basic_raw_socket.Po \
+ unit/$(DEPDIR)/basic_readable_pipe.Po \
+ unit/$(DEPDIR)/basic_seq_packet_socket.Po \
+ unit/$(DEPDIR)/basic_serial_port.Po \
+ unit/$(DEPDIR)/basic_signal_set.Po \
+ unit/$(DEPDIR)/basic_socket.Po \
+ unit/$(DEPDIR)/basic_socket_acceptor.Po \
+ unit/$(DEPDIR)/basic_stream_file.Po \
+ unit/$(DEPDIR)/basic_stream_socket.Po \
+ unit/$(DEPDIR)/basic_streambuf.Po \
+ unit/$(DEPDIR)/basic_waitable_timer.Po \
+ unit/$(DEPDIR)/basic_writable_pipe.Po \
+ unit/$(DEPDIR)/bind_allocator.Po \
+ unit/$(DEPDIR)/bind_cancellation_slot.Po \
+ unit/$(DEPDIR)/bind_executor.Po \
+ unit/$(DEPDIR)/bind_immediate_executor.Po \
+ unit/$(DEPDIR)/buffer.Po unit/$(DEPDIR)/buffer_registration.Po \
+ unit/$(DEPDIR)/buffered_read_stream.Po \
+ unit/$(DEPDIR)/buffered_stream.Po \
+ unit/$(DEPDIR)/buffered_write_stream.Po \
+ unit/$(DEPDIR)/buffers_iterator.Po \
+ unit/$(DEPDIR)/cancellation_signal.Po \
+ unit/$(DEPDIR)/cancellation_state.Po \
+ unit/$(DEPDIR)/cancellation_type.Po unit/$(DEPDIR)/co_spawn.Po \
+ unit/$(DEPDIR)/completion_condition.Po \
+ unit/$(DEPDIR)/compose.Po unit/$(DEPDIR)/connect.Po \
+ unit/$(DEPDIR)/connect_pipe.Po unit/$(DEPDIR)/consign.Po \
+ unit/$(DEPDIR)/coroutine.Po unit/$(DEPDIR)/deadline_timer.Po \
+ unit/$(DEPDIR)/defer.Po unit/$(DEPDIR)/deferred.Po \
+ unit/$(DEPDIR)/detached.Po unit/$(DEPDIR)/dispatch.Po \
+ unit/$(DEPDIR)/error.Po unit/$(DEPDIR)/execution_context.Po \
+ unit/$(DEPDIR)/executor.Po \
+ unit/$(DEPDIR)/executor_work_guard.Po \
+ unit/$(DEPDIR)/file_base.Po \
+ unit/$(DEPDIR)/high_resolution_timer.Po \
+ unit/$(DEPDIR)/io_context.Po \
+ unit/$(DEPDIR)/io_context_strand.Po \
+ unit/$(DEPDIR)/is_read_buffered.Po \
+ unit/$(DEPDIR)/is_write_buffered.Po \
+ unit/$(DEPDIR)/packaged_task.Po unit/$(DEPDIR)/placeholders.Po \
+ unit/$(DEPDIR)/post.Po unit/$(DEPDIR)/prepend.Po \
+ unit/$(DEPDIR)/random_access_file.Po unit/$(DEPDIR)/read.Po \
+ unit/$(DEPDIR)/read_at.Po unit/$(DEPDIR)/read_until.Po \
+ unit/$(DEPDIR)/readable_pipe.Po \
+ unit/$(DEPDIR)/recycling_allocator.Po \
+ unit/$(DEPDIR)/redirect_error.Po \
+ unit/$(DEPDIR)/registered_buffer.Po \
+ unit/$(DEPDIR)/serial_port.Po \
+ unit/$(DEPDIR)/serial_port_base.Po \
+ unit/$(DEPDIR)/signal_set.Po unit/$(DEPDIR)/signal_set_base.Po \
+ unit/$(DEPDIR)/socket_base.Po \
+ unit/$(DEPDIR)/static_thread_pool.Po \
+ unit/$(DEPDIR)/steady_timer.Po unit/$(DEPDIR)/strand.Po \
+ unit/$(DEPDIR)/stream_file.Po unit/$(DEPDIR)/streambuf.Po \
+ unit/$(DEPDIR)/system_context.Po \
+ unit/$(DEPDIR)/system_executor.Po \
+ unit/$(DEPDIR)/system_timer.Po unit/$(DEPDIR)/this_coro.Po \
+ unit/$(DEPDIR)/thread.Po unit/$(DEPDIR)/thread_pool.Po \
+ unit/$(DEPDIR)/time_traits.Po unit/$(DEPDIR)/use_awaitable.Po \
+ unit/$(DEPDIR)/use_future.Po unit/$(DEPDIR)/uses_executor.Po \
+ unit/$(DEPDIR)/wait_traits.Po unit/$(DEPDIR)/writable_pipe.Po \
+ unit/$(DEPDIR)/write.Po unit/$(DEPDIR)/write_at.Po \
+ unit/execution/$(DEPDIR)/any_executor.Po \
+ unit/execution/$(DEPDIR)/blocking.Po \
+ unit/execution/$(DEPDIR)/blocking_adaptation.Po \
+ unit/execution/$(DEPDIR)/context_as.Po \
+ unit/execution/$(DEPDIR)/executor.Po \
+ unit/execution/$(DEPDIR)/invocable_archetype.Po \
+ unit/execution/$(DEPDIR)/mapping.Po \
+ unit/execution/$(DEPDIR)/outstanding_work.Po \
+ unit/execution/$(DEPDIR)/prefer_only.Po \
+ unit/execution/$(DEPDIR)/relationship.Po \
+ unit/experimental/$(DEPDIR)/awaitable_operators.Po \
+ unit/experimental/$(DEPDIR)/basic_channel.Po \
+ unit/experimental/$(DEPDIR)/basic_concurrent_channel.Po \
+ unit/experimental/$(DEPDIR)/channel.Po \
+ unit/experimental/$(DEPDIR)/channel_traits.Po \
+ unit/experimental/$(DEPDIR)/co_composed.Po \
+ unit/experimental/$(DEPDIR)/concurrent_channel.Po \
+ unit/experimental/$(DEPDIR)/parallel_group.Po \
+ unit/experimental/$(DEPDIR)/promise.Po \
+ unit/experimental/coro/$(DEPDIR)/allocator.Po \
+ unit/experimental/coro/$(DEPDIR)/cancel.Po \
+ unit/experimental/coro/$(DEPDIR)/co_spawn.Po \
+ unit/experimental/coro/$(DEPDIR)/exception.Po \
+ unit/experimental/coro/$(DEPDIR)/executor.Po \
+ unit/experimental/coro/$(DEPDIR)/partial.Po \
+ unit/experimental/coro/$(DEPDIR)/simple_test.Po \
+ unit/experimental/coro/$(DEPDIR)/stack_test.Po \
+ unit/experimental/coro/$(DEPDIR)/use_coro.Po \
+ unit/generic/$(DEPDIR)/basic_endpoint.Po \
+ unit/generic/$(DEPDIR)/datagram_protocol.Po \
+ unit/generic/$(DEPDIR)/raw_protocol.Po \
+ unit/generic/$(DEPDIR)/seq_packet_protocol.Po \
+ unit/generic/$(DEPDIR)/stream_protocol.Po \
+ unit/ip/$(DEPDIR)/address.Po unit/ip/$(DEPDIR)/address_v4.Po \
+ unit/ip/$(DEPDIR)/address_v4_iterator.Po \
+ unit/ip/$(DEPDIR)/address_v4_range.Po \
+ unit/ip/$(DEPDIR)/address_v6.Po \
+ unit/ip/$(DEPDIR)/address_v6_iterator.Po \
+ unit/ip/$(DEPDIR)/address_v6_range.Po \
+ unit/ip/$(DEPDIR)/basic_endpoint.Po \
+ unit/ip/$(DEPDIR)/basic_resolver.Po \
+ unit/ip/$(DEPDIR)/basic_resolver_entry.Po \
+ unit/ip/$(DEPDIR)/basic_resolver_iterator.Po \
+ unit/ip/$(DEPDIR)/basic_resolver_query.Po \
+ unit/ip/$(DEPDIR)/host_name.Po unit/ip/$(DEPDIR)/icmp.Po \
+ unit/ip/$(DEPDIR)/multicast.Po unit/ip/$(DEPDIR)/network_v4.Po \
+ unit/ip/$(DEPDIR)/network_v6.Po \
+ unit/ip/$(DEPDIR)/resolver_query_base.Po \
+ unit/ip/$(DEPDIR)/tcp.Po unit/ip/$(DEPDIR)/udp.Po \
+ unit/ip/$(DEPDIR)/unicast.Po unit/ip/$(DEPDIR)/v6_only.Po \
+ unit/local/$(DEPDIR)/basic_endpoint.Po \
+ unit/local/$(DEPDIR)/connect_pair.Po \
+ unit/local/$(DEPDIR)/datagram_protocol.Po \
+ unit/local/$(DEPDIR)/seq_packet_protocol.Po \
+ unit/local/$(DEPDIR)/stream_protocol.Po \
+ unit/posix/$(DEPDIR)/basic_descriptor.Po \
+ unit/posix/$(DEPDIR)/basic_stream_descriptor.Po \
+ unit/posix/$(DEPDIR)/descriptor.Po \
+ unit/posix/$(DEPDIR)/descriptor_base.Po \
+ unit/posix/$(DEPDIR)/stream_descriptor.Po \
+ unit/ssl/$(DEPDIR)/context.Po \
+ unit/ssl/$(DEPDIR)/context_base.Po unit/ssl/$(DEPDIR)/error.Po \
+ unit/ssl/$(DEPDIR)/host_name_verification.Po \
+ unit/ssl/$(DEPDIR)/rfc2818_verification.Po \
+ unit/ssl/$(DEPDIR)/stream.Po unit/ssl/$(DEPDIR)/stream_base.Po \
+ unit/ts/$(DEPDIR)/buffer.Po unit/ts/$(DEPDIR)/executor.Po \
+ unit/ts/$(DEPDIR)/internet.Po unit/ts/$(DEPDIR)/io_context.Po \
+ unit/ts/$(DEPDIR)/net.Po unit/ts/$(DEPDIR)/netfwd.Po \
+ unit/ts/$(DEPDIR)/socket.Po unit/ts/$(DEPDIR)/timer.Po \
+ unit/windows/$(DEPDIR)/basic_object_handle.Po \
+ unit/windows/$(DEPDIR)/basic_overlapped_handle.Po \
+ unit/windows/$(DEPDIR)/basic_random_access_handle.Po \
+ unit/windows/$(DEPDIR)/basic_stream_handle.Po \
+ unit/windows/$(DEPDIR)/object_handle.Po \
+ unit/windows/$(DEPDIR)/overlapped_handle.Po \
+ unit/windows/$(DEPDIR)/overlapped_ptr.Po \
+ unit/windows/$(DEPDIR)/random_access_handle.Po \
+ unit/windows/$(DEPDIR)/stream_handle.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(libasio_a_SOURCES) $(latency_tcp_client_SOURCES) \
+ $(latency_tcp_server_SOURCES) $(latency_udp_client_SOURCES) \
+ $(latency_udp_server_SOURCES) $(performance_client_SOURCES) \
+ $(performance_server_SOURCES) \
+ $(unit_any_completion_executor_SOURCES) \
+ $(unit_any_completion_handler_SOURCES) \
+ $(unit_any_io_executor_SOURCES) $(unit_append_SOURCES) \
+ $(unit_as_tuple_SOURCES) $(unit_associated_allocator_SOURCES) \
+ $(unit_associated_cancellation_slot_SOURCES) \
+ $(unit_associated_executor_SOURCES) \
+ $(unit_associated_immediate_executor_SOURCES) \
+ $(unit_associator_SOURCES) $(unit_async_result_SOURCES) \
+ $(unit_awaitable_SOURCES) \
+ $(unit_basic_datagram_socket_SOURCES) \
+ $(unit_basic_deadline_timer_SOURCES) \
+ $(unit_basic_file_SOURCES) \
+ $(unit_basic_random_access_file_SOURCES) \
+ $(unit_basic_raw_socket_SOURCES) \
+ $(unit_basic_readable_pipe_SOURCES) \
+ $(unit_basic_seq_packet_socket_SOURCES) \
+ $(unit_basic_serial_port_SOURCES) \
+ $(unit_basic_signal_set_SOURCES) $(unit_basic_socket_SOURCES) \
+ $(unit_basic_socket_acceptor_SOURCES) \
+ $(unit_basic_stream_file_SOURCES) \
+ $(unit_basic_stream_socket_SOURCES) \
+ $(unit_basic_streambuf_SOURCES) \
+ $(unit_basic_waitable_timer_SOURCES) \
+ $(unit_basic_writable_pipe_SOURCES) \
+ $(unit_bind_allocator_SOURCES) \
+ $(unit_bind_cancellation_slot_SOURCES) \
+ $(unit_bind_executor_SOURCES) \
+ $(unit_bind_immediate_executor_SOURCES) $(unit_buffer_SOURCES) \
+ $(unit_buffer_registration_SOURCES) \
+ $(unit_buffered_read_stream_SOURCES) \
+ $(unit_buffered_stream_SOURCES) \
+ $(unit_buffered_write_stream_SOURCES) \
+ $(unit_buffers_iterator_SOURCES) \
+ $(unit_cancellation_signal_SOURCES) \
+ $(unit_cancellation_state_SOURCES) \
+ $(unit_cancellation_type_SOURCES) $(unit_co_spawn_SOURCES) \
+ $(unit_completion_condition_SOURCES) $(unit_compose_SOURCES) \
+ $(unit_connect_SOURCES) $(unit_connect_pipe_SOURCES) \
+ $(unit_consign_SOURCES) $(unit_coroutine_SOURCES) \
+ $(unit_deadline_timer_SOURCES) $(unit_defer_SOURCES) \
+ $(unit_deferred_SOURCES) $(unit_detached_SOURCES) \
+ $(unit_dispatch_SOURCES) $(unit_error_SOURCES) \
+ $(unit_execution_any_executor_SOURCES) \
+ $(unit_execution_blocking_SOURCES) \
+ $(unit_execution_blocking_adaptation_SOURCES) \
+ $(unit_execution_context_as_SOURCES) \
+ $(unit_execution_executor_SOURCES) \
+ $(unit_execution_invocable_archetype_SOURCES) \
+ $(unit_execution_mapping_SOURCES) \
+ $(unit_execution_outstanding_work_SOURCES) \
+ $(unit_execution_prefer_only_SOURCES) \
+ $(unit_execution_relationship_SOURCES) \
+ $(unit_execution_context_SOURCES) $(unit_executor_SOURCES) \
+ $(unit_executor_work_guard_SOURCES) \
+ $(unit_experimental_awaitable_operators_SOURCES) \
+ $(unit_experimental_basic_channel_SOURCES) \
+ $(unit_experimental_basic_concurrent_channel_SOURCES) \
+ $(unit_experimental_channel_SOURCES) \
+ $(unit_experimental_channel_traits_SOURCES) \
+ $(unit_experimental_co_composed_SOURCES) \
+ $(unit_experimental_concurrent_channel_SOURCES) \
+ $(unit_experimental_coro_allocator_SOURCES) \
+ $(unit_experimental_coro_cancel_SOURCES) \
+ $(unit_experimental_coro_co_spawn_SOURCES) \
+ $(unit_experimental_coro_exception_SOURCES) \
+ $(unit_experimental_coro_executor_SOURCES) \
+ $(unit_experimental_coro_partial_SOURCES) \
+ $(unit_experimental_coro_simple_test_SOURCES) \
+ $(unit_experimental_coro_stack_test_SOURCES) \
+ $(unit_experimental_coro_use_coro_SOURCES) \
+ $(unit_experimental_parallel_group_SOURCES) \
+ $(unit_experimental_promise_SOURCES) $(unit_file_base_SOURCES) \
+ $(unit_generic_basic_endpoint_SOURCES) \
+ $(unit_generic_datagram_protocol_SOURCES) \
+ $(unit_generic_raw_protocol_SOURCES) \
+ $(unit_generic_seq_packet_protocol_SOURCES) \
+ $(unit_generic_stream_protocol_SOURCES) \
+ $(unit_high_resolution_timer_SOURCES) \
+ $(unit_io_context_SOURCES) $(unit_io_context_strand_SOURCES) \
+ $(unit_ip_address_SOURCES) $(unit_ip_address_v4_SOURCES) \
+ $(unit_ip_address_v4_iterator_SOURCES) \
+ $(unit_ip_address_v4_range_SOURCES) \
+ $(unit_ip_address_v6_SOURCES) \
+ $(unit_ip_address_v6_iterator_SOURCES) \
+ $(unit_ip_address_v6_range_SOURCES) \
+ $(unit_ip_basic_endpoint_SOURCES) \
+ $(unit_ip_basic_resolver_SOURCES) \
+ $(unit_ip_basic_resolver_entry_SOURCES) \
+ $(unit_ip_basic_resolver_iterator_SOURCES) \
+ $(unit_ip_basic_resolver_query_SOURCES) \
+ $(unit_ip_host_name_SOURCES) $(unit_ip_icmp_SOURCES) \
+ $(unit_ip_multicast_SOURCES) $(unit_ip_network_v4_SOURCES) \
+ $(unit_ip_network_v6_SOURCES) \
+ $(unit_ip_resolver_query_base_SOURCES) $(unit_ip_tcp_SOURCES) \
+ $(unit_ip_udp_SOURCES) $(unit_ip_unicast_SOURCES) \
+ $(unit_ip_v6_only_SOURCES) $(unit_is_read_buffered_SOURCES) \
+ $(unit_is_write_buffered_SOURCES) \
+ $(unit_local_basic_endpoint_SOURCES) \
+ $(unit_local_connect_pair_SOURCES) \
+ $(unit_local_datagram_protocol_SOURCES) \
+ $(unit_local_seq_packet_protocol_SOURCES) \
+ $(unit_local_stream_protocol_SOURCES) \
+ $(unit_packaged_task_SOURCES) $(unit_placeholders_SOURCES) \
+ $(unit_posix_basic_descriptor_SOURCES) \
+ $(unit_posix_basic_stream_descriptor_SOURCES) \
+ $(unit_posix_descriptor_SOURCES) \
+ $(unit_posix_descriptor_base_SOURCES) \
+ $(unit_posix_stream_descriptor_SOURCES) $(unit_post_SOURCES) \
+ $(unit_prepend_SOURCES) $(unit_random_access_file_SOURCES) \
+ $(unit_read_SOURCES) $(unit_read_at_SOURCES) \
+ $(unit_read_until_SOURCES) $(unit_readable_pipe_SOURCES) \
+ $(unit_recycling_allocator_SOURCES) \
+ $(unit_redirect_error_SOURCES) \
+ $(unit_registered_buffer_SOURCES) $(unit_serial_port_SOURCES) \
+ $(unit_serial_port_base_SOURCES) $(unit_signal_set_SOURCES) \
+ $(unit_signal_set_base_SOURCES) $(unit_socket_base_SOURCES) \
+ $(unit_ssl_context_SOURCES) $(unit_ssl_context_base_SOURCES) \
+ $(unit_ssl_error_SOURCES) \
+ $(unit_ssl_host_name_verification_SOURCES) \
+ $(unit_ssl_rfc2818_verification_SOURCES) \
+ $(unit_ssl_stream_SOURCES) $(unit_ssl_stream_base_SOURCES) \
+ $(unit_static_thread_pool_SOURCES) \
+ $(unit_steady_timer_SOURCES) $(unit_strand_SOURCES) \
+ $(unit_stream_file_SOURCES) $(unit_streambuf_SOURCES) \
+ $(unit_system_context_SOURCES) $(unit_system_executor_SOURCES) \
+ $(unit_system_timer_SOURCES) $(unit_this_coro_SOURCES) \
+ $(unit_thread_SOURCES) $(unit_thread_pool_SOURCES) \
+ $(unit_time_traits_SOURCES) $(unit_ts_buffer_SOURCES) \
+ $(unit_ts_executor_SOURCES) $(unit_ts_internet_SOURCES) \
+ $(unit_ts_io_context_SOURCES) $(unit_ts_net_SOURCES) \
+ $(unit_ts_netfwd_SOURCES) $(unit_ts_socket_SOURCES) \
+ $(unit_ts_timer_SOURCES) $(unit_use_awaitable_SOURCES) \
+ $(unit_use_future_SOURCES) $(unit_uses_executor_SOURCES) \
+ $(unit_wait_traits_SOURCES) \
+ $(unit_windows_basic_object_handle_SOURCES) \
+ $(unit_windows_basic_overlapped_handle_SOURCES) \
+ $(unit_windows_basic_random_access_handle_SOURCES) \
+ $(unit_windows_basic_stream_handle_SOURCES) \
+ $(unit_windows_object_handle_SOURCES) \
+ $(unit_windows_overlapped_handle_SOURCES) \
+ $(unit_windows_overlapped_ptr_SOURCES) \
+ $(unit_windows_random_access_handle_SOURCES) \
+ $(unit_windows_stream_handle_SOURCES) \
+ $(unit_writable_pipe_SOURCES) $(unit_write_SOURCES) \
+ $(unit_write_at_SOURCES)
+DIST_SOURCES = $(am__libasio_a_SOURCES_DIST) \
+ $(am__latency_tcp_client_SOURCES_DIST) \
+ $(am__latency_tcp_server_SOURCES_DIST) \
+ $(am__latency_udp_client_SOURCES_DIST) \
+ $(am__latency_udp_server_SOURCES_DIST) \
+ $(am__performance_client_SOURCES_DIST) \
+ $(am__performance_server_SOURCES_DIST) \
+ $(unit_any_completion_executor_SOURCES) \
+ $(unit_any_completion_handler_SOURCES) \
+ $(unit_any_io_executor_SOURCES) $(unit_append_SOURCES) \
+ $(unit_as_tuple_SOURCES) $(unit_associated_allocator_SOURCES) \
+ $(unit_associated_cancellation_slot_SOURCES) \
+ $(unit_associated_executor_SOURCES) \
+ $(unit_associated_immediate_executor_SOURCES) \
+ $(unit_associator_SOURCES) $(unit_async_result_SOURCES) \
+ $(unit_awaitable_SOURCES) \
+ $(unit_basic_datagram_socket_SOURCES) \
+ $(unit_basic_deadline_timer_SOURCES) \
+ $(unit_basic_file_SOURCES) \
+ $(unit_basic_random_access_file_SOURCES) \
+ $(unit_basic_raw_socket_SOURCES) \
+ $(unit_basic_readable_pipe_SOURCES) \
+ $(unit_basic_seq_packet_socket_SOURCES) \
+ $(unit_basic_serial_port_SOURCES) \
+ $(unit_basic_signal_set_SOURCES) $(unit_basic_socket_SOURCES) \
+ $(unit_basic_socket_acceptor_SOURCES) \
+ $(unit_basic_stream_file_SOURCES) \
+ $(unit_basic_stream_socket_SOURCES) \
+ $(unit_basic_streambuf_SOURCES) \
+ $(unit_basic_waitable_timer_SOURCES) \
+ $(unit_basic_writable_pipe_SOURCES) \
+ $(unit_bind_allocator_SOURCES) \
+ $(unit_bind_cancellation_slot_SOURCES) \
+ $(unit_bind_executor_SOURCES) \
+ $(unit_bind_immediate_executor_SOURCES) $(unit_buffer_SOURCES) \
+ $(unit_buffer_registration_SOURCES) \
+ $(unit_buffered_read_stream_SOURCES) \
+ $(unit_buffered_stream_SOURCES) \
+ $(unit_buffered_write_stream_SOURCES) \
+ $(unit_buffers_iterator_SOURCES) \
+ $(unit_cancellation_signal_SOURCES) \
+ $(unit_cancellation_state_SOURCES) \
+ $(unit_cancellation_type_SOURCES) $(unit_co_spawn_SOURCES) \
+ $(unit_completion_condition_SOURCES) $(unit_compose_SOURCES) \
+ $(unit_connect_SOURCES) $(unit_connect_pipe_SOURCES) \
+ $(unit_consign_SOURCES) $(unit_coroutine_SOURCES) \
+ $(unit_deadline_timer_SOURCES) $(unit_defer_SOURCES) \
+ $(unit_deferred_SOURCES) $(unit_detached_SOURCES) \
+ $(unit_dispatch_SOURCES) $(unit_error_SOURCES) \
+ $(unit_execution_any_executor_SOURCES) \
+ $(unit_execution_blocking_SOURCES) \
+ $(unit_execution_blocking_adaptation_SOURCES) \
+ $(unit_execution_context_as_SOURCES) \
+ $(unit_execution_executor_SOURCES) \
+ $(unit_execution_invocable_archetype_SOURCES) \
+ $(unit_execution_mapping_SOURCES) \
+ $(unit_execution_outstanding_work_SOURCES) \
+ $(unit_execution_prefer_only_SOURCES) \
+ $(unit_execution_relationship_SOURCES) \
+ $(unit_execution_context_SOURCES) $(unit_executor_SOURCES) \
+ $(unit_executor_work_guard_SOURCES) \
+ $(am__unit_experimental_awaitable_operators_SOURCES_DIST) \
+ $(am__unit_experimental_basic_channel_SOURCES_DIST) \
+ $(am__unit_experimental_basic_concurrent_channel_SOURCES_DIST) \
+ $(am__unit_experimental_channel_SOURCES_DIST) \
+ $(am__unit_experimental_channel_traits_SOURCES_DIST) \
+ $(am__unit_experimental_co_composed_SOURCES_DIST) \
+ $(am__unit_experimental_concurrent_channel_SOURCES_DIST) \
+ $(am__unit_experimental_coro_allocator_SOURCES_DIST) \
+ $(am__unit_experimental_coro_cancel_SOURCES_DIST) \
+ $(am__unit_experimental_coro_co_spawn_SOURCES_DIST) \
+ $(am__unit_experimental_coro_exception_SOURCES_DIST) \
+ $(am__unit_experimental_coro_executor_SOURCES_DIST) \
+ $(am__unit_experimental_coro_partial_SOURCES_DIST) \
+ $(am__unit_experimental_coro_simple_test_SOURCES_DIST) \
+ $(am__unit_experimental_coro_stack_test_SOURCES_DIST) \
+ $(am__unit_experimental_coro_use_coro_SOURCES_DIST) \
+ $(am__unit_experimental_parallel_group_SOURCES_DIST) \
+ $(am__unit_experimental_promise_SOURCES_DIST) \
+ $(unit_file_base_SOURCES) \
+ $(unit_generic_basic_endpoint_SOURCES) \
+ $(unit_generic_datagram_protocol_SOURCES) \
+ $(unit_generic_raw_protocol_SOURCES) \
+ $(unit_generic_seq_packet_protocol_SOURCES) \
+ $(unit_generic_stream_protocol_SOURCES) \
+ $(unit_high_resolution_timer_SOURCES) \
+ $(unit_io_context_SOURCES) $(unit_io_context_strand_SOURCES) \
+ $(unit_ip_address_SOURCES) $(unit_ip_address_v4_SOURCES) \
+ $(unit_ip_address_v4_iterator_SOURCES) \
+ $(unit_ip_address_v4_range_SOURCES) \
+ $(unit_ip_address_v6_SOURCES) \
+ $(unit_ip_address_v6_iterator_SOURCES) \
+ $(unit_ip_address_v6_range_SOURCES) \
+ $(unit_ip_basic_endpoint_SOURCES) \
+ $(unit_ip_basic_resolver_SOURCES) \
+ $(unit_ip_basic_resolver_entry_SOURCES) \
+ $(unit_ip_basic_resolver_iterator_SOURCES) \
+ $(unit_ip_basic_resolver_query_SOURCES) \
+ $(unit_ip_host_name_SOURCES) $(unit_ip_icmp_SOURCES) \
+ $(unit_ip_multicast_SOURCES) $(unit_ip_network_v4_SOURCES) \
+ $(unit_ip_network_v6_SOURCES) \
+ $(unit_ip_resolver_query_base_SOURCES) $(unit_ip_tcp_SOURCES) \
+ $(unit_ip_udp_SOURCES) $(unit_ip_unicast_SOURCES) \
+ $(unit_ip_v6_only_SOURCES) $(unit_is_read_buffered_SOURCES) \
+ $(unit_is_write_buffered_SOURCES) \
+ $(unit_local_basic_endpoint_SOURCES) \
+ $(unit_local_connect_pair_SOURCES) \
+ $(unit_local_datagram_protocol_SOURCES) \
+ $(unit_local_seq_packet_protocol_SOURCES) \
+ $(unit_local_stream_protocol_SOURCES) \
+ $(unit_packaged_task_SOURCES) $(unit_placeholders_SOURCES) \
+ $(unit_posix_basic_descriptor_SOURCES) \
+ $(unit_posix_basic_stream_descriptor_SOURCES) \
+ $(unit_posix_descriptor_SOURCES) \
+ $(unit_posix_descriptor_base_SOURCES) \
+ $(unit_posix_stream_descriptor_SOURCES) $(unit_post_SOURCES) \
+ $(unit_prepend_SOURCES) $(unit_random_access_file_SOURCES) \
+ $(unit_read_SOURCES) $(unit_read_at_SOURCES) \
+ $(unit_read_until_SOURCES) $(unit_readable_pipe_SOURCES) \
+ $(unit_recycling_allocator_SOURCES) \
+ $(unit_redirect_error_SOURCES) \
+ $(unit_registered_buffer_SOURCES) $(unit_serial_port_SOURCES) \
+ $(unit_serial_port_base_SOURCES) $(unit_signal_set_SOURCES) \
+ $(unit_signal_set_base_SOURCES) $(unit_socket_base_SOURCES) \
+ $(am__unit_ssl_context_SOURCES_DIST) \
+ $(am__unit_ssl_context_base_SOURCES_DIST) \
+ $(am__unit_ssl_error_SOURCES_DIST) \
+ $(am__unit_ssl_host_name_verification_SOURCES_DIST) \
+ $(am__unit_ssl_rfc2818_verification_SOURCES_DIST) \
+ $(am__unit_ssl_stream_SOURCES_DIST) \
+ $(am__unit_ssl_stream_base_SOURCES_DIST) \
+ $(unit_static_thread_pool_SOURCES) \
+ $(unit_steady_timer_SOURCES) $(unit_strand_SOURCES) \
+ $(unit_stream_file_SOURCES) $(unit_streambuf_SOURCES) \
+ $(unit_system_context_SOURCES) $(unit_system_executor_SOURCES) \
+ $(unit_system_timer_SOURCES) $(unit_this_coro_SOURCES) \
+ $(unit_thread_SOURCES) $(unit_thread_pool_SOURCES) \
+ $(unit_time_traits_SOURCES) $(unit_ts_buffer_SOURCES) \
+ $(unit_ts_executor_SOURCES) $(unit_ts_internet_SOURCES) \
+ $(unit_ts_io_context_SOURCES) $(unit_ts_net_SOURCES) \
+ $(unit_ts_netfwd_SOURCES) $(unit_ts_socket_SOURCES) \
+ $(unit_ts_timer_SOURCES) $(unit_use_awaitable_SOURCES) \
+ $(unit_use_future_SOURCES) $(unit_uses_executor_SOURCES) \
+ $(unit_wait_traits_SOURCES) \
+ $(unit_windows_basic_object_handle_SOURCES) \
+ $(unit_windows_basic_overlapped_handle_SOURCES) \
+ $(unit_windows_basic_random_access_handle_SOURCES) \
+ $(unit_windows_basic_stream_handle_SOURCES) \
+ $(unit_windows_object_handle_SOURCES) \
+ $(unit_windows_overlapped_handle_SOURCES) \
+ $(unit_windows_overlapped_ptr_SOURCES) \
+ $(unit_windows_random_access_handle_SOURCES) \
+ $(unit_windows_stream_handle_SOURCES) \
+ $(unit_writable_pipe_SOURCES) $(unit_write_SOURCES) \
+ $(unit_write_at_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \
+ ctags-recursive dvi-recursive html-recursive info-recursive \
+ install-data-recursive install-dvi-recursive \
+ install-exec-recursive install-html-recursive \
+ install-info-recursive install-pdf-recursive \
+ install-ps-recursive install-recursive installcheck-recursive \
+ installdirs-recursive pdf-recursive ps-recursive \
+ tags-recursive uninstall-recursive
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+HEADERS = $(noinst_HEADERS)
+RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
+ distclean-recursive maintainer-clean-recursive
+am__recursive_targets = \
+ $(RECURSIVE_TARGETS) \
+ $(RECURSIVE_CLEAN_TARGETS) \
+ $(am__extra_recursive_targets)
+AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \
+ check recheck distdir distdir-am
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
+RECHECK_LOGS = $(TEST_LOGS)
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+DIST_SUBDIRS = $(SUBDIRS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+am__relativize = \
+ dir0=`pwd`; \
+ sed_first='s,^\([^/]*\)/.*$$,\1,'; \
+ sed_rest='s,^[^/]*/*,,'; \
+ sed_last='s,^.*/\([^/]*\)$$,\1,'; \
+ sed_butlast='s,/*[^/]*$$,,'; \
+ while test -n "$$dir1"; do \
+ first=`echo "$$dir1" | sed -e "$$sed_first"`; \
+ if test "$$first" != "."; then \
+ if test "$$first" = ".."; then \
+ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
+ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
+ else \
+ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
+ if test "$$first2" = "$$first"; then \
+ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
+ else \
+ dir2="../$$dir2"; \
+ fi; \
+ dir0="$$dir0"/"$$first"; \
+ fi; \
+ fi; \
+ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
+ done; \
+ reldir="$$dir2"
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = subdir-objects
+@SEPARATE_COMPILATION_TRUE@noinst_LIBRARIES = libasio.a
+@SEPARATE_COMPILATION_TRUE@libasio_a_SOURCES = ../asio.cpp \
+@SEPARATE_COMPILATION_TRUE@ $(am__append_1)
+@SEPARATE_COMPILATION_TRUE@LDADD = libasio.a
+SUBDIRS = properties
+noinst_HEADERS = \
+ latency/high_res_clock.hpp \
+ unit/unit_test.hpp
+
+AM_CXXFLAGS = -I$(srcdir)/../../include
+@STANDALONE_FALSE@latency_tcp_client_SOURCES = latency/tcp_client.cpp
+@STANDALONE_FALSE@latency_tcp_server_SOURCES = latency/tcp_server.cpp
+@STANDALONE_FALSE@latency_udp_client_SOURCES = latency/udp_client.cpp
+@STANDALONE_FALSE@latency_udp_server_SOURCES = latency/udp_server.cpp
+@STANDALONE_FALSE@performance_client_SOURCES = performance/client.cpp
+@STANDALONE_FALSE@performance_server_SOURCES = performance/server.cpp
+unit_any_completion_executor_SOURCES = unit/any_completion_executor.cpp
+unit_any_completion_handler_SOURCES = unit/any_completion_handler.cpp
+unit_any_io_executor_SOURCES = unit/any_io_executor.cpp
+unit_append_SOURCES = unit/append.cpp
+unit_as_tuple_SOURCES = unit/as_tuple.cpp
+unit_associated_allocator_SOURCES = unit/associated_allocator.cpp
+unit_associated_cancellation_slot_SOURCES = unit/associated_cancellation_slot.cpp
+unit_associated_executor_SOURCES = unit/associated_executor.cpp
+unit_associated_immediate_executor_SOURCES = unit/associated_immediate_executor.cpp
+unit_associator_SOURCES = unit/associator.cpp
+unit_async_result_SOURCES = unit/async_result.cpp
+unit_awaitable_SOURCES = unit/awaitable.cpp
+unit_basic_datagram_socket_SOURCES = unit/basic_datagram_socket.cpp
+unit_basic_deadline_timer_SOURCES = unit/basic_deadline_timer.cpp
+unit_basic_file_SOURCES = unit/basic_file.cpp
+unit_basic_random_access_file_SOURCES = unit/basic_random_access_file.cpp
+unit_basic_raw_socket_SOURCES = unit/basic_raw_socket.cpp
+unit_basic_readable_pipe_SOURCES = unit/basic_readable_pipe.cpp
+unit_basic_seq_packet_socket_SOURCES = unit/basic_seq_packet_socket.cpp
+unit_basic_serial_port_SOURCES = unit/basic_serial_port.cpp
+unit_basic_signal_set_SOURCES = unit/basic_signal_set.cpp
+unit_basic_socket_SOURCES = unit/basic_socket.cpp
+unit_basic_socket_acceptor_SOURCES = unit/basic_socket_acceptor.cpp
+unit_basic_stream_file_SOURCES = unit/basic_stream_file.cpp
+unit_basic_stream_socket_SOURCES = unit/basic_stream_socket.cpp
+unit_basic_streambuf_SOURCES = unit/basic_streambuf.cpp
+unit_basic_waitable_timer_SOURCES = unit/basic_waitable_timer.cpp
+unit_basic_writable_pipe_SOURCES = unit/basic_writable_pipe.cpp
+unit_bind_allocator_SOURCES = unit/bind_allocator.cpp
+unit_bind_cancellation_slot_SOURCES = unit/bind_cancellation_slot.cpp
+unit_bind_executor_SOURCES = unit/bind_executor.cpp
+unit_bind_immediate_executor_SOURCES = unit/bind_immediate_executor.cpp
+unit_buffer_SOURCES = unit/buffer.cpp
+unit_buffer_registration_SOURCES = unit/buffer_registration.cpp
+unit_buffers_iterator_SOURCES = unit/buffers_iterator.cpp
+unit_buffered_read_stream_SOURCES = unit/buffered_read_stream.cpp
+unit_buffered_stream_SOURCES = unit/buffered_stream.cpp
+unit_buffered_write_stream_SOURCES = unit/buffered_write_stream.cpp
+unit_cancellation_signal_SOURCES = unit/cancellation_signal.cpp
+unit_cancellation_state_SOURCES = unit/cancellation_state.cpp
+unit_cancellation_type_SOURCES = unit/cancellation_type.cpp
+unit_co_spawn_SOURCES = unit/co_spawn.cpp
+unit_completion_condition_SOURCES = unit/completion_condition.cpp
+unit_compose_SOURCES = unit/compose.cpp
+unit_connect_SOURCES = unit/connect.cpp
+unit_connect_pipe_SOURCES = unit/connect_pipe.cpp
+unit_consign_SOURCES = unit/consign.cpp
+unit_coroutine_SOURCES = unit/coroutine.cpp
+unit_deadline_timer_SOURCES = unit/deadline_timer.cpp
+unit_defer_SOURCES = unit/defer.cpp
+unit_deferred_SOURCES = unit/deferred.cpp
+unit_detached_SOURCES = unit/detached.cpp
+unit_dispatch_SOURCES = unit/dispatch.cpp
+unit_error_SOURCES = unit/error.cpp
+unit_execution_any_executor_SOURCES = unit/execution/any_executor.cpp
+unit_execution_blocking_SOURCES = unit/execution/blocking.cpp
+unit_execution_blocking_adaptation_SOURCES = unit/execution/blocking_adaptation.cpp
+unit_execution_context_as_SOURCES = unit/execution/context_as.cpp
+unit_execution_executor_SOURCES = unit/execution/executor.cpp
+unit_execution_invocable_archetype_SOURCES = unit/execution/invocable_archetype.cpp
+unit_execution_mapping_SOURCES = unit/execution/mapping.cpp
+unit_execution_outstanding_work_SOURCES = unit/execution/outstanding_work.cpp
+unit_execution_prefer_only_SOURCES = unit/execution/prefer_only.cpp
+unit_execution_relationship_SOURCES = unit/execution/relationship.cpp
+unit_execution_context_SOURCES = unit/execution_context.cpp
+unit_executor_SOURCES = unit/executor.cpp
+unit_executor_work_guard_SOURCES = unit/executor_work_guard.cpp
+unit_file_base_SOURCES = unit/file_base.cpp
+unit_generic_basic_endpoint_SOURCES = unit/generic/basic_endpoint.cpp
+unit_generic_datagram_protocol_SOURCES = unit/generic/datagram_protocol.cpp
+unit_generic_raw_protocol_SOURCES = unit/generic/raw_protocol.cpp
+unit_generic_seq_packet_protocol_SOURCES = unit/generic/seq_packet_protocol.cpp
+unit_generic_stream_protocol_SOURCES = unit/generic/stream_protocol.cpp
+unit_high_resolution_timer_SOURCES = unit/high_resolution_timer.cpp
+unit_io_context_SOURCES = unit/io_context.cpp
+unit_io_context_strand_SOURCES = unit/io_context_strand.cpp
+unit_ip_address_SOURCES = unit/ip/address.cpp
+unit_ip_address_v4_SOURCES = unit/ip/address_v4.cpp
+unit_ip_address_v4_iterator_SOURCES = unit/ip/address_v4_iterator.cpp
+unit_ip_address_v4_range_SOURCES = unit/ip/address_v4_range.cpp
+unit_ip_address_v6_SOURCES = unit/ip/address_v6.cpp
+unit_ip_address_v6_iterator_SOURCES = unit/ip/address_v6_iterator.cpp
+unit_ip_address_v6_range_SOURCES = unit/ip/address_v6_range.cpp
+unit_ip_basic_endpoint_SOURCES = unit/ip/basic_endpoint.cpp
+unit_ip_basic_resolver_SOURCES = unit/ip/basic_resolver.cpp
+unit_ip_basic_resolver_entry_SOURCES = unit/ip/basic_resolver_entry.cpp
+unit_ip_basic_resolver_iterator_SOURCES = unit/ip/basic_resolver_iterator.cpp
+unit_ip_basic_resolver_query_SOURCES = unit/ip/basic_resolver_query.cpp
+unit_ip_host_name_SOURCES = unit/ip/host_name.cpp
+unit_ip_icmp_SOURCES = unit/ip/icmp.cpp
+unit_ip_multicast_SOURCES = unit/ip/multicast.cpp
+unit_ip_network_v4_SOURCES = unit/ip/network_v4.cpp
+unit_ip_network_v6_SOURCES = unit/ip/network_v6.cpp
+unit_ip_resolver_query_base_SOURCES = unit/ip/resolver_query_base.cpp
+unit_ip_tcp_SOURCES = unit/ip/tcp.cpp
+unit_ip_udp_SOURCES = unit/ip/udp.cpp
+unit_ip_unicast_SOURCES = unit/ip/unicast.cpp
+unit_ip_v6_only_SOURCES = unit/ip/v6_only.cpp
+unit_is_read_buffered_SOURCES = unit/is_read_buffered.cpp
+unit_is_write_buffered_SOURCES = unit/is_write_buffered.cpp
+unit_local_basic_endpoint_SOURCES = unit/local/basic_endpoint.cpp
+unit_local_connect_pair_SOURCES = unit/local/connect_pair.cpp
+unit_local_datagram_protocol_SOURCES = unit/local/datagram_protocol.cpp
+unit_local_seq_packet_protocol_SOURCES = unit/local/seq_packet_protocol.cpp
+unit_local_stream_protocol_SOURCES = unit/local/stream_protocol.cpp
+unit_packaged_task_SOURCES = unit/packaged_task.cpp
+unit_placeholders_SOURCES = unit/placeholders.cpp
+unit_posix_basic_descriptor_SOURCES = unit/posix/basic_descriptor.cpp
+unit_posix_basic_stream_descriptor_SOURCES = unit/posix/basic_stream_descriptor.cpp
+unit_posix_descriptor_SOURCES = unit/posix/descriptor.cpp
+unit_posix_descriptor_base_SOURCES = unit/posix/descriptor_base.cpp
+unit_posix_stream_descriptor_SOURCES = unit/posix/stream_descriptor.cpp
+unit_post_SOURCES = unit/post.cpp
+unit_prepend_SOURCES = unit/prepend.cpp
+unit_random_access_file_SOURCES = unit/random_access_file.cpp
+unit_read_SOURCES = unit/read.cpp
+unit_read_at_SOURCES = unit/read_at.cpp
+unit_read_until_SOURCES = unit/read_until.cpp
+unit_readable_pipe_SOURCES = unit/readable_pipe.cpp
+unit_recycling_allocator_SOURCES = unit/recycling_allocator.cpp
+unit_redirect_error_SOURCES = unit/redirect_error.cpp
+unit_registered_buffer_SOURCES = unit/registered_buffer.cpp
+unit_serial_port_SOURCES = unit/serial_port.cpp
+unit_serial_port_base_SOURCES = unit/serial_port_base.cpp
+unit_signal_set_SOURCES = unit/signal_set.cpp
+unit_signal_set_base_SOURCES = unit/signal_set_base.cpp
+unit_socket_base_SOURCES = unit/socket_base.cpp
+unit_static_thread_pool_SOURCES = unit/static_thread_pool.cpp
+unit_steady_timer_SOURCES = unit/steady_timer.cpp
+unit_strand_SOURCES = unit/strand.cpp
+unit_stream_file_SOURCES = unit/stream_file.cpp
+unit_streambuf_SOURCES = unit/streambuf.cpp
+unit_system_context_SOURCES = unit/system_context.cpp
+unit_system_executor_SOURCES = unit/system_executor.cpp
+unit_system_timer_SOURCES = unit/system_timer.cpp
+unit_this_coro_SOURCES = unit/this_coro.cpp
+unit_thread_SOURCES = unit/thread.cpp
+unit_thread_pool_SOURCES = unit/thread_pool.cpp
+unit_time_traits_SOURCES = unit/time_traits.cpp
+unit_ts_buffer_SOURCES = unit/ts/buffer.cpp
+unit_ts_executor_SOURCES = unit/ts/executor.cpp
+unit_ts_internet_SOURCES = unit/ts/internet.cpp
+unit_ts_io_context_SOURCES = unit/ts/io_context.cpp
+unit_ts_net_SOURCES = unit/ts/net.cpp
+unit_ts_netfwd_SOURCES = unit/ts/netfwd.cpp
+unit_ts_socket_SOURCES = unit/ts/socket.cpp
+unit_ts_timer_SOURCES = unit/ts/timer.cpp
+unit_use_awaitable_SOURCES = unit/use_awaitable.cpp
+unit_use_future_SOURCES = unit/use_future.cpp
+unit_uses_executor_SOURCES = unit/uses_executor.cpp
+unit_wait_traits_SOURCES = unit/wait_traits.cpp
+unit_windows_basic_object_handle_SOURCES = unit/windows/basic_object_handle.cpp
+unit_windows_basic_overlapped_handle_SOURCES = unit/windows/basic_overlapped_handle.cpp
+unit_windows_basic_random_access_handle_SOURCES = unit/windows/basic_random_access_handle.cpp
+unit_windows_basic_stream_handle_SOURCES = unit/windows/basic_stream_handle.cpp
+unit_windows_object_handle_SOURCES = unit/windows/object_handle.cpp
+unit_windows_overlapped_handle_SOURCES = unit/windows/overlapped_handle.cpp
+unit_windows_overlapped_ptr_SOURCES = unit/windows/overlapped_ptr.cpp
+unit_windows_random_access_handle_SOURCES = unit/windows/random_access_handle.cpp
+unit_windows_stream_handle_SOURCES = unit/windows/stream_handle.cpp
+unit_writable_pipe_SOURCES = unit/writable_pipe.cpp
+unit_write_SOURCES = unit/write.cpp
+unit_write_at_SOURCES = unit/write_at.cpp
+@HAVE_CXX11_TRUE@unit_experimental_basic_channel_SOURCES = unit/experimental/basic_channel.cpp
+@HAVE_CXX11_TRUE@unit_experimental_basic_concurrent_channel_SOURCES = unit/experimental/basic_concurrent_channel.cpp
+@HAVE_CXX11_TRUE@unit_experimental_channel_SOURCES = unit/experimental/channel.cpp
+@HAVE_CXX11_TRUE@unit_experimental_channel_traits_SOURCES = unit/experimental/channel_traits.cpp
+@HAVE_CXX11_TRUE@unit_experimental_concurrent_channel_SOURCES = unit/experimental/concurrent_channel.cpp
+@HAVE_CXX11_TRUE@unit_experimental_parallel_group_SOURCES = unit/experimental/parallel_group.cpp
+@HAVE_CXX20_TRUE@unit_experimental_promise_SOURCES = unit/experimental/promise.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@unit_experimental_awaitable_operators_SOURCES = unit/experimental/awaitable_operators.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@unit_experimental_co_composed_SOURCES = unit/experimental/co_composed.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@unit_experimental_coro_allocator_SOURCES = unit/experimental/coro/allocator.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@unit_experimental_coro_cancel_SOURCES = unit/experimental/coro/cancel.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@unit_experimental_coro_co_spawn_SOURCES = unit/experimental/coro/co_spawn.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@unit_experimental_coro_exception_SOURCES = unit/experimental/coro/exception.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@unit_experimental_coro_executor_SOURCES = unit/experimental/coro/executor.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@unit_experimental_coro_partial_SOURCES = unit/experimental/coro/partial.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@unit_experimental_coro_simple_test_SOURCES = unit/experimental/coro/simple_test.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@unit_experimental_coro_stack_test_SOURCES = unit/experimental/coro/stack_test.cpp
+@HAVE_COROUTINES_TRUE@@HAVE_CXX20_TRUE@unit_experimental_coro_use_coro_SOURCES = unit/experimental/coro/use_coro.cpp
+@HAVE_OPENSSL_TRUE@unit_ssl_context_base_SOURCES = unit/ssl/context_base.cpp
+@HAVE_OPENSSL_TRUE@unit_ssl_context_SOURCES = unit/ssl/context.cpp
+@HAVE_OPENSSL_TRUE@unit_ssl_error_SOURCES = unit/ssl/error.cpp
+@HAVE_OPENSSL_TRUE@unit_ssl_stream_base_SOURCES = unit/ssl/stream_base.cpp
+@HAVE_OPENSSL_TRUE@unit_ssl_host_name_verification_SOURCES = unit/ssl/host_name_verification.cpp
+@HAVE_OPENSSL_TRUE@unit_ssl_rfc2818_verification_SOURCES = unit/ssl/rfc2818_verification.cpp
+@HAVE_OPENSSL_TRUE@unit_ssl_stream_SOURCES = unit/ssl/stream.cpp
+EXTRA_DIST = \
+ latency/allocator.hpp \
+ performance/handler_allocator.hpp \
+ unit/archetypes/async_ops.hpp \
+ unit/archetypes/async_result.hpp \
+ unit/archetypes/gettable_socket_option.hpp \
+ unit/archetypes/io_control_command.hpp \
+ unit/archetypes/settable_socket_option.hpp
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
+
+all: all-recursive
+
+.SUFFIXES:
+.SUFFIXES: .cpp .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/tests/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/tests/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS)
+
+clean-noinstPROGRAMS:
+ -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+../$(am__dirstamp):
+ @$(MKDIR_P) ..
+ @: > ../$(am__dirstamp)
+../$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) ../$(DEPDIR)
+ @: > ../$(DEPDIR)/$(am__dirstamp)
+../asio.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp)
+../asio_ssl.$(OBJEXT): ../$(am__dirstamp) ../$(DEPDIR)/$(am__dirstamp)
+
+libasio.a: $(libasio_a_OBJECTS) $(libasio_a_DEPENDENCIES) $(EXTRA_libasio_a_DEPENDENCIES)
+ $(AM_V_at)-rm -f libasio.a
+ $(AM_V_AR)$(libasio_a_AR) libasio.a $(libasio_a_OBJECTS) $(libasio_a_LIBADD)
+ $(AM_V_at)$(RANLIB) libasio.a
+latency/$(am__dirstamp):
+ @$(MKDIR_P) latency
+ @: > latency/$(am__dirstamp)
+latency/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) latency/$(DEPDIR)
+ @: > latency/$(DEPDIR)/$(am__dirstamp)
+latency/tcp_client.$(OBJEXT): latency/$(am__dirstamp) \
+ latency/$(DEPDIR)/$(am__dirstamp)
+
+latency/tcp_client$(EXEEXT): $(latency_tcp_client_OBJECTS) $(latency_tcp_client_DEPENDENCIES) $(EXTRA_latency_tcp_client_DEPENDENCIES) latency/$(am__dirstamp)
+ @rm -f latency/tcp_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(latency_tcp_client_OBJECTS) $(latency_tcp_client_LDADD) $(LIBS)
+latency/tcp_server.$(OBJEXT): latency/$(am__dirstamp) \
+ latency/$(DEPDIR)/$(am__dirstamp)
+
+latency/tcp_server$(EXEEXT): $(latency_tcp_server_OBJECTS) $(latency_tcp_server_DEPENDENCIES) $(EXTRA_latency_tcp_server_DEPENDENCIES) latency/$(am__dirstamp)
+ @rm -f latency/tcp_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(latency_tcp_server_OBJECTS) $(latency_tcp_server_LDADD) $(LIBS)
+latency/udp_client.$(OBJEXT): latency/$(am__dirstamp) \
+ latency/$(DEPDIR)/$(am__dirstamp)
+
+latency/udp_client$(EXEEXT): $(latency_udp_client_OBJECTS) $(latency_udp_client_DEPENDENCIES) $(EXTRA_latency_udp_client_DEPENDENCIES) latency/$(am__dirstamp)
+ @rm -f latency/udp_client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(latency_udp_client_OBJECTS) $(latency_udp_client_LDADD) $(LIBS)
+latency/udp_server.$(OBJEXT): latency/$(am__dirstamp) \
+ latency/$(DEPDIR)/$(am__dirstamp)
+
+latency/udp_server$(EXEEXT): $(latency_udp_server_OBJECTS) $(latency_udp_server_DEPENDENCIES) $(EXTRA_latency_udp_server_DEPENDENCIES) latency/$(am__dirstamp)
+ @rm -f latency/udp_server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(latency_udp_server_OBJECTS) $(latency_udp_server_LDADD) $(LIBS)
+performance/$(am__dirstamp):
+ @$(MKDIR_P) performance
+ @: > performance/$(am__dirstamp)
+performance/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) performance/$(DEPDIR)
+ @: > performance/$(DEPDIR)/$(am__dirstamp)
+performance/client.$(OBJEXT): performance/$(am__dirstamp) \
+ performance/$(DEPDIR)/$(am__dirstamp)
+
+performance/client$(EXEEXT): $(performance_client_OBJECTS) $(performance_client_DEPENDENCIES) $(EXTRA_performance_client_DEPENDENCIES) performance/$(am__dirstamp)
+ @rm -f performance/client$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(performance_client_OBJECTS) $(performance_client_LDADD) $(LIBS)
+performance/server.$(OBJEXT): performance/$(am__dirstamp) \
+ performance/$(DEPDIR)/$(am__dirstamp)
+
+performance/server$(EXEEXT): $(performance_server_OBJECTS) $(performance_server_DEPENDENCIES) $(EXTRA_performance_server_DEPENDENCIES) performance/$(am__dirstamp)
+ @rm -f performance/server$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(performance_server_OBJECTS) $(performance_server_LDADD) $(LIBS)
+unit/$(am__dirstamp):
+ @$(MKDIR_P) unit
+ @: > unit/$(am__dirstamp)
+unit/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unit/$(DEPDIR)
+ @: > unit/$(DEPDIR)/$(am__dirstamp)
+unit/any_completion_executor.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/any_completion_executor$(EXEEXT): $(unit_any_completion_executor_OBJECTS) $(unit_any_completion_executor_DEPENDENCIES) $(EXTRA_unit_any_completion_executor_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/any_completion_executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_any_completion_executor_OBJECTS) $(unit_any_completion_executor_LDADD) $(LIBS)
+unit/any_completion_handler.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/any_completion_handler$(EXEEXT): $(unit_any_completion_handler_OBJECTS) $(unit_any_completion_handler_DEPENDENCIES) $(EXTRA_unit_any_completion_handler_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/any_completion_handler$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_any_completion_handler_OBJECTS) $(unit_any_completion_handler_LDADD) $(LIBS)
+unit/any_io_executor.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/any_io_executor$(EXEEXT): $(unit_any_io_executor_OBJECTS) $(unit_any_io_executor_DEPENDENCIES) $(EXTRA_unit_any_io_executor_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/any_io_executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_any_io_executor_OBJECTS) $(unit_any_io_executor_LDADD) $(LIBS)
+unit/append.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/append$(EXEEXT): $(unit_append_OBJECTS) $(unit_append_DEPENDENCIES) $(EXTRA_unit_append_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/append$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_append_OBJECTS) $(unit_append_LDADD) $(LIBS)
+unit/as_tuple.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/as_tuple$(EXEEXT): $(unit_as_tuple_OBJECTS) $(unit_as_tuple_DEPENDENCIES) $(EXTRA_unit_as_tuple_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/as_tuple$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_as_tuple_OBJECTS) $(unit_as_tuple_LDADD) $(LIBS)
+unit/associated_allocator.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/associated_allocator$(EXEEXT): $(unit_associated_allocator_OBJECTS) $(unit_associated_allocator_DEPENDENCIES) $(EXTRA_unit_associated_allocator_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/associated_allocator$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_associated_allocator_OBJECTS) $(unit_associated_allocator_LDADD) $(LIBS)
+unit/associated_cancellation_slot.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/associated_cancellation_slot$(EXEEXT): $(unit_associated_cancellation_slot_OBJECTS) $(unit_associated_cancellation_slot_DEPENDENCIES) $(EXTRA_unit_associated_cancellation_slot_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/associated_cancellation_slot$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_associated_cancellation_slot_OBJECTS) $(unit_associated_cancellation_slot_LDADD) $(LIBS)
+unit/associated_executor.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/associated_executor$(EXEEXT): $(unit_associated_executor_OBJECTS) $(unit_associated_executor_DEPENDENCIES) $(EXTRA_unit_associated_executor_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/associated_executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_associated_executor_OBJECTS) $(unit_associated_executor_LDADD) $(LIBS)
+unit/associated_immediate_executor.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/associated_immediate_executor$(EXEEXT): $(unit_associated_immediate_executor_OBJECTS) $(unit_associated_immediate_executor_DEPENDENCIES) $(EXTRA_unit_associated_immediate_executor_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/associated_immediate_executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_associated_immediate_executor_OBJECTS) $(unit_associated_immediate_executor_LDADD) $(LIBS)
+unit/associator.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/associator$(EXEEXT): $(unit_associator_OBJECTS) $(unit_associator_DEPENDENCIES) $(EXTRA_unit_associator_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/associator$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_associator_OBJECTS) $(unit_associator_LDADD) $(LIBS)
+unit/async_result.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/async_result$(EXEEXT): $(unit_async_result_OBJECTS) $(unit_async_result_DEPENDENCIES) $(EXTRA_unit_async_result_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/async_result$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_async_result_OBJECTS) $(unit_async_result_LDADD) $(LIBS)
+unit/awaitable.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/awaitable$(EXEEXT): $(unit_awaitable_OBJECTS) $(unit_awaitable_DEPENDENCIES) $(EXTRA_unit_awaitable_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/awaitable$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_awaitable_OBJECTS) $(unit_awaitable_LDADD) $(LIBS)
+unit/basic_datagram_socket.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_datagram_socket$(EXEEXT): $(unit_basic_datagram_socket_OBJECTS) $(unit_basic_datagram_socket_DEPENDENCIES) $(EXTRA_unit_basic_datagram_socket_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_datagram_socket$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_datagram_socket_OBJECTS) $(unit_basic_datagram_socket_LDADD) $(LIBS)
+unit/basic_deadline_timer.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_deadline_timer$(EXEEXT): $(unit_basic_deadline_timer_OBJECTS) $(unit_basic_deadline_timer_DEPENDENCIES) $(EXTRA_unit_basic_deadline_timer_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_deadline_timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_deadline_timer_OBJECTS) $(unit_basic_deadline_timer_LDADD) $(LIBS)
+unit/basic_file.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_file$(EXEEXT): $(unit_basic_file_OBJECTS) $(unit_basic_file_DEPENDENCIES) $(EXTRA_unit_basic_file_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_file$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_file_OBJECTS) $(unit_basic_file_LDADD) $(LIBS)
+unit/basic_random_access_file.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_random_access_file$(EXEEXT): $(unit_basic_random_access_file_OBJECTS) $(unit_basic_random_access_file_DEPENDENCIES) $(EXTRA_unit_basic_random_access_file_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_random_access_file$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_random_access_file_OBJECTS) $(unit_basic_random_access_file_LDADD) $(LIBS)
+unit/basic_raw_socket.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_raw_socket$(EXEEXT): $(unit_basic_raw_socket_OBJECTS) $(unit_basic_raw_socket_DEPENDENCIES) $(EXTRA_unit_basic_raw_socket_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_raw_socket$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_raw_socket_OBJECTS) $(unit_basic_raw_socket_LDADD) $(LIBS)
+unit/basic_readable_pipe.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_readable_pipe$(EXEEXT): $(unit_basic_readable_pipe_OBJECTS) $(unit_basic_readable_pipe_DEPENDENCIES) $(EXTRA_unit_basic_readable_pipe_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_readable_pipe$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_readable_pipe_OBJECTS) $(unit_basic_readable_pipe_LDADD) $(LIBS)
+unit/basic_seq_packet_socket.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_seq_packet_socket$(EXEEXT): $(unit_basic_seq_packet_socket_OBJECTS) $(unit_basic_seq_packet_socket_DEPENDENCIES) $(EXTRA_unit_basic_seq_packet_socket_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_seq_packet_socket$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_seq_packet_socket_OBJECTS) $(unit_basic_seq_packet_socket_LDADD) $(LIBS)
+unit/basic_serial_port.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_serial_port$(EXEEXT): $(unit_basic_serial_port_OBJECTS) $(unit_basic_serial_port_DEPENDENCIES) $(EXTRA_unit_basic_serial_port_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_serial_port$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_serial_port_OBJECTS) $(unit_basic_serial_port_LDADD) $(LIBS)
+unit/basic_signal_set.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_signal_set$(EXEEXT): $(unit_basic_signal_set_OBJECTS) $(unit_basic_signal_set_DEPENDENCIES) $(EXTRA_unit_basic_signal_set_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_signal_set$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_signal_set_OBJECTS) $(unit_basic_signal_set_LDADD) $(LIBS)
+unit/basic_socket.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_socket$(EXEEXT): $(unit_basic_socket_OBJECTS) $(unit_basic_socket_DEPENDENCIES) $(EXTRA_unit_basic_socket_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_socket$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_socket_OBJECTS) $(unit_basic_socket_LDADD) $(LIBS)
+unit/basic_socket_acceptor.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_socket_acceptor$(EXEEXT): $(unit_basic_socket_acceptor_OBJECTS) $(unit_basic_socket_acceptor_DEPENDENCIES) $(EXTRA_unit_basic_socket_acceptor_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_socket_acceptor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_socket_acceptor_OBJECTS) $(unit_basic_socket_acceptor_LDADD) $(LIBS)
+unit/basic_stream_file.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_stream_file$(EXEEXT): $(unit_basic_stream_file_OBJECTS) $(unit_basic_stream_file_DEPENDENCIES) $(EXTRA_unit_basic_stream_file_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_stream_file$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_stream_file_OBJECTS) $(unit_basic_stream_file_LDADD) $(LIBS)
+unit/basic_stream_socket.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_stream_socket$(EXEEXT): $(unit_basic_stream_socket_OBJECTS) $(unit_basic_stream_socket_DEPENDENCIES) $(EXTRA_unit_basic_stream_socket_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_stream_socket$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_stream_socket_OBJECTS) $(unit_basic_stream_socket_LDADD) $(LIBS)
+unit/basic_streambuf.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_streambuf$(EXEEXT): $(unit_basic_streambuf_OBJECTS) $(unit_basic_streambuf_DEPENDENCIES) $(EXTRA_unit_basic_streambuf_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_streambuf$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_streambuf_OBJECTS) $(unit_basic_streambuf_LDADD) $(LIBS)
+unit/basic_waitable_timer.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_waitable_timer$(EXEEXT): $(unit_basic_waitable_timer_OBJECTS) $(unit_basic_waitable_timer_DEPENDENCIES) $(EXTRA_unit_basic_waitable_timer_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_waitable_timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_waitable_timer_OBJECTS) $(unit_basic_waitable_timer_LDADD) $(LIBS)
+unit/basic_writable_pipe.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/basic_writable_pipe$(EXEEXT): $(unit_basic_writable_pipe_OBJECTS) $(unit_basic_writable_pipe_DEPENDENCIES) $(EXTRA_unit_basic_writable_pipe_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/basic_writable_pipe$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_basic_writable_pipe_OBJECTS) $(unit_basic_writable_pipe_LDADD) $(LIBS)
+unit/bind_allocator.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/bind_allocator$(EXEEXT): $(unit_bind_allocator_OBJECTS) $(unit_bind_allocator_DEPENDENCIES) $(EXTRA_unit_bind_allocator_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/bind_allocator$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_bind_allocator_OBJECTS) $(unit_bind_allocator_LDADD) $(LIBS)
+unit/bind_cancellation_slot.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/bind_cancellation_slot$(EXEEXT): $(unit_bind_cancellation_slot_OBJECTS) $(unit_bind_cancellation_slot_DEPENDENCIES) $(EXTRA_unit_bind_cancellation_slot_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/bind_cancellation_slot$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_bind_cancellation_slot_OBJECTS) $(unit_bind_cancellation_slot_LDADD) $(LIBS)
+unit/bind_executor.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/bind_executor$(EXEEXT): $(unit_bind_executor_OBJECTS) $(unit_bind_executor_DEPENDENCIES) $(EXTRA_unit_bind_executor_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/bind_executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_bind_executor_OBJECTS) $(unit_bind_executor_LDADD) $(LIBS)
+unit/bind_immediate_executor.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/bind_immediate_executor$(EXEEXT): $(unit_bind_immediate_executor_OBJECTS) $(unit_bind_immediate_executor_DEPENDENCIES) $(EXTRA_unit_bind_immediate_executor_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/bind_immediate_executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_bind_immediate_executor_OBJECTS) $(unit_bind_immediate_executor_LDADD) $(LIBS)
+unit/buffer.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/buffer$(EXEEXT): $(unit_buffer_OBJECTS) $(unit_buffer_DEPENDENCIES) $(EXTRA_unit_buffer_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/buffer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_buffer_OBJECTS) $(unit_buffer_LDADD) $(LIBS)
+unit/buffer_registration.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/buffer_registration$(EXEEXT): $(unit_buffer_registration_OBJECTS) $(unit_buffer_registration_DEPENDENCIES) $(EXTRA_unit_buffer_registration_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/buffer_registration$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_buffer_registration_OBJECTS) $(unit_buffer_registration_LDADD) $(LIBS)
+unit/buffered_read_stream.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/buffered_read_stream$(EXEEXT): $(unit_buffered_read_stream_OBJECTS) $(unit_buffered_read_stream_DEPENDENCIES) $(EXTRA_unit_buffered_read_stream_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/buffered_read_stream$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_buffered_read_stream_OBJECTS) $(unit_buffered_read_stream_LDADD) $(LIBS)
+unit/buffered_stream.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/buffered_stream$(EXEEXT): $(unit_buffered_stream_OBJECTS) $(unit_buffered_stream_DEPENDENCIES) $(EXTRA_unit_buffered_stream_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/buffered_stream$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_buffered_stream_OBJECTS) $(unit_buffered_stream_LDADD) $(LIBS)
+unit/buffered_write_stream.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/buffered_write_stream$(EXEEXT): $(unit_buffered_write_stream_OBJECTS) $(unit_buffered_write_stream_DEPENDENCIES) $(EXTRA_unit_buffered_write_stream_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/buffered_write_stream$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_buffered_write_stream_OBJECTS) $(unit_buffered_write_stream_LDADD) $(LIBS)
+unit/buffers_iterator.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/buffers_iterator$(EXEEXT): $(unit_buffers_iterator_OBJECTS) $(unit_buffers_iterator_DEPENDENCIES) $(EXTRA_unit_buffers_iterator_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/buffers_iterator$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_buffers_iterator_OBJECTS) $(unit_buffers_iterator_LDADD) $(LIBS)
+unit/cancellation_signal.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/cancellation_signal$(EXEEXT): $(unit_cancellation_signal_OBJECTS) $(unit_cancellation_signal_DEPENDENCIES) $(EXTRA_unit_cancellation_signal_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/cancellation_signal$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_cancellation_signal_OBJECTS) $(unit_cancellation_signal_LDADD) $(LIBS)
+unit/cancellation_state.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/cancellation_state$(EXEEXT): $(unit_cancellation_state_OBJECTS) $(unit_cancellation_state_DEPENDENCIES) $(EXTRA_unit_cancellation_state_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/cancellation_state$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_cancellation_state_OBJECTS) $(unit_cancellation_state_LDADD) $(LIBS)
+unit/cancellation_type.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/cancellation_type$(EXEEXT): $(unit_cancellation_type_OBJECTS) $(unit_cancellation_type_DEPENDENCIES) $(EXTRA_unit_cancellation_type_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/cancellation_type$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_cancellation_type_OBJECTS) $(unit_cancellation_type_LDADD) $(LIBS)
+unit/co_spawn.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/co_spawn$(EXEEXT): $(unit_co_spawn_OBJECTS) $(unit_co_spawn_DEPENDENCIES) $(EXTRA_unit_co_spawn_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/co_spawn$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_co_spawn_OBJECTS) $(unit_co_spawn_LDADD) $(LIBS)
+unit/completion_condition.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/completion_condition$(EXEEXT): $(unit_completion_condition_OBJECTS) $(unit_completion_condition_DEPENDENCIES) $(EXTRA_unit_completion_condition_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/completion_condition$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_completion_condition_OBJECTS) $(unit_completion_condition_LDADD) $(LIBS)
+unit/compose.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/compose$(EXEEXT): $(unit_compose_OBJECTS) $(unit_compose_DEPENDENCIES) $(EXTRA_unit_compose_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/compose$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_compose_OBJECTS) $(unit_compose_LDADD) $(LIBS)
+unit/connect.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/connect$(EXEEXT): $(unit_connect_OBJECTS) $(unit_connect_DEPENDENCIES) $(EXTRA_unit_connect_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/connect$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_connect_OBJECTS) $(unit_connect_LDADD) $(LIBS)
+unit/connect_pipe.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/connect_pipe$(EXEEXT): $(unit_connect_pipe_OBJECTS) $(unit_connect_pipe_DEPENDENCIES) $(EXTRA_unit_connect_pipe_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/connect_pipe$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_connect_pipe_OBJECTS) $(unit_connect_pipe_LDADD) $(LIBS)
+unit/consign.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/consign$(EXEEXT): $(unit_consign_OBJECTS) $(unit_consign_DEPENDENCIES) $(EXTRA_unit_consign_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/consign$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_consign_OBJECTS) $(unit_consign_LDADD) $(LIBS)
+unit/coroutine.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/coroutine$(EXEEXT): $(unit_coroutine_OBJECTS) $(unit_coroutine_DEPENDENCIES) $(EXTRA_unit_coroutine_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/coroutine$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_coroutine_OBJECTS) $(unit_coroutine_LDADD) $(LIBS)
+unit/deadline_timer.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/deadline_timer$(EXEEXT): $(unit_deadline_timer_OBJECTS) $(unit_deadline_timer_DEPENDENCIES) $(EXTRA_unit_deadline_timer_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/deadline_timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_deadline_timer_OBJECTS) $(unit_deadline_timer_LDADD) $(LIBS)
+unit/defer.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/defer$(EXEEXT): $(unit_defer_OBJECTS) $(unit_defer_DEPENDENCIES) $(EXTRA_unit_defer_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/defer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_defer_OBJECTS) $(unit_defer_LDADD) $(LIBS)
+unit/deferred.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/deferred$(EXEEXT): $(unit_deferred_OBJECTS) $(unit_deferred_DEPENDENCIES) $(EXTRA_unit_deferred_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/deferred$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_deferred_OBJECTS) $(unit_deferred_LDADD) $(LIBS)
+unit/detached.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/detached$(EXEEXT): $(unit_detached_OBJECTS) $(unit_detached_DEPENDENCIES) $(EXTRA_unit_detached_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/detached$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_detached_OBJECTS) $(unit_detached_LDADD) $(LIBS)
+unit/dispatch.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/dispatch$(EXEEXT): $(unit_dispatch_OBJECTS) $(unit_dispatch_DEPENDENCIES) $(EXTRA_unit_dispatch_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/dispatch$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_dispatch_OBJECTS) $(unit_dispatch_LDADD) $(LIBS)
+unit/error.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/error$(EXEEXT): $(unit_error_OBJECTS) $(unit_error_DEPENDENCIES) $(EXTRA_unit_error_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/error$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_error_OBJECTS) $(unit_error_LDADD) $(LIBS)
+unit/execution/$(am__dirstamp):
+ @$(MKDIR_P) unit/execution
+ @: > unit/execution/$(am__dirstamp)
+unit/execution/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unit/execution/$(DEPDIR)
+ @: > unit/execution/$(DEPDIR)/$(am__dirstamp)
+unit/execution/any_executor.$(OBJEXT): unit/execution/$(am__dirstamp) \
+ unit/execution/$(DEPDIR)/$(am__dirstamp)
+
+unit/execution/any_executor$(EXEEXT): $(unit_execution_any_executor_OBJECTS) $(unit_execution_any_executor_DEPENDENCIES) $(EXTRA_unit_execution_any_executor_DEPENDENCIES) unit/execution/$(am__dirstamp)
+ @rm -f unit/execution/any_executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_execution_any_executor_OBJECTS) $(unit_execution_any_executor_LDADD) $(LIBS)
+unit/execution/blocking.$(OBJEXT): unit/execution/$(am__dirstamp) \
+ unit/execution/$(DEPDIR)/$(am__dirstamp)
+
+unit/execution/blocking$(EXEEXT): $(unit_execution_blocking_OBJECTS) $(unit_execution_blocking_DEPENDENCIES) $(EXTRA_unit_execution_blocking_DEPENDENCIES) unit/execution/$(am__dirstamp)
+ @rm -f unit/execution/blocking$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_execution_blocking_OBJECTS) $(unit_execution_blocking_LDADD) $(LIBS)
+unit/execution/blocking_adaptation.$(OBJEXT): \
+ unit/execution/$(am__dirstamp) \
+ unit/execution/$(DEPDIR)/$(am__dirstamp)
+
+unit/execution/blocking_adaptation$(EXEEXT): $(unit_execution_blocking_adaptation_OBJECTS) $(unit_execution_blocking_adaptation_DEPENDENCIES) $(EXTRA_unit_execution_blocking_adaptation_DEPENDENCIES) unit/execution/$(am__dirstamp)
+ @rm -f unit/execution/blocking_adaptation$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_execution_blocking_adaptation_OBJECTS) $(unit_execution_blocking_adaptation_LDADD) $(LIBS)
+unit/execution/context_as.$(OBJEXT): unit/execution/$(am__dirstamp) \
+ unit/execution/$(DEPDIR)/$(am__dirstamp)
+
+unit/execution/context_as$(EXEEXT): $(unit_execution_context_as_OBJECTS) $(unit_execution_context_as_DEPENDENCIES) $(EXTRA_unit_execution_context_as_DEPENDENCIES) unit/execution/$(am__dirstamp)
+ @rm -f unit/execution/context_as$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_execution_context_as_OBJECTS) $(unit_execution_context_as_LDADD) $(LIBS)
+unit/execution/executor.$(OBJEXT): unit/execution/$(am__dirstamp) \
+ unit/execution/$(DEPDIR)/$(am__dirstamp)
+
+unit/execution/executor$(EXEEXT): $(unit_execution_executor_OBJECTS) $(unit_execution_executor_DEPENDENCIES) $(EXTRA_unit_execution_executor_DEPENDENCIES) unit/execution/$(am__dirstamp)
+ @rm -f unit/execution/executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_execution_executor_OBJECTS) $(unit_execution_executor_LDADD) $(LIBS)
+unit/execution/invocable_archetype.$(OBJEXT): \
+ unit/execution/$(am__dirstamp) \
+ unit/execution/$(DEPDIR)/$(am__dirstamp)
+
+unit/execution/invocable_archetype$(EXEEXT): $(unit_execution_invocable_archetype_OBJECTS) $(unit_execution_invocable_archetype_DEPENDENCIES) $(EXTRA_unit_execution_invocable_archetype_DEPENDENCIES) unit/execution/$(am__dirstamp)
+ @rm -f unit/execution/invocable_archetype$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_execution_invocable_archetype_OBJECTS) $(unit_execution_invocable_archetype_LDADD) $(LIBS)
+unit/execution/mapping.$(OBJEXT): unit/execution/$(am__dirstamp) \
+ unit/execution/$(DEPDIR)/$(am__dirstamp)
+
+unit/execution/mapping$(EXEEXT): $(unit_execution_mapping_OBJECTS) $(unit_execution_mapping_DEPENDENCIES) $(EXTRA_unit_execution_mapping_DEPENDENCIES) unit/execution/$(am__dirstamp)
+ @rm -f unit/execution/mapping$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_execution_mapping_OBJECTS) $(unit_execution_mapping_LDADD) $(LIBS)
+unit/execution/outstanding_work.$(OBJEXT): \
+ unit/execution/$(am__dirstamp) \
+ unit/execution/$(DEPDIR)/$(am__dirstamp)
+
+unit/execution/outstanding_work$(EXEEXT): $(unit_execution_outstanding_work_OBJECTS) $(unit_execution_outstanding_work_DEPENDENCIES) $(EXTRA_unit_execution_outstanding_work_DEPENDENCIES) unit/execution/$(am__dirstamp)
+ @rm -f unit/execution/outstanding_work$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_execution_outstanding_work_OBJECTS) $(unit_execution_outstanding_work_LDADD) $(LIBS)
+unit/execution/prefer_only.$(OBJEXT): unit/execution/$(am__dirstamp) \
+ unit/execution/$(DEPDIR)/$(am__dirstamp)
+
+unit/execution/prefer_only$(EXEEXT): $(unit_execution_prefer_only_OBJECTS) $(unit_execution_prefer_only_DEPENDENCIES) $(EXTRA_unit_execution_prefer_only_DEPENDENCIES) unit/execution/$(am__dirstamp)
+ @rm -f unit/execution/prefer_only$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_execution_prefer_only_OBJECTS) $(unit_execution_prefer_only_LDADD) $(LIBS)
+unit/execution/relationship.$(OBJEXT): unit/execution/$(am__dirstamp) \
+ unit/execution/$(DEPDIR)/$(am__dirstamp)
+
+unit/execution/relationship$(EXEEXT): $(unit_execution_relationship_OBJECTS) $(unit_execution_relationship_DEPENDENCIES) $(EXTRA_unit_execution_relationship_DEPENDENCIES) unit/execution/$(am__dirstamp)
+ @rm -f unit/execution/relationship$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_execution_relationship_OBJECTS) $(unit_execution_relationship_LDADD) $(LIBS)
+unit/execution_context.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/execution_context$(EXEEXT): $(unit_execution_context_OBJECTS) $(unit_execution_context_DEPENDENCIES) $(EXTRA_unit_execution_context_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/execution_context$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_execution_context_OBJECTS) $(unit_execution_context_LDADD) $(LIBS)
+unit/executor.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/executor$(EXEEXT): $(unit_executor_OBJECTS) $(unit_executor_DEPENDENCIES) $(EXTRA_unit_executor_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_executor_OBJECTS) $(unit_executor_LDADD) $(LIBS)
+unit/executor_work_guard.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/executor_work_guard$(EXEEXT): $(unit_executor_work_guard_OBJECTS) $(unit_executor_work_guard_DEPENDENCIES) $(EXTRA_unit_executor_work_guard_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/executor_work_guard$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_executor_work_guard_OBJECTS) $(unit_executor_work_guard_LDADD) $(LIBS)
+unit/experimental/$(am__dirstamp):
+ @$(MKDIR_P) unit/experimental
+ @: > unit/experimental/$(am__dirstamp)
+unit/experimental/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unit/experimental/$(DEPDIR)
+ @: > unit/experimental/$(DEPDIR)/$(am__dirstamp)
+unit/experimental/awaitable_operators.$(OBJEXT): \
+ unit/experimental/$(am__dirstamp) \
+ unit/experimental/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/awaitable_operators$(EXEEXT): $(unit_experimental_awaitable_operators_OBJECTS) $(unit_experimental_awaitable_operators_DEPENDENCIES) $(EXTRA_unit_experimental_awaitable_operators_DEPENDENCIES) unit/experimental/$(am__dirstamp)
+ @rm -f unit/experimental/awaitable_operators$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_awaitable_operators_OBJECTS) $(unit_experimental_awaitable_operators_LDADD) $(LIBS)
+unit/experimental/basic_channel.$(OBJEXT): \
+ unit/experimental/$(am__dirstamp) \
+ unit/experimental/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/basic_channel$(EXEEXT): $(unit_experimental_basic_channel_OBJECTS) $(unit_experimental_basic_channel_DEPENDENCIES) $(EXTRA_unit_experimental_basic_channel_DEPENDENCIES) unit/experimental/$(am__dirstamp)
+ @rm -f unit/experimental/basic_channel$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_basic_channel_OBJECTS) $(unit_experimental_basic_channel_LDADD) $(LIBS)
+unit/experimental/basic_concurrent_channel.$(OBJEXT): \
+ unit/experimental/$(am__dirstamp) \
+ unit/experimental/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/basic_concurrent_channel$(EXEEXT): $(unit_experimental_basic_concurrent_channel_OBJECTS) $(unit_experimental_basic_concurrent_channel_DEPENDENCIES) $(EXTRA_unit_experimental_basic_concurrent_channel_DEPENDENCIES) unit/experimental/$(am__dirstamp)
+ @rm -f unit/experimental/basic_concurrent_channel$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_basic_concurrent_channel_OBJECTS) $(unit_experimental_basic_concurrent_channel_LDADD) $(LIBS)
+unit/experimental/channel.$(OBJEXT): \
+ unit/experimental/$(am__dirstamp) \
+ unit/experimental/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/channel$(EXEEXT): $(unit_experimental_channel_OBJECTS) $(unit_experimental_channel_DEPENDENCIES) $(EXTRA_unit_experimental_channel_DEPENDENCIES) unit/experimental/$(am__dirstamp)
+ @rm -f unit/experimental/channel$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_channel_OBJECTS) $(unit_experimental_channel_LDADD) $(LIBS)
+unit/experimental/channel_traits.$(OBJEXT): \
+ unit/experimental/$(am__dirstamp) \
+ unit/experimental/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/channel_traits$(EXEEXT): $(unit_experimental_channel_traits_OBJECTS) $(unit_experimental_channel_traits_DEPENDENCIES) $(EXTRA_unit_experimental_channel_traits_DEPENDENCIES) unit/experimental/$(am__dirstamp)
+ @rm -f unit/experimental/channel_traits$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_channel_traits_OBJECTS) $(unit_experimental_channel_traits_LDADD) $(LIBS)
+unit/experimental/co_composed.$(OBJEXT): \
+ unit/experimental/$(am__dirstamp) \
+ unit/experimental/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/co_composed$(EXEEXT): $(unit_experimental_co_composed_OBJECTS) $(unit_experimental_co_composed_DEPENDENCIES) $(EXTRA_unit_experimental_co_composed_DEPENDENCIES) unit/experimental/$(am__dirstamp)
+ @rm -f unit/experimental/co_composed$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_co_composed_OBJECTS) $(unit_experimental_co_composed_LDADD) $(LIBS)
+unit/experimental/concurrent_channel.$(OBJEXT): \
+ unit/experimental/$(am__dirstamp) \
+ unit/experimental/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/concurrent_channel$(EXEEXT): $(unit_experimental_concurrent_channel_OBJECTS) $(unit_experimental_concurrent_channel_DEPENDENCIES) $(EXTRA_unit_experimental_concurrent_channel_DEPENDENCIES) unit/experimental/$(am__dirstamp)
+ @rm -f unit/experimental/concurrent_channel$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_concurrent_channel_OBJECTS) $(unit_experimental_concurrent_channel_LDADD) $(LIBS)
+unit/experimental/coro/$(am__dirstamp):
+ @$(MKDIR_P) unit/experimental/coro
+ @: > unit/experimental/coro/$(am__dirstamp)
+unit/experimental/coro/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unit/experimental/coro/$(DEPDIR)
+ @: > unit/experimental/coro/$(DEPDIR)/$(am__dirstamp)
+unit/experimental/coro/allocator.$(OBJEXT): \
+ unit/experimental/coro/$(am__dirstamp) \
+ unit/experimental/coro/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/coro/allocator$(EXEEXT): $(unit_experimental_coro_allocator_OBJECTS) $(unit_experimental_coro_allocator_DEPENDENCIES) $(EXTRA_unit_experimental_coro_allocator_DEPENDENCIES) unit/experimental/coro/$(am__dirstamp)
+ @rm -f unit/experimental/coro/allocator$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_coro_allocator_OBJECTS) $(unit_experimental_coro_allocator_LDADD) $(LIBS)
+unit/experimental/coro/cancel.$(OBJEXT): \
+ unit/experimental/coro/$(am__dirstamp) \
+ unit/experimental/coro/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/coro/cancel$(EXEEXT): $(unit_experimental_coro_cancel_OBJECTS) $(unit_experimental_coro_cancel_DEPENDENCIES) $(EXTRA_unit_experimental_coro_cancel_DEPENDENCIES) unit/experimental/coro/$(am__dirstamp)
+ @rm -f unit/experimental/coro/cancel$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_coro_cancel_OBJECTS) $(unit_experimental_coro_cancel_LDADD) $(LIBS)
+unit/experimental/coro/co_spawn.$(OBJEXT): \
+ unit/experimental/coro/$(am__dirstamp) \
+ unit/experimental/coro/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/coro/co_spawn$(EXEEXT): $(unit_experimental_coro_co_spawn_OBJECTS) $(unit_experimental_coro_co_spawn_DEPENDENCIES) $(EXTRA_unit_experimental_coro_co_spawn_DEPENDENCIES) unit/experimental/coro/$(am__dirstamp)
+ @rm -f unit/experimental/coro/co_spawn$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_coro_co_spawn_OBJECTS) $(unit_experimental_coro_co_spawn_LDADD) $(LIBS)
+unit/experimental/coro/exception.$(OBJEXT): \
+ unit/experimental/coro/$(am__dirstamp) \
+ unit/experimental/coro/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/coro/exception$(EXEEXT): $(unit_experimental_coro_exception_OBJECTS) $(unit_experimental_coro_exception_DEPENDENCIES) $(EXTRA_unit_experimental_coro_exception_DEPENDENCIES) unit/experimental/coro/$(am__dirstamp)
+ @rm -f unit/experimental/coro/exception$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_coro_exception_OBJECTS) $(unit_experimental_coro_exception_LDADD) $(LIBS)
+unit/experimental/coro/executor.$(OBJEXT): \
+ unit/experimental/coro/$(am__dirstamp) \
+ unit/experimental/coro/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/coro/executor$(EXEEXT): $(unit_experimental_coro_executor_OBJECTS) $(unit_experimental_coro_executor_DEPENDENCIES) $(EXTRA_unit_experimental_coro_executor_DEPENDENCIES) unit/experimental/coro/$(am__dirstamp)
+ @rm -f unit/experimental/coro/executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_coro_executor_OBJECTS) $(unit_experimental_coro_executor_LDADD) $(LIBS)
+unit/experimental/coro/partial.$(OBJEXT): \
+ unit/experimental/coro/$(am__dirstamp) \
+ unit/experimental/coro/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/coro/partial$(EXEEXT): $(unit_experimental_coro_partial_OBJECTS) $(unit_experimental_coro_partial_DEPENDENCIES) $(EXTRA_unit_experimental_coro_partial_DEPENDENCIES) unit/experimental/coro/$(am__dirstamp)
+ @rm -f unit/experimental/coro/partial$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_coro_partial_OBJECTS) $(unit_experimental_coro_partial_LDADD) $(LIBS)
+unit/experimental/coro/simple_test.$(OBJEXT): \
+ unit/experimental/coro/$(am__dirstamp) \
+ unit/experimental/coro/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/coro/simple_test$(EXEEXT): $(unit_experimental_coro_simple_test_OBJECTS) $(unit_experimental_coro_simple_test_DEPENDENCIES) $(EXTRA_unit_experimental_coro_simple_test_DEPENDENCIES) unit/experimental/coro/$(am__dirstamp)
+ @rm -f unit/experimental/coro/simple_test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_coro_simple_test_OBJECTS) $(unit_experimental_coro_simple_test_LDADD) $(LIBS)
+unit/experimental/coro/stack_test.$(OBJEXT): \
+ unit/experimental/coro/$(am__dirstamp) \
+ unit/experimental/coro/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/coro/stack_test$(EXEEXT): $(unit_experimental_coro_stack_test_OBJECTS) $(unit_experimental_coro_stack_test_DEPENDENCIES) $(EXTRA_unit_experimental_coro_stack_test_DEPENDENCIES) unit/experimental/coro/$(am__dirstamp)
+ @rm -f unit/experimental/coro/stack_test$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_coro_stack_test_OBJECTS) $(unit_experimental_coro_stack_test_LDADD) $(LIBS)
+unit/experimental/coro/use_coro.$(OBJEXT): \
+ unit/experimental/coro/$(am__dirstamp) \
+ unit/experimental/coro/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/coro/use_coro$(EXEEXT): $(unit_experimental_coro_use_coro_OBJECTS) $(unit_experimental_coro_use_coro_DEPENDENCIES) $(EXTRA_unit_experimental_coro_use_coro_DEPENDENCIES) unit/experimental/coro/$(am__dirstamp)
+ @rm -f unit/experimental/coro/use_coro$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_coro_use_coro_OBJECTS) $(unit_experimental_coro_use_coro_LDADD) $(LIBS)
+unit/experimental/parallel_group.$(OBJEXT): \
+ unit/experimental/$(am__dirstamp) \
+ unit/experimental/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/parallel_group$(EXEEXT): $(unit_experimental_parallel_group_OBJECTS) $(unit_experimental_parallel_group_DEPENDENCIES) $(EXTRA_unit_experimental_parallel_group_DEPENDENCIES) unit/experimental/$(am__dirstamp)
+ @rm -f unit/experimental/parallel_group$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_parallel_group_OBJECTS) $(unit_experimental_parallel_group_LDADD) $(LIBS)
+unit/experimental/promise.$(OBJEXT): \
+ unit/experimental/$(am__dirstamp) \
+ unit/experimental/$(DEPDIR)/$(am__dirstamp)
+
+unit/experimental/promise$(EXEEXT): $(unit_experimental_promise_OBJECTS) $(unit_experimental_promise_DEPENDENCIES) $(EXTRA_unit_experimental_promise_DEPENDENCIES) unit/experimental/$(am__dirstamp)
+ @rm -f unit/experimental/promise$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_experimental_promise_OBJECTS) $(unit_experimental_promise_LDADD) $(LIBS)
+unit/file_base.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/file_base$(EXEEXT): $(unit_file_base_OBJECTS) $(unit_file_base_DEPENDENCIES) $(EXTRA_unit_file_base_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/file_base$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_file_base_OBJECTS) $(unit_file_base_LDADD) $(LIBS)
+unit/generic/$(am__dirstamp):
+ @$(MKDIR_P) unit/generic
+ @: > unit/generic/$(am__dirstamp)
+unit/generic/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unit/generic/$(DEPDIR)
+ @: > unit/generic/$(DEPDIR)/$(am__dirstamp)
+unit/generic/basic_endpoint.$(OBJEXT): unit/generic/$(am__dirstamp) \
+ unit/generic/$(DEPDIR)/$(am__dirstamp)
+
+unit/generic/basic_endpoint$(EXEEXT): $(unit_generic_basic_endpoint_OBJECTS) $(unit_generic_basic_endpoint_DEPENDENCIES) $(EXTRA_unit_generic_basic_endpoint_DEPENDENCIES) unit/generic/$(am__dirstamp)
+ @rm -f unit/generic/basic_endpoint$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_generic_basic_endpoint_OBJECTS) $(unit_generic_basic_endpoint_LDADD) $(LIBS)
+unit/generic/datagram_protocol.$(OBJEXT): \
+ unit/generic/$(am__dirstamp) \
+ unit/generic/$(DEPDIR)/$(am__dirstamp)
+
+unit/generic/datagram_protocol$(EXEEXT): $(unit_generic_datagram_protocol_OBJECTS) $(unit_generic_datagram_protocol_DEPENDENCIES) $(EXTRA_unit_generic_datagram_protocol_DEPENDENCIES) unit/generic/$(am__dirstamp)
+ @rm -f unit/generic/datagram_protocol$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_generic_datagram_protocol_OBJECTS) $(unit_generic_datagram_protocol_LDADD) $(LIBS)
+unit/generic/raw_protocol.$(OBJEXT): unit/generic/$(am__dirstamp) \
+ unit/generic/$(DEPDIR)/$(am__dirstamp)
+
+unit/generic/raw_protocol$(EXEEXT): $(unit_generic_raw_protocol_OBJECTS) $(unit_generic_raw_protocol_DEPENDENCIES) $(EXTRA_unit_generic_raw_protocol_DEPENDENCIES) unit/generic/$(am__dirstamp)
+ @rm -f unit/generic/raw_protocol$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_generic_raw_protocol_OBJECTS) $(unit_generic_raw_protocol_LDADD) $(LIBS)
+unit/generic/seq_packet_protocol.$(OBJEXT): \
+ unit/generic/$(am__dirstamp) \
+ unit/generic/$(DEPDIR)/$(am__dirstamp)
+
+unit/generic/seq_packet_protocol$(EXEEXT): $(unit_generic_seq_packet_protocol_OBJECTS) $(unit_generic_seq_packet_protocol_DEPENDENCIES) $(EXTRA_unit_generic_seq_packet_protocol_DEPENDENCIES) unit/generic/$(am__dirstamp)
+ @rm -f unit/generic/seq_packet_protocol$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_generic_seq_packet_protocol_OBJECTS) $(unit_generic_seq_packet_protocol_LDADD) $(LIBS)
+unit/generic/stream_protocol.$(OBJEXT): unit/generic/$(am__dirstamp) \
+ unit/generic/$(DEPDIR)/$(am__dirstamp)
+
+unit/generic/stream_protocol$(EXEEXT): $(unit_generic_stream_protocol_OBJECTS) $(unit_generic_stream_protocol_DEPENDENCIES) $(EXTRA_unit_generic_stream_protocol_DEPENDENCIES) unit/generic/$(am__dirstamp)
+ @rm -f unit/generic/stream_protocol$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_generic_stream_protocol_OBJECTS) $(unit_generic_stream_protocol_LDADD) $(LIBS)
+unit/high_resolution_timer.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/high_resolution_timer$(EXEEXT): $(unit_high_resolution_timer_OBJECTS) $(unit_high_resolution_timer_DEPENDENCIES) $(EXTRA_unit_high_resolution_timer_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/high_resolution_timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_high_resolution_timer_OBJECTS) $(unit_high_resolution_timer_LDADD) $(LIBS)
+unit/io_context.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/io_context$(EXEEXT): $(unit_io_context_OBJECTS) $(unit_io_context_DEPENDENCIES) $(EXTRA_unit_io_context_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/io_context$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_io_context_OBJECTS) $(unit_io_context_LDADD) $(LIBS)
+unit/io_context_strand.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/io_context_strand$(EXEEXT): $(unit_io_context_strand_OBJECTS) $(unit_io_context_strand_DEPENDENCIES) $(EXTRA_unit_io_context_strand_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/io_context_strand$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_io_context_strand_OBJECTS) $(unit_io_context_strand_LDADD) $(LIBS)
+unit/ip/$(am__dirstamp):
+ @$(MKDIR_P) unit/ip
+ @: > unit/ip/$(am__dirstamp)
+unit/ip/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unit/ip/$(DEPDIR)
+ @: > unit/ip/$(DEPDIR)/$(am__dirstamp)
+unit/ip/address.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/address$(EXEEXT): $(unit_ip_address_OBJECTS) $(unit_ip_address_DEPENDENCIES) $(EXTRA_unit_ip_address_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/address$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_OBJECTS) $(unit_ip_address_LDADD) $(LIBS)
+unit/ip/address_v4.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/address_v4$(EXEEXT): $(unit_ip_address_v4_OBJECTS) $(unit_ip_address_v4_DEPENDENCIES) $(EXTRA_unit_ip_address_v4_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/address_v4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_v4_OBJECTS) $(unit_ip_address_v4_LDADD) $(LIBS)
+unit/ip/address_v4_iterator.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/address_v4_iterator$(EXEEXT): $(unit_ip_address_v4_iterator_OBJECTS) $(unit_ip_address_v4_iterator_DEPENDENCIES) $(EXTRA_unit_ip_address_v4_iterator_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/address_v4_iterator$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_v4_iterator_OBJECTS) $(unit_ip_address_v4_iterator_LDADD) $(LIBS)
+unit/ip/address_v4_range.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/address_v4_range$(EXEEXT): $(unit_ip_address_v4_range_OBJECTS) $(unit_ip_address_v4_range_DEPENDENCIES) $(EXTRA_unit_ip_address_v4_range_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/address_v4_range$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_v4_range_OBJECTS) $(unit_ip_address_v4_range_LDADD) $(LIBS)
+unit/ip/address_v6.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/address_v6$(EXEEXT): $(unit_ip_address_v6_OBJECTS) $(unit_ip_address_v6_DEPENDENCIES) $(EXTRA_unit_ip_address_v6_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/address_v6$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_v6_OBJECTS) $(unit_ip_address_v6_LDADD) $(LIBS)
+unit/ip/address_v6_iterator.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/address_v6_iterator$(EXEEXT): $(unit_ip_address_v6_iterator_OBJECTS) $(unit_ip_address_v6_iterator_DEPENDENCIES) $(EXTRA_unit_ip_address_v6_iterator_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/address_v6_iterator$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_v6_iterator_OBJECTS) $(unit_ip_address_v6_iterator_LDADD) $(LIBS)
+unit/ip/address_v6_range.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/address_v6_range$(EXEEXT): $(unit_ip_address_v6_range_OBJECTS) $(unit_ip_address_v6_range_DEPENDENCIES) $(EXTRA_unit_ip_address_v6_range_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/address_v6_range$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_address_v6_range_OBJECTS) $(unit_ip_address_v6_range_LDADD) $(LIBS)
+unit/ip/basic_endpoint.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/basic_endpoint$(EXEEXT): $(unit_ip_basic_endpoint_OBJECTS) $(unit_ip_basic_endpoint_DEPENDENCIES) $(EXTRA_unit_ip_basic_endpoint_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/basic_endpoint$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_basic_endpoint_OBJECTS) $(unit_ip_basic_endpoint_LDADD) $(LIBS)
+unit/ip/basic_resolver.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/basic_resolver$(EXEEXT): $(unit_ip_basic_resolver_OBJECTS) $(unit_ip_basic_resolver_DEPENDENCIES) $(EXTRA_unit_ip_basic_resolver_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/basic_resolver$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_basic_resolver_OBJECTS) $(unit_ip_basic_resolver_LDADD) $(LIBS)
+unit/ip/basic_resolver_entry.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/basic_resolver_entry$(EXEEXT): $(unit_ip_basic_resolver_entry_OBJECTS) $(unit_ip_basic_resolver_entry_DEPENDENCIES) $(EXTRA_unit_ip_basic_resolver_entry_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/basic_resolver_entry$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_basic_resolver_entry_OBJECTS) $(unit_ip_basic_resolver_entry_LDADD) $(LIBS)
+unit/ip/basic_resolver_iterator.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/basic_resolver_iterator$(EXEEXT): $(unit_ip_basic_resolver_iterator_OBJECTS) $(unit_ip_basic_resolver_iterator_DEPENDENCIES) $(EXTRA_unit_ip_basic_resolver_iterator_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/basic_resolver_iterator$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_basic_resolver_iterator_OBJECTS) $(unit_ip_basic_resolver_iterator_LDADD) $(LIBS)
+unit/ip/basic_resolver_query.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/basic_resolver_query$(EXEEXT): $(unit_ip_basic_resolver_query_OBJECTS) $(unit_ip_basic_resolver_query_DEPENDENCIES) $(EXTRA_unit_ip_basic_resolver_query_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/basic_resolver_query$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_basic_resolver_query_OBJECTS) $(unit_ip_basic_resolver_query_LDADD) $(LIBS)
+unit/ip/host_name.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/host_name$(EXEEXT): $(unit_ip_host_name_OBJECTS) $(unit_ip_host_name_DEPENDENCIES) $(EXTRA_unit_ip_host_name_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/host_name$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_host_name_OBJECTS) $(unit_ip_host_name_LDADD) $(LIBS)
+unit/ip/icmp.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/icmp$(EXEEXT): $(unit_ip_icmp_OBJECTS) $(unit_ip_icmp_DEPENDENCIES) $(EXTRA_unit_ip_icmp_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/icmp$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_icmp_OBJECTS) $(unit_ip_icmp_LDADD) $(LIBS)
+unit/ip/multicast.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/multicast$(EXEEXT): $(unit_ip_multicast_OBJECTS) $(unit_ip_multicast_DEPENDENCIES) $(EXTRA_unit_ip_multicast_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/multicast$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_multicast_OBJECTS) $(unit_ip_multicast_LDADD) $(LIBS)
+unit/ip/network_v4.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/network_v4$(EXEEXT): $(unit_ip_network_v4_OBJECTS) $(unit_ip_network_v4_DEPENDENCIES) $(EXTRA_unit_ip_network_v4_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/network_v4$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_network_v4_OBJECTS) $(unit_ip_network_v4_LDADD) $(LIBS)
+unit/ip/network_v6.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/network_v6$(EXEEXT): $(unit_ip_network_v6_OBJECTS) $(unit_ip_network_v6_DEPENDENCIES) $(EXTRA_unit_ip_network_v6_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/network_v6$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_network_v6_OBJECTS) $(unit_ip_network_v6_LDADD) $(LIBS)
+unit/ip/resolver_query_base.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/resolver_query_base$(EXEEXT): $(unit_ip_resolver_query_base_OBJECTS) $(unit_ip_resolver_query_base_DEPENDENCIES) $(EXTRA_unit_ip_resolver_query_base_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/resolver_query_base$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_resolver_query_base_OBJECTS) $(unit_ip_resolver_query_base_LDADD) $(LIBS)
+unit/ip/tcp.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/tcp$(EXEEXT): $(unit_ip_tcp_OBJECTS) $(unit_ip_tcp_DEPENDENCIES) $(EXTRA_unit_ip_tcp_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/tcp$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_tcp_OBJECTS) $(unit_ip_tcp_LDADD) $(LIBS)
+unit/ip/udp.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/udp$(EXEEXT): $(unit_ip_udp_OBJECTS) $(unit_ip_udp_DEPENDENCIES) $(EXTRA_unit_ip_udp_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/udp$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_udp_OBJECTS) $(unit_ip_udp_LDADD) $(LIBS)
+unit/ip/unicast.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/unicast$(EXEEXT): $(unit_ip_unicast_OBJECTS) $(unit_ip_unicast_DEPENDENCIES) $(EXTRA_unit_ip_unicast_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/unicast$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_unicast_OBJECTS) $(unit_ip_unicast_LDADD) $(LIBS)
+unit/ip/v6_only.$(OBJEXT): unit/ip/$(am__dirstamp) \
+ unit/ip/$(DEPDIR)/$(am__dirstamp)
+
+unit/ip/v6_only$(EXEEXT): $(unit_ip_v6_only_OBJECTS) $(unit_ip_v6_only_DEPENDENCIES) $(EXTRA_unit_ip_v6_only_DEPENDENCIES) unit/ip/$(am__dirstamp)
+ @rm -f unit/ip/v6_only$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ip_v6_only_OBJECTS) $(unit_ip_v6_only_LDADD) $(LIBS)
+unit/is_read_buffered.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/is_read_buffered$(EXEEXT): $(unit_is_read_buffered_OBJECTS) $(unit_is_read_buffered_DEPENDENCIES) $(EXTRA_unit_is_read_buffered_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/is_read_buffered$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_is_read_buffered_OBJECTS) $(unit_is_read_buffered_LDADD) $(LIBS)
+unit/is_write_buffered.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/is_write_buffered$(EXEEXT): $(unit_is_write_buffered_OBJECTS) $(unit_is_write_buffered_DEPENDENCIES) $(EXTRA_unit_is_write_buffered_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/is_write_buffered$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_is_write_buffered_OBJECTS) $(unit_is_write_buffered_LDADD) $(LIBS)
+unit/local/$(am__dirstamp):
+ @$(MKDIR_P) unit/local
+ @: > unit/local/$(am__dirstamp)
+unit/local/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unit/local/$(DEPDIR)
+ @: > unit/local/$(DEPDIR)/$(am__dirstamp)
+unit/local/basic_endpoint.$(OBJEXT): unit/local/$(am__dirstamp) \
+ unit/local/$(DEPDIR)/$(am__dirstamp)
+
+unit/local/basic_endpoint$(EXEEXT): $(unit_local_basic_endpoint_OBJECTS) $(unit_local_basic_endpoint_DEPENDENCIES) $(EXTRA_unit_local_basic_endpoint_DEPENDENCIES) unit/local/$(am__dirstamp)
+ @rm -f unit/local/basic_endpoint$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_local_basic_endpoint_OBJECTS) $(unit_local_basic_endpoint_LDADD) $(LIBS)
+unit/local/connect_pair.$(OBJEXT): unit/local/$(am__dirstamp) \
+ unit/local/$(DEPDIR)/$(am__dirstamp)
+
+unit/local/connect_pair$(EXEEXT): $(unit_local_connect_pair_OBJECTS) $(unit_local_connect_pair_DEPENDENCIES) $(EXTRA_unit_local_connect_pair_DEPENDENCIES) unit/local/$(am__dirstamp)
+ @rm -f unit/local/connect_pair$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_local_connect_pair_OBJECTS) $(unit_local_connect_pair_LDADD) $(LIBS)
+unit/local/datagram_protocol.$(OBJEXT): unit/local/$(am__dirstamp) \
+ unit/local/$(DEPDIR)/$(am__dirstamp)
+
+unit/local/datagram_protocol$(EXEEXT): $(unit_local_datagram_protocol_OBJECTS) $(unit_local_datagram_protocol_DEPENDENCIES) $(EXTRA_unit_local_datagram_protocol_DEPENDENCIES) unit/local/$(am__dirstamp)
+ @rm -f unit/local/datagram_protocol$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_local_datagram_protocol_OBJECTS) $(unit_local_datagram_protocol_LDADD) $(LIBS)
+unit/local/seq_packet_protocol.$(OBJEXT): unit/local/$(am__dirstamp) \
+ unit/local/$(DEPDIR)/$(am__dirstamp)
+
+unit/local/seq_packet_protocol$(EXEEXT): $(unit_local_seq_packet_protocol_OBJECTS) $(unit_local_seq_packet_protocol_DEPENDENCIES) $(EXTRA_unit_local_seq_packet_protocol_DEPENDENCIES) unit/local/$(am__dirstamp)
+ @rm -f unit/local/seq_packet_protocol$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_local_seq_packet_protocol_OBJECTS) $(unit_local_seq_packet_protocol_LDADD) $(LIBS)
+unit/local/stream_protocol.$(OBJEXT): unit/local/$(am__dirstamp) \
+ unit/local/$(DEPDIR)/$(am__dirstamp)
+
+unit/local/stream_protocol$(EXEEXT): $(unit_local_stream_protocol_OBJECTS) $(unit_local_stream_protocol_DEPENDENCIES) $(EXTRA_unit_local_stream_protocol_DEPENDENCIES) unit/local/$(am__dirstamp)
+ @rm -f unit/local/stream_protocol$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_local_stream_protocol_OBJECTS) $(unit_local_stream_protocol_LDADD) $(LIBS)
+unit/packaged_task.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/packaged_task$(EXEEXT): $(unit_packaged_task_OBJECTS) $(unit_packaged_task_DEPENDENCIES) $(EXTRA_unit_packaged_task_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/packaged_task$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_packaged_task_OBJECTS) $(unit_packaged_task_LDADD) $(LIBS)
+unit/placeholders.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/placeholders$(EXEEXT): $(unit_placeholders_OBJECTS) $(unit_placeholders_DEPENDENCIES) $(EXTRA_unit_placeholders_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/placeholders$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_placeholders_OBJECTS) $(unit_placeholders_LDADD) $(LIBS)
+unit/posix/$(am__dirstamp):
+ @$(MKDIR_P) unit/posix
+ @: > unit/posix/$(am__dirstamp)
+unit/posix/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unit/posix/$(DEPDIR)
+ @: > unit/posix/$(DEPDIR)/$(am__dirstamp)
+unit/posix/basic_descriptor.$(OBJEXT): unit/posix/$(am__dirstamp) \
+ unit/posix/$(DEPDIR)/$(am__dirstamp)
+
+unit/posix/basic_descriptor$(EXEEXT): $(unit_posix_basic_descriptor_OBJECTS) $(unit_posix_basic_descriptor_DEPENDENCIES) $(EXTRA_unit_posix_basic_descriptor_DEPENDENCIES) unit/posix/$(am__dirstamp)
+ @rm -f unit/posix/basic_descriptor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_posix_basic_descriptor_OBJECTS) $(unit_posix_basic_descriptor_LDADD) $(LIBS)
+unit/posix/basic_stream_descriptor.$(OBJEXT): \
+ unit/posix/$(am__dirstamp) \
+ unit/posix/$(DEPDIR)/$(am__dirstamp)
+
+unit/posix/basic_stream_descriptor$(EXEEXT): $(unit_posix_basic_stream_descriptor_OBJECTS) $(unit_posix_basic_stream_descriptor_DEPENDENCIES) $(EXTRA_unit_posix_basic_stream_descriptor_DEPENDENCIES) unit/posix/$(am__dirstamp)
+ @rm -f unit/posix/basic_stream_descriptor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_posix_basic_stream_descriptor_OBJECTS) $(unit_posix_basic_stream_descriptor_LDADD) $(LIBS)
+unit/posix/descriptor.$(OBJEXT): unit/posix/$(am__dirstamp) \
+ unit/posix/$(DEPDIR)/$(am__dirstamp)
+
+unit/posix/descriptor$(EXEEXT): $(unit_posix_descriptor_OBJECTS) $(unit_posix_descriptor_DEPENDENCIES) $(EXTRA_unit_posix_descriptor_DEPENDENCIES) unit/posix/$(am__dirstamp)
+ @rm -f unit/posix/descriptor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_posix_descriptor_OBJECTS) $(unit_posix_descriptor_LDADD) $(LIBS)
+unit/posix/descriptor_base.$(OBJEXT): unit/posix/$(am__dirstamp) \
+ unit/posix/$(DEPDIR)/$(am__dirstamp)
+
+unit/posix/descriptor_base$(EXEEXT): $(unit_posix_descriptor_base_OBJECTS) $(unit_posix_descriptor_base_DEPENDENCIES) $(EXTRA_unit_posix_descriptor_base_DEPENDENCIES) unit/posix/$(am__dirstamp)
+ @rm -f unit/posix/descriptor_base$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_posix_descriptor_base_OBJECTS) $(unit_posix_descriptor_base_LDADD) $(LIBS)
+unit/posix/stream_descriptor.$(OBJEXT): unit/posix/$(am__dirstamp) \
+ unit/posix/$(DEPDIR)/$(am__dirstamp)
+
+unit/posix/stream_descriptor$(EXEEXT): $(unit_posix_stream_descriptor_OBJECTS) $(unit_posix_stream_descriptor_DEPENDENCIES) $(EXTRA_unit_posix_stream_descriptor_DEPENDENCIES) unit/posix/$(am__dirstamp)
+ @rm -f unit/posix/stream_descriptor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_posix_stream_descriptor_OBJECTS) $(unit_posix_stream_descriptor_LDADD) $(LIBS)
+unit/post.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/post$(EXEEXT): $(unit_post_OBJECTS) $(unit_post_DEPENDENCIES) $(EXTRA_unit_post_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/post$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_post_OBJECTS) $(unit_post_LDADD) $(LIBS)
+unit/prepend.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/prepend$(EXEEXT): $(unit_prepend_OBJECTS) $(unit_prepend_DEPENDENCIES) $(EXTRA_unit_prepend_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/prepend$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_prepend_OBJECTS) $(unit_prepend_LDADD) $(LIBS)
+unit/random_access_file.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/random_access_file$(EXEEXT): $(unit_random_access_file_OBJECTS) $(unit_random_access_file_DEPENDENCIES) $(EXTRA_unit_random_access_file_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/random_access_file$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_random_access_file_OBJECTS) $(unit_random_access_file_LDADD) $(LIBS)
+unit/read.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/read$(EXEEXT): $(unit_read_OBJECTS) $(unit_read_DEPENDENCIES) $(EXTRA_unit_read_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/read$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_read_OBJECTS) $(unit_read_LDADD) $(LIBS)
+unit/read_at.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/read_at$(EXEEXT): $(unit_read_at_OBJECTS) $(unit_read_at_DEPENDENCIES) $(EXTRA_unit_read_at_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/read_at$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_read_at_OBJECTS) $(unit_read_at_LDADD) $(LIBS)
+unit/read_until.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/read_until$(EXEEXT): $(unit_read_until_OBJECTS) $(unit_read_until_DEPENDENCIES) $(EXTRA_unit_read_until_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/read_until$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_read_until_OBJECTS) $(unit_read_until_LDADD) $(LIBS)
+unit/readable_pipe.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/readable_pipe$(EXEEXT): $(unit_readable_pipe_OBJECTS) $(unit_readable_pipe_DEPENDENCIES) $(EXTRA_unit_readable_pipe_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/readable_pipe$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_readable_pipe_OBJECTS) $(unit_readable_pipe_LDADD) $(LIBS)
+unit/recycling_allocator.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/recycling_allocator$(EXEEXT): $(unit_recycling_allocator_OBJECTS) $(unit_recycling_allocator_DEPENDENCIES) $(EXTRA_unit_recycling_allocator_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/recycling_allocator$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_recycling_allocator_OBJECTS) $(unit_recycling_allocator_LDADD) $(LIBS)
+unit/redirect_error.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/redirect_error$(EXEEXT): $(unit_redirect_error_OBJECTS) $(unit_redirect_error_DEPENDENCIES) $(EXTRA_unit_redirect_error_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/redirect_error$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_redirect_error_OBJECTS) $(unit_redirect_error_LDADD) $(LIBS)
+unit/registered_buffer.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/registered_buffer$(EXEEXT): $(unit_registered_buffer_OBJECTS) $(unit_registered_buffer_DEPENDENCIES) $(EXTRA_unit_registered_buffer_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/registered_buffer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_registered_buffer_OBJECTS) $(unit_registered_buffer_LDADD) $(LIBS)
+unit/serial_port.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/serial_port$(EXEEXT): $(unit_serial_port_OBJECTS) $(unit_serial_port_DEPENDENCIES) $(EXTRA_unit_serial_port_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/serial_port$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_serial_port_OBJECTS) $(unit_serial_port_LDADD) $(LIBS)
+unit/serial_port_base.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/serial_port_base$(EXEEXT): $(unit_serial_port_base_OBJECTS) $(unit_serial_port_base_DEPENDENCIES) $(EXTRA_unit_serial_port_base_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/serial_port_base$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_serial_port_base_OBJECTS) $(unit_serial_port_base_LDADD) $(LIBS)
+unit/signal_set.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/signal_set$(EXEEXT): $(unit_signal_set_OBJECTS) $(unit_signal_set_DEPENDENCIES) $(EXTRA_unit_signal_set_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/signal_set$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_signal_set_OBJECTS) $(unit_signal_set_LDADD) $(LIBS)
+unit/signal_set_base.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/signal_set_base$(EXEEXT): $(unit_signal_set_base_OBJECTS) $(unit_signal_set_base_DEPENDENCIES) $(EXTRA_unit_signal_set_base_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/signal_set_base$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_signal_set_base_OBJECTS) $(unit_signal_set_base_LDADD) $(LIBS)
+unit/socket_base.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/socket_base$(EXEEXT): $(unit_socket_base_OBJECTS) $(unit_socket_base_DEPENDENCIES) $(EXTRA_unit_socket_base_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/socket_base$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_socket_base_OBJECTS) $(unit_socket_base_LDADD) $(LIBS)
+unit/ssl/$(am__dirstamp):
+ @$(MKDIR_P) unit/ssl
+ @: > unit/ssl/$(am__dirstamp)
+unit/ssl/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unit/ssl/$(DEPDIR)
+ @: > unit/ssl/$(DEPDIR)/$(am__dirstamp)
+unit/ssl/context.$(OBJEXT): unit/ssl/$(am__dirstamp) \
+ unit/ssl/$(DEPDIR)/$(am__dirstamp)
+
+unit/ssl/context$(EXEEXT): $(unit_ssl_context_OBJECTS) $(unit_ssl_context_DEPENDENCIES) $(EXTRA_unit_ssl_context_DEPENDENCIES) unit/ssl/$(am__dirstamp)
+ @rm -f unit/ssl/context$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_context_OBJECTS) $(unit_ssl_context_LDADD) $(LIBS)
+unit/ssl/context_base.$(OBJEXT): unit/ssl/$(am__dirstamp) \
+ unit/ssl/$(DEPDIR)/$(am__dirstamp)
+
+unit/ssl/context_base$(EXEEXT): $(unit_ssl_context_base_OBJECTS) $(unit_ssl_context_base_DEPENDENCIES) $(EXTRA_unit_ssl_context_base_DEPENDENCIES) unit/ssl/$(am__dirstamp)
+ @rm -f unit/ssl/context_base$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_context_base_OBJECTS) $(unit_ssl_context_base_LDADD) $(LIBS)
+unit/ssl/error.$(OBJEXT): unit/ssl/$(am__dirstamp) \
+ unit/ssl/$(DEPDIR)/$(am__dirstamp)
+
+unit/ssl/error$(EXEEXT): $(unit_ssl_error_OBJECTS) $(unit_ssl_error_DEPENDENCIES) $(EXTRA_unit_ssl_error_DEPENDENCIES) unit/ssl/$(am__dirstamp)
+ @rm -f unit/ssl/error$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_error_OBJECTS) $(unit_ssl_error_LDADD) $(LIBS)
+unit/ssl/host_name_verification.$(OBJEXT): unit/ssl/$(am__dirstamp) \
+ unit/ssl/$(DEPDIR)/$(am__dirstamp)
+
+unit/ssl/host_name_verification$(EXEEXT): $(unit_ssl_host_name_verification_OBJECTS) $(unit_ssl_host_name_verification_DEPENDENCIES) $(EXTRA_unit_ssl_host_name_verification_DEPENDENCIES) unit/ssl/$(am__dirstamp)
+ @rm -f unit/ssl/host_name_verification$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_host_name_verification_OBJECTS) $(unit_ssl_host_name_verification_LDADD) $(LIBS)
+unit/ssl/rfc2818_verification.$(OBJEXT): unit/ssl/$(am__dirstamp) \
+ unit/ssl/$(DEPDIR)/$(am__dirstamp)
+
+unit/ssl/rfc2818_verification$(EXEEXT): $(unit_ssl_rfc2818_verification_OBJECTS) $(unit_ssl_rfc2818_verification_DEPENDENCIES) $(EXTRA_unit_ssl_rfc2818_verification_DEPENDENCIES) unit/ssl/$(am__dirstamp)
+ @rm -f unit/ssl/rfc2818_verification$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_rfc2818_verification_OBJECTS) $(unit_ssl_rfc2818_verification_LDADD) $(LIBS)
+unit/ssl/stream.$(OBJEXT): unit/ssl/$(am__dirstamp) \
+ unit/ssl/$(DEPDIR)/$(am__dirstamp)
+
+unit/ssl/stream$(EXEEXT): $(unit_ssl_stream_OBJECTS) $(unit_ssl_stream_DEPENDENCIES) $(EXTRA_unit_ssl_stream_DEPENDENCIES) unit/ssl/$(am__dirstamp)
+ @rm -f unit/ssl/stream$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_stream_OBJECTS) $(unit_ssl_stream_LDADD) $(LIBS)
+unit/ssl/stream_base.$(OBJEXT): unit/ssl/$(am__dirstamp) \
+ unit/ssl/$(DEPDIR)/$(am__dirstamp)
+
+unit/ssl/stream_base$(EXEEXT): $(unit_ssl_stream_base_OBJECTS) $(unit_ssl_stream_base_DEPENDENCIES) $(EXTRA_unit_ssl_stream_base_DEPENDENCIES) unit/ssl/$(am__dirstamp)
+ @rm -f unit/ssl/stream_base$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ssl_stream_base_OBJECTS) $(unit_ssl_stream_base_LDADD) $(LIBS)
+unit/static_thread_pool.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/static_thread_pool$(EXEEXT): $(unit_static_thread_pool_OBJECTS) $(unit_static_thread_pool_DEPENDENCIES) $(EXTRA_unit_static_thread_pool_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/static_thread_pool$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_static_thread_pool_OBJECTS) $(unit_static_thread_pool_LDADD) $(LIBS)
+unit/steady_timer.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/steady_timer$(EXEEXT): $(unit_steady_timer_OBJECTS) $(unit_steady_timer_DEPENDENCIES) $(EXTRA_unit_steady_timer_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/steady_timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_steady_timer_OBJECTS) $(unit_steady_timer_LDADD) $(LIBS)
+unit/strand.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/strand$(EXEEXT): $(unit_strand_OBJECTS) $(unit_strand_DEPENDENCIES) $(EXTRA_unit_strand_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/strand$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_strand_OBJECTS) $(unit_strand_LDADD) $(LIBS)
+unit/stream_file.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/stream_file$(EXEEXT): $(unit_stream_file_OBJECTS) $(unit_stream_file_DEPENDENCIES) $(EXTRA_unit_stream_file_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/stream_file$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_stream_file_OBJECTS) $(unit_stream_file_LDADD) $(LIBS)
+unit/streambuf.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/streambuf$(EXEEXT): $(unit_streambuf_OBJECTS) $(unit_streambuf_DEPENDENCIES) $(EXTRA_unit_streambuf_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/streambuf$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_streambuf_OBJECTS) $(unit_streambuf_LDADD) $(LIBS)
+unit/system_context.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/system_context$(EXEEXT): $(unit_system_context_OBJECTS) $(unit_system_context_DEPENDENCIES) $(EXTRA_unit_system_context_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/system_context$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_system_context_OBJECTS) $(unit_system_context_LDADD) $(LIBS)
+unit/system_executor.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/system_executor$(EXEEXT): $(unit_system_executor_OBJECTS) $(unit_system_executor_DEPENDENCIES) $(EXTRA_unit_system_executor_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/system_executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_system_executor_OBJECTS) $(unit_system_executor_LDADD) $(LIBS)
+unit/system_timer.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/system_timer$(EXEEXT): $(unit_system_timer_OBJECTS) $(unit_system_timer_DEPENDENCIES) $(EXTRA_unit_system_timer_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/system_timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_system_timer_OBJECTS) $(unit_system_timer_LDADD) $(LIBS)
+unit/this_coro.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/this_coro$(EXEEXT): $(unit_this_coro_OBJECTS) $(unit_this_coro_DEPENDENCIES) $(EXTRA_unit_this_coro_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/this_coro$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_this_coro_OBJECTS) $(unit_this_coro_LDADD) $(LIBS)
+unit/thread.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/thread$(EXEEXT): $(unit_thread_OBJECTS) $(unit_thread_DEPENDENCIES) $(EXTRA_unit_thread_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/thread$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_thread_OBJECTS) $(unit_thread_LDADD) $(LIBS)
+unit/thread_pool.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/thread_pool$(EXEEXT): $(unit_thread_pool_OBJECTS) $(unit_thread_pool_DEPENDENCIES) $(EXTRA_unit_thread_pool_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/thread_pool$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_thread_pool_OBJECTS) $(unit_thread_pool_LDADD) $(LIBS)
+unit/time_traits.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/time_traits$(EXEEXT): $(unit_time_traits_OBJECTS) $(unit_time_traits_DEPENDENCIES) $(EXTRA_unit_time_traits_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/time_traits$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_time_traits_OBJECTS) $(unit_time_traits_LDADD) $(LIBS)
+unit/ts/$(am__dirstamp):
+ @$(MKDIR_P) unit/ts
+ @: > unit/ts/$(am__dirstamp)
+unit/ts/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unit/ts/$(DEPDIR)
+ @: > unit/ts/$(DEPDIR)/$(am__dirstamp)
+unit/ts/buffer.$(OBJEXT): unit/ts/$(am__dirstamp) \
+ unit/ts/$(DEPDIR)/$(am__dirstamp)
+
+unit/ts/buffer$(EXEEXT): $(unit_ts_buffer_OBJECTS) $(unit_ts_buffer_DEPENDENCIES) $(EXTRA_unit_ts_buffer_DEPENDENCIES) unit/ts/$(am__dirstamp)
+ @rm -f unit/ts/buffer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_buffer_OBJECTS) $(unit_ts_buffer_LDADD) $(LIBS)
+unit/ts/executor.$(OBJEXT): unit/ts/$(am__dirstamp) \
+ unit/ts/$(DEPDIR)/$(am__dirstamp)
+
+unit/ts/executor$(EXEEXT): $(unit_ts_executor_OBJECTS) $(unit_ts_executor_DEPENDENCIES) $(EXTRA_unit_ts_executor_DEPENDENCIES) unit/ts/$(am__dirstamp)
+ @rm -f unit/ts/executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_executor_OBJECTS) $(unit_ts_executor_LDADD) $(LIBS)
+unit/ts/internet.$(OBJEXT): unit/ts/$(am__dirstamp) \
+ unit/ts/$(DEPDIR)/$(am__dirstamp)
+
+unit/ts/internet$(EXEEXT): $(unit_ts_internet_OBJECTS) $(unit_ts_internet_DEPENDENCIES) $(EXTRA_unit_ts_internet_DEPENDENCIES) unit/ts/$(am__dirstamp)
+ @rm -f unit/ts/internet$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_internet_OBJECTS) $(unit_ts_internet_LDADD) $(LIBS)
+unit/ts/io_context.$(OBJEXT): unit/ts/$(am__dirstamp) \
+ unit/ts/$(DEPDIR)/$(am__dirstamp)
+
+unit/ts/io_context$(EXEEXT): $(unit_ts_io_context_OBJECTS) $(unit_ts_io_context_DEPENDENCIES) $(EXTRA_unit_ts_io_context_DEPENDENCIES) unit/ts/$(am__dirstamp)
+ @rm -f unit/ts/io_context$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_io_context_OBJECTS) $(unit_ts_io_context_LDADD) $(LIBS)
+unit/ts/net.$(OBJEXT): unit/ts/$(am__dirstamp) \
+ unit/ts/$(DEPDIR)/$(am__dirstamp)
+
+unit/ts/net$(EXEEXT): $(unit_ts_net_OBJECTS) $(unit_ts_net_DEPENDENCIES) $(EXTRA_unit_ts_net_DEPENDENCIES) unit/ts/$(am__dirstamp)
+ @rm -f unit/ts/net$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_net_OBJECTS) $(unit_ts_net_LDADD) $(LIBS)
+unit/ts/netfwd.$(OBJEXT): unit/ts/$(am__dirstamp) \
+ unit/ts/$(DEPDIR)/$(am__dirstamp)
+
+unit/ts/netfwd$(EXEEXT): $(unit_ts_netfwd_OBJECTS) $(unit_ts_netfwd_DEPENDENCIES) $(EXTRA_unit_ts_netfwd_DEPENDENCIES) unit/ts/$(am__dirstamp)
+ @rm -f unit/ts/netfwd$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_netfwd_OBJECTS) $(unit_ts_netfwd_LDADD) $(LIBS)
+unit/ts/socket.$(OBJEXT): unit/ts/$(am__dirstamp) \
+ unit/ts/$(DEPDIR)/$(am__dirstamp)
+
+unit/ts/socket$(EXEEXT): $(unit_ts_socket_OBJECTS) $(unit_ts_socket_DEPENDENCIES) $(EXTRA_unit_ts_socket_DEPENDENCIES) unit/ts/$(am__dirstamp)
+ @rm -f unit/ts/socket$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_socket_OBJECTS) $(unit_ts_socket_LDADD) $(LIBS)
+unit/ts/timer.$(OBJEXT): unit/ts/$(am__dirstamp) \
+ unit/ts/$(DEPDIR)/$(am__dirstamp)
+
+unit/ts/timer$(EXEEXT): $(unit_ts_timer_OBJECTS) $(unit_ts_timer_DEPENDENCIES) $(EXTRA_unit_ts_timer_DEPENDENCIES) unit/ts/$(am__dirstamp)
+ @rm -f unit/ts/timer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_ts_timer_OBJECTS) $(unit_ts_timer_LDADD) $(LIBS)
+unit/use_awaitable.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/use_awaitable$(EXEEXT): $(unit_use_awaitable_OBJECTS) $(unit_use_awaitable_DEPENDENCIES) $(EXTRA_unit_use_awaitable_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/use_awaitable$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_use_awaitable_OBJECTS) $(unit_use_awaitable_LDADD) $(LIBS)
+unit/use_future.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/use_future$(EXEEXT): $(unit_use_future_OBJECTS) $(unit_use_future_DEPENDENCIES) $(EXTRA_unit_use_future_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/use_future$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_use_future_OBJECTS) $(unit_use_future_LDADD) $(LIBS)
+unit/uses_executor.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/uses_executor$(EXEEXT): $(unit_uses_executor_OBJECTS) $(unit_uses_executor_DEPENDENCIES) $(EXTRA_unit_uses_executor_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/uses_executor$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_uses_executor_OBJECTS) $(unit_uses_executor_LDADD) $(LIBS)
+unit/wait_traits.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/wait_traits$(EXEEXT): $(unit_wait_traits_OBJECTS) $(unit_wait_traits_DEPENDENCIES) $(EXTRA_unit_wait_traits_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/wait_traits$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_wait_traits_OBJECTS) $(unit_wait_traits_LDADD) $(LIBS)
+unit/windows/$(am__dirstamp):
+ @$(MKDIR_P) unit/windows
+ @: > unit/windows/$(am__dirstamp)
+unit/windows/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) unit/windows/$(DEPDIR)
+ @: > unit/windows/$(DEPDIR)/$(am__dirstamp)
+unit/windows/basic_object_handle.$(OBJEXT): \
+ unit/windows/$(am__dirstamp) \
+ unit/windows/$(DEPDIR)/$(am__dirstamp)
+
+unit/windows/basic_object_handle$(EXEEXT): $(unit_windows_basic_object_handle_OBJECTS) $(unit_windows_basic_object_handle_DEPENDENCIES) $(EXTRA_unit_windows_basic_object_handle_DEPENDENCIES) unit/windows/$(am__dirstamp)
+ @rm -f unit/windows/basic_object_handle$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_basic_object_handle_OBJECTS) $(unit_windows_basic_object_handle_LDADD) $(LIBS)
+unit/windows/basic_overlapped_handle.$(OBJEXT): \
+ unit/windows/$(am__dirstamp) \
+ unit/windows/$(DEPDIR)/$(am__dirstamp)
+
+unit/windows/basic_overlapped_handle$(EXEEXT): $(unit_windows_basic_overlapped_handle_OBJECTS) $(unit_windows_basic_overlapped_handle_DEPENDENCIES) $(EXTRA_unit_windows_basic_overlapped_handle_DEPENDENCIES) unit/windows/$(am__dirstamp)
+ @rm -f unit/windows/basic_overlapped_handle$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_basic_overlapped_handle_OBJECTS) $(unit_windows_basic_overlapped_handle_LDADD) $(LIBS)
+unit/windows/basic_random_access_handle.$(OBJEXT): \
+ unit/windows/$(am__dirstamp) \
+ unit/windows/$(DEPDIR)/$(am__dirstamp)
+
+unit/windows/basic_random_access_handle$(EXEEXT): $(unit_windows_basic_random_access_handle_OBJECTS) $(unit_windows_basic_random_access_handle_DEPENDENCIES) $(EXTRA_unit_windows_basic_random_access_handle_DEPENDENCIES) unit/windows/$(am__dirstamp)
+ @rm -f unit/windows/basic_random_access_handle$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_basic_random_access_handle_OBJECTS) $(unit_windows_basic_random_access_handle_LDADD) $(LIBS)
+unit/windows/basic_stream_handle.$(OBJEXT): \
+ unit/windows/$(am__dirstamp) \
+ unit/windows/$(DEPDIR)/$(am__dirstamp)
+
+unit/windows/basic_stream_handle$(EXEEXT): $(unit_windows_basic_stream_handle_OBJECTS) $(unit_windows_basic_stream_handle_DEPENDENCIES) $(EXTRA_unit_windows_basic_stream_handle_DEPENDENCIES) unit/windows/$(am__dirstamp)
+ @rm -f unit/windows/basic_stream_handle$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_basic_stream_handle_OBJECTS) $(unit_windows_basic_stream_handle_LDADD) $(LIBS)
+unit/windows/object_handle.$(OBJEXT): unit/windows/$(am__dirstamp) \
+ unit/windows/$(DEPDIR)/$(am__dirstamp)
+
+unit/windows/object_handle$(EXEEXT): $(unit_windows_object_handle_OBJECTS) $(unit_windows_object_handle_DEPENDENCIES) $(EXTRA_unit_windows_object_handle_DEPENDENCIES) unit/windows/$(am__dirstamp)
+ @rm -f unit/windows/object_handle$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_object_handle_OBJECTS) $(unit_windows_object_handle_LDADD) $(LIBS)
+unit/windows/overlapped_handle.$(OBJEXT): \
+ unit/windows/$(am__dirstamp) \
+ unit/windows/$(DEPDIR)/$(am__dirstamp)
+
+unit/windows/overlapped_handle$(EXEEXT): $(unit_windows_overlapped_handle_OBJECTS) $(unit_windows_overlapped_handle_DEPENDENCIES) $(EXTRA_unit_windows_overlapped_handle_DEPENDENCIES) unit/windows/$(am__dirstamp)
+ @rm -f unit/windows/overlapped_handle$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_overlapped_handle_OBJECTS) $(unit_windows_overlapped_handle_LDADD) $(LIBS)
+unit/windows/overlapped_ptr.$(OBJEXT): unit/windows/$(am__dirstamp) \
+ unit/windows/$(DEPDIR)/$(am__dirstamp)
+
+unit/windows/overlapped_ptr$(EXEEXT): $(unit_windows_overlapped_ptr_OBJECTS) $(unit_windows_overlapped_ptr_DEPENDENCIES) $(EXTRA_unit_windows_overlapped_ptr_DEPENDENCIES) unit/windows/$(am__dirstamp)
+ @rm -f unit/windows/overlapped_ptr$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_overlapped_ptr_OBJECTS) $(unit_windows_overlapped_ptr_LDADD) $(LIBS)
+unit/windows/random_access_handle.$(OBJEXT): \
+ unit/windows/$(am__dirstamp) \
+ unit/windows/$(DEPDIR)/$(am__dirstamp)
+
+unit/windows/random_access_handle$(EXEEXT): $(unit_windows_random_access_handle_OBJECTS) $(unit_windows_random_access_handle_DEPENDENCIES) $(EXTRA_unit_windows_random_access_handle_DEPENDENCIES) unit/windows/$(am__dirstamp)
+ @rm -f unit/windows/random_access_handle$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_random_access_handle_OBJECTS) $(unit_windows_random_access_handle_LDADD) $(LIBS)
+unit/windows/stream_handle.$(OBJEXT): unit/windows/$(am__dirstamp) \
+ unit/windows/$(DEPDIR)/$(am__dirstamp)
+
+unit/windows/stream_handle$(EXEEXT): $(unit_windows_stream_handle_OBJECTS) $(unit_windows_stream_handle_DEPENDENCIES) $(EXTRA_unit_windows_stream_handle_DEPENDENCIES) unit/windows/$(am__dirstamp)
+ @rm -f unit/windows/stream_handle$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_windows_stream_handle_OBJECTS) $(unit_windows_stream_handle_LDADD) $(LIBS)
+unit/writable_pipe.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/writable_pipe$(EXEEXT): $(unit_writable_pipe_OBJECTS) $(unit_writable_pipe_DEPENDENCIES) $(EXTRA_unit_writable_pipe_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/writable_pipe$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_writable_pipe_OBJECTS) $(unit_writable_pipe_LDADD) $(LIBS)
+unit/write.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/write$(EXEEXT): $(unit_write_OBJECTS) $(unit_write_DEPENDENCIES) $(EXTRA_unit_write_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/write$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_write_OBJECTS) $(unit_write_LDADD) $(LIBS)
+unit/write_at.$(OBJEXT): unit/$(am__dirstamp) \
+ unit/$(DEPDIR)/$(am__dirstamp)
+
+unit/write_at$(EXEEXT): $(unit_write_at_OBJECTS) $(unit_write_at_DEPENDENCIES) $(EXTRA_unit_write_at_DEPENDENCIES) unit/$(am__dirstamp)
+ @rm -f unit/write_at$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(unit_write_at_OBJECTS) $(unit_write_at_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+ -rm -f ../*.$(OBJEXT)
+ -rm -f latency/*.$(OBJEXT)
+ -rm -f performance/*.$(OBJEXT)
+ -rm -f unit/*.$(OBJEXT)
+ -rm -f unit/execution/*.$(OBJEXT)
+ -rm -f unit/experimental/*.$(OBJEXT)
+ -rm -f unit/experimental/coro/*.$(OBJEXT)
+ -rm -f unit/generic/*.$(OBJEXT)
+ -rm -f unit/ip/*.$(OBJEXT)
+ -rm -f unit/local/*.$(OBJEXT)
+ -rm -f unit/posix/*.$(OBJEXT)
+ -rm -f unit/ssl/*.$(OBJEXT)
+ -rm -f unit/ts/*.$(OBJEXT)
+ -rm -f unit/windows/*.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/asio.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@../$(DEPDIR)/asio_ssl.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@latency/$(DEPDIR)/tcp_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@latency/$(DEPDIR)/tcp_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@latency/$(DEPDIR)/udp_client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@latency/$(DEPDIR)/udp_server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@performance/$(DEPDIR)/client.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@performance/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/any_completion_executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/any_completion_handler.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/any_io_executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/append.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/as_tuple.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/associated_allocator.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/associated_cancellation_slot.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/associated_executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/associated_immediate_executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/associator.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/async_result.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/awaitable.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_datagram_socket.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_deadline_timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_file.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_random_access_file.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_raw_socket.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_readable_pipe.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_seq_packet_socket.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_serial_port.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_signal_set.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_socket.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_socket_acceptor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_stream_file.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_stream_socket.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_streambuf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_waitable_timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/basic_writable_pipe.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/bind_allocator.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/bind_cancellation_slot.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/bind_executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/bind_immediate_executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/buffer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/buffer_registration.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/buffered_read_stream.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/buffered_stream.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/buffered_write_stream.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/buffers_iterator.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/cancellation_signal.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/cancellation_state.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/cancellation_type.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/co_spawn.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/completion_condition.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/compose.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/connect.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/connect_pipe.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/consign.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/coroutine.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/deadline_timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/defer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/deferred.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/detached.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/dispatch.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/error.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/execution_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/executor_work_guard.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/file_base.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/high_resolution_timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/io_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/io_context_strand.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/is_read_buffered.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/is_write_buffered.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/packaged_task.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/placeholders.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/post.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/prepend.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/random_access_file.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/read.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/read_at.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/read_until.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/readable_pipe.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/recycling_allocator.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/redirect_error.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/registered_buffer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/serial_port.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/serial_port_base.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/signal_set.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/signal_set_base.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/socket_base.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/static_thread_pool.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/steady_timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/strand.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/stream_file.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/streambuf.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/system_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/system_executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/system_timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/this_coro.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/thread.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/thread_pool.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/time_traits.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/use_awaitable.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/use_future.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/uses_executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/wait_traits.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/writable_pipe.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/write.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/$(DEPDIR)/write_at.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/execution/$(DEPDIR)/any_executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/execution/$(DEPDIR)/blocking.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/execution/$(DEPDIR)/blocking_adaptation.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/execution/$(DEPDIR)/context_as.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/execution/$(DEPDIR)/executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/execution/$(DEPDIR)/invocable_archetype.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/execution/$(DEPDIR)/mapping.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/execution/$(DEPDIR)/outstanding_work.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/execution/$(DEPDIR)/prefer_only.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/execution/$(DEPDIR)/relationship.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/$(DEPDIR)/awaitable_operators.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/$(DEPDIR)/basic_channel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/$(DEPDIR)/basic_concurrent_channel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/$(DEPDIR)/channel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/$(DEPDIR)/channel_traits.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/$(DEPDIR)/co_composed.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/$(DEPDIR)/concurrent_channel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/$(DEPDIR)/parallel_group.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/$(DEPDIR)/promise.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/coro/$(DEPDIR)/allocator.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/coro/$(DEPDIR)/cancel.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/coro/$(DEPDIR)/co_spawn.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/coro/$(DEPDIR)/exception.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/coro/$(DEPDIR)/executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/coro/$(DEPDIR)/partial.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/coro/$(DEPDIR)/simple_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/coro/$(DEPDIR)/stack_test.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/experimental/coro/$(DEPDIR)/use_coro.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/generic/$(DEPDIR)/basic_endpoint.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/generic/$(DEPDIR)/datagram_protocol.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/generic/$(DEPDIR)/raw_protocol.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/generic/$(DEPDIR)/seq_packet_protocol.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/generic/$(DEPDIR)/stream_protocol.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address_v4.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address_v4_iterator.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address_v4_range.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address_v6.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address_v6_iterator.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/address_v6_range.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/basic_endpoint.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/basic_resolver.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/basic_resolver_entry.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/basic_resolver_iterator.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/basic_resolver_query.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/host_name.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/icmp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/multicast.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/network_v4.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/network_v6.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/resolver_query_base.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/tcp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/udp.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/unicast.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ip/$(DEPDIR)/v6_only.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/local/$(DEPDIR)/basic_endpoint.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/local/$(DEPDIR)/connect_pair.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/local/$(DEPDIR)/datagram_protocol.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/local/$(DEPDIR)/seq_packet_protocol.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/local/$(DEPDIR)/stream_protocol.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/posix/$(DEPDIR)/basic_descriptor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/posix/$(DEPDIR)/basic_stream_descriptor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/posix/$(DEPDIR)/descriptor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/posix/$(DEPDIR)/descriptor_base.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/posix/$(DEPDIR)/stream_descriptor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/context_base.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/error.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/host_name_verification.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/rfc2818_verification.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/stream.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ssl/$(DEPDIR)/stream_base.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/buffer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/executor.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/internet.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/io_context.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/net.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/netfwd.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/socket.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/ts/$(DEPDIR)/timer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/basic_object_handle.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/basic_overlapped_handle.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/basic_random_access_handle.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/basic_stream_handle.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/object_handle.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/overlapped_handle.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/overlapped_ptr.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/random_access_handle.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@unit/windows/$(DEPDIR)/stream_handle.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run 'make' without going through this Makefile.
+# To change the values of 'make' variables: instead of editing Makefiles,
+# (1) if the variable is set in 'config.status', edit 'config.status'
+# (which will cause the Makefiles to be regenerated when you run 'make');
+# (2) otherwise, pass the desired values on the 'make' command line.
+$(am__recursive_targets):
+ @fail=; \
+ if $(am__make_keepgoing); then \
+ failcom='fail=yes'; \
+ else \
+ failcom='exit 1'; \
+ fi; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-recursive
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
+ include_option=--etags-include; \
+ empty_fix=.; \
+ else \
+ include_option=--include; \
+ empty_fix=; \
+ fi; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test ! -f $$subdir/TAGS || \
+ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-recursive
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-recursive
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS: $(check_PROGRAMS)
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+unit/any_completion_executor.log: unit/any_completion_executor$(EXEEXT)
+ @p='unit/any_completion_executor$(EXEEXT)'; \
+ b='unit/any_completion_executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/any_completion_handler.log: unit/any_completion_handler$(EXEEXT)
+ @p='unit/any_completion_handler$(EXEEXT)'; \
+ b='unit/any_completion_handler'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/any_io_executor.log: unit/any_io_executor$(EXEEXT)
+ @p='unit/any_io_executor$(EXEEXT)'; \
+ b='unit/any_io_executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/append.log: unit/append$(EXEEXT)
+ @p='unit/append$(EXEEXT)'; \
+ b='unit/append'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/as_tuple.log: unit/as_tuple$(EXEEXT)
+ @p='unit/as_tuple$(EXEEXT)'; \
+ b='unit/as_tuple'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/associated_allocator.log: unit/associated_allocator$(EXEEXT)
+ @p='unit/associated_allocator$(EXEEXT)'; \
+ b='unit/associated_allocator'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/associated_cancellation_slot.log: unit/associated_cancellation_slot$(EXEEXT)
+ @p='unit/associated_cancellation_slot$(EXEEXT)'; \
+ b='unit/associated_cancellation_slot'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/associated_executor.log: unit/associated_executor$(EXEEXT)
+ @p='unit/associated_executor$(EXEEXT)'; \
+ b='unit/associated_executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/associated_immediate_executor.log: unit/associated_immediate_executor$(EXEEXT)
+ @p='unit/associated_immediate_executor$(EXEEXT)'; \
+ b='unit/associated_immediate_executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/associator.log: unit/associator$(EXEEXT)
+ @p='unit/associator$(EXEEXT)'; \
+ b='unit/associator'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/async_result.log: unit/async_result$(EXEEXT)
+ @p='unit/async_result$(EXEEXT)'; \
+ b='unit/async_result'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/awaitable.log: unit/awaitable$(EXEEXT)
+ @p='unit/awaitable$(EXEEXT)'; \
+ b='unit/awaitable'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_datagram_socket.log: unit/basic_datagram_socket$(EXEEXT)
+ @p='unit/basic_datagram_socket$(EXEEXT)'; \
+ b='unit/basic_datagram_socket'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_deadline_timer.log: unit/basic_deadline_timer$(EXEEXT)
+ @p='unit/basic_deadline_timer$(EXEEXT)'; \
+ b='unit/basic_deadline_timer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_file.log: unit/basic_file$(EXEEXT)
+ @p='unit/basic_file$(EXEEXT)'; \
+ b='unit/basic_file'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_random_access_file.log: unit/basic_random_access_file$(EXEEXT)
+ @p='unit/basic_random_access_file$(EXEEXT)'; \
+ b='unit/basic_random_access_file'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_raw_socket.log: unit/basic_raw_socket$(EXEEXT)
+ @p='unit/basic_raw_socket$(EXEEXT)'; \
+ b='unit/basic_raw_socket'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_readable_pipe.log: unit/basic_readable_pipe$(EXEEXT)
+ @p='unit/basic_readable_pipe$(EXEEXT)'; \
+ b='unit/basic_readable_pipe'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_seq_packet_socket.log: unit/basic_seq_packet_socket$(EXEEXT)
+ @p='unit/basic_seq_packet_socket$(EXEEXT)'; \
+ b='unit/basic_seq_packet_socket'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_serial_port.log: unit/basic_serial_port$(EXEEXT)
+ @p='unit/basic_serial_port$(EXEEXT)'; \
+ b='unit/basic_serial_port'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_signal_set.log: unit/basic_signal_set$(EXEEXT)
+ @p='unit/basic_signal_set$(EXEEXT)'; \
+ b='unit/basic_signal_set'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_socket.log: unit/basic_socket$(EXEEXT)
+ @p='unit/basic_socket$(EXEEXT)'; \
+ b='unit/basic_socket'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_socket_acceptor.log: unit/basic_socket_acceptor$(EXEEXT)
+ @p='unit/basic_socket_acceptor$(EXEEXT)'; \
+ b='unit/basic_socket_acceptor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_stream_file.log: unit/basic_stream_file$(EXEEXT)
+ @p='unit/basic_stream_file$(EXEEXT)'; \
+ b='unit/basic_stream_file'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_stream_socket.log: unit/basic_stream_socket$(EXEEXT)
+ @p='unit/basic_stream_socket$(EXEEXT)'; \
+ b='unit/basic_stream_socket'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_streambuf.log: unit/basic_streambuf$(EXEEXT)
+ @p='unit/basic_streambuf$(EXEEXT)'; \
+ b='unit/basic_streambuf'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_waitable_timer.log: unit/basic_waitable_timer$(EXEEXT)
+ @p='unit/basic_waitable_timer$(EXEEXT)'; \
+ b='unit/basic_waitable_timer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/basic_writable_pipe.log: unit/basic_writable_pipe$(EXEEXT)
+ @p='unit/basic_writable_pipe$(EXEEXT)'; \
+ b='unit/basic_writable_pipe'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/bind_allocator.log: unit/bind_allocator$(EXEEXT)
+ @p='unit/bind_allocator$(EXEEXT)'; \
+ b='unit/bind_allocator'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/bind_cancellation_slot.log: unit/bind_cancellation_slot$(EXEEXT)
+ @p='unit/bind_cancellation_slot$(EXEEXT)'; \
+ b='unit/bind_cancellation_slot'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/bind_executor.log: unit/bind_executor$(EXEEXT)
+ @p='unit/bind_executor$(EXEEXT)'; \
+ b='unit/bind_executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/bind_immediate_executor.log: unit/bind_immediate_executor$(EXEEXT)
+ @p='unit/bind_immediate_executor$(EXEEXT)'; \
+ b='unit/bind_immediate_executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/buffered_read_stream.log: unit/buffered_read_stream$(EXEEXT)
+ @p='unit/buffered_read_stream$(EXEEXT)'; \
+ b='unit/buffered_read_stream'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/buffered_stream.log: unit/buffered_stream$(EXEEXT)
+ @p='unit/buffered_stream$(EXEEXT)'; \
+ b='unit/buffered_stream'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/buffered_write_stream.log: unit/buffered_write_stream$(EXEEXT)
+ @p='unit/buffered_write_stream$(EXEEXT)'; \
+ b='unit/buffered_write_stream'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/buffer.log: unit/buffer$(EXEEXT)
+ @p='unit/buffer$(EXEEXT)'; \
+ b='unit/buffer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/buffer_registration.log: unit/buffer_registration$(EXEEXT)
+ @p='unit/buffer_registration$(EXEEXT)'; \
+ b='unit/buffer_registration'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/buffers_iterator.log: unit/buffers_iterator$(EXEEXT)
+ @p='unit/buffers_iterator$(EXEEXT)'; \
+ b='unit/buffers_iterator'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/cancellation_signal.log: unit/cancellation_signal$(EXEEXT)
+ @p='unit/cancellation_signal$(EXEEXT)'; \
+ b='unit/cancellation_signal'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/cancellation_state.log: unit/cancellation_state$(EXEEXT)
+ @p='unit/cancellation_state$(EXEEXT)'; \
+ b='unit/cancellation_state'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/cancellation_type.log: unit/cancellation_type$(EXEEXT)
+ @p='unit/cancellation_type$(EXEEXT)'; \
+ b='unit/cancellation_type'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/co_spawn.log: unit/co_spawn$(EXEEXT)
+ @p='unit/co_spawn$(EXEEXT)'; \
+ b='unit/co_spawn'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/completion_condition.log: unit/completion_condition$(EXEEXT)
+ @p='unit/completion_condition$(EXEEXT)'; \
+ b='unit/completion_condition'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/compose.log: unit/compose$(EXEEXT)
+ @p='unit/compose$(EXEEXT)'; \
+ b='unit/compose'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/connect.log: unit/connect$(EXEEXT)
+ @p='unit/connect$(EXEEXT)'; \
+ b='unit/connect'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/connect_pipe.log: unit/connect_pipe$(EXEEXT)
+ @p='unit/connect_pipe$(EXEEXT)'; \
+ b='unit/connect_pipe'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/consign.log: unit/consign$(EXEEXT)
+ @p='unit/consign$(EXEEXT)'; \
+ b='unit/consign'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/deadline_timer.log: unit/deadline_timer$(EXEEXT)
+ @p='unit/deadline_timer$(EXEEXT)'; \
+ b='unit/deadline_timer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/defer.log: unit/defer$(EXEEXT)
+ @p='unit/defer$(EXEEXT)'; \
+ b='unit/defer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/deferred.log: unit/deferred$(EXEEXT)
+ @p='unit/deferred$(EXEEXT)'; \
+ b='unit/deferred'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/detached.log: unit/detached$(EXEEXT)
+ @p='unit/detached$(EXEEXT)'; \
+ b='unit/detached'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/dispatch.log: unit/dispatch$(EXEEXT)
+ @p='unit/dispatch$(EXEEXT)'; \
+ b='unit/dispatch'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/error.log: unit/error$(EXEEXT)
+ @p='unit/error$(EXEEXT)'; \
+ b='unit/error'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/execution/any_executor.log: unit/execution/any_executor$(EXEEXT)
+ @p='unit/execution/any_executor$(EXEEXT)'; \
+ b='unit/execution/any_executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/execution/blocking.log: unit/execution/blocking$(EXEEXT)
+ @p='unit/execution/blocking$(EXEEXT)'; \
+ b='unit/execution/blocking'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/execution/blocking_adaptation.log: unit/execution/blocking_adaptation$(EXEEXT)
+ @p='unit/execution/blocking_adaptation$(EXEEXT)'; \
+ b='unit/execution/blocking_adaptation'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/execution/context_as.log: unit/execution/context_as$(EXEEXT)
+ @p='unit/execution/context_as$(EXEEXT)'; \
+ b='unit/execution/context_as'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/execution/executor.log: unit/execution/executor$(EXEEXT)
+ @p='unit/execution/executor$(EXEEXT)'; \
+ b='unit/execution/executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/execution/invocable_archetype.log: unit/execution/invocable_archetype$(EXEEXT)
+ @p='unit/execution/invocable_archetype$(EXEEXT)'; \
+ b='unit/execution/invocable_archetype'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/execution/mapping.log: unit/execution/mapping$(EXEEXT)
+ @p='unit/execution/mapping$(EXEEXT)'; \
+ b='unit/execution/mapping'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/execution/outstanding_work.log: unit/execution/outstanding_work$(EXEEXT)
+ @p='unit/execution/outstanding_work$(EXEEXT)'; \
+ b='unit/execution/outstanding_work'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/execution/prefer_only.log: unit/execution/prefer_only$(EXEEXT)
+ @p='unit/execution/prefer_only$(EXEEXT)'; \
+ b='unit/execution/prefer_only'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/execution/relationship.log: unit/execution/relationship$(EXEEXT)
+ @p='unit/execution/relationship$(EXEEXT)'; \
+ b='unit/execution/relationship'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/execution_context.log: unit/execution_context$(EXEEXT)
+ @p='unit/execution_context$(EXEEXT)'; \
+ b='unit/execution_context'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/executor.log: unit/executor$(EXEEXT)
+ @p='unit/executor$(EXEEXT)'; \
+ b='unit/executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/executor_work_guard.log: unit/executor_work_guard$(EXEEXT)
+ @p='unit/executor_work_guard$(EXEEXT)'; \
+ b='unit/executor_work_guard'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/file_base.log: unit/file_base$(EXEEXT)
+ @p='unit/file_base$(EXEEXT)'; \
+ b='unit/file_base'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/high_resolution_timer.log: unit/high_resolution_timer$(EXEEXT)
+ @p='unit/high_resolution_timer$(EXEEXT)'; \
+ b='unit/high_resolution_timer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/io_context.log: unit/io_context$(EXEEXT)
+ @p='unit/io_context$(EXEEXT)'; \
+ b='unit/io_context'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/io_context_strand.log: unit/io_context_strand$(EXEEXT)
+ @p='unit/io_context_strand$(EXEEXT)'; \
+ b='unit/io_context_strand'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/address.log: unit/ip/address$(EXEEXT)
+ @p='unit/ip/address$(EXEEXT)'; \
+ b='unit/ip/address'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/address_v4.log: unit/ip/address_v4$(EXEEXT)
+ @p='unit/ip/address_v4$(EXEEXT)'; \
+ b='unit/ip/address_v4'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/address_v4_iterator.log: unit/ip/address_v4_iterator$(EXEEXT)
+ @p='unit/ip/address_v4_iterator$(EXEEXT)'; \
+ b='unit/ip/address_v4_iterator'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/address_v4_range.log: unit/ip/address_v4_range$(EXEEXT)
+ @p='unit/ip/address_v4_range$(EXEEXT)'; \
+ b='unit/ip/address_v4_range'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/address_v6.log: unit/ip/address_v6$(EXEEXT)
+ @p='unit/ip/address_v6$(EXEEXT)'; \
+ b='unit/ip/address_v6'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/address_v6_iterator.log: unit/ip/address_v6_iterator$(EXEEXT)
+ @p='unit/ip/address_v6_iterator$(EXEEXT)'; \
+ b='unit/ip/address_v6_iterator'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/address_v6_range.log: unit/ip/address_v6_range$(EXEEXT)
+ @p='unit/ip/address_v6_range$(EXEEXT)'; \
+ b='unit/ip/address_v6_range'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/basic_endpoint.log: unit/ip/basic_endpoint$(EXEEXT)
+ @p='unit/ip/basic_endpoint$(EXEEXT)'; \
+ b='unit/ip/basic_endpoint'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/basic_resolver.log: unit/ip/basic_resolver$(EXEEXT)
+ @p='unit/ip/basic_resolver$(EXEEXT)'; \
+ b='unit/ip/basic_resolver'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/basic_resolver_entry.log: unit/ip/basic_resolver_entry$(EXEEXT)
+ @p='unit/ip/basic_resolver_entry$(EXEEXT)'; \
+ b='unit/ip/basic_resolver_entry'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/basic_resolver_iterator.log: unit/ip/basic_resolver_iterator$(EXEEXT)
+ @p='unit/ip/basic_resolver_iterator$(EXEEXT)'; \
+ b='unit/ip/basic_resolver_iterator'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/basic_resolver_query.log: unit/ip/basic_resolver_query$(EXEEXT)
+ @p='unit/ip/basic_resolver_query$(EXEEXT)'; \
+ b='unit/ip/basic_resolver_query'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/host_name.log: unit/ip/host_name$(EXEEXT)
+ @p='unit/ip/host_name$(EXEEXT)'; \
+ b='unit/ip/host_name'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/icmp.log: unit/ip/icmp$(EXEEXT)
+ @p='unit/ip/icmp$(EXEEXT)'; \
+ b='unit/ip/icmp'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/multicast.log: unit/ip/multicast$(EXEEXT)
+ @p='unit/ip/multicast$(EXEEXT)'; \
+ b='unit/ip/multicast'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/network_v4.log: unit/ip/network_v4$(EXEEXT)
+ @p='unit/ip/network_v4$(EXEEXT)'; \
+ b='unit/ip/network_v4'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/network_v6.log: unit/ip/network_v6$(EXEEXT)
+ @p='unit/ip/network_v6$(EXEEXT)'; \
+ b='unit/ip/network_v6'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/resolver_query_base.log: unit/ip/resolver_query_base$(EXEEXT)
+ @p='unit/ip/resolver_query_base$(EXEEXT)'; \
+ b='unit/ip/resolver_query_base'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/tcp.log: unit/ip/tcp$(EXEEXT)
+ @p='unit/ip/tcp$(EXEEXT)'; \
+ b='unit/ip/tcp'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/udp.log: unit/ip/udp$(EXEEXT)
+ @p='unit/ip/udp$(EXEEXT)'; \
+ b='unit/ip/udp'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/unicast.log: unit/ip/unicast$(EXEEXT)
+ @p='unit/ip/unicast$(EXEEXT)'; \
+ b='unit/ip/unicast'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ip/v6_only.log: unit/ip/v6_only$(EXEEXT)
+ @p='unit/ip/v6_only$(EXEEXT)'; \
+ b='unit/ip/v6_only'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/is_read_buffered.log: unit/is_read_buffered$(EXEEXT)
+ @p='unit/is_read_buffered$(EXEEXT)'; \
+ b='unit/is_read_buffered'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/is_write_buffered.log: unit/is_write_buffered$(EXEEXT)
+ @p='unit/is_write_buffered$(EXEEXT)'; \
+ b='unit/is_write_buffered'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/local/basic_endpoint.log: unit/local/basic_endpoint$(EXEEXT)
+ @p='unit/local/basic_endpoint$(EXEEXT)'; \
+ b='unit/local/basic_endpoint'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/local/connect_pair.log: unit/local/connect_pair$(EXEEXT)
+ @p='unit/local/connect_pair$(EXEEXT)'; \
+ b='unit/local/connect_pair'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/local/datagram_protocol.log: unit/local/datagram_protocol$(EXEEXT)
+ @p='unit/local/datagram_protocol$(EXEEXT)'; \
+ b='unit/local/datagram_protocol'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/local/seq_packet_protocol.log: unit/local/seq_packet_protocol$(EXEEXT)
+ @p='unit/local/seq_packet_protocol$(EXEEXT)'; \
+ b='unit/local/seq_packet_protocol'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/local/stream_protocol.log: unit/local/stream_protocol$(EXEEXT)
+ @p='unit/local/stream_protocol$(EXEEXT)'; \
+ b='unit/local/stream_protocol'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/packaged_task.log: unit/packaged_task$(EXEEXT)
+ @p='unit/packaged_task$(EXEEXT)'; \
+ b='unit/packaged_task'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/placeholders.log: unit/placeholders$(EXEEXT)
+ @p='unit/placeholders$(EXEEXT)'; \
+ b='unit/placeholders'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/posix/basic_descriptor.log: unit/posix/basic_descriptor$(EXEEXT)
+ @p='unit/posix/basic_descriptor$(EXEEXT)'; \
+ b='unit/posix/basic_descriptor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/posix/basic_stream_descriptor.log: unit/posix/basic_stream_descriptor$(EXEEXT)
+ @p='unit/posix/basic_stream_descriptor$(EXEEXT)'; \
+ b='unit/posix/basic_stream_descriptor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/posix/descriptor.log: unit/posix/descriptor$(EXEEXT)
+ @p='unit/posix/descriptor$(EXEEXT)'; \
+ b='unit/posix/descriptor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/posix/descriptor_base.log: unit/posix/descriptor_base$(EXEEXT)
+ @p='unit/posix/descriptor_base$(EXEEXT)'; \
+ b='unit/posix/descriptor_base'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/posix/stream_descriptor.log: unit/posix/stream_descriptor$(EXEEXT)
+ @p='unit/posix/stream_descriptor$(EXEEXT)'; \
+ b='unit/posix/stream_descriptor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/post.log: unit/post$(EXEEXT)
+ @p='unit/post$(EXEEXT)'; \
+ b='unit/post'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/prepend.log: unit/prepend$(EXEEXT)
+ @p='unit/prepend$(EXEEXT)'; \
+ b='unit/prepend'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/random_access_file.log: unit/random_access_file$(EXEEXT)
+ @p='unit/random_access_file$(EXEEXT)'; \
+ b='unit/random_access_file'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/read.log: unit/read$(EXEEXT)
+ @p='unit/read$(EXEEXT)'; \
+ b='unit/read'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/read_at.log: unit/read_at$(EXEEXT)
+ @p='unit/read_at$(EXEEXT)'; \
+ b='unit/read_at'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/read_until.log: unit/read_until$(EXEEXT)
+ @p='unit/read_until$(EXEEXT)'; \
+ b='unit/read_until'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/readable_pipe.log: unit/readable_pipe$(EXEEXT)
+ @p='unit/readable_pipe$(EXEEXT)'; \
+ b='unit/readable_pipe'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/recycling_allocator.log: unit/recycling_allocator$(EXEEXT)
+ @p='unit/recycling_allocator$(EXEEXT)'; \
+ b='unit/recycling_allocator'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/redirect_error.log: unit/redirect_error$(EXEEXT)
+ @p='unit/redirect_error$(EXEEXT)'; \
+ b='unit/redirect_error'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/registered_buffer.log: unit/registered_buffer$(EXEEXT)
+ @p='unit/registered_buffer$(EXEEXT)'; \
+ b='unit/registered_buffer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/serial_port.log: unit/serial_port$(EXEEXT)
+ @p='unit/serial_port$(EXEEXT)'; \
+ b='unit/serial_port'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/serial_port_base.log: unit/serial_port_base$(EXEEXT)
+ @p='unit/serial_port_base$(EXEEXT)'; \
+ b='unit/serial_port_base'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/signal_set.log: unit/signal_set$(EXEEXT)
+ @p='unit/signal_set$(EXEEXT)'; \
+ b='unit/signal_set'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/signal_set_base.log: unit/signal_set_base$(EXEEXT)
+ @p='unit/signal_set_base$(EXEEXT)'; \
+ b='unit/signal_set_base'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/socket_base.log: unit/socket_base$(EXEEXT)
+ @p='unit/socket_base$(EXEEXT)'; \
+ b='unit/socket_base'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/static_thread_pool.log: unit/static_thread_pool$(EXEEXT)
+ @p='unit/static_thread_pool$(EXEEXT)'; \
+ b='unit/static_thread_pool'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/steady_timer.log: unit/steady_timer$(EXEEXT)
+ @p='unit/steady_timer$(EXEEXT)'; \
+ b='unit/steady_timer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/strand.log: unit/strand$(EXEEXT)
+ @p='unit/strand$(EXEEXT)'; \
+ b='unit/strand'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/stream_file.log: unit/stream_file$(EXEEXT)
+ @p='unit/stream_file$(EXEEXT)'; \
+ b='unit/stream_file'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/streambuf.log: unit/streambuf$(EXEEXT)
+ @p='unit/streambuf$(EXEEXT)'; \
+ b='unit/streambuf'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/system_context.log: unit/system_context$(EXEEXT)
+ @p='unit/system_context$(EXEEXT)'; \
+ b='unit/system_context'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/system_executor.log: unit/system_executor$(EXEEXT)
+ @p='unit/system_executor$(EXEEXT)'; \
+ b='unit/system_executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/system_timer.log: unit/system_timer$(EXEEXT)
+ @p='unit/system_timer$(EXEEXT)'; \
+ b='unit/system_timer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/this_coro.log: unit/this_coro$(EXEEXT)
+ @p='unit/this_coro$(EXEEXT)'; \
+ b='unit/this_coro'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/thread.log: unit/thread$(EXEEXT)
+ @p='unit/thread$(EXEEXT)'; \
+ b='unit/thread'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/thread_pool.log: unit/thread_pool$(EXEEXT)
+ @p='unit/thread_pool$(EXEEXT)'; \
+ b='unit/thread_pool'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/time_traits.log: unit/time_traits$(EXEEXT)
+ @p='unit/time_traits$(EXEEXT)'; \
+ b='unit/time_traits'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ts/buffer.log: unit/ts/buffer$(EXEEXT)
+ @p='unit/ts/buffer$(EXEEXT)'; \
+ b='unit/ts/buffer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ts/executor.log: unit/ts/executor$(EXEEXT)
+ @p='unit/ts/executor$(EXEEXT)'; \
+ b='unit/ts/executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ts/internet.log: unit/ts/internet$(EXEEXT)
+ @p='unit/ts/internet$(EXEEXT)'; \
+ b='unit/ts/internet'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ts/io_context.log: unit/ts/io_context$(EXEEXT)
+ @p='unit/ts/io_context$(EXEEXT)'; \
+ b='unit/ts/io_context'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ts/net.log: unit/ts/net$(EXEEXT)
+ @p='unit/ts/net$(EXEEXT)'; \
+ b='unit/ts/net'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ts/netfwd.log: unit/ts/netfwd$(EXEEXT)
+ @p='unit/ts/netfwd$(EXEEXT)'; \
+ b='unit/ts/netfwd'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ts/socket.log: unit/ts/socket$(EXEEXT)
+ @p='unit/ts/socket$(EXEEXT)'; \
+ b='unit/ts/socket'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ts/timer.log: unit/ts/timer$(EXEEXT)
+ @p='unit/ts/timer$(EXEEXT)'; \
+ b='unit/ts/timer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/use_awaitable.log: unit/use_awaitable$(EXEEXT)
+ @p='unit/use_awaitable$(EXEEXT)'; \
+ b='unit/use_awaitable'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/use_future.log: unit/use_future$(EXEEXT)
+ @p='unit/use_future$(EXEEXT)'; \
+ b='unit/use_future'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/uses_executor.log: unit/uses_executor$(EXEEXT)
+ @p='unit/uses_executor$(EXEEXT)'; \
+ b='unit/uses_executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/wait_traits.log: unit/wait_traits$(EXEEXT)
+ @p='unit/wait_traits$(EXEEXT)'; \
+ b='unit/wait_traits'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/windows/basic_object_handle.log: unit/windows/basic_object_handle$(EXEEXT)
+ @p='unit/windows/basic_object_handle$(EXEEXT)'; \
+ b='unit/windows/basic_object_handle'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/windows/basic_overlapped_handle.log: unit/windows/basic_overlapped_handle$(EXEEXT)
+ @p='unit/windows/basic_overlapped_handle$(EXEEXT)'; \
+ b='unit/windows/basic_overlapped_handle'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/windows/basic_random_access_handle.log: unit/windows/basic_random_access_handle$(EXEEXT)
+ @p='unit/windows/basic_random_access_handle$(EXEEXT)'; \
+ b='unit/windows/basic_random_access_handle'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/windows/basic_stream_handle.log: unit/windows/basic_stream_handle$(EXEEXT)
+ @p='unit/windows/basic_stream_handle$(EXEEXT)'; \
+ b='unit/windows/basic_stream_handle'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/windows/object_handle.log: unit/windows/object_handle$(EXEEXT)
+ @p='unit/windows/object_handle$(EXEEXT)'; \
+ b='unit/windows/object_handle'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/windows/overlapped_handle.log: unit/windows/overlapped_handle$(EXEEXT)
+ @p='unit/windows/overlapped_handle$(EXEEXT)'; \
+ b='unit/windows/overlapped_handle'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/windows/overlapped_ptr.log: unit/windows/overlapped_ptr$(EXEEXT)
+ @p='unit/windows/overlapped_ptr$(EXEEXT)'; \
+ b='unit/windows/overlapped_ptr'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/windows/random_access_handle.log: unit/windows/random_access_handle$(EXEEXT)
+ @p='unit/windows/random_access_handle$(EXEEXT)'; \
+ b='unit/windows/random_access_handle'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/windows/stream_handle.log: unit/windows/stream_handle$(EXEEXT)
+ @p='unit/windows/stream_handle$(EXEEXT)'; \
+ b='unit/windows/stream_handle'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/writable_pipe.log: unit/writable_pipe$(EXEEXT)
+ @p='unit/writable_pipe$(EXEEXT)'; \
+ b='unit/writable_pipe'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/write.log: unit/write$(EXEEXT)
+ @p='unit/write$(EXEEXT)'; \
+ b='unit/write'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/write_at.log: unit/write_at$(EXEEXT)
+ @p='unit/write_at$(EXEEXT)'; \
+ b='unit/write_at'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/basic_channel.log: unit/experimental/basic_channel$(EXEEXT)
+ @p='unit/experimental/basic_channel$(EXEEXT)'; \
+ b='unit/experimental/basic_channel'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/basic_concurrent_channel.log: unit/experimental/basic_concurrent_channel$(EXEEXT)
+ @p='unit/experimental/basic_concurrent_channel$(EXEEXT)'; \
+ b='unit/experimental/basic_concurrent_channel'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/channel.log: unit/experimental/channel$(EXEEXT)
+ @p='unit/experimental/channel$(EXEEXT)'; \
+ b='unit/experimental/channel'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/channel_traits.log: unit/experimental/channel_traits$(EXEEXT)
+ @p='unit/experimental/channel_traits$(EXEEXT)'; \
+ b='unit/experimental/channel_traits'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/concurrent_channel.log: unit/experimental/concurrent_channel$(EXEEXT)
+ @p='unit/experimental/concurrent_channel$(EXEEXT)'; \
+ b='unit/experimental/concurrent_channel'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/parallel_group.log: unit/experimental/parallel_group$(EXEEXT)
+ @p='unit/experimental/parallel_group$(EXEEXT)'; \
+ b='unit/experimental/parallel_group'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/promise.log: unit/experimental/promise$(EXEEXT)
+ @p='unit/experimental/promise$(EXEEXT)'; \
+ b='unit/experimental/promise'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/awaitable_operators.log: unit/experimental/awaitable_operators$(EXEEXT)
+ @p='unit/experimental/awaitable_operators$(EXEEXT)'; \
+ b='unit/experimental/awaitable_operators'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/co_composed.log: unit/experimental/co_composed$(EXEEXT)
+ @p='unit/experimental/co_composed$(EXEEXT)'; \
+ b='unit/experimental/co_composed'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/coro/allocator.log: unit/experimental/coro/allocator$(EXEEXT)
+ @p='unit/experimental/coro/allocator$(EXEEXT)'; \
+ b='unit/experimental/coro/allocator'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/coro/cancel.log: unit/experimental/coro/cancel$(EXEEXT)
+ @p='unit/experimental/coro/cancel$(EXEEXT)'; \
+ b='unit/experimental/coro/cancel'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/coro/co_spawn.log: unit/experimental/coro/co_spawn$(EXEEXT)
+ @p='unit/experimental/coro/co_spawn$(EXEEXT)'; \
+ b='unit/experimental/coro/co_spawn'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/coro/exception.log: unit/experimental/coro/exception$(EXEEXT)
+ @p='unit/experimental/coro/exception$(EXEEXT)'; \
+ b='unit/experimental/coro/exception'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/coro/executor.log: unit/experimental/coro/executor$(EXEEXT)
+ @p='unit/experimental/coro/executor$(EXEEXT)'; \
+ b='unit/experimental/coro/executor'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/coro/partial.log: unit/experimental/coro/partial$(EXEEXT)
+ @p='unit/experimental/coro/partial$(EXEEXT)'; \
+ b='unit/experimental/coro/partial'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/coro/simple_test.log: unit/experimental/coro/simple_test$(EXEEXT)
+ @p='unit/experimental/coro/simple_test$(EXEEXT)'; \
+ b='unit/experimental/coro/simple_test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/coro/stack_test.log: unit/experimental/coro/stack_test$(EXEEXT)
+ @p='unit/experimental/coro/stack_test$(EXEEXT)'; \
+ b='unit/experimental/coro/stack_test'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/experimental/coro/use_coro.log: unit/experimental/coro/use_coro$(EXEEXT)
+ @p='unit/experimental/coro/use_coro$(EXEEXT)'; \
+ b='unit/experimental/coro/use_coro'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ssl/context_base.log: unit/ssl/context_base$(EXEEXT)
+ @p='unit/ssl/context_base$(EXEEXT)'; \
+ b='unit/ssl/context_base'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ssl/context.log: unit/ssl/context$(EXEEXT)
+ @p='unit/ssl/context$(EXEEXT)'; \
+ b='unit/ssl/context'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ssl/error.log: unit/ssl/error$(EXEEXT)
+ @p='unit/ssl/error$(EXEEXT)'; \
+ b='unit/ssl/error'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ssl/host_name_verification.log: unit/ssl/host_name_verification$(EXEEXT)
+ @p='unit/ssl/host_name_verification$(EXEEXT)'; \
+ b='unit/ssl/host_name_verification'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ssl/rfc2818_verification.log: unit/ssl/rfc2818_verification$(EXEEXT)
+ @p='unit/ssl/rfc2818_verification$(EXEEXT)'; \
+ b='unit/ssl/rfc2818_verification'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ssl/stream_base.log: unit/ssl/stream_base$(EXEEXT)
+ @p='unit/ssl/stream_base$(EXEEXT)'; \
+ b='unit/ssl/stream_base'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+unit/ssl/stream.log: unit/ssl/stream$(EXEEXT)
+ @p='unit/ssl/stream$(EXEEXT)'; \
+ b='unit/ssl/stream'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+ @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ $(am__make_dryrun) \
+ || test -d "$(distdir)/$$subdir" \
+ || $(MKDIR_P) "$(distdir)/$$subdir" \
+ || exit 1; \
+ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
+ $(am__relativize); \
+ new_distdir=$$reldir; \
+ dir1=$$subdir; dir2="$(top_distdir)"; \
+ $(am__relativize); \
+ new_top_distdir=$$reldir; \
+ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
+ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
+ ($(am__cd) $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$new_top_distdir" \
+ distdir="$$new_distdir" \
+ am__remove_distdir=: \
+ am__skip_length_check=: \
+ am__skip_mode_fix=: \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-recursive
+all-am: Makefile $(PROGRAMS) $(LIBRARIES) $(HEADERS)
+installdirs: installdirs-recursive
+installdirs-am:
+install: install-recursive
+install-exec: install-exec-recursive
+install-data: install-data-recursive
+uninstall: uninstall-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-recursive
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -rm -f ../$(DEPDIR)/$(am__dirstamp)
+ -rm -f ../$(am__dirstamp)
+ -rm -f latency/$(DEPDIR)/$(am__dirstamp)
+ -rm -f latency/$(am__dirstamp)
+ -rm -f performance/$(DEPDIR)/$(am__dirstamp)
+ -rm -f performance/$(am__dirstamp)
+ -rm -f unit/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unit/$(am__dirstamp)
+ -rm -f unit/execution/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unit/execution/$(am__dirstamp)
+ -rm -f unit/experimental/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unit/experimental/$(am__dirstamp)
+ -rm -f unit/experimental/coro/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unit/experimental/coro/$(am__dirstamp)
+ -rm -f unit/generic/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unit/generic/$(am__dirstamp)
+ -rm -f unit/ip/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unit/ip/$(am__dirstamp)
+ -rm -f unit/local/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unit/local/$(am__dirstamp)
+ -rm -f unit/posix/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unit/posix/$(am__dirstamp)
+ -rm -f unit/ssl/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unit/ssl/$(am__dirstamp)
+ -rm -f unit/ts/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unit/ts/$(am__dirstamp)
+ -rm -f unit/windows/$(DEPDIR)/$(am__dirstamp)
+ -rm -f unit/windows/$(am__dirstamp)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-recursive
+
+clean-am: clean-checkPROGRAMS clean-generic clean-noinstLIBRARIES \
+ clean-noinstPROGRAMS mostlyclean-am
+
+distclean: distclean-recursive
+ -rm -f ../$(DEPDIR)/asio.Po
+ -rm -f ../$(DEPDIR)/asio_ssl.Po
+ -rm -f latency/$(DEPDIR)/tcp_client.Po
+ -rm -f latency/$(DEPDIR)/tcp_server.Po
+ -rm -f latency/$(DEPDIR)/udp_client.Po
+ -rm -f latency/$(DEPDIR)/udp_server.Po
+ -rm -f performance/$(DEPDIR)/client.Po
+ -rm -f performance/$(DEPDIR)/server.Po
+ -rm -f unit/$(DEPDIR)/any_completion_executor.Po
+ -rm -f unit/$(DEPDIR)/any_completion_handler.Po
+ -rm -f unit/$(DEPDIR)/any_io_executor.Po
+ -rm -f unit/$(DEPDIR)/append.Po
+ -rm -f unit/$(DEPDIR)/as_tuple.Po
+ -rm -f unit/$(DEPDIR)/associated_allocator.Po
+ -rm -f unit/$(DEPDIR)/associated_cancellation_slot.Po
+ -rm -f unit/$(DEPDIR)/associated_executor.Po
+ -rm -f unit/$(DEPDIR)/associated_immediate_executor.Po
+ -rm -f unit/$(DEPDIR)/associator.Po
+ -rm -f unit/$(DEPDIR)/async_result.Po
+ -rm -f unit/$(DEPDIR)/awaitable.Po
+ -rm -f unit/$(DEPDIR)/basic_datagram_socket.Po
+ -rm -f unit/$(DEPDIR)/basic_deadline_timer.Po
+ -rm -f unit/$(DEPDIR)/basic_file.Po
+ -rm -f unit/$(DEPDIR)/basic_random_access_file.Po
+ -rm -f unit/$(DEPDIR)/basic_raw_socket.Po
+ -rm -f unit/$(DEPDIR)/basic_readable_pipe.Po
+ -rm -f unit/$(DEPDIR)/basic_seq_packet_socket.Po
+ -rm -f unit/$(DEPDIR)/basic_serial_port.Po
+ -rm -f unit/$(DEPDIR)/basic_signal_set.Po
+ -rm -f unit/$(DEPDIR)/basic_socket.Po
+ -rm -f unit/$(DEPDIR)/basic_socket_acceptor.Po
+ -rm -f unit/$(DEPDIR)/basic_stream_file.Po
+ -rm -f unit/$(DEPDIR)/basic_stream_socket.Po
+ -rm -f unit/$(DEPDIR)/basic_streambuf.Po
+ -rm -f unit/$(DEPDIR)/basic_waitable_timer.Po
+ -rm -f unit/$(DEPDIR)/basic_writable_pipe.Po
+ -rm -f unit/$(DEPDIR)/bind_allocator.Po
+ -rm -f unit/$(DEPDIR)/bind_cancellation_slot.Po
+ -rm -f unit/$(DEPDIR)/bind_executor.Po
+ -rm -f unit/$(DEPDIR)/bind_immediate_executor.Po
+ -rm -f unit/$(DEPDIR)/buffer.Po
+ -rm -f unit/$(DEPDIR)/buffer_registration.Po
+ -rm -f unit/$(DEPDIR)/buffered_read_stream.Po
+ -rm -f unit/$(DEPDIR)/buffered_stream.Po
+ -rm -f unit/$(DEPDIR)/buffered_write_stream.Po
+ -rm -f unit/$(DEPDIR)/buffers_iterator.Po
+ -rm -f unit/$(DEPDIR)/cancellation_signal.Po
+ -rm -f unit/$(DEPDIR)/cancellation_state.Po
+ -rm -f unit/$(DEPDIR)/cancellation_type.Po
+ -rm -f unit/$(DEPDIR)/co_spawn.Po
+ -rm -f unit/$(DEPDIR)/completion_condition.Po
+ -rm -f unit/$(DEPDIR)/compose.Po
+ -rm -f unit/$(DEPDIR)/connect.Po
+ -rm -f unit/$(DEPDIR)/connect_pipe.Po
+ -rm -f unit/$(DEPDIR)/consign.Po
+ -rm -f unit/$(DEPDIR)/coroutine.Po
+ -rm -f unit/$(DEPDIR)/deadline_timer.Po
+ -rm -f unit/$(DEPDIR)/defer.Po
+ -rm -f unit/$(DEPDIR)/deferred.Po
+ -rm -f unit/$(DEPDIR)/detached.Po
+ -rm -f unit/$(DEPDIR)/dispatch.Po
+ -rm -f unit/$(DEPDIR)/error.Po
+ -rm -f unit/$(DEPDIR)/execution_context.Po
+ -rm -f unit/$(DEPDIR)/executor.Po
+ -rm -f unit/$(DEPDIR)/executor_work_guard.Po
+ -rm -f unit/$(DEPDIR)/file_base.Po
+ -rm -f unit/$(DEPDIR)/high_resolution_timer.Po
+ -rm -f unit/$(DEPDIR)/io_context.Po
+ -rm -f unit/$(DEPDIR)/io_context_strand.Po
+ -rm -f unit/$(DEPDIR)/is_read_buffered.Po
+ -rm -f unit/$(DEPDIR)/is_write_buffered.Po
+ -rm -f unit/$(DEPDIR)/packaged_task.Po
+ -rm -f unit/$(DEPDIR)/placeholders.Po
+ -rm -f unit/$(DEPDIR)/post.Po
+ -rm -f unit/$(DEPDIR)/prepend.Po
+ -rm -f unit/$(DEPDIR)/random_access_file.Po
+ -rm -f unit/$(DEPDIR)/read.Po
+ -rm -f unit/$(DEPDIR)/read_at.Po
+ -rm -f unit/$(DEPDIR)/read_until.Po
+ -rm -f unit/$(DEPDIR)/readable_pipe.Po
+ -rm -f unit/$(DEPDIR)/recycling_allocator.Po
+ -rm -f unit/$(DEPDIR)/redirect_error.Po
+ -rm -f unit/$(DEPDIR)/registered_buffer.Po
+ -rm -f unit/$(DEPDIR)/serial_port.Po
+ -rm -f unit/$(DEPDIR)/serial_port_base.Po
+ -rm -f unit/$(DEPDIR)/signal_set.Po
+ -rm -f unit/$(DEPDIR)/signal_set_base.Po
+ -rm -f unit/$(DEPDIR)/socket_base.Po
+ -rm -f unit/$(DEPDIR)/static_thread_pool.Po
+ -rm -f unit/$(DEPDIR)/steady_timer.Po
+ -rm -f unit/$(DEPDIR)/strand.Po
+ -rm -f unit/$(DEPDIR)/stream_file.Po
+ -rm -f unit/$(DEPDIR)/streambuf.Po
+ -rm -f unit/$(DEPDIR)/system_context.Po
+ -rm -f unit/$(DEPDIR)/system_executor.Po
+ -rm -f unit/$(DEPDIR)/system_timer.Po
+ -rm -f unit/$(DEPDIR)/this_coro.Po
+ -rm -f unit/$(DEPDIR)/thread.Po
+ -rm -f unit/$(DEPDIR)/thread_pool.Po
+ -rm -f unit/$(DEPDIR)/time_traits.Po
+ -rm -f unit/$(DEPDIR)/use_awaitable.Po
+ -rm -f unit/$(DEPDIR)/use_future.Po
+ -rm -f unit/$(DEPDIR)/uses_executor.Po
+ -rm -f unit/$(DEPDIR)/wait_traits.Po
+ -rm -f unit/$(DEPDIR)/writable_pipe.Po
+ -rm -f unit/$(DEPDIR)/write.Po
+ -rm -f unit/$(DEPDIR)/write_at.Po
+ -rm -f unit/execution/$(DEPDIR)/any_executor.Po
+ -rm -f unit/execution/$(DEPDIR)/blocking.Po
+ -rm -f unit/execution/$(DEPDIR)/blocking_adaptation.Po
+ -rm -f unit/execution/$(DEPDIR)/context_as.Po
+ -rm -f unit/execution/$(DEPDIR)/executor.Po
+ -rm -f unit/execution/$(DEPDIR)/invocable_archetype.Po
+ -rm -f unit/execution/$(DEPDIR)/mapping.Po
+ -rm -f unit/execution/$(DEPDIR)/outstanding_work.Po
+ -rm -f unit/execution/$(DEPDIR)/prefer_only.Po
+ -rm -f unit/execution/$(DEPDIR)/relationship.Po
+ -rm -f unit/experimental/$(DEPDIR)/awaitable_operators.Po
+ -rm -f unit/experimental/$(DEPDIR)/basic_channel.Po
+ -rm -f unit/experimental/$(DEPDIR)/basic_concurrent_channel.Po
+ -rm -f unit/experimental/$(DEPDIR)/channel.Po
+ -rm -f unit/experimental/$(DEPDIR)/channel_traits.Po
+ -rm -f unit/experimental/$(DEPDIR)/co_composed.Po
+ -rm -f unit/experimental/$(DEPDIR)/concurrent_channel.Po
+ -rm -f unit/experimental/$(DEPDIR)/parallel_group.Po
+ -rm -f unit/experimental/$(DEPDIR)/promise.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/allocator.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/cancel.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/co_spawn.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/exception.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/executor.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/partial.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/simple_test.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/stack_test.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/use_coro.Po
+ -rm -f unit/generic/$(DEPDIR)/basic_endpoint.Po
+ -rm -f unit/generic/$(DEPDIR)/datagram_protocol.Po
+ -rm -f unit/generic/$(DEPDIR)/raw_protocol.Po
+ -rm -f unit/generic/$(DEPDIR)/seq_packet_protocol.Po
+ -rm -f unit/generic/$(DEPDIR)/stream_protocol.Po
+ -rm -f unit/ip/$(DEPDIR)/address.Po
+ -rm -f unit/ip/$(DEPDIR)/address_v4.Po
+ -rm -f unit/ip/$(DEPDIR)/address_v4_iterator.Po
+ -rm -f unit/ip/$(DEPDIR)/address_v4_range.Po
+ -rm -f unit/ip/$(DEPDIR)/address_v6.Po
+ -rm -f unit/ip/$(DEPDIR)/address_v6_iterator.Po
+ -rm -f unit/ip/$(DEPDIR)/address_v6_range.Po
+ -rm -f unit/ip/$(DEPDIR)/basic_endpoint.Po
+ -rm -f unit/ip/$(DEPDIR)/basic_resolver.Po
+ -rm -f unit/ip/$(DEPDIR)/basic_resolver_entry.Po
+ -rm -f unit/ip/$(DEPDIR)/basic_resolver_iterator.Po
+ -rm -f unit/ip/$(DEPDIR)/basic_resolver_query.Po
+ -rm -f unit/ip/$(DEPDIR)/host_name.Po
+ -rm -f unit/ip/$(DEPDIR)/icmp.Po
+ -rm -f unit/ip/$(DEPDIR)/multicast.Po
+ -rm -f unit/ip/$(DEPDIR)/network_v4.Po
+ -rm -f unit/ip/$(DEPDIR)/network_v6.Po
+ -rm -f unit/ip/$(DEPDIR)/resolver_query_base.Po
+ -rm -f unit/ip/$(DEPDIR)/tcp.Po
+ -rm -f unit/ip/$(DEPDIR)/udp.Po
+ -rm -f unit/ip/$(DEPDIR)/unicast.Po
+ -rm -f unit/ip/$(DEPDIR)/v6_only.Po
+ -rm -f unit/local/$(DEPDIR)/basic_endpoint.Po
+ -rm -f unit/local/$(DEPDIR)/connect_pair.Po
+ -rm -f unit/local/$(DEPDIR)/datagram_protocol.Po
+ -rm -f unit/local/$(DEPDIR)/seq_packet_protocol.Po
+ -rm -f unit/local/$(DEPDIR)/stream_protocol.Po
+ -rm -f unit/posix/$(DEPDIR)/basic_descriptor.Po
+ -rm -f unit/posix/$(DEPDIR)/basic_stream_descriptor.Po
+ -rm -f unit/posix/$(DEPDIR)/descriptor.Po
+ -rm -f unit/posix/$(DEPDIR)/descriptor_base.Po
+ -rm -f unit/posix/$(DEPDIR)/stream_descriptor.Po
+ -rm -f unit/ssl/$(DEPDIR)/context.Po
+ -rm -f unit/ssl/$(DEPDIR)/context_base.Po
+ -rm -f unit/ssl/$(DEPDIR)/error.Po
+ -rm -f unit/ssl/$(DEPDIR)/host_name_verification.Po
+ -rm -f unit/ssl/$(DEPDIR)/rfc2818_verification.Po
+ -rm -f unit/ssl/$(DEPDIR)/stream.Po
+ -rm -f unit/ssl/$(DEPDIR)/stream_base.Po
+ -rm -f unit/ts/$(DEPDIR)/buffer.Po
+ -rm -f unit/ts/$(DEPDIR)/executor.Po
+ -rm -f unit/ts/$(DEPDIR)/internet.Po
+ -rm -f unit/ts/$(DEPDIR)/io_context.Po
+ -rm -f unit/ts/$(DEPDIR)/net.Po
+ -rm -f unit/ts/$(DEPDIR)/netfwd.Po
+ -rm -f unit/ts/$(DEPDIR)/socket.Po
+ -rm -f unit/ts/$(DEPDIR)/timer.Po
+ -rm -f unit/windows/$(DEPDIR)/basic_object_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/basic_overlapped_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/basic_random_access_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/basic_stream_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/object_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/overlapped_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/overlapped_ptr.Po
+ -rm -f unit/windows/$(DEPDIR)/random_access_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/stream_handle.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+html-am:
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-recursive
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-recursive
+
+install-html-am:
+
+install-info: install-info-recursive
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-recursive
+
+install-pdf-am:
+
+install-ps: install-ps-recursive
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f ../$(DEPDIR)/asio.Po
+ -rm -f ../$(DEPDIR)/asio_ssl.Po
+ -rm -f latency/$(DEPDIR)/tcp_client.Po
+ -rm -f latency/$(DEPDIR)/tcp_server.Po
+ -rm -f latency/$(DEPDIR)/udp_client.Po
+ -rm -f latency/$(DEPDIR)/udp_server.Po
+ -rm -f performance/$(DEPDIR)/client.Po
+ -rm -f performance/$(DEPDIR)/server.Po
+ -rm -f unit/$(DEPDIR)/any_completion_executor.Po
+ -rm -f unit/$(DEPDIR)/any_completion_handler.Po
+ -rm -f unit/$(DEPDIR)/any_io_executor.Po
+ -rm -f unit/$(DEPDIR)/append.Po
+ -rm -f unit/$(DEPDIR)/as_tuple.Po
+ -rm -f unit/$(DEPDIR)/associated_allocator.Po
+ -rm -f unit/$(DEPDIR)/associated_cancellation_slot.Po
+ -rm -f unit/$(DEPDIR)/associated_executor.Po
+ -rm -f unit/$(DEPDIR)/associated_immediate_executor.Po
+ -rm -f unit/$(DEPDIR)/associator.Po
+ -rm -f unit/$(DEPDIR)/async_result.Po
+ -rm -f unit/$(DEPDIR)/awaitable.Po
+ -rm -f unit/$(DEPDIR)/basic_datagram_socket.Po
+ -rm -f unit/$(DEPDIR)/basic_deadline_timer.Po
+ -rm -f unit/$(DEPDIR)/basic_file.Po
+ -rm -f unit/$(DEPDIR)/basic_random_access_file.Po
+ -rm -f unit/$(DEPDIR)/basic_raw_socket.Po
+ -rm -f unit/$(DEPDIR)/basic_readable_pipe.Po
+ -rm -f unit/$(DEPDIR)/basic_seq_packet_socket.Po
+ -rm -f unit/$(DEPDIR)/basic_serial_port.Po
+ -rm -f unit/$(DEPDIR)/basic_signal_set.Po
+ -rm -f unit/$(DEPDIR)/basic_socket.Po
+ -rm -f unit/$(DEPDIR)/basic_socket_acceptor.Po
+ -rm -f unit/$(DEPDIR)/basic_stream_file.Po
+ -rm -f unit/$(DEPDIR)/basic_stream_socket.Po
+ -rm -f unit/$(DEPDIR)/basic_streambuf.Po
+ -rm -f unit/$(DEPDIR)/basic_waitable_timer.Po
+ -rm -f unit/$(DEPDIR)/basic_writable_pipe.Po
+ -rm -f unit/$(DEPDIR)/bind_allocator.Po
+ -rm -f unit/$(DEPDIR)/bind_cancellation_slot.Po
+ -rm -f unit/$(DEPDIR)/bind_executor.Po
+ -rm -f unit/$(DEPDIR)/bind_immediate_executor.Po
+ -rm -f unit/$(DEPDIR)/buffer.Po
+ -rm -f unit/$(DEPDIR)/buffer_registration.Po
+ -rm -f unit/$(DEPDIR)/buffered_read_stream.Po
+ -rm -f unit/$(DEPDIR)/buffered_stream.Po
+ -rm -f unit/$(DEPDIR)/buffered_write_stream.Po
+ -rm -f unit/$(DEPDIR)/buffers_iterator.Po
+ -rm -f unit/$(DEPDIR)/cancellation_signal.Po
+ -rm -f unit/$(DEPDIR)/cancellation_state.Po
+ -rm -f unit/$(DEPDIR)/cancellation_type.Po
+ -rm -f unit/$(DEPDIR)/co_spawn.Po
+ -rm -f unit/$(DEPDIR)/completion_condition.Po
+ -rm -f unit/$(DEPDIR)/compose.Po
+ -rm -f unit/$(DEPDIR)/connect.Po
+ -rm -f unit/$(DEPDIR)/connect_pipe.Po
+ -rm -f unit/$(DEPDIR)/consign.Po
+ -rm -f unit/$(DEPDIR)/coroutine.Po
+ -rm -f unit/$(DEPDIR)/deadline_timer.Po
+ -rm -f unit/$(DEPDIR)/defer.Po
+ -rm -f unit/$(DEPDIR)/deferred.Po
+ -rm -f unit/$(DEPDIR)/detached.Po
+ -rm -f unit/$(DEPDIR)/dispatch.Po
+ -rm -f unit/$(DEPDIR)/error.Po
+ -rm -f unit/$(DEPDIR)/execution_context.Po
+ -rm -f unit/$(DEPDIR)/executor.Po
+ -rm -f unit/$(DEPDIR)/executor_work_guard.Po
+ -rm -f unit/$(DEPDIR)/file_base.Po
+ -rm -f unit/$(DEPDIR)/high_resolution_timer.Po
+ -rm -f unit/$(DEPDIR)/io_context.Po
+ -rm -f unit/$(DEPDIR)/io_context_strand.Po
+ -rm -f unit/$(DEPDIR)/is_read_buffered.Po
+ -rm -f unit/$(DEPDIR)/is_write_buffered.Po
+ -rm -f unit/$(DEPDIR)/packaged_task.Po
+ -rm -f unit/$(DEPDIR)/placeholders.Po
+ -rm -f unit/$(DEPDIR)/post.Po
+ -rm -f unit/$(DEPDIR)/prepend.Po
+ -rm -f unit/$(DEPDIR)/random_access_file.Po
+ -rm -f unit/$(DEPDIR)/read.Po
+ -rm -f unit/$(DEPDIR)/read_at.Po
+ -rm -f unit/$(DEPDIR)/read_until.Po
+ -rm -f unit/$(DEPDIR)/readable_pipe.Po
+ -rm -f unit/$(DEPDIR)/recycling_allocator.Po
+ -rm -f unit/$(DEPDIR)/redirect_error.Po
+ -rm -f unit/$(DEPDIR)/registered_buffer.Po
+ -rm -f unit/$(DEPDIR)/serial_port.Po
+ -rm -f unit/$(DEPDIR)/serial_port_base.Po
+ -rm -f unit/$(DEPDIR)/signal_set.Po
+ -rm -f unit/$(DEPDIR)/signal_set_base.Po
+ -rm -f unit/$(DEPDIR)/socket_base.Po
+ -rm -f unit/$(DEPDIR)/static_thread_pool.Po
+ -rm -f unit/$(DEPDIR)/steady_timer.Po
+ -rm -f unit/$(DEPDIR)/strand.Po
+ -rm -f unit/$(DEPDIR)/stream_file.Po
+ -rm -f unit/$(DEPDIR)/streambuf.Po
+ -rm -f unit/$(DEPDIR)/system_context.Po
+ -rm -f unit/$(DEPDIR)/system_executor.Po
+ -rm -f unit/$(DEPDIR)/system_timer.Po
+ -rm -f unit/$(DEPDIR)/this_coro.Po
+ -rm -f unit/$(DEPDIR)/thread.Po
+ -rm -f unit/$(DEPDIR)/thread_pool.Po
+ -rm -f unit/$(DEPDIR)/time_traits.Po
+ -rm -f unit/$(DEPDIR)/use_awaitable.Po
+ -rm -f unit/$(DEPDIR)/use_future.Po
+ -rm -f unit/$(DEPDIR)/uses_executor.Po
+ -rm -f unit/$(DEPDIR)/wait_traits.Po
+ -rm -f unit/$(DEPDIR)/writable_pipe.Po
+ -rm -f unit/$(DEPDIR)/write.Po
+ -rm -f unit/$(DEPDIR)/write_at.Po
+ -rm -f unit/execution/$(DEPDIR)/any_executor.Po
+ -rm -f unit/execution/$(DEPDIR)/blocking.Po
+ -rm -f unit/execution/$(DEPDIR)/blocking_adaptation.Po
+ -rm -f unit/execution/$(DEPDIR)/context_as.Po
+ -rm -f unit/execution/$(DEPDIR)/executor.Po
+ -rm -f unit/execution/$(DEPDIR)/invocable_archetype.Po
+ -rm -f unit/execution/$(DEPDIR)/mapping.Po
+ -rm -f unit/execution/$(DEPDIR)/outstanding_work.Po
+ -rm -f unit/execution/$(DEPDIR)/prefer_only.Po
+ -rm -f unit/execution/$(DEPDIR)/relationship.Po
+ -rm -f unit/experimental/$(DEPDIR)/awaitable_operators.Po
+ -rm -f unit/experimental/$(DEPDIR)/basic_channel.Po
+ -rm -f unit/experimental/$(DEPDIR)/basic_concurrent_channel.Po
+ -rm -f unit/experimental/$(DEPDIR)/channel.Po
+ -rm -f unit/experimental/$(DEPDIR)/channel_traits.Po
+ -rm -f unit/experimental/$(DEPDIR)/co_composed.Po
+ -rm -f unit/experimental/$(DEPDIR)/concurrent_channel.Po
+ -rm -f unit/experimental/$(DEPDIR)/parallel_group.Po
+ -rm -f unit/experimental/$(DEPDIR)/promise.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/allocator.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/cancel.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/co_spawn.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/exception.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/executor.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/partial.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/simple_test.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/stack_test.Po
+ -rm -f unit/experimental/coro/$(DEPDIR)/use_coro.Po
+ -rm -f unit/generic/$(DEPDIR)/basic_endpoint.Po
+ -rm -f unit/generic/$(DEPDIR)/datagram_protocol.Po
+ -rm -f unit/generic/$(DEPDIR)/raw_protocol.Po
+ -rm -f unit/generic/$(DEPDIR)/seq_packet_protocol.Po
+ -rm -f unit/generic/$(DEPDIR)/stream_protocol.Po
+ -rm -f unit/ip/$(DEPDIR)/address.Po
+ -rm -f unit/ip/$(DEPDIR)/address_v4.Po
+ -rm -f unit/ip/$(DEPDIR)/address_v4_iterator.Po
+ -rm -f unit/ip/$(DEPDIR)/address_v4_range.Po
+ -rm -f unit/ip/$(DEPDIR)/address_v6.Po
+ -rm -f unit/ip/$(DEPDIR)/address_v6_iterator.Po
+ -rm -f unit/ip/$(DEPDIR)/address_v6_range.Po
+ -rm -f unit/ip/$(DEPDIR)/basic_endpoint.Po
+ -rm -f unit/ip/$(DEPDIR)/basic_resolver.Po
+ -rm -f unit/ip/$(DEPDIR)/basic_resolver_entry.Po
+ -rm -f unit/ip/$(DEPDIR)/basic_resolver_iterator.Po
+ -rm -f unit/ip/$(DEPDIR)/basic_resolver_query.Po
+ -rm -f unit/ip/$(DEPDIR)/host_name.Po
+ -rm -f unit/ip/$(DEPDIR)/icmp.Po
+ -rm -f unit/ip/$(DEPDIR)/multicast.Po
+ -rm -f unit/ip/$(DEPDIR)/network_v4.Po
+ -rm -f unit/ip/$(DEPDIR)/network_v6.Po
+ -rm -f unit/ip/$(DEPDIR)/resolver_query_base.Po
+ -rm -f unit/ip/$(DEPDIR)/tcp.Po
+ -rm -f unit/ip/$(DEPDIR)/udp.Po
+ -rm -f unit/ip/$(DEPDIR)/unicast.Po
+ -rm -f unit/ip/$(DEPDIR)/v6_only.Po
+ -rm -f unit/local/$(DEPDIR)/basic_endpoint.Po
+ -rm -f unit/local/$(DEPDIR)/connect_pair.Po
+ -rm -f unit/local/$(DEPDIR)/datagram_protocol.Po
+ -rm -f unit/local/$(DEPDIR)/seq_packet_protocol.Po
+ -rm -f unit/local/$(DEPDIR)/stream_protocol.Po
+ -rm -f unit/posix/$(DEPDIR)/basic_descriptor.Po
+ -rm -f unit/posix/$(DEPDIR)/basic_stream_descriptor.Po
+ -rm -f unit/posix/$(DEPDIR)/descriptor.Po
+ -rm -f unit/posix/$(DEPDIR)/descriptor_base.Po
+ -rm -f unit/posix/$(DEPDIR)/stream_descriptor.Po
+ -rm -f unit/ssl/$(DEPDIR)/context.Po
+ -rm -f unit/ssl/$(DEPDIR)/context_base.Po
+ -rm -f unit/ssl/$(DEPDIR)/error.Po
+ -rm -f unit/ssl/$(DEPDIR)/host_name_verification.Po
+ -rm -f unit/ssl/$(DEPDIR)/rfc2818_verification.Po
+ -rm -f unit/ssl/$(DEPDIR)/stream.Po
+ -rm -f unit/ssl/$(DEPDIR)/stream_base.Po
+ -rm -f unit/ts/$(DEPDIR)/buffer.Po
+ -rm -f unit/ts/$(DEPDIR)/executor.Po
+ -rm -f unit/ts/$(DEPDIR)/internet.Po
+ -rm -f unit/ts/$(DEPDIR)/io_context.Po
+ -rm -f unit/ts/$(DEPDIR)/net.Po
+ -rm -f unit/ts/$(DEPDIR)/netfwd.Po
+ -rm -f unit/ts/$(DEPDIR)/socket.Po
+ -rm -f unit/ts/$(DEPDIR)/timer.Po
+ -rm -f unit/windows/$(DEPDIR)/basic_object_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/basic_overlapped_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/basic_random_access_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/basic_stream_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/object_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/overlapped_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/overlapped_ptr.Po
+ -rm -f unit/windows/$(DEPDIR)/random_access_handle.Po
+ -rm -f unit/windows/$(DEPDIR)/stream_handle.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-recursive
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-recursive
+
+pdf-am:
+
+ps: ps-recursive
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: $(am__recursive_targets) check-am install-am install-strip
+
+.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \
+ am--depfiles check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-noinstLIBRARIES \
+ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \
+ distclean-compile distclean-generic distclean-tags distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-man install-pdf \
+ install-pdf-am install-ps install-ps-am install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/3rdparty/asio/src/tests/latency/allocator.hpp b/3rdparty/asio/src/tests/latency/allocator.hpp
new file mode 100644
index 00000000000..2b186aef8ec
--- /dev/null
+++ b/3rdparty/asio/src/tests/latency/allocator.hpp
@@ -0,0 +1,52 @@
+//
+// allocator.hpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ALLOCATOR_HPP
+#define ALLOCATOR_HPP
+
+#include <boost/aligned_storage.hpp>
+
+// Represents a single connection from a client.
+class allocator
+{
+public:
+ allocator()
+ : in_use_(false)
+ {
+ }
+
+ void* allocate(std::size_t n)
+ {
+ if (in_use_ || n >= 1024)
+ return ::operator new(n);
+ in_use_ = true;
+ return static_cast<void*>(&space_);
+ }
+
+ void deallocate(void* p)
+ {
+ if (p != static_cast<void*>(&space_))
+ ::operator delete(p);
+ else
+ in_use_ = false;
+ }
+
+private:
+ allocator(const allocator&);
+ allocator& operator=(const allocator&);
+
+ // Whether the reusable memory space is currently in use.
+ bool in_use_;
+
+ // The reusable memory space made available by the allocator.
+ boost::aligned_storage<1024>::type space_;
+};
+
+#endif // ALLOCATOR_HPP
diff --git a/3rdparty/asio/src/tests/latency/high_res_clock.hpp b/3rdparty/asio/src/tests/latency/high_res_clock.hpp
new file mode 100644
index 00000000000..a497834d6d8
--- /dev/null
+++ b/3rdparty/asio/src/tests/latency/high_res_clock.hpp
@@ -0,0 +1,53 @@
+//
+// high_res_clock.hpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HIGH_RES_CLOCK_HPP
+#define HIGH_RES_CLOCK_HPP
+
+#include <boost/config.hpp>
+#include <boost/cstdint.hpp>
+
+#if defined(ASIO_WINDOWS)
+
+inline boost::uint64_t high_res_clock()
+{
+ LARGE_INTEGER i;
+ QueryPerformanceCounter(&i);
+ return i.QuadPart;
+}
+
+#elif defined(__GNUC__) && defined(__x86_64__)
+
+inline boost::uint64_t high_res_clock()
+{
+ unsigned long low, high;
+ __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high));
+ return (((boost::uint64_t)high) << 32) | low;
+}
+
+#else
+
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+inline boost::uint64_t high_res_clock()
+{
+ boost::posix_time::ptime now =
+ boost::posix_time::microsec_clock::universal_time();
+
+ boost::posix_time::ptime epoch(
+ boost::gregorian::date(1970, 1, 1),
+ boost::posix_time::seconds(0));
+
+ return (now - epoch).total_microseconds();
+}
+
+#endif
+
+#endif // HIGH_RES_CLOCK_HPP
diff --git a/3rdparty/asio/src/tests/latency/tcp_client.cpp b/3rdparty/asio/src/tests/latency/tcp_client.cpp
new file mode 100644
index 00000000000..2a4c5b7640f
--- /dev/null
+++ b/3rdparty/asio/src/tests/latency/tcp_client.cpp
@@ -0,0 +1,124 @@
+//
+// tcp_client.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/ip/tcp.hpp>
+#include <asio/read.hpp>
+#include <asio/write.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <boost/shared_ptr.hpp>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <vector>
+#include "high_res_clock.hpp"
+
+using asio::ip::tcp;
+using boost::posix_time::ptime;
+using boost::posix_time::microsec_clock;
+
+const int num_samples = 100000;
+
+struct transfer_all
+{
+ typedef std::size_t result_type;
+ std::size_t operator()(const asio::error_code& ec, std::size_t)
+ {
+ return (ec && ec != asio::error::would_block) ? 0 : ~0;
+ }
+};
+
+int main(int argc, char* argv[])
+{
+ if (argc != 6)
+ {
+ std::fprintf(stderr,
+ "Usage: tcp_client <ip> <port> "
+ "<nconns> <bufsize> {spin|block}\n");
+ return 1;
+ }
+
+ const char* ip = argv[1];
+ unsigned short port = static_cast<unsigned short>(std::atoi(argv[2]));
+ int num_connections = std::atoi(argv[3]);
+ std::size_t buf_size = static_cast<std::size_t>(std::atoi(argv[4]));
+ bool spin = (std::strcmp(argv[5], "spin") == 0);
+
+ asio::io_context io_context;
+ std::vector<boost::shared_ptr<tcp::socket> > sockets;
+
+ for (int i = 0; i < num_connections; ++i)
+ {
+ boost::shared_ptr<tcp::socket> s(new tcp::socket(io_context));
+
+ tcp::endpoint target(asio::ip::make_address(ip), port);
+ s->connect(target);
+
+ s->set_option(tcp::no_delay(true));
+
+ if (spin)
+ {
+ s->non_blocking(true);
+ }
+
+ sockets.push_back(s);
+ }
+
+ std::vector<unsigned char> write_buf(buf_size);
+ std::vector<unsigned char> read_buf(buf_size);
+
+ ptime start = microsec_clock::universal_time();
+ boost::uint64_t start_hr = high_res_clock();
+
+ boost::uint64_t samples[num_samples];
+ for (int i = 0; i < num_samples; ++i)
+ {
+ tcp::socket& socket = *sockets[i % num_connections];
+
+ boost::uint64_t t = high_res_clock();
+
+ asio::error_code ec;
+ asio::write(socket,
+ asio::buffer(write_buf),
+ transfer_all(), ec);
+
+ asio::read(socket,
+ asio::buffer(read_buf),
+ transfer_all(), ec);
+
+ samples[i] = high_res_clock() - t;
+ }
+
+ ptime stop = microsec_clock::universal_time();
+ boost::uint64_t stop_hr = high_res_clock();
+ boost::uint64_t elapsed_usec = (stop - start).total_microseconds();
+ boost::uint64_t elapsed_hr = stop_hr - start_hr;
+ double scale = 1.0 * elapsed_usec / elapsed_hr;
+
+ std::sort(samples, samples + num_samples);
+ std::printf(" 0.0%%\t%f\n", samples[0] * scale);
+ std::printf(" 0.1%%\t%f\n", samples[num_samples / 1000 - 1] * scale);
+ std::printf(" 1.0%%\t%f\n", samples[num_samples / 100 - 1] * scale);
+ std::printf(" 10.0%%\t%f\n", samples[num_samples / 10 - 1] * scale);
+ std::printf(" 20.0%%\t%f\n", samples[num_samples * 2 / 10 - 1] * scale);
+ std::printf(" 30.0%%\t%f\n", samples[num_samples * 3 / 10 - 1] * scale);
+ std::printf(" 40.0%%\t%f\n", samples[num_samples * 4 / 10 - 1] * scale);
+ std::printf(" 50.0%%\t%f\n", samples[num_samples * 5 / 10 - 1] * scale);
+ std::printf(" 60.0%%\t%f\n", samples[num_samples * 6 / 10 - 1] * scale);
+ std::printf(" 70.0%%\t%f\n", samples[num_samples * 7 / 10 - 1] * scale);
+ std::printf(" 80.0%%\t%f\n", samples[num_samples * 8 / 10 - 1] * scale);
+ std::printf(" 90.0%%\t%f\n", samples[num_samples * 9 / 10 - 1] * scale);
+ std::printf(" 99.0%%\t%f\n", samples[num_samples * 99 / 100 - 1] * scale);
+ std::printf(" 99.9%%\t%f\n", samples[num_samples * 999 / 1000 - 1] * scale);
+ std::printf("100.0%%\t%f\n", samples[num_samples - 1] * scale);
+
+ double total = 0.0;
+ for (int i = 0; i < num_samples; ++i) total += samples[i] * scale;
+ std::printf(" mean\t%f\n", total / num_samples);
+}
diff --git a/3rdparty/asio/src/tests/latency/tcp_server.cpp b/3rdparty/asio/src/tests/latency/tcp_server.cpp
new file mode 100644
index 00000000000..c26c8509a45
--- /dev/null
+++ b/3rdparty/asio/src/tests/latency/tcp_server.cpp
@@ -0,0 +1,114 @@
+//
+// tcp_server.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/io_context.hpp>
+#include <asio/ip/tcp.hpp>
+#include <asio/read.hpp>
+#include <asio/write.hpp>
+#include <boost/shared_ptr.hpp>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <vector>
+
+using asio::ip::tcp;
+
+#include <asio/yield.hpp>
+
+class tcp_server : asio::coroutine
+{
+public:
+ tcp_server(tcp::acceptor& acceptor, std::size_t buf_size) :
+ acceptor_(acceptor),
+ socket_(acceptor_.get_executor()),
+ buffer_(buf_size)
+ {
+ }
+
+ void operator()(asio::error_code ec, std::size_t n = 0)
+ {
+ reenter (this) for (;;)
+ {
+ yield acceptor_.async_accept(socket_, ref(this));
+
+ while (!ec)
+ {
+ yield asio::async_read(socket_,
+ asio::buffer(buffer_), ref(this));
+
+ if (!ec)
+ {
+ for (std::size_t i = 0; i < n; ++i) buffer_[i] = ~buffer_[i];
+
+ yield asio::async_write(socket_,
+ asio::buffer(buffer_), ref(this));
+ }
+ }
+
+ socket_.close();
+ }
+ }
+
+ struct ref
+ {
+ explicit ref(tcp_server* p)
+ : p_(p)
+ {
+ }
+
+ void operator()(asio::error_code ec, std::size_t n = 0)
+ {
+ (*p_)(ec, n);
+ }
+
+ private:
+ tcp_server* p_;
+ };
+
+private:
+ tcp::acceptor& acceptor_;
+ tcp::socket socket_;
+ std::vector<unsigned char> buffer_;
+ tcp::endpoint sender_;
+};
+
+#include <asio/unyield.hpp>
+
+int main(int argc, char* argv[])
+{
+ if (argc != 5)
+ {
+ std::fprintf(stderr,
+ "Usage: tcp_server <port> <nconns> "
+ "<bufsize> {spin|block}\n");
+ return 1;
+ }
+
+ unsigned short port = static_cast<unsigned short>(std::atoi(argv[1]));
+ int max_connections = std::atoi(argv[2]);
+ std::size_t buf_size = std::atoi(argv[3]);
+ bool spin = (std::strcmp(argv[4], "spin") == 0);
+
+ asio::io_context io_context(1);
+ tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), port));
+ std::vector<boost::shared_ptr<tcp_server> > servers;
+
+ for (int i = 0; i < max_connections; ++i)
+ {
+ boost::shared_ptr<tcp_server> s(new tcp_server(acceptor, buf_size));
+ servers.push_back(s);
+ (*s)(asio::error_code());
+ }
+
+ if (spin)
+ for (;;) io_context.poll();
+ else
+ io_context.run();
+}
diff --git a/3rdparty/asio/src/tests/latency/udp_client.cpp b/3rdparty/asio/src/tests/latency/udp_client.cpp
new file mode 100644
index 00000000000..484ba085cd8
--- /dev/null
+++ b/3rdparty/asio/src/tests/latency/udp_client.cpp
@@ -0,0 +1,104 @@
+//
+// udp_client.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/ip/udp.hpp>
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <algorithm>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <vector>
+#include "high_res_clock.hpp"
+
+using asio::ip::udp;
+using boost::posix_time::ptime;
+using boost::posix_time::microsec_clock;
+
+const int num_samples = 100000;
+
+int main(int argc, char* argv[])
+{
+ if (argc != 6)
+ {
+ std::fprintf(stderr,
+ "Usage: udp_client <ip> <port1> "
+ "<nports> <bufsize> {spin|block}\n");
+ return 1;
+ }
+
+ const char* ip = argv[1];
+ unsigned short first_port = static_cast<unsigned short>(std::atoi(argv[2]));
+ unsigned short num_ports = static_cast<unsigned short>(std::atoi(argv[3]));
+ std::size_t buf_size = static_cast<std::size_t>(std::atoi(argv[4]));
+ bool spin = (std::strcmp(argv[5], "spin") == 0);
+
+ asio::io_context io_context;
+
+ udp::socket socket(io_context, udp::endpoint(udp::v4(), 0));
+
+ if (spin)
+ {
+ socket.non_blocking(true);
+ }
+
+ udp::endpoint target(asio::ip::make_address(ip), first_port);
+ unsigned short last_port = first_port + num_ports - 1;
+ std::vector<unsigned char> write_buf(buf_size);
+ std::vector<unsigned char> read_buf(buf_size);
+
+ ptime start = microsec_clock::universal_time();
+ boost::uint64_t start_hr = high_res_clock();
+
+ boost::uint64_t samples[num_samples];
+ for (int i = 0; i < num_samples; ++i)
+ {
+ boost::uint64_t t = high_res_clock();
+
+ asio::error_code ec;
+ socket.send_to(asio::buffer(write_buf), target, 0, ec);
+
+ do socket.receive(asio::buffer(read_buf), 0, ec);
+ while (ec == asio::error::would_block);
+
+ samples[i] = high_res_clock() - t;
+
+ if (target.port() == last_port)
+ target.port(first_port);
+ else
+ target.port(target.port() + 1);
+ }
+
+ ptime stop = microsec_clock::universal_time();
+ boost::uint64_t stop_hr = high_res_clock();
+ boost::uint64_t elapsed_usec = (stop - start).total_microseconds();
+ boost::uint64_t elapsed_hr = stop_hr - start_hr;
+ double scale = 1.0 * elapsed_usec / elapsed_hr;
+
+ std::sort(samples, samples + num_samples);
+ std::printf(" 0.0%%\t%f\n", samples[0] * scale);
+ std::printf(" 0.1%%\t%f\n", samples[num_samples / 1000 - 1] * scale);
+ std::printf(" 1.0%%\t%f\n", samples[num_samples / 100 - 1] * scale);
+ std::printf(" 10.0%%\t%f\n", samples[num_samples / 10 - 1] * scale);
+ std::printf(" 20.0%%\t%f\n", samples[num_samples * 2 / 10 - 1] * scale);
+ std::printf(" 30.0%%\t%f\n", samples[num_samples * 3 / 10 - 1] * scale);
+ std::printf(" 40.0%%\t%f\n", samples[num_samples * 4 / 10 - 1] * scale);
+ std::printf(" 50.0%%\t%f\n", samples[num_samples * 5 / 10 - 1] * scale);
+ std::printf(" 60.0%%\t%f\n", samples[num_samples * 6 / 10 - 1] * scale);
+ std::printf(" 70.0%%\t%f\n", samples[num_samples * 7 / 10 - 1] * scale);
+ std::printf(" 80.0%%\t%f\n", samples[num_samples * 8 / 10 - 1] * scale);
+ std::printf(" 90.0%%\t%f\n", samples[num_samples * 9 / 10 - 1] * scale);
+ std::printf(" 99.0%%\t%f\n", samples[num_samples * 99 / 100 - 1] * scale);
+ std::printf(" 99.9%%\t%f\n", samples[num_samples * 999 / 1000 - 1] * scale);
+ std::printf("100.0%%\t%f\n", samples[num_samples - 1] * scale);
+
+ double total = 0.0;
+ for (int i = 0; i < num_samples; ++i) total += samples[i] * scale;
+ std::printf(" mean\t%f\n", total / num_samples);
+}
diff --git a/3rdparty/asio/src/tests/latency/udp_server.cpp b/3rdparty/asio/src/tests/latency/udp_server.cpp
new file mode 100644
index 00000000000..13483fab76f
--- /dev/null
+++ b/3rdparty/asio/src/tests/latency/udp_server.cpp
@@ -0,0 +1,125 @@
+//
+// udp_server.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 <asio/io_context.hpp>
+#include <asio/ip/udp.hpp>
+#include <boost/shared_ptr.hpp>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
+#include <vector>
+#include "allocator.hpp"
+
+using asio::ip::udp;
+
+#include <asio/yield.hpp>
+
+class udp_server : asio::coroutine
+{
+public:
+ udp_server(asio::io_context& io_context,
+ unsigned short port, std::size_t buf_size) :
+ socket_(io_context, udp::endpoint(udp::v4(), port)),
+ buffer_(buf_size)
+ {
+ }
+
+ void operator()(asio::error_code ec, std::size_t n = 0)
+ {
+ reenter (this) for (;;)
+ {
+ yield socket_.async_receive_from(
+ asio::buffer(buffer_),
+ sender_, ref(this));
+
+ if (!ec)
+ {
+ for (std::size_t i = 0; i < n; ++i) buffer_[i] = ~buffer_[i];
+ socket_.send_to(asio::buffer(buffer_, n), sender_, 0, ec);
+ }
+ }
+ }
+
+ friend void* asio_handler_allocate(std::size_t n, udp_server* s)
+ {
+ return s->allocator_.allocate(n);
+ }
+
+ friend void asio_handler_deallocate(void* p, std::size_t, udp_server* s)
+ {
+ s->allocator_.deallocate(p);
+ }
+
+ struct ref
+ {
+ explicit ref(udp_server* p)
+ : p_(p)
+ {
+ }
+
+ void operator()(asio::error_code ec, std::size_t n = 0)
+ {
+ (*p_)(ec, n);
+ }
+
+ private:
+ udp_server* p_;
+
+ friend void* asio_handler_allocate(std::size_t n, ref* r)
+ {
+ return asio_handler_allocate(n, r->p_);
+ }
+
+ friend void asio_handler_deallocate(void* p, std::size_t n, ref* r)
+ {
+ asio_handler_deallocate(p, n, r->p_);
+ }
+ };
+
+private:
+ udp::socket socket_;
+ std::vector<unsigned char> buffer_;
+ udp::endpoint sender_;
+ allocator allocator_;
+};
+
+#include <asio/unyield.hpp>
+
+int main(int argc, char* argv[])
+{
+ if (argc != 5)
+ {
+ std::fprintf(stderr,
+ "Usage: udp_server <port1> <nports> "
+ "<bufsize> {spin|block}\n");
+ return 1;
+ }
+
+ unsigned short first_port = static_cast<unsigned short>(std::atoi(argv[1]));
+ unsigned short num_ports = static_cast<unsigned short>(std::atoi(argv[2]));
+ std::size_t buf_size = std::atoi(argv[3]);
+ bool spin = (std::strcmp(argv[4], "spin") == 0);
+
+ asio::io_context io_context(1);
+ std::vector<boost::shared_ptr<udp_server> > servers;
+
+ for (unsigned short i = 0; i < num_ports; ++i)
+ {
+ unsigned short port = first_port + i;
+ boost::shared_ptr<udp_server> s(new udp_server(io_context, port, buf_size));
+ servers.push_back(s);
+ (*s)(asio::error_code());
+ }
+
+ if (spin)
+ for (;;) io_context.poll();
+ else
+ io_context.run();
+}
diff --git a/3rdparty/asio/src/tests/performance/client.cpp b/3rdparty/asio/src/tests/performance/client.cpp
new file mode 100644
index 00000000000..b42a6c50930
--- /dev/null
+++ b/3rdparty/asio/src/tests/performance/client.cpp
@@ -0,0 +1,286 @@
+//
+// client.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio.hpp"
+#include <algorithm>
+#include <boost/bind/bind.hpp>
+#include <boost/mem_fn.hpp>
+#include <iostream>
+#include <list>
+#include <string>
+#include "handler_allocator.hpp"
+
+class stats
+{
+public:
+ stats()
+ : mutex_(),
+ total_bytes_written_(0),
+ total_bytes_read_(0)
+ {
+ }
+
+ void add(size_t bytes_written, size_t bytes_read)
+ {
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ total_bytes_written_ += bytes_written;
+ total_bytes_read_ += bytes_read;
+ }
+
+ void print()
+ {
+ asio::detail::mutex::scoped_lock lock(mutex_);
+ std::cout << total_bytes_written_ << " total bytes written\n";
+ std::cout << total_bytes_read_ << " total bytes read\n";
+ }
+
+private:
+ asio::detail::mutex mutex_;
+ size_t total_bytes_written_;
+ size_t total_bytes_read_;
+};
+
+class session
+{
+public:
+ session(asio::io_context& ioc, size_t block_size, stats& s)
+ : strand_(ioc.get_executor()),
+ socket_(ioc),
+ block_size_(block_size),
+ read_data_(new char[block_size]),
+ read_data_length_(0),
+ write_data_(new char[block_size]),
+ unwritten_count_(0),
+ bytes_written_(0),
+ bytes_read_(0),
+ stats_(s)
+ {
+ for (size_t i = 0; i < block_size_; ++i)
+ write_data_[i] = static_cast<char>(i % 128);
+ }
+
+ ~session()
+ {
+ stats_.add(bytes_written_, bytes_read_);
+
+ delete[] read_data_;
+ delete[] write_data_;
+ }
+
+ void start(asio::ip::tcp::resolver::results_type endpoints)
+ {
+ asio::async_connect(socket_, endpoints,
+ asio::bind_executor(strand_,
+ boost::bind(&session::handle_connect, this,
+ asio::placeholders::error)));
+ }
+
+ void stop()
+ {
+ asio::post(strand_, boost::bind(&session::close_socket, this));
+ }
+
+private:
+ void handle_connect(const asio::error_code& err)
+ {
+ if (!err)
+ {
+ asio::error_code set_option_err;
+ asio::ip::tcp::no_delay no_delay(true);
+ socket_.set_option(no_delay, set_option_err);
+ if (!set_option_err)
+ {
+ ++unwritten_count_;
+ async_write(socket_, asio::buffer(write_data_, block_size_),
+ asio::bind_executor(strand_,
+ make_custom_alloc_handler(write_allocator_,
+ boost::bind(&session::handle_write, this,
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred))));
+ socket_.async_read_some(asio::buffer(read_data_, block_size_),
+ asio::bind_executor(strand_,
+ make_custom_alloc_handler(read_allocator_,
+ boost::bind(&session::handle_read, this,
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred))));
+ }
+ }
+ }
+
+ void handle_read(const asio::error_code& err, size_t length)
+ {
+ if (!err)
+ {
+ bytes_read_ += length;
+
+ read_data_length_ = length;
+ ++unwritten_count_;
+ if (unwritten_count_ == 1)
+ {
+ std::swap(read_data_, write_data_);
+ async_write(socket_, asio::buffer(write_data_, read_data_length_),
+ asio::bind_executor(strand_,
+ make_custom_alloc_handler(write_allocator_,
+ boost::bind(&session::handle_write, this,
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred))));
+ socket_.async_read_some(asio::buffer(read_data_, block_size_),
+ asio::bind_executor(strand_,
+ make_custom_alloc_handler(read_allocator_,
+ boost::bind(&session::handle_read, this,
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred))));
+ }
+ }
+ }
+
+ void handle_write(const asio::error_code& err, size_t length)
+ {
+ if (!err && length > 0)
+ {
+ bytes_written_ += length;
+
+ --unwritten_count_;
+ if (unwritten_count_ == 1)
+ {
+ std::swap(read_data_, write_data_);
+ async_write(socket_, asio::buffer(write_data_, read_data_length_),
+ asio::bind_executor(strand_,
+ make_custom_alloc_handler(write_allocator_,
+ boost::bind(&session::handle_write, this,
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred))));
+ socket_.async_read_some(asio::buffer(read_data_, block_size_),
+ asio::bind_executor(strand_,
+ make_custom_alloc_handler(read_allocator_,
+ boost::bind(&session::handle_read, this,
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred))));
+ }
+ }
+ }
+
+ void close_socket()
+ {
+ socket_.close();
+ }
+
+private:
+ asio::strand<asio::io_context::executor_type> strand_;
+ asio::ip::tcp::socket socket_;
+ size_t block_size_;
+ char* read_data_;
+ size_t read_data_length_;
+ char* write_data_;
+ int unwritten_count_;
+ size_t bytes_written_;
+ size_t bytes_read_;
+ stats& stats_;
+ handler_allocator read_allocator_;
+ handler_allocator write_allocator_;
+};
+
+class client
+{
+public:
+ client(asio::io_context& ioc,
+ const asio::ip::tcp::resolver::results_type endpoints,
+ size_t block_size, size_t session_count, int timeout)
+ : io_context_(ioc),
+ stop_timer_(ioc),
+ sessions_(),
+ stats_()
+ {
+ stop_timer_.expires_after(asio::chrono::seconds(timeout));
+ stop_timer_.async_wait(boost::bind(&client::handle_timeout, this));
+
+ for (size_t i = 0; i < session_count; ++i)
+ {
+ session* new_session = new session(io_context_, block_size, stats_);
+ new_session->start(endpoints);
+ sessions_.push_back(new_session);
+ }
+ }
+
+ ~client()
+ {
+ while (!sessions_.empty())
+ {
+ delete sessions_.front();
+ sessions_.pop_front();
+ }
+
+ stats_.print();
+ }
+
+ void handle_timeout()
+ {
+ std::for_each(sessions_.begin(), sessions_.end(),
+ boost::mem_fn(&session::stop));
+ }
+
+private:
+ asio::io_context& io_context_;
+ asio::steady_timer stop_timer_;
+ std::list<session*> sessions_;
+ stats stats_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 7)
+ {
+ std::cerr << "Usage: client <host> <port> <threads> <blocksize> ";
+ std::cerr << "<sessions> <time>\n";
+ return 1;
+ }
+
+ using namespace std; // For atoi.
+ const char* host = argv[1];
+ const char* port = argv[2];
+ int thread_count = atoi(argv[3]);
+ size_t block_size = atoi(argv[4]);
+ size_t session_count = atoi(argv[5]);
+ int timeout = atoi(argv[6]);
+
+ asio::io_context ioc;
+
+ asio::ip::tcp::resolver r(ioc);
+ asio::ip::tcp::resolver::results_type endpoints =
+ r.resolve(host, port);
+
+ client c(ioc, endpoints, block_size, session_count, timeout);
+
+ std::list<asio::thread*> threads;
+ while (--thread_count > 0)
+ {
+ asio::thread* new_thread = new asio::thread(
+ boost::bind(&asio::io_context::run, &ioc));
+ threads.push_back(new_thread);
+ }
+
+ ioc.run();
+
+ while (!threads.empty())
+ {
+ threads.front()->join();
+ delete threads.front();
+ threads.pop_front();
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/tests/performance/handler_allocator.hpp b/3rdparty/asio/src/tests/performance/handler_allocator.hpp
new file mode 100644
index 00000000000..6c1b98532ab
--- /dev/null
+++ b/3rdparty/asio/src/tests/performance/handler_allocator.hpp
@@ -0,0 +1,112 @@
+//
+// handler_allocator.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef HANDLER_ALLOCATOR_HPP
+#define HANDLER_ALLOCATOR_HPP
+
+#include "asio.hpp"
+#include <boost/aligned_storage.hpp>
+#include <boost/noncopyable.hpp>
+
+// Class to manage the memory to be used for handler-based custom allocation.
+// It contains a single block of memory which may be returned for allocation
+// requests. If the memory is in use when an allocation request is made, the
+// allocator delegates allocation to the global heap.
+class handler_allocator
+ : private boost::noncopyable
+{
+public:
+ handler_allocator()
+ : in_use_(false)
+ {
+ }
+
+ void* allocate(std::size_t size)
+ {
+ if (!in_use_ && size < storage_.size)
+ {
+ in_use_ = true;
+ return storage_.address();
+ }
+
+ return ::operator new(size);
+ }
+
+ void deallocate(void* pointer)
+ {
+ if (pointer == storage_.address())
+ {
+ in_use_ = false;
+ }
+ else
+ {
+ ::operator delete(pointer);
+ }
+ }
+
+private:
+ // Storage space used for handler-based custom memory allocation.
+ boost::aligned_storage<1024> storage_;
+
+ // Whether the handler-based custom allocation storage has been used.
+ bool in_use_;
+};
+
+// Wrapper class template for handler objects to allow handler memory
+// allocation to be customised. Calls to operator() are forwarded to the
+// encapsulated handler.
+template <typename Handler>
+class custom_alloc_handler
+{
+public:
+ custom_alloc_handler(handler_allocator& a, Handler h)
+ : allocator_(a),
+ handler_(h)
+ {
+ }
+
+ template <typename Arg1>
+ void operator()(Arg1 arg1)
+ {
+ handler_(arg1);
+ }
+
+ template <typename Arg1, typename Arg2>
+ void operator()(Arg1 arg1, Arg2 arg2)
+ {
+ handler_(arg1, arg2);
+ }
+
+ friend void* asio_handler_allocate(std::size_t size,
+ custom_alloc_handler<Handler>* this_handler)
+ {
+ return this_handler->allocator_.allocate(size);
+ }
+
+ friend void asio_handler_deallocate(void* pointer, std::size_t /*size*/,
+ custom_alloc_handler<Handler>* this_handler)
+ {
+ this_handler->allocator_.deallocate(pointer);
+ }
+
+private:
+ handler_allocator& allocator_;
+ Handler handler_;
+};
+
+// Helper function to wrap a handler object to add custom allocation.
+template <typename Handler>
+inline custom_alloc_handler<Handler> make_custom_alloc_handler(
+ handler_allocator& a, Handler h)
+{
+ return custom_alloc_handler<Handler>(a, h);
+}
+
+#endif // HANDLER_ALLOCATOR_HPP
diff --git a/3rdparty/asio/src/tests/performance/server.cpp b/3rdparty/asio/src/tests/performance/server.cpp
new file mode 100644
index 00000000000..9de3c1294f8
--- /dev/null
+++ b/3rdparty/asio/src/tests/performance/server.cpp
@@ -0,0 +1,233 @@
+//
+// server.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio.hpp"
+#include <algorithm>
+#include <boost/bind/bind.hpp>
+#include <iostream>
+#include <list>
+#include "handler_allocator.hpp"
+
+class session
+{
+public:
+ session(asio::io_context& ioc, size_t block_size)
+ : io_context_(ioc),
+ strand_(ioc.get_executor()),
+ socket_(ioc),
+ block_size_(block_size),
+ read_data_(new char[block_size]),
+ read_data_length_(0),
+ write_data_(new char[block_size]),
+ unsent_count_(0),
+ op_count_(0)
+ {
+ }
+
+ ~session()
+ {
+ delete[] read_data_;
+ delete[] write_data_;
+ }
+
+ asio::ip::tcp::socket& socket()
+ {
+ return socket_;
+ }
+
+ void start()
+ {
+ asio::error_code set_option_err;
+ asio::ip::tcp::no_delay no_delay(true);
+ socket_.set_option(no_delay, set_option_err);
+ if (!set_option_err)
+ {
+ ++op_count_;
+ socket_.async_read_some(asio::buffer(read_data_, block_size_),
+ asio::bind_executor(strand_,
+ make_custom_alloc_handler(read_allocator_,
+ boost::bind(&session::handle_read, this,
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred))));
+ }
+ else
+ {
+ asio::post(io_context_, boost::bind(&session::destroy, this));
+ }
+ }
+
+ void handle_read(const asio::error_code& err, size_t length)
+ {
+ --op_count_;
+
+ if (!err)
+ {
+ read_data_length_ = length;
+ ++unsent_count_;
+ if (unsent_count_ == 1)
+ {
+ op_count_ += 2;
+ std::swap(read_data_, write_data_);
+ async_write(socket_, asio::buffer(write_data_, read_data_length_),
+ asio::bind_executor(strand_,
+ make_custom_alloc_handler(write_allocator_,
+ boost::bind(&session::handle_write, this,
+ asio::placeholders::error))));
+ socket_.async_read_some(asio::buffer(read_data_, block_size_),
+ asio::bind_executor(strand_,
+ make_custom_alloc_handler(read_allocator_,
+ boost::bind(&session::handle_read, this,
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred))));
+ }
+ }
+
+ if (op_count_ == 0)
+ asio::post(io_context_, boost::bind(&session::destroy, this));
+ }
+
+ void handle_write(const asio::error_code& err)
+ {
+ --op_count_;
+
+ if (!err)
+ {
+ --unsent_count_;
+ if (unsent_count_ == 1)
+ {
+ op_count_ += 2;
+ std::swap(read_data_, write_data_);
+ async_write(socket_, asio::buffer(write_data_, read_data_length_),
+ asio::bind_executor(strand_,
+ make_custom_alloc_handler(write_allocator_,
+ boost::bind(&session::handle_write, this,
+ asio::placeholders::error))));
+ socket_.async_read_some(asio::buffer(read_data_, block_size_),
+ asio::bind_executor(strand_,
+ make_custom_alloc_handler(read_allocator_,
+ boost::bind(&session::handle_read, this,
+ asio::placeholders::error,
+ asio::placeholders::bytes_transferred))));
+ }
+ }
+
+ if (op_count_ == 0)
+ asio::post(io_context_, boost::bind(&session::destroy, this));
+ }
+
+ static void destroy(session* s)
+ {
+ delete s;
+ }
+
+private:
+ asio::io_context& io_context_;
+ asio::strand<asio::io_context::executor_type> strand_;
+ asio::ip::tcp::socket socket_;
+ size_t block_size_;
+ char* read_data_;
+ size_t read_data_length_;
+ char* write_data_;
+ int unsent_count_;
+ int op_count_;
+ handler_allocator read_allocator_;
+ handler_allocator write_allocator_;
+};
+
+class server
+{
+public:
+ server(asio::io_context& ioc, const asio::ip::tcp::endpoint& endpoint,
+ size_t block_size)
+ : io_context_(ioc),
+ acceptor_(ioc),
+ block_size_(block_size)
+ {
+ acceptor_.open(endpoint.protocol());
+ acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(1));
+ acceptor_.bind(endpoint);
+ acceptor_.listen();
+
+ start_accept();
+ }
+
+ void start_accept()
+ {
+ session* new_session = new session(io_context_, block_size_);
+ acceptor_.async_accept(new_session->socket(),
+ boost::bind(&server::handle_accept, this, new_session,
+ asio::placeholders::error));
+ }
+
+ void handle_accept(session* new_session, const asio::error_code& err)
+ {
+ if (!err)
+ {
+ new_session->start();
+ }
+ else
+ {
+ delete new_session;
+ }
+
+ start_accept();
+ }
+
+private:
+ asio::io_context& io_context_;
+ asio::ip::tcp::acceptor acceptor_;
+ size_t block_size_;
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ if (argc != 5)
+ {
+ std::cerr << "Usage: server <address> <port> <threads> <blocksize>\n";
+ return 1;
+ }
+
+ using namespace std; // For atoi.
+ asio::ip::address address = asio::ip::make_address(argv[1]);
+ short port = atoi(argv[2]);
+ int thread_count = atoi(argv[3]);
+ size_t block_size = atoi(argv[4]);
+
+ asio::io_context ioc;
+
+ server s(ioc, asio::ip::tcp::endpoint(address, port), block_size);
+
+ // Threads not currently supported in this test.
+ std::list<asio::thread*> threads;
+ while (--thread_count > 0)
+ {
+ asio::thread* new_thread = new asio::thread(
+ boost::bind(&asio::io_context::run, &ioc));
+ threads.push_back(new_thread);
+ }
+
+ ioc.run();
+
+ while (!threads.empty())
+ {
+ threads.front()->join();
+ delete threads.front();
+ threads.pop_front();
+ }
+ }
+ catch (std::exception& e)
+ {
+ std::cerr << "Exception: " << e.what() << "\n";
+ }
+
+ return 0;
+}
diff --git a/3rdparty/asio/src/tests/properties/Makefile.am b/3rdparty/asio/src/tests/properties/Makefile.am
new file mode 100644
index 00000000000..688b3f48640
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/Makefile.am
@@ -0,0 +1,367 @@
+AUTOMAKE_OPTIONS = subdir-objects
+
+check_PROGRAMS = \
+ cpp03/query_free \
+ cpp03/query_member \
+ cpp03/query_static \
+ cpp03/can_query_free \
+ cpp03/can_query_member \
+ cpp03/can_query_static \
+ cpp03/can_query_unsupported \
+ cpp03/can_query_not_applicable_free \
+ cpp03/can_query_not_applicable_member \
+ cpp03/can_query_not_applicable_static \
+ cpp03/can_query_not_applicable_unsupported \
+ cpp03/require_concept_free \
+ cpp03/require_concept_member \
+ cpp03/require_concept_static \
+ cpp03/can_require_concept_free \
+ cpp03/can_require_concept_member \
+ cpp03/can_require_concept_static \
+ cpp03/can_require_concept_unsupported \
+ cpp03/can_require_concept_not_applicable_free \
+ cpp03/can_require_concept_not_applicable_member \
+ cpp03/can_require_concept_not_applicable_static \
+ cpp03/can_require_concept_not_applicable_unsupported \
+ cpp03/require_free \
+ cpp03/require_member \
+ cpp03/require_static \
+ cpp03/can_require_free \
+ cpp03/can_require_member \
+ cpp03/can_require_static \
+ cpp03/can_require_unsupported \
+ cpp03/can_require_not_applicable_free \
+ cpp03/can_require_not_applicable_member \
+ cpp03/can_require_not_applicable_static \
+ cpp03/can_require_not_applicable_unsupported \
+ cpp03/prefer_free_prefer \
+ cpp03/prefer_member_prefer \
+ cpp03/prefer_free_require \
+ cpp03/prefer_member_require \
+ cpp03/prefer_static \
+ cpp03/prefer_unsupported \
+ cpp03/can_prefer_free_prefer \
+ cpp03/can_prefer_free_require \
+ cpp03/can_prefer_member_prefer \
+ cpp03/can_prefer_member_require \
+ cpp03/can_prefer_static \
+ cpp03/can_prefer_unsupported \
+ cpp03/can_prefer_not_applicable_free_prefer \
+ cpp03/can_prefer_not_applicable_free_require \
+ cpp03/can_prefer_not_applicable_member_prefer \
+ cpp03/can_prefer_not_applicable_member_require \
+ cpp03/can_prefer_not_applicable_static \
+ cpp03/can_prefer_not_applicable_unsupported \
+ cpp03/can_prefer_not_preferable_free_prefer \
+ cpp03/can_prefer_not_preferable_free_require \
+ cpp03/can_prefer_not_preferable_member_prefer \
+ cpp03/can_prefer_not_preferable_member_require \
+ cpp03/can_prefer_not_preferable_static \
+ cpp03/can_prefer_not_preferable_unsupported
+
+cpp03_query_free_SOURCES = cpp03/query_free.cpp
+cpp03_query_member_SOURCES = cpp03/query_member.cpp
+cpp03_query_static_SOURCES = cpp03/query_static.cpp
+cpp03_can_query_free_SOURCES = cpp03/can_query_free.cpp
+cpp03_can_query_member_SOURCES = cpp03/can_query_member.cpp
+cpp03_can_query_static_SOURCES = cpp03/can_query_static.cpp
+cpp03_can_query_unsupported_SOURCES = cpp03/can_query_unsupported.cpp
+cpp03_can_query_not_applicable_free_SOURCES = cpp03/can_query_not_applicable_free.cpp
+cpp03_can_query_not_applicable_member_SOURCES = cpp03/can_query_not_applicable_member.cpp
+cpp03_can_query_not_applicable_static_SOURCES = cpp03/can_query_not_applicable_static.cpp
+cpp03_can_query_not_applicable_unsupported_SOURCES = cpp03/can_query_not_applicable_unsupported.cpp
+cpp03_require_concept_free_SOURCES = cpp03/require_concept_free.cpp
+cpp03_require_concept_member_SOURCES = cpp03/require_concept_member.cpp
+cpp03_require_concept_static_SOURCES = cpp03/require_concept_static.cpp
+cpp03_can_require_concept_free_SOURCES = cpp03/can_require_concept_free.cpp
+cpp03_can_require_concept_member_SOURCES = cpp03/can_require_concept_member.cpp
+cpp03_can_require_concept_static_SOURCES = cpp03/can_require_concept_static.cpp
+cpp03_can_require_concept_unsupported_SOURCES = cpp03/can_require_concept_unsupported.cpp
+cpp03_can_require_concept_not_applicable_free_SOURCES = cpp03/can_require_concept_not_applicable_free.cpp
+cpp03_can_require_concept_not_applicable_member_SOURCES = cpp03/can_require_concept_not_applicable_member.cpp
+cpp03_can_require_concept_not_applicable_static_SOURCES = cpp03/can_require_concept_not_applicable_static.cpp
+cpp03_can_require_concept_not_applicable_unsupported_SOURCES = cpp03/can_require_concept_not_applicable_unsupported.cpp
+cpp03_require_free_SOURCES = cpp03/require_free.cpp
+cpp03_require_member_SOURCES = cpp03/require_member.cpp
+cpp03_require_static_SOURCES = cpp03/require_static.cpp
+cpp03_can_require_free_SOURCES = cpp03/can_require_free.cpp
+cpp03_can_require_member_SOURCES = cpp03/can_require_member.cpp
+cpp03_can_require_static_SOURCES = cpp03/can_require_static.cpp
+cpp03_can_require_unsupported_SOURCES = cpp03/can_require_unsupported.cpp
+cpp03_can_require_not_applicable_free_SOURCES = cpp03/can_require_not_applicable_free.cpp
+cpp03_can_require_not_applicable_member_SOURCES = cpp03/can_require_not_applicable_member.cpp
+cpp03_can_require_not_applicable_static_SOURCES = cpp03/can_require_not_applicable_static.cpp
+cpp03_can_require_not_applicable_unsupported_SOURCES = cpp03/can_require_not_applicable_unsupported.cpp
+cpp03_prefer_free_prefer_SOURCES = cpp03/prefer_free_prefer.cpp
+cpp03_prefer_free_require_SOURCES = cpp03/prefer_free_require.cpp
+cpp03_prefer_member_prefer_SOURCES = cpp03/prefer_member_prefer.cpp
+cpp03_prefer_member_require_SOURCES = cpp03/prefer_member_require.cpp
+cpp03_prefer_static_SOURCES = cpp03/prefer_static.cpp
+cpp03_prefer_unsupported_SOURCES = cpp03/prefer_unsupported.cpp
+cpp03_can_prefer_free_prefer_SOURCES = cpp03/can_prefer_free_prefer.cpp
+cpp03_can_prefer_free_require_SOURCES = cpp03/can_prefer_free_require.cpp
+cpp03_can_prefer_member_prefer_SOURCES = cpp03/can_prefer_member_prefer.cpp
+cpp03_can_prefer_member_require_SOURCES = cpp03/can_prefer_member_require.cpp
+cpp03_can_prefer_static_SOURCES = cpp03/can_prefer_static.cpp
+cpp03_can_prefer_unsupported_SOURCES = cpp03/can_prefer_unsupported.cpp
+cpp03_can_prefer_not_applicable_free_prefer_SOURCES = cpp03/can_prefer_not_applicable_free_prefer.cpp
+cpp03_can_prefer_not_applicable_free_require_SOURCES = cpp03/can_prefer_not_applicable_free_require.cpp
+cpp03_can_prefer_not_applicable_member_prefer_SOURCES = cpp03/can_prefer_not_applicable_member_prefer.cpp
+cpp03_can_prefer_not_applicable_member_require_SOURCES = cpp03/can_prefer_not_applicable_member_require.cpp
+cpp03_can_prefer_not_applicable_static_SOURCES = cpp03/can_prefer_not_applicable_static.cpp
+cpp03_can_prefer_not_applicable_unsupported_SOURCES = cpp03/can_prefer_not_applicable_unsupported.cpp
+cpp03_can_prefer_not_preferable_free_prefer_SOURCES = cpp03/can_prefer_not_preferable_free_prefer.cpp
+cpp03_can_prefer_not_preferable_free_require_SOURCES = cpp03/can_prefer_not_preferable_free_require.cpp
+cpp03_can_prefer_not_preferable_member_prefer_SOURCES = cpp03/can_prefer_not_preferable_member_prefer.cpp
+cpp03_can_prefer_not_preferable_member_require_SOURCES = cpp03/can_prefer_not_preferable_member_require.cpp
+cpp03_can_prefer_not_preferable_static_SOURCES = cpp03/can_prefer_not_preferable_static.cpp
+cpp03_can_prefer_not_preferable_unsupported_SOURCES = cpp03/can_prefer_not_preferable_unsupported.cpp
+
+if HAVE_CXX11
+
+check_PROGRAMS += \
+ cpp11/query_free \
+ cpp11/query_member \
+ cpp11/query_static \
+ cpp11/can_query_free \
+ cpp11/can_query_member \
+ cpp11/can_query_static \
+ cpp11/can_query_unsupported \
+ cpp11/can_query_not_applicable_free \
+ cpp11/can_query_not_applicable_member \
+ cpp11/can_query_not_applicable_static \
+ cpp11/can_query_not_applicable_unsupported \
+ cpp11/require_concept_free \
+ cpp11/require_concept_member \
+ cpp11/require_concept_static \
+ cpp11/can_require_concept_free \
+ cpp11/can_require_concept_member \
+ cpp11/can_require_concept_static \
+ cpp11/can_require_concept_unsupported \
+ cpp11/can_require_concept_not_applicable_free \
+ cpp11/can_require_concept_not_applicable_member \
+ cpp11/can_require_concept_not_applicable_static \
+ cpp11/can_require_concept_not_applicable_unsupported \
+ cpp11/require_free \
+ cpp11/require_member \
+ cpp11/require_static \
+ cpp11/can_require_free \
+ cpp11/can_require_member \
+ cpp11/can_require_static \
+ cpp11/can_require_unsupported \
+ cpp11/can_require_not_applicable_free \
+ cpp11/can_require_not_applicable_member \
+ cpp11/can_require_not_applicable_static \
+ cpp11/can_require_not_applicable_unsupported \
+ cpp11/prefer_free_prefer \
+ cpp11/prefer_member_prefer \
+ cpp11/prefer_free_require \
+ cpp11/prefer_member_require \
+ cpp11/prefer_static \
+ cpp11/prefer_unsupported \
+ cpp11/can_prefer_free_prefer \
+ cpp11/can_prefer_free_require \
+ cpp11/can_prefer_member_prefer \
+ cpp11/can_prefer_member_require \
+ cpp11/can_prefer_static \
+ cpp11/can_prefer_unsupported \
+ cpp11/can_prefer_not_applicable_free_prefer \
+ cpp11/can_prefer_not_applicable_free_require \
+ cpp11/can_prefer_not_applicable_member_prefer \
+ cpp11/can_prefer_not_applicable_member_require \
+ cpp11/can_prefer_not_applicable_static \
+ cpp11/can_prefer_not_applicable_unsupported \
+ cpp11/can_prefer_not_preferable_free_prefer \
+ cpp11/can_prefer_not_preferable_free_require \
+ cpp11/can_prefer_not_preferable_member_prefer \
+ cpp11/can_prefer_not_preferable_member_require \
+ cpp11/can_prefer_not_preferable_static \
+ cpp11/can_prefer_not_preferable_unsupported
+
+cpp11_query_free_SOURCES = cpp11/query_free.cpp
+cpp11_query_member_SOURCES = cpp11/query_member.cpp
+cpp11_query_static_SOURCES = cpp11/query_static.cpp
+cpp11_can_query_free_SOURCES = cpp11/can_query_free.cpp
+cpp11_can_query_member_SOURCES = cpp11/can_query_member.cpp
+cpp11_can_query_static_SOURCES = cpp11/can_query_static.cpp
+cpp11_can_query_unsupported_SOURCES = cpp11/can_query_unsupported.cpp
+cpp11_can_query_not_applicable_free_SOURCES = cpp11/can_query_not_applicable_free.cpp
+cpp11_can_query_not_applicable_member_SOURCES = cpp11/can_query_not_applicable_member.cpp
+cpp11_can_query_not_applicable_static_SOURCES = cpp11/can_query_not_applicable_static.cpp
+cpp11_can_query_not_applicable_unsupported_SOURCES = cpp11/can_query_not_applicable_unsupported.cpp
+cpp11_require_concept_free_SOURCES = cpp11/require_concept_free.cpp
+cpp11_require_concept_member_SOURCES = cpp11/require_concept_member.cpp
+cpp11_require_concept_static_SOURCES = cpp11/require_concept_static.cpp
+cpp11_can_require_concept_free_SOURCES = cpp11/can_require_concept_free.cpp
+cpp11_can_require_concept_member_SOURCES = cpp11/can_require_concept_member.cpp
+cpp11_can_require_concept_static_SOURCES = cpp11/can_require_concept_static.cpp
+cpp11_can_require_concept_unsupported_SOURCES = cpp11/can_require_concept_unsupported.cpp
+cpp11_can_require_concept_not_applicable_free_SOURCES = cpp11/can_require_concept_not_applicable_free.cpp
+cpp11_can_require_concept_not_applicable_member_SOURCES = cpp11/can_require_concept_not_applicable_member.cpp
+cpp11_can_require_concept_not_applicable_static_SOURCES = cpp11/can_require_concept_not_applicable_static.cpp
+cpp11_can_require_concept_not_applicable_unsupported_SOURCES = cpp11/can_require_concept_not_applicable_unsupported.cpp
+cpp11_require_free_SOURCES = cpp11/require_free.cpp
+cpp11_require_member_SOURCES = cpp11/require_member.cpp
+cpp11_require_static_SOURCES = cpp11/require_static.cpp
+cpp11_can_require_free_SOURCES = cpp11/can_require_free.cpp
+cpp11_can_require_member_SOURCES = cpp11/can_require_member.cpp
+cpp11_can_require_static_SOURCES = cpp11/can_require_static.cpp
+cpp11_can_require_unsupported_SOURCES = cpp11/can_require_unsupported.cpp
+cpp11_can_require_not_applicable_free_SOURCES = cpp11/can_require_not_applicable_free.cpp
+cpp11_can_require_not_applicable_member_SOURCES = cpp11/can_require_not_applicable_member.cpp
+cpp11_can_require_not_applicable_static_SOURCES = cpp11/can_require_not_applicable_static.cpp
+cpp11_can_require_not_applicable_unsupported_SOURCES = cpp11/can_require_not_applicable_unsupported.cpp
+cpp11_prefer_free_prefer_SOURCES = cpp11/prefer_free_prefer.cpp
+cpp11_prefer_free_require_SOURCES = cpp11/prefer_free_require.cpp
+cpp11_prefer_member_prefer_SOURCES = cpp11/prefer_member_prefer.cpp
+cpp11_prefer_member_require_SOURCES = cpp11/prefer_member_require.cpp
+cpp11_prefer_static_SOURCES = cpp11/prefer_static.cpp
+cpp11_prefer_unsupported_SOURCES = cpp11/prefer_unsupported.cpp
+cpp11_can_prefer_free_prefer_SOURCES = cpp11/can_prefer_free_prefer.cpp
+cpp11_can_prefer_free_require_SOURCES = cpp11/can_prefer_free_require.cpp
+cpp11_can_prefer_member_prefer_SOURCES = cpp11/can_prefer_member_prefer.cpp
+cpp11_can_prefer_member_require_SOURCES = cpp11/can_prefer_member_require.cpp
+cpp11_can_prefer_static_SOURCES = cpp11/can_prefer_static.cpp
+cpp11_can_prefer_unsupported_SOURCES = cpp11/can_prefer_unsupported.cpp
+cpp11_can_prefer_not_applicable_free_prefer_SOURCES = cpp11/can_prefer_not_applicable_free_prefer.cpp
+cpp11_can_prefer_not_applicable_free_require_SOURCES = cpp11/can_prefer_not_applicable_free_require.cpp
+cpp11_can_prefer_not_applicable_member_prefer_SOURCES = cpp11/can_prefer_not_applicable_member_prefer.cpp
+cpp11_can_prefer_not_applicable_member_require_SOURCES = cpp11/can_prefer_not_applicable_member_require.cpp
+cpp11_can_prefer_not_applicable_static_SOURCES = cpp11/can_prefer_not_applicable_static.cpp
+cpp11_can_prefer_not_applicable_unsupported_SOURCES = cpp11/can_prefer_not_applicable_unsupported.cpp
+cpp11_can_prefer_not_preferable_free_prefer_SOURCES = cpp11/can_prefer_not_preferable_free_prefer.cpp
+cpp11_can_prefer_not_preferable_free_require_SOURCES = cpp11/can_prefer_not_preferable_free_require.cpp
+cpp11_can_prefer_not_preferable_member_prefer_SOURCES = cpp11/can_prefer_not_preferable_member_prefer.cpp
+cpp11_can_prefer_not_preferable_member_require_SOURCES = cpp11/can_prefer_not_preferable_member_require.cpp
+cpp11_can_prefer_not_preferable_static_SOURCES = cpp11/can_prefer_not_preferable_static.cpp
+cpp11_can_prefer_not_preferable_unsupported_SOURCES = cpp11/can_prefer_not_preferable_unsupported.cpp
+
+endif
+
+if HAVE_CXX14
+
+check_PROGRAMS += \
+ cpp14/query_free \
+ cpp14/query_member \
+ cpp14/query_static \
+ cpp14/can_query_free \
+ cpp14/can_query_member \
+ cpp14/can_query_static \
+ cpp14/can_query_unsupported \
+ cpp14/can_query_not_applicable_free \
+ cpp14/can_query_not_applicable_member \
+ cpp14/can_query_not_applicable_static \
+ cpp14/can_query_not_applicable_unsupported \
+ cpp14/require_concept_free \
+ cpp14/require_concept_member \
+ cpp14/require_concept_static \
+ cpp14/can_require_concept_free \
+ cpp14/can_require_concept_member \
+ cpp14/can_require_concept_static \
+ cpp14/can_require_concept_unsupported \
+ cpp14/can_require_concept_not_applicable_free \
+ cpp14/can_require_concept_not_applicable_member \
+ cpp14/can_require_concept_not_applicable_static \
+ cpp14/can_require_concept_not_applicable_unsupported \
+ cpp14/require_free \
+ cpp14/require_member \
+ cpp14/require_static \
+ cpp14/can_require_free \
+ cpp14/can_require_member \
+ cpp14/can_require_static \
+ cpp14/can_require_unsupported \
+ cpp14/can_require_not_applicable_free \
+ cpp14/can_require_not_applicable_member \
+ cpp14/can_require_not_applicable_static \
+ cpp14/can_require_not_applicable_unsupported \
+ cpp14/prefer_free_prefer \
+ cpp14/prefer_member_prefer \
+ cpp14/prefer_free_require \
+ cpp14/prefer_member_require \
+ cpp14/prefer_static \
+ cpp14/prefer_unsupported \
+ cpp14/can_prefer_free_prefer \
+ cpp14/can_prefer_free_require \
+ cpp14/can_prefer_member_prefer \
+ cpp14/can_prefer_member_require \
+ cpp14/can_prefer_static \
+ cpp14/can_prefer_unsupported \
+ cpp14/can_prefer_not_applicable_free_prefer \
+ cpp14/can_prefer_not_applicable_free_require \
+ cpp14/can_prefer_not_applicable_member_prefer \
+ cpp14/can_prefer_not_applicable_member_require \
+ cpp14/can_prefer_not_applicable_static \
+ cpp14/can_prefer_not_applicable_unsupported \
+ cpp14/can_prefer_not_preferable_free_prefer \
+ cpp14/can_prefer_not_preferable_free_require \
+ cpp14/can_prefer_not_preferable_member_prefer \
+ cpp14/can_prefer_not_preferable_member_require \
+ cpp14/can_prefer_not_preferable_static \
+ cpp14/can_prefer_not_preferable_unsupported
+
+cpp14_query_free_SOURCES = cpp14/query_free.cpp
+cpp14_query_member_SOURCES = cpp14/query_member.cpp
+cpp14_query_static_SOURCES = cpp14/query_static.cpp
+cpp14_can_query_free_SOURCES = cpp14/can_query_free.cpp
+cpp14_can_query_member_SOURCES = cpp14/can_query_member.cpp
+cpp14_can_query_static_SOURCES = cpp14/can_query_static.cpp
+cpp14_can_query_unsupported_SOURCES = cpp14/can_query_unsupported.cpp
+cpp14_can_query_not_applicable_free_SOURCES = cpp14/can_query_not_applicable_free.cpp
+cpp14_can_query_not_applicable_member_SOURCES = cpp14/can_query_not_applicable_member.cpp
+cpp14_can_query_not_applicable_static_SOURCES = cpp14/can_query_not_applicable_static.cpp
+cpp14_can_query_not_applicable_unsupported_SOURCES = cpp14/can_query_not_applicable_unsupported.cpp
+cpp14_require_concept_free_SOURCES = cpp14/require_concept_free.cpp
+cpp14_require_concept_member_SOURCES = cpp14/require_concept_member.cpp
+cpp14_require_concept_static_SOURCES = cpp14/require_concept_static.cpp
+cpp14_can_require_concept_free_SOURCES = cpp14/can_require_concept_free.cpp
+cpp14_can_require_concept_member_SOURCES = cpp14/can_require_concept_member.cpp
+cpp14_can_require_concept_static_SOURCES = cpp14/can_require_concept_static.cpp
+cpp14_can_require_concept_unsupported_SOURCES = cpp14/can_require_concept_unsupported.cpp
+cpp14_can_require_concept_not_applicable_free_SOURCES = cpp14/can_require_concept_not_applicable_free.cpp
+cpp14_can_require_concept_not_applicable_member_SOURCES = cpp14/can_require_concept_not_applicable_member.cpp
+cpp14_can_require_concept_not_applicable_static_SOURCES = cpp14/can_require_concept_not_applicable_static.cpp
+cpp14_can_require_concept_not_applicable_unsupported_SOURCES = cpp14/can_require_concept_not_applicable_unsupported.cpp
+cpp14_require_free_SOURCES = cpp14/require_free.cpp
+cpp14_require_member_SOURCES = cpp14/require_member.cpp
+cpp14_require_static_SOURCES = cpp14/require_static.cpp
+cpp14_can_require_free_SOURCES = cpp14/can_require_free.cpp
+cpp14_can_require_member_SOURCES = cpp14/can_require_member.cpp
+cpp14_can_require_static_SOURCES = cpp14/can_require_static.cpp
+cpp14_can_require_unsupported_SOURCES = cpp14/can_require_unsupported.cpp
+cpp14_can_require_not_applicable_free_SOURCES = cpp14/can_require_not_applicable_free.cpp
+cpp14_can_require_not_applicable_member_SOURCES = cpp14/can_require_not_applicable_member.cpp
+cpp14_can_require_not_applicable_static_SOURCES = cpp14/can_require_not_applicable_static.cpp
+cpp14_can_require_not_applicable_unsupported_SOURCES = cpp14/can_require_not_applicable_unsupported.cpp
+cpp14_prefer_free_prefer_SOURCES = cpp14/prefer_free_prefer.cpp
+cpp14_prefer_free_require_SOURCES = cpp14/prefer_free_require.cpp
+cpp14_prefer_member_prefer_SOURCES = cpp14/prefer_member_prefer.cpp
+cpp14_prefer_member_require_SOURCES = cpp14/prefer_member_require.cpp
+cpp14_prefer_static_SOURCES = cpp14/prefer_static.cpp
+cpp14_prefer_unsupported_SOURCES = cpp14/prefer_unsupported.cpp
+cpp14_can_prefer_free_prefer_SOURCES = cpp14/can_prefer_free_prefer.cpp
+cpp14_can_prefer_free_require_SOURCES = cpp14/can_prefer_free_require.cpp
+cpp14_can_prefer_member_prefer_SOURCES = cpp14/can_prefer_member_prefer.cpp
+cpp14_can_prefer_member_require_SOURCES = cpp14/can_prefer_member_require.cpp
+cpp14_can_prefer_static_SOURCES = cpp14/can_prefer_static.cpp
+cpp14_can_prefer_unsupported_SOURCES = cpp14/can_prefer_unsupported.cpp
+cpp14_can_prefer_not_applicable_free_prefer_SOURCES = cpp14/can_prefer_not_applicable_free_prefer.cpp
+cpp14_can_prefer_not_applicable_free_require_SOURCES = cpp14/can_prefer_not_applicable_free_require.cpp
+cpp14_can_prefer_not_applicable_member_prefer_SOURCES = cpp14/can_prefer_not_applicable_member_prefer.cpp
+cpp14_can_prefer_not_applicable_member_require_SOURCES = cpp14/can_prefer_not_applicable_member_require.cpp
+cpp14_can_prefer_not_applicable_static_SOURCES = cpp14/can_prefer_not_applicable_static.cpp
+cpp14_can_prefer_not_applicable_unsupported_SOURCES = cpp14/can_prefer_not_applicable_unsupported.cpp
+cpp14_can_prefer_not_preferable_free_prefer_SOURCES = cpp14/can_prefer_not_preferable_free_prefer.cpp
+cpp14_can_prefer_not_preferable_free_require_SOURCES = cpp14/can_prefer_not_preferable_free_require.cpp
+cpp14_can_prefer_not_preferable_member_prefer_SOURCES = cpp14/can_prefer_not_preferable_member_prefer.cpp
+cpp14_can_prefer_not_preferable_member_require_SOURCES = cpp14/can_prefer_not_preferable_member_require.cpp
+cpp14_can_prefer_not_preferable_static_SOURCES = cpp14/can_prefer_not_preferable_static.cpp
+cpp14_can_prefer_not_preferable_unsupported_SOURCES = cpp14/can_prefer_not_preferable_unsupported.cpp
+
+endif
+
+TESTS = $(check_PROGRAMS)
+
+AM_CXXFLAGS = -I$(srcdir)/../../../include
+
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
diff --git a/3rdparty/asio/src/tests/properties/Makefile.in b/3rdparty/asio/src/tests/properties/Makefile.in
new file mode 100644
index 00000000000..fb6b500f02e
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/Makefile.in
@@ -0,0 +1,5585 @@
+# Makefile.in generated by automake 1.16.5 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2021 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+VPATH = @srcdir@
+am__is_gnu_make = { \
+ if test -z '$(MAKELEVEL)'; then \
+ false; \
+ elif test -n '$(MAKE_HOST)'; then \
+ true; \
+ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+ true; \
+ else \
+ false; \
+ fi; \
+}
+am__make_running_with_option = \
+ case $${target_option-} in \
+ ?) ;; \
+ *) echo "am__make_running_with_option: internal error: invalid" \
+ "target option '$${target_option-}' specified" >&2; \
+ exit 1;; \
+ esac; \
+ has_opt=no; \
+ sane_makeflags=$$MAKEFLAGS; \
+ if $(am__is_gnu_make); then \
+ sane_makeflags=$$MFLAGS; \
+ else \
+ case $$MAKEFLAGS in \
+ *\\[\ \ ]*) \
+ bs=\\; \
+ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \
+ esac; \
+ fi; \
+ skip_next=no; \
+ strip_trailopt () \
+ { \
+ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+ }; \
+ for flg in $$sane_makeflags; do \
+ test $$skip_next = yes && { skip_next=no; continue; }; \
+ case $$flg in \
+ *=*|--*) continue;; \
+ -*I) strip_trailopt 'I'; skip_next=yes;; \
+ -*I?*) strip_trailopt 'I';; \
+ -*O) strip_trailopt 'O'; skip_next=yes;; \
+ -*O?*) strip_trailopt 'O';; \
+ -*l) strip_trailopt 'l'; skip_next=yes;; \
+ -*l?*) strip_trailopt 'l';; \
+ -[dEDm]) skip_next=yes;; \
+ -[JT]) skip_next=yes;; \
+ esac; \
+ case $$flg in \
+ *$$target_option*) has_opt=yes; break;; \
+ esac; \
+ done; \
+ test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+check_PROGRAMS = cpp03/query_free$(EXEEXT) cpp03/query_member$(EXEEXT) \
+ cpp03/query_static$(EXEEXT) cpp03/can_query_free$(EXEEXT) \
+ cpp03/can_query_member$(EXEEXT) \
+ cpp03/can_query_static$(EXEEXT) \
+ cpp03/can_query_unsupported$(EXEEXT) \
+ cpp03/can_query_not_applicable_free$(EXEEXT) \
+ cpp03/can_query_not_applicable_member$(EXEEXT) \
+ cpp03/can_query_not_applicable_static$(EXEEXT) \
+ cpp03/can_query_not_applicable_unsupported$(EXEEXT) \
+ cpp03/require_concept_free$(EXEEXT) \
+ cpp03/require_concept_member$(EXEEXT) \
+ cpp03/require_concept_static$(EXEEXT) \
+ cpp03/can_require_concept_free$(EXEEXT) \
+ cpp03/can_require_concept_member$(EXEEXT) \
+ cpp03/can_require_concept_static$(EXEEXT) \
+ cpp03/can_require_concept_unsupported$(EXEEXT) \
+ cpp03/can_require_concept_not_applicable_free$(EXEEXT) \
+ cpp03/can_require_concept_not_applicable_member$(EXEEXT) \
+ cpp03/can_require_concept_not_applicable_static$(EXEEXT) \
+ cpp03/can_require_concept_not_applicable_unsupported$(EXEEXT) \
+ cpp03/require_free$(EXEEXT) cpp03/require_member$(EXEEXT) \
+ cpp03/require_static$(EXEEXT) cpp03/can_require_free$(EXEEXT) \
+ cpp03/can_require_member$(EXEEXT) \
+ cpp03/can_require_static$(EXEEXT) \
+ cpp03/can_require_unsupported$(EXEEXT) \
+ cpp03/can_require_not_applicable_free$(EXEEXT) \
+ cpp03/can_require_not_applicable_member$(EXEEXT) \
+ cpp03/can_require_not_applicable_static$(EXEEXT) \
+ cpp03/can_require_not_applicable_unsupported$(EXEEXT) \
+ cpp03/prefer_free_prefer$(EXEEXT) \
+ cpp03/prefer_member_prefer$(EXEEXT) \
+ cpp03/prefer_free_require$(EXEEXT) \
+ cpp03/prefer_member_require$(EXEEXT) \
+ cpp03/prefer_static$(EXEEXT) cpp03/prefer_unsupported$(EXEEXT) \
+ cpp03/can_prefer_free_prefer$(EXEEXT) \
+ cpp03/can_prefer_free_require$(EXEEXT) \
+ cpp03/can_prefer_member_prefer$(EXEEXT) \
+ cpp03/can_prefer_member_require$(EXEEXT) \
+ cpp03/can_prefer_static$(EXEEXT) \
+ cpp03/can_prefer_unsupported$(EXEEXT) \
+ cpp03/can_prefer_not_applicable_free_prefer$(EXEEXT) \
+ cpp03/can_prefer_not_applicable_free_require$(EXEEXT) \
+ cpp03/can_prefer_not_applicable_member_prefer$(EXEEXT) \
+ cpp03/can_prefer_not_applicable_member_require$(EXEEXT) \
+ cpp03/can_prefer_not_applicable_static$(EXEEXT) \
+ cpp03/can_prefer_not_applicable_unsupported$(EXEEXT) \
+ cpp03/can_prefer_not_preferable_free_prefer$(EXEEXT) \
+ cpp03/can_prefer_not_preferable_free_require$(EXEEXT) \
+ cpp03/can_prefer_not_preferable_member_prefer$(EXEEXT) \
+ cpp03/can_prefer_not_preferable_member_require$(EXEEXT) \
+ cpp03/can_prefer_not_preferable_static$(EXEEXT) \
+ cpp03/can_prefer_not_preferable_unsupported$(EXEEXT) \
+ $(am__EXEEXT_1) $(am__EXEEXT_2)
+@HAVE_CXX11_TRUE@am__append_1 = \
+@HAVE_CXX11_TRUE@ cpp11/query_free \
+@HAVE_CXX11_TRUE@ cpp11/query_member \
+@HAVE_CXX11_TRUE@ cpp11/query_static \
+@HAVE_CXX11_TRUE@ cpp11/can_query_free \
+@HAVE_CXX11_TRUE@ cpp11/can_query_member \
+@HAVE_CXX11_TRUE@ cpp11/can_query_static \
+@HAVE_CXX11_TRUE@ cpp11/can_query_unsupported \
+@HAVE_CXX11_TRUE@ cpp11/can_query_not_applicable_free \
+@HAVE_CXX11_TRUE@ cpp11/can_query_not_applicable_member \
+@HAVE_CXX11_TRUE@ cpp11/can_query_not_applicable_static \
+@HAVE_CXX11_TRUE@ cpp11/can_query_not_applicable_unsupported \
+@HAVE_CXX11_TRUE@ cpp11/require_concept_free \
+@HAVE_CXX11_TRUE@ cpp11/require_concept_member \
+@HAVE_CXX11_TRUE@ cpp11/require_concept_static \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_free \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_member \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_static \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_unsupported \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_not_applicable_free \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_not_applicable_member \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_not_applicable_static \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_not_applicable_unsupported \
+@HAVE_CXX11_TRUE@ cpp11/require_free \
+@HAVE_CXX11_TRUE@ cpp11/require_member \
+@HAVE_CXX11_TRUE@ cpp11/require_static \
+@HAVE_CXX11_TRUE@ cpp11/can_require_free \
+@HAVE_CXX11_TRUE@ cpp11/can_require_member \
+@HAVE_CXX11_TRUE@ cpp11/can_require_static \
+@HAVE_CXX11_TRUE@ cpp11/can_require_unsupported \
+@HAVE_CXX11_TRUE@ cpp11/can_require_not_applicable_free \
+@HAVE_CXX11_TRUE@ cpp11/can_require_not_applicable_member \
+@HAVE_CXX11_TRUE@ cpp11/can_require_not_applicable_static \
+@HAVE_CXX11_TRUE@ cpp11/can_require_not_applicable_unsupported \
+@HAVE_CXX11_TRUE@ cpp11/prefer_free_prefer \
+@HAVE_CXX11_TRUE@ cpp11/prefer_member_prefer \
+@HAVE_CXX11_TRUE@ cpp11/prefer_free_require \
+@HAVE_CXX11_TRUE@ cpp11/prefer_member_require \
+@HAVE_CXX11_TRUE@ cpp11/prefer_static \
+@HAVE_CXX11_TRUE@ cpp11/prefer_unsupported \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_free_prefer \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_free_require \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_member_prefer \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_member_require \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_static \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_unsupported \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_applicable_free_prefer \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_applicable_free_require \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_applicable_member_prefer \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_applicable_member_require \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_applicable_static \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_applicable_unsupported \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_preferable_free_prefer \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_preferable_free_require \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_preferable_member_prefer \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_preferable_member_require \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_preferable_static \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_preferable_unsupported
+
+@HAVE_CXX14_TRUE@am__append_2 = \
+@HAVE_CXX14_TRUE@ cpp14/query_free \
+@HAVE_CXX14_TRUE@ cpp14/query_member \
+@HAVE_CXX14_TRUE@ cpp14/query_static \
+@HAVE_CXX14_TRUE@ cpp14/can_query_free \
+@HAVE_CXX14_TRUE@ cpp14/can_query_member \
+@HAVE_CXX14_TRUE@ cpp14/can_query_static \
+@HAVE_CXX14_TRUE@ cpp14/can_query_unsupported \
+@HAVE_CXX14_TRUE@ cpp14/can_query_not_applicable_free \
+@HAVE_CXX14_TRUE@ cpp14/can_query_not_applicable_member \
+@HAVE_CXX14_TRUE@ cpp14/can_query_not_applicable_static \
+@HAVE_CXX14_TRUE@ cpp14/can_query_not_applicable_unsupported \
+@HAVE_CXX14_TRUE@ cpp14/require_concept_free \
+@HAVE_CXX14_TRUE@ cpp14/require_concept_member \
+@HAVE_CXX14_TRUE@ cpp14/require_concept_static \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_free \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_member \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_static \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_unsupported \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_not_applicable_free \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_not_applicable_member \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_not_applicable_static \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_not_applicable_unsupported \
+@HAVE_CXX14_TRUE@ cpp14/require_free \
+@HAVE_CXX14_TRUE@ cpp14/require_member \
+@HAVE_CXX14_TRUE@ cpp14/require_static \
+@HAVE_CXX14_TRUE@ cpp14/can_require_free \
+@HAVE_CXX14_TRUE@ cpp14/can_require_member \
+@HAVE_CXX14_TRUE@ cpp14/can_require_static \
+@HAVE_CXX14_TRUE@ cpp14/can_require_unsupported \
+@HAVE_CXX14_TRUE@ cpp14/can_require_not_applicable_free \
+@HAVE_CXX14_TRUE@ cpp14/can_require_not_applicable_member \
+@HAVE_CXX14_TRUE@ cpp14/can_require_not_applicable_static \
+@HAVE_CXX14_TRUE@ cpp14/can_require_not_applicable_unsupported \
+@HAVE_CXX14_TRUE@ cpp14/prefer_free_prefer \
+@HAVE_CXX14_TRUE@ cpp14/prefer_member_prefer \
+@HAVE_CXX14_TRUE@ cpp14/prefer_free_require \
+@HAVE_CXX14_TRUE@ cpp14/prefer_member_require \
+@HAVE_CXX14_TRUE@ cpp14/prefer_static \
+@HAVE_CXX14_TRUE@ cpp14/prefer_unsupported \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_free_prefer \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_free_require \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_member_prefer \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_member_require \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_static \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_unsupported \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_applicable_free_prefer \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_applicable_free_require \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_applicable_member_prefer \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_applicable_member_require \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_applicable_static \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_applicable_unsupported \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_preferable_free_prefer \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_preferable_free_require \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_preferable_member_prefer \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_preferable_member_require \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_preferable_static \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_preferable_unsupported
+
+subdir = src/tests/properties
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+ $(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+@HAVE_CXX11_TRUE@am__EXEEXT_1 = cpp11/query_free$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/query_member$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/query_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_query_free$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_query_member$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_query_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_query_unsupported$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_query_not_applicable_free$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_query_not_applicable_member$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_query_not_applicable_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_query_not_applicable_unsupported$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/require_concept_free$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/require_concept_member$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/require_concept_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_free$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_member$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_unsupported$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_not_applicable_free$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_not_applicable_member$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_not_applicable_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_not_applicable_unsupported$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/require_free$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/require_member$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/require_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_free$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_member$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_unsupported$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_not_applicable_free$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_not_applicable_member$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_not_applicable_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_require_not_applicable_unsupported$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/prefer_free_prefer$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/prefer_member_prefer$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/prefer_free_require$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/prefer_member_require$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/prefer_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/prefer_unsupported$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_free_prefer$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_free_require$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_member_prefer$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_member_require$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_unsupported$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_applicable_free_prefer$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_applicable_free_require$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_applicable_member_prefer$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_applicable_member_require$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_applicable_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_applicable_unsupported$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_preferable_free_prefer$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_preferable_free_require$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_preferable_member_prefer$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_preferable_member_require$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_preferable_static$(EXEEXT) \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_not_preferable_unsupported$(EXEEXT)
+@HAVE_CXX14_TRUE@am__EXEEXT_2 = cpp14/query_free$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/query_member$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/query_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_query_free$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_query_member$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_query_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_query_unsupported$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_query_not_applicable_free$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_query_not_applicable_member$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_query_not_applicable_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_query_not_applicable_unsupported$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/require_concept_free$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/require_concept_member$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/require_concept_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_free$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_member$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_unsupported$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_not_applicable_free$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_not_applicable_member$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_not_applicable_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_not_applicable_unsupported$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/require_free$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/require_member$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/require_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_free$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_member$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_unsupported$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_not_applicable_free$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_not_applicable_member$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_not_applicable_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_require_not_applicable_unsupported$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/prefer_free_prefer$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/prefer_member_prefer$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/prefer_free_require$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/prefer_member_require$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/prefer_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/prefer_unsupported$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_free_prefer$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_free_require$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_member_prefer$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_member_require$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_unsupported$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_applicable_free_prefer$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_applicable_free_require$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_applicable_member_prefer$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_applicable_member_require$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_applicable_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_applicable_unsupported$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_preferable_free_prefer$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_preferable_free_require$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_preferable_member_prefer$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_preferable_member_require$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_preferable_static$(EXEEXT) \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_not_preferable_unsupported$(EXEEXT)
+am__dirstamp = $(am__leading_dot)dirstamp
+am_cpp03_can_prefer_free_prefer_OBJECTS = \
+ cpp03/can_prefer_free_prefer.$(OBJEXT)
+cpp03_can_prefer_free_prefer_OBJECTS = \
+ $(am_cpp03_can_prefer_free_prefer_OBJECTS)
+cpp03_can_prefer_free_prefer_LDADD = $(LDADD)
+am_cpp03_can_prefer_free_require_OBJECTS = \
+ cpp03/can_prefer_free_require.$(OBJEXT)
+cpp03_can_prefer_free_require_OBJECTS = \
+ $(am_cpp03_can_prefer_free_require_OBJECTS)
+cpp03_can_prefer_free_require_LDADD = $(LDADD)
+am_cpp03_can_prefer_member_prefer_OBJECTS = \
+ cpp03/can_prefer_member_prefer.$(OBJEXT)
+cpp03_can_prefer_member_prefer_OBJECTS = \
+ $(am_cpp03_can_prefer_member_prefer_OBJECTS)
+cpp03_can_prefer_member_prefer_LDADD = $(LDADD)
+am_cpp03_can_prefer_member_require_OBJECTS = \
+ cpp03/can_prefer_member_require.$(OBJEXT)
+cpp03_can_prefer_member_require_OBJECTS = \
+ $(am_cpp03_can_prefer_member_require_OBJECTS)
+cpp03_can_prefer_member_require_LDADD = $(LDADD)
+am_cpp03_can_prefer_not_applicable_free_prefer_OBJECTS = \
+ cpp03/can_prefer_not_applicable_free_prefer.$(OBJEXT)
+cpp03_can_prefer_not_applicable_free_prefer_OBJECTS = \
+ $(am_cpp03_can_prefer_not_applicable_free_prefer_OBJECTS)
+cpp03_can_prefer_not_applicable_free_prefer_LDADD = $(LDADD)
+am_cpp03_can_prefer_not_applicable_free_require_OBJECTS = \
+ cpp03/can_prefer_not_applicable_free_require.$(OBJEXT)
+cpp03_can_prefer_not_applicable_free_require_OBJECTS = \
+ $(am_cpp03_can_prefer_not_applicable_free_require_OBJECTS)
+cpp03_can_prefer_not_applicable_free_require_LDADD = $(LDADD)
+am_cpp03_can_prefer_not_applicable_member_prefer_OBJECTS = \
+ cpp03/can_prefer_not_applicable_member_prefer.$(OBJEXT)
+cpp03_can_prefer_not_applicable_member_prefer_OBJECTS = \
+ $(am_cpp03_can_prefer_not_applicable_member_prefer_OBJECTS)
+cpp03_can_prefer_not_applicable_member_prefer_LDADD = $(LDADD)
+am_cpp03_can_prefer_not_applicable_member_require_OBJECTS = \
+ cpp03/can_prefer_not_applicable_member_require.$(OBJEXT)
+cpp03_can_prefer_not_applicable_member_require_OBJECTS = \
+ $(am_cpp03_can_prefer_not_applicable_member_require_OBJECTS)
+cpp03_can_prefer_not_applicable_member_require_LDADD = $(LDADD)
+am_cpp03_can_prefer_not_applicable_static_OBJECTS = \
+ cpp03/can_prefer_not_applicable_static.$(OBJEXT)
+cpp03_can_prefer_not_applicable_static_OBJECTS = \
+ $(am_cpp03_can_prefer_not_applicable_static_OBJECTS)
+cpp03_can_prefer_not_applicable_static_LDADD = $(LDADD)
+am_cpp03_can_prefer_not_applicable_unsupported_OBJECTS = \
+ cpp03/can_prefer_not_applicable_unsupported.$(OBJEXT)
+cpp03_can_prefer_not_applicable_unsupported_OBJECTS = \
+ $(am_cpp03_can_prefer_not_applicable_unsupported_OBJECTS)
+cpp03_can_prefer_not_applicable_unsupported_LDADD = $(LDADD)
+am_cpp03_can_prefer_not_preferable_free_prefer_OBJECTS = \
+ cpp03/can_prefer_not_preferable_free_prefer.$(OBJEXT)
+cpp03_can_prefer_not_preferable_free_prefer_OBJECTS = \
+ $(am_cpp03_can_prefer_not_preferable_free_prefer_OBJECTS)
+cpp03_can_prefer_not_preferable_free_prefer_LDADD = $(LDADD)
+am_cpp03_can_prefer_not_preferable_free_require_OBJECTS = \
+ cpp03/can_prefer_not_preferable_free_require.$(OBJEXT)
+cpp03_can_prefer_not_preferable_free_require_OBJECTS = \
+ $(am_cpp03_can_prefer_not_preferable_free_require_OBJECTS)
+cpp03_can_prefer_not_preferable_free_require_LDADD = $(LDADD)
+am_cpp03_can_prefer_not_preferable_member_prefer_OBJECTS = \
+ cpp03/can_prefer_not_preferable_member_prefer.$(OBJEXT)
+cpp03_can_prefer_not_preferable_member_prefer_OBJECTS = \
+ $(am_cpp03_can_prefer_not_preferable_member_prefer_OBJECTS)
+cpp03_can_prefer_not_preferable_member_prefer_LDADD = $(LDADD)
+am_cpp03_can_prefer_not_preferable_member_require_OBJECTS = \
+ cpp03/can_prefer_not_preferable_member_require.$(OBJEXT)
+cpp03_can_prefer_not_preferable_member_require_OBJECTS = \
+ $(am_cpp03_can_prefer_not_preferable_member_require_OBJECTS)
+cpp03_can_prefer_not_preferable_member_require_LDADD = $(LDADD)
+am_cpp03_can_prefer_not_preferable_static_OBJECTS = \
+ cpp03/can_prefer_not_preferable_static.$(OBJEXT)
+cpp03_can_prefer_not_preferable_static_OBJECTS = \
+ $(am_cpp03_can_prefer_not_preferable_static_OBJECTS)
+cpp03_can_prefer_not_preferable_static_LDADD = $(LDADD)
+am_cpp03_can_prefer_not_preferable_unsupported_OBJECTS = \
+ cpp03/can_prefer_not_preferable_unsupported.$(OBJEXT)
+cpp03_can_prefer_not_preferable_unsupported_OBJECTS = \
+ $(am_cpp03_can_prefer_not_preferable_unsupported_OBJECTS)
+cpp03_can_prefer_not_preferable_unsupported_LDADD = $(LDADD)
+am_cpp03_can_prefer_static_OBJECTS = \
+ cpp03/can_prefer_static.$(OBJEXT)
+cpp03_can_prefer_static_OBJECTS = \
+ $(am_cpp03_can_prefer_static_OBJECTS)
+cpp03_can_prefer_static_LDADD = $(LDADD)
+am_cpp03_can_prefer_unsupported_OBJECTS = \
+ cpp03/can_prefer_unsupported.$(OBJEXT)
+cpp03_can_prefer_unsupported_OBJECTS = \
+ $(am_cpp03_can_prefer_unsupported_OBJECTS)
+cpp03_can_prefer_unsupported_LDADD = $(LDADD)
+am_cpp03_can_query_free_OBJECTS = cpp03/can_query_free.$(OBJEXT)
+cpp03_can_query_free_OBJECTS = $(am_cpp03_can_query_free_OBJECTS)
+cpp03_can_query_free_LDADD = $(LDADD)
+am_cpp03_can_query_member_OBJECTS = cpp03/can_query_member.$(OBJEXT)
+cpp03_can_query_member_OBJECTS = $(am_cpp03_can_query_member_OBJECTS)
+cpp03_can_query_member_LDADD = $(LDADD)
+am_cpp03_can_query_not_applicable_free_OBJECTS = \
+ cpp03/can_query_not_applicable_free.$(OBJEXT)
+cpp03_can_query_not_applicable_free_OBJECTS = \
+ $(am_cpp03_can_query_not_applicable_free_OBJECTS)
+cpp03_can_query_not_applicable_free_LDADD = $(LDADD)
+am_cpp03_can_query_not_applicable_member_OBJECTS = \
+ cpp03/can_query_not_applicable_member.$(OBJEXT)
+cpp03_can_query_not_applicable_member_OBJECTS = \
+ $(am_cpp03_can_query_not_applicable_member_OBJECTS)
+cpp03_can_query_not_applicable_member_LDADD = $(LDADD)
+am_cpp03_can_query_not_applicable_static_OBJECTS = \
+ cpp03/can_query_not_applicable_static.$(OBJEXT)
+cpp03_can_query_not_applicable_static_OBJECTS = \
+ $(am_cpp03_can_query_not_applicable_static_OBJECTS)
+cpp03_can_query_not_applicable_static_LDADD = $(LDADD)
+am_cpp03_can_query_not_applicable_unsupported_OBJECTS = \
+ cpp03/can_query_not_applicable_unsupported.$(OBJEXT)
+cpp03_can_query_not_applicable_unsupported_OBJECTS = \
+ $(am_cpp03_can_query_not_applicable_unsupported_OBJECTS)
+cpp03_can_query_not_applicable_unsupported_LDADD = $(LDADD)
+am_cpp03_can_query_static_OBJECTS = cpp03/can_query_static.$(OBJEXT)
+cpp03_can_query_static_OBJECTS = $(am_cpp03_can_query_static_OBJECTS)
+cpp03_can_query_static_LDADD = $(LDADD)
+am_cpp03_can_query_unsupported_OBJECTS = \
+ cpp03/can_query_unsupported.$(OBJEXT)
+cpp03_can_query_unsupported_OBJECTS = \
+ $(am_cpp03_can_query_unsupported_OBJECTS)
+cpp03_can_query_unsupported_LDADD = $(LDADD)
+am_cpp03_can_require_concept_free_OBJECTS = \
+ cpp03/can_require_concept_free.$(OBJEXT)
+cpp03_can_require_concept_free_OBJECTS = \
+ $(am_cpp03_can_require_concept_free_OBJECTS)
+cpp03_can_require_concept_free_LDADD = $(LDADD)
+am_cpp03_can_require_concept_member_OBJECTS = \
+ cpp03/can_require_concept_member.$(OBJEXT)
+cpp03_can_require_concept_member_OBJECTS = \
+ $(am_cpp03_can_require_concept_member_OBJECTS)
+cpp03_can_require_concept_member_LDADD = $(LDADD)
+am_cpp03_can_require_concept_not_applicable_free_OBJECTS = \
+ cpp03/can_require_concept_not_applicable_free.$(OBJEXT)
+cpp03_can_require_concept_not_applicable_free_OBJECTS = \
+ $(am_cpp03_can_require_concept_not_applicable_free_OBJECTS)
+cpp03_can_require_concept_not_applicable_free_LDADD = $(LDADD)
+am_cpp03_can_require_concept_not_applicable_member_OBJECTS = \
+ cpp03/can_require_concept_not_applicable_member.$(OBJEXT)
+cpp03_can_require_concept_not_applicable_member_OBJECTS = \
+ $(am_cpp03_can_require_concept_not_applicable_member_OBJECTS)
+cpp03_can_require_concept_not_applicable_member_LDADD = $(LDADD)
+am_cpp03_can_require_concept_not_applicable_static_OBJECTS = \
+ cpp03/can_require_concept_not_applicable_static.$(OBJEXT)
+cpp03_can_require_concept_not_applicable_static_OBJECTS = \
+ $(am_cpp03_can_require_concept_not_applicable_static_OBJECTS)
+cpp03_can_require_concept_not_applicable_static_LDADD = $(LDADD)
+am_cpp03_can_require_concept_not_applicable_unsupported_OBJECTS = cpp03/can_require_concept_not_applicable_unsupported.$(OBJEXT)
+cpp03_can_require_concept_not_applicable_unsupported_OBJECTS = $(am_cpp03_can_require_concept_not_applicable_unsupported_OBJECTS)
+cpp03_can_require_concept_not_applicable_unsupported_LDADD = $(LDADD)
+am_cpp03_can_require_concept_static_OBJECTS = \
+ cpp03/can_require_concept_static.$(OBJEXT)
+cpp03_can_require_concept_static_OBJECTS = \
+ $(am_cpp03_can_require_concept_static_OBJECTS)
+cpp03_can_require_concept_static_LDADD = $(LDADD)
+am_cpp03_can_require_concept_unsupported_OBJECTS = \
+ cpp03/can_require_concept_unsupported.$(OBJEXT)
+cpp03_can_require_concept_unsupported_OBJECTS = \
+ $(am_cpp03_can_require_concept_unsupported_OBJECTS)
+cpp03_can_require_concept_unsupported_LDADD = $(LDADD)
+am_cpp03_can_require_free_OBJECTS = cpp03/can_require_free.$(OBJEXT)
+cpp03_can_require_free_OBJECTS = $(am_cpp03_can_require_free_OBJECTS)
+cpp03_can_require_free_LDADD = $(LDADD)
+am_cpp03_can_require_member_OBJECTS = \
+ cpp03/can_require_member.$(OBJEXT)
+cpp03_can_require_member_OBJECTS = \
+ $(am_cpp03_can_require_member_OBJECTS)
+cpp03_can_require_member_LDADD = $(LDADD)
+am_cpp03_can_require_not_applicable_free_OBJECTS = \
+ cpp03/can_require_not_applicable_free.$(OBJEXT)
+cpp03_can_require_not_applicable_free_OBJECTS = \
+ $(am_cpp03_can_require_not_applicable_free_OBJECTS)
+cpp03_can_require_not_applicable_free_LDADD = $(LDADD)
+am_cpp03_can_require_not_applicable_member_OBJECTS = \
+ cpp03/can_require_not_applicable_member.$(OBJEXT)
+cpp03_can_require_not_applicable_member_OBJECTS = \
+ $(am_cpp03_can_require_not_applicable_member_OBJECTS)
+cpp03_can_require_not_applicable_member_LDADD = $(LDADD)
+am_cpp03_can_require_not_applicable_static_OBJECTS = \
+ cpp03/can_require_not_applicable_static.$(OBJEXT)
+cpp03_can_require_not_applicable_static_OBJECTS = \
+ $(am_cpp03_can_require_not_applicable_static_OBJECTS)
+cpp03_can_require_not_applicable_static_LDADD = $(LDADD)
+am_cpp03_can_require_not_applicable_unsupported_OBJECTS = \
+ cpp03/can_require_not_applicable_unsupported.$(OBJEXT)
+cpp03_can_require_not_applicable_unsupported_OBJECTS = \
+ $(am_cpp03_can_require_not_applicable_unsupported_OBJECTS)
+cpp03_can_require_not_applicable_unsupported_LDADD = $(LDADD)
+am_cpp03_can_require_static_OBJECTS = \
+ cpp03/can_require_static.$(OBJEXT)
+cpp03_can_require_static_OBJECTS = \
+ $(am_cpp03_can_require_static_OBJECTS)
+cpp03_can_require_static_LDADD = $(LDADD)
+am_cpp03_can_require_unsupported_OBJECTS = \
+ cpp03/can_require_unsupported.$(OBJEXT)
+cpp03_can_require_unsupported_OBJECTS = \
+ $(am_cpp03_can_require_unsupported_OBJECTS)
+cpp03_can_require_unsupported_LDADD = $(LDADD)
+am_cpp03_prefer_free_prefer_OBJECTS = \
+ cpp03/prefer_free_prefer.$(OBJEXT)
+cpp03_prefer_free_prefer_OBJECTS = \
+ $(am_cpp03_prefer_free_prefer_OBJECTS)
+cpp03_prefer_free_prefer_LDADD = $(LDADD)
+am_cpp03_prefer_free_require_OBJECTS = \
+ cpp03/prefer_free_require.$(OBJEXT)
+cpp03_prefer_free_require_OBJECTS = \
+ $(am_cpp03_prefer_free_require_OBJECTS)
+cpp03_prefer_free_require_LDADD = $(LDADD)
+am_cpp03_prefer_member_prefer_OBJECTS = \
+ cpp03/prefer_member_prefer.$(OBJEXT)
+cpp03_prefer_member_prefer_OBJECTS = \
+ $(am_cpp03_prefer_member_prefer_OBJECTS)
+cpp03_prefer_member_prefer_LDADD = $(LDADD)
+am_cpp03_prefer_member_require_OBJECTS = \
+ cpp03/prefer_member_require.$(OBJEXT)
+cpp03_prefer_member_require_OBJECTS = \
+ $(am_cpp03_prefer_member_require_OBJECTS)
+cpp03_prefer_member_require_LDADD = $(LDADD)
+am_cpp03_prefer_static_OBJECTS = cpp03/prefer_static.$(OBJEXT)
+cpp03_prefer_static_OBJECTS = $(am_cpp03_prefer_static_OBJECTS)
+cpp03_prefer_static_LDADD = $(LDADD)
+am_cpp03_prefer_unsupported_OBJECTS = \
+ cpp03/prefer_unsupported.$(OBJEXT)
+cpp03_prefer_unsupported_OBJECTS = \
+ $(am_cpp03_prefer_unsupported_OBJECTS)
+cpp03_prefer_unsupported_LDADD = $(LDADD)
+am_cpp03_query_free_OBJECTS = cpp03/query_free.$(OBJEXT)
+cpp03_query_free_OBJECTS = $(am_cpp03_query_free_OBJECTS)
+cpp03_query_free_LDADD = $(LDADD)
+am_cpp03_query_member_OBJECTS = cpp03/query_member.$(OBJEXT)
+cpp03_query_member_OBJECTS = $(am_cpp03_query_member_OBJECTS)
+cpp03_query_member_LDADD = $(LDADD)
+am_cpp03_query_static_OBJECTS = cpp03/query_static.$(OBJEXT)
+cpp03_query_static_OBJECTS = $(am_cpp03_query_static_OBJECTS)
+cpp03_query_static_LDADD = $(LDADD)
+am_cpp03_require_concept_free_OBJECTS = \
+ cpp03/require_concept_free.$(OBJEXT)
+cpp03_require_concept_free_OBJECTS = \
+ $(am_cpp03_require_concept_free_OBJECTS)
+cpp03_require_concept_free_LDADD = $(LDADD)
+am_cpp03_require_concept_member_OBJECTS = \
+ cpp03/require_concept_member.$(OBJEXT)
+cpp03_require_concept_member_OBJECTS = \
+ $(am_cpp03_require_concept_member_OBJECTS)
+cpp03_require_concept_member_LDADD = $(LDADD)
+am_cpp03_require_concept_static_OBJECTS = \
+ cpp03/require_concept_static.$(OBJEXT)
+cpp03_require_concept_static_OBJECTS = \
+ $(am_cpp03_require_concept_static_OBJECTS)
+cpp03_require_concept_static_LDADD = $(LDADD)
+am_cpp03_require_free_OBJECTS = cpp03/require_free.$(OBJEXT)
+cpp03_require_free_OBJECTS = $(am_cpp03_require_free_OBJECTS)
+cpp03_require_free_LDADD = $(LDADD)
+am_cpp03_require_member_OBJECTS = cpp03/require_member.$(OBJEXT)
+cpp03_require_member_OBJECTS = $(am_cpp03_require_member_OBJECTS)
+cpp03_require_member_LDADD = $(LDADD)
+am_cpp03_require_static_OBJECTS = cpp03/require_static.$(OBJEXT)
+cpp03_require_static_OBJECTS = $(am_cpp03_require_static_OBJECTS)
+cpp03_require_static_LDADD = $(LDADD)
+am__cpp11_can_prefer_free_prefer_SOURCES_DIST = \
+ cpp11/can_prefer_free_prefer.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_free_prefer_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_free_prefer.$(OBJEXT)
+cpp11_can_prefer_free_prefer_OBJECTS = \
+ $(am_cpp11_can_prefer_free_prefer_OBJECTS)
+cpp11_can_prefer_free_prefer_LDADD = $(LDADD)
+am__cpp11_can_prefer_free_require_SOURCES_DIST = \
+ cpp11/can_prefer_free_require.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_free_require_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_free_require.$(OBJEXT)
+cpp11_can_prefer_free_require_OBJECTS = \
+ $(am_cpp11_can_prefer_free_require_OBJECTS)
+cpp11_can_prefer_free_require_LDADD = $(LDADD)
+am__cpp11_can_prefer_member_prefer_SOURCES_DIST = \
+ cpp11/can_prefer_member_prefer.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_member_prefer_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_member_prefer.$(OBJEXT)
+cpp11_can_prefer_member_prefer_OBJECTS = \
+ $(am_cpp11_can_prefer_member_prefer_OBJECTS)
+cpp11_can_prefer_member_prefer_LDADD = $(LDADD)
+am__cpp11_can_prefer_member_require_SOURCES_DIST = \
+ cpp11/can_prefer_member_require.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_member_require_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_member_require.$(OBJEXT)
+cpp11_can_prefer_member_require_OBJECTS = \
+ $(am_cpp11_can_prefer_member_require_OBJECTS)
+cpp11_can_prefer_member_require_LDADD = $(LDADD)
+am__cpp11_can_prefer_not_applicable_free_prefer_SOURCES_DIST = \
+ cpp11/can_prefer_not_applicable_free_prefer.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_not_applicable_free_prefer_OBJECTS = cpp11/can_prefer_not_applicable_free_prefer.$(OBJEXT)
+cpp11_can_prefer_not_applicable_free_prefer_OBJECTS = \
+ $(am_cpp11_can_prefer_not_applicable_free_prefer_OBJECTS)
+cpp11_can_prefer_not_applicable_free_prefer_LDADD = $(LDADD)
+am__cpp11_can_prefer_not_applicable_free_require_SOURCES_DIST = \
+ cpp11/can_prefer_not_applicable_free_require.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_not_applicable_free_require_OBJECTS = cpp11/can_prefer_not_applicable_free_require.$(OBJEXT)
+cpp11_can_prefer_not_applicable_free_require_OBJECTS = \
+ $(am_cpp11_can_prefer_not_applicable_free_require_OBJECTS)
+cpp11_can_prefer_not_applicable_free_require_LDADD = $(LDADD)
+am__cpp11_can_prefer_not_applicable_member_prefer_SOURCES_DIST = \
+ cpp11/can_prefer_not_applicable_member_prefer.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_not_applicable_member_prefer_OBJECTS = cpp11/can_prefer_not_applicable_member_prefer.$(OBJEXT)
+cpp11_can_prefer_not_applicable_member_prefer_OBJECTS = \
+ $(am_cpp11_can_prefer_not_applicable_member_prefer_OBJECTS)
+cpp11_can_prefer_not_applicable_member_prefer_LDADD = $(LDADD)
+am__cpp11_can_prefer_not_applicable_member_require_SOURCES_DIST = \
+ cpp11/can_prefer_not_applicable_member_require.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_not_applicable_member_require_OBJECTS = cpp11/can_prefer_not_applicable_member_require.$(OBJEXT)
+cpp11_can_prefer_not_applicable_member_require_OBJECTS = \
+ $(am_cpp11_can_prefer_not_applicable_member_require_OBJECTS)
+cpp11_can_prefer_not_applicable_member_require_LDADD = $(LDADD)
+am__cpp11_can_prefer_not_applicable_static_SOURCES_DIST = \
+ cpp11/can_prefer_not_applicable_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_not_applicable_static_OBJECTS = cpp11/can_prefer_not_applicable_static.$(OBJEXT)
+cpp11_can_prefer_not_applicable_static_OBJECTS = \
+ $(am_cpp11_can_prefer_not_applicable_static_OBJECTS)
+cpp11_can_prefer_not_applicable_static_LDADD = $(LDADD)
+am__cpp11_can_prefer_not_applicable_unsupported_SOURCES_DIST = \
+ cpp11/can_prefer_not_applicable_unsupported.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_not_applicable_unsupported_OBJECTS = cpp11/can_prefer_not_applicable_unsupported.$(OBJEXT)
+cpp11_can_prefer_not_applicable_unsupported_OBJECTS = \
+ $(am_cpp11_can_prefer_not_applicable_unsupported_OBJECTS)
+cpp11_can_prefer_not_applicable_unsupported_LDADD = $(LDADD)
+am__cpp11_can_prefer_not_preferable_free_prefer_SOURCES_DIST = \
+ cpp11/can_prefer_not_preferable_free_prefer.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_not_preferable_free_prefer_OBJECTS = cpp11/can_prefer_not_preferable_free_prefer.$(OBJEXT)
+cpp11_can_prefer_not_preferable_free_prefer_OBJECTS = \
+ $(am_cpp11_can_prefer_not_preferable_free_prefer_OBJECTS)
+cpp11_can_prefer_not_preferable_free_prefer_LDADD = $(LDADD)
+am__cpp11_can_prefer_not_preferable_free_require_SOURCES_DIST = \
+ cpp11/can_prefer_not_preferable_free_require.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_not_preferable_free_require_OBJECTS = cpp11/can_prefer_not_preferable_free_require.$(OBJEXT)
+cpp11_can_prefer_not_preferable_free_require_OBJECTS = \
+ $(am_cpp11_can_prefer_not_preferable_free_require_OBJECTS)
+cpp11_can_prefer_not_preferable_free_require_LDADD = $(LDADD)
+am__cpp11_can_prefer_not_preferable_member_prefer_SOURCES_DIST = \
+ cpp11/can_prefer_not_preferable_member_prefer.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_not_preferable_member_prefer_OBJECTS = cpp11/can_prefer_not_preferable_member_prefer.$(OBJEXT)
+cpp11_can_prefer_not_preferable_member_prefer_OBJECTS = \
+ $(am_cpp11_can_prefer_not_preferable_member_prefer_OBJECTS)
+cpp11_can_prefer_not_preferable_member_prefer_LDADD = $(LDADD)
+am__cpp11_can_prefer_not_preferable_member_require_SOURCES_DIST = \
+ cpp11/can_prefer_not_preferable_member_require.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_not_preferable_member_require_OBJECTS = cpp11/can_prefer_not_preferable_member_require.$(OBJEXT)
+cpp11_can_prefer_not_preferable_member_require_OBJECTS = \
+ $(am_cpp11_can_prefer_not_preferable_member_require_OBJECTS)
+cpp11_can_prefer_not_preferable_member_require_LDADD = $(LDADD)
+am__cpp11_can_prefer_not_preferable_static_SOURCES_DIST = \
+ cpp11/can_prefer_not_preferable_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_not_preferable_static_OBJECTS = cpp11/can_prefer_not_preferable_static.$(OBJEXT)
+cpp11_can_prefer_not_preferable_static_OBJECTS = \
+ $(am_cpp11_can_prefer_not_preferable_static_OBJECTS)
+cpp11_can_prefer_not_preferable_static_LDADD = $(LDADD)
+am__cpp11_can_prefer_not_preferable_unsupported_SOURCES_DIST = \
+ cpp11/can_prefer_not_preferable_unsupported.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_not_preferable_unsupported_OBJECTS = cpp11/can_prefer_not_preferable_unsupported.$(OBJEXT)
+cpp11_can_prefer_not_preferable_unsupported_OBJECTS = \
+ $(am_cpp11_can_prefer_not_preferable_unsupported_OBJECTS)
+cpp11_can_prefer_not_preferable_unsupported_LDADD = $(LDADD)
+am__cpp11_can_prefer_static_SOURCES_DIST = \
+ cpp11/can_prefer_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_static_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_static.$(OBJEXT)
+cpp11_can_prefer_static_OBJECTS = \
+ $(am_cpp11_can_prefer_static_OBJECTS)
+cpp11_can_prefer_static_LDADD = $(LDADD)
+am__cpp11_can_prefer_unsupported_SOURCES_DIST = \
+ cpp11/can_prefer_unsupported.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_prefer_unsupported_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_prefer_unsupported.$(OBJEXT)
+cpp11_can_prefer_unsupported_OBJECTS = \
+ $(am_cpp11_can_prefer_unsupported_OBJECTS)
+cpp11_can_prefer_unsupported_LDADD = $(LDADD)
+am__cpp11_can_query_free_SOURCES_DIST = cpp11/can_query_free.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_query_free_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_query_free.$(OBJEXT)
+cpp11_can_query_free_OBJECTS = $(am_cpp11_can_query_free_OBJECTS)
+cpp11_can_query_free_LDADD = $(LDADD)
+am__cpp11_can_query_member_SOURCES_DIST = cpp11/can_query_member.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_query_member_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_query_member.$(OBJEXT)
+cpp11_can_query_member_OBJECTS = $(am_cpp11_can_query_member_OBJECTS)
+cpp11_can_query_member_LDADD = $(LDADD)
+am__cpp11_can_query_not_applicable_free_SOURCES_DIST = \
+ cpp11/can_query_not_applicable_free.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_query_not_applicable_free_OBJECTS = cpp11/can_query_not_applicable_free.$(OBJEXT)
+cpp11_can_query_not_applicable_free_OBJECTS = \
+ $(am_cpp11_can_query_not_applicable_free_OBJECTS)
+cpp11_can_query_not_applicable_free_LDADD = $(LDADD)
+am__cpp11_can_query_not_applicable_member_SOURCES_DIST = \
+ cpp11/can_query_not_applicable_member.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_query_not_applicable_member_OBJECTS = cpp11/can_query_not_applicable_member.$(OBJEXT)
+cpp11_can_query_not_applicable_member_OBJECTS = \
+ $(am_cpp11_can_query_not_applicable_member_OBJECTS)
+cpp11_can_query_not_applicable_member_LDADD = $(LDADD)
+am__cpp11_can_query_not_applicable_static_SOURCES_DIST = \
+ cpp11/can_query_not_applicable_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_query_not_applicable_static_OBJECTS = cpp11/can_query_not_applicable_static.$(OBJEXT)
+cpp11_can_query_not_applicable_static_OBJECTS = \
+ $(am_cpp11_can_query_not_applicable_static_OBJECTS)
+cpp11_can_query_not_applicable_static_LDADD = $(LDADD)
+am__cpp11_can_query_not_applicable_unsupported_SOURCES_DIST = \
+ cpp11/can_query_not_applicable_unsupported.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_query_not_applicable_unsupported_OBJECTS = cpp11/can_query_not_applicable_unsupported.$(OBJEXT)
+cpp11_can_query_not_applicable_unsupported_OBJECTS = \
+ $(am_cpp11_can_query_not_applicable_unsupported_OBJECTS)
+cpp11_can_query_not_applicable_unsupported_LDADD = $(LDADD)
+am__cpp11_can_query_static_SOURCES_DIST = cpp11/can_query_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_query_static_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_query_static.$(OBJEXT)
+cpp11_can_query_static_OBJECTS = $(am_cpp11_can_query_static_OBJECTS)
+cpp11_can_query_static_LDADD = $(LDADD)
+am__cpp11_can_query_unsupported_SOURCES_DIST = \
+ cpp11/can_query_unsupported.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_query_unsupported_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_query_unsupported.$(OBJEXT)
+cpp11_can_query_unsupported_OBJECTS = \
+ $(am_cpp11_can_query_unsupported_OBJECTS)
+cpp11_can_query_unsupported_LDADD = $(LDADD)
+am__cpp11_can_require_concept_free_SOURCES_DIST = \
+ cpp11/can_require_concept_free.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_concept_free_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_free.$(OBJEXT)
+cpp11_can_require_concept_free_OBJECTS = \
+ $(am_cpp11_can_require_concept_free_OBJECTS)
+cpp11_can_require_concept_free_LDADD = $(LDADD)
+am__cpp11_can_require_concept_member_SOURCES_DIST = \
+ cpp11/can_require_concept_member.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_concept_member_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_member.$(OBJEXT)
+cpp11_can_require_concept_member_OBJECTS = \
+ $(am_cpp11_can_require_concept_member_OBJECTS)
+cpp11_can_require_concept_member_LDADD = $(LDADD)
+am__cpp11_can_require_concept_not_applicable_free_SOURCES_DIST = \
+ cpp11/can_require_concept_not_applicable_free.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_concept_not_applicable_free_OBJECTS = cpp11/can_require_concept_not_applicable_free.$(OBJEXT)
+cpp11_can_require_concept_not_applicable_free_OBJECTS = \
+ $(am_cpp11_can_require_concept_not_applicable_free_OBJECTS)
+cpp11_can_require_concept_not_applicable_free_LDADD = $(LDADD)
+am__cpp11_can_require_concept_not_applicable_member_SOURCES_DIST = \
+ cpp11/can_require_concept_not_applicable_member.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_concept_not_applicable_member_OBJECTS = cpp11/can_require_concept_not_applicable_member.$(OBJEXT)
+cpp11_can_require_concept_not_applicable_member_OBJECTS = \
+ $(am_cpp11_can_require_concept_not_applicable_member_OBJECTS)
+cpp11_can_require_concept_not_applicable_member_LDADD = $(LDADD)
+am__cpp11_can_require_concept_not_applicable_static_SOURCES_DIST = \
+ cpp11/can_require_concept_not_applicable_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_concept_not_applicable_static_OBJECTS = cpp11/can_require_concept_not_applicable_static.$(OBJEXT)
+cpp11_can_require_concept_not_applicable_static_OBJECTS = \
+ $(am_cpp11_can_require_concept_not_applicable_static_OBJECTS)
+cpp11_can_require_concept_not_applicable_static_LDADD = $(LDADD)
+am__cpp11_can_require_concept_not_applicable_unsupported_SOURCES_DIST = \
+ cpp11/can_require_concept_not_applicable_unsupported.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_concept_not_applicable_unsupported_OBJECTS = cpp11/can_require_concept_not_applicable_unsupported.$(OBJEXT)
+cpp11_can_require_concept_not_applicable_unsupported_OBJECTS = $(am_cpp11_can_require_concept_not_applicable_unsupported_OBJECTS)
+cpp11_can_require_concept_not_applicable_unsupported_LDADD = $(LDADD)
+am__cpp11_can_require_concept_static_SOURCES_DIST = \
+ cpp11/can_require_concept_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_concept_static_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_require_concept_static.$(OBJEXT)
+cpp11_can_require_concept_static_OBJECTS = \
+ $(am_cpp11_can_require_concept_static_OBJECTS)
+cpp11_can_require_concept_static_LDADD = $(LDADD)
+am__cpp11_can_require_concept_unsupported_SOURCES_DIST = \
+ cpp11/can_require_concept_unsupported.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_concept_unsupported_OBJECTS = cpp11/can_require_concept_unsupported.$(OBJEXT)
+cpp11_can_require_concept_unsupported_OBJECTS = \
+ $(am_cpp11_can_require_concept_unsupported_OBJECTS)
+cpp11_can_require_concept_unsupported_LDADD = $(LDADD)
+am__cpp11_can_require_free_SOURCES_DIST = cpp11/can_require_free.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_free_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_require_free.$(OBJEXT)
+cpp11_can_require_free_OBJECTS = $(am_cpp11_can_require_free_OBJECTS)
+cpp11_can_require_free_LDADD = $(LDADD)
+am__cpp11_can_require_member_SOURCES_DIST = \
+ cpp11/can_require_member.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_member_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_require_member.$(OBJEXT)
+cpp11_can_require_member_OBJECTS = \
+ $(am_cpp11_can_require_member_OBJECTS)
+cpp11_can_require_member_LDADD = $(LDADD)
+am__cpp11_can_require_not_applicable_free_SOURCES_DIST = \
+ cpp11/can_require_not_applicable_free.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_not_applicable_free_OBJECTS = cpp11/can_require_not_applicable_free.$(OBJEXT)
+cpp11_can_require_not_applicable_free_OBJECTS = \
+ $(am_cpp11_can_require_not_applicable_free_OBJECTS)
+cpp11_can_require_not_applicable_free_LDADD = $(LDADD)
+am__cpp11_can_require_not_applicable_member_SOURCES_DIST = \
+ cpp11/can_require_not_applicable_member.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_not_applicable_member_OBJECTS = cpp11/can_require_not_applicable_member.$(OBJEXT)
+cpp11_can_require_not_applicable_member_OBJECTS = \
+ $(am_cpp11_can_require_not_applicable_member_OBJECTS)
+cpp11_can_require_not_applicable_member_LDADD = $(LDADD)
+am__cpp11_can_require_not_applicable_static_SOURCES_DIST = \
+ cpp11/can_require_not_applicable_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_not_applicable_static_OBJECTS = cpp11/can_require_not_applicable_static.$(OBJEXT)
+cpp11_can_require_not_applicable_static_OBJECTS = \
+ $(am_cpp11_can_require_not_applicable_static_OBJECTS)
+cpp11_can_require_not_applicable_static_LDADD = $(LDADD)
+am__cpp11_can_require_not_applicable_unsupported_SOURCES_DIST = \
+ cpp11/can_require_not_applicable_unsupported.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_not_applicable_unsupported_OBJECTS = cpp11/can_require_not_applicable_unsupported.$(OBJEXT)
+cpp11_can_require_not_applicable_unsupported_OBJECTS = \
+ $(am_cpp11_can_require_not_applicable_unsupported_OBJECTS)
+cpp11_can_require_not_applicable_unsupported_LDADD = $(LDADD)
+am__cpp11_can_require_static_SOURCES_DIST = \
+ cpp11/can_require_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_static_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_require_static.$(OBJEXT)
+cpp11_can_require_static_OBJECTS = \
+ $(am_cpp11_can_require_static_OBJECTS)
+cpp11_can_require_static_LDADD = $(LDADD)
+am__cpp11_can_require_unsupported_SOURCES_DIST = \
+ cpp11/can_require_unsupported.cpp
+@HAVE_CXX11_TRUE@am_cpp11_can_require_unsupported_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/can_require_unsupported.$(OBJEXT)
+cpp11_can_require_unsupported_OBJECTS = \
+ $(am_cpp11_can_require_unsupported_OBJECTS)
+cpp11_can_require_unsupported_LDADD = $(LDADD)
+am__cpp11_prefer_free_prefer_SOURCES_DIST = \
+ cpp11/prefer_free_prefer.cpp
+@HAVE_CXX11_TRUE@am_cpp11_prefer_free_prefer_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/prefer_free_prefer.$(OBJEXT)
+cpp11_prefer_free_prefer_OBJECTS = \
+ $(am_cpp11_prefer_free_prefer_OBJECTS)
+cpp11_prefer_free_prefer_LDADD = $(LDADD)
+am__cpp11_prefer_free_require_SOURCES_DIST = \
+ cpp11/prefer_free_require.cpp
+@HAVE_CXX11_TRUE@am_cpp11_prefer_free_require_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/prefer_free_require.$(OBJEXT)
+cpp11_prefer_free_require_OBJECTS = \
+ $(am_cpp11_prefer_free_require_OBJECTS)
+cpp11_prefer_free_require_LDADD = $(LDADD)
+am__cpp11_prefer_member_prefer_SOURCES_DIST = \
+ cpp11/prefer_member_prefer.cpp
+@HAVE_CXX11_TRUE@am_cpp11_prefer_member_prefer_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/prefer_member_prefer.$(OBJEXT)
+cpp11_prefer_member_prefer_OBJECTS = \
+ $(am_cpp11_prefer_member_prefer_OBJECTS)
+cpp11_prefer_member_prefer_LDADD = $(LDADD)
+am__cpp11_prefer_member_require_SOURCES_DIST = \
+ cpp11/prefer_member_require.cpp
+@HAVE_CXX11_TRUE@am_cpp11_prefer_member_require_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/prefer_member_require.$(OBJEXT)
+cpp11_prefer_member_require_OBJECTS = \
+ $(am_cpp11_prefer_member_require_OBJECTS)
+cpp11_prefer_member_require_LDADD = $(LDADD)
+am__cpp11_prefer_static_SOURCES_DIST = cpp11/prefer_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_prefer_static_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/prefer_static.$(OBJEXT)
+cpp11_prefer_static_OBJECTS = $(am_cpp11_prefer_static_OBJECTS)
+cpp11_prefer_static_LDADD = $(LDADD)
+am__cpp11_prefer_unsupported_SOURCES_DIST = \
+ cpp11/prefer_unsupported.cpp
+@HAVE_CXX11_TRUE@am_cpp11_prefer_unsupported_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/prefer_unsupported.$(OBJEXT)
+cpp11_prefer_unsupported_OBJECTS = \
+ $(am_cpp11_prefer_unsupported_OBJECTS)
+cpp11_prefer_unsupported_LDADD = $(LDADD)
+am__cpp11_query_free_SOURCES_DIST = cpp11/query_free.cpp
+@HAVE_CXX11_TRUE@am_cpp11_query_free_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/query_free.$(OBJEXT)
+cpp11_query_free_OBJECTS = $(am_cpp11_query_free_OBJECTS)
+cpp11_query_free_LDADD = $(LDADD)
+am__cpp11_query_member_SOURCES_DIST = cpp11/query_member.cpp
+@HAVE_CXX11_TRUE@am_cpp11_query_member_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/query_member.$(OBJEXT)
+cpp11_query_member_OBJECTS = $(am_cpp11_query_member_OBJECTS)
+cpp11_query_member_LDADD = $(LDADD)
+am__cpp11_query_static_SOURCES_DIST = cpp11/query_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_query_static_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/query_static.$(OBJEXT)
+cpp11_query_static_OBJECTS = $(am_cpp11_query_static_OBJECTS)
+cpp11_query_static_LDADD = $(LDADD)
+am__cpp11_require_concept_free_SOURCES_DIST = \
+ cpp11/require_concept_free.cpp
+@HAVE_CXX11_TRUE@am_cpp11_require_concept_free_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/require_concept_free.$(OBJEXT)
+cpp11_require_concept_free_OBJECTS = \
+ $(am_cpp11_require_concept_free_OBJECTS)
+cpp11_require_concept_free_LDADD = $(LDADD)
+am__cpp11_require_concept_member_SOURCES_DIST = \
+ cpp11/require_concept_member.cpp
+@HAVE_CXX11_TRUE@am_cpp11_require_concept_member_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/require_concept_member.$(OBJEXT)
+cpp11_require_concept_member_OBJECTS = \
+ $(am_cpp11_require_concept_member_OBJECTS)
+cpp11_require_concept_member_LDADD = $(LDADD)
+am__cpp11_require_concept_static_SOURCES_DIST = \
+ cpp11/require_concept_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_require_concept_static_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/require_concept_static.$(OBJEXT)
+cpp11_require_concept_static_OBJECTS = \
+ $(am_cpp11_require_concept_static_OBJECTS)
+cpp11_require_concept_static_LDADD = $(LDADD)
+am__cpp11_require_free_SOURCES_DIST = cpp11/require_free.cpp
+@HAVE_CXX11_TRUE@am_cpp11_require_free_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/require_free.$(OBJEXT)
+cpp11_require_free_OBJECTS = $(am_cpp11_require_free_OBJECTS)
+cpp11_require_free_LDADD = $(LDADD)
+am__cpp11_require_member_SOURCES_DIST = cpp11/require_member.cpp
+@HAVE_CXX11_TRUE@am_cpp11_require_member_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/require_member.$(OBJEXT)
+cpp11_require_member_OBJECTS = $(am_cpp11_require_member_OBJECTS)
+cpp11_require_member_LDADD = $(LDADD)
+am__cpp11_require_static_SOURCES_DIST = cpp11/require_static.cpp
+@HAVE_CXX11_TRUE@am_cpp11_require_static_OBJECTS = \
+@HAVE_CXX11_TRUE@ cpp11/require_static.$(OBJEXT)
+cpp11_require_static_OBJECTS = $(am_cpp11_require_static_OBJECTS)
+cpp11_require_static_LDADD = $(LDADD)
+am__cpp14_can_prefer_free_prefer_SOURCES_DIST = \
+ cpp14/can_prefer_free_prefer.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_free_prefer_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_free_prefer.$(OBJEXT)
+cpp14_can_prefer_free_prefer_OBJECTS = \
+ $(am_cpp14_can_prefer_free_prefer_OBJECTS)
+cpp14_can_prefer_free_prefer_LDADD = $(LDADD)
+am__cpp14_can_prefer_free_require_SOURCES_DIST = \
+ cpp14/can_prefer_free_require.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_free_require_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_free_require.$(OBJEXT)
+cpp14_can_prefer_free_require_OBJECTS = \
+ $(am_cpp14_can_prefer_free_require_OBJECTS)
+cpp14_can_prefer_free_require_LDADD = $(LDADD)
+am__cpp14_can_prefer_member_prefer_SOURCES_DIST = \
+ cpp14/can_prefer_member_prefer.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_member_prefer_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_member_prefer.$(OBJEXT)
+cpp14_can_prefer_member_prefer_OBJECTS = \
+ $(am_cpp14_can_prefer_member_prefer_OBJECTS)
+cpp14_can_prefer_member_prefer_LDADD = $(LDADD)
+am__cpp14_can_prefer_member_require_SOURCES_DIST = \
+ cpp14/can_prefer_member_require.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_member_require_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_member_require.$(OBJEXT)
+cpp14_can_prefer_member_require_OBJECTS = \
+ $(am_cpp14_can_prefer_member_require_OBJECTS)
+cpp14_can_prefer_member_require_LDADD = $(LDADD)
+am__cpp14_can_prefer_not_applicable_free_prefer_SOURCES_DIST = \
+ cpp14/can_prefer_not_applicable_free_prefer.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_not_applicable_free_prefer_OBJECTS = cpp14/can_prefer_not_applicable_free_prefer.$(OBJEXT)
+cpp14_can_prefer_not_applicable_free_prefer_OBJECTS = \
+ $(am_cpp14_can_prefer_not_applicable_free_prefer_OBJECTS)
+cpp14_can_prefer_not_applicable_free_prefer_LDADD = $(LDADD)
+am__cpp14_can_prefer_not_applicable_free_require_SOURCES_DIST = \
+ cpp14/can_prefer_not_applicable_free_require.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_not_applicable_free_require_OBJECTS = cpp14/can_prefer_not_applicable_free_require.$(OBJEXT)
+cpp14_can_prefer_not_applicable_free_require_OBJECTS = \
+ $(am_cpp14_can_prefer_not_applicable_free_require_OBJECTS)
+cpp14_can_prefer_not_applicable_free_require_LDADD = $(LDADD)
+am__cpp14_can_prefer_not_applicable_member_prefer_SOURCES_DIST = \
+ cpp14/can_prefer_not_applicable_member_prefer.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_not_applicable_member_prefer_OBJECTS = cpp14/can_prefer_not_applicable_member_prefer.$(OBJEXT)
+cpp14_can_prefer_not_applicable_member_prefer_OBJECTS = \
+ $(am_cpp14_can_prefer_not_applicable_member_prefer_OBJECTS)
+cpp14_can_prefer_not_applicable_member_prefer_LDADD = $(LDADD)
+am__cpp14_can_prefer_not_applicable_member_require_SOURCES_DIST = \
+ cpp14/can_prefer_not_applicable_member_require.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_not_applicable_member_require_OBJECTS = cpp14/can_prefer_not_applicable_member_require.$(OBJEXT)
+cpp14_can_prefer_not_applicable_member_require_OBJECTS = \
+ $(am_cpp14_can_prefer_not_applicable_member_require_OBJECTS)
+cpp14_can_prefer_not_applicable_member_require_LDADD = $(LDADD)
+am__cpp14_can_prefer_not_applicable_static_SOURCES_DIST = \
+ cpp14/can_prefer_not_applicable_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_not_applicable_static_OBJECTS = cpp14/can_prefer_not_applicable_static.$(OBJEXT)
+cpp14_can_prefer_not_applicable_static_OBJECTS = \
+ $(am_cpp14_can_prefer_not_applicable_static_OBJECTS)
+cpp14_can_prefer_not_applicable_static_LDADD = $(LDADD)
+am__cpp14_can_prefer_not_applicable_unsupported_SOURCES_DIST = \
+ cpp14/can_prefer_not_applicable_unsupported.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_not_applicable_unsupported_OBJECTS = cpp14/can_prefer_not_applicable_unsupported.$(OBJEXT)
+cpp14_can_prefer_not_applicable_unsupported_OBJECTS = \
+ $(am_cpp14_can_prefer_not_applicable_unsupported_OBJECTS)
+cpp14_can_prefer_not_applicable_unsupported_LDADD = $(LDADD)
+am__cpp14_can_prefer_not_preferable_free_prefer_SOURCES_DIST = \
+ cpp14/can_prefer_not_preferable_free_prefer.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_not_preferable_free_prefer_OBJECTS = cpp14/can_prefer_not_preferable_free_prefer.$(OBJEXT)
+cpp14_can_prefer_not_preferable_free_prefer_OBJECTS = \
+ $(am_cpp14_can_prefer_not_preferable_free_prefer_OBJECTS)
+cpp14_can_prefer_not_preferable_free_prefer_LDADD = $(LDADD)
+am__cpp14_can_prefer_not_preferable_free_require_SOURCES_DIST = \
+ cpp14/can_prefer_not_preferable_free_require.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_not_preferable_free_require_OBJECTS = cpp14/can_prefer_not_preferable_free_require.$(OBJEXT)
+cpp14_can_prefer_not_preferable_free_require_OBJECTS = \
+ $(am_cpp14_can_prefer_not_preferable_free_require_OBJECTS)
+cpp14_can_prefer_not_preferable_free_require_LDADD = $(LDADD)
+am__cpp14_can_prefer_not_preferable_member_prefer_SOURCES_DIST = \
+ cpp14/can_prefer_not_preferable_member_prefer.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_not_preferable_member_prefer_OBJECTS = cpp14/can_prefer_not_preferable_member_prefer.$(OBJEXT)
+cpp14_can_prefer_not_preferable_member_prefer_OBJECTS = \
+ $(am_cpp14_can_prefer_not_preferable_member_prefer_OBJECTS)
+cpp14_can_prefer_not_preferable_member_prefer_LDADD = $(LDADD)
+am__cpp14_can_prefer_not_preferable_member_require_SOURCES_DIST = \
+ cpp14/can_prefer_not_preferable_member_require.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_not_preferable_member_require_OBJECTS = cpp14/can_prefer_not_preferable_member_require.$(OBJEXT)
+cpp14_can_prefer_not_preferable_member_require_OBJECTS = \
+ $(am_cpp14_can_prefer_not_preferable_member_require_OBJECTS)
+cpp14_can_prefer_not_preferable_member_require_LDADD = $(LDADD)
+am__cpp14_can_prefer_not_preferable_static_SOURCES_DIST = \
+ cpp14/can_prefer_not_preferable_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_not_preferable_static_OBJECTS = cpp14/can_prefer_not_preferable_static.$(OBJEXT)
+cpp14_can_prefer_not_preferable_static_OBJECTS = \
+ $(am_cpp14_can_prefer_not_preferable_static_OBJECTS)
+cpp14_can_prefer_not_preferable_static_LDADD = $(LDADD)
+am__cpp14_can_prefer_not_preferable_unsupported_SOURCES_DIST = \
+ cpp14/can_prefer_not_preferable_unsupported.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_not_preferable_unsupported_OBJECTS = cpp14/can_prefer_not_preferable_unsupported.$(OBJEXT)
+cpp14_can_prefer_not_preferable_unsupported_OBJECTS = \
+ $(am_cpp14_can_prefer_not_preferable_unsupported_OBJECTS)
+cpp14_can_prefer_not_preferable_unsupported_LDADD = $(LDADD)
+am__cpp14_can_prefer_static_SOURCES_DIST = \
+ cpp14/can_prefer_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_static_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_static.$(OBJEXT)
+cpp14_can_prefer_static_OBJECTS = \
+ $(am_cpp14_can_prefer_static_OBJECTS)
+cpp14_can_prefer_static_LDADD = $(LDADD)
+am__cpp14_can_prefer_unsupported_SOURCES_DIST = \
+ cpp14/can_prefer_unsupported.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_prefer_unsupported_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_prefer_unsupported.$(OBJEXT)
+cpp14_can_prefer_unsupported_OBJECTS = \
+ $(am_cpp14_can_prefer_unsupported_OBJECTS)
+cpp14_can_prefer_unsupported_LDADD = $(LDADD)
+am__cpp14_can_query_free_SOURCES_DIST = cpp14/can_query_free.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_query_free_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_query_free.$(OBJEXT)
+cpp14_can_query_free_OBJECTS = $(am_cpp14_can_query_free_OBJECTS)
+cpp14_can_query_free_LDADD = $(LDADD)
+am__cpp14_can_query_member_SOURCES_DIST = cpp14/can_query_member.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_query_member_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_query_member.$(OBJEXT)
+cpp14_can_query_member_OBJECTS = $(am_cpp14_can_query_member_OBJECTS)
+cpp14_can_query_member_LDADD = $(LDADD)
+am__cpp14_can_query_not_applicable_free_SOURCES_DIST = \
+ cpp14/can_query_not_applicable_free.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_query_not_applicable_free_OBJECTS = cpp14/can_query_not_applicable_free.$(OBJEXT)
+cpp14_can_query_not_applicable_free_OBJECTS = \
+ $(am_cpp14_can_query_not_applicable_free_OBJECTS)
+cpp14_can_query_not_applicable_free_LDADD = $(LDADD)
+am__cpp14_can_query_not_applicable_member_SOURCES_DIST = \
+ cpp14/can_query_not_applicable_member.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_query_not_applicable_member_OBJECTS = cpp14/can_query_not_applicable_member.$(OBJEXT)
+cpp14_can_query_not_applicable_member_OBJECTS = \
+ $(am_cpp14_can_query_not_applicable_member_OBJECTS)
+cpp14_can_query_not_applicable_member_LDADD = $(LDADD)
+am__cpp14_can_query_not_applicable_static_SOURCES_DIST = \
+ cpp14/can_query_not_applicable_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_query_not_applicable_static_OBJECTS = cpp14/can_query_not_applicable_static.$(OBJEXT)
+cpp14_can_query_not_applicable_static_OBJECTS = \
+ $(am_cpp14_can_query_not_applicable_static_OBJECTS)
+cpp14_can_query_not_applicable_static_LDADD = $(LDADD)
+am__cpp14_can_query_not_applicable_unsupported_SOURCES_DIST = \
+ cpp14/can_query_not_applicable_unsupported.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_query_not_applicable_unsupported_OBJECTS = cpp14/can_query_not_applicable_unsupported.$(OBJEXT)
+cpp14_can_query_not_applicable_unsupported_OBJECTS = \
+ $(am_cpp14_can_query_not_applicable_unsupported_OBJECTS)
+cpp14_can_query_not_applicable_unsupported_LDADD = $(LDADD)
+am__cpp14_can_query_static_SOURCES_DIST = cpp14/can_query_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_query_static_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_query_static.$(OBJEXT)
+cpp14_can_query_static_OBJECTS = $(am_cpp14_can_query_static_OBJECTS)
+cpp14_can_query_static_LDADD = $(LDADD)
+am__cpp14_can_query_unsupported_SOURCES_DIST = \
+ cpp14/can_query_unsupported.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_query_unsupported_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_query_unsupported.$(OBJEXT)
+cpp14_can_query_unsupported_OBJECTS = \
+ $(am_cpp14_can_query_unsupported_OBJECTS)
+cpp14_can_query_unsupported_LDADD = $(LDADD)
+am__cpp14_can_require_concept_free_SOURCES_DIST = \
+ cpp14/can_require_concept_free.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_concept_free_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_free.$(OBJEXT)
+cpp14_can_require_concept_free_OBJECTS = \
+ $(am_cpp14_can_require_concept_free_OBJECTS)
+cpp14_can_require_concept_free_LDADD = $(LDADD)
+am__cpp14_can_require_concept_member_SOURCES_DIST = \
+ cpp14/can_require_concept_member.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_concept_member_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_member.$(OBJEXT)
+cpp14_can_require_concept_member_OBJECTS = \
+ $(am_cpp14_can_require_concept_member_OBJECTS)
+cpp14_can_require_concept_member_LDADD = $(LDADD)
+am__cpp14_can_require_concept_not_applicable_free_SOURCES_DIST = \
+ cpp14/can_require_concept_not_applicable_free.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_concept_not_applicable_free_OBJECTS = cpp14/can_require_concept_not_applicable_free.$(OBJEXT)
+cpp14_can_require_concept_not_applicable_free_OBJECTS = \
+ $(am_cpp14_can_require_concept_not_applicable_free_OBJECTS)
+cpp14_can_require_concept_not_applicable_free_LDADD = $(LDADD)
+am__cpp14_can_require_concept_not_applicable_member_SOURCES_DIST = \
+ cpp14/can_require_concept_not_applicable_member.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_concept_not_applicable_member_OBJECTS = cpp14/can_require_concept_not_applicable_member.$(OBJEXT)
+cpp14_can_require_concept_not_applicable_member_OBJECTS = \
+ $(am_cpp14_can_require_concept_not_applicable_member_OBJECTS)
+cpp14_can_require_concept_not_applicable_member_LDADD = $(LDADD)
+am__cpp14_can_require_concept_not_applicable_static_SOURCES_DIST = \
+ cpp14/can_require_concept_not_applicable_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_concept_not_applicable_static_OBJECTS = cpp14/can_require_concept_not_applicable_static.$(OBJEXT)
+cpp14_can_require_concept_not_applicable_static_OBJECTS = \
+ $(am_cpp14_can_require_concept_not_applicable_static_OBJECTS)
+cpp14_can_require_concept_not_applicable_static_LDADD = $(LDADD)
+am__cpp14_can_require_concept_not_applicable_unsupported_SOURCES_DIST = \
+ cpp14/can_require_concept_not_applicable_unsupported.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_concept_not_applicable_unsupported_OBJECTS = cpp14/can_require_concept_not_applicable_unsupported.$(OBJEXT)
+cpp14_can_require_concept_not_applicable_unsupported_OBJECTS = $(am_cpp14_can_require_concept_not_applicable_unsupported_OBJECTS)
+cpp14_can_require_concept_not_applicable_unsupported_LDADD = $(LDADD)
+am__cpp14_can_require_concept_static_SOURCES_DIST = \
+ cpp14/can_require_concept_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_concept_static_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_require_concept_static.$(OBJEXT)
+cpp14_can_require_concept_static_OBJECTS = \
+ $(am_cpp14_can_require_concept_static_OBJECTS)
+cpp14_can_require_concept_static_LDADD = $(LDADD)
+am__cpp14_can_require_concept_unsupported_SOURCES_DIST = \
+ cpp14/can_require_concept_unsupported.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_concept_unsupported_OBJECTS = cpp14/can_require_concept_unsupported.$(OBJEXT)
+cpp14_can_require_concept_unsupported_OBJECTS = \
+ $(am_cpp14_can_require_concept_unsupported_OBJECTS)
+cpp14_can_require_concept_unsupported_LDADD = $(LDADD)
+am__cpp14_can_require_free_SOURCES_DIST = cpp14/can_require_free.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_free_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_require_free.$(OBJEXT)
+cpp14_can_require_free_OBJECTS = $(am_cpp14_can_require_free_OBJECTS)
+cpp14_can_require_free_LDADD = $(LDADD)
+am__cpp14_can_require_member_SOURCES_DIST = \
+ cpp14/can_require_member.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_member_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_require_member.$(OBJEXT)
+cpp14_can_require_member_OBJECTS = \
+ $(am_cpp14_can_require_member_OBJECTS)
+cpp14_can_require_member_LDADD = $(LDADD)
+am__cpp14_can_require_not_applicable_free_SOURCES_DIST = \
+ cpp14/can_require_not_applicable_free.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_not_applicable_free_OBJECTS = cpp14/can_require_not_applicable_free.$(OBJEXT)
+cpp14_can_require_not_applicable_free_OBJECTS = \
+ $(am_cpp14_can_require_not_applicable_free_OBJECTS)
+cpp14_can_require_not_applicable_free_LDADD = $(LDADD)
+am__cpp14_can_require_not_applicable_member_SOURCES_DIST = \
+ cpp14/can_require_not_applicable_member.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_not_applicable_member_OBJECTS = cpp14/can_require_not_applicable_member.$(OBJEXT)
+cpp14_can_require_not_applicable_member_OBJECTS = \
+ $(am_cpp14_can_require_not_applicable_member_OBJECTS)
+cpp14_can_require_not_applicable_member_LDADD = $(LDADD)
+am__cpp14_can_require_not_applicable_static_SOURCES_DIST = \
+ cpp14/can_require_not_applicable_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_not_applicable_static_OBJECTS = cpp14/can_require_not_applicable_static.$(OBJEXT)
+cpp14_can_require_not_applicable_static_OBJECTS = \
+ $(am_cpp14_can_require_not_applicable_static_OBJECTS)
+cpp14_can_require_not_applicable_static_LDADD = $(LDADD)
+am__cpp14_can_require_not_applicable_unsupported_SOURCES_DIST = \
+ cpp14/can_require_not_applicable_unsupported.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_not_applicable_unsupported_OBJECTS = cpp14/can_require_not_applicable_unsupported.$(OBJEXT)
+cpp14_can_require_not_applicable_unsupported_OBJECTS = \
+ $(am_cpp14_can_require_not_applicable_unsupported_OBJECTS)
+cpp14_can_require_not_applicable_unsupported_LDADD = $(LDADD)
+am__cpp14_can_require_static_SOURCES_DIST = \
+ cpp14/can_require_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_static_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_require_static.$(OBJEXT)
+cpp14_can_require_static_OBJECTS = \
+ $(am_cpp14_can_require_static_OBJECTS)
+cpp14_can_require_static_LDADD = $(LDADD)
+am__cpp14_can_require_unsupported_SOURCES_DIST = \
+ cpp14/can_require_unsupported.cpp
+@HAVE_CXX14_TRUE@am_cpp14_can_require_unsupported_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/can_require_unsupported.$(OBJEXT)
+cpp14_can_require_unsupported_OBJECTS = \
+ $(am_cpp14_can_require_unsupported_OBJECTS)
+cpp14_can_require_unsupported_LDADD = $(LDADD)
+am__cpp14_prefer_free_prefer_SOURCES_DIST = \
+ cpp14/prefer_free_prefer.cpp
+@HAVE_CXX14_TRUE@am_cpp14_prefer_free_prefer_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/prefer_free_prefer.$(OBJEXT)
+cpp14_prefer_free_prefer_OBJECTS = \
+ $(am_cpp14_prefer_free_prefer_OBJECTS)
+cpp14_prefer_free_prefer_LDADD = $(LDADD)
+am__cpp14_prefer_free_require_SOURCES_DIST = \
+ cpp14/prefer_free_require.cpp
+@HAVE_CXX14_TRUE@am_cpp14_prefer_free_require_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/prefer_free_require.$(OBJEXT)
+cpp14_prefer_free_require_OBJECTS = \
+ $(am_cpp14_prefer_free_require_OBJECTS)
+cpp14_prefer_free_require_LDADD = $(LDADD)
+am__cpp14_prefer_member_prefer_SOURCES_DIST = \
+ cpp14/prefer_member_prefer.cpp
+@HAVE_CXX14_TRUE@am_cpp14_prefer_member_prefer_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/prefer_member_prefer.$(OBJEXT)
+cpp14_prefer_member_prefer_OBJECTS = \
+ $(am_cpp14_prefer_member_prefer_OBJECTS)
+cpp14_prefer_member_prefer_LDADD = $(LDADD)
+am__cpp14_prefer_member_require_SOURCES_DIST = \
+ cpp14/prefer_member_require.cpp
+@HAVE_CXX14_TRUE@am_cpp14_prefer_member_require_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/prefer_member_require.$(OBJEXT)
+cpp14_prefer_member_require_OBJECTS = \
+ $(am_cpp14_prefer_member_require_OBJECTS)
+cpp14_prefer_member_require_LDADD = $(LDADD)
+am__cpp14_prefer_static_SOURCES_DIST = cpp14/prefer_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_prefer_static_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/prefer_static.$(OBJEXT)
+cpp14_prefer_static_OBJECTS = $(am_cpp14_prefer_static_OBJECTS)
+cpp14_prefer_static_LDADD = $(LDADD)
+am__cpp14_prefer_unsupported_SOURCES_DIST = \
+ cpp14/prefer_unsupported.cpp
+@HAVE_CXX14_TRUE@am_cpp14_prefer_unsupported_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/prefer_unsupported.$(OBJEXT)
+cpp14_prefer_unsupported_OBJECTS = \
+ $(am_cpp14_prefer_unsupported_OBJECTS)
+cpp14_prefer_unsupported_LDADD = $(LDADD)
+am__cpp14_query_free_SOURCES_DIST = cpp14/query_free.cpp
+@HAVE_CXX14_TRUE@am_cpp14_query_free_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/query_free.$(OBJEXT)
+cpp14_query_free_OBJECTS = $(am_cpp14_query_free_OBJECTS)
+cpp14_query_free_LDADD = $(LDADD)
+am__cpp14_query_member_SOURCES_DIST = cpp14/query_member.cpp
+@HAVE_CXX14_TRUE@am_cpp14_query_member_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/query_member.$(OBJEXT)
+cpp14_query_member_OBJECTS = $(am_cpp14_query_member_OBJECTS)
+cpp14_query_member_LDADD = $(LDADD)
+am__cpp14_query_static_SOURCES_DIST = cpp14/query_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_query_static_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/query_static.$(OBJEXT)
+cpp14_query_static_OBJECTS = $(am_cpp14_query_static_OBJECTS)
+cpp14_query_static_LDADD = $(LDADD)
+am__cpp14_require_concept_free_SOURCES_DIST = \
+ cpp14/require_concept_free.cpp
+@HAVE_CXX14_TRUE@am_cpp14_require_concept_free_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/require_concept_free.$(OBJEXT)
+cpp14_require_concept_free_OBJECTS = \
+ $(am_cpp14_require_concept_free_OBJECTS)
+cpp14_require_concept_free_LDADD = $(LDADD)
+am__cpp14_require_concept_member_SOURCES_DIST = \
+ cpp14/require_concept_member.cpp
+@HAVE_CXX14_TRUE@am_cpp14_require_concept_member_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/require_concept_member.$(OBJEXT)
+cpp14_require_concept_member_OBJECTS = \
+ $(am_cpp14_require_concept_member_OBJECTS)
+cpp14_require_concept_member_LDADD = $(LDADD)
+am__cpp14_require_concept_static_SOURCES_DIST = \
+ cpp14/require_concept_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_require_concept_static_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/require_concept_static.$(OBJEXT)
+cpp14_require_concept_static_OBJECTS = \
+ $(am_cpp14_require_concept_static_OBJECTS)
+cpp14_require_concept_static_LDADD = $(LDADD)
+am__cpp14_require_free_SOURCES_DIST = cpp14/require_free.cpp
+@HAVE_CXX14_TRUE@am_cpp14_require_free_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/require_free.$(OBJEXT)
+cpp14_require_free_OBJECTS = $(am_cpp14_require_free_OBJECTS)
+cpp14_require_free_LDADD = $(LDADD)
+am__cpp14_require_member_SOURCES_DIST = cpp14/require_member.cpp
+@HAVE_CXX14_TRUE@am_cpp14_require_member_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/require_member.$(OBJEXT)
+cpp14_require_member_OBJECTS = $(am_cpp14_require_member_OBJECTS)
+cpp14_require_member_LDADD = $(LDADD)
+am__cpp14_require_static_SOURCES_DIST = cpp14/require_static.cpp
+@HAVE_CXX14_TRUE@am_cpp14_require_static_OBJECTS = \
+@HAVE_CXX14_TRUE@ cpp14/require_static.$(OBJEXT)
+cpp14_require_static_OBJECTS = $(am_cpp14_require_static_OBJECTS)
+cpp14_require_static_LDADD = $(LDADD)
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo " GEN " $@;
+am__v_GEN_1 =
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 =
+DEFAULT_INCLUDES = -I.@am__isrc@
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__maybe_remake_depfiles = depfiles
+am__depfiles_remade = cpp03/$(DEPDIR)/can_prefer_free_prefer.Po \
+ cpp03/$(DEPDIR)/can_prefer_free_require.Po \
+ cpp03/$(DEPDIR)/can_prefer_member_prefer.Po \
+ cpp03/$(DEPDIR)/can_prefer_member_require.Po \
+ cpp03/$(DEPDIR)/can_prefer_not_applicable_free_prefer.Po \
+ cpp03/$(DEPDIR)/can_prefer_not_applicable_free_require.Po \
+ cpp03/$(DEPDIR)/can_prefer_not_applicable_member_prefer.Po \
+ cpp03/$(DEPDIR)/can_prefer_not_applicable_member_require.Po \
+ cpp03/$(DEPDIR)/can_prefer_not_applicable_static.Po \
+ cpp03/$(DEPDIR)/can_prefer_not_applicable_unsupported.Po \
+ cpp03/$(DEPDIR)/can_prefer_not_preferable_free_prefer.Po \
+ cpp03/$(DEPDIR)/can_prefer_not_preferable_free_require.Po \
+ cpp03/$(DEPDIR)/can_prefer_not_preferable_member_prefer.Po \
+ cpp03/$(DEPDIR)/can_prefer_not_preferable_member_require.Po \
+ cpp03/$(DEPDIR)/can_prefer_not_preferable_static.Po \
+ cpp03/$(DEPDIR)/can_prefer_not_preferable_unsupported.Po \
+ cpp03/$(DEPDIR)/can_prefer_static.Po \
+ cpp03/$(DEPDIR)/can_prefer_unsupported.Po \
+ cpp03/$(DEPDIR)/can_query_free.Po \
+ cpp03/$(DEPDIR)/can_query_member.Po \
+ cpp03/$(DEPDIR)/can_query_not_applicable_free.Po \
+ cpp03/$(DEPDIR)/can_query_not_applicable_member.Po \
+ cpp03/$(DEPDIR)/can_query_not_applicable_static.Po \
+ cpp03/$(DEPDIR)/can_query_not_applicable_unsupported.Po \
+ cpp03/$(DEPDIR)/can_query_static.Po \
+ cpp03/$(DEPDIR)/can_query_unsupported.Po \
+ cpp03/$(DEPDIR)/can_require_concept_free.Po \
+ cpp03/$(DEPDIR)/can_require_concept_member.Po \
+ cpp03/$(DEPDIR)/can_require_concept_not_applicable_free.Po \
+ cpp03/$(DEPDIR)/can_require_concept_not_applicable_member.Po \
+ cpp03/$(DEPDIR)/can_require_concept_not_applicable_static.Po \
+ cpp03/$(DEPDIR)/can_require_concept_not_applicable_unsupported.Po \
+ cpp03/$(DEPDIR)/can_require_concept_static.Po \
+ cpp03/$(DEPDIR)/can_require_concept_unsupported.Po \
+ cpp03/$(DEPDIR)/can_require_free.Po \
+ cpp03/$(DEPDIR)/can_require_member.Po \
+ cpp03/$(DEPDIR)/can_require_not_applicable_free.Po \
+ cpp03/$(DEPDIR)/can_require_not_applicable_member.Po \
+ cpp03/$(DEPDIR)/can_require_not_applicable_static.Po \
+ cpp03/$(DEPDIR)/can_require_not_applicable_unsupported.Po \
+ cpp03/$(DEPDIR)/can_require_static.Po \
+ cpp03/$(DEPDIR)/can_require_unsupported.Po \
+ cpp03/$(DEPDIR)/prefer_free_prefer.Po \
+ cpp03/$(DEPDIR)/prefer_free_require.Po \
+ cpp03/$(DEPDIR)/prefer_member_prefer.Po \
+ cpp03/$(DEPDIR)/prefer_member_require.Po \
+ cpp03/$(DEPDIR)/prefer_static.Po \
+ cpp03/$(DEPDIR)/prefer_unsupported.Po \
+ cpp03/$(DEPDIR)/query_free.Po cpp03/$(DEPDIR)/query_member.Po \
+ cpp03/$(DEPDIR)/query_static.Po \
+ cpp03/$(DEPDIR)/require_concept_free.Po \
+ cpp03/$(DEPDIR)/require_concept_member.Po \
+ cpp03/$(DEPDIR)/require_concept_static.Po \
+ cpp03/$(DEPDIR)/require_free.Po \
+ cpp03/$(DEPDIR)/require_member.Po \
+ cpp03/$(DEPDIR)/require_static.Po \
+ cpp11/$(DEPDIR)/can_prefer_free_prefer.Po \
+ cpp11/$(DEPDIR)/can_prefer_free_require.Po \
+ cpp11/$(DEPDIR)/can_prefer_member_prefer.Po \
+ cpp11/$(DEPDIR)/can_prefer_member_require.Po \
+ cpp11/$(DEPDIR)/can_prefer_not_applicable_free_prefer.Po \
+ cpp11/$(DEPDIR)/can_prefer_not_applicable_free_require.Po \
+ cpp11/$(DEPDIR)/can_prefer_not_applicable_member_prefer.Po \
+ cpp11/$(DEPDIR)/can_prefer_not_applicable_member_require.Po \
+ cpp11/$(DEPDIR)/can_prefer_not_applicable_static.Po \
+ cpp11/$(DEPDIR)/can_prefer_not_applicable_unsupported.Po \
+ cpp11/$(DEPDIR)/can_prefer_not_preferable_free_prefer.Po \
+ cpp11/$(DEPDIR)/can_prefer_not_preferable_free_require.Po \
+ cpp11/$(DEPDIR)/can_prefer_not_preferable_member_prefer.Po \
+ cpp11/$(DEPDIR)/can_prefer_not_preferable_member_require.Po \
+ cpp11/$(DEPDIR)/can_prefer_not_preferable_static.Po \
+ cpp11/$(DEPDIR)/can_prefer_not_preferable_unsupported.Po \
+ cpp11/$(DEPDIR)/can_prefer_static.Po \
+ cpp11/$(DEPDIR)/can_prefer_unsupported.Po \
+ cpp11/$(DEPDIR)/can_query_free.Po \
+ cpp11/$(DEPDIR)/can_query_member.Po \
+ cpp11/$(DEPDIR)/can_query_not_applicable_free.Po \
+ cpp11/$(DEPDIR)/can_query_not_applicable_member.Po \
+ cpp11/$(DEPDIR)/can_query_not_applicable_static.Po \
+ cpp11/$(DEPDIR)/can_query_not_applicable_unsupported.Po \
+ cpp11/$(DEPDIR)/can_query_static.Po \
+ cpp11/$(DEPDIR)/can_query_unsupported.Po \
+ cpp11/$(DEPDIR)/can_require_concept_free.Po \
+ cpp11/$(DEPDIR)/can_require_concept_member.Po \
+ cpp11/$(DEPDIR)/can_require_concept_not_applicable_free.Po \
+ cpp11/$(DEPDIR)/can_require_concept_not_applicable_member.Po \
+ cpp11/$(DEPDIR)/can_require_concept_not_applicable_static.Po \
+ cpp11/$(DEPDIR)/can_require_concept_not_applicable_unsupported.Po \
+ cpp11/$(DEPDIR)/can_require_concept_static.Po \
+ cpp11/$(DEPDIR)/can_require_concept_unsupported.Po \
+ cpp11/$(DEPDIR)/can_require_free.Po \
+ cpp11/$(DEPDIR)/can_require_member.Po \
+ cpp11/$(DEPDIR)/can_require_not_applicable_free.Po \
+ cpp11/$(DEPDIR)/can_require_not_applicable_member.Po \
+ cpp11/$(DEPDIR)/can_require_not_applicable_static.Po \
+ cpp11/$(DEPDIR)/can_require_not_applicable_unsupported.Po \
+ cpp11/$(DEPDIR)/can_require_static.Po \
+ cpp11/$(DEPDIR)/can_require_unsupported.Po \
+ cpp11/$(DEPDIR)/prefer_free_prefer.Po \
+ cpp11/$(DEPDIR)/prefer_free_require.Po \
+ cpp11/$(DEPDIR)/prefer_member_prefer.Po \
+ cpp11/$(DEPDIR)/prefer_member_require.Po \
+ cpp11/$(DEPDIR)/prefer_static.Po \
+ cpp11/$(DEPDIR)/prefer_unsupported.Po \
+ cpp11/$(DEPDIR)/query_free.Po cpp11/$(DEPDIR)/query_member.Po \
+ cpp11/$(DEPDIR)/query_static.Po \
+ cpp11/$(DEPDIR)/require_concept_free.Po \
+ cpp11/$(DEPDIR)/require_concept_member.Po \
+ cpp11/$(DEPDIR)/require_concept_static.Po \
+ cpp11/$(DEPDIR)/require_free.Po \
+ cpp11/$(DEPDIR)/require_member.Po \
+ cpp11/$(DEPDIR)/require_static.Po \
+ cpp14/$(DEPDIR)/can_prefer_free_prefer.Po \
+ cpp14/$(DEPDIR)/can_prefer_free_require.Po \
+ cpp14/$(DEPDIR)/can_prefer_member_prefer.Po \
+ cpp14/$(DEPDIR)/can_prefer_member_require.Po \
+ cpp14/$(DEPDIR)/can_prefer_not_applicable_free_prefer.Po \
+ cpp14/$(DEPDIR)/can_prefer_not_applicable_free_require.Po \
+ cpp14/$(DEPDIR)/can_prefer_not_applicable_member_prefer.Po \
+ cpp14/$(DEPDIR)/can_prefer_not_applicable_member_require.Po \
+ cpp14/$(DEPDIR)/can_prefer_not_applicable_static.Po \
+ cpp14/$(DEPDIR)/can_prefer_not_applicable_unsupported.Po \
+ cpp14/$(DEPDIR)/can_prefer_not_preferable_free_prefer.Po \
+ cpp14/$(DEPDIR)/can_prefer_not_preferable_free_require.Po \
+ cpp14/$(DEPDIR)/can_prefer_not_preferable_member_prefer.Po \
+ cpp14/$(DEPDIR)/can_prefer_not_preferable_member_require.Po \
+ cpp14/$(DEPDIR)/can_prefer_not_preferable_static.Po \
+ cpp14/$(DEPDIR)/can_prefer_not_preferable_unsupported.Po \
+ cpp14/$(DEPDIR)/can_prefer_static.Po \
+ cpp14/$(DEPDIR)/can_prefer_unsupported.Po \
+ cpp14/$(DEPDIR)/can_query_free.Po \
+ cpp14/$(DEPDIR)/can_query_member.Po \
+ cpp14/$(DEPDIR)/can_query_not_applicable_free.Po \
+ cpp14/$(DEPDIR)/can_query_not_applicable_member.Po \
+ cpp14/$(DEPDIR)/can_query_not_applicable_static.Po \
+ cpp14/$(DEPDIR)/can_query_not_applicable_unsupported.Po \
+ cpp14/$(DEPDIR)/can_query_static.Po \
+ cpp14/$(DEPDIR)/can_query_unsupported.Po \
+ cpp14/$(DEPDIR)/can_require_concept_free.Po \
+ cpp14/$(DEPDIR)/can_require_concept_member.Po \
+ cpp14/$(DEPDIR)/can_require_concept_not_applicable_free.Po \
+ cpp14/$(DEPDIR)/can_require_concept_not_applicable_member.Po \
+ cpp14/$(DEPDIR)/can_require_concept_not_applicable_static.Po \
+ cpp14/$(DEPDIR)/can_require_concept_not_applicable_unsupported.Po \
+ cpp14/$(DEPDIR)/can_require_concept_static.Po \
+ cpp14/$(DEPDIR)/can_require_concept_unsupported.Po \
+ cpp14/$(DEPDIR)/can_require_free.Po \
+ cpp14/$(DEPDIR)/can_require_member.Po \
+ cpp14/$(DEPDIR)/can_require_not_applicable_free.Po \
+ cpp14/$(DEPDIR)/can_require_not_applicable_member.Po \
+ cpp14/$(DEPDIR)/can_require_not_applicable_static.Po \
+ cpp14/$(DEPDIR)/can_require_not_applicable_unsupported.Po \
+ cpp14/$(DEPDIR)/can_require_static.Po \
+ cpp14/$(DEPDIR)/can_require_unsupported.Po \
+ cpp14/$(DEPDIR)/prefer_free_prefer.Po \
+ cpp14/$(DEPDIR)/prefer_free_require.Po \
+ cpp14/$(DEPDIR)/prefer_member_prefer.Po \
+ cpp14/$(DEPDIR)/prefer_member_require.Po \
+ cpp14/$(DEPDIR)/prefer_static.Po \
+ cpp14/$(DEPDIR)/prefer_unsupported.Po \
+ cpp14/$(DEPDIR)/query_free.Po cpp14/$(DEPDIR)/query_member.Po \
+ cpp14/$(DEPDIR)/query_static.Po \
+ cpp14/$(DEPDIR)/require_concept_free.Po \
+ cpp14/$(DEPDIR)/require_concept_member.Po \
+ cpp14/$(DEPDIR)/require_concept_static.Po \
+ cpp14/$(DEPDIR)/require_free.Po \
+ cpp14/$(DEPDIR)/require_member.Po \
+ cpp14/$(DEPDIR)/require_static.Po
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+AM_V_CXX = $(am__v_CXX_@AM_V@)
+am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@)
+am__v_CXX_0 = @echo " CXX " $@;
+am__v_CXX_1 =
+CXXLD = $(CXX)
+CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
+ -o $@
+AM_V_CXXLD = $(am__v_CXXLD_@AM_V@)
+am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@)
+am__v_CXXLD_0 = @echo " CXXLD " $@;
+am__v_CXXLD_1 =
+SOURCES = $(cpp03_can_prefer_free_prefer_SOURCES) \
+ $(cpp03_can_prefer_free_require_SOURCES) \
+ $(cpp03_can_prefer_member_prefer_SOURCES) \
+ $(cpp03_can_prefer_member_require_SOURCES) \
+ $(cpp03_can_prefer_not_applicable_free_prefer_SOURCES) \
+ $(cpp03_can_prefer_not_applicable_free_require_SOURCES) \
+ $(cpp03_can_prefer_not_applicable_member_prefer_SOURCES) \
+ $(cpp03_can_prefer_not_applicable_member_require_SOURCES) \
+ $(cpp03_can_prefer_not_applicable_static_SOURCES) \
+ $(cpp03_can_prefer_not_applicable_unsupported_SOURCES) \
+ $(cpp03_can_prefer_not_preferable_free_prefer_SOURCES) \
+ $(cpp03_can_prefer_not_preferable_free_require_SOURCES) \
+ $(cpp03_can_prefer_not_preferable_member_prefer_SOURCES) \
+ $(cpp03_can_prefer_not_preferable_member_require_SOURCES) \
+ $(cpp03_can_prefer_not_preferable_static_SOURCES) \
+ $(cpp03_can_prefer_not_preferable_unsupported_SOURCES) \
+ $(cpp03_can_prefer_static_SOURCES) \
+ $(cpp03_can_prefer_unsupported_SOURCES) \
+ $(cpp03_can_query_free_SOURCES) \
+ $(cpp03_can_query_member_SOURCES) \
+ $(cpp03_can_query_not_applicable_free_SOURCES) \
+ $(cpp03_can_query_not_applicable_member_SOURCES) \
+ $(cpp03_can_query_not_applicable_static_SOURCES) \
+ $(cpp03_can_query_not_applicable_unsupported_SOURCES) \
+ $(cpp03_can_query_static_SOURCES) \
+ $(cpp03_can_query_unsupported_SOURCES) \
+ $(cpp03_can_require_concept_free_SOURCES) \
+ $(cpp03_can_require_concept_member_SOURCES) \
+ $(cpp03_can_require_concept_not_applicable_free_SOURCES) \
+ $(cpp03_can_require_concept_not_applicable_member_SOURCES) \
+ $(cpp03_can_require_concept_not_applicable_static_SOURCES) \
+ $(cpp03_can_require_concept_not_applicable_unsupported_SOURCES) \
+ $(cpp03_can_require_concept_static_SOURCES) \
+ $(cpp03_can_require_concept_unsupported_SOURCES) \
+ $(cpp03_can_require_free_SOURCES) \
+ $(cpp03_can_require_member_SOURCES) \
+ $(cpp03_can_require_not_applicable_free_SOURCES) \
+ $(cpp03_can_require_not_applicable_member_SOURCES) \
+ $(cpp03_can_require_not_applicable_static_SOURCES) \
+ $(cpp03_can_require_not_applicable_unsupported_SOURCES) \
+ $(cpp03_can_require_static_SOURCES) \
+ $(cpp03_can_require_unsupported_SOURCES) \
+ $(cpp03_prefer_free_prefer_SOURCES) \
+ $(cpp03_prefer_free_require_SOURCES) \
+ $(cpp03_prefer_member_prefer_SOURCES) \
+ $(cpp03_prefer_member_require_SOURCES) \
+ $(cpp03_prefer_static_SOURCES) \
+ $(cpp03_prefer_unsupported_SOURCES) \
+ $(cpp03_query_free_SOURCES) $(cpp03_query_member_SOURCES) \
+ $(cpp03_query_static_SOURCES) \
+ $(cpp03_require_concept_free_SOURCES) \
+ $(cpp03_require_concept_member_SOURCES) \
+ $(cpp03_require_concept_static_SOURCES) \
+ $(cpp03_require_free_SOURCES) $(cpp03_require_member_SOURCES) \
+ $(cpp03_require_static_SOURCES) \
+ $(cpp11_can_prefer_free_prefer_SOURCES) \
+ $(cpp11_can_prefer_free_require_SOURCES) \
+ $(cpp11_can_prefer_member_prefer_SOURCES) \
+ $(cpp11_can_prefer_member_require_SOURCES) \
+ $(cpp11_can_prefer_not_applicable_free_prefer_SOURCES) \
+ $(cpp11_can_prefer_not_applicable_free_require_SOURCES) \
+ $(cpp11_can_prefer_not_applicable_member_prefer_SOURCES) \
+ $(cpp11_can_prefer_not_applicable_member_require_SOURCES) \
+ $(cpp11_can_prefer_not_applicable_static_SOURCES) \
+ $(cpp11_can_prefer_not_applicable_unsupported_SOURCES) \
+ $(cpp11_can_prefer_not_preferable_free_prefer_SOURCES) \
+ $(cpp11_can_prefer_not_preferable_free_require_SOURCES) \
+ $(cpp11_can_prefer_not_preferable_member_prefer_SOURCES) \
+ $(cpp11_can_prefer_not_preferable_member_require_SOURCES) \
+ $(cpp11_can_prefer_not_preferable_static_SOURCES) \
+ $(cpp11_can_prefer_not_preferable_unsupported_SOURCES) \
+ $(cpp11_can_prefer_static_SOURCES) \
+ $(cpp11_can_prefer_unsupported_SOURCES) \
+ $(cpp11_can_query_free_SOURCES) \
+ $(cpp11_can_query_member_SOURCES) \
+ $(cpp11_can_query_not_applicable_free_SOURCES) \
+ $(cpp11_can_query_not_applicable_member_SOURCES) \
+ $(cpp11_can_query_not_applicable_static_SOURCES) \
+ $(cpp11_can_query_not_applicable_unsupported_SOURCES) \
+ $(cpp11_can_query_static_SOURCES) \
+ $(cpp11_can_query_unsupported_SOURCES) \
+ $(cpp11_can_require_concept_free_SOURCES) \
+ $(cpp11_can_require_concept_member_SOURCES) \
+ $(cpp11_can_require_concept_not_applicable_free_SOURCES) \
+ $(cpp11_can_require_concept_not_applicable_member_SOURCES) \
+ $(cpp11_can_require_concept_not_applicable_static_SOURCES) \
+ $(cpp11_can_require_concept_not_applicable_unsupported_SOURCES) \
+ $(cpp11_can_require_concept_static_SOURCES) \
+ $(cpp11_can_require_concept_unsupported_SOURCES) \
+ $(cpp11_can_require_free_SOURCES) \
+ $(cpp11_can_require_member_SOURCES) \
+ $(cpp11_can_require_not_applicable_free_SOURCES) \
+ $(cpp11_can_require_not_applicable_member_SOURCES) \
+ $(cpp11_can_require_not_applicable_static_SOURCES) \
+ $(cpp11_can_require_not_applicable_unsupported_SOURCES) \
+ $(cpp11_can_require_static_SOURCES) \
+ $(cpp11_can_require_unsupported_SOURCES) \
+ $(cpp11_prefer_free_prefer_SOURCES) \
+ $(cpp11_prefer_free_require_SOURCES) \
+ $(cpp11_prefer_member_prefer_SOURCES) \
+ $(cpp11_prefer_member_require_SOURCES) \
+ $(cpp11_prefer_static_SOURCES) \
+ $(cpp11_prefer_unsupported_SOURCES) \
+ $(cpp11_query_free_SOURCES) $(cpp11_query_member_SOURCES) \
+ $(cpp11_query_static_SOURCES) \
+ $(cpp11_require_concept_free_SOURCES) \
+ $(cpp11_require_concept_member_SOURCES) \
+ $(cpp11_require_concept_static_SOURCES) \
+ $(cpp11_require_free_SOURCES) $(cpp11_require_member_SOURCES) \
+ $(cpp11_require_static_SOURCES) \
+ $(cpp14_can_prefer_free_prefer_SOURCES) \
+ $(cpp14_can_prefer_free_require_SOURCES) \
+ $(cpp14_can_prefer_member_prefer_SOURCES) \
+ $(cpp14_can_prefer_member_require_SOURCES) \
+ $(cpp14_can_prefer_not_applicable_free_prefer_SOURCES) \
+ $(cpp14_can_prefer_not_applicable_free_require_SOURCES) \
+ $(cpp14_can_prefer_not_applicable_member_prefer_SOURCES) \
+ $(cpp14_can_prefer_not_applicable_member_require_SOURCES) \
+ $(cpp14_can_prefer_not_applicable_static_SOURCES) \
+ $(cpp14_can_prefer_not_applicable_unsupported_SOURCES) \
+ $(cpp14_can_prefer_not_preferable_free_prefer_SOURCES) \
+ $(cpp14_can_prefer_not_preferable_free_require_SOURCES) \
+ $(cpp14_can_prefer_not_preferable_member_prefer_SOURCES) \
+ $(cpp14_can_prefer_not_preferable_member_require_SOURCES) \
+ $(cpp14_can_prefer_not_preferable_static_SOURCES) \
+ $(cpp14_can_prefer_not_preferable_unsupported_SOURCES) \
+ $(cpp14_can_prefer_static_SOURCES) \
+ $(cpp14_can_prefer_unsupported_SOURCES) \
+ $(cpp14_can_query_free_SOURCES) \
+ $(cpp14_can_query_member_SOURCES) \
+ $(cpp14_can_query_not_applicable_free_SOURCES) \
+ $(cpp14_can_query_not_applicable_member_SOURCES) \
+ $(cpp14_can_query_not_applicable_static_SOURCES) \
+ $(cpp14_can_query_not_applicable_unsupported_SOURCES) \
+ $(cpp14_can_query_static_SOURCES) \
+ $(cpp14_can_query_unsupported_SOURCES) \
+ $(cpp14_can_require_concept_free_SOURCES) \
+ $(cpp14_can_require_concept_member_SOURCES) \
+ $(cpp14_can_require_concept_not_applicable_free_SOURCES) \
+ $(cpp14_can_require_concept_not_applicable_member_SOURCES) \
+ $(cpp14_can_require_concept_not_applicable_static_SOURCES) \
+ $(cpp14_can_require_concept_not_applicable_unsupported_SOURCES) \
+ $(cpp14_can_require_concept_static_SOURCES) \
+ $(cpp14_can_require_concept_unsupported_SOURCES) \
+ $(cpp14_can_require_free_SOURCES) \
+ $(cpp14_can_require_member_SOURCES) \
+ $(cpp14_can_require_not_applicable_free_SOURCES) \
+ $(cpp14_can_require_not_applicable_member_SOURCES) \
+ $(cpp14_can_require_not_applicable_static_SOURCES) \
+ $(cpp14_can_require_not_applicable_unsupported_SOURCES) \
+ $(cpp14_can_require_static_SOURCES) \
+ $(cpp14_can_require_unsupported_SOURCES) \
+ $(cpp14_prefer_free_prefer_SOURCES) \
+ $(cpp14_prefer_free_require_SOURCES) \
+ $(cpp14_prefer_member_prefer_SOURCES) \
+ $(cpp14_prefer_member_require_SOURCES) \
+ $(cpp14_prefer_static_SOURCES) \
+ $(cpp14_prefer_unsupported_SOURCES) \
+ $(cpp14_query_free_SOURCES) $(cpp14_query_member_SOURCES) \
+ $(cpp14_query_static_SOURCES) \
+ $(cpp14_require_concept_free_SOURCES) \
+ $(cpp14_require_concept_member_SOURCES) \
+ $(cpp14_require_concept_static_SOURCES) \
+ $(cpp14_require_free_SOURCES) $(cpp14_require_member_SOURCES) \
+ $(cpp14_require_static_SOURCES)
+DIST_SOURCES = $(cpp03_can_prefer_free_prefer_SOURCES) \
+ $(cpp03_can_prefer_free_require_SOURCES) \
+ $(cpp03_can_prefer_member_prefer_SOURCES) \
+ $(cpp03_can_prefer_member_require_SOURCES) \
+ $(cpp03_can_prefer_not_applicable_free_prefer_SOURCES) \
+ $(cpp03_can_prefer_not_applicable_free_require_SOURCES) \
+ $(cpp03_can_prefer_not_applicable_member_prefer_SOURCES) \
+ $(cpp03_can_prefer_not_applicable_member_require_SOURCES) \
+ $(cpp03_can_prefer_not_applicable_static_SOURCES) \
+ $(cpp03_can_prefer_not_applicable_unsupported_SOURCES) \
+ $(cpp03_can_prefer_not_preferable_free_prefer_SOURCES) \
+ $(cpp03_can_prefer_not_preferable_free_require_SOURCES) \
+ $(cpp03_can_prefer_not_preferable_member_prefer_SOURCES) \
+ $(cpp03_can_prefer_not_preferable_member_require_SOURCES) \
+ $(cpp03_can_prefer_not_preferable_static_SOURCES) \
+ $(cpp03_can_prefer_not_preferable_unsupported_SOURCES) \
+ $(cpp03_can_prefer_static_SOURCES) \
+ $(cpp03_can_prefer_unsupported_SOURCES) \
+ $(cpp03_can_query_free_SOURCES) \
+ $(cpp03_can_query_member_SOURCES) \
+ $(cpp03_can_query_not_applicable_free_SOURCES) \
+ $(cpp03_can_query_not_applicable_member_SOURCES) \
+ $(cpp03_can_query_not_applicable_static_SOURCES) \
+ $(cpp03_can_query_not_applicable_unsupported_SOURCES) \
+ $(cpp03_can_query_static_SOURCES) \
+ $(cpp03_can_query_unsupported_SOURCES) \
+ $(cpp03_can_require_concept_free_SOURCES) \
+ $(cpp03_can_require_concept_member_SOURCES) \
+ $(cpp03_can_require_concept_not_applicable_free_SOURCES) \
+ $(cpp03_can_require_concept_not_applicable_member_SOURCES) \
+ $(cpp03_can_require_concept_not_applicable_static_SOURCES) \
+ $(cpp03_can_require_concept_not_applicable_unsupported_SOURCES) \
+ $(cpp03_can_require_concept_static_SOURCES) \
+ $(cpp03_can_require_concept_unsupported_SOURCES) \
+ $(cpp03_can_require_free_SOURCES) \
+ $(cpp03_can_require_member_SOURCES) \
+ $(cpp03_can_require_not_applicable_free_SOURCES) \
+ $(cpp03_can_require_not_applicable_member_SOURCES) \
+ $(cpp03_can_require_not_applicable_static_SOURCES) \
+ $(cpp03_can_require_not_applicable_unsupported_SOURCES) \
+ $(cpp03_can_require_static_SOURCES) \
+ $(cpp03_can_require_unsupported_SOURCES) \
+ $(cpp03_prefer_free_prefer_SOURCES) \
+ $(cpp03_prefer_free_require_SOURCES) \
+ $(cpp03_prefer_member_prefer_SOURCES) \
+ $(cpp03_prefer_member_require_SOURCES) \
+ $(cpp03_prefer_static_SOURCES) \
+ $(cpp03_prefer_unsupported_SOURCES) \
+ $(cpp03_query_free_SOURCES) $(cpp03_query_member_SOURCES) \
+ $(cpp03_query_static_SOURCES) \
+ $(cpp03_require_concept_free_SOURCES) \
+ $(cpp03_require_concept_member_SOURCES) \
+ $(cpp03_require_concept_static_SOURCES) \
+ $(cpp03_require_free_SOURCES) $(cpp03_require_member_SOURCES) \
+ $(cpp03_require_static_SOURCES) \
+ $(am__cpp11_can_prefer_free_prefer_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_free_require_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_member_prefer_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_member_require_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_not_applicable_free_prefer_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_not_applicable_free_require_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_not_applicable_member_prefer_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_not_applicable_member_require_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_not_applicable_static_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_not_applicable_unsupported_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_not_preferable_free_prefer_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_not_preferable_free_require_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_not_preferable_member_prefer_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_not_preferable_member_require_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_not_preferable_static_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_not_preferable_unsupported_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_static_SOURCES_DIST) \
+ $(am__cpp11_can_prefer_unsupported_SOURCES_DIST) \
+ $(am__cpp11_can_query_free_SOURCES_DIST) \
+ $(am__cpp11_can_query_member_SOURCES_DIST) \
+ $(am__cpp11_can_query_not_applicable_free_SOURCES_DIST) \
+ $(am__cpp11_can_query_not_applicable_member_SOURCES_DIST) \
+ $(am__cpp11_can_query_not_applicable_static_SOURCES_DIST) \
+ $(am__cpp11_can_query_not_applicable_unsupported_SOURCES_DIST) \
+ $(am__cpp11_can_query_static_SOURCES_DIST) \
+ $(am__cpp11_can_query_unsupported_SOURCES_DIST) \
+ $(am__cpp11_can_require_concept_free_SOURCES_DIST) \
+ $(am__cpp11_can_require_concept_member_SOURCES_DIST) \
+ $(am__cpp11_can_require_concept_not_applicable_free_SOURCES_DIST) \
+ $(am__cpp11_can_require_concept_not_applicable_member_SOURCES_DIST) \
+ $(am__cpp11_can_require_concept_not_applicable_static_SOURCES_DIST) \
+ $(am__cpp11_can_require_concept_not_applicable_unsupported_SOURCES_DIST) \
+ $(am__cpp11_can_require_concept_static_SOURCES_DIST) \
+ $(am__cpp11_can_require_concept_unsupported_SOURCES_DIST) \
+ $(am__cpp11_can_require_free_SOURCES_DIST) \
+ $(am__cpp11_can_require_member_SOURCES_DIST) \
+ $(am__cpp11_can_require_not_applicable_free_SOURCES_DIST) \
+ $(am__cpp11_can_require_not_applicable_member_SOURCES_DIST) \
+ $(am__cpp11_can_require_not_applicable_static_SOURCES_DIST) \
+ $(am__cpp11_can_require_not_applicable_unsupported_SOURCES_DIST) \
+ $(am__cpp11_can_require_static_SOURCES_DIST) \
+ $(am__cpp11_can_require_unsupported_SOURCES_DIST) \
+ $(am__cpp11_prefer_free_prefer_SOURCES_DIST) \
+ $(am__cpp11_prefer_free_require_SOURCES_DIST) \
+ $(am__cpp11_prefer_member_prefer_SOURCES_DIST) \
+ $(am__cpp11_prefer_member_require_SOURCES_DIST) \
+ $(am__cpp11_prefer_static_SOURCES_DIST) \
+ $(am__cpp11_prefer_unsupported_SOURCES_DIST) \
+ $(am__cpp11_query_free_SOURCES_DIST) \
+ $(am__cpp11_query_member_SOURCES_DIST) \
+ $(am__cpp11_query_static_SOURCES_DIST) \
+ $(am__cpp11_require_concept_free_SOURCES_DIST) \
+ $(am__cpp11_require_concept_member_SOURCES_DIST) \
+ $(am__cpp11_require_concept_static_SOURCES_DIST) \
+ $(am__cpp11_require_free_SOURCES_DIST) \
+ $(am__cpp11_require_member_SOURCES_DIST) \
+ $(am__cpp11_require_static_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_free_prefer_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_free_require_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_member_prefer_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_member_require_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_not_applicable_free_prefer_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_not_applicable_free_require_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_not_applicable_member_prefer_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_not_applicable_member_require_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_not_applicable_static_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_not_applicable_unsupported_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_not_preferable_free_prefer_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_not_preferable_free_require_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_not_preferable_member_prefer_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_not_preferable_member_require_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_not_preferable_static_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_not_preferable_unsupported_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_static_SOURCES_DIST) \
+ $(am__cpp14_can_prefer_unsupported_SOURCES_DIST) \
+ $(am__cpp14_can_query_free_SOURCES_DIST) \
+ $(am__cpp14_can_query_member_SOURCES_DIST) \
+ $(am__cpp14_can_query_not_applicable_free_SOURCES_DIST) \
+ $(am__cpp14_can_query_not_applicable_member_SOURCES_DIST) \
+ $(am__cpp14_can_query_not_applicable_static_SOURCES_DIST) \
+ $(am__cpp14_can_query_not_applicable_unsupported_SOURCES_DIST) \
+ $(am__cpp14_can_query_static_SOURCES_DIST) \
+ $(am__cpp14_can_query_unsupported_SOURCES_DIST) \
+ $(am__cpp14_can_require_concept_free_SOURCES_DIST) \
+ $(am__cpp14_can_require_concept_member_SOURCES_DIST) \
+ $(am__cpp14_can_require_concept_not_applicable_free_SOURCES_DIST) \
+ $(am__cpp14_can_require_concept_not_applicable_member_SOURCES_DIST) \
+ $(am__cpp14_can_require_concept_not_applicable_static_SOURCES_DIST) \
+ $(am__cpp14_can_require_concept_not_applicable_unsupported_SOURCES_DIST) \
+ $(am__cpp14_can_require_concept_static_SOURCES_DIST) \
+ $(am__cpp14_can_require_concept_unsupported_SOURCES_DIST) \
+ $(am__cpp14_can_require_free_SOURCES_DIST) \
+ $(am__cpp14_can_require_member_SOURCES_DIST) \
+ $(am__cpp14_can_require_not_applicable_free_SOURCES_DIST) \
+ $(am__cpp14_can_require_not_applicable_member_SOURCES_DIST) \
+ $(am__cpp14_can_require_not_applicable_static_SOURCES_DIST) \
+ $(am__cpp14_can_require_not_applicable_unsupported_SOURCES_DIST) \
+ $(am__cpp14_can_require_static_SOURCES_DIST) \
+ $(am__cpp14_can_require_unsupported_SOURCES_DIST) \
+ $(am__cpp14_prefer_free_prefer_SOURCES_DIST) \
+ $(am__cpp14_prefer_free_require_SOURCES_DIST) \
+ $(am__cpp14_prefer_member_prefer_SOURCES_DIST) \
+ $(am__cpp14_prefer_member_require_SOURCES_DIST) \
+ $(am__cpp14_prefer_static_SOURCES_DIST) \
+ $(am__cpp14_prefer_unsupported_SOURCES_DIST) \
+ $(am__cpp14_query_free_SOURCES_DIST) \
+ $(am__cpp14_query_member_SOURCES_DIST) \
+ $(am__cpp14_query_static_SOURCES_DIST) \
+ $(am__cpp14_require_concept_free_SOURCES_DIST) \
+ $(am__cpp14_require_concept_member_SOURCES_DIST) \
+ $(am__cpp14_require_concept_static_SOURCES_DIST) \
+ $(am__cpp14_require_free_SOURCES_DIST) \
+ $(am__cpp14_require_member_SOURCES_DIST) \
+ $(am__cpp14_require_static_SOURCES_DIST)
+am__can_run_installinfo = \
+ case $$AM_UPDATE_INFO_DIR in \
+ n|no|NO) false;; \
+ *) (install-info --version) >/dev/null 2>&1;; \
+ esac
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates. Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+ BEGIN { nonempty = 0; } \
+ { items[$$0] = 1; nonempty = 1; } \
+ END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique. This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+ list='$(am__tagged_files)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | $(am__uniquify_input)`
+am__tty_colors_dummy = \
+ mgn= red= grn= lgn= blu= brg= std=; \
+ am__color_tests=no
+am__tty_colors = { \
+ $(am__tty_colors_dummy); \
+ if test "X$(AM_COLOR_TESTS)" = Xno; then \
+ am__color_tests=no; \
+ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \
+ am__color_tests=yes; \
+ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \
+ am__color_tests=yes; \
+ fi; \
+ if test $$am__color_tests = yes; then \
+ red=''; \
+ grn=''; \
+ lgn=''; \
+ blu=''; \
+ mgn=''; \
+ brg=''; \
+ std=''; \
+ fi; \
+}
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+ *) f=$$p;; \
+ esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+ if (++n[$$2] == $(am__install_max)) \
+ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+ END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+ test -z "$$files" \
+ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+ $(am__cd) "$$dir" && rm -f $$files; }; \
+ }
+am__recheck_rx = ^[ ]*:recheck:[ ]*
+am__global_test_result_rx = ^[ ]*:global-test-result:[ ]*
+am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]*
+# A command that, given a newline-separated list of test names on the
+# standard input, print the name of the tests that are to be re-run
+# upon "make recheck".
+am__list_recheck_tests = $(AWK) '{ \
+ recheck = 1; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ { \
+ if ((getline line2 < ($$0 ".log")) < 0) \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \
+ { \
+ recheck = 0; \
+ break; \
+ } \
+ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \
+ { \
+ break; \
+ } \
+ }; \
+ if (recheck) \
+ print $$0; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# A command that, given a newline-separated list of test names on the
+# standard input, create the global log from their .trs and .log files.
+am__create_global_log = $(AWK) ' \
+function fatal(msg) \
+{ \
+ print "fatal: making $@: " msg | "cat >&2"; \
+ exit 1; \
+} \
+function rst_section(header) \
+{ \
+ print header; \
+ len = length(header); \
+ for (i = 1; i <= len; i = i + 1) \
+ printf "="; \
+ printf "\n\n"; \
+} \
+{ \
+ copy_in_global_log = 1; \
+ global_test_result = "RUN"; \
+ while ((rc = (getline line < ($$0 ".trs"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".trs"); \
+ if (line ~ /$(am__global_test_result_rx)/) \
+ { \
+ sub("$(am__global_test_result_rx)", "", line); \
+ sub("[ ]*$$", "", line); \
+ global_test_result = line; \
+ } \
+ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \
+ copy_in_global_log = 0; \
+ }; \
+ if (copy_in_global_log) \
+ { \
+ rst_section(global_test_result ": " $$0); \
+ while ((rc = (getline line < ($$0 ".log"))) != 0) \
+ { \
+ if (rc < 0) \
+ fatal("failed to read from " $$0 ".log"); \
+ print line; \
+ }; \
+ printf "\n"; \
+ }; \
+ close ($$0 ".trs"); \
+ close ($$0 ".log"); \
+}'
+# Restructured Text title.
+am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; }
+# Solaris 10 'make', and several other traditional 'make' implementations,
+# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it
+# by disabling -e (using the XSI extension "set +e") if it's set.
+am__sh_e_setup = case $$- in *e*) set +e;; esac
+# Default flags passed to test drivers.
+am__common_driver_flags = \
+ --color-tests "$$am__color_tests" \
+ --enable-hard-errors "$$am__enable_hard_errors" \
+ --expect-failure "$$am__expect_failure"
+# To be inserted before the command running the test. Creates the
+# directory for the log if needed. Stores in $dir the directory
+# containing $f, in $tst the test, in $log the log. Executes the
+# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and
+# passes TESTS_ENVIRONMENT. Set up options for the wrapper that
+# will run the test scripts (or their associated LOG_COMPILER, if
+# thy have one).
+am__check_pre = \
+$(am__sh_e_setup); \
+$(am__vpath_adj_setup) $(am__vpath_adj) \
+$(am__tty_colors); \
+srcdir=$(srcdir); export srcdir; \
+case "$@" in \
+ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \
+ *) am__odir=.;; \
+esac; \
+test "x$$am__odir" = x"." || test -d "$$am__odir" \
+ || $(MKDIR_P) "$$am__odir" || exit $$?; \
+if test -f "./$$f"; then dir=./; \
+elif test -f "$$f"; then dir=; \
+else dir="$(srcdir)/"; fi; \
+tst=$$dir$$f; log='$@'; \
+if test -n '$(DISABLE_HARD_ERRORS)'; then \
+ am__enable_hard_errors=no; \
+else \
+ am__enable_hard_errors=yes; \
+fi; \
+case " $(XFAIL_TESTS) " in \
+ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \
+ am__expect_failure=yes;; \
+ *) \
+ am__expect_failure=no;; \
+esac; \
+$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT)
+# A shell command to get the names of the tests scripts with any registered
+# extension removed (i.e., equivalently, the names of the test logs, with
+# the '.log' extension removed). The result is saved in the shell variable
+# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly,
+# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)",
+# since that might cause problem with VPATH rewrites for suffix-less tests.
+# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'.
+am__set_TESTS_bases = \
+ bases='$(TEST_LOGS)'; \
+ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \
+ bases=`echo $$bases`
+AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)'
+RECHECK_LOGS = $(TEST_LOGS)
+AM_RECURSIVE_TARGETS = check recheck
+TEST_SUITE_LOG = test-suite.log
+TEST_EXTENSIONS = @EXEEXT@ .test
+LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS)
+am__set_b = \
+ case '$@' in \
+ */*) \
+ case '$*' in \
+ */*) b='$*';; \
+ *) b=`echo '$@' | sed 's/\.log$$//'`; \
+ esac;; \
+ *) \
+ b='$*';; \
+ esac
+am__test_logs1 = $(TESTS:=.log)
+am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log)
+TEST_LOGS = $(am__test_logs2:.test.log=.log)
+TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
+TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
+ $(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp \
+ $(top_srcdir)/test-driver
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+CSCOPE = @CSCOPE@
+CTAGS = @CTAGS@
+CXX = @CXX@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+ETAGS = @ETAGS@
+EXEEXT = @EXEEXT@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MKDIR_P = @MKDIR_P@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgconfigdir = @pkgconfigdir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+AUTOMAKE_OPTIONS = subdir-objects
+cpp03_query_free_SOURCES = cpp03/query_free.cpp
+cpp03_query_member_SOURCES = cpp03/query_member.cpp
+cpp03_query_static_SOURCES = cpp03/query_static.cpp
+cpp03_can_query_free_SOURCES = cpp03/can_query_free.cpp
+cpp03_can_query_member_SOURCES = cpp03/can_query_member.cpp
+cpp03_can_query_static_SOURCES = cpp03/can_query_static.cpp
+cpp03_can_query_unsupported_SOURCES = cpp03/can_query_unsupported.cpp
+cpp03_can_query_not_applicable_free_SOURCES = cpp03/can_query_not_applicable_free.cpp
+cpp03_can_query_not_applicable_member_SOURCES = cpp03/can_query_not_applicable_member.cpp
+cpp03_can_query_not_applicable_static_SOURCES = cpp03/can_query_not_applicable_static.cpp
+cpp03_can_query_not_applicable_unsupported_SOURCES = cpp03/can_query_not_applicable_unsupported.cpp
+cpp03_require_concept_free_SOURCES = cpp03/require_concept_free.cpp
+cpp03_require_concept_member_SOURCES = cpp03/require_concept_member.cpp
+cpp03_require_concept_static_SOURCES = cpp03/require_concept_static.cpp
+cpp03_can_require_concept_free_SOURCES = cpp03/can_require_concept_free.cpp
+cpp03_can_require_concept_member_SOURCES = cpp03/can_require_concept_member.cpp
+cpp03_can_require_concept_static_SOURCES = cpp03/can_require_concept_static.cpp
+cpp03_can_require_concept_unsupported_SOURCES = cpp03/can_require_concept_unsupported.cpp
+cpp03_can_require_concept_not_applicable_free_SOURCES = cpp03/can_require_concept_not_applicable_free.cpp
+cpp03_can_require_concept_not_applicable_member_SOURCES = cpp03/can_require_concept_not_applicable_member.cpp
+cpp03_can_require_concept_not_applicable_static_SOURCES = cpp03/can_require_concept_not_applicable_static.cpp
+cpp03_can_require_concept_not_applicable_unsupported_SOURCES = cpp03/can_require_concept_not_applicable_unsupported.cpp
+cpp03_require_free_SOURCES = cpp03/require_free.cpp
+cpp03_require_member_SOURCES = cpp03/require_member.cpp
+cpp03_require_static_SOURCES = cpp03/require_static.cpp
+cpp03_can_require_free_SOURCES = cpp03/can_require_free.cpp
+cpp03_can_require_member_SOURCES = cpp03/can_require_member.cpp
+cpp03_can_require_static_SOURCES = cpp03/can_require_static.cpp
+cpp03_can_require_unsupported_SOURCES = cpp03/can_require_unsupported.cpp
+cpp03_can_require_not_applicable_free_SOURCES = cpp03/can_require_not_applicable_free.cpp
+cpp03_can_require_not_applicable_member_SOURCES = cpp03/can_require_not_applicable_member.cpp
+cpp03_can_require_not_applicable_static_SOURCES = cpp03/can_require_not_applicable_static.cpp
+cpp03_can_require_not_applicable_unsupported_SOURCES = cpp03/can_require_not_applicable_unsupported.cpp
+cpp03_prefer_free_prefer_SOURCES = cpp03/prefer_free_prefer.cpp
+cpp03_prefer_free_require_SOURCES = cpp03/prefer_free_require.cpp
+cpp03_prefer_member_prefer_SOURCES = cpp03/prefer_member_prefer.cpp
+cpp03_prefer_member_require_SOURCES = cpp03/prefer_member_require.cpp
+cpp03_prefer_static_SOURCES = cpp03/prefer_static.cpp
+cpp03_prefer_unsupported_SOURCES = cpp03/prefer_unsupported.cpp
+cpp03_can_prefer_free_prefer_SOURCES = cpp03/can_prefer_free_prefer.cpp
+cpp03_can_prefer_free_require_SOURCES = cpp03/can_prefer_free_require.cpp
+cpp03_can_prefer_member_prefer_SOURCES = cpp03/can_prefer_member_prefer.cpp
+cpp03_can_prefer_member_require_SOURCES = cpp03/can_prefer_member_require.cpp
+cpp03_can_prefer_static_SOURCES = cpp03/can_prefer_static.cpp
+cpp03_can_prefer_unsupported_SOURCES = cpp03/can_prefer_unsupported.cpp
+cpp03_can_prefer_not_applicable_free_prefer_SOURCES = cpp03/can_prefer_not_applicable_free_prefer.cpp
+cpp03_can_prefer_not_applicable_free_require_SOURCES = cpp03/can_prefer_not_applicable_free_require.cpp
+cpp03_can_prefer_not_applicable_member_prefer_SOURCES = cpp03/can_prefer_not_applicable_member_prefer.cpp
+cpp03_can_prefer_not_applicable_member_require_SOURCES = cpp03/can_prefer_not_applicable_member_require.cpp
+cpp03_can_prefer_not_applicable_static_SOURCES = cpp03/can_prefer_not_applicable_static.cpp
+cpp03_can_prefer_not_applicable_unsupported_SOURCES = cpp03/can_prefer_not_applicable_unsupported.cpp
+cpp03_can_prefer_not_preferable_free_prefer_SOURCES = cpp03/can_prefer_not_preferable_free_prefer.cpp
+cpp03_can_prefer_not_preferable_free_require_SOURCES = cpp03/can_prefer_not_preferable_free_require.cpp
+cpp03_can_prefer_not_preferable_member_prefer_SOURCES = cpp03/can_prefer_not_preferable_member_prefer.cpp
+cpp03_can_prefer_not_preferable_member_require_SOURCES = cpp03/can_prefer_not_preferable_member_require.cpp
+cpp03_can_prefer_not_preferable_static_SOURCES = cpp03/can_prefer_not_preferable_static.cpp
+cpp03_can_prefer_not_preferable_unsupported_SOURCES = cpp03/can_prefer_not_preferable_unsupported.cpp
+@HAVE_CXX11_TRUE@cpp11_query_free_SOURCES = cpp11/query_free.cpp
+@HAVE_CXX11_TRUE@cpp11_query_member_SOURCES = cpp11/query_member.cpp
+@HAVE_CXX11_TRUE@cpp11_query_static_SOURCES = cpp11/query_static.cpp
+@HAVE_CXX11_TRUE@cpp11_can_query_free_SOURCES = cpp11/can_query_free.cpp
+@HAVE_CXX11_TRUE@cpp11_can_query_member_SOURCES = cpp11/can_query_member.cpp
+@HAVE_CXX11_TRUE@cpp11_can_query_static_SOURCES = cpp11/can_query_static.cpp
+@HAVE_CXX11_TRUE@cpp11_can_query_unsupported_SOURCES = cpp11/can_query_unsupported.cpp
+@HAVE_CXX11_TRUE@cpp11_can_query_not_applicable_free_SOURCES = cpp11/can_query_not_applicable_free.cpp
+@HAVE_CXX11_TRUE@cpp11_can_query_not_applicable_member_SOURCES = cpp11/can_query_not_applicable_member.cpp
+@HAVE_CXX11_TRUE@cpp11_can_query_not_applicable_static_SOURCES = cpp11/can_query_not_applicable_static.cpp
+@HAVE_CXX11_TRUE@cpp11_can_query_not_applicable_unsupported_SOURCES = cpp11/can_query_not_applicable_unsupported.cpp
+@HAVE_CXX11_TRUE@cpp11_require_concept_free_SOURCES = cpp11/require_concept_free.cpp
+@HAVE_CXX11_TRUE@cpp11_require_concept_member_SOURCES = cpp11/require_concept_member.cpp
+@HAVE_CXX11_TRUE@cpp11_require_concept_static_SOURCES = cpp11/require_concept_static.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_concept_free_SOURCES = cpp11/can_require_concept_free.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_concept_member_SOURCES = cpp11/can_require_concept_member.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_concept_static_SOURCES = cpp11/can_require_concept_static.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_concept_unsupported_SOURCES = cpp11/can_require_concept_unsupported.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_concept_not_applicable_free_SOURCES = cpp11/can_require_concept_not_applicable_free.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_concept_not_applicable_member_SOURCES = cpp11/can_require_concept_not_applicable_member.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_concept_not_applicable_static_SOURCES = cpp11/can_require_concept_not_applicable_static.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_concept_not_applicable_unsupported_SOURCES = cpp11/can_require_concept_not_applicable_unsupported.cpp
+@HAVE_CXX11_TRUE@cpp11_require_free_SOURCES = cpp11/require_free.cpp
+@HAVE_CXX11_TRUE@cpp11_require_member_SOURCES = cpp11/require_member.cpp
+@HAVE_CXX11_TRUE@cpp11_require_static_SOURCES = cpp11/require_static.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_free_SOURCES = cpp11/can_require_free.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_member_SOURCES = cpp11/can_require_member.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_static_SOURCES = cpp11/can_require_static.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_unsupported_SOURCES = cpp11/can_require_unsupported.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_not_applicable_free_SOURCES = cpp11/can_require_not_applicable_free.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_not_applicable_member_SOURCES = cpp11/can_require_not_applicable_member.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_not_applicable_static_SOURCES = cpp11/can_require_not_applicable_static.cpp
+@HAVE_CXX11_TRUE@cpp11_can_require_not_applicable_unsupported_SOURCES = cpp11/can_require_not_applicable_unsupported.cpp
+@HAVE_CXX11_TRUE@cpp11_prefer_free_prefer_SOURCES = cpp11/prefer_free_prefer.cpp
+@HAVE_CXX11_TRUE@cpp11_prefer_free_require_SOURCES = cpp11/prefer_free_require.cpp
+@HAVE_CXX11_TRUE@cpp11_prefer_member_prefer_SOURCES = cpp11/prefer_member_prefer.cpp
+@HAVE_CXX11_TRUE@cpp11_prefer_member_require_SOURCES = cpp11/prefer_member_require.cpp
+@HAVE_CXX11_TRUE@cpp11_prefer_static_SOURCES = cpp11/prefer_static.cpp
+@HAVE_CXX11_TRUE@cpp11_prefer_unsupported_SOURCES = cpp11/prefer_unsupported.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_free_prefer_SOURCES = cpp11/can_prefer_free_prefer.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_free_require_SOURCES = cpp11/can_prefer_free_require.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_member_prefer_SOURCES = cpp11/can_prefer_member_prefer.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_member_require_SOURCES = cpp11/can_prefer_member_require.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_static_SOURCES = cpp11/can_prefer_static.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_unsupported_SOURCES = cpp11/can_prefer_unsupported.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_not_applicable_free_prefer_SOURCES = cpp11/can_prefer_not_applicable_free_prefer.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_not_applicable_free_require_SOURCES = cpp11/can_prefer_not_applicable_free_require.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_not_applicable_member_prefer_SOURCES = cpp11/can_prefer_not_applicable_member_prefer.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_not_applicable_member_require_SOURCES = cpp11/can_prefer_not_applicable_member_require.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_not_applicable_static_SOURCES = cpp11/can_prefer_not_applicable_static.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_not_applicable_unsupported_SOURCES = cpp11/can_prefer_not_applicable_unsupported.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_not_preferable_free_prefer_SOURCES = cpp11/can_prefer_not_preferable_free_prefer.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_not_preferable_free_require_SOURCES = cpp11/can_prefer_not_preferable_free_require.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_not_preferable_member_prefer_SOURCES = cpp11/can_prefer_not_preferable_member_prefer.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_not_preferable_member_require_SOURCES = cpp11/can_prefer_not_preferable_member_require.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_not_preferable_static_SOURCES = cpp11/can_prefer_not_preferable_static.cpp
+@HAVE_CXX11_TRUE@cpp11_can_prefer_not_preferable_unsupported_SOURCES = cpp11/can_prefer_not_preferable_unsupported.cpp
+@HAVE_CXX14_TRUE@cpp14_query_free_SOURCES = cpp14/query_free.cpp
+@HAVE_CXX14_TRUE@cpp14_query_member_SOURCES = cpp14/query_member.cpp
+@HAVE_CXX14_TRUE@cpp14_query_static_SOURCES = cpp14/query_static.cpp
+@HAVE_CXX14_TRUE@cpp14_can_query_free_SOURCES = cpp14/can_query_free.cpp
+@HAVE_CXX14_TRUE@cpp14_can_query_member_SOURCES = cpp14/can_query_member.cpp
+@HAVE_CXX14_TRUE@cpp14_can_query_static_SOURCES = cpp14/can_query_static.cpp
+@HAVE_CXX14_TRUE@cpp14_can_query_unsupported_SOURCES = cpp14/can_query_unsupported.cpp
+@HAVE_CXX14_TRUE@cpp14_can_query_not_applicable_free_SOURCES = cpp14/can_query_not_applicable_free.cpp
+@HAVE_CXX14_TRUE@cpp14_can_query_not_applicable_member_SOURCES = cpp14/can_query_not_applicable_member.cpp
+@HAVE_CXX14_TRUE@cpp14_can_query_not_applicable_static_SOURCES = cpp14/can_query_not_applicable_static.cpp
+@HAVE_CXX14_TRUE@cpp14_can_query_not_applicable_unsupported_SOURCES = cpp14/can_query_not_applicable_unsupported.cpp
+@HAVE_CXX14_TRUE@cpp14_require_concept_free_SOURCES = cpp14/require_concept_free.cpp
+@HAVE_CXX14_TRUE@cpp14_require_concept_member_SOURCES = cpp14/require_concept_member.cpp
+@HAVE_CXX14_TRUE@cpp14_require_concept_static_SOURCES = cpp14/require_concept_static.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_concept_free_SOURCES = cpp14/can_require_concept_free.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_concept_member_SOURCES = cpp14/can_require_concept_member.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_concept_static_SOURCES = cpp14/can_require_concept_static.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_concept_unsupported_SOURCES = cpp14/can_require_concept_unsupported.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_concept_not_applicable_free_SOURCES = cpp14/can_require_concept_not_applicable_free.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_concept_not_applicable_member_SOURCES = cpp14/can_require_concept_not_applicable_member.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_concept_not_applicable_static_SOURCES = cpp14/can_require_concept_not_applicable_static.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_concept_not_applicable_unsupported_SOURCES = cpp14/can_require_concept_not_applicable_unsupported.cpp
+@HAVE_CXX14_TRUE@cpp14_require_free_SOURCES = cpp14/require_free.cpp
+@HAVE_CXX14_TRUE@cpp14_require_member_SOURCES = cpp14/require_member.cpp
+@HAVE_CXX14_TRUE@cpp14_require_static_SOURCES = cpp14/require_static.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_free_SOURCES = cpp14/can_require_free.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_member_SOURCES = cpp14/can_require_member.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_static_SOURCES = cpp14/can_require_static.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_unsupported_SOURCES = cpp14/can_require_unsupported.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_not_applicable_free_SOURCES = cpp14/can_require_not_applicable_free.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_not_applicable_member_SOURCES = cpp14/can_require_not_applicable_member.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_not_applicable_static_SOURCES = cpp14/can_require_not_applicable_static.cpp
+@HAVE_CXX14_TRUE@cpp14_can_require_not_applicable_unsupported_SOURCES = cpp14/can_require_not_applicable_unsupported.cpp
+@HAVE_CXX14_TRUE@cpp14_prefer_free_prefer_SOURCES = cpp14/prefer_free_prefer.cpp
+@HAVE_CXX14_TRUE@cpp14_prefer_free_require_SOURCES = cpp14/prefer_free_require.cpp
+@HAVE_CXX14_TRUE@cpp14_prefer_member_prefer_SOURCES = cpp14/prefer_member_prefer.cpp
+@HAVE_CXX14_TRUE@cpp14_prefer_member_require_SOURCES = cpp14/prefer_member_require.cpp
+@HAVE_CXX14_TRUE@cpp14_prefer_static_SOURCES = cpp14/prefer_static.cpp
+@HAVE_CXX14_TRUE@cpp14_prefer_unsupported_SOURCES = cpp14/prefer_unsupported.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_free_prefer_SOURCES = cpp14/can_prefer_free_prefer.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_free_require_SOURCES = cpp14/can_prefer_free_require.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_member_prefer_SOURCES = cpp14/can_prefer_member_prefer.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_member_require_SOURCES = cpp14/can_prefer_member_require.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_static_SOURCES = cpp14/can_prefer_static.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_unsupported_SOURCES = cpp14/can_prefer_unsupported.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_not_applicable_free_prefer_SOURCES = cpp14/can_prefer_not_applicable_free_prefer.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_not_applicable_free_require_SOURCES = cpp14/can_prefer_not_applicable_free_require.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_not_applicable_member_prefer_SOURCES = cpp14/can_prefer_not_applicable_member_prefer.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_not_applicable_member_require_SOURCES = cpp14/can_prefer_not_applicable_member_require.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_not_applicable_static_SOURCES = cpp14/can_prefer_not_applicable_static.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_not_applicable_unsupported_SOURCES = cpp14/can_prefer_not_applicable_unsupported.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_not_preferable_free_prefer_SOURCES = cpp14/can_prefer_not_preferable_free_prefer.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_not_preferable_free_require_SOURCES = cpp14/can_prefer_not_preferable_free_require.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_not_preferable_member_prefer_SOURCES = cpp14/can_prefer_not_preferable_member_prefer.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_not_preferable_member_require_SOURCES = cpp14/can_prefer_not_preferable_member_require.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_not_preferable_static_SOURCES = cpp14/can_prefer_not_preferable_static.cpp
+@HAVE_CXX14_TRUE@cpp14_can_prefer_not_preferable_unsupported_SOURCES = cpp14/can_prefer_not_preferable_unsupported.cpp
+TESTS = $(check_PROGRAMS)
+AM_CXXFLAGS = -I$(srcdir)/../../../include
+MAINTAINERCLEANFILES = \
+ $(srcdir)/Makefile.in
+
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cpp .log .o .obj .test .test$(EXEEXT) .trs
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+ && { if test -f $@; then exit 0; else break; fi; }; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/tests/properties/Makefile'; \
+ $(am__cd) $(top_srcdir) && \
+ $(AUTOMAKE) --foreign src/tests/properties/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ @case '$?' in \
+ *config.status*) \
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+ *) \
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
+ esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+clean-checkPROGRAMS:
+ -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS)
+cpp03/$(am__dirstamp):
+ @$(MKDIR_P) cpp03
+ @: > cpp03/$(am__dirstamp)
+cpp03/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) cpp03/$(DEPDIR)
+ @: > cpp03/$(DEPDIR)/$(am__dirstamp)
+cpp03/can_prefer_free_prefer.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_free_prefer$(EXEEXT): $(cpp03_can_prefer_free_prefer_OBJECTS) $(cpp03_can_prefer_free_prefer_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_free_prefer_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_free_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_free_prefer_OBJECTS) $(cpp03_can_prefer_free_prefer_LDADD) $(LIBS)
+cpp03/can_prefer_free_require.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_free_require$(EXEEXT): $(cpp03_can_prefer_free_require_OBJECTS) $(cpp03_can_prefer_free_require_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_free_require_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_free_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_free_require_OBJECTS) $(cpp03_can_prefer_free_require_LDADD) $(LIBS)
+cpp03/can_prefer_member_prefer.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_member_prefer$(EXEEXT): $(cpp03_can_prefer_member_prefer_OBJECTS) $(cpp03_can_prefer_member_prefer_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_member_prefer_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_member_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_member_prefer_OBJECTS) $(cpp03_can_prefer_member_prefer_LDADD) $(LIBS)
+cpp03/can_prefer_member_require.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_member_require$(EXEEXT): $(cpp03_can_prefer_member_require_OBJECTS) $(cpp03_can_prefer_member_require_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_member_require_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_member_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_member_require_OBJECTS) $(cpp03_can_prefer_member_require_LDADD) $(LIBS)
+cpp03/can_prefer_not_applicable_free_prefer.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_not_applicable_free_prefer$(EXEEXT): $(cpp03_can_prefer_not_applicable_free_prefer_OBJECTS) $(cpp03_can_prefer_not_applicable_free_prefer_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_not_applicable_free_prefer_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_not_applicable_free_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_not_applicable_free_prefer_OBJECTS) $(cpp03_can_prefer_not_applicable_free_prefer_LDADD) $(LIBS)
+cpp03/can_prefer_not_applicable_free_require.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_not_applicable_free_require$(EXEEXT): $(cpp03_can_prefer_not_applicable_free_require_OBJECTS) $(cpp03_can_prefer_not_applicable_free_require_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_not_applicable_free_require_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_not_applicable_free_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_not_applicable_free_require_OBJECTS) $(cpp03_can_prefer_not_applicable_free_require_LDADD) $(LIBS)
+cpp03/can_prefer_not_applicable_member_prefer.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_not_applicable_member_prefer$(EXEEXT): $(cpp03_can_prefer_not_applicable_member_prefer_OBJECTS) $(cpp03_can_prefer_not_applicable_member_prefer_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_not_applicable_member_prefer_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_not_applicable_member_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_not_applicable_member_prefer_OBJECTS) $(cpp03_can_prefer_not_applicable_member_prefer_LDADD) $(LIBS)
+cpp03/can_prefer_not_applicable_member_require.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_not_applicable_member_require$(EXEEXT): $(cpp03_can_prefer_not_applicable_member_require_OBJECTS) $(cpp03_can_prefer_not_applicable_member_require_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_not_applicable_member_require_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_not_applicable_member_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_not_applicable_member_require_OBJECTS) $(cpp03_can_prefer_not_applicable_member_require_LDADD) $(LIBS)
+cpp03/can_prefer_not_applicable_static.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_not_applicable_static$(EXEEXT): $(cpp03_can_prefer_not_applicable_static_OBJECTS) $(cpp03_can_prefer_not_applicable_static_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_not_applicable_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_not_applicable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_not_applicable_static_OBJECTS) $(cpp03_can_prefer_not_applicable_static_LDADD) $(LIBS)
+cpp03/can_prefer_not_applicable_unsupported.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_not_applicable_unsupported$(EXEEXT): $(cpp03_can_prefer_not_applicable_unsupported_OBJECTS) $(cpp03_can_prefer_not_applicable_unsupported_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_not_applicable_unsupported_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_not_applicable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_not_applicable_unsupported_OBJECTS) $(cpp03_can_prefer_not_applicable_unsupported_LDADD) $(LIBS)
+cpp03/can_prefer_not_preferable_free_prefer.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_not_preferable_free_prefer$(EXEEXT): $(cpp03_can_prefer_not_preferable_free_prefer_OBJECTS) $(cpp03_can_prefer_not_preferable_free_prefer_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_not_preferable_free_prefer_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_not_preferable_free_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_not_preferable_free_prefer_OBJECTS) $(cpp03_can_prefer_not_preferable_free_prefer_LDADD) $(LIBS)
+cpp03/can_prefer_not_preferable_free_require.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_not_preferable_free_require$(EXEEXT): $(cpp03_can_prefer_not_preferable_free_require_OBJECTS) $(cpp03_can_prefer_not_preferable_free_require_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_not_preferable_free_require_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_not_preferable_free_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_not_preferable_free_require_OBJECTS) $(cpp03_can_prefer_not_preferable_free_require_LDADD) $(LIBS)
+cpp03/can_prefer_not_preferable_member_prefer.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_not_preferable_member_prefer$(EXEEXT): $(cpp03_can_prefer_not_preferable_member_prefer_OBJECTS) $(cpp03_can_prefer_not_preferable_member_prefer_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_not_preferable_member_prefer_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_not_preferable_member_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_not_preferable_member_prefer_OBJECTS) $(cpp03_can_prefer_not_preferable_member_prefer_LDADD) $(LIBS)
+cpp03/can_prefer_not_preferable_member_require.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_not_preferable_member_require$(EXEEXT): $(cpp03_can_prefer_not_preferable_member_require_OBJECTS) $(cpp03_can_prefer_not_preferable_member_require_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_not_preferable_member_require_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_not_preferable_member_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_not_preferable_member_require_OBJECTS) $(cpp03_can_prefer_not_preferable_member_require_LDADD) $(LIBS)
+cpp03/can_prefer_not_preferable_static.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_not_preferable_static$(EXEEXT): $(cpp03_can_prefer_not_preferable_static_OBJECTS) $(cpp03_can_prefer_not_preferable_static_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_not_preferable_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_not_preferable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_not_preferable_static_OBJECTS) $(cpp03_can_prefer_not_preferable_static_LDADD) $(LIBS)
+cpp03/can_prefer_not_preferable_unsupported.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_not_preferable_unsupported$(EXEEXT): $(cpp03_can_prefer_not_preferable_unsupported_OBJECTS) $(cpp03_can_prefer_not_preferable_unsupported_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_not_preferable_unsupported_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_not_preferable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_not_preferable_unsupported_OBJECTS) $(cpp03_can_prefer_not_preferable_unsupported_LDADD) $(LIBS)
+cpp03/can_prefer_static.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_static$(EXEEXT): $(cpp03_can_prefer_static_OBJECTS) $(cpp03_can_prefer_static_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_static_OBJECTS) $(cpp03_can_prefer_static_LDADD) $(LIBS)
+cpp03/can_prefer_unsupported.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_prefer_unsupported$(EXEEXT): $(cpp03_can_prefer_unsupported_OBJECTS) $(cpp03_can_prefer_unsupported_DEPENDENCIES) $(EXTRA_cpp03_can_prefer_unsupported_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_prefer_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_prefer_unsupported_OBJECTS) $(cpp03_can_prefer_unsupported_LDADD) $(LIBS)
+cpp03/can_query_free.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_query_free$(EXEEXT): $(cpp03_can_query_free_OBJECTS) $(cpp03_can_query_free_DEPENDENCIES) $(EXTRA_cpp03_can_query_free_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_query_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_query_free_OBJECTS) $(cpp03_can_query_free_LDADD) $(LIBS)
+cpp03/can_query_member.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_query_member$(EXEEXT): $(cpp03_can_query_member_OBJECTS) $(cpp03_can_query_member_DEPENDENCIES) $(EXTRA_cpp03_can_query_member_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_query_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_query_member_OBJECTS) $(cpp03_can_query_member_LDADD) $(LIBS)
+cpp03/can_query_not_applicable_free.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_query_not_applicable_free$(EXEEXT): $(cpp03_can_query_not_applicable_free_OBJECTS) $(cpp03_can_query_not_applicable_free_DEPENDENCIES) $(EXTRA_cpp03_can_query_not_applicable_free_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_query_not_applicable_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_query_not_applicable_free_OBJECTS) $(cpp03_can_query_not_applicable_free_LDADD) $(LIBS)
+cpp03/can_query_not_applicable_member.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_query_not_applicable_member$(EXEEXT): $(cpp03_can_query_not_applicable_member_OBJECTS) $(cpp03_can_query_not_applicable_member_DEPENDENCIES) $(EXTRA_cpp03_can_query_not_applicable_member_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_query_not_applicable_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_query_not_applicable_member_OBJECTS) $(cpp03_can_query_not_applicable_member_LDADD) $(LIBS)
+cpp03/can_query_not_applicable_static.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_query_not_applicable_static$(EXEEXT): $(cpp03_can_query_not_applicable_static_OBJECTS) $(cpp03_can_query_not_applicable_static_DEPENDENCIES) $(EXTRA_cpp03_can_query_not_applicable_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_query_not_applicable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_query_not_applicable_static_OBJECTS) $(cpp03_can_query_not_applicable_static_LDADD) $(LIBS)
+cpp03/can_query_not_applicable_unsupported.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_query_not_applicable_unsupported$(EXEEXT): $(cpp03_can_query_not_applicable_unsupported_OBJECTS) $(cpp03_can_query_not_applicable_unsupported_DEPENDENCIES) $(EXTRA_cpp03_can_query_not_applicable_unsupported_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_query_not_applicable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_query_not_applicable_unsupported_OBJECTS) $(cpp03_can_query_not_applicable_unsupported_LDADD) $(LIBS)
+cpp03/can_query_static.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_query_static$(EXEEXT): $(cpp03_can_query_static_OBJECTS) $(cpp03_can_query_static_DEPENDENCIES) $(EXTRA_cpp03_can_query_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_query_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_query_static_OBJECTS) $(cpp03_can_query_static_LDADD) $(LIBS)
+cpp03/can_query_unsupported.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_query_unsupported$(EXEEXT): $(cpp03_can_query_unsupported_OBJECTS) $(cpp03_can_query_unsupported_DEPENDENCIES) $(EXTRA_cpp03_can_query_unsupported_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_query_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_query_unsupported_OBJECTS) $(cpp03_can_query_unsupported_LDADD) $(LIBS)
+cpp03/can_require_concept_free.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_concept_free$(EXEEXT): $(cpp03_can_require_concept_free_OBJECTS) $(cpp03_can_require_concept_free_DEPENDENCIES) $(EXTRA_cpp03_can_require_concept_free_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_concept_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_concept_free_OBJECTS) $(cpp03_can_require_concept_free_LDADD) $(LIBS)
+cpp03/can_require_concept_member.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_concept_member$(EXEEXT): $(cpp03_can_require_concept_member_OBJECTS) $(cpp03_can_require_concept_member_DEPENDENCIES) $(EXTRA_cpp03_can_require_concept_member_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_concept_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_concept_member_OBJECTS) $(cpp03_can_require_concept_member_LDADD) $(LIBS)
+cpp03/can_require_concept_not_applicable_free.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_concept_not_applicable_free$(EXEEXT): $(cpp03_can_require_concept_not_applicable_free_OBJECTS) $(cpp03_can_require_concept_not_applicable_free_DEPENDENCIES) $(EXTRA_cpp03_can_require_concept_not_applicable_free_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_concept_not_applicable_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_concept_not_applicable_free_OBJECTS) $(cpp03_can_require_concept_not_applicable_free_LDADD) $(LIBS)
+cpp03/can_require_concept_not_applicable_member.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_concept_not_applicable_member$(EXEEXT): $(cpp03_can_require_concept_not_applicable_member_OBJECTS) $(cpp03_can_require_concept_not_applicable_member_DEPENDENCIES) $(EXTRA_cpp03_can_require_concept_not_applicable_member_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_concept_not_applicable_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_concept_not_applicable_member_OBJECTS) $(cpp03_can_require_concept_not_applicable_member_LDADD) $(LIBS)
+cpp03/can_require_concept_not_applicable_static.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_concept_not_applicable_static$(EXEEXT): $(cpp03_can_require_concept_not_applicable_static_OBJECTS) $(cpp03_can_require_concept_not_applicable_static_DEPENDENCIES) $(EXTRA_cpp03_can_require_concept_not_applicable_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_concept_not_applicable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_concept_not_applicable_static_OBJECTS) $(cpp03_can_require_concept_not_applicable_static_LDADD) $(LIBS)
+cpp03/can_require_concept_not_applicable_unsupported.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_concept_not_applicable_unsupported$(EXEEXT): $(cpp03_can_require_concept_not_applicable_unsupported_OBJECTS) $(cpp03_can_require_concept_not_applicable_unsupported_DEPENDENCIES) $(EXTRA_cpp03_can_require_concept_not_applicable_unsupported_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_concept_not_applicable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_concept_not_applicable_unsupported_OBJECTS) $(cpp03_can_require_concept_not_applicable_unsupported_LDADD) $(LIBS)
+cpp03/can_require_concept_static.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_concept_static$(EXEEXT): $(cpp03_can_require_concept_static_OBJECTS) $(cpp03_can_require_concept_static_DEPENDENCIES) $(EXTRA_cpp03_can_require_concept_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_concept_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_concept_static_OBJECTS) $(cpp03_can_require_concept_static_LDADD) $(LIBS)
+cpp03/can_require_concept_unsupported.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_concept_unsupported$(EXEEXT): $(cpp03_can_require_concept_unsupported_OBJECTS) $(cpp03_can_require_concept_unsupported_DEPENDENCIES) $(EXTRA_cpp03_can_require_concept_unsupported_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_concept_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_concept_unsupported_OBJECTS) $(cpp03_can_require_concept_unsupported_LDADD) $(LIBS)
+cpp03/can_require_free.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_free$(EXEEXT): $(cpp03_can_require_free_OBJECTS) $(cpp03_can_require_free_DEPENDENCIES) $(EXTRA_cpp03_can_require_free_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_free_OBJECTS) $(cpp03_can_require_free_LDADD) $(LIBS)
+cpp03/can_require_member.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_member$(EXEEXT): $(cpp03_can_require_member_OBJECTS) $(cpp03_can_require_member_DEPENDENCIES) $(EXTRA_cpp03_can_require_member_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_member_OBJECTS) $(cpp03_can_require_member_LDADD) $(LIBS)
+cpp03/can_require_not_applicable_free.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_not_applicable_free$(EXEEXT): $(cpp03_can_require_not_applicable_free_OBJECTS) $(cpp03_can_require_not_applicable_free_DEPENDENCIES) $(EXTRA_cpp03_can_require_not_applicable_free_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_not_applicable_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_not_applicable_free_OBJECTS) $(cpp03_can_require_not_applicable_free_LDADD) $(LIBS)
+cpp03/can_require_not_applicable_member.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_not_applicable_member$(EXEEXT): $(cpp03_can_require_not_applicable_member_OBJECTS) $(cpp03_can_require_not_applicable_member_DEPENDENCIES) $(EXTRA_cpp03_can_require_not_applicable_member_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_not_applicable_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_not_applicable_member_OBJECTS) $(cpp03_can_require_not_applicable_member_LDADD) $(LIBS)
+cpp03/can_require_not_applicable_static.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_not_applicable_static$(EXEEXT): $(cpp03_can_require_not_applicable_static_OBJECTS) $(cpp03_can_require_not_applicable_static_DEPENDENCIES) $(EXTRA_cpp03_can_require_not_applicable_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_not_applicable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_not_applicable_static_OBJECTS) $(cpp03_can_require_not_applicable_static_LDADD) $(LIBS)
+cpp03/can_require_not_applicable_unsupported.$(OBJEXT): \
+ cpp03/$(am__dirstamp) cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_not_applicable_unsupported$(EXEEXT): $(cpp03_can_require_not_applicable_unsupported_OBJECTS) $(cpp03_can_require_not_applicable_unsupported_DEPENDENCIES) $(EXTRA_cpp03_can_require_not_applicable_unsupported_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_not_applicable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_not_applicable_unsupported_OBJECTS) $(cpp03_can_require_not_applicable_unsupported_LDADD) $(LIBS)
+cpp03/can_require_static.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_static$(EXEEXT): $(cpp03_can_require_static_OBJECTS) $(cpp03_can_require_static_DEPENDENCIES) $(EXTRA_cpp03_can_require_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_static_OBJECTS) $(cpp03_can_require_static_LDADD) $(LIBS)
+cpp03/can_require_unsupported.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/can_require_unsupported$(EXEEXT): $(cpp03_can_require_unsupported_OBJECTS) $(cpp03_can_require_unsupported_DEPENDENCIES) $(EXTRA_cpp03_can_require_unsupported_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/can_require_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_can_require_unsupported_OBJECTS) $(cpp03_can_require_unsupported_LDADD) $(LIBS)
+cpp03/prefer_free_prefer.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/prefer_free_prefer$(EXEEXT): $(cpp03_prefer_free_prefer_OBJECTS) $(cpp03_prefer_free_prefer_DEPENDENCIES) $(EXTRA_cpp03_prefer_free_prefer_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/prefer_free_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_prefer_free_prefer_OBJECTS) $(cpp03_prefer_free_prefer_LDADD) $(LIBS)
+cpp03/prefer_free_require.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/prefer_free_require$(EXEEXT): $(cpp03_prefer_free_require_OBJECTS) $(cpp03_prefer_free_require_DEPENDENCIES) $(EXTRA_cpp03_prefer_free_require_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/prefer_free_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_prefer_free_require_OBJECTS) $(cpp03_prefer_free_require_LDADD) $(LIBS)
+cpp03/prefer_member_prefer.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/prefer_member_prefer$(EXEEXT): $(cpp03_prefer_member_prefer_OBJECTS) $(cpp03_prefer_member_prefer_DEPENDENCIES) $(EXTRA_cpp03_prefer_member_prefer_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/prefer_member_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_prefer_member_prefer_OBJECTS) $(cpp03_prefer_member_prefer_LDADD) $(LIBS)
+cpp03/prefer_member_require.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/prefer_member_require$(EXEEXT): $(cpp03_prefer_member_require_OBJECTS) $(cpp03_prefer_member_require_DEPENDENCIES) $(EXTRA_cpp03_prefer_member_require_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/prefer_member_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_prefer_member_require_OBJECTS) $(cpp03_prefer_member_require_LDADD) $(LIBS)
+cpp03/prefer_static.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/prefer_static$(EXEEXT): $(cpp03_prefer_static_OBJECTS) $(cpp03_prefer_static_DEPENDENCIES) $(EXTRA_cpp03_prefer_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/prefer_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_prefer_static_OBJECTS) $(cpp03_prefer_static_LDADD) $(LIBS)
+cpp03/prefer_unsupported.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/prefer_unsupported$(EXEEXT): $(cpp03_prefer_unsupported_OBJECTS) $(cpp03_prefer_unsupported_DEPENDENCIES) $(EXTRA_cpp03_prefer_unsupported_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/prefer_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_prefer_unsupported_OBJECTS) $(cpp03_prefer_unsupported_LDADD) $(LIBS)
+cpp03/query_free.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/query_free$(EXEEXT): $(cpp03_query_free_OBJECTS) $(cpp03_query_free_DEPENDENCIES) $(EXTRA_cpp03_query_free_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/query_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_query_free_OBJECTS) $(cpp03_query_free_LDADD) $(LIBS)
+cpp03/query_member.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/query_member$(EXEEXT): $(cpp03_query_member_OBJECTS) $(cpp03_query_member_DEPENDENCIES) $(EXTRA_cpp03_query_member_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/query_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_query_member_OBJECTS) $(cpp03_query_member_LDADD) $(LIBS)
+cpp03/query_static.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/query_static$(EXEEXT): $(cpp03_query_static_OBJECTS) $(cpp03_query_static_DEPENDENCIES) $(EXTRA_cpp03_query_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/query_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_query_static_OBJECTS) $(cpp03_query_static_LDADD) $(LIBS)
+cpp03/require_concept_free.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/require_concept_free$(EXEEXT): $(cpp03_require_concept_free_OBJECTS) $(cpp03_require_concept_free_DEPENDENCIES) $(EXTRA_cpp03_require_concept_free_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/require_concept_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_require_concept_free_OBJECTS) $(cpp03_require_concept_free_LDADD) $(LIBS)
+cpp03/require_concept_member.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/require_concept_member$(EXEEXT): $(cpp03_require_concept_member_OBJECTS) $(cpp03_require_concept_member_DEPENDENCIES) $(EXTRA_cpp03_require_concept_member_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/require_concept_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_require_concept_member_OBJECTS) $(cpp03_require_concept_member_LDADD) $(LIBS)
+cpp03/require_concept_static.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/require_concept_static$(EXEEXT): $(cpp03_require_concept_static_OBJECTS) $(cpp03_require_concept_static_DEPENDENCIES) $(EXTRA_cpp03_require_concept_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/require_concept_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_require_concept_static_OBJECTS) $(cpp03_require_concept_static_LDADD) $(LIBS)
+cpp03/require_free.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/require_free$(EXEEXT): $(cpp03_require_free_OBJECTS) $(cpp03_require_free_DEPENDENCIES) $(EXTRA_cpp03_require_free_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/require_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_require_free_OBJECTS) $(cpp03_require_free_LDADD) $(LIBS)
+cpp03/require_member.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/require_member$(EXEEXT): $(cpp03_require_member_OBJECTS) $(cpp03_require_member_DEPENDENCIES) $(EXTRA_cpp03_require_member_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/require_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_require_member_OBJECTS) $(cpp03_require_member_LDADD) $(LIBS)
+cpp03/require_static.$(OBJEXT): cpp03/$(am__dirstamp) \
+ cpp03/$(DEPDIR)/$(am__dirstamp)
+
+cpp03/require_static$(EXEEXT): $(cpp03_require_static_OBJECTS) $(cpp03_require_static_DEPENDENCIES) $(EXTRA_cpp03_require_static_DEPENDENCIES) cpp03/$(am__dirstamp)
+ @rm -f cpp03/require_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp03_require_static_OBJECTS) $(cpp03_require_static_LDADD) $(LIBS)
+cpp11/$(am__dirstamp):
+ @$(MKDIR_P) cpp11
+ @: > cpp11/$(am__dirstamp)
+cpp11/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) cpp11/$(DEPDIR)
+ @: > cpp11/$(DEPDIR)/$(am__dirstamp)
+cpp11/can_prefer_free_prefer.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_free_prefer$(EXEEXT): $(cpp11_can_prefer_free_prefer_OBJECTS) $(cpp11_can_prefer_free_prefer_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_free_prefer_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_free_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_free_prefer_OBJECTS) $(cpp11_can_prefer_free_prefer_LDADD) $(LIBS)
+cpp11/can_prefer_free_require.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_free_require$(EXEEXT): $(cpp11_can_prefer_free_require_OBJECTS) $(cpp11_can_prefer_free_require_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_free_require_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_free_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_free_require_OBJECTS) $(cpp11_can_prefer_free_require_LDADD) $(LIBS)
+cpp11/can_prefer_member_prefer.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_member_prefer$(EXEEXT): $(cpp11_can_prefer_member_prefer_OBJECTS) $(cpp11_can_prefer_member_prefer_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_member_prefer_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_member_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_member_prefer_OBJECTS) $(cpp11_can_prefer_member_prefer_LDADD) $(LIBS)
+cpp11/can_prefer_member_require.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_member_require$(EXEEXT): $(cpp11_can_prefer_member_require_OBJECTS) $(cpp11_can_prefer_member_require_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_member_require_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_member_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_member_require_OBJECTS) $(cpp11_can_prefer_member_require_LDADD) $(LIBS)
+cpp11/can_prefer_not_applicable_free_prefer.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_not_applicable_free_prefer$(EXEEXT): $(cpp11_can_prefer_not_applicable_free_prefer_OBJECTS) $(cpp11_can_prefer_not_applicable_free_prefer_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_not_applicable_free_prefer_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_not_applicable_free_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_not_applicable_free_prefer_OBJECTS) $(cpp11_can_prefer_not_applicable_free_prefer_LDADD) $(LIBS)
+cpp11/can_prefer_not_applicable_free_require.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_not_applicable_free_require$(EXEEXT): $(cpp11_can_prefer_not_applicable_free_require_OBJECTS) $(cpp11_can_prefer_not_applicable_free_require_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_not_applicable_free_require_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_not_applicable_free_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_not_applicable_free_require_OBJECTS) $(cpp11_can_prefer_not_applicable_free_require_LDADD) $(LIBS)
+cpp11/can_prefer_not_applicable_member_prefer.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_not_applicable_member_prefer$(EXEEXT): $(cpp11_can_prefer_not_applicable_member_prefer_OBJECTS) $(cpp11_can_prefer_not_applicable_member_prefer_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_not_applicable_member_prefer_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_not_applicable_member_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_not_applicable_member_prefer_OBJECTS) $(cpp11_can_prefer_not_applicable_member_prefer_LDADD) $(LIBS)
+cpp11/can_prefer_not_applicable_member_require.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_not_applicable_member_require$(EXEEXT): $(cpp11_can_prefer_not_applicable_member_require_OBJECTS) $(cpp11_can_prefer_not_applicable_member_require_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_not_applicable_member_require_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_not_applicable_member_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_not_applicable_member_require_OBJECTS) $(cpp11_can_prefer_not_applicable_member_require_LDADD) $(LIBS)
+cpp11/can_prefer_not_applicable_static.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_not_applicable_static$(EXEEXT): $(cpp11_can_prefer_not_applicable_static_OBJECTS) $(cpp11_can_prefer_not_applicable_static_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_not_applicable_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_not_applicable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_not_applicable_static_OBJECTS) $(cpp11_can_prefer_not_applicable_static_LDADD) $(LIBS)
+cpp11/can_prefer_not_applicable_unsupported.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_not_applicable_unsupported$(EXEEXT): $(cpp11_can_prefer_not_applicable_unsupported_OBJECTS) $(cpp11_can_prefer_not_applicable_unsupported_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_not_applicable_unsupported_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_not_applicable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_not_applicable_unsupported_OBJECTS) $(cpp11_can_prefer_not_applicable_unsupported_LDADD) $(LIBS)
+cpp11/can_prefer_not_preferable_free_prefer.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_not_preferable_free_prefer$(EXEEXT): $(cpp11_can_prefer_not_preferable_free_prefer_OBJECTS) $(cpp11_can_prefer_not_preferable_free_prefer_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_not_preferable_free_prefer_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_not_preferable_free_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_not_preferable_free_prefer_OBJECTS) $(cpp11_can_prefer_not_preferable_free_prefer_LDADD) $(LIBS)
+cpp11/can_prefer_not_preferable_free_require.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_not_preferable_free_require$(EXEEXT): $(cpp11_can_prefer_not_preferable_free_require_OBJECTS) $(cpp11_can_prefer_not_preferable_free_require_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_not_preferable_free_require_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_not_preferable_free_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_not_preferable_free_require_OBJECTS) $(cpp11_can_prefer_not_preferable_free_require_LDADD) $(LIBS)
+cpp11/can_prefer_not_preferable_member_prefer.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_not_preferable_member_prefer$(EXEEXT): $(cpp11_can_prefer_not_preferable_member_prefer_OBJECTS) $(cpp11_can_prefer_not_preferable_member_prefer_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_not_preferable_member_prefer_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_not_preferable_member_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_not_preferable_member_prefer_OBJECTS) $(cpp11_can_prefer_not_preferable_member_prefer_LDADD) $(LIBS)
+cpp11/can_prefer_not_preferable_member_require.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_not_preferable_member_require$(EXEEXT): $(cpp11_can_prefer_not_preferable_member_require_OBJECTS) $(cpp11_can_prefer_not_preferable_member_require_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_not_preferable_member_require_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_not_preferable_member_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_not_preferable_member_require_OBJECTS) $(cpp11_can_prefer_not_preferable_member_require_LDADD) $(LIBS)
+cpp11/can_prefer_not_preferable_static.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_not_preferable_static$(EXEEXT): $(cpp11_can_prefer_not_preferable_static_OBJECTS) $(cpp11_can_prefer_not_preferable_static_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_not_preferable_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_not_preferable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_not_preferable_static_OBJECTS) $(cpp11_can_prefer_not_preferable_static_LDADD) $(LIBS)
+cpp11/can_prefer_not_preferable_unsupported.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_not_preferable_unsupported$(EXEEXT): $(cpp11_can_prefer_not_preferable_unsupported_OBJECTS) $(cpp11_can_prefer_not_preferable_unsupported_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_not_preferable_unsupported_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_not_preferable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_not_preferable_unsupported_OBJECTS) $(cpp11_can_prefer_not_preferable_unsupported_LDADD) $(LIBS)
+cpp11/can_prefer_static.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_static$(EXEEXT): $(cpp11_can_prefer_static_OBJECTS) $(cpp11_can_prefer_static_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_static_OBJECTS) $(cpp11_can_prefer_static_LDADD) $(LIBS)
+cpp11/can_prefer_unsupported.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_prefer_unsupported$(EXEEXT): $(cpp11_can_prefer_unsupported_OBJECTS) $(cpp11_can_prefer_unsupported_DEPENDENCIES) $(EXTRA_cpp11_can_prefer_unsupported_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_prefer_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_prefer_unsupported_OBJECTS) $(cpp11_can_prefer_unsupported_LDADD) $(LIBS)
+cpp11/can_query_free.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_query_free$(EXEEXT): $(cpp11_can_query_free_OBJECTS) $(cpp11_can_query_free_DEPENDENCIES) $(EXTRA_cpp11_can_query_free_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_query_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_query_free_OBJECTS) $(cpp11_can_query_free_LDADD) $(LIBS)
+cpp11/can_query_member.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_query_member$(EXEEXT): $(cpp11_can_query_member_OBJECTS) $(cpp11_can_query_member_DEPENDENCIES) $(EXTRA_cpp11_can_query_member_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_query_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_query_member_OBJECTS) $(cpp11_can_query_member_LDADD) $(LIBS)
+cpp11/can_query_not_applicable_free.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_query_not_applicable_free$(EXEEXT): $(cpp11_can_query_not_applicable_free_OBJECTS) $(cpp11_can_query_not_applicable_free_DEPENDENCIES) $(EXTRA_cpp11_can_query_not_applicable_free_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_query_not_applicable_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_query_not_applicable_free_OBJECTS) $(cpp11_can_query_not_applicable_free_LDADD) $(LIBS)
+cpp11/can_query_not_applicable_member.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_query_not_applicable_member$(EXEEXT): $(cpp11_can_query_not_applicable_member_OBJECTS) $(cpp11_can_query_not_applicable_member_DEPENDENCIES) $(EXTRA_cpp11_can_query_not_applicable_member_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_query_not_applicable_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_query_not_applicable_member_OBJECTS) $(cpp11_can_query_not_applicable_member_LDADD) $(LIBS)
+cpp11/can_query_not_applicable_static.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_query_not_applicable_static$(EXEEXT): $(cpp11_can_query_not_applicable_static_OBJECTS) $(cpp11_can_query_not_applicable_static_DEPENDENCIES) $(EXTRA_cpp11_can_query_not_applicable_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_query_not_applicable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_query_not_applicable_static_OBJECTS) $(cpp11_can_query_not_applicable_static_LDADD) $(LIBS)
+cpp11/can_query_not_applicable_unsupported.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_query_not_applicable_unsupported$(EXEEXT): $(cpp11_can_query_not_applicable_unsupported_OBJECTS) $(cpp11_can_query_not_applicable_unsupported_DEPENDENCIES) $(EXTRA_cpp11_can_query_not_applicable_unsupported_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_query_not_applicable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_query_not_applicable_unsupported_OBJECTS) $(cpp11_can_query_not_applicable_unsupported_LDADD) $(LIBS)
+cpp11/can_query_static.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_query_static$(EXEEXT): $(cpp11_can_query_static_OBJECTS) $(cpp11_can_query_static_DEPENDENCIES) $(EXTRA_cpp11_can_query_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_query_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_query_static_OBJECTS) $(cpp11_can_query_static_LDADD) $(LIBS)
+cpp11/can_query_unsupported.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_query_unsupported$(EXEEXT): $(cpp11_can_query_unsupported_OBJECTS) $(cpp11_can_query_unsupported_DEPENDENCIES) $(EXTRA_cpp11_can_query_unsupported_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_query_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_query_unsupported_OBJECTS) $(cpp11_can_query_unsupported_LDADD) $(LIBS)
+cpp11/can_require_concept_free.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_concept_free$(EXEEXT): $(cpp11_can_require_concept_free_OBJECTS) $(cpp11_can_require_concept_free_DEPENDENCIES) $(EXTRA_cpp11_can_require_concept_free_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_concept_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_concept_free_OBJECTS) $(cpp11_can_require_concept_free_LDADD) $(LIBS)
+cpp11/can_require_concept_member.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_concept_member$(EXEEXT): $(cpp11_can_require_concept_member_OBJECTS) $(cpp11_can_require_concept_member_DEPENDENCIES) $(EXTRA_cpp11_can_require_concept_member_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_concept_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_concept_member_OBJECTS) $(cpp11_can_require_concept_member_LDADD) $(LIBS)
+cpp11/can_require_concept_not_applicable_free.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_concept_not_applicable_free$(EXEEXT): $(cpp11_can_require_concept_not_applicable_free_OBJECTS) $(cpp11_can_require_concept_not_applicable_free_DEPENDENCIES) $(EXTRA_cpp11_can_require_concept_not_applicable_free_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_concept_not_applicable_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_concept_not_applicable_free_OBJECTS) $(cpp11_can_require_concept_not_applicable_free_LDADD) $(LIBS)
+cpp11/can_require_concept_not_applicable_member.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_concept_not_applicable_member$(EXEEXT): $(cpp11_can_require_concept_not_applicable_member_OBJECTS) $(cpp11_can_require_concept_not_applicable_member_DEPENDENCIES) $(EXTRA_cpp11_can_require_concept_not_applicable_member_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_concept_not_applicable_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_concept_not_applicable_member_OBJECTS) $(cpp11_can_require_concept_not_applicable_member_LDADD) $(LIBS)
+cpp11/can_require_concept_not_applicable_static.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_concept_not_applicable_static$(EXEEXT): $(cpp11_can_require_concept_not_applicable_static_OBJECTS) $(cpp11_can_require_concept_not_applicable_static_DEPENDENCIES) $(EXTRA_cpp11_can_require_concept_not_applicable_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_concept_not_applicable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_concept_not_applicable_static_OBJECTS) $(cpp11_can_require_concept_not_applicable_static_LDADD) $(LIBS)
+cpp11/can_require_concept_not_applicable_unsupported.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_concept_not_applicable_unsupported$(EXEEXT): $(cpp11_can_require_concept_not_applicable_unsupported_OBJECTS) $(cpp11_can_require_concept_not_applicable_unsupported_DEPENDENCIES) $(EXTRA_cpp11_can_require_concept_not_applicable_unsupported_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_concept_not_applicable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_concept_not_applicable_unsupported_OBJECTS) $(cpp11_can_require_concept_not_applicable_unsupported_LDADD) $(LIBS)
+cpp11/can_require_concept_static.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_concept_static$(EXEEXT): $(cpp11_can_require_concept_static_OBJECTS) $(cpp11_can_require_concept_static_DEPENDENCIES) $(EXTRA_cpp11_can_require_concept_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_concept_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_concept_static_OBJECTS) $(cpp11_can_require_concept_static_LDADD) $(LIBS)
+cpp11/can_require_concept_unsupported.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_concept_unsupported$(EXEEXT): $(cpp11_can_require_concept_unsupported_OBJECTS) $(cpp11_can_require_concept_unsupported_DEPENDENCIES) $(EXTRA_cpp11_can_require_concept_unsupported_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_concept_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_concept_unsupported_OBJECTS) $(cpp11_can_require_concept_unsupported_LDADD) $(LIBS)
+cpp11/can_require_free.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_free$(EXEEXT): $(cpp11_can_require_free_OBJECTS) $(cpp11_can_require_free_DEPENDENCIES) $(EXTRA_cpp11_can_require_free_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_free_OBJECTS) $(cpp11_can_require_free_LDADD) $(LIBS)
+cpp11/can_require_member.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_member$(EXEEXT): $(cpp11_can_require_member_OBJECTS) $(cpp11_can_require_member_DEPENDENCIES) $(EXTRA_cpp11_can_require_member_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_member_OBJECTS) $(cpp11_can_require_member_LDADD) $(LIBS)
+cpp11/can_require_not_applicable_free.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_not_applicable_free$(EXEEXT): $(cpp11_can_require_not_applicable_free_OBJECTS) $(cpp11_can_require_not_applicable_free_DEPENDENCIES) $(EXTRA_cpp11_can_require_not_applicable_free_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_not_applicable_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_not_applicable_free_OBJECTS) $(cpp11_can_require_not_applicable_free_LDADD) $(LIBS)
+cpp11/can_require_not_applicable_member.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_not_applicable_member$(EXEEXT): $(cpp11_can_require_not_applicable_member_OBJECTS) $(cpp11_can_require_not_applicable_member_DEPENDENCIES) $(EXTRA_cpp11_can_require_not_applicable_member_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_not_applicable_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_not_applicable_member_OBJECTS) $(cpp11_can_require_not_applicable_member_LDADD) $(LIBS)
+cpp11/can_require_not_applicable_static.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_not_applicable_static$(EXEEXT): $(cpp11_can_require_not_applicable_static_OBJECTS) $(cpp11_can_require_not_applicable_static_DEPENDENCIES) $(EXTRA_cpp11_can_require_not_applicable_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_not_applicable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_not_applicable_static_OBJECTS) $(cpp11_can_require_not_applicable_static_LDADD) $(LIBS)
+cpp11/can_require_not_applicable_unsupported.$(OBJEXT): \
+ cpp11/$(am__dirstamp) cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_not_applicable_unsupported$(EXEEXT): $(cpp11_can_require_not_applicable_unsupported_OBJECTS) $(cpp11_can_require_not_applicable_unsupported_DEPENDENCIES) $(EXTRA_cpp11_can_require_not_applicable_unsupported_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_not_applicable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_not_applicable_unsupported_OBJECTS) $(cpp11_can_require_not_applicable_unsupported_LDADD) $(LIBS)
+cpp11/can_require_static.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_static$(EXEEXT): $(cpp11_can_require_static_OBJECTS) $(cpp11_can_require_static_DEPENDENCIES) $(EXTRA_cpp11_can_require_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_static_OBJECTS) $(cpp11_can_require_static_LDADD) $(LIBS)
+cpp11/can_require_unsupported.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/can_require_unsupported$(EXEEXT): $(cpp11_can_require_unsupported_OBJECTS) $(cpp11_can_require_unsupported_DEPENDENCIES) $(EXTRA_cpp11_can_require_unsupported_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/can_require_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_can_require_unsupported_OBJECTS) $(cpp11_can_require_unsupported_LDADD) $(LIBS)
+cpp11/prefer_free_prefer.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/prefer_free_prefer$(EXEEXT): $(cpp11_prefer_free_prefer_OBJECTS) $(cpp11_prefer_free_prefer_DEPENDENCIES) $(EXTRA_cpp11_prefer_free_prefer_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/prefer_free_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_prefer_free_prefer_OBJECTS) $(cpp11_prefer_free_prefer_LDADD) $(LIBS)
+cpp11/prefer_free_require.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/prefer_free_require$(EXEEXT): $(cpp11_prefer_free_require_OBJECTS) $(cpp11_prefer_free_require_DEPENDENCIES) $(EXTRA_cpp11_prefer_free_require_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/prefer_free_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_prefer_free_require_OBJECTS) $(cpp11_prefer_free_require_LDADD) $(LIBS)
+cpp11/prefer_member_prefer.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/prefer_member_prefer$(EXEEXT): $(cpp11_prefer_member_prefer_OBJECTS) $(cpp11_prefer_member_prefer_DEPENDENCIES) $(EXTRA_cpp11_prefer_member_prefer_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/prefer_member_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_prefer_member_prefer_OBJECTS) $(cpp11_prefer_member_prefer_LDADD) $(LIBS)
+cpp11/prefer_member_require.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/prefer_member_require$(EXEEXT): $(cpp11_prefer_member_require_OBJECTS) $(cpp11_prefer_member_require_DEPENDENCIES) $(EXTRA_cpp11_prefer_member_require_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/prefer_member_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_prefer_member_require_OBJECTS) $(cpp11_prefer_member_require_LDADD) $(LIBS)
+cpp11/prefer_static.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/prefer_static$(EXEEXT): $(cpp11_prefer_static_OBJECTS) $(cpp11_prefer_static_DEPENDENCIES) $(EXTRA_cpp11_prefer_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/prefer_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_prefer_static_OBJECTS) $(cpp11_prefer_static_LDADD) $(LIBS)
+cpp11/prefer_unsupported.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/prefer_unsupported$(EXEEXT): $(cpp11_prefer_unsupported_OBJECTS) $(cpp11_prefer_unsupported_DEPENDENCIES) $(EXTRA_cpp11_prefer_unsupported_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/prefer_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_prefer_unsupported_OBJECTS) $(cpp11_prefer_unsupported_LDADD) $(LIBS)
+cpp11/query_free.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/query_free$(EXEEXT): $(cpp11_query_free_OBJECTS) $(cpp11_query_free_DEPENDENCIES) $(EXTRA_cpp11_query_free_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/query_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_query_free_OBJECTS) $(cpp11_query_free_LDADD) $(LIBS)
+cpp11/query_member.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/query_member$(EXEEXT): $(cpp11_query_member_OBJECTS) $(cpp11_query_member_DEPENDENCIES) $(EXTRA_cpp11_query_member_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/query_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_query_member_OBJECTS) $(cpp11_query_member_LDADD) $(LIBS)
+cpp11/query_static.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/query_static$(EXEEXT): $(cpp11_query_static_OBJECTS) $(cpp11_query_static_DEPENDENCIES) $(EXTRA_cpp11_query_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/query_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_query_static_OBJECTS) $(cpp11_query_static_LDADD) $(LIBS)
+cpp11/require_concept_free.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/require_concept_free$(EXEEXT): $(cpp11_require_concept_free_OBJECTS) $(cpp11_require_concept_free_DEPENDENCIES) $(EXTRA_cpp11_require_concept_free_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/require_concept_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_require_concept_free_OBJECTS) $(cpp11_require_concept_free_LDADD) $(LIBS)
+cpp11/require_concept_member.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/require_concept_member$(EXEEXT): $(cpp11_require_concept_member_OBJECTS) $(cpp11_require_concept_member_DEPENDENCIES) $(EXTRA_cpp11_require_concept_member_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/require_concept_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_require_concept_member_OBJECTS) $(cpp11_require_concept_member_LDADD) $(LIBS)
+cpp11/require_concept_static.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/require_concept_static$(EXEEXT): $(cpp11_require_concept_static_OBJECTS) $(cpp11_require_concept_static_DEPENDENCIES) $(EXTRA_cpp11_require_concept_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/require_concept_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_require_concept_static_OBJECTS) $(cpp11_require_concept_static_LDADD) $(LIBS)
+cpp11/require_free.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/require_free$(EXEEXT): $(cpp11_require_free_OBJECTS) $(cpp11_require_free_DEPENDENCIES) $(EXTRA_cpp11_require_free_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/require_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_require_free_OBJECTS) $(cpp11_require_free_LDADD) $(LIBS)
+cpp11/require_member.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/require_member$(EXEEXT): $(cpp11_require_member_OBJECTS) $(cpp11_require_member_DEPENDENCIES) $(EXTRA_cpp11_require_member_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/require_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_require_member_OBJECTS) $(cpp11_require_member_LDADD) $(LIBS)
+cpp11/require_static.$(OBJEXT): cpp11/$(am__dirstamp) \
+ cpp11/$(DEPDIR)/$(am__dirstamp)
+
+cpp11/require_static$(EXEEXT): $(cpp11_require_static_OBJECTS) $(cpp11_require_static_DEPENDENCIES) $(EXTRA_cpp11_require_static_DEPENDENCIES) cpp11/$(am__dirstamp)
+ @rm -f cpp11/require_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp11_require_static_OBJECTS) $(cpp11_require_static_LDADD) $(LIBS)
+cpp14/$(am__dirstamp):
+ @$(MKDIR_P) cpp14
+ @: > cpp14/$(am__dirstamp)
+cpp14/$(DEPDIR)/$(am__dirstamp):
+ @$(MKDIR_P) cpp14/$(DEPDIR)
+ @: > cpp14/$(DEPDIR)/$(am__dirstamp)
+cpp14/can_prefer_free_prefer.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_free_prefer$(EXEEXT): $(cpp14_can_prefer_free_prefer_OBJECTS) $(cpp14_can_prefer_free_prefer_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_free_prefer_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_free_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_free_prefer_OBJECTS) $(cpp14_can_prefer_free_prefer_LDADD) $(LIBS)
+cpp14/can_prefer_free_require.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_free_require$(EXEEXT): $(cpp14_can_prefer_free_require_OBJECTS) $(cpp14_can_prefer_free_require_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_free_require_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_free_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_free_require_OBJECTS) $(cpp14_can_prefer_free_require_LDADD) $(LIBS)
+cpp14/can_prefer_member_prefer.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_member_prefer$(EXEEXT): $(cpp14_can_prefer_member_prefer_OBJECTS) $(cpp14_can_prefer_member_prefer_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_member_prefer_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_member_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_member_prefer_OBJECTS) $(cpp14_can_prefer_member_prefer_LDADD) $(LIBS)
+cpp14/can_prefer_member_require.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_member_require$(EXEEXT): $(cpp14_can_prefer_member_require_OBJECTS) $(cpp14_can_prefer_member_require_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_member_require_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_member_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_member_require_OBJECTS) $(cpp14_can_prefer_member_require_LDADD) $(LIBS)
+cpp14/can_prefer_not_applicable_free_prefer.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_not_applicable_free_prefer$(EXEEXT): $(cpp14_can_prefer_not_applicable_free_prefer_OBJECTS) $(cpp14_can_prefer_not_applicable_free_prefer_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_not_applicable_free_prefer_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_not_applicable_free_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_not_applicable_free_prefer_OBJECTS) $(cpp14_can_prefer_not_applicable_free_prefer_LDADD) $(LIBS)
+cpp14/can_prefer_not_applicable_free_require.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_not_applicable_free_require$(EXEEXT): $(cpp14_can_prefer_not_applicable_free_require_OBJECTS) $(cpp14_can_prefer_not_applicable_free_require_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_not_applicable_free_require_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_not_applicable_free_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_not_applicable_free_require_OBJECTS) $(cpp14_can_prefer_not_applicable_free_require_LDADD) $(LIBS)
+cpp14/can_prefer_not_applicable_member_prefer.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_not_applicable_member_prefer$(EXEEXT): $(cpp14_can_prefer_not_applicable_member_prefer_OBJECTS) $(cpp14_can_prefer_not_applicable_member_prefer_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_not_applicable_member_prefer_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_not_applicable_member_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_not_applicable_member_prefer_OBJECTS) $(cpp14_can_prefer_not_applicable_member_prefer_LDADD) $(LIBS)
+cpp14/can_prefer_not_applicable_member_require.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_not_applicable_member_require$(EXEEXT): $(cpp14_can_prefer_not_applicable_member_require_OBJECTS) $(cpp14_can_prefer_not_applicable_member_require_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_not_applicable_member_require_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_not_applicable_member_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_not_applicable_member_require_OBJECTS) $(cpp14_can_prefer_not_applicable_member_require_LDADD) $(LIBS)
+cpp14/can_prefer_not_applicable_static.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_not_applicable_static$(EXEEXT): $(cpp14_can_prefer_not_applicable_static_OBJECTS) $(cpp14_can_prefer_not_applicable_static_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_not_applicable_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_not_applicable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_not_applicable_static_OBJECTS) $(cpp14_can_prefer_not_applicable_static_LDADD) $(LIBS)
+cpp14/can_prefer_not_applicable_unsupported.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_not_applicable_unsupported$(EXEEXT): $(cpp14_can_prefer_not_applicable_unsupported_OBJECTS) $(cpp14_can_prefer_not_applicable_unsupported_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_not_applicable_unsupported_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_not_applicable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_not_applicable_unsupported_OBJECTS) $(cpp14_can_prefer_not_applicable_unsupported_LDADD) $(LIBS)
+cpp14/can_prefer_not_preferable_free_prefer.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_not_preferable_free_prefer$(EXEEXT): $(cpp14_can_prefer_not_preferable_free_prefer_OBJECTS) $(cpp14_can_prefer_not_preferable_free_prefer_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_not_preferable_free_prefer_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_not_preferable_free_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_not_preferable_free_prefer_OBJECTS) $(cpp14_can_prefer_not_preferable_free_prefer_LDADD) $(LIBS)
+cpp14/can_prefer_not_preferable_free_require.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_not_preferable_free_require$(EXEEXT): $(cpp14_can_prefer_not_preferable_free_require_OBJECTS) $(cpp14_can_prefer_not_preferable_free_require_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_not_preferable_free_require_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_not_preferable_free_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_not_preferable_free_require_OBJECTS) $(cpp14_can_prefer_not_preferable_free_require_LDADD) $(LIBS)
+cpp14/can_prefer_not_preferable_member_prefer.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_not_preferable_member_prefer$(EXEEXT): $(cpp14_can_prefer_not_preferable_member_prefer_OBJECTS) $(cpp14_can_prefer_not_preferable_member_prefer_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_not_preferable_member_prefer_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_not_preferable_member_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_not_preferable_member_prefer_OBJECTS) $(cpp14_can_prefer_not_preferable_member_prefer_LDADD) $(LIBS)
+cpp14/can_prefer_not_preferable_member_require.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_not_preferable_member_require$(EXEEXT): $(cpp14_can_prefer_not_preferable_member_require_OBJECTS) $(cpp14_can_prefer_not_preferable_member_require_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_not_preferable_member_require_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_not_preferable_member_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_not_preferable_member_require_OBJECTS) $(cpp14_can_prefer_not_preferable_member_require_LDADD) $(LIBS)
+cpp14/can_prefer_not_preferable_static.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_not_preferable_static$(EXEEXT): $(cpp14_can_prefer_not_preferable_static_OBJECTS) $(cpp14_can_prefer_not_preferable_static_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_not_preferable_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_not_preferable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_not_preferable_static_OBJECTS) $(cpp14_can_prefer_not_preferable_static_LDADD) $(LIBS)
+cpp14/can_prefer_not_preferable_unsupported.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_not_preferable_unsupported$(EXEEXT): $(cpp14_can_prefer_not_preferable_unsupported_OBJECTS) $(cpp14_can_prefer_not_preferable_unsupported_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_not_preferable_unsupported_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_not_preferable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_not_preferable_unsupported_OBJECTS) $(cpp14_can_prefer_not_preferable_unsupported_LDADD) $(LIBS)
+cpp14/can_prefer_static.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_static$(EXEEXT): $(cpp14_can_prefer_static_OBJECTS) $(cpp14_can_prefer_static_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_static_OBJECTS) $(cpp14_can_prefer_static_LDADD) $(LIBS)
+cpp14/can_prefer_unsupported.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_prefer_unsupported$(EXEEXT): $(cpp14_can_prefer_unsupported_OBJECTS) $(cpp14_can_prefer_unsupported_DEPENDENCIES) $(EXTRA_cpp14_can_prefer_unsupported_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_prefer_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_prefer_unsupported_OBJECTS) $(cpp14_can_prefer_unsupported_LDADD) $(LIBS)
+cpp14/can_query_free.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_query_free$(EXEEXT): $(cpp14_can_query_free_OBJECTS) $(cpp14_can_query_free_DEPENDENCIES) $(EXTRA_cpp14_can_query_free_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_query_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_query_free_OBJECTS) $(cpp14_can_query_free_LDADD) $(LIBS)
+cpp14/can_query_member.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_query_member$(EXEEXT): $(cpp14_can_query_member_OBJECTS) $(cpp14_can_query_member_DEPENDENCIES) $(EXTRA_cpp14_can_query_member_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_query_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_query_member_OBJECTS) $(cpp14_can_query_member_LDADD) $(LIBS)
+cpp14/can_query_not_applicable_free.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_query_not_applicable_free$(EXEEXT): $(cpp14_can_query_not_applicable_free_OBJECTS) $(cpp14_can_query_not_applicable_free_DEPENDENCIES) $(EXTRA_cpp14_can_query_not_applicable_free_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_query_not_applicable_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_query_not_applicable_free_OBJECTS) $(cpp14_can_query_not_applicable_free_LDADD) $(LIBS)
+cpp14/can_query_not_applicable_member.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_query_not_applicable_member$(EXEEXT): $(cpp14_can_query_not_applicable_member_OBJECTS) $(cpp14_can_query_not_applicable_member_DEPENDENCIES) $(EXTRA_cpp14_can_query_not_applicable_member_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_query_not_applicable_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_query_not_applicable_member_OBJECTS) $(cpp14_can_query_not_applicable_member_LDADD) $(LIBS)
+cpp14/can_query_not_applicable_static.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_query_not_applicable_static$(EXEEXT): $(cpp14_can_query_not_applicable_static_OBJECTS) $(cpp14_can_query_not_applicable_static_DEPENDENCIES) $(EXTRA_cpp14_can_query_not_applicable_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_query_not_applicable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_query_not_applicable_static_OBJECTS) $(cpp14_can_query_not_applicable_static_LDADD) $(LIBS)
+cpp14/can_query_not_applicable_unsupported.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_query_not_applicable_unsupported$(EXEEXT): $(cpp14_can_query_not_applicable_unsupported_OBJECTS) $(cpp14_can_query_not_applicable_unsupported_DEPENDENCIES) $(EXTRA_cpp14_can_query_not_applicable_unsupported_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_query_not_applicable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_query_not_applicable_unsupported_OBJECTS) $(cpp14_can_query_not_applicable_unsupported_LDADD) $(LIBS)
+cpp14/can_query_static.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_query_static$(EXEEXT): $(cpp14_can_query_static_OBJECTS) $(cpp14_can_query_static_DEPENDENCIES) $(EXTRA_cpp14_can_query_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_query_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_query_static_OBJECTS) $(cpp14_can_query_static_LDADD) $(LIBS)
+cpp14/can_query_unsupported.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_query_unsupported$(EXEEXT): $(cpp14_can_query_unsupported_OBJECTS) $(cpp14_can_query_unsupported_DEPENDENCIES) $(EXTRA_cpp14_can_query_unsupported_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_query_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_query_unsupported_OBJECTS) $(cpp14_can_query_unsupported_LDADD) $(LIBS)
+cpp14/can_require_concept_free.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_concept_free$(EXEEXT): $(cpp14_can_require_concept_free_OBJECTS) $(cpp14_can_require_concept_free_DEPENDENCIES) $(EXTRA_cpp14_can_require_concept_free_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_concept_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_concept_free_OBJECTS) $(cpp14_can_require_concept_free_LDADD) $(LIBS)
+cpp14/can_require_concept_member.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_concept_member$(EXEEXT): $(cpp14_can_require_concept_member_OBJECTS) $(cpp14_can_require_concept_member_DEPENDENCIES) $(EXTRA_cpp14_can_require_concept_member_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_concept_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_concept_member_OBJECTS) $(cpp14_can_require_concept_member_LDADD) $(LIBS)
+cpp14/can_require_concept_not_applicable_free.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_concept_not_applicable_free$(EXEEXT): $(cpp14_can_require_concept_not_applicable_free_OBJECTS) $(cpp14_can_require_concept_not_applicable_free_DEPENDENCIES) $(EXTRA_cpp14_can_require_concept_not_applicable_free_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_concept_not_applicable_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_concept_not_applicable_free_OBJECTS) $(cpp14_can_require_concept_not_applicable_free_LDADD) $(LIBS)
+cpp14/can_require_concept_not_applicable_member.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_concept_not_applicable_member$(EXEEXT): $(cpp14_can_require_concept_not_applicable_member_OBJECTS) $(cpp14_can_require_concept_not_applicable_member_DEPENDENCIES) $(EXTRA_cpp14_can_require_concept_not_applicable_member_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_concept_not_applicable_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_concept_not_applicable_member_OBJECTS) $(cpp14_can_require_concept_not_applicable_member_LDADD) $(LIBS)
+cpp14/can_require_concept_not_applicable_static.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_concept_not_applicable_static$(EXEEXT): $(cpp14_can_require_concept_not_applicable_static_OBJECTS) $(cpp14_can_require_concept_not_applicable_static_DEPENDENCIES) $(EXTRA_cpp14_can_require_concept_not_applicable_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_concept_not_applicable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_concept_not_applicable_static_OBJECTS) $(cpp14_can_require_concept_not_applicable_static_LDADD) $(LIBS)
+cpp14/can_require_concept_not_applicable_unsupported.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_concept_not_applicable_unsupported$(EXEEXT): $(cpp14_can_require_concept_not_applicable_unsupported_OBJECTS) $(cpp14_can_require_concept_not_applicable_unsupported_DEPENDENCIES) $(EXTRA_cpp14_can_require_concept_not_applicable_unsupported_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_concept_not_applicable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_concept_not_applicable_unsupported_OBJECTS) $(cpp14_can_require_concept_not_applicable_unsupported_LDADD) $(LIBS)
+cpp14/can_require_concept_static.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_concept_static$(EXEEXT): $(cpp14_can_require_concept_static_OBJECTS) $(cpp14_can_require_concept_static_DEPENDENCIES) $(EXTRA_cpp14_can_require_concept_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_concept_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_concept_static_OBJECTS) $(cpp14_can_require_concept_static_LDADD) $(LIBS)
+cpp14/can_require_concept_unsupported.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_concept_unsupported$(EXEEXT): $(cpp14_can_require_concept_unsupported_OBJECTS) $(cpp14_can_require_concept_unsupported_DEPENDENCIES) $(EXTRA_cpp14_can_require_concept_unsupported_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_concept_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_concept_unsupported_OBJECTS) $(cpp14_can_require_concept_unsupported_LDADD) $(LIBS)
+cpp14/can_require_free.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_free$(EXEEXT): $(cpp14_can_require_free_OBJECTS) $(cpp14_can_require_free_DEPENDENCIES) $(EXTRA_cpp14_can_require_free_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_free_OBJECTS) $(cpp14_can_require_free_LDADD) $(LIBS)
+cpp14/can_require_member.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_member$(EXEEXT): $(cpp14_can_require_member_OBJECTS) $(cpp14_can_require_member_DEPENDENCIES) $(EXTRA_cpp14_can_require_member_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_member_OBJECTS) $(cpp14_can_require_member_LDADD) $(LIBS)
+cpp14/can_require_not_applicable_free.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_not_applicable_free$(EXEEXT): $(cpp14_can_require_not_applicable_free_OBJECTS) $(cpp14_can_require_not_applicable_free_DEPENDENCIES) $(EXTRA_cpp14_can_require_not_applicable_free_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_not_applicable_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_not_applicable_free_OBJECTS) $(cpp14_can_require_not_applicable_free_LDADD) $(LIBS)
+cpp14/can_require_not_applicable_member.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_not_applicable_member$(EXEEXT): $(cpp14_can_require_not_applicable_member_OBJECTS) $(cpp14_can_require_not_applicable_member_DEPENDENCIES) $(EXTRA_cpp14_can_require_not_applicable_member_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_not_applicable_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_not_applicable_member_OBJECTS) $(cpp14_can_require_not_applicable_member_LDADD) $(LIBS)
+cpp14/can_require_not_applicable_static.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_not_applicable_static$(EXEEXT): $(cpp14_can_require_not_applicable_static_OBJECTS) $(cpp14_can_require_not_applicable_static_DEPENDENCIES) $(EXTRA_cpp14_can_require_not_applicable_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_not_applicable_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_not_applicable_static_OBJECTS) $(cpp14_can_require_not_applicable_static_LDADD) $(LIBS)
+cpp14/can_require_not_applicable_unsupported.$(OBJEXT): \
+ cpp14/$(am__dirstamp) cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_not_applicable_unsupported$(EXEEXT): $(cpp14_can_require_not_applicable_unsupported_OBJECTS) $(cpp14_can_require_not_applicable_unsupported_DEPENDENCIES) $(EXTRA_cpp14_can_require_not_applicable_unsupported_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_not_applicable_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_not_applicable_unsupported_OBJECTS) $(cpp14_can_require_not_applicable_unsupported_LDADD) $(LIBS)
+cpp14/can_require_static.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_static$(EXEEXT): $(cpp14_can_require_static_OBJECTS) $(cpp14_can_require_static_DEPENDENCIES) $(EXTRA_cpp14_can_require_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_static_OBJECTS) $(cpp14_can_require_static_LDADD) $(LIBS)
+cpp14/can_require_unsupported.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/can_require_unsupported$(EXEEXT): $(cpp14_can_require_unsupported_OBJECTS) $(cpp14_can_require_unsupported_DEPENDENCIES) $(EXTRA_cpp14_can_require_unsupported_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/can_require_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_can_require_unsupported_OBJECTS) $(cpp14_can_require_unsupported_LDADD) $(LIBS)
+cpp14/prefer_free_prefer.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/prefer_free_prefer$(EXEEXT): $(cpp14_prefer_free_prefer_OBJECTS) $(cpp14_prefer_free_prefer_DEPENDENCIES) $(EXTRA_cpp14_prefer_free_prefer_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/prefer_free_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_prefer_free_prefer_OBJECTS) $(cpp14_prefer_free_prefer_LDADD) $(LIBS)
+cpp14/prefer_free_require.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/prefer_free_require$(EXEEXT): $(cpp14_prefer_free_require_OBJECTS) $(cpp14_prefer_free_require_DEPENDENCIES) $(EXTRA_cpp14_prefer_free_require_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/prefer_free_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_prefer_free_require_OBJECTS) $(cpp14_prefer_free_require_LDADD) $(LIBS)
+cpp14/prefer_member_prefer.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/prefer_member_prefer$(EXEEXT): $(cpp14_prefer_member_prefer_OBJECTS) $(cpp14_prefer_member_prefer_DEPENDENCIES) $(EXTRA_cpp14_prefer_member_prefer_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/prefer_member_prefer$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_prefer_member_prefer_OBJECTS) $(cpp14_prefer_member_prefer_LDADD) $(LIBS)
+cpp14/prefer_member_require.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/prefer_member_require$(EXEEXT): $(cpp14_prefer_member_require_OBJECTS) $(cpp14_prefer_member_require_DEPENDENCIES) $(EXTRA_cpp14_prefer_member_require_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/prefer_member_require$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_prefer_member_require_OBJECTS) $(cpp14_prefer_member_require_LDADD) $(LIBS)
+cpp14/prefer_static.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/prefer_static$(EXEEXT): $(cpp14_prefer_static_OBJECTS) $(cpp14_prefer_static_DEPENDENCIES) $(EXTRA_cpp14_prefer_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/prefer_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_prefer_static_OBJECTS) $(cpp14_prefer_static_LDADD) $(LIBS)
+cpp14/prefer_unsupported.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/prefer_unsupported$(EXEEXT): $(cpp14_prefer_unsupported_OBJECTS) $(cpp14_prefer_unsupported_DEPENDENCIES) $(EXTRA_cpp14_prefer_unsupported_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/prefer_unsupported$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_prefer_unsupported_OBJECTS) $(cpp14_prefer_unsupported_LDADD) $(LIBS)
+cpp14/query_free.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/query_free$(EXEEXT): $(cpp14_query_free_OBJECTS) $(cpp14_query_free_DEPENDENCIES) $(EXTRA_cpp14_query_free_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/query_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_query_free_OBJECTS) $(cpp14_query_free_LDADD) $(LIBS)
+cpp14/query_member.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/query_member$(EXEEXT): $(cpp14_query_member_OBJECTS) $(cpp14_query_member_DEPENDENCIES) $(EXTRA_cpp14_query_member_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/query_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_query_member_OBJECTS) $(cpp14_query_member_LDADD) $(LIBS)
+cpp14/query_static.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/query_static$(EXEEXT): $(cpp14_query_static_OBJECTS) $(cpp14_query_static_DEPENDENCIES) $(EXTRA_cpp14_query_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/query_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_query_static_OBJECTS) $(cpp14_query_static_LDADD) $(LIBS)
+cpp14/require_concept_free.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/require_concept_free$(EXEEXT): $(cpp14_require_concept_free_OBJECTS) $(cpp14_require_concept_free_DEPENDENCIES) $(EXTRA_cpp14_require_concept_free_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/require_concept_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_require_concept_free_OBJECTS) $(cpp14_require_concept_free_LDADD) $(LIBS)
+cpp14/require_concept_member.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/require_concept_member$(EXEEXT): $(cpp14_require_concept_member_OBJECTS) $(cpp14_require_concept_member_DEPENDENCIES) $(EXTRA_cpp14_require_concept_member_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/require_concept_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_require_concept_member_OBJECTS) $(cpp14_require_concept_member_LDADD) $(LIBS)
+cpp14/require_concept_static.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/require_concept_static$(EXEEXT): $(cpp14_require_concept_static_OBJECTS) $(cpp14_require_concept_static_DEPENDENCIES) $(EXTRA_cpp14_require_concept_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/require_concept_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_require_concept_static_OBJECTS) $(cpp14_require_concept_static_LDADD) $(LIBS)
+cpp14/require_free.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/require_free$(EXEEXT): $(cpp14_require_free_OBJECTS) $(cpp14_require_free_DEPENDENCIES) $(EXTRA_cpp14_require_free_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/require_free$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_require_free_OBJECTS) $(cpp14_require_free_LDADD) $(LIBS)
+cpp14/require_member.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/require_member$(EXEEXT): $(cpp14_require_member_OBJECTS) $(cpp14_require_member_DEPENDENCIES) $(EXTRA_cpp14_require_member_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/require_member$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_require_member_OBJECTS) $(cpp14_require_member_LDADD) $(LIBS)
+cpp14/require_static.$(OBJEXT): cpp14/$(am__dirstamp) \
+ cpp14/$(DEPDIR)/$(am__dirstamp)
+
+cpp14/require_static$(EXEEXT): $(cpp14_require_static_OBJECTS) $(cpp14_require_static_DEPENDENCIES) $(EXTRA_cpp14_require_static_DEPENDENCIES) cpp14/$(am__dirstamp)
+ @rm -f cpp14/require_static$(EXEEXT)
+ $(AM_V_CXXLD)$(CXXLINK) $(cpp14_require_static_OBJECTS) $(cpp14_require_static_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+ -rm -f cpp03/*.$(OBJEXT)
+ -rm -f cpp11/*.$(OBJEXT)
+ -rm -f cpp14/*.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_free_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_free_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_member_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_member_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_not_applicable_free_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_not_applicable_free_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_not_applicable_member_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_not_applicable_member_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_not_applicable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_not_applicable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_not_preferable_free_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_not_preferable_free_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_not_preferable_member_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_not_preferable_member_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_not_preferable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_not_preferable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_prefer_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_query_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_query_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_query_not_applicable_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_query_not_applicable_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_query_not_applicable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_query_not_applicable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_query_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_query_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_concept_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_concept_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_concept_not_applicable_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_concept_not_applicable_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_concept_not_applicable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_concept_not_applicable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_concept_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_concept_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_not_applicable_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_not_applicable_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_not_applicable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_not_applicable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/can_require_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/prefer_free_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/prefer_free_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/prefer_member_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/prefer_member_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/prefer_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/prefer_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/query_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/query_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/query_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/require_concept_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/require_concept_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/require_concept_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/require_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/require_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp03/$(DEPDIR)/require_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_free_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_free_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_member_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_member_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_not_applicable_free_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_not_applicable_free_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_not_applicable_member_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_not_applicable_member_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_not_applicable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_not_applicable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_not_preferable_free_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_not_preferable_free_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_not_preferable_member_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_not_preferable_member_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_not_preferable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_not_preferable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_prefer_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_query_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_query_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_query_not_applicable_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_query_not_applicable_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_query_not_applicable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_query_not_applicable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_query_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_query_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_concept_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_concept_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_concept_not_applicable_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_concept_not_applicable_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_concept_not_applicable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_concept_not_applicable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_concept_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_concept_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_not_applicable_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_not_applicable_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_not_applicable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_not_applicable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/can_require_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/prefer_free_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/prefer_free_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/prefer_member_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/prefer_member_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/prefer_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/prefer_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/query_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/query_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/query_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/require_concept_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/require_concept_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/require_concept_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/require_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/require_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp11/$(DEPDIR)/require_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_free_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_free_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_member_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_member_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_not_applicable_free_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_not_applicable_free_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_not_applicable_member_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_not_applicable_member_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_not_applicable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_not_applicable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_not_preferable_free_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_not_preferable_free_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_not_preferable_member_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_not_preferable_member_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_not_preferable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_not_preferable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_prefer_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_query_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_query_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_query_not_applicable_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_query_not_applicable_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_query_not_applicable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_query_not_applicable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_query_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_query_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_concept_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_concept_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_concept_not_applicable_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_concept_not_applicable_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_concept_not_applicable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_concept_not_applicable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_concept_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_concept_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_not_applicable_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_not_applicable_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_not_applicable_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_not_applicable_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/can_require_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/prefer_free_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/prefer_free_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/prefer_member_prefer.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/prefer_member_require.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/prefer_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/prefer_unsupported.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/query_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/query_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/query_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/require_concept_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/require_concept_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/require_concept_static.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/require_free.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/require_member.Po@am__quote@ # am--include-marker
+@AMDEP_TRUE@@am__include@ @am__quote@cpp14/$(DEPDIR)/require_static.Po@am__quote@ # am--include-marker
+
+$(am__depfiles_remade):
+ @$(MKDIR_P) $(@D)
+ @echo '# dummy' >$@-t && $(am__mv) $@-t $@
+
+am--depfiles: $(am__depfiles_remade)
+
+.cpp.o:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $<
+
+.cpp.obj:
+@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+ID: $(am__tagged_files)
+ $(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ set x; \
+ here=`pwd`; \
+ $(am__define_uniq_tagged_files); \
+ shift; \
+ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ if test $$# -gt 0; then \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ "$$@" $$unique; \
+ else \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$unique; \
+ fi; \
+ fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+ $(am__define_uniq_tagged_files); \
+ test -z "$(CTAGS_ARGS)$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && $(am__cd) $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+ list='$(am__tagged_files)'; \
+ case "$(srcdir)" in \
+ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+ *) sdir=$(subdir)/$(srcdir) ;; \
+ esac; \
+ for i in $$list; do \
+ if test -f "$$i"; then \
+ echo "$(subdir)/$$i"; \
+ else \
+ echo "$$sdir/$$i"; \
+ fi; \
+ done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+# Recover from deleted '.trs' file; this should ensure that
+# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create
+# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells
+# to avoid problems with "make -n".
+.log.trs:
+ rm -f $< $@
+ $(MAKE) $(AM_MAKEFLAGS) $<
+
+# Leading 'am--fnord' is there to ensure the list of targets does not
+# expand to empty, as could happen e.g. with make check TESTS=''.
+am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck)
+am--force-recheck:
+ @:
+
+$(TEST_SUITE_LOG): $(TEST_LOGS)
+ @$(am__set_TESTS_bases); \
+ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \
+ redo_bases=`for i in $$bases; do \
+ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \
+ done`; \
+ if test -n "$$redo_bases"; then \
+ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \
+ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \
+ if $(am__make_dryrun); then :; else \
+ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \
+ fi; \
+ fi; \
+ if test -n "$$am__remaking_logs"; then \
+ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
+ "recursion detected" >&2; \
+ elif test -n "$$redo_logs"; then \
+ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
+ fi; \
+ if $(am__make_dryrun); then :; else \
+ st=0; \
+ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \
+ for i in $$redo_bases; do \
+ test -f $$i.trs && test -r $$i.trs \
+ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \
+ test -f $$i.log && test -r $$i.log \
+ || { echo "$$errmsg $$i.log" >&2; st=1; }; \
+ done; \
+ test $$st -eq 0 || exit 1; \
+ fi
+ @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \
+ ws='[ ]'; \
+ results=`for b in $$bases; do echo $$b.trs; done`; \
+ test -n "$$results" || results=/dev/null; \
+ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \
+ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \
+ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \
+ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \
+ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \
+ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \
+ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \
+ if test `expr $$fail + $$xpass + $$error` -eq 0; then \
+ success=true; \
+ else \
+ success=false; \
+ fi; \
+ br='==================='; br=$$br$$br$$br$$br; \
+ result_count () \
+ { \
+ if test x"$$1" = x"--maybe-color"; then \
+ maybe_colorize=yes; \
+ elif test x"$$1" = x"--no-color"; then \
+ maybe_colorize=no; \
+ else \
+ echo "$@: invalid 'result_count' usage" >&2; exit 4; \
+ fi; \
+ shift; \
+ desc=$$1 count=$$2; \
+ if test $$maybe_colorize = yes && test $$count -gt 0; then \
+ color_start=$$3 color_end=$$std; \
+ else \
+ color_start= color_end=; \
+ fi; \
+ echo "$${color_start}# $$desc $$count$${color_end}"; \
+ }; \
+ create_testsuite_report () \
+ { \
+ result_count $$1 "TOTAL:" $$all "$$brg"; \
+ result_count $$1 "PASS: " $$pass "$$grn"; \
+ result_count $$1 "SKIP: " $$skip "$$blu"; \
+ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \
+ result_count $$1 "FAIL: " $$fail "$$red"; \
+ result_count $$1 "XPASS:" $$xpass "$$red"; \
+ result_count $$1 "ERROR:" $$error "$$mgn"; \
+ }; \
+ { \
+ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \
+ $(am__rst_title); \
+ create_testsuite_report --no-color; \
+ echo; \
+ echo ".. contents:: :depth: 2"; \
+ echo; \
+ for b in $$bases; do echo $$b; done \
+ | $(am__create_global_log); \
+ } >$(TEST_SUITE_LOG).tmp || exit 1; \
+ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \
+ if $$success; then \
+ col="$$grn"; \
+ else \
+ col="$$red"; \
+ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \
+ fi; \
+ echo "$${col}$$br$${std}"; \
+ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \
+ echo "$${col}$$br$${std}"; \
+ create_testsuite_report --maybe-color; \
+ echo "$$col$$br$$std"; \
+ if $$success; then :; else \
+ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \
+ if test -n "$(PACKAGE_BUGREPORT)"; then \
+ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \
+ fi; \
+ echo "$$col$$br$$std"; \
+ fi; \
+ $$success || exit 1
+
+check-TESTS: $(check_PROGRAMS)
+ @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list
+ @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ trs_list=`for i in $$bases; do echo $$i.trs; done`; \
+ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \
+ exit $$?;
+recheck: all $(check_PROGRAMS)
+ @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+ @set +e; $(am__set_TESTS_bases); \
+ bases=`for i in $$bases; do echo $$i; done \
+ | $(am__list_recheck_tests)` || exit 1; \
+ log_list=`for i in $$bases; do echo $$i.log; done`; \
+ log_list=`echo $$log_list`; \
+ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \
+ am__force_recheck=am--force-recheck \
+ TEST_LOGS="$$log_list"; \
+ exit $$?
+cpp03/query_free.log: cpp03/query_free$(EXEEXT)
+ @p='cpp03/query_free$(EXEEXT)'; \
+ b='cpp03/query_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/query_member.log: cpp03/query_member$(EXEEXT)
+ @p='cpp03/query_member$(EXEEXT)'; \
+ b='cpp03/query_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/query_static.log: cpp03/query_static$(EXEEXT)
+ @p='cpp03/query_static$(EXEEXT)'; \
+ b='cpp03/query_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_query_free.log: cpp03/can_query_free$(EXEEXT)
+ @p='cpp03/can_query_free$(EXEEXT)'; \
+ b='cpp03/can_query_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_query_member.log: cpp03/can_query_member$(EXEEXT)
+ @p='cpp03/can_query_member$(EXEEXT)'; \
+ b='cpp03/can_query_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_query_static.log: cpp03/can_query_static$(EXEEXT)
+ @p='cpp03/can_query_static$(EXEEXT)'; \
+ b='cpp03/can_query_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_query_unsupported.log: cpp03/can_query_unsupported$(EXEEXT)
+ @p='cpp03/can_query_unsupported$(EXEEXT)'; \
+ b='cpp03/can_query_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_query_not_applicable_free.log: cpp03/can_query_not_applicable_free$(EXEEXT)
+ @p='cpp03/can_query_not_applicable_free$(EXEEXT)'; \
+ b='cpp03/can_query_not_applicable_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_query_not_applicable_member.log: cpp03/can_query_not_applicable_member$(EXEEXT)
+ @p='cpp03/can_query_not_applicable_member$(EXEEXT)'; \
+ b='cpp03/can_query_not_applicable_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_query_not_applicable_static.log: cpp03/can_query_not_applicable_static$(EXEEXT)
+ @p='cpp03/can_query_not_applicable_static$(EXEEXT)'; \
+ b='cpp03/can_query_not_applicable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_query_not_applicable_unsupported.log: cpp03/can_query_not_applicable_unsupported$(EXEEXT)
+ @p='cpp03/can_query_not_applicable_unsupported$(EXEEXT)'; \
+ b='cpp03/can_query_not_applicable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/require_concept_free.log: cpp03/require_concept_free$(EXEEXT)
+ @p='cpp03/require_concept_free$(EXEEXT)'; \
+ b='cpp03/require_concept_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/require_concept_member.log: cpp03/require_concept_member$(EXEEXT)
+ @p='cpp03/require_concept_member$(EXEEXT)'; \
+ b='cpp03/require_concept_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/require_concept_static.log: cpp03/require_concept_static$(EXEEXT)
+ @p='cpp03/require_concept_static$(EXEEXT)'; \
+ b='cpp03/require_concept_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_concept_free.log: cpp03/can_require_concept_free$(EXEEXT)
+ @p='cpp03/can_require_concept_free$(EXEEXT)'; \
+ b='cpp03/can_require_concept_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_concept_member.log: cpp03/can_require_concept_member$(EXEEXT)
+ @p='cpp03/can_require_concept_member$(EXEEXT)'; \
+ b='cpp03/can_require_concept_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_concept_static.log: cpp03/can_require_concept_static$(EXEEXT)
+ @p='cpp03/can_require_concept_static$(EXEEXT)'; \
+ b='cpp03/can_require_concept_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_concept_unsupported.log: cpp03/can_require_concept_unsupported$(EXEEXT)
+ @p='cpp03/can_require_concept_unsupported$(EXEEXT)'; \
+ b='cpp03/can_require_concept_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_concept_not_applicable_free.log: cpp03/can_require_concept_not_applicable_free$(EXEEXT)
+ @p='cpp03/can_require_concept_not_applicable_free$(EXEEXT)'; \
+ b='cpp03/can_require_concept_not_applicable_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_concept_not_applicable_member.log: cpp03/can_require_concept_not_applicable_member$(EXEEXT)
+ @p='cpp03/can_require_concept_not_applicable_member$(EXEEXT)'; \
+ b='cpp03/can_require_concept_not_applicable_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_concept_not_applicable_static.log: cpp03/can_require_concept_not_applicable_static$(EXEEXT)
+ @p='cpp03/can_require_concept_not_applicable_static$(EXEEXT)'; \
+ b='cpp03/can_require_concept_not_applicable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_concept_not_applicable_unsupported.log: cpp03/can_require_concept_not_applicable_unsupported$(EXEEXT)
+ @p='cpp03/can_require_concept_not_applicable_unsupported$(EXEEXT)'; \
+ b='cpp03/can_require_concept_not_applicable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/require_free.log: cpp03/require_free$(EXEEXT)
+ @p='cpp03/require_free$(EXEEXT)'; \
+ b='cpp03/require_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/require_member.log: cpp03/require_member$(EXEEXT)
+ @p='cpp03/require_member$(EXEEXT)'; \
+ b='cpp03/require_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/require_static.log: cpp03/require_static$(EXEEXT)
+ @p='cpp03/require_static$(EXEEXT)'; \
+ b='cpp03/require_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_free.log: cpp03/can_require_free$(EXEEXT)
+ @p='cpp03/can_require_free$(EXEEXT)'; \
+ b='cpp03/can_require_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_member.log: cpp03/can_require_member$(EXEEXT)
+ @p='cpp03/can_require_member$(EXEEXT)'; \
+ b='cpp03/can_require_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_static.log: cpp03/can_require_static$(EXEEXT)
+ @p='cpp03/can_require_static$(EXEEXT)'; \
+ b='cpp03/can_require_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_unsupported.log: cpp03/can_require_unsupported$(EXEEXT)
+ @p='cpp03/can_require_unsupported$(EXEEXT)'; \
+ b='cpp03/can_require_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_not_applicable_free.log: cpp03/can_require_not_applicable_free$(EXEEXT)
+ @p='cpp03/can_require_not_applicable_free$(EXEEXT)'; \
+ b='cpp03/can_require_not_applicable_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_not_applicable_member.log: cpp03/can_require_not_applicable_member$(EXEEXT)
+ @p='cpp03/can_require_not_applicable_member$(EXEEXT)'; \
+ b='cpp03/can_require_not_applicable_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_not_applicable_static.log: cpp03/can_require_not_applicable_static$(EXEEXT)
+ @p='cpp03/can_require_not_applicable_static$(EXEEXT)'; \
+ b='cpp03/can_require_not_applicable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_require_not_applicable_unsupported.log: cpp03/can_require_not_applicable_unsupported$(EXEEXT)
+ @p='cpp03/can_require_not_applicable_unsupported$(EXEEXT)'; \
+ b='cpp03/can_require_not_applicable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/prefer_free_prefer.log: cpp03/prefer_free_prefer$(EXEEXT)
+ @p='cpp03/prefer_free_prefer$(EXEEXT)'; \
+ b='cpp03/prefer_free_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/prefer_member_prefer.log: cpp03/prefer_member_prefer$(EXEEXT)
+ @p='cpp03/prefer_member_prefer$(EXEEXT)'; \
+ b='cpp03/prefer_member_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/prefer_free_require.log: cpp03/prefer_free_require$(EXEEXT)
+ @p='cpp03/prefer_free_require$(EXEEXT)'; \
+ b='cpp03/prefer_free_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/prefer_member_require.log: cpp03/prefer_member_require$(EXEEXT)
+ @p='cpp03/prefer_member_require$(EXEEXT)'; \
+ b='cpp03/prefer_member_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/prefer_static.log: cpp03/prefer_static$(EXEEXT)
+ @p='cpp03/prefer_static$(EXEEXT)'; \
+ b='cpp03/prefer_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/prefer_unsupported.log: cpp03/prefer_unsupported$(EXEEXT)
+ @p='cpp03/prefer_unsupported$(EXEEXT)'; \
+ b='cpp03/prefer_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_free_prefer.log: cpp03/can_prefer_free_prefer$(EXEEXT)
+ @p='cpp03/can_prefer_free_prefer$(EXEEXT)'; \
+ b='cpp03/can_prefer_free_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_free_require.log: cpp03/can_prefer_free_require$(EXEEXT)
+ @p='cpp03/can_prefer_free_require$(EXEEXT)'; \
+ b='cpp03/can_prefer_free_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_member_prefer.log: cpp03/can_prefer_member_prefer$(EXEEXT)
+ @p='cpp03/can_prefer_member_prefer$(EXEEXT)'; \
+ b='cpp03/can_prefer_member_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_member_require.log: cpp03/can_prefer_member_require$(EXEEXT)
+ @p='cpp03/can_prefer_member_require$(EXEEXT)'; \
+ b='cpp03/can_prefer_member_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_static.log: cpp03/can_prefer_static$(EXEEXT)
+ @p='cpp03/can_prefer_static$(EXEEXT)'; \
+ b='cpp03/can_prefer_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_unsupported.log: cpp03/can_prefer_unsupported$(EXEEXT)
+ @p='cpp03/can_prefer_unsupported$(EXEEXT)'; \
+ b='cpp03/can_prefer_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_not_applicable_free_prefer.log: cpp03/can_prefer_not_applicable_free_prefer$(EXEEXT)
+ @p='cpp03/can_prefer_not_applicable_free_prefer$(EXEEXT)'; \
+ b='cpp03/can_prefer_not_applicable_free_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_not_applicable_free_require.log: cpp03/can_prefer_not_applicable_free_require$(EXEEXT)
+ @p='cpp03/can_prefer_not_applicable_free_require$(EXEEXT)'; \
+ b='cpp03/can_prefer_not_applicable_free_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_not_applicable_member_prefer.log: cpp03/can_prefer_not_applicable_member_prefer$(EXEEXT)
+ @p='cpp03/can_prefer_not_applicable_member_prefer$(EXEEXT)'; \
+ b='cpp03/can_prefer_not_applicable_member_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_not_applicable_member_require.log: cpp03/can_prefer_not_applicable_member_require$(EXEEXT)
+ @p='cpp03/can_prefer_not_applicable_member_require$(EXEEXT)'; \
+ b='cpp03/can_prefer_not_applicable_member_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_not_applicable_static.log: cpp03/can_prefer_not_applicable_static$(EXEEXT)
+ @p='cpp03/can_prefer_not_applicable_static$(EXEEXT)'; \
+ b='cpp03/can_prefer_not_applicable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_not_applicable_unsupported.log: cpp03/can_prefer_not_applicable_unsupported$(EXEEXT)
+ @p='cpp03/can_prefer_not_applicable_unsupported$(EXEEXT)'; \
+ b='cpp03/can_prefer_not_applicable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_not_preferable_free_prefer.log: cpp03/can_prefer_not_preferable_free_prefer$(EXEEXT)
+ @p='cpp03/can_prefer_not_preferable_free_prefer$(EXEEXT)'; \
+ b='cpp03/can_prefer_not_preferable_free_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_not_preferable_free_require.log: cpp03/can_prefer_not_preferable_free_require$(EXEEXT)
+ @p='cpp03/can_prefer_not_preferable_free_require$(EXEEXT)'; \
+ b='cpp03/can_prefer_not_preferable_free_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_not_preferable_member_prefer.log: cpp03/can_prefer_not_preferable_member_prefer$(EXEEXT)
+ @p='cpp03/can_prefer_not_preferable_member_prefer$(EXEEXT)'; \
+ b='cpp03/can_prefer_not_preferable_member_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_not_preferable_member_require.log: cpp03/can_prefer_not_preferable_member_require$(EXEEXT)
+ @p='cpp03/can_prefer_not_preferable_member_require$(EXEEXT)'; \
+ b='cpp03/can_prefer_not_preferable_member_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_not_preferable_static.log: cpp03/can_prefer_not_preferable_static$(EXEEXT)
+ @p='cpp03/can_prefer_not_preferable_static$(EXEEXT)'; \
+ b='cpp03/can_prefer_not_preferable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp03/can_prefer_not_preferable_unsupported.log: cpp03/can_prefer_not_preferable_unsupported$(EXEEXT)
+ @p='cpp03/can_prefer_not_preferable_unsupported$(EXEEXT)'; \
+ b='cpp03/can_prefer_not_preferable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/query_free.log: cpp11/query_free$(EXEEXT)
+ @p='cpp11/query_free$(EXEEXT)'; \
+ b='cpp11/query_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/query_member.log: cpp11/query_member$(EXEEXT)
+ @p='cpp11/query_member$(EXEEXT)'; \
+ b='cpp11/query_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/query_static.log: cpp11/query_static$(EXEEXT)
+ @p='cpp11/query_static$(EXEEXT)'; \
+ b='cpp11/query_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_query_free.log: cpp11/can_query_free$(EXEEXT)
+ @p='cpp11/can_query_free$(EXEEXT)'; \
+ b='cpp11/can_query_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_query_member.log: cpp11/can_query_member$(EXEEXT)
+ @p='cpp11/can_query_member$(EXEEXT)'; \
+ b='cpp11/can_query_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_query_static.log: cpp11/can_query_static$(EXEEXT)
+ @p='cpp11/can_query_static$(EXEEXT)'; \
+ b='cpp11/can_query_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_query_unsupported.log: cpp11/can_query_unsupported$(EXEEXT)
+ @p='cpp11/can_query_unsupported$(EXEEXT)'; \
+ b='cpp11/can_query_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_query_not_applicable_free.log: cpp11/can_query_not_applicable_free$(EXEEXT)
+ @p='cpp11/can_query_not_applicable_free$(EXEEXT)'; \
+ b='cpp11/can_query_not_applicable_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_query_not_applicable_member.log: cpp11/can_query_not_applicable_member$(EXEEXT)
+ @p='cpp11/can_query_not_applicable_member$(EXEEXT)'; \
+ b='cpp11/can_query_not_applicable_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_query_not_applicable_static.log: cpp11/can_query_not_applicable_static$(EXEEXT)
+ @p='cpp11/can_query_not_applicable_static$(EXEEXT)'; \
+ b='cpp11/can_query_not_applicable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_query_not_applicable_unsupported.log: cpp11/can_query_not_applicable_unsupported$(EXEEXT)
+ @p='cpp11/can_query_not_applicable_unsupported$(EXEEXT)'; \
+ b='cpp11/can_query_not_applicable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/require_concept_free.log: cpp11/require_concept_free$(EXEEXT)
+ @p='cpp11/require_concept_free$(EXEEXT)'; \
+ b='cpp11/require_concept_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/require_concept_member.log: cpp11/require_concept_member$(EXEEXT)
+ @p='cpp11/require_concept_member$(EXEEXT)'; \
+ b='cpp11/require_concept_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/require_concept_static.log: cpp11/require_concept_static$(EXEEXT)
+ @p='cpp11/require_concept_static$(EXEEXT)'; \
+ b='cpp11/require_concept_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_concept_free.log: cpp11/can_require_concept_free$(EXEEXT)
+ @p='cpp11/can_require_concept_free$(EXEEXT)'; \
+ b='cpp11/can_require_concept_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_concept_member.log: cpp11/can_require_concept_member$(EXEEXT)
+ @p='cpp11/can_require_concept_member$(EXEEXT)'; \
+ b='cpp11/can_require_concept_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_concept_static.log: cpp11/can_require_concept_static$(EXEEXT)
+ @p='cpp11/can_require_concept_static$(EXEEXT)'; \
+ b='cpp11/can_require_concept_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_concept_unsupported.log: cpp11/can_require_concept_unsupported$(EXEEXT)
+ @p='cpp11/can_require_concept_unsupported$(EXEEXT)'; \
+ b='cpp11/can_require_concept_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_concept_not_applicable_free.log: cpp11/can_require_concept_not_applicable_free$(EXEEXT)
+ @p='cpp11/can_require_concept_not_applicable_free$(EXEEXT)'; \
+ b='cpp11/can_require_concept_not_applicable_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_concept_not_applicable_member.log: cpp11/can_require_concept_not_applicable_member$(EXEEXT)
+ @p='cpp11/can_require_concept_not_applicable_member$(EXEEXT)'; \
+ b='cpp11/can_require_concept_not_applicable_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_concept_not_applicable_static.log: cpp11/can_require_concept_not_applicable_static$(EXEEXT)
+ @p='cpp11/can_require_concept_not_applicable_static$(EXEEXT)'; \
+ b='cpp11/can_require_concept_not_applicable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_concept_not_applicable_unsupported.log: cpp11/can_require_concept_not_applicable_unsupported$(EXEEXT)
+ @p='cpp11/can_require_concept_not_applicable_unsupported$(EXEEXT)'; \
+ b='cpp11/can_require_concept_not_applicable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/require_free.log: cpp11/require_free$(EXEEXT)
+ @p='cpp11/require_free$(EXEEXT)'; \
+ b='cpp11/require_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/require_member.log: cpp11/require_member$(EXEEXT)
+ @p='cpp11/require_member$(EXEEXT)'; \
+ b='cpp11/require_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/require_static.log: cpp11/require_static$(EXEEXT)
+ @p='cpp11/require_static$(EXEEXT)'; \
+ b='cpp11/require_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_free.log: cpp11/can_require_free$(EXEEXT)
+ @p='cpp11/can_require_free$(EXEEXT)'; \
+ b='cpp11/can_require_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_member.log: cpp11/can_require_member$(EXEEXT)
+ @p='cpp11/can_require_member$(EXEEXT)'; \
+ b='cpp11/can_require_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_static.log: cpp11/can_require_static$(EXEEXT)
+ @p='cpp11/can_require_static$(EXEEXT)'; \
+ b='cpp11/can_require_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_unsupported.log: cpp11/can_require_unsupported$(EXEEXT)
+ @p='cpp11/can_require_unsupported$(EXEEXT)'; \
+ b='cpp11/can_require_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_not_applicable_free.log: cpp11/can_require_not_applicable_free$(EXEEXT)
+ @p='cpp11/can_require_not_applicable_free$(EXEEXT)'; \
+ b='cpp11/can_require_not_applicable_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_not_applicable_member.log: cpp11/can_require_not_applicable_member$(EXEEXT)
+ @p='cpp11/can_require_not_applicable_member$(EXEEXT)'; \
+ b='cpp11/can_require_not_applicable_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_not_applicable_static.log: cpp11/can_require_not_applicable_static$(EXEEXT)
+ @p='cpp11/can_require_not_applicable_static$(EXEEXT)'; \
+ b='cpp11/can_require_not_applicable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_require_not_applicable_unsupported.log: cpp11/can_require_not_applicable_unsupported$(EXEEXT)
+ @p='cpp11/can_require_not_applicable_unsupported$(EXEEXT)'; \
+ b='cpp11/can_require_not_applicable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/prefer_free_prefer.log: cpp11/prefer_free_prefer$(EXEEXT)
+ @p='cpp11/prefer_free_prefer$(EXEEXT)'; \
+ b='cpp11/prefer_free_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/prefer_member_prefer.log: cpp11/prefer_member_prefer$(EXEEXT)
+ @p='cpp11/prefer_member_prefer$(EXEEXT)'; \
+ b='cpp11/prefer_member_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/prefer_free_require.log: cpp11/prefer_free_require$(EXEEXT)
+ @p='cpp11/prefer_free_require$(EXEEXT)'; \
+ b='cpp11/prefer_free_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/prefer_member_require.log: cpp11/prefer_member_require$(EXEEXT)
+ @p='cpp11/prefer_member_require$(EXEEXT)'; \
+ b='cpp11/prefer_member_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/prefer_static.log: cpp11/prefer_static$(EXEEXT)
+ @p='cpp11/prefer_static$(EXEEXT)'; \
+ b='cpp11/prefer_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/prefer_unsupported.log: cpp11/prefer_unsupported$(EXEEXT)
+ @p='cpp11/prefer_unsupported$(EXEEXT)'; \
+ b='cpp11/prefer_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_free_prefer.log: cpp11/can_prefer_free_prefer$(EXEEXT)
+ @p='cpp11/can_prefer_free_prefer$(EXEEXT)'; \
+ b='cpp11/can_prefer_free_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_free_require.log: cpp11/can_prefer_free_require$(EXEEXT)
+ @p='cpp11/can_prefer_free_require$(EXEEXT)'; \
+ b='cpp11/can_prefer_free_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_member_prefer.log: cpp11/can_prefer_member_prefer$(EXEEXT)
+ @p='cpp11/can_prefer_member_prefer$(EXEEXT)'; \
+ b='cpp11/can_prefer_member_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_member_require.log: cpp11/can_prefer_member_require$(EXEEXT)
+ @p='cpp11/can_prefer_member_require$(EXEEXT)'; \
+ b='cpp11/can_prefer_member_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_static.log: cpp11/can_prefer_static$(EXEEXT)
+ @p='cpp11/can_prefer_static$(EXEEXT)'; \
+ b='cpp11/can_prefer_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_unsupported.log: cpp11/can_prefer_unsupported$(EXEEXT)
+ @p='cpp11/can_prefer_unsupported$(EXEEXT)'; \
+ b='cpp11/can_prefer_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_not_applicable_free_prefer.log: cpp11/can_prefer_not_applicable_free_prefer$(EXEEXT)
+ @p='cpp11/can_prefer_not_applicable_free_prefer$(EXEEXT)'; \
+ b='cpp11/can_prefer_not_applicable_free_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_not_applicable_free_require.log: cpp11/can_prefer_not_applicable_free_require$(EXEEXT)
+ @p='cpp11/can_prefer_not_applicable_free_require$(EXEEXT)'; \
+ b='cpp11/can_prefer_not_applicable_free_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_not_applicable_member_prefer.log: cpp11/can_prefer_not_applicable_member_prefer$(EXEEXT)
+ @p='cpp11/can_prefer_not_applicable_member_prefer$(EXEEXT)'; \
+ b='cpp11/can_prefer_not_applicable_member_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_not_applicable_member_require.log: cpp11/can_prefer_not_applicable_member_require$(EXEEXT)
+ @p='cpp11/can_prefer_not_applicable_member_require$(EXEEXT)'; \
+ b='cpp11/can_prefer_not_applicable_member_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_not_applicable_static.log: cpp11/can_prefer_not_applicable_static$(EXEEXT)
+ @p='cpp11/can_prefer_not_applicable_static$(EXEEXT)'; \
+ b='cpp11/can_prefer_not_applicable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_not_applicable_unsupported.log: cpp11/can_prefer_not_applicable_unsupported$(EXEEXT)
+ @p='cpp11/can_prefer_not_applicable_unsupported$(EXEEXT)'; \
+ b='cpp11/can_prefer_not_applicable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_not_preferable_free_prefer.log: cpp11/can_prefer_not_preferable_free_prefer$(EXEEXT)
+ @p='cpp11/can_prefer_not_preferable_free_prefer$(EXEEXT)'; \
+ b='cpp11/can_prefer_not_preferable_free_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_not_preferable_free_require.log: cpp11/can_prefer_not_preferable_free_require$(EXEEXT)
+ @p='cpp11/can_prefer_not_preferable_free_require$(EXEEXT)'; \
+ b='cpp11/can_prefer_not_preferable_free_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_not_preferable_member_prefer.log: cpp11/can_prefer_not_preferable_member_prefer$(EXEEXT)
+ @p='cpp11/can_prefer_not_preferable_member_prefer$(EXEEXT)'; \
+ b='cpp11/can_prefer_not_preferable_member_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_not_preferable_member_require.log: cpp11/can_prefer_not_preferable_member_require$(EXEEXT)
+ @p='cpp11/can_prefer_not_preferable_member_require$(EXEEXT)'; \
+ b='cpp11/can_prefer_not_preferable_member_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_not_preferable_static.log: cpp11/can_prefer_not_preferable_static$(EXEEXT)
+ @p='cpp11/can_prefer_not_preferable_static$(EXEEXT)'; \
+ b='cpp11/can_prefer_not_preferable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp11/can_prefer_not_preferable_unsupported.log: cpp11/can_prefer_not_preferable_unsupported$(EXEEXT)
+ @p='cpp11/can_prefer_not_preferable_unsupported$(EXEEXT)'; \
+ b='cpp11/can_prefer_not_preferable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/query_free.log: cpp14/query_free$(EXEEXT)
+ @p='cpp14/query_free$(EXEEXT)'; \
+ b='cpp14/query_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/query_member.log: cpp14/query_member$(EXEEXT)
+ @p='cpp14/query_member$(EXEEXT)'; \
+ b='cpp14/query_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/query_static.log: cpp14/query_static$(EXEEXT)
+ @p='cpp14/query_static$(EXEEXT)'; \
+ b='cpp14/query_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_query_free.log: cpp14/can_query_free$(EXEEXT)
+ @p='cpp14/can_query_free$(EXEEXT)'; \
+ b='cpp14/can_query_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_query_member.log: cpp14/can_query_member$(EXEEXT)
+ @p='cpp14/can_query_member$(EXEEXT)'; \
+ b='cpp14/can_query_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_query_static.log: cpp14/can_query_static$(EXEEXT)
+ @p='cpp14/can_query_static$(EXEEXT)'; \
+ b='cpp14/can_query_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_query_unsupported.log: cpp14/can_query_unsupported$(EXEEXT)
+ @p='cpp14/can_query_unsupported$(EXEEXT)'; \
+ b='cpp14/can_query_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_query_not_applicable_free.log: cpp14/can_query_not_applicable_free$(EXEEXT)
+ @p='cpp14/can_query_not_applicable_free$(EXEEXT)'; \
+ b='cpp14/can_query_not_applicable_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_query_not_applicable_member.log: cpp14/can_query_not_applicable_member$(EXEEXT)
+ @p='cpp14/can_query_not_applicable_member$(EXEEXT)'; \
+ b='cpp14/can_query_not_applicable_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_query_not_applicable_static.log: cpp14/can_query_not_applicable_static$(EXEEXT)
+ @p='cpp14/can_query_not_applicable_static$(EXEEXT)'; \
+ b='cpp14/can_query_not_applicable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_query_not_applicable_unsupported.log: cpp14/can_query_not_applicable_unsupported$(EXEEXT)
+ @p='cpp14/can_query_not_applicable_unsupported$(EXEEXT)'; \
+ b='cpp14/can_query_not_applicable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/require_concept_free.log: cpp14/require_concept_free$(EXEEXT)
+ @p='cpp14/require_concept_free$(EXEEXT)'; \
+ b='cpp14/require_concept_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/require_concept_member.log: cpp14/require_concept_member$(EXEEXT)
+ @p='cpp14/require_concept_member$(EXEEXT)'; \
+ b='cpp14/require_concept_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/require_concept_static.log: cpp14/require_concept_static$(EXEEXT)
+ @p='cpp14/require_concept_static$(EXEEXT)'; \
+ b='cpp14/require_concept_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_concept_free.log: cpp14/can_require_concept_free$(EXEEXT)
+ @p='cpp14/can_require_concept_free$(EXEEXT)'; \
+ b='cpp14/can_require_concept_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_concept_member.log: cpp14/can_require_concept_member$(EXEEXT)
+ @p='cpp14/can_require_concept_member$(EXEEXT)'; \
+ b='cpp14/can_require_concept_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_concept_static.log: cpp14/can_require_concept_static$(EXEEXT)
+ @p='cpp14/can_require_concept_static$(EXEEXT)'; \
+ b='cpp14/can_require_concept_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_concept_unsupported.log: cpp14/can_require_concept_unsupported$(EXEEXT)
+ @p='cpp14/can_require_concept_unsupported$(EXEEXT)'; \
+ b='cpp14/can_require_concept_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_concept_not_applicable_free.log: cpp14/can_require_concept_not_applicable_free$(EXEEXT)
+ @p='cpp14/can_require_concept_not_applicable_free$(EXEEXT)'; \
+ b='cpp14/can_require_concept_not_applicable_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_concept_not_applicable_member.log: cpp14/can_require_concept_not_applicable_member$(EXEEXT)
+ @p='cpp14/can_require_concept_not_applicable_member$(EXEEXT)'; \
+ b='cpp14/can_require_concept_not_applicable_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_concept_not_applicable_static.log: cpp14/can_require_concept_not_applicable_static$(EXEEXT)
+ @p='cpp14/can_require_concept_not_applicable_static$(EXEEXT)'; \
+ b='cpp14/can_require_concept_not_applicable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_concept_not_applicable_unsupported.log: cpp14/can_require_concept_not_applicable_unsupported$(EXEEXT)
+ @p='cpp14/can_require_concept_not_applicable_unsupported$(EXEEXT)'; \
+ b='cpp14/can_require_concept_not_applicable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/require_free.log: cpp14/require_free$(EXEEXT)
+ @p='cpp14/require_free$(EXEEXT)'; \
+ b='cpp14/require_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/require_member.log: cpp14/require_member$(EXEEXT)
+ @p='cpp14/require_member$(EXEEXT)'; \
+ b='cpp14/require_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/require_static.log: cpp14/require_static$(EXEEXT)
+ @p='cpp14/require_static$(EXEEXT)'; \
+ b='cpp14/require_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_free.log: cpp14/can_require_free$(EXEEXT)
+ @p='cpp14/can_require_free$(EXEEXT)'; \
+ b='cpp14/can_require_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_member.log: cpp14/can_require_member$(EXEEXT)
+ @p='cpp14/can_require_member$(EXEEXT)'; \
+ b='cpp14/can_require_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_static.log: cpp14/can_require_static$(EXEEXT)
+ @p='cpp14/can_require_static$(EXEEXT)'; \
+ b='cpp14/can_require_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_unsupported.log: cpp14/can_require_unsupported$(EXEEXT)
+ @p='cpp14/can_require_unsupported$(EXEEXT)'; \
+ b='cpp14/can_require_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_not_applicable_free.log: cpp14/can_require_not_applicable_free$(EXEEXT)
+ @p='cpp14/can_require_not_applicable_free$(EXEEXT)'; \
+ b='cpp14/can_require_not_applicable_free'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_not_applicable_member.log: cpp14/can_require_not_applicable_member$(EXEEXT)
+ @p='cpp14/can_require_not_applicable_member$(EXEEXT)'; \
+ b='cpp14/can_require_not_applicable_member'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_not_applicable_static.log: cpp14/can_require_not_applicable_static$(EXEEXT)
+ @p='cpp14/can_require_not_applicable_static$(EXEEXT)'; \
+ b='cpp14/can_require_not_applicable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_require_not_applicable_unsupported.log: cpp14/can_require_not_applicable_unsupported$(EXEEXT)
+ @p='cpp14/can_require_not_applicable_unsupported$(EXEEXT)'; \
+ b='cpp14/can_require_not_applicable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/prefer_free_prefer.log: cpp14/prefer_free_prefer$(EXEEXT)
+ @p='cpp14/prefer_free_prefer$(EXEEXT)'; \
+ b='cpp14/prefer_free_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/prefer_member_prefer.log: cpp14/prefer_member_prefer$(EXEEXT)
+ @p='cpp14/prefer_member_prefer$(EXEEXT)'; \
+ b='cpp14/prefer_member_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/prefer_free_require.log: cpp14/prefer_free_require$(EXEEXT)
+ @p='cpp14/prefer_free_require$(EXEEXT)'; \
+ b='cpp14/prefer_free_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/prefer_member_require.log: cpp14/prefer_member_require$(EXEEXT)
+ @p='cpp14/prefer_member_require$(EXEEXT)'; \
+ b='cpp14/prefer_member_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/prefer_static.log: cpp14/prefer_static$(EXEEXT)
+ @p='cpp14/prefer_static$(EXEEXT)'; \
+ b='cpp14/prefer_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/prefer_unsupported.log: cpp14/prefer_unsupported$(EXEEXT)
+ @p='cpp14/prefer_unsupported$(EXEEXT)'; \
+ b='cpp14/prefer_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_free_prefer.log: cpp14/can_prefer_free_prefer$(EXEEXT)
+ @p='cpp14/can_prefer_free_prefer$(EXEEXT)'; \
+ b='cpp14/can_prefer_free_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_free_require.log: cpp14/can_prefer_free_require$(EXEEXT)
+ @p='cpp14/can_prefer_free_require$(EXEEXT)'; \
+ b='cpp14/can_prefer_free_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_member_prefer.log: cpp14/can_prefer_member_prefer$(EXEEXT)
+ @p='cpp14/can_prefer_member_prefer$(EXEEXT)'; \
+ b='cpp14/can_prefer_member_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_member_require.log: cpp14/can_prefer_member_require$(EXEEXT)
+ @p='cpp14/can_prefer_member_require$(EXEEXT)'; \
+ b='cpp14/can_prefer_member_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_static.log: cpp14/can_prefer_static$(EXEEXT)
+ @p='cpp14/can_prefer_static$(EXEEXT)'; \
+ b='cpp14/can_prefer_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_unsupported.log: cpp14/can_prefer_unsupported$(EXEEXT)
+ @p='cpp14/can_prefer_unsupported$(EXEEXT)'; \
+ b='cpp14/can_prefer_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_not_applicable_free_prefer.log: cpp14/can_prefer_not_applicable_free_prefer$(EXEEXT)
+ @p='cpp14/can_prefer_not_applicable_free_prefer$(EXEEXT)'; \
+ b='cpp14/can_prefer_not_applicable_free_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_not_applicable_free_require.log: cpp14/can_prefer_not_applicable_free_require$(EXEEXT)
+ @p='cpp14/can_prefer_not_applicable_free_require$(EXEEXT)'; \
+ b='cpp14/can_prefer_not_applicable_free_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_not_applicable_member_prefer.log: cpp14/can_prefer_not_applicable_member_prefer$(EXEEXT)
+ @p='cpp14/can_prefer_not_applicable_member_prefer$(EXEEXT)'; \
+ b='cpp14/can_prefer_not_applicable_member_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_not_applicable_member_require.log: cpp14/can_prefer_not_applicable_member_require$(EXEEXT)
+ @p='cpp14/can_prefer_not_applicable_member_require$(EXEEXT)'; \
+ b='cpp14/can_prefer_not_applicable_member_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_not_applicable_static.log: cpp14/can_prefer_not_applicable_static$(EXEEXT)
+ @p='cpp14/can_prefer_not_applicable_static$(EXEEXT)'; \
+ b='cpp14/can_prefer_not_applicable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_not_applicable_unsupported.log: cpp14/can_prefer_not_applicable_unsupported$(EXEEXT)
+ @p='cpp14/can_prefer_not_applicable_unsupported$(EXEEXT)'; \
+ b='cpp14/can_prefer_not_applicable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_not_preferable_free_prefer.log: cpp14/can_prefer_not_preferable_free_prefer$(EXEEXT)
+ @p='cpp14/can_prefer_not_preferable_free_prefer$(EXEEXT)'; \
+ b='cpp14/can_prefer_not_preferable_free_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_not_preferable_free_require.log: cpp14/can_prefer_not_preferable_free_require$(EXEEXT)
+ @p='cpp14/can_prefer_not_preferable_free_require$(EXEEXT)'; \
+ b='cpp14/can_prefer_not_preferable_free_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_not_preferable_member_prefer.log: cpp14/can_prefer_not_preferable_member_prefer$(EXEEXT)
+ @p='cpp14/can_prefer_not_preferable_member_prefer$(EXEEXT)'; \
+ b='cpp14/can_prefer_not_preferable_member_prefer'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_not_preferable_member_require.log: cpp14/can_prefer_not_preferable_member_require$(EXEEXT)
+ @p='cpp14/can_prefer_not_preferable_member_require$(EXEEXT)'; \
+ b='cpp14/can_prefer_not_preferable_member_require'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_not_preferable_static.log: cpp14/can_prefer_not_preferable_static$(EXEEXT)
+ @p='cpp14/can_prefer_not_preferable_static$(EXEEXT)'; \
+ b='cpp14/can_prefer_not_preferable_static'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+cpp14/can_prefer_not_preferable_unsupported.log: cpp14/can_prefer_not_preferable_unsupported$(EXEEXT)
+ @p='cpp14/can_prefer_not_preferable_unsupported$(EXEEXT)'; \
+ b='cpp14/can_prefer_not_preferable_unsupported'; \
+ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+.test.log:
+ @p='$<'; \
+ $(am__set_b); \
+ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+ --log-file $$b.log --trs-file $$b.trs \
+ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+ "$$tst" $(AM_TESTS_FD_REDIRECT)
+@am__EXEEXT_TRUE@.test$(EXEEXT).log:
+@am__EXEEXT_TRUE@ @p='$<'; \
+@am__EXEEXT_TRUE@ $(am__set_b); \
+@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \
+@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \
+@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \
+@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT)
+distdir: $(BUILT_SOURCES)
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
+
+distdir-am: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+ list='$(DISTFILES)'; \
+ dist_files=`for file in $$list; do echo $$file; done | \
+ sed -e "s|^$$srcdirstrip/||;t" \
+ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+ case $$dist_files in \
+ */*) $(MKDIR_P) `echo "$$dist_files" | \
+ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+ sort -u` ;; \
+ esac; \
+ for file in $$dist_files; do \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ if test -d $$d/$$file; then \
+ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test -d "$(distdir)/$$file"; then \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+ fi; \
+ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+ else \
+ test -f "$(distdir)/$$file" \
+ || cp -p $$d/$$file "$(distdir)/$$file" \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+ $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+ $(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile
+installdirs:
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+ if test -z '$(STRIP)'; then \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ install; \
+ else \
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+ fi
+mostlyclean-generic:
+ -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS)
+ -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs)
+ -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+ -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+ -rm -f cpp03/$(DEPDIR)/$(am__dirstamp)
+ -rm -f cpp03/$(am__dirstamp)
+ -rm -f cpp11/$(DEPDIR)/$(am__dirstamp)
+ -rm -f cpp11/$(am__dirstamp)
+ -rm -f cpp14/$(DEPDIR)/$(am__dirstamp)
+ -rm -f cpp14/$(am__dirstamp)
+
+maintainer-clean-generic:
+ @echo "This command is intended for maintainers to use"
+ @echo "it deletes files that may require special tools to rebuild."
+ -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic mostlyclean-am
+
+distclean: distclean-am
+ -rm -f cpp03/$(DEPDIR)/can_prefer_free_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_free_require.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_member_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_member_require.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_applicable_free_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_applicable_free_require.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_applicable_member_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_applicable_member_require.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_applicable_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_applicable_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_preferable_free_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_preferable_free_require.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_preferable_member_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_preferable_member_require.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_preferable_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_preferable_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_free.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_member.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_not_applicable_free.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_not_applicable_member.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_not_applicable_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_not_applicable_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_free.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_member.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_not_applicable_free.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_not_applicable_member.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_not_applicable_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_not_applicable_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_free.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_member.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_not_applicable_free.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_not_applicable_member.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_not_applicable_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_not_applicable_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/prefer_free_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/prefer_free_require.Po
+ -rm -f cpp03/$(DEPDIR)/prefer_member_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/prefer_member_require.Po
+ -rm -f cpp03/$(DEPDIR)/prefer_static.Po
+ -rm -f cpp03/$(DEPDIR)/prefer_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/query_free.Po
+ -rm -f cpp03/$(DEPDIR)/query_member.Po
+ -rm -f cpp03/$(DEPDIR)/query_static.Po
+ -rm -f cpp03/$(DEPDIR)/require_concept_free.Po
+ -rm -f cpp03/$(DEPDIR)/require_concept_member.Po
+ -rm -f cpp03/$(DEPDIR)/require_concept_static.Po
+ -rm -f cpp03/$(DEPDIR)/require_free.Po
+ -rm -f cpp03/$(DEPDIR)/require_member.Po
+ -rm -f cpp03/$(DEPDIR)/require_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_free_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_free_require.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_member_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_member_require.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_applicable_free_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_applicable_free_require.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_applicable_member_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_applicable_member_require.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_applicable_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_applicable_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_preferable_free_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_preferable_free_require.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_preferable_member_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_preferable_member_require.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_preferable_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_preferable_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_free.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_member.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_not_applicable_free.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_not_applicable_member.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_not_applicable_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_not_applicable_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_free.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_member.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_not_applicable_free.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_not_applicable_member.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_not_applicable_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_not_applicable_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_free.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_member.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_not_applicable_free.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_not_applicable_member.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_not_applicable_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_not_applicable_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/prefer_free_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/prefer_free_require.Po
+ -rm -f cpp11/$(DEPDIR)/prefer_member_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/prefer_member_require.Po
+ -rm -f cpp11/$(DEPDIR)/prefer_static.Po
+ -rm -f cpp11/$(DEPDIR)/prefer_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/query_free.Po
+ -rm -f cpp11/$(DEPDIR)/query_member.Po
+ -rm -f cpp11/$(DEPDIR)/query_static.Po
+ -rm -f cpp11/$(DEPDIR)/require_concept_free.Po
+ -rm -f cpp11/$(DEPDIR)/require_concept_member.Po
+ -rm -f cpp11/$(DEPDIR)/require_concept_static.Po
+ -rm -f cpp11/$(DEPDIR)/require_free.Po
+ -rm -f cpp11/$(DEPDIR)/require_member.Po
+ -rm -f cpp11/$(DEPDIR)/require_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_free_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_free_require.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_member_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_member_require.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_applicable_free_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_applicable_free_require.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_applicable_member_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_applicable_member_require.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_applicable_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_applicable_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_preferable_free_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_preferable_free_require.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_preferable_member_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_preferable_member_require.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_preferable_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_preferable_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_free.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_member.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_not_applicable_free.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_not_applicable_member.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_not_applicable_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_not_applicable_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_free.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_member.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_not_applicable_free.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_not_applicable_member.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_not_applicable_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_not_applicable_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_free.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_member.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_not_applicable_free.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_not_applicable_member.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_not_applicable_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_not_applicable_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/prefer_free_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/prefer_free_require.Po
+ -rm -f cpp14/$(DEPDIR)/prefer_member_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/prefer_member_require.Po
+ -rm -f cpp14/$(DEPDIR)/prefer_static.Po
+ -rm -f cpp14/$(DEPDIR)/prefer_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/query_free.Po
+ -rm -f cpp14/$(DEPDIR)/query_member.Po
+ -rm -f cpp14/$(DEPDIR)/query_static.Po
+ -rm -f cpp14/$(DEPDIR)/require_concept_free.Po
+ -rm -f cpp14/$(DEPDIR)/require_concept_member.Po
+ -rm -f cpp14/$(DEPDIR)/require_concept_static.Po
+ -rm -f cpp14/$(DEPDIR)/require_free.Po
+ -rm -f cpp14/$(DEPDIR)/require_member.Po
+ -rm -f cpp14/$(DEPDIR)/require_static.Po
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am:
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+ -rm -f cpp03/$(DEPDIR)/can_prefer_free_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_free_require.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_member_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_member_require.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_applicable_free_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_applicable_free_require.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_applicable_member_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_applicable_member_require.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_applicable_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_applicable_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_preferable_free_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_preferable_free_require.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_preferable_member_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_preferable_member_require.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_preferable_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_not_preferable_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_prefer_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_free.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_member.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_not_applicable_free.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_not_applicable_member.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_not_applicable_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_not_applicable_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_query_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_free.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_member.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_not_applicable_free.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_not_applicable_member.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_not_applicable_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_not_applicable_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_concept_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_free.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_member.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_not_applicable_free.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_not_applicable_member.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_not_applicable_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_not_applicable_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_static.Po
+ -rm -f cpp03/$(DEPDIR)/can_require_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/prefer_free_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/prefer_free_require.Po
+ -rm -f cpp03/$(DEPDIR)/prefer_member_prefer.Po
+ -rm -f cpp03/$(DEPDIR)/prefer_member_require.Po
+ -rm -f cpp03/$(DEPDIR)/prefer_static.Po
+ -rm -f cpp03/$(DEPDIR)/prefer_unsupported.Po
+ -rm -f cpp03/$(DEPDIR)/query_free.Po
+ -rm -f cpp03/$(DEPDIR)/query_member.Po
+ -rm -f cpp03/$(DEPDIR)/query_static.Po
+ -rm -f cpp03/$(DEPDIR)/require_concept_free.Po
+ -rm -f cpp03/$(DEPDIR)/require_concept_member.Po
+ -rm -f cpp03/$(DEPDIR)/require_concept_static.Po
+ -rm -f cpp03/$(DEPDIR)/require_free.Po
+ -rm -f cpp03/$(DEPDIR)/require_member.Po
+ -rm -f cpp03/$(DEPDIR)/require_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_free_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_free_require.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_member_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_member_require.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_applicable_free_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_applicable_free_require.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_applicable_member_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_applicable_member_require.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_applicable_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_applicable_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_preferable_free_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_preferable_free_require.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_preferable_member_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_preferable_member_require.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_preferable_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_not_preferable_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_prefer_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_free.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_member.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_not_applicable_free.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_not_applicable_member.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_not_applicable_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_not_applicable_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_query_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_free.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_member.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_not_applicable_free.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_not_applicable_member.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_not_applicable_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_not_applicable_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_concept_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_free.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_member.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_not_applicable_free.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_not_applicable_member.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_not_applicable_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_not_applicable_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_static.Po
+ -rm -f cpp11/$(DEPDIR)/can_require_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/prefer_free_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/prefer_free_require.Po
+ -rm -f cpp11/$(DEPDIR)/prefer_member_prefer.Po
+ -rm -f cpp11/$(DEPDIR)/prefer_member_require.Po
+ -rm -f cpp11/$(DEPDIR)/prefer_static.Po
+ -rm -f cpp11/$(DEPDIR)/prefer_unsupported.Po
+ -rm -f cpp11/$(DEPDIR)/query_free.Po
+ -rm -f cpp11/$(DEPDIR)/query_member.Po
+ -rm -f cpp11/$(DEPDIR)/query_static.Po
+ -rm -f cpp11/$(DEPDIR)/require_concept_free.Po
+ -rm -f cpp11/$(DEPDIR)/require_concept_member.Po
+ -rm -f cpp11/$(DEPDIR)/require_concept_static.Po
+ -rm -f cpp11/$(DEPDIR)/require_free.Po
+ -rm -f cpp11/$(DEPDIR)/require_member.Po
+ -rm -f cpp11/$(DEPDIR)/require_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_free_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_free_require.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_member_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_member_require.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_applicable_free_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_applicable_free_require.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_applicable_member_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_applicable_member_require.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_applicable_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_applicable_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_preferable_free_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_preferable_free_require.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_preferable_member_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_preferable_member_require.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_preferable_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_not_preferable_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_prefer_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_free.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_member.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_not_applicable_free.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_not_applicable_member.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_not_applicable_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_not_applicable_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_query_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_free.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_member.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_not_applicable_free.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_not_applicable_member.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_not_applicable_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_not_applicable_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_concept_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_free.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_member.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_not_applicable_free.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_not_applicable_member.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_not_applicable_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_not_applicable_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_static.Po
+ -rm -f cpp14/$(DEPDIR)/can_require_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/prefer_free_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/prefer_free_require.Po
+ -rm -f cpp14/$(DEPDIR)/prefer_member_prefer.Po
+ -rm -f cpp14/$(DEPDIR)/prefer_member_require.Po
+ -rm -f cpp14/$(DEPDIR)/prefer_static.Po
+ -rm -f cpp14/$(DEPDIR)/prefer_unsupported.Po
+ -rm -f cpp14/$(DEPDIR)/query_free.Po
+ -rm -f cpp14/$(DEPDIR)/query_member.Po
+ -rm -f cpp14/$(DEPDIR)/query_static.Po
+ -rm -f cpp14/$(DEPDIR)/require_concept_free.Po
+ -rm -f cpp14/$(DEPDIR)/require_concept_member.Po
+ -rm -f cpp14/$(DEPDIR)/require_concept_static.Po
+ -rm -f cpp14/$(DEPDIR)/require_free.Po
+ -rm -f cpp14/$(DEPDIR)/require_member.Po
+ -rm -f cpp14/$(DEPDIR)/require_static.Po
+ -rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am:
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \
+ check-am clean clean-checkPROGRAMS clean-generic cscopelist-am \
+ ctags ctags-am distclean distclean-compile distclean-generic \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-dvi \
+ install-dvi-am install-exec install-exec-am install-html \
+ install-html-am install-info install-info-am install-man \
+ install-pdf install-pdf-am install-ps install-ps-am \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
+ recheck tags tags-am uninstall uninstall-am
+
+.PRECIOUS: Makefile
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_free_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_free_prefer.cpp
new file mode 100644
index 00000000000..e9784f60661
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_free_prefer.cpp
@@ -0,0 +1,59 @@
+//
+// cpp03/can_prefer_free_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> prefer(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct prefer_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_prefer<object<1>, prop<2> >::value));
+ assert((asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_free_require.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_free_require.cpp
new file mode 100644
index 00000000000..693a46150d1
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_free_require.cpp
@@ -0,0 +1,59 @@
+//
+// cpp03/can_prefer_free_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_prefer<object<1>, prop<2> >::value));
+ assert((asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_member_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_member_prefer.cpp
new file mode 100644
index 00000000000..011a34764dc
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_member_prefer.cpp
@@ -0,0 +1,59 @@
+//
+// cpp03/can_prefer_member_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> prefer(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct prefer_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_prefer<object<1>, prop<2> >::value));
+ assert((asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_member_require.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_member_require.cpp
new file mode 100644
index 00000000000..9364391c935
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_member_require.cpp
@@ -0,0 +1,59 @@
+//
+// cpp03/can_prefer_member_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_prefer<object<1>, prop<2> >::value));
+ assert((asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_free_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_free_prefer.cpp
new file mode 100644
index 00000000000..8fd11c6f659
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_free_prefer.cpp
@@ -0,0 +1,52 @@
+//
+// cpp03/can_prefer_not_applicable_free_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> prefer(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+namespace traits {
+
+template<int N, int M>
+struct prefer_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_prefer<object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_free_require.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_free_require.cpp
new file mode 100644
index 00000000000..5c205ada2e7
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_free_require.cpp
@@ -0,0 +1,52 @@
+//
+// cpp03/can_prefer_not_applicable_free_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+namespace traits {
+
+template<int N, int M>
+struct require_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_prefer<object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_member_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_member_prefer.cpp
new file mode 100644
index 00000000000..15e93fd3a51
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_member_prefer.cpp
@@ -0,0 +1,52 @@
+//
+// cpp03/can_prefer_not_applicable_member_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> prefer(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+namespace traits {
+
+template<int N, int M>
+struct prefer_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_prefer<object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_member_require.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_member_require.cpp
new file mode 100644
index 00000000000..0a0f1f6ecf0
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_member_require.cpp
@@ -0,0 +1,52 @@
+//
+// cpp03/can_prefer_not_applicable_member_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+namespace traits {
+
+template<int N, int M>
+struct require_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_prefer<object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_static.cpp
new file mode 100644
index 00000000000..f564d2fae01
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_static.cpp
@@ -0,0 +1,45 @@
+//
+// cpp03/can_prefer_not_applicable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static const bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_prefer<object<1>, prop<1> >::value));
+ assert((!asio::can_prefer<object<1>, prop<1>, prop<1> >::value));
+ assert((!asio::can_prefer<object<1>, prop<1>, prop<1>, prop<1> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<1> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<1>, prop<1> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<1>, prop<1>, prop<1> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_unsupported.cpp
new file mode 100644
index 00000000000..0711d7c4a4d
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_applicable_unsupported.cpp
@@ -0,0 +1,33 @@
+//
+// cpp03/can_prefer_not_applicable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ assert((!asio::can_prefer<object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_free_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_free_prefer.cpp
new file mode 100644
index 00000000000..3a522e5bed4
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_free_prefer.cpp
@@ -0,0 +1,59 @@
+//
+// cpp03/can_prefer_not_preferable_free_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> prefer(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct prefer_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_prefer<object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_free_require.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_free_require.cpp
new file mode 100644
index 00000000000..39ea91fefcb
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_free_require.cpp
@@ -0,0 +1,59 @@
+//
+// cpp03/can_prefer_not_preferable_free_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_prefer<object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_member_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_member_prefer.cpp
new file mode 100644
index 00000000000..e61f89872d0
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_member_prefer.cpp
@@ -0,0 +1,59 @@
+//
+// cpp03/can_prefer_not_preferable_member_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> prefer(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct prefer_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_prefer<object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_member_require.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_member_require.cpp
new file mode 100644
index 00000000000..0052cc3ee50
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_member_require.cpp
@@ -0,0 +1,59 @@
+//
+// cpp03/can_prefer_not_preferable_member_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_prefer<object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_static.cpp
new file mode 100644
index 00000000000..f3428066587
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_static.cpp
@@ -0,0 +1,52 @@
+//
+// cpp03/can_prefer_not_preferable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static const bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_prefer<object<1>, prop<1> >::value));
+ assert((!asio::can_prefer<object<1>, prop<1>, prop<1> >::value));
+ assert((!asio::can_prefer<object<1>, prop<1>, prop<1>, prop<1> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<1> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<1>, prop<1> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<1>, prop<1>, prop<1> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_unsupported.cpp
new file mode 100644
index 00000000000..14695938c99
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_not_preferable_unsupported.cpp
@@ -0,0 +1,43 @@
+//
+// cpp03/can_prefer_not_preferable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_prefer<object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_static.cpp
new file mode 100644
index 00000000000..ac1f5c186aa
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_static.cpp
@@ -0,0 +1,52 @@
+//
+// cpp03/can_prefer_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static const bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_prefer<object<1>, prop<1> >::value));
+ assert((asio::can_prefer<object<1>, prop<1>, prop<1> >::value));
+ assert((asio::can_prefer<object<1>, prop<1>, prop<1>, prop<1> >::value));
+ assert((asio::can_prefer<const object<1>, prop<1> >::value));
+ assert((asio::can_prefer<const object<1>, prop<1>, prop<1> >::value));
+ assert((asio::can_prefer<const object<1>, prop<1>, prop<1>, prop<1> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_prefer_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_unsupported.cpp
new file mode 100644
index 00000000000..e59e5d098f8
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_prefer_unsupported.cpp
@@ -0,0 +1,43 @@
+//
+// cpp03/can_prefer_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_prefer<object<1>, prop<2> >::value));
+ assert((asio::can_prefer<object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_query_free.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_query_free.cpp
new file mode 100644
index 00000000000..d0d42fe7bdd
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_query_free.cpp
@@ -0,0 +1,48 @@
+//
+// cpp03/can_query_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ friend int query(const object&, prop) { return 123; }
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<>
+struct query_free<object, prop>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef int result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_query<object, prop>::value));
+ assert((asio::can_query<const object, prop>::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_query_member.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_query_member.cpp
new file mode 100644
index 00000000000..9ead9be9751
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_query_member.cpp
@@ -0,0 +1,48 @@
+//
+// cpp03/can_query_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ int query(prop) const { return 123; }
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<>
+struct query_member<object, prop>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef int result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_query<object, prop>::value));
+ assert((asio::can_query<const object, prop>::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_free.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_free.cpp
new file mode 100644
index 00000000000..b360327c132
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_free.cpp
@@ -0,0 +1,41 @@
+//
+// cpp03/can_query_not_applicable_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ friend int query(const object&, prop) { return 123; }
+};
+
+namespace asio {
+namespace traits {
+
+template<>
+struct query_free<object, prop>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef int result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_query<object, prop>::value));
+ assert((!asio::can_query<const object, prop>::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_member.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_member.cpp
new file mode 100644
index 00000000000..be339d05522
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_member.cpp
@@ -0,0 +1,41 @@
+//
+// cpp03/can_query_not_applicable_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ int query(prop) const { return 123; }
+};
+
+namespace asio {
+namespace traits {
+
+template<>
+struct query_member<object, prop>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef int result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_query<object, prop>::value));
+ assert((!asio::can_query<const object, prop>::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_static.cpp
new file mode 100644
index 00000000000..127e2ace42e
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_static.cpp
@@ -0,0 +1,41 @@
+//
+// cpp03/can_query_not_applicable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+};
+
+namespace asio {
+namespace traits {
+
+template<>
+struct static_query<object, prop>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef int result_type;
+ static int value() { return 123; }
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_query<object, prop>::value));
+ assert((!asio::can_query<const object, prop>::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_unsupported.cpp
new file mode 100644
index 00000000000..ec1c07affc1
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_query_not_applicable_unsupported.cpp
@@ -0,0 +1,26 @@
+//
+// cpp03/can_query_not_applicable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+};
+
+int main()
+{
+ assert((!asio::can_query<object, prop>::value));
+ assert((!asio::can_query<const object, prop>::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_query_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_query_static.cpp
new file mode 100644
index 00000000000..9a305712f1d
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_query_static.cpp
@@ -0,0 +1,48 @@
+//
+// cpp03/can_query_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<>
+struct static_query<object, prop>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef int result_type;
+ static int value() { return 123; }
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_query<object, prop>::value));
+ assert((asio::can_query<const object, prop>::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_query_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_query_unsupported.cpp
new file mode 100644
index 00000000000..8eefbe9bd14
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_query_unsupported.cpp
@@ -0,0 +1,36 @@
+//
+// cpp03/can_query_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+};
+
+namespace asio {
+
+template <>
+struct is_applicable_property<object, prop>
+{
+ static const bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_query<object, prop>::value));
+ assert((!asio::can_query<const object, prop>::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_free.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_free.cpp
new file mode 100644
index 00000000000..810dfc240a2
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_free.cpp
@@ -0,0 +1,55 @@
+//
+// cpp03/can_require_concept_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> require_concept(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_concept_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_require_concept<object<1>, prop<2> >::value));
+ assert((asio::can_require_concept<const object<1>, prop<2> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_member.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_member.cpp
new file mode 100644
index 00000000000..615e8a09cd7
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_member.cpp
@@ -0,0 +1,55 @@
+//
+// cpp03/can_require_concept_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> require_concept(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_concept_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_require_concept<object<1>, prop<2> >::value));
+ assert((asio::can_require_concept<const object<1>, prop<2> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_free.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_free.cpp
new file mode 100644
index 00000000000..c076dd416cd
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_free.cpp
@@ -0,0 +1,48 @@
+//
+// cpp03/can_require_concept_not_applicable_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> require_concept(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+namespace traits {
+
+template<int N, int M>
+struct require_concept_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_require_concept<object<1>, prop<2> >::value));
+ assert((!asio::can_require_concept<const object<1>, prop<2> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_member.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_member.cpp
new file mode 100644
index 00000000000..e6e258e8424
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_member.cpp
@@ -0,0 +1,48 @@
+//
+// cpp03/can_require_concept_not_applicable_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> require_concept(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+namespace traits {
+
+template<int N, int M>
+struct require_concept_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_require_concept<object<1>, prop<2> >::value));
+ assert((!asio::can_require_concept<const object<1>, prop<2> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_static.cpp
new file mode 100644
index 00000000000..c42a1b3fca4
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_static.cpp
@@ -0,0 +1,41 @@
+//
+// cpp03/can_require_concept_not_applicable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+namespace traits {
+
+template<int N>
+struct static_require_concept<object<N>, prop<N> >
+{
+ static const bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_require_concept<object<1>, prop<2> >::value));
+ assert((!asio::can_require_concept<const object<1>, prop<2> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_unsupported.cpp
new file mode 100644
index 00000000000..261c4be3728
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_not_applicable_unsupported.cpp
@@ -0,0 +1,28 @@
+//
+// cpp03/can_require_concept_not_applicable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ assert((!asio::can_require_concept<object<1>, prop<2> >::value));
+ assert((!asio::can_require_concept<const object<1>, prop<2> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_static.cpp
new file mode 100644
index 00000000000..3c7d7bf4508
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_static.cpp
@@ -0,0 +1,48 @@
+//
+// cpp03/can_require_concept_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require_concept<object<N>, prop<N> >
+{
+ static const bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_require_concept<object<1>, prop<1> >::value));
+ assert((asio::can_require_concept<const object<1>, prop<1> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_unsupported.cpp
new file mode 100644
index 00000000000..0fbcbd36525
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_concept_unsupported.cpp
@@ -0,0 +1,38 @@
+//
+// cpp03/can_require_concept_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_require_concept<object<1>, prop<2> >::value));
+ assert((!asio::can_require_concept<const object<1>, prop<2> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_free.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_free.cpp
new file mode 100644
index 00000000000..fdd9241efa0
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_free.cpp
@@ -0,0 +1,59 @@
+//
+// cpp03/can_require_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_require<object<1>, prop<2> >::value));
+ assert((asio::can_require<object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_require<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((asio::can_require<const object<1>, prop<2> >::value));
+ assert((asio::can_require<const object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_require<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_member.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_member.cpp
new file mode 100644
index 00000000000..3f9a427333a
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_member.cpp
@@ -0,0 +1,59 @@
+//
+// cpp03/can_require_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_require<object<1>, prop<2> >::value));
+ assert((asio::can_require<object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_require<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((asio::can_require<const object<1>, prop<2> >::value));
+ assert((asio::can_require<const object<1>, prop<2>, prop<3> >::value));
+ assert((asio::can_require<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_free.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_free.cpp
new file mode 100644
index 00000000000..4bf8ca32a2c
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_free.cpp
@@ -0,0 +1,52 @@
+//
+// cpp03/can_require_not_applicable_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+namespace traits {
+
+template<int N, int M>
+struct require_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_require<object<1>, prop<2> >::value));
+ assert((!asio::can_require<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_require<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_require<const object<1>, prop<2> >::value));
+ assert((!asio::can_require<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_require<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_member.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_member.cpp
new file mode 100644
index 00000000000..842c8d4bee9
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_member.cpp
@@ -0,0 +1,52 @@
+//
+// cpp03/can_require_not_applicable_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+namespace traits {
+
+template<int N, int M>
+struct require_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_require<object<1>, prop<2> >::value));
+ assert((!asio::can_require<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_require<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_require<const object<1>, prop<2> >::value));
+ assert((!asio::can_require<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_require<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_static.cpp
new file mode 100644
index 00000000000..e8d9ac63aa2
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_static.cpp
@@ -0,0 +1,45 @@
+//
+// cpp03/can_require_not_applicable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static const bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_require<object<1>, prop<1> >::value));
+ assert((!asio::can_require<object<1>, prop<1>, prop<1> >::value));
+ assert((!asio::can_require<object<1>, prop<1>, prop<1>, prop<1> >::value));
+ assert((!asio::can_require<const object<1>, prop<1> >::value));
+ assert((!asio::can_require<const object<1>, prop<1>, prop<1> >::value));
+ assert((!asio::can_require<const object<1>, prop<1>, prop<1>, prop<1> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_unsupported.cpp
new file mode 100644
index 00000000000..6fe234731dc
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_not_applicable_unsupported.cpp
@@ -0,0 +1,32 @@
+//
+// cpp03/can_require_not_applicable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ assert((!asio::can_require<object<1>, prop<2> >::value));
+ assert((!asio::can_require<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_require<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_require<const object<1>, prop<2> >::value));
+ assert((!asio::can_require<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_require<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_static.cpp
new file mode 100644
index 00000000000..5d4a65749b2
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_static.cpp
@@ -0,0 +1,52 @@
+//
+// cpp03/can_require_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static const bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ assert((asio::can_require<object<1>, prop<1> >::value));
+ assert((asio::can_require<object<1>, prop<1>, prop<1> >::value));
+ assert((asio::can_require<object<1>, prop<1>, prop<1>, prop<1> >::value));
+ assert((asio::can_require<const object<1>, prop<1> >::value));
+ assert((asio::can_require<const object<1>, prop<1>, prop<1> >::value));
+ assert((asio::can_require<const object<1>, prop<1>, prop<1>, prop<1> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/can_require_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp03/can_require_unsupported.cpp
new file mode 100644
index 00000000000..f3bf74b0499
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/can_require_unsupported.cpp
@@ -0,0 +1,42 @@
+//
+// cpp03/can_require_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ assert((!asio::can_require<object<1>, prop<2> >::value));
+ assert((!asio::can_require<object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_require<object<1>, prop<2>, prop<3>, prop<4> >::value));
+ assert((!asio::can_require<const object<1>, prop<2> >::value));
+ assert((!asio::can_require<const object<1>, prop<2>, prop<3> >::value));
+ assert((!asio::can_require<const object<1>, prop<2>, prop<3>, prop<4> >::value));
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/prefer_free_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp03/prefer_free_prefer.cpp
new file mode 100644
index 00000000000..dcf89c7f4af
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/prefer_free_prefer.cpp
@@ -0,0 +1,68 @@
+//
+// cpp03/prefer_free_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> prefer(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct prefer_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::prefer(o1, prop<2>());
+ object<3> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::prefer(o5, prop<2>());
+ object<3> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/prefer_free_require.cpp b/3rdparty/asio/src/tests/properties/cpp03/prefer_free_require.cpp
new file mode 100644
index 00000000000..223d3a60921
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/prefer_free_require.cpp
@@ -0,0 +1,68 @@
+//
+// cpp03/prefer_free_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::prefer(o1, prop<2>());
+ object<3> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::prefer(o5, prop<2>());
+ object<3> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/prefer_member_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp03/prefer_member_prefer.cpp
new file mode 100644
index 00000000000..538f7b2662a
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/prefer_member_prefer.cpp
@@ -0,0 +1,68 @@
+//
+// cpp03/prefer_member_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> prefer(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct prefer_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::prefer(o1, prop<2>());
+ object<3> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::prefer(o5, prop<2>());
+ object<3> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/prefer_member_require.cpp b/3rdparty/asio/src/tests/properties/cpp03/prefer_member_require.cpp
new file mode 100644
index 00000000000..f659b6fc2bd
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/prefer_member_require.cpp
@@ -0,0 +1,68 @@
+//
+// cpp03/prefer_member_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::prefer(o1, prop<2>());
+ object<3> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::prefer(o5, prop<2>());
+ object<3> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/prefer_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/prefer_static.cpp
new file mode 100644
index 00000000000..f5fcb7f89a0
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/prefer_static.cpp
@@ -0,0 +1,61 @@
+//
+// cpp03/prefer_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static const bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<1> o2 = asio::prefer(o1, prop<1>());
+ object<1> o3 = asio::prefer(o1, prop<1>(), prop<1>());
+ object<1> o4 = asio::prefer(o1, prop<1>(), prop<1>(), prop<1>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<1> o6 = asio::prefer(o5, prop<1>());
+ object<1> o7 = asio::prefer(o5, prop<1>(), prop<1>());
+ object<1> o8 = asio::prefer(o5, prop<1>(), prop<1>(), prop<1>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/prefer_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp03/prefer_unsupported.cpp
new file mode 100644
index 00000000000..25e0f308a4a
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/prefer_unsupported.cpp
@@ -0,0 +1,46 @@
+//
+// cpp03/prefer_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ const object<1>& o2 = asio::prefer(o1, prop<1>());
+ assert(&o1 == &o2);
+ (void)o2;
+
+ const object<1> o3 = {};
+ const object<1>& o4 = asio::prefer(o3, prop<1>());
+ assert(&o3 == &o4);
+ (void)o4;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/query_free.cpp b/3rdparty/asio/src/tests/properties/cpp03/query_free.cpp
new file mode 100644
index 00000000000..a9aae563293
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/query_free.cpp
@@ -0,0 +1,55 @@
+//
+// cpp03/query_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ friend int query(const object&, prop) { return 123; }
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<>
+struct query_free<object, prop>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef int result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object o1 = {};
+ int result1 = asio::query(o1, prop());
+ assert(result1 == 123);
+ (void)result1;
+
+ const object o2 = {};
+ int result2 = asio::query(o2, prop());
+ assert(result2 == 123);
+ (void)result2;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/query_member.cpp b/3rdparty/asio/src/tests/properties/cpp03/query_member.cpp
new file mode 100644
index 00000000000..a1ab83e0200
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/query_member.cpp
@@ -0,0 +1,55 @@
+//
+// cpp03/query_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ int query(prop) const { return 123; }
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<>
+struct query_member<object, prop>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef int result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object o1 = {};
+ int result1 = asio::query(o1, prop());
+ assert(result1 == 123);
+ (void)result1;
+
+ const object o2 = {};
+ int result2 = asio::query(o2, prop());
+ assert(result2 == 123);
+ (void)result2;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/query_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/query_static.cpp
new file mode 100644
index 00000000000..b0e0b4040e4
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/query_static.cpp
@@ -0,0 +1,55 @@
+//
+// cpp03/query_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<>
+struct static_query<object, prop>
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef int result_type;
+ static int value() { return 123; }
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object o1 = {};
+ int result1 = asio::query(o1, prop());
+ assert(result1 == 123);
+ (void)result1;
+
+ const object o2 = {};
+ int result2 = asio::query(o2, prop());
+ assert(result2 == 123);
+ (void)result2;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/require_concept_free.cpp b/3rdparty/asio/src/tests/properties/cpp03/require_concept_free.cpp
new file mode 100644
index 00000000000..6cccdd2774e
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/require_concept_free.cpp
@@ -0,0 +1,60 @@
+//
+// cpp03/require_concept_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> require_concept(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_concept_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::require_concept(o1, prop<2>());
+ (void)o2;
+
+ const object<1> o3 = {};
+ object<2> o4 = asio::require_concept(o3, prop<2>());
+ (void)o4;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/require_concept_member.cpp b/3rdparty/asio/src/tests/properties/cpp03/require_concept_member.cpp
new file mode 100644
index 00000000000..673493292be
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/require_concept_member.cpp
@@ -0,0 +1,60 @@
+//
+// cpp03/require_concept_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> require_concept(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_concept_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::require_concept(o1, prop<2>());
+ (void)o2;
+
+ const object<1> o3 = {};
+ object<2> o4 = asio::require_concept(o3, prop<2>());
+ (void)o4;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/require_concept_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/require_concept_static.cpp
new file mode 100644
index 00000000000..e92ffa1ef61
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/require_concept_static.cpp
@@ -0,0 +1,55 @@
+//
+// cpp03/require_concept_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require_concept<object<N>, prop<N> >
+{
+ static const bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ const object<1>& o2 = asio::require_concept(o1, prop<1>());
+ assert(&o1 == &o2);
+ (void)o2;
+
+ const object<1> o3 = {};
+ const object<1>& o4 = asio::require_concept(o3, prop<1>());
+ assert(&o3 == &o4);
+ (void)o4;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/require_free.cpp b/3rdparty/asio/src/tests/properties/cpp03/require_free.cpp
new file mode 100644
index 00000000000..04734ac3192
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/require_free.cpp
@@ -0,0 +1,68 @@
+//
+// cpp03/require_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_free<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::require(o1, prop<2>());
+ object<3> o3 = asio::require(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::require(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::require(o5, prop<2>());
+ object<3> o7 = asio::require(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::require(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/require_member.cpp b/3rdparty/asio/src/tests/properties/cpp03/require_member.cpp
new file mode 100644
index 00000000000..fc6bdc2c9c9
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/require_member.cpp
@@ -0,0 +1,68 @@
+//
+// cpp03/require_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N, int M>
+struct require_member<object<N>, prop<M> >
+{
+ static const bool is_valid = true;
+ static const bool is_noexcept = true;
+ typedef object<M> result_type;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::require(o1, prop<2>());
+ object<3> o3 = asio::require(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::require(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::require(o5, prop<2>());
+ object<3> o7 = asio::require(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::require(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp03/require_static.cpp b/3rdparty/asio/src/tests/properties/cpp03/require_static.cpp
new file mode 100644
index 00000000000..33512b32924
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp03/require_static.cpp
@@ -0,0 +1,61 @@
+//
+// cpp03/require_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static const bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static const bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static const bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<1> o2 = asio::require(o1, prop<1>());
+ object<1> o3 = asio::require(o1, prop<1>(), prop<1>());
+ object<1> o4 = asio::require(o1, prop<1>(), prop<1>(), prop<1>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<1> o6 = asio::require(o5, prop<1>());
+ object<1> o7 = asio::require(o5, prop<1>(), prop<1>());
+ object<1> o8 = asio::require(o5, prop<1>(), prop<1>(), prop<1>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_free_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_free_prefer.cpp
new file mode 100644
index 00000000000..860fa6fad5b
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_free_prefer.cpp
@@ -0,0 +1,48 @@
+//
+// cpp11/can_prefer_free_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> prefer(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_free_require.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_free_require.cpp
new file mode 100644
index 00000000000..b842e9aa4e9
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_free_require.cpp
@@ -0,0 +1,48 @@
+//
+// cpp11/can_prefer_free_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_member_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_member_prefer.cpp
new file mode 100644
index 00000000000..9f00cbcaf38
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_member_prefer.cpp
@@ -0,0 +1,48 @@
+//
+// cpp11/can_prefer_member_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> prefer(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_member_require.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_member_require.cpp
new file mode 100644
index 00000000000..a81bae1ae1c
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_member_require.cpp
@@ -0,0 +1,48 @@
+//
+// cpp11/can_prefer_member_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_free_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_free_prefer.cpp
new file mode 100644
index 00000000000..9079c1fc832
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_free_prefer.cpp
@@ -0,0 +1,38 @@
+//
+// cpp11/can_prefer_not_applicable_free_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> prefer(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_free_require.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_free_require.cpp
new file mode 100644
index 00000000000..52fc618ac97
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_free_require.cpp
@@ -0,0 +1,38 @@
+//
+// cpp11/can_prefer_not_applicable_free_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_member_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_member_prefer.cpp
new file mode 100644
index 00000000000..93f0c85c934
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_member_prefer.cpp
@@ -0,0 +1,38 @@
+//
+// cpp11/can_prefer_not_applicable_member_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> prefer(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_member_require.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_member_require.cpp
new file mode 100644
index 00000000000..e17ec93f80a
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_member_require.cpp
@@ -0,0 +1,38 @@
+//
+// cpp11/can_prefer_not_applicable_member_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_static.cpp
new file mode 100644
index 00000000000..9087ed42332
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_static.cpp
@@ -0,0 +1,45 @@
+//
+// cpp11/can_prefer_not_applicable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static constexpr bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_prefer<object<1>, prop<1>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<1>, prop<1>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<1>, prop<1>, prop<1>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<1>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<1>, prop<1>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<1>, prop<1>, prop<1>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_unsupported.cpp
new file mode 100644
index 00000000000..b09d15708a1
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_applicable_unsupported.cpp
@@ -0,0 +1,33 @@
+//
+// cpp11/can_prefer_not_applicable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_free_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_free_prefer.cpp
new file mode 100644
index 00000000000..28a1d151b2d
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_free_prefer.cpp
@@ -0,0 +1,48 @@
+//
+// cpp11/can_prefer_not_preferable_free_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> prefer(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_free_require.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_free_require.cpp
new file mode 100644
index 00000000000..cbb105416a4
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_free_require.cpp
@@ -0,0 +1,48 @@
+//
+// cpp11/can_prefer_not_preferable_free_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_member_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_member_prefer.cpp
new file mode 100644
index 00000000000..2d460503b79
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_member_prefer.cpp
@@ -0,0 +1,48 @@
+//
+// cpp11/can_prefer_not_preferable_member_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> prefer(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_member_require.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_member_require.cpp
new file mode 100644
index 00000000000..4e03c02d895
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_member_require.cpp
@@ -0,0 +1,48 @@
+//
+// cpp11/can_prefer_not_preferable_member_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_static.cpp
new file mode 100644
index 00000000000..0791d8a02f5
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_static.cpp
@@ -0,0 +1,43 @@
+//
+// cpp11/can_prefer_not_preferable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_prefer<object<1>, prop<1>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<1>, prop<1>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<1>, prop<1>, prop<1>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<1>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<1>, prop<1>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<1>, prop<1>, prop<1>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_unsupported.cpp
new file mode 100644
index 00000000000..059944ece37
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_not_preferable_unsupported.cpp
@@ -0,0 +1,43 @@
+//
+// cpp11/can_prefer_not_preferable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_static.cpp
new file mode 100644
index 00000000000..c928f7ffd63
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_static.cpp
@@ -0,0 +1,52 @@
+//
+// cpp11/can_prefer_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static constexpr bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_prefer<object<1>, prop<1>>::value, "");
+ static_assert(asio::can_prefer<object<1>, prop<1>, prop<1>>::value, "");
+ static_assert(asio::can_prefer<object<1>, prop<1>, prop<1>, prop<1>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<1>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<1>, prop<1>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<1>, prop<1>, prop<1>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_prefer_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_unsupported.cpp
new file mode 100644
index 00000000000..32d6ac5c0d3
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_prefer_unsupported.cpp
@@ -0,0 +1,43 @@
+//
+// cpp11/can_prefer_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_prefer<object<1>, prop<2>>::value, "");
+ static_assert(asio::can_prefer<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_prefer<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_prefer<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_query_free.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_query_free.cpp
new file mode 100644
index 00000000000..330493ba328
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_query_free.cpp
@@ -0,0 +1,37 @@
+//
+// cpp11/can_query_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ friend constexpr int query(const object&, prop) { return 123; }
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_query<object, prop>::value, "");
+ static_assert(asio::can_query<const object, prop>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_query_member.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_query_member.cpp
new file mode 100644
index 00000000000..e1442d9f296
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_query_member.cpp
@@ -0,0 +1,37 @@
+//
+// cpp11/can_query_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ constexpr int query(prop) const { return 123; }
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_query<object, prop>::value, "");
+ static_assert(asio::can_query<const object, prop>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_free.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_free.cpp
new file mode 100644
index 00000000000..2be49af0c64
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_free.cpp
@@ -0,0 +1,27 @@
+//
+// cpp11/can_query_not_applicable_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ friend constexpr int query(const object&, prop) { return 123; }
+};
+
+int main()
+{
+ static_assert(!asio::can_query<object, prop>::value, "");
+ static_assert(!asio::can_query<const object, prop>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_member.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_member.cpp
new file mode 100644
index 00000000000..788148df4a9
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_member.cpp
@@ -0,0 +1,27 @@
+//
+// cpp11/can_query_not_applicable_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ constexpr int query(prop) const { return 123; }
+};
+
+int main()
+{
+ static_assert(!asio::can_query<object, prop>::value, "");
+ static_assert(!asio::can_query<const object, prop>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_static.cpp
new file mode 100644
index 00000000000..c57848c7a9f
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_static.cpp
@@ -0,0 +1,41 @@
+//
+// cpp11/can_query_not_applicable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+};
+
+namespace asio {
+namespace traits {
+
+template<>
+struct static_query<object, prop>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef int result_type;
+ static constexpr int value() { return 123; }
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_query<object, prop>::value, "");
+ static_assert(!asio::can_query<const object, prop>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_unsupported.cpp
new file mode 100644
index 00000000000..79bff6231ab
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_query_not_applicable_unsupported.cpp
@@ -0,0 +1,26 @@
+//
+// cpp11/can_query_not_applicable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_query<object, prop>::value, "");
+ static_assert(!asio::can_query<const object, prop>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_query_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_query_static.cpp
new file mode 100644
index 00000000000..6dc25819a43
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_query_static.cpp
@@ -0,0 +1,48 @@
+//
+// cpp11/can_query_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static constexpr bool value = true;
+};
+
+namespace traits {
+
+template<>
+struct static_query<object, prop>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef int result_type;
+ static constexpr int value() { return 123; }
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_query<object, prop>::value, "");
+ static_assert(asio::can_query<const object, prop>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_query_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_query_unsupported.cpp
new file mode 100644
index 00000000000..369955e474a
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_query_unsupported.cpp
@@ -0,0 +1,36 @@
+//
+// cpp11/can_query_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_query<object, prop>::value, "");
+ static_assert(!asio::can_query<const object, prop>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_free.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_free.cpp
new file mode 100644
index 00000000000..3dd617097a2
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_free.cpp
@@ -0,0 +1,44 @@
+//
+// cpp11/can_require_concept_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require_concept(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_require_concept<object<1>, prop<2>>::value, "");
+ static_assert(asio::can_require_concept<const object<1>, prop<2>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_member.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_member.cpp
new file mode 100644
index 00000000000..55ac468247b
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_member.cpp
@@ -0,0 +1,44 @@
+//
+// cpp11/can_require_concept_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require_concept(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_require_concept<object<1>, prop<2>>::value, "");
+ static_assert(asio::can_require_concept<const object<1>, prop<2>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_free.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_free.cpp
new file mode 100644
index 00000000000..af40b48bdec
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_free.cpp
@@ -0,0 +1,34 @@
+//
+// cpp11/can_require_concept_not_applicable_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require_concept(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_require_concept<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require_concept<const object<1>, prop<2>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_member.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_member.cpp
new file mode 100644
index 00000000000..baf6b9f482f
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_member.cpp
@@ -0,0 +1,34 @@
+//
+// cpp11/can_require_concept_not_applicable_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require_concept(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_require_concept<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require_concept<const object<1>, prop<2>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_static.cpp
new file mode 100644
index 00000000000..7d7f13876d8
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_static.cpp
@@ -0,0 +1,41 @@
+//
+// cpp11/can_require_concept_not_applicable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+namespace traits {
+
+template<int N>
+struct static_require_concept<object<N>, prop<N> >
+{
+ static constexpr bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_require_concept<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require_concept<const object<1>, prop<2>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_unsupported.cpp
new file mode 100644
index 00000000000..13e05b231b5
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_not_applicable_unsupported.cpp
@@ -0,0 +1,28 @@
+//
+// cpp11/can_require_concept_not_applicable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_require_concept<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require_concept<const object<1>, prop<2>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_static.cpp
new file mode 100644
index 00000000000..07973a5bd14
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_static.cpp
@@ -0,0 +1,48 @@
+//
+// cpp11/can_require_concept_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require_concept<object<N>, prop<N> >
+{
+ static constexpr bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_require_concept<object<1>, prop<1>>::value, "");
+ static_assert(asio::can_require_concept<const object<1>, prop<1>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_unsupported.cpp
new file mode 100644
index 00000000000..4a4fee1f705
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_concept_unsupported.cpp
@@ -0,0 +1,38 @@
+//
+// cpp11/can_require_concept_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_require_concept<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require_concept<const object<1>, prop<2>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_free.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_free.cpp
new file mode 100644
index 00000000000..b66965e60e1
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_free.cpp
@@ -0,0 +1,48 @@
+//
+// cpp11/can_require_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_require<object<1>, prop<2>>::value, "");
+ static_assert(asio::can_require<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_require<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(asio::can_require<const object<1>, prop<2>>::value, "");
+ static_assert(asio::can_require<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_require<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_member.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_member.cpp
new file mode 100644
index 00000000000..cac464174f1
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_member.cpp
@@ -0,0 +1,48 @@
+//
+// cpp11/can_require_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_require<object<1>, prop<2>>::value, "");
+ static_assert(asio::can_require<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_require<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(asio::can_require<const object<1>, prop<2>>::value, "");
+ static_assert(asio::can_require<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(asio::can_require<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_free.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_free.cpp
new file mode 100644
index 00000000000..9705b87b244
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_free.cpp
@@ -0,0 +1,38 @@
+//
+// cpp11/can_require_not_applicable_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_require<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_require<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_member.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_member.cpp
new file mode 100644
index 00000000000..cd7f75fef34
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_member.cpp
@@ -0,0 +1,38 @@
+//
+// cpp11/can_require_not_applicable_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_require<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_require<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_static.cpp
new file mode 100644
index 00000000000..f852e451513
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_static.cpp
@@ -0,0 +1,45 @@
+//
+// cpp11/can_require_not_applicable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static constexpr bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_require<object<1>, prop<1>>::value, "");
+ static_assert(!asio::can_require<object<1>, prop<1>, prop<1>>::value, "");
+ static_assert(!asio::can_require<object<1>, prop<1>, prop<1>, prop<1>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<1>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<1>, prop<1>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<1>, prop<1>, prop<1>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_unsupported.cpp
new file mode 100644
index 00000000000..e6286aba02c
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_not_applicable_unsupported.cpp
@@ -0,0 +1,32 @@
+//
+// cpp11/can_require_not_applicable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_require<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_require<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_static.cpp
new file mode 100644
index 00000000000..4c1b38fc2c0
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_static.cpp
@@ -0,0 +1,52 @@
+//
+// cpp11/can_require_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static constexpr bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ static_assert(asio::can_require<object<1>, prop<1>>::value, "");
+ static_assert(asio::can_require<object<1>, prop<1>, prop<1>>::value, "");
+ static_assert(asio::can_require<object<1>, prop<1>, prop<1>, prop<1>>::value, "");
+ static_assert(asio::can_require<const object<1>, prop<1>>::value, "");
+ static_assert(asio::can_require<const object<1>, prop<1>, prop<1>>::value, "");
+ static_assert(asio::can_require<const object<1>, prop<1>, prop<1>, prop<1>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/can_require_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp11/can_require_unsupported.cpp
new file mode 100644
index 00000000000..bc9c4ed2072
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/can_require_unsupported.cpp
@@ -0,0 +1,42 @@
+//
+// cpp11/can_require_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_require<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require<object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_require<object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<2>, prop<3>>::value, "");
+ static_assert(!asio::can_require<const object<1>, prop<2>, prop<3>, prop<4>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/prefer_free_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp11/prefer_free_prefer.cpp
new file mode 100644
index 00000000000..3faf0019399
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/prefer_free_prefer.cpp
@@ -0,0 +1,64 @@
+//
+// cpp11/prefer_free_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> prefer(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::prefer(o1, prop<2>());
+ object<3> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::prefer(o5, prop<2>());
+ object<3> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<2> o9 = asio::prefer(object<1>(), prop<2>());
+ constexpr object<3> o10 = asio::prefer(object<1>(), prop<2>(), prop<3>());
+ constexpr object<4> o11 = asio::prefer(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/prefer_free_require.cpp b/3rdparty/asio/src/tests/properties/cpp11/prefer_free_require.cpp
new file mode 100644
index 00000000000..f30d0fbb06f
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/prefer_free_require.cpp
@@ -0,0 +1,64 @@
+//
+// cpp11/prefer_free_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::prefer(o1, prop<2>());
+ object<3> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::prefer(o5, prop<2>());
+ object<3> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<2> o9 = asio::prefer(object<1>(), prop<2>());
+ constexpr object<3> o10 = asio::prefer(object<1>(), prop<2>(), prop<3>());
+ constexpr object<4> o11 = asio::prefer(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/prefer_member_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp11/prefer_member_prefer.cpp
new file mode 100644
index 00000000000..9803d5e5e95
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/prefer_member_prefer.cpp
@@ -0,0 +1,64 @@
+//
+// cpp11/prefer_member_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> prefer(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::prefer(o1, prop<2>());
+ object<3> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::prefer(o5, prop<2>());
+ object<3> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<2> o9 = asio::prefer(object<1>(), prop<2>());
+ constexpr object<3> o10 = asio::prefer(object<1>(), prop<2>(), prop<3>());
+ constexpr object<4> o11 = asio::prefer(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/prefer_member_require.cpp b/3rdparty/asio/src/tests/properties/cpp11/prefer_member_require.cpp
new file mode 100644
index 00000000000..701fb2dec81
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/prefer_member_require.cpp
@@ -0,0 +1,64 @@
+//
+// cpp11/prefer_member_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::prefer(o1, prop<2>());
+ object<3> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::prefer(o5, prop<2>());
+ object<3> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<2> o9 = asio::prefer(object<1>(), prop<2>());
+ constexpr object<3> o10 = asio::prefer(object<1>(), prop<2>(), prop<3>());
+ constexpr object<4> o11 = asio::prefer(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/prefer_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/prefer_static.cpp
new file mode 100644
index 00000000000..18cd713d9d0
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/prefer_static.cpp
@@ -0,0 +1,68 @@
+//
+// cpp11/prefer_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static constexpr bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<1> o2 = asio::prefer(o1, prop<1>());
+ object<1> o3 = asio::prefer(o1, prop<1>(), prop<1>());
+ object<1> o4 = asio::prefer(o1, prop<1>(), prop<1>(), prop<1>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<1> o6 = asio::prefer(o5, prop<1>());
+ object<1> o7 = asio::prefer(o5, prop<1>(), prop<1>());
+ object<1> o8 = asio::prefer(o5, prop<1>(), prop<1>(), prop<1>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<1> o9 = asio::prefer(object<1>(), prop<1>());
+ constexpr object<1> o10 = asio::prefer(object<1>(), prop<1>(), prop<1>());
+ constexpr object<1> o11 = asio::prefer(object<1>(), prop<1>(), prop<1>(), prop<1>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/prefer_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp11/prefer_unsupported.cpp
new file mode 100644
index 00000000000..8eb542301ec
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/prefer_unsupported.cpp
@@ -0,0 +1,59 @@
+//
+// cpp11/prefer_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<1> o2 = asio::prefer(o1, prop<2>());
+ object<1> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<1> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<1> o6 = asio::prefer(o5, prop<2>());
+ object<1> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<1> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<1> o9 = asio::prefer(object<1>(), prop<2>());
+ constexpr object<1> o10 = asio::prefer(object<1>(), prop<2>(), prop<3>());
+ constexpr object<1> o11 = asio::prefer(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/query_free.cpp b/3rdparty/asio/src/tests/properties/cpp11/query_free.cpp
new file mode 100644
index 00000000000..17a14dc3f5a
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/query_free.cpp
@@ -0,0 +1,49 @@
+//
+// cpp11/query_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ friend constexpr int query(const object&, prop) { return 123; }
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ object o1 = {};
+ int result1 = asio::query(o1, prop());
+ assert(result1 == 123);
+ (void)result1;
+
+ const object o2 = {};
+ int result2 = asio::query(o2, prop());
+ assert(result2 == 123);
+ (void)result2;
+
+ constexpr object o3 = {};
+ constexpr int result3 = asio::query(o3, prop());
+ assert(result3 == 123);
+ (void)result3;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/query_member.cpp b/3rdparty/asio/src/tests/properties/cpp11/query_member.cpp
new file mode 100644
index 00000000000..18ea24171ab
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/query_member.cpp
@@ -0,0 +1,49 @@
+//
+// cpp11/query_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ constexpr int query(prop) const { return 123; }
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ object o1 = {};
+ int result1 = asio::query(o1, prop());
+ assert(result1 == 123);
+ (void)result1;
+
+ const object o2 = {};
+ int result2 = asio::query(o2, prop());
+ assert(result2 == 123);
+ (void)result2;
+
+ constexpr object o3 = {};
+ constexpr int result3 = asio::query(o3, prop());
+ assert(result3 == 123);
+ (void)result3;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/query_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/query_static.cpp
new file mode 100644
index 00000000000..3290ab0971f
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/query_static.cpp
@@ -0,0 +1,60 @@
+//
+// cpp11/query_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+};
+
+namespace asio {
+
+template<>
+struct is_applicable_property<object, prop>
+{
+ static constexpr bool value = true;
+};
+
+namespace traits {
+
+template<>
+struct static_query<object, prop>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef int result_type;
+ static constexpr int value() { return 123; }
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object o1 = {};
+ int result1 = asio::query(o1, prop());
+ assert(result1 == 123);
+ (void)result1;
+
+ const object o2 = {};
+ int result2 = asio::query(o2, prop());
+ assert(result2 == 123);
+ (void)result2;
+
+ constexpr object o3 = {};
+ constexpr int result3 = asio::query(o3, prop());
+ assert(result3 == 123);
+ (void)result3;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/require_concept_free.cpp b/3rdparty/asio/src/tests/properties/cpp11/require_concept_free.cpp
new file mode 100644
index 00000000000..3f422988d2a
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/require_concept_free.cpp
@@ -0,0 +1,52 @@
+//
+// cpp11/require_concept_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require_concept(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::require_concept(o1, prop<2>());
+ (void)o2;
+
+ const object<1> o3 = {};
+ object<2> o4 = asio::require_concept(o3, prop<2>());
+ (void)o4;
+
+ constexpr object<2> o5 = asio::require_concept(object<1>(), prop<2>());
+ (void)o5;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/require_concept_member.cpp b/3rdparty/asio/src/tests/properties/cpp11/require_concept_member.cpp
new file mode 100644
index 00000000000..1f8bbf65b42
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/require_concept_member.cpp
@@ -0,0 +1,52 @@
+//
+// cpp11/require_concept_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require_concept(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::require_concept(o1, prop<2>());
+ (void)o2;
+
+ const object<1> o3 = {};
+ object<2> o4 = asio::require_concept(o3, prop<2>());
+ (void)o4;
+
+ constexpr object<2> o5 = asio::require_concept(object<1>(), prop<2>());
+ (void)o5;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/require_concept_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/require_concept_static.cpp
new file mode 100644
index 00000000000..b2a6f9dde39
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/require_concept_static.cpp
@@ -0,0 +1,58 @@
+//
+// cpp11/require_concept_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require_concept<object<N>, prop<N> >
+{
+ static constexpr bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ const object<1>& o2 = asio::require_concept(o1, prop<1>());
+ assert(&o1 == &o2);
+ (void)o2;
+
+ const object<1> o3 = {};
+ const object<1>& o4 = asio::require_concept(o3, prop<1>());
+ assert(&o3 == &o4);
+ (void)o4;
+
+ constexpr object<1> o5 = asio::require_concept(object<1>(), prop<1>());
+ (void)o5;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/require_free.cpp b/3rdparty/asio/src/tests/properties/cpp11/require_free.cpp
new file mode 100644
index 00000000000..1acd5bc78ce
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/require_free.cpp
@@ -0,0 +1,64 @@
+//
+// cpp11/require_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::require(o1, prop<2>());
+ object<3> o3 = asio::require(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::require(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::require(o5, prop<2>());
+ object<3> o7 = asio::require(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::require(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<2> o9 = asio::require(object<1>(), prop<2>());
+ constexpr object<3> o10 = asio::require(object<1>(), prop<2>(), prop<3>());
+ constexpr object<4> o11 = asio::require(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/require_member.cpp b/3rdparty/asio/src/tests/properties/cpp11/require_member.cpp
new file mode 100644
index 00000000000..e9192830811
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/require_member.cpp
@@ -0,0 +1,64 @@
+//
+// cpp11/require_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::require(o1, prop<2>());
+ object<3> o3 = asio::require(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::require(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::require(o5, prop<2>());
+ object<3> o7 = asio::require(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::require(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<2> o9 = asio::require(object<1>(), prop<2>());
+ constexpr object<3> o10 = asio::require(object<1>(), prop<2>(), prop<3>());
+ constexpr object<4> o11 = asio::require(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp11/require_static.cpp b/3rdparty/asio/src/tests/properties/cpp11/require_static.cpp
new file mode 100644
index 00000000000..e752dac10a4
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp11/require_static.cpp
@@ -0,0 +1,68 @@
+//
+// cpp11/require_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+namespace traits {
+
+template<int N>
+struct static_require<object<N>, prop<N> >
+{
+ static constexpr bool is_valid = true;
+};
+
+} // namespace traits
+} // namespace asio
+
+int main()
+{
+ object<1> o1 = {};
+ object<1> o2 = asio::require(o1, prop<1>());
+ object<1> o3 = asio::require(o1, prop<1>(), prop<1>());
+ object<1> o4 = asio::require(o1, prop<1>(), prop<1>(), prop<1>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<1> o6 = asio::require(o5, prop<1>());
+ object<1> o7 = asio::require(o5, prop<1>(), prop<1>());
+ object<1> o8 = asio::require(o5, prop<1>(), prop<1>(), prop<1>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<1> o9 = asio::require(object<1>(), prop<1>());
+ constexpr object<1> o10 = asio::require(object<1>(), prop<1>(), prop<1>());
+ constexpr object<1> o11 = asio::require(object<1>(), prop<1>(), prop<1>(), prop<1>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_free_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_free_prefer.cpp
new file mode 100644
index 00000000000..f7f2854233c
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_free_prefer.cpp
@@ -0,0 +1,39 @@
+//
+// cpp14/can_prefer_free_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> prefer(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_free_require.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_free_require.cpp
new file mode 100644
index 00000000000..a2a01e4d739
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_free_require.cpp
@@ -0,0 +1,39 @@
+//
+// cpp14/can_prefer_free_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_member_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_member_prefer.cpp
new file mode 100644
index 00000000000..b0d9622bd5b
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_member_prefer.cpp
@@ -0,0 +1,39 @@
+//
+// cpp14/can_prefer_member_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> prefer(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_member_require.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_member_require.cpp
new file mode 100644
index 00000000000..9d1146ad323
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_member_require.cpp
@@ -0,0 +1,39 @@
+//
+// cpp14/can_prefer_member_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_free_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_free_prefer.cpp
new file mode 100644
index 00000000000..1a305fc3ae6
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_free_prefer.cpp
@@ -0,0 +1,38 @@
+//
+// cpp14/can_prefer_not_applicable_free_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> prefer(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_free_require.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_free_require.cpp
new file mode 100644
index 00000000000..c5d732441d7
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_free_require.cpp
@@ -0,0 +1,38 @@
+//
+// cpp14/can_prefer_not_applicable_free_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_member_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_member_prefer.cpp
new file mode 100644
index 00000000000..66af105ead3
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_member_prefer.cpp
@@ -0,0 +1,38 @@
+//
+// cpp14/can_prefer_not_applicable_member_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> prefer(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_member_require.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_member_require.cpp
new file mode 100644
index 00000000000..a2bf20b6e89
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_member_require.cpp
@@ -0,0 +1,38 @@
+//
+// cpp14/can_prefer_not_applicable_member_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_static.cpp
new file mode 100644
index 00000000000..123fd863f48
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_static.cpp
@@ -0,0 +1,35 @@
+//
+// cpp14/can_prefer_not_applicable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_preferable = true;
+ template <typename> static constexpr bool static_query_v = true;
+ static constexpr bool value() { return true; }
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<1>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<1>, prop<1>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<1>, prop<1>, prop<1>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<1>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<1>, prop<1>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<1>, prop<1>, prop<1>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_unsupported.cpp
new file mode 100644
index 00000000000..ed67b39d6a2
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_applicable_unsupported.cpp
@@ -0,0 +1,32 @@
+//
+// cpp14/can_prefer_not_applicable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_free_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_free_prefer.cpp
new file mode 100644
index 00000000000..99cb8074746
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_free_prefer.cpp
@@ -0,0 +1,39 @@
+//
+// cpp14/can_prefer_not_preferable_free_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> prefer(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_free_require.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_free_require.cpp
new file mode 100644
index 00000000000..0e3329de423
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_free_require.cpp
@@ -0,0 +1,39 @@
+//
+// cpp14/can_prefer_not_preferable_free_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_member_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_member_prefer.cpp
new file mode 100644
index 00000000000..12213cd57e9
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_member_prefer.cpp
@@ -0,0 +1,39 @@
+//
+// cpp14/can_prefer_not_preferable_member_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> prefer(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_member_require.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_member_require.cpp
new file mode 100644
index 00000000000..d801a808b4d
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_member_require.cpp
@@ -0,0 +1,39 @@
+//
+// cpp14/can_prefer_not_preferable_member_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_static.cpp
new file mode 100644
index 00000000000..cbaf4eecc46
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_static.cpp
@@ -0,0 +1,34 @@
+//
+// cpp14/can_prefer_not_preferable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<1>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<1>, prop<1>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<1>, prop<1>, prop<1>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<1>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<1>, prop<1>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<1>, prop<1>, prop<1>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_unsupported.cpp
new file mode 100644
index 00000000000..aa37aedd3c6
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_not_preferable_unsupported.cpp
@@ -0,0 +1,34 @@
+//
+// cpp14/can_prefer_not_preferable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = false;
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_static.cpp
new file mode 100644
index 00000000000..3933a78839b
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_static.cpp
@@ -0,0 +1,36 @@
+//
+// cpp14/can_prefer_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = true;
+ template <typename> static constexpr bool static_query_v = true;
+ static constexpr bool value() { return true; }
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(asio::can_prefer_v<object<1>, prop<1>>, "");
+ static_assert(asio::can_prefer_v<object<1>, prop<1>, prop<1>>, "");
+ static_assert(asio::can_prefer_v<object<1>, prop<1>, prop<1>, prop<1>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<1>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<1>, prop<1>>, "");
+ static_assert(asio::can_prefer_v<const object<1>, prop<1>, prop<1>, prop<1>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_prefer_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_unsupported.cpp
new file mode 100644
index 00000000000..09ce8e02f18
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_prefer_unsupported.cpp
@@ -0,0 +1,42 @@
+//
+// cpp14/can_prefer_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_prefer_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_query_free.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_query_free.cpp
new file mode 100644
index 00000000000..7654a78a06a
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_query_free.cpp
@@ -0,0 +1,28 @@
+//
+// cpp14/can_query_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+};
+
+struct object
+{
+ friend constexpr int query(const object&, prop) { return 123; }
+};
+
+int main()
+{
+ static_assert(asio::can_query_v<object, prop>, "");
+ static_assert(asio::can_query_v<const object, prop>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_query_member.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_query_member.cpp
new file mode 100644
index 00000000000..6bd6c02c98b
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_query_member.cpp
@@ -0,0 +1,28 @@
+//
+// cpp14/can_query_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+};
+
+struct object
+{
+ constexpr int query(prop) const { return 123; }
+};
+
+int main()
+{
+ static_assert(asio::can_query_v<object, prop>, "");
+ static_assert(asio::can_query_v<const object, prop>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_free.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_free.cpp
new file mode 100644
index 00000000000..bda1770699b
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_free.cpp
@@ -0,0 +1,27 @@
+//
+// cpp14/can_query_not_applicable_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ friend constexpr int query(const object&, prop) { return 123; }
+};
+
+int main()
+{
+ static_assert(!asio::can_query_v<object, prop>, "");
+ static_assert(!asio::can_query_v<const object, prop>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_member.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_member.cpp
new file mode 100644
index 00000000000..25b6ab9c793
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_member.cpp
@@ -0,0 +1,27 @@
+//
+// cpp14/can_query_not_applicable_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+ constexpr int query(prop) const { return 123; }
+};
+
+int main()
+{
+ static_assert(!asio::can_query_v<object, prop>, "");
+ static_assert(!asio::can_query_v<const object, prop>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_static.cpp
new file mode 100644
index 00000000000..299a5e1f2a5
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_static.cpp
@@ -0,0 +1,27 @@
+//
+// cpp14/can_query_not_applicable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+ template <typename> static constexpr int static_query_v = 123;
+};
+
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_query_v<object, prop>, "");
+ static_assert(!asio::can_query_v<const object, prop>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_unsupported.cpp
new file mode 100644
index 00000000000..cec0aea9167
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_query_not_applicable_unsupported.cpp
@@ -0,0 +1,26 @@
+//
+// cpp14/can_query_not_applicable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+};
+
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_query_v<object, prop>, "");
+ static_assert(!asio::can_query_v<const object, prop>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_query_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_query_static.cpp
new file mode 100644
index 00000000000..67b19ac74ed
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_query_static.cpp
@@ -0,0 +1,28 @@
+//
+// cpp14/can_query_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ template <typename> static constexpr int static_query_v = 123;
+};
+
+struct object
+{
+};
+
+int main()
+{
+ static_assert(asio::can_query_v<object, prop>, "");
+ static_assert(asio::can_query_v<const object, prop>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_query_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_query_unsupported.cpp
new file mode 100644
index 00000000000..7e8f63f1405
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_query_unsupported.cpp
@@ -0,0 +1,27 @@
+//
+// cpp14/can_query_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+};
+
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_query_v<object, prop>, "");
+ static_assert(!asio::can_query_v<const object, prop>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_free.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_free.cpp
new file mode 100644
index 00000000000..e0dea96edf0
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_free.cpp
@@ -0,0 +1,35 @@
+//
+// cpp14/can_require_concept_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require_concept(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(asio::can_require_concept_v<object<1>, prop<2>>, "");
+ static_assert(asio::can_require_concept_v<const object<1>, prop<2>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_member.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_member.cpp
new file mode 100644
index 00000000000..7da0a580a6f
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_member.cpp
@@ -0,0 +1,35 @@
+//
+// cpp14/can_require_concept_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require_concept(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(asio::can_require_concept_v<object<1>, prop<2>>, "");
+ static_assert(asio::can_require_concept_v<const object<1>, prop<2>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_free.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_free.cpp
new file mode 100644
index 00000000000..f6d48165356
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_free.cpp
@@ -0,0 +1,34 @@
+//
+// cpp14/can_require_concept_not_applicable_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require_concept(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_require_concept_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_require_concept_v<const object<1>, prop<2>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_member.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_member.cpp
new file mode 100644
index 00000000000..5252cb77447
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_member.cpp
@@ -0,0 +1,34 @@
+//
+// cpp14/can_require_concept_not_applicable_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require_concept(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_require_concept_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_require_concept_v<const object<1>, prop<2>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_static.cpp
new file mode 100644
index 00000000000..7da83a988fb
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_static.cpp
@@ -0,0 +1,31 @@
+//
+// cpp14/can_require_concept_not_applicable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable_concept = true;
+ template <typename> static constexpr bool static_query_v = true;
+ static constexpr bool value() { return true; }
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_require_concept_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_require_concept_v<const object<1>, prop<2>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_unsupported.cpp
new file mode 100644
index 00000000000..939b450be73
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_not_applicable_unsupported.cpp
@@ -0,0 +1,28 @@
+//
+// cpp14/can_require_concept_not_applicable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_require_concept_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_require_concept_v<const object<1>, prop<2>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_static.cpp
new file mode 100644
index 00000000000..577363a0eea
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_static.cpp
@@ -0,0 +1,32 @@
+//
+// cpp14/can_require_concept_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_requirable_concept = true;
+ template <typename> static constexpr bool static_query_v = true;
+ static constexpr bool value() { return true; }
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(asio::can_require_concept_v<object<1>, prop<1>>, "");
+ static_assert(asio::can_require_concept_v<const object<1>, prop<1>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_unsupported.cpp
new file mode 100644
index 00000000000..2bcdc6c7606
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_concept_unsupported.cpp
@@ -0,0 +1,38 @@
+//
+// cpp14/can_require_concept_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_require_concept<object<1>, prop<2>>::value, "");
+ static_assert(!asio::can_require_concept<const object<1>, prop<2>>::value, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_free.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_free.cpp
new file mode 100644
index 00000000000..f0bda074d5a
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_free.cpp
@@ -0,0 +1,39 @@
+//
+// cpp14/can_require_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(asio::can_require_v<object<1>, prop<2>>, "");
+ static_assert(asio::can_require_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(asio::can_require_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(asio::can_require_v<const object<1>, prop<2>>, "");
+ static_assert(asio::can_require_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(asio::can_require_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_member.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_member.cpp
new file mode 100644
index 00000000000..0eeb0aa45c5
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_member.cpp
@@ -0,0 +1,39 @@
+//
+// cpp14/can_require_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(asio::can_require_v<object<1>, prop<2>>, "");
+ static_assert(asio::can_require_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(asio::can_require_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(asio::can_require_v<const object<1>, prop<2>>, "");
+ static_assert(asio::can_require_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(asio::can_require_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_free.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_free.cpp
new file mode 100644
index 00000000000..f68576e2f1c
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_free.cpp
@@ -0,0 +1,38 @@
+//
+// cpp14/can_require_not_applicable_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_require_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_require_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_require_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_member.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_member.cpp
new file mode 100644
index 00000000000..1c7aa953aeb
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_member.cpp
@@ -0,0 +1,38 @@
+//
+// cpp14/can_require_not_applicable_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ static_assert(!asio::can_require_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_require_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_require_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_static.cpp
new file mode 100644
index 00000000000..ba7b5a80ccc
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_static.cpp
@@ -0,0 +1,35 @@
+//
+// cpp14/can_require_not_applicable_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ static constexpr bool is_requirable = true;
+ template <typename> static constexpr bool static_query_v = true;
+ static constexpr bool value() { return true; }
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_require_v<object<1>, prop<1>>, "");
+ static_assert(!asio::can_require_v<object<1>, prop<1>, prop<1>>, "");
+ static_assert(!asio::can_require_v<object<1>, prop<1>, prop<1>, prop<1>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<1>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<1>, prop<1>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<1>, prop<1>, prop<1>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_unsupported.cpp
new file mode 100644
index 00000000000..25d71e35d48
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_not_applicable_unsupported.cpp
@@ -0,0 +1,32 @@
+//
+// cpp14/can_require_not_applicable_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(!asio::can_require_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_require_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_require_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_static.cpp
new file mode 100644
index 00000000000..f92c0b56c8a
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_static.cpp
@@ -0,0 +1,36 @@
+//
+// cpp14/can_require_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_requirable = true;
+ template <typename> static constexpr bool static_query_v = true;
+ static constexpr bool value() { return true; }
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ static_assert(asio::can_require_v<object<1>, prop<1>>, "");
+ static_assert(asio::can_require_v<object<1>, prop<1>, prop<1>>, "");
+ static_assert(asio::can_require_v<object<1>, prop<1>, prop<1>, prop<1>>, "");
+ static_assert(asio::can_require_v<const object<1>, prop<1>>, "");
+ static_assert(asio::can_require_v<const object<1>, prop<1>, prop<1>>, "");
+ static_assert(asio::can_require_v<const object<1>, prop<1>, prop<1>, prop<1>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/can_require_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp14/can_require_unsupported.cpp
new file mode 100644
index 00000000000..4cf2756d40b
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/can_require_unsupported.cpp
@@ -0,0 +1,42 @@
+//
+// cpp14/can_require_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+};
+
+template <int>
+struct object
+{
+};
+
+namespace asio {
+
+template<int N, int M>
+struct is_applicable_property<object<N>, prop<M> >
+{
+ static constexpr bool value = true;
+};
+
+} // namespace asio
+
+int main()
+{
+ static_assert(!asio::can_require_v<object<1>, prop<2>>, "");
+ static_assert(!asio::can_require_v<object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_require_v<object<1>, prop<2>, prop<3>, prop<4>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<2>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<2>, prop<3>>, "");
+ static_assert(!asio::can_require_v<const object<1>, prop<2>, prop<3>, prop<4>>, "");
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/prefer_free_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp14/prefer_free_prefer.cpp
new file mode 100644
index 00000000000..fce83ed6b9f
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/prefer_free_prefer.cpp
@@ -0,0 +1,55 @@
+//
+// cpp14/prefer_free_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> prefer(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::prefer(o1, prop<2>());
+ object<3> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::prefer(o5, prop<2>());
+ object<3> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<2> o9 = asio::prefer(object<1>(), prop<2>());
+ constexpr object<3> o10 = asio::prefer(object<1>(), prop<2>(), prop<3>());
+ constexpr object<4> o11 = asio::prefer(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/prefer_free_require.cpp b/3rdparty/asio/src/tests/properties/cpp14/prefer_free_require.cpp
new file mode 100644
index 00000000000..349aebeb515
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/prefer_free_require.cpp
@@ -0,0 +1,55 @@
+//
+// cpp14/prefer_free_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::prefer(o1, prop<2>());
+ object<3> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::prefer(o5, prop<2>());
+ object<3> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<2> o9 = asio::prefer(object<1>(), prop<2>());
+ constexpr object<3> o10 = asio::prefer(object<1>(), prop<2>(), prop<3>());
+ constexpr object<4> o11 = asio::prefer(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/prefer_member_prefer.cpp b/3rdparty/asio/src/tests/properties/cpp14/prefer_member_prefer.cpp
new file mode 100644
index 00000000000..56d29efd34c
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/prefer_member_prefer.cpp
@@ -0,0 +1,55 @@
+//
+// cpp14/prefer_member_prefer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> prefer(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::prefer(o1, prop<2>());
+ object<3> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::prefer(o5, prop<2>());
+ object<3> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<2> o9 = asio::prefer(object<1>(), prop<2>());
+ constexpr object<3> o10 = asio::prefer(object<1>(), prop<2>(), prop<3>());
+ constexpr object<4> o11 = asio::prefer(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/prefer_member_require.cpp b/3rdparty/asio/src/tests/properties/cpp14/prefer_member_require.cpp
new file mode 100644
index 00000000000..7b88df406e8
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/prefer_member_require.cpp
@@ -0,0 +1,55 @@
+//
+// cpp14/prefer_member_require.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::prefer(o1, prop<2>());
+ object<3> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::prefer(o5, prop<2>());
+ object<3> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<2> o9 = asio::prefer(object<1>(), prop<2>());
+ constexpr object<3> o10 = asio::prefer(object<1>(), prop<2>(), prop<3>());
+ constexpr object<4> o11 = asio::prefer(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/prefer_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/prefer_static.cpp
new file mode 100644
index 00000000000..8fd537ae74b
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/prefer_static.cpp
@@ -0,0 +1,52 @@
+//
+// cpp14/prefer_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = true;
+ template <typename> static constexpr bool static_query_v = true;
+ static constexpr bool value() { return true; }
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ object<1> o1 = {};
+ object<1> o2 = asio::prefer(o1, prop<1>());
+ object<1> o3 = asio::prefer(o1, prop<1>(), prop<1>());
+ object<1> o4 = asio::prefer(o1, prop<1>(), prop<1>(), prop<1>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<1> o6 = asio::prefer(o5, prop<1>());
+ object<1> o7 = asio::prefer(o5, prop<1>(), prop<1>());
+ object<1> o8 = asio::prefer(o5, prop<1>(), prop<1>(), prop<1>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<1> o9 = asio::prefer(object<1>(), prop<1>());
+ constexpr object<1> o10 = asio::prefer(object<1>(), prop<1>(), prop<1>());
+ constexpr object<1> o11 = asio::prefer(object<1>(), prop<1>(), prop<1>(), prop<1>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/prefer_unsupported.cpp b/3rdparty/asio/src/tests/properties/cpp14/prefer_unsupported.cpp
new file mode 100644
index 00000000000..50b8da0f9d3
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/prefer_unsupported.cpp
@@ -0,0 +1,50 @@
+//
+// cpp14/prefer_unsupported.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/prefer.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_preferable = true;
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ object<1> o1 = {};
+ object<1> o2 = asio::prefer(o1, prop<2>());
+ object<1> o3 = asio::prefer(o1, prop<2>(), prop<3>());
+ object<1> o4 = asio::prefer(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<1> o6 = asio::prefer(o5, prop<2>());
+ object<1> o7 = asio::prefer(o5, prop<2>(), prop<3>());
+ object<1> o8 = asio::prefer(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<1> o9 = asio::prefer(object<1>(), prop<2>());
+ constexpr object<1> o10 = asio::prefer(object<1>(), prop<2>(), prop<3>());
+ constexpr object<1> o11 = asio::prefer(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/query_free.cpp b/3rdparty/asio/src/tests/properties/cpp14/query_free.cpp
new file mode 100644
index 00000000000..24be8dbe945
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/query_free.cpp
@@ -0,0 +1,40 @@
+//
+// cpp14/query_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+};
+
+struct object
+{
+ friend constexpr int query(const object&, prop) { return 123; }
+};
+
+int main()
+{
+ object o1 = {};
+ int result1 = asio::query(o1, prop());
+ assert(result1 == 123);
+ (void)result1;
+
+ const object o2 = {};
+ int result2 = asio::query(o2, prop());
+ assert(result2 == 123);
+ (void)result2;
+
+ constexpr object o3 = {};
+ constexpr int result3 = asio::query(o3, prop());
+ assert(result3 == 123);
+ (void)result3;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/query_member.cpp b/3rdparty/asio/src/tests/properties/cpp14/query_member.cpp
new file mode 100644
index 00000000000..fab0bed9d03
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/query_member.cpp
@@ -0,0 +1,40 @@
+//
+// cpp14/query_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+};
+
+struct object
+{
+ constexpr int query(prop) const { return 123; }
+};
+
+int main()
+{
+ object o1 = {};
+ int result1 = asio::query(o1, prop());
+ assert(result1 == 123);
+ (void)result1;
+
+ const object o2 = {};
+ int result2 = asio::query(o2, prop());
+ assert(result2 == 123);
+ (void)result2;
+
+ constexpr object o3 = {};
+ constexpr int result3 = asio::query(o3, prop());
+ assert(result3 == 123);
+ (void)result3;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/query_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/query_static.cpp
new file mode 100644
index 00000000000..d13ad85c3c6
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/query_static.cpp
@@ -0,0 +1,40 @@
+//
+// cpp14/query_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/query.hpp"
+#include <cassert>
+
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ template <typename> static constexpr int static_query_v = 123;
+};
+
+struct object
+{
+};
+
+int main()
+{
+ object o1 = {};
+ int result1 = asio::query(o1, prop());
+ assert(result1 == 123);
+ (void)result1;
+
+ const object o2 = {};
+ int result2 = asio::query(o2, prop());
+ assert(result2 == 123);
+ (void)result2;
+
+ constexpr object o3 = {};
+ constexpr int result3 = asio::query(o3, prop());
+ assert(result3 == 123);
+ (void)result3;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/require_concept_free.cpp b/3rdparty/asio/src/tests/properties/cpp14/require_concept_free.cpp
new file mode 100644
index 00000000000..d7323db95ba
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/require_concept_free.cpp
@@ -0,0 +1,43 @@
+//
+// cpp14/require_concept_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require_concept(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::require_concept(o1, prop<2>());
+ (void)o2;
+
+ const object<1> o3 = {};
+ object<2> o4 = asio::require_concept(o3, prop<2>());
+ (void)o4;
+
+ constexpr object<2> o5 = asio::require_concept(object<1>(), prop<2>());
+ (void)o5;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/require_concept_member.cpp b/3rdparty/asio/src/tests/properties/cpp14/require_concept_member.cpp
new file mode 100644
index 00000000000..e21dda3f6e4
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/require_concept_member.cpp
@@ -0,0 +1,43 @@
+//
+// cpp14/require_concept_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_requirable_concept = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require_concept(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::require_concept(o1, prop<2>());
+ (void)o2;
+
+ const object<1> o3 = {};
+ object<2> o4 = asio::require_concept(o3, prop<2>());
+ (void)o4;
+
+ constexpr object<2> o5 = asio::require_concept(object<1>(), prop<2>());
+ (void)o5;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/require_concept_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/require_concept_static.cpp
new file mode 100644
index 00000000000..523ed758061
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/require_concept_static.cpp
@@ -0,0 +1,42 @@
+//
+// cpp14/require_concept_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require_concept.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_requirable_concept = true;
+ template <typename> static constexpr bool static_query_v = true;
+ static constexpr bool value() { return true; }
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ object<1> o1 = {};
+ const object<1>& o2 = asio::require_concept(o1, prop<1>());
+ assert(&o1 == &o2);
+ (void)o2;
+
+ const object<1> o3 = {};
+ const object<1>& o4 = asio::require_concept(o3, prop<1>());
+ assert(&o3 == &o4);
+ (void)o4;
+
+ constexpr object<1> o5 = asio::require_concept(object<1>(), prop<1>());
+ (void)o5;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/require_free.cpp b/3rdparty/asio/src/tests/properties/cpp14/require_free.cpp
new file mode 100644
index 00000000000..32893ff26ee
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/require_free.cpp
@@ -0,0 +1,55 @@
+//
+// cpp14/require_free.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ friend constexpr object<N> require(const object&, prop<N>)
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::require(o1, prop<2>());
+ object<3> o3 = asio::require(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::require(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::require(o5, prop<2>());
+ object<3> o7 = asio::require(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::require(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<2> o9 = asio::require(object<1>(), prop<2>());
+ constexpr object<3> o10 = asio::require(object<1>(), prop<2>(), prop<3>());
+ constexpr object<4> o11 = asio::require(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/require_member.cpp b/3rdparty/asio/src/tests/properties/cpp14/require_member.cpp
new file mode 100644
index 00000000000..f2e58aa2f76
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/require_member.cpp
@@ -0,0 +1,55 @@
+//
+// cpp14/require_member.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_requirable = true;
+};
+
+template <int>
+struct object
+{
+ template <int N>
+ constexpr object<N> require(prop<N>) const
+ {
+ return object<N>();
+ }
+};
+
+int main()
+{
+ object<1> o1 = {};
+ object<2> o2 = asio::require(o1, prop<2>());
+ object<3> o3 = asio::require(o1, prop<2>(), prop<3>());
+ object<4> o4 = asio::require(o1, prop<2>(), prop<3>(), prop<4>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<2> o6 = asio::require(o5, prop<2>());
+ object<3> o7 = asio::require(o5, prop<2>(), prop<3>());
+ object<4> o8 = asio::require(o5, prop<2>(), prop<3>(), prop<4>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<2> o9 = asio::require(object<1>(), prop<2>());
+ constexpr object<3> o10 = asio::require(object<1>(), prop<2>(), prop<3>());
+ constexpr object<4> o11 = asio::require(object<1>(), prop<2>(), prop<3>(), prop<4>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/properties/cpp14/require_static.cpp b/3rdparty/asio/src/tests/properties/cpp14/require_static.cpp
new file mode 100644
index 00000000000..acdd7fbf499
--- /dev/null
+++ b/3rdparty/asio/src/tests/properties/cpp14/require_static.cpp
@@ -0,0 +1,52 @@
+//
+// cpp14/require_static.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the 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 "asio/require.hpp"
+#include <cassert>
+
+template <int>
+struct prop
+{
+ template <typename> static constexpr bool is_applicable_property_v = true;
+ static constexpr bool is_requirable = true;
+ template <typename> static constexpr bool static_query_v = true;
+ static constexpr bool value() { return true; }
+};
+
+template <int>
+struct object
+{
+};
+
+int main()
+{
+ object<1> o1 = {};
+ object<1> o2 = asio::require(o1, prop<1>());
+ object<1> o3 = asio::require(o1, prop<1>(), prop<1>());
+ object<1> o4 = asio::require(o1, prop<1>(), prop<1>(), prop<1>());
+ (void)o2;
+ (void)o3;
+ (void)o4;
+
+ const object<1> o5 = {};
+ object<1> o6 = asio::require(o5, prop<1>());
+ object<1> o7 = asio::require(o5, prop<1>(), prop<1>());
+ object<1> o8 = asio::require(o5, prop<1>(), prop<1>(), prop<1>());
+ (void)o6;
+ (void)o7;
+ (void)o8;
+
+ constexpr object<1> o9 = asio::require(object<1>(), prop<1>());
+ constexpr object<1> o10 = asio::require(object<1>(), prop<1>(), prop<1>());
+ constexpr object<1> o11 = asio::require(object<1>(), prop<1>(), prop<1>(), prop<1>());
+ (void)o9;
+ (void)o10;
+ (void)o11;
+}
diff --git a/3rdparty/asio/src/tests/unit/any_completion_executor.cpp b/3rdparty/asio/src/tests/unit/any_completion_executor.cpp
new file mode 100644
index 00000000000..5d1d5b1e271
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/any_completion_executor.cpp
@@ -0,0 +1,463 @@
+//
+// any_completion_executor.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/any_completion_executor.hpp"
+
+#include <cstring>
+#include <functional>
+#include "asio/system_executor.hpp"
+#include "asio/thread_pool.hpp"
+#include "unit_test.hpp"
+
+using namespace asio;
+namespace bindns = std;
+
+static bool next_nothrow_new_fails = false;
+
+void* operator new(std::size_t n,
+ const std::nothrow_t&) noexcept
+{
+ if (next_nothrow_new_fails)
+ {
+ next_nothrow_new_fails = false;
+ return 0;
+ }
+ return ::operator new(n);
+}
+
+struct fat_executor
+{
+ fat_executor(int id)
+ : id_(id)
+ {
+ std::memset(data_, 0, sizeof(data_));
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const fat_executor& a,
+ const fat_executor& b) noexcept
+ {
+ return a.id_ == b.id_;
+ }
+
+ friend bool operator!=(const fat_executor& a,
+ const fat_executor& b) noexcept
+ {
+ return a.id_ != b.id_;
+ }
+
+ int id_;
+ unsigned char data_[1024];
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename F>
+struct execute_member<fat_executor, F>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <>
+struct equality_comparable<fat_executor>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+void increment(int* count)
+{
+ ++(*count);
+}
+
+void any_completion_executor_construction_test()
+{
+ thread_pool pool(1);
+ asio::nullptr_t null_ptr = asio::nullptr_t();
+
+ asio::any_completion_executor ex1;
+
+ ASIO_CHECK(ex1.target<void>() == 0);
+ ASIO_CHECK(ex1 == null_ptr);
+
+ asio::any_completion_executor ex2(null_ptr);
+
+ ASIO_CHECK(ex2.target<void>() == 0);
+ ASIO_CHECK(ex2 == null_ptr);
+ ASIO_CHECK(ex2 == ex1);
+
+ asio::any_completion_executor ex3(pool.executor());
+
+ ASIO_CHECK(ex3.target<void>() != 0);
+ ASIO_CHECK(ex3 != null_ptr);
+ ASIO_CHECK(ex3 != ex1);
+
+ asio::any_completion_executor ex4(ex1);
+
+ ASIO_CHECK(ex4.target<void>() == 0);
+ ASIO_CHECK(ex4 == null_ptr);
+ ASIO_CHECK(ex4 == ex1);
+
+ asio::any_completion_executor ex5(ex3);
+
+ ASIO_CHECK(ex5.target<void>() != 0);
+ ASIO_CHECK(ex5 != null_ptr);
+ ASIO_CHECK(ex5 == ex3);
+
+ asio::any_completion_executor ex6 = fat_executor(1);
+
+ ASIO_CHECK(ex6.target<void>() != 0);
+ ASIO_CHECK(ex6 != null_ptr);
+ ASIO_CHECK(ex6 != ex1);
+
+ asio::any_completion_executor ex7 = fat_executor(1);
+
+ ASIO_CHECK(ex7.target<void>() != 0);
+ ASIO_CHECK(ex7 != null_ptr);
+ ASIO_CHECK(ex7 != ex1);
+ ASIO_CHECK(ex7 == ex6);
+
+ asio::any_completion_executor ex8 = fat_executor(2);
+
+ ASIO_CHECK(ex8.target<void>() != 0);
+ ASIO_CHECK(ex8 != null_ptr);
+ ASIO_CHECK(ex8 != ex1);
+ ASIO_CHECK(ex8 != ex6);
+ ASIO_CHECK(ex8 != ex7);
+
+ asio::any_completion_executor ex9(ex6);
+
+ ASIO_CHECK(ex9.target<void>() != 0);
+ ASIO_CHECK(ex9 != null_ptr);
+ ASIO_CHECK(ex9 != ex1);
+ ASIO_CHECK(ex9 == ex6);
+ ASIO_CHECK(ex9 == ex7);
+ ASIO_CHECK(ex9 != ex8);
+
+ asio::any_completion_executor ex10(std::move(ex1));
+
+ ASIO_CHECK(ex10.target<void>() == 0);
+ ASIO_CHECK(ex10 == null_ptr);
+ ASIO_CHECK(ex1.target<void>() == 0);
+ ASIO_CHECK(ex1 == null_ptr);
+
+ asio::any_completion_executor ex11(std::move(ex3));
+
+ ASIO_CHECK(ex11.target<void>() != 0);
+ ASIO_CHECK(ex11 != null_ptr);
+ ASIO_CHECK(ex3.target<void>() == 0);
+ ASIO_CHECK(ex3 == null_ptr);
+ ASIO_CHECK(ex11 == ex5);
+
+ asio::any_completion_executor ex12(std::move(ex7));
+
+ ASIO_CHECK(ex12.target<void>() != 0);
+ ASIO_CHECK(ex12 != null_ptr);
+ ASIO_CHECK(ex7.target<void>() == 0);
+ ASIO_CHECK(ex7 == null_ptr);
+ ASIO_CHECK(ex12 == ex6);
+ ASIO_CHECK(ex12 != ex8);
+}
+
+void any_completion_executor_nothrow_construction_test()
+{
+ thread_pool pool(1);
+ asio::nullptr_t null_ptr = asio::nullptr_t();
+
+ asio::any_completion_executor ex1;
+
+ ASIO_CHECK(ex1.target<void>() == 0);
+ ASIO_CHECK(ex1 == null_ptr);
+
+ asio::any_completion_executor ex2(null_ptr);
+
+ ASIO_CHECK(ex2.target<void>() == 0);
+ ASIO_CHECK(ex2 == null_ptr);
+ ASIO_CHECK(ex2 == ex1);
+
+ asio::any_completion_executor ex3(std::nothrow, pool.executor());
+
+ ASIO_CHECK(ex3.target<void>() != 0);
+ ASIO_CHECK(ex3 != null_ptr);
+ ASIO_CHECK(ex3 != ex1);
+
+ asio::any_completion_executor ex4(std::nothrow, ex1);
+
+ ASIO_CHECK(ex4.target<void>() == 0);
+ ASIO_CHECK(ex4 == null_ptr);
+ ASIO_CHECK(ex4 == ex1);
+
+ asio::any_completion_executor ex5(std::nothrow, ex3);
+
+ ASIO_CHECK(ex5.target<void>() != 0);
+ ASIO_CHECK(ex5 != null_ptr);
+ ASIO_CHECK(ex5 == ex3);
+
+ asio::any_completion_executor ex6(std::nothrow, fat_executor(1));
+
+ ASIO_CHECK(ex6.target<void>() != 0);
+ ASIO_CHECK(ex6 != null_ptr);
+ ASIO_CHECK(ex6 != ex1);
+
+ asio::any_completion_executor ex7(std::nothrow, fat_executor(1));
+
+ ASIO_CHECK(ex7.target<void>() != 0);
+ ASIO_CHECK(ex7 != null_ptr);
+ ASIO_CHECK(ex7 != ex1);
+ ASIO_CHECK(ex7 == ex6);
+
+ asio::any_completion_executor ex8(std::nothrow, fat_executor(2));
+
+ ASIO_CHECK(ex8.target<void>() != 0);
+ ASIO_CHECK(ex8 != null_ptr);
+ ASIO_CHECK(ex8 != ex1);
+ ASIO_CHECK(ex8 != ex6);
+ ASIO_CHECK(ex8 != ex7);
+
+ asio::any_completion_executor ex9(std::nothrow, ex6);
+
+ ASIO_CHECK(ex9.target<void>() != 0);
+ ASIO_CHECK(ex9 != null_ptr);
+ ASIO_CHECK(ex9 != ex1);
+ ASIO_CHECK(ex9 == ex6);
+ ASIO_CHECK(ex9 == ex7);
+ ASIO_CHECK(ex9 != ex8);
+
+ asio::any_completion_executor ex10(std::nothrow, std::move(ex1));
+
+ ASIO_CHECK(ex10.target<void>() == 0);
+ ASIO_CHECK(ex10 == null_ptr);
+ ASIO_CHECK(ex1.target<void>() == 0);
+ ASIO_CHECK(ex1 == null_ptr);
+
+ asio::any_completion_executor ex11(std::nothrow, std::move(ex3));
+
+ ASIO_CHECK(ex11.target<void>() != 0);
+ ASIO_CHECK(ex11 != null_ptr);
+ ASIO_CHECK(ex3.target<void>() == 0);
+ ASIO_CHECK(ex3 == null_ptr);
+ ASIO_CHECK(ex11 == ex5);
+
+ asio::any_completion_executor ex12(std::nothrow, std::move(ex7));
+
+ ASIO_CHECK(ex12.target<void>() != 0);
+ ASIO_CHECK(ex12 != null_ptr);
+ ASIO_CHECK(ex7.target<void>() == 0);
+ ASIO_CHECK(ex7 == null_ptr);
+ ASIO_CHECK(ex12 == ex6);
+ ASIO_CHECK(ex12 != ex8);
+
+ next_nothrow_new_fails = true;
+ asio::any_completion_executor ex13(std::nothrow, fat_executor(3));
+
+ ASIO_CHECK(ex13.target<void>() == 0);
+ ASIO_CHECK(ex13 == null_ptr);
+ ASIO_CHECK(ex13 == ex1);
+}
+
+void any_completion_executor_assignment_test()
+{
+ thread_pool pool(1);
+ asio::nullptr_t null_ptr = asio::nullptr_t();
+
+ asio::any_completion_executor ex1;
+
+ asio::any_completion_executor ex2;
+ ex2 = null_ptr;
+
+ ASIO_CHECK(ex2.target<void>() == 0);
+
+ asio::any_completion_executor ex3;
+ ex3 = pool.executor();
+
+ ASIO_CHECK(ex3.target<void>() != 0);
+
+ asio::any_completion_executor ex4;
+ ex4 = ex1;
+
+ ASIO_CHECK(ex4.target<void>() == 0);
+ ASIO_CHECK(ex4 == ex1);
+
+ ex4 = ex3;
+
+ ASIO_CHECK(ex4.target<void>() != 0);
+ ASIO_CHECK(ex4 == ex3);
+
+ asio::any_completion_executor ex5;
+ ex5 = fat_executor(1);
+
+ ASIO_CHECK(ex5.target<void>() != 0);
+ ASIO_CHECK(ex5 != null_ptr);
+ ASIO_CHECK(ex5 != ex1);
+
+ asio::any_completion_executor ex6;
+ ex6 = fat_executor(1);
+
+ ASIO_CHECK(ex6.target<void>() != 0);
+ ASIO_CHECK(ex6 != null_ptr);
+ ASIO_CHECK(ex6 != ex1);
+ ASIO_CHECK(ex6 == ex5);
+
+ ex6 = fat_executor(2);
+
+ ASIO_CHECK(ex6.target<void>() != 0);
+ ASIO_CHECK(ex6 != null_ptr);
+ ASIO_CHECK(ex6 != ex1);
+ ASIO_CHECK(ex6 != ex5);
+
+ asio::any_completion_executor ex7;
+ ex7 = ex5;
+
+ ASIO_CHECK(ex7.target<void>() != 0);
+ ASIO_CHECK(ex7 != null_ptr);
+ ASIO_CHECK(ex7 != ex1);
+ ASIO_CHECK(ex7 == ex5);
+ ASIO_CHECK(ex7 != ex6);
+
+ asio::any_completion_executor ex8;
+ ex8 = std::move(ex1);
+
+ ASIO_CHECK(ex8.target<void>() == 0);
+ ASIO_CHECK(ex1.target<void>() == 0);
+
+ ex8 = std::move(ex3);
+
+ ASIO_CHECK(ex8.target<void>() != 0);
+ ASIO_CHECK(ex3.target<void>() == 0);
+ ASIO_CHECK(ex8 == ex4);
+
+ ex8 = std::move(ex5);
+
+ ASIO_CHECK(ex8.target<void>() != 0);
+ ASIO_CHECK(ex5.target<void>() == 0);
+ ASIO_CHECK(ex8 == ex7);
+}
+
+void any_completion_executor_swap_test()
+{
+ thread_pool pool1(1);
+ thread_pool pool2(1);
+
+ asio::any_completion_executor ex1(pool1.executor());
+ asio::any_completion_executor ex2(pool2.executor());
+
+ asio::any_completion_executor ex3(ex1);
+ asio::any_completion_executor ex4(ex2);
+
+ ASIO_CHECK(ex3 == ex1);
+ ASIO_CHECK(ex4 == ex2);
+
+ ex3.swap(ex4);
+
+ ASIO_CHECK(ex3 == ex2);
+ ASIO_CHECK(ex4 == ex1);
+
+ execution::swap(ex3, ex4);
+
+ ASIO_CHECK(ex3 == ex1);
+ ASIO_CHECK(ex4 == ex2);
+}
+
+void any_completion_executor_query_test()
+{
+ thread_pool pool(1);
+ asio::any_completion_executor ex(pool.executor());
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::blocking)
+ == asio::execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::blocking.possibly)
+ == asio::execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::outstanding_work)
+ == asio::execution::outstanding_work.untracked);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::outstanding_work.untracked)
+ == asio::execution::outstanding_work.untracked);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::relationship)
+ == asio::execution::relationship.fork);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::relationship.fork)
+ == asio::execution::relationship.fork);
+}
+
+void any_completion_executor_execute_test()
+{
+ int count = 0;
+ thread_pool pool(1);
+ asio::any_completion_executor ex(pool.executor());
+
+ ex.execute(bindns::bind(increment, &count));
+
+ asio::prefer(ex, asio::execution::blocking.possibly).execute(
+ bindns::bind(increment, &count));
+
+ asio::prefer(ex,
+ asio::execution::blocking.possibly,
+ asio::execution::outstanding_work.tracked
+ ).execute(bindns::bind(increment, &count));
+
+ asio::prefer(ex,
+ asio::execution::blocking.possibly,
+ asio::execution::outstanding_work.untracked
+ ).execute(bindns::bind(increment, &count));
+
+ asio::prefer(ex,
+ asio::execution::blocking.possibly,
+ asio::execution::outstanding_work.untracked,
+ asio::execution::relationship.continuation
+ ).execute(bindns::bind(increment, &count));
+
+ pool.wait();
+
+ ASIO_CHECK(count == 5);
+}
+
+ASIO_TEST_SUITE
+(
+ "any_completion_executor",
+ ASIO_TEST_CASE(any_completion_executor_construction_test)
+ ASIO_TEST_CASE(any_completion_executor_nothrow_construction_test)
+ ASIO_TEST_CASE(any_completion_executor_assignment_test)
+ ASIO_TEST_CASE(any_completion_executor_swap_test)
+ ASIO_TEST_CASE(any_completion_executor_query_test)
+ ASIO_TEST_CASE(any_completion_executor_execute_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/any_completion_handler.cpp b/3rdparty/asio/src/tests/unit/any_completion_handler.cpp
new file mode 100644
index 00000000000..887402de8d3
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/any_completion_handler.cpp
@@ -0,0 +1,260 @@
+//
+// any_completion_handler.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/any_completion_handler.hpp"
+
+#include "unit_test.hpp"
+
+#include <functional>
+#include "asio/bind_allocator.hpp"
+#include "asio/bind_cancellation_slot.hpp"
+#include "asio/bind_executor.hpp"
+#include "asio/bind_immediate_executor.hpp"
+#include "asio/error.hpp"
+#include "asio/thread_pool.hpp"
+
+namespace bindns = std;
+
+void increment(int* count)
+{
+ ++(*count);
+}
+
+void any_completion_handler_construction_test()
+{
+ int count = 0;
+ asio::nullptr_t null_ptr = asio::nullptr_t();
+
+ asio::any_completion_handler<void()> h1;
+
+ ASIO_CHECK(!h1);
+ ASIO_CHECK(h1 == null_ptr);
+
+ asio::any_completion_handler<void()> h2(null_ptr);
+
+ ASIO_CHECK(!h2);
+ ASIO_CHECK(h2 == null_ptr);
+
+ asio::any_completion_handler<void()> h3(
+ bindns::bind(&increment, &count));
+
+ ASIO_CHECK(!!h3);
+ ASIO_CHECK(h3 != null_ptr);
+
+ asio::any_completion_handler<void()> h4(std::move(h1));
+
+ ASIO_CHECK(!h4);
+ ASIO_CHECK(h4 == null_ptr);
+ ASIO_CHECK(!h1);
+ ASIO_CHECK(h1 == null_ptr);
+
+ asio::any_completion_handler<void()> h5(std::move(h3));
+
+ ASIO_CHECK(!!h5);
+ ASIO_CHECK(h5 != null_ptr);
+ ASIO_CHECK(!h3);
+ ASIO_CHECK(h3 == null_ptr);
+
+ asio::any_completion_handler<void()> h6(std::move(h5));
+
+ ASIO_CHECK(!!h6);
+ ASIO_CHECK(h6 != null_ptr);
+ ASIO_CHECK(!h5);
+ ASIO_CHECK(h5 == null_ptr);
+}
+
+void any_completion_handler_assignment_test()
+{
+ int count = 0;
+ asio::nullptr_t null_ptr = asio::nullptr_t();
+
+ asio::any_completion_handler<void()> h1;
+
+ asio::any_completion_handler<void()> h2;
+ h2 = null_ptr;
+
+ ASIO_CHECK(!h2);
+
+ asio::any_completion_handler<void()> h3;
+ h3 = bindns::bind(&increment, &count);
+
+ ASIO_CHECK(!!h3);
+
+ asio::any_completion_handler<void()> h4;
+ h4 = std::move(h1);
+
+ ASIO_CHECK(!h4);
+ ASIO_CHECK(!h1);
+
+ h4 = std::move(h3);
+
+ ASIO_CHECK(!!h4);
+ ASIO_CHECK(!h3);
+}
+
+template <typename T>
+class handler_allocator
+{
+public:
+ using value_type = T;
+
+ explicit handler_allocator(int* count)
+ : count_(count)
+ {
+ }
+
+ template <typename U>
+ handler_allocator(const handler_allocator<U>& other) noexcept
+ : count_(other.count_)
+ {
+ }
+
+ bool operator==(const handler_allocator& other) const noexcept
+ {
+ return &count_ == &other.count_;
+ }
+
+ bool operator!=(const handler_allocator& other) const noexcept
+ {
+ return &count_ != &other.count_;
+ }
+
+ T* allocate(std::size_t n) const
+ {
+ ++(*count_);
+ return static_cast<T*>(::operator new(sizeof(T) * n));
+ }
+
+ void deallocate(T* p, std::size_t /*n*/) const
+ {
+ ::operator delete(p);
+ }
+
+private:
+ template <typename> friend class handler_allocator;
+
+ int* count_;
+};
+
+class cancel_handler
+{
+public:
+ explicit cancel_handler(int* count)
+ : count_(count)
+ {
+ }
+
+ void operator()(asio::cancellation_type_t)
+ {
+ ++(*count_);
+ }
+
+private:
+ int* count_;
+};
+
+void any_completion_handler_associator_test()
+{
+ typedef asio::any_completion_handler<void()> handler_type;
+
+ int count = 0;
+ int alloc_count = 0;
+ int cancel_count = 0;
+ asio::thread_pool pool(1);
+ asio::cancellation_signal sig;
+
+ asio::any_completion_handler<void()> h1(
+ asio::bind_allocator(handler_allocator<char>(&alloc_count),
+ asio::bind_cancellation_slot(sig.slot(),
+ asio::bind_executor(pool.get_executor(),
+ asio::bind_immediate_executor(asio::system_executor(),
+ bindns::bind(&increment, &count))))));
+
+ ASIO_CHECK(alloc_count == 1);
+
+ ASIO_REBIND_ALLOC(asio::associated_allocator<handler_type>::type,
+ char) alloc1(asio::get_associated_allocator(h1));
+ alloc1.deallocate(alloc1.allocate(1), 1);
+
+ ASIO_CHECK(alloc_count == 2);
+
+ asio::associated_cancellation_slot<handler_type>::type slot1
+ = asio::get_associated_cancellation_slot(h1);
+
+ ASIO_CHECK(slot1.is_connected());
+
+ slot1.emplace<cancel_handler>(&cancel_count);
+
+ ASIO_CHECK(cancel_count == 0);
+
+ sig.emit(asio::cancellation_type::terminal);
+
+ ASIO_CHECK(cancel_count == 1);
+
+ asio::associated_executor<handler_type>::type ex1
+ = asio::get_associated_executor(h1);
+
+ ASIO_CHECK(ex1 == pool.get_executor());
+
+ asio::associated_immediate_executor<
+ handler_type, asio::thread_pool::executor_type>::type ex2
+ = asio::get_associated_immediate_executor(h1, pool.get_executor());
+
+ ASIO_CHECK(ex2 == asio::system_executor());
+}
+
+void increment_with_error(asio::error_code ec,
+ asio::error_code* out_ec, int* count)
+{
+ *out_ec = ec;
+ ++(*count);
+}
+
+void any_completion_handler_invocation_test()
+{
+ int count = 0;
+ asio::error_code ec;
+
+ asio::any_completion_handler<void()> h1(
+ bindns::bind(&increment, &count));
+
+ ASIO_CHECK(count == 0);
+
+ std::move(h1)();
+
+ ASIO_CHECK(count == 1);
+
+ asio::any_completion_handler<void(asio::error_code)> h2(
+ bindns::bind(&increment_with_error,
+ bindns::placeholders::_1, &ec, &count));
+
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(count == 1);
+
+ std::move(h2)(asio::error::eof);
+
+ ASIO_CHECK(ec == asio::error::eof);
+ ASIO_CHECK(count == 2);
+}
+
+ASIO_TEST_SUITE
+(
+ "any_completion_handler",
+ ASIO_TEST_CASE(any_completion_handler_construction_test)
+ ASIO_TEST_CASE(any_completion_handler_assignment_test)
+ ASIO_TEST_CASE(any_completion_handler_associator_test)
+ ASIO_TEST_CASE(any_completion_handler_invocation_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/any_io_executor.cpp b/3rdparty/asio/src/tests/unit/any_io_executor.cpp
new file mode 100644
index 00000000000..e0a32ba3838
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/any_io_executor.cpp
@@ -0,0 +1,515 @@
+//
+// any_io_executor.cpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/any_io_executor.hpp"
+
+#include <cstring>
+#include <functional>
+#include "asio/system_executor.hpp"
+#include "asio/thread_pool.hpp"
+#include "unit_test.hpp"
+
+using namespace asio;
+namespace bindns = std;
+
+static bool next_nothrow_new_fails = false;
+
+void* operator new(std::size_t n,
+ const std::nothrow_t&) noexcept
+{
+ if (next_nothrow_new_fails)
+ {
+ next_nothrow_new_fails = false;
+ return 0;
+ }
+ return ::operator new(n);
+}
+
+struct fat_executor
+{
+ fat_executor(int id)
+ : id_(id)
+ {
+ std::memset(data_, 0, sizeof(data_));
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ execution_context& query(execution::context_t) const noexcept
+ {
+ return asio::query(system_executor(), execution::context);
+ }
+
+ constexpr static execution::blocking_t::never_t query(
+ execution::blocking_t) noexcept
+ {
+ return execution::blocking.never;
+ }
+
+ friend bool operator==(const fat_executor& a,
+ const fat_executor& b) noexcept
+ {
+ return a.id_ == b.id_;
+ }
+
+ friend bool operator!=(const fat_executor& a,
+ const fat_executor& b) noexcept
+ {
+ return a.id_ != b.id_;
+ }
+
+ int id_;
+ unsigned char data_[1024];
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename F>
+struct execute_member<fat_executor, F>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <>
+struct query_member<fat_executor, execution::context_t>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef execution_context& result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename Property>
+struct query_static_constexpr_member<fat_executor, Property,
+ typename asio::enable_if<
+ asio::is_convertible<
+ Property,
+ asio::execution::blocking_t
+ >::value
+ >::type
+ >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef execution::blocking_t::never_t result_type;
+
+ static constexpr result_type value() noexcept
+ {
+ return result_type();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <>
+struct equality_comparable<fat_executor>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+void increment(int* count)
+{
+ ++(*count);
+}
+
+void any_io_executor_construction_test()
+{
+ thread_pool pool(1);
+ asio::nullptr_t null_ptr = asio::nullptr_t();
+
+ asio::any_io_executor ex1;
+
+ ASIO_CHECK(ex1.target<void>() == 0);
+ ASIO_CHECK(ex1 == null_ptr);
+
+ asio::any_io_executor ex2(null_ptr);
+
+ ASIO_CHECK(ex2.target<void>() == 0);
+ ASIO_CHECK(ex2 == null_ptr);
+ ASIO_CHECK(ex2 == ex1);
+
+ asio::any_io_executor ex3(pool.executor());
+
+ ASIO_CHECK(ex3.target<void>() != 0);
+ ASIO_CHECK(ex3 != null_ptr);
+ ASIO_CHECK(ex3 != ex1);
+
+ asio::any_io_executor ex4(ex1);
+
+ ASIO_CHECK(ex4.target<void>() == 0);
+ ASIO_CHECK(ex4 == null_ptr);
+ ASIO_CHECK(ex4 == ex1);
+
+ asio::any_io_executor ex5(ex3);
+
+ ASIO_CHECK(ex5.target<void>() != 0);
+ ASIO_CHECK(ex5 != null_ptr);
+ ASIO_CHECK(ex5 == ex3);
+
+ asio::any_io_executor ex6 = fat_executor(1);
+
+ ASIO_CHECK(ex6.target<void>() != 0);
+ ASIO_CHECK(ex6 != null_ptr);
+ ASIO_CHECK(ex6 != ex1);
+
+ asio::any_io_executor ex7 = fat_executor(1);
+
+ ASIO_CHECK(ex7.target<void>() != 0);
+ ASIO_CHECK(ex7 != null_ptr);
+ ASIO_CHECK(ex7 != ex1);
+ ASIO_CHECK(ex7 == ex6);
+
+ asio::any_io_executor ex8 = fat_executor(2);
+
+ ASIO_CHECK(ex8.target<void>() != 0);
+ ASIO_CHECK(ex8 != null_ptr);
+ ASIO_CHECK(ex8 != ex1);
+ ASIO_CHECK(ex8 != ex6);
+ ASIO_CHECK(ex8 != ex7);
+
+ asio::any_io_executor ex9(ex6);
+
+ ASIO_CHECK(ex9.target<void>() != 0);
+ ASIO_CHECK(ex9 != null_ptr);
+ ASIO_CHECK(ex9 != ex1);
+ ASIO_CHECK(ex9 == ex6);
+ ASIO_CHECK(ex9 == ex7);
+ ASIO_CHECK(ex9 != ex8);
+
+ asio::any_io_executor ex10(std::move(ex1));
+
+ ASIO_CHECK(ex10.target<void>() == 0);
+ ASIO_CHECK(ex10 == null_ptr);
+ ASIO_CHECK(ex1.target<void>() == 0);
+ ASIO_CHECK(ex1 == null_ptr);
+
+ asio::any_io_executor ex11(std::move(ex3));
+
+ ASIO_CHECK(ex11.target<void>() != 0);
+ ASIO_CHECK(ex11 != null_ptr);
+ ASIO_CHECK(ex3.target<void>() == 0);
+ ASIO_CHECK(ex3 == null_ptr);
+ ASIO_CHECK(ex11 == ex5);
+
+ asio::any_io_executor ex12(std::move(ex7));
+
+ ASIO_CHECK(ex12.target<void>() != 0);
+ ASIO_CHECK(ex12 != null_ptr);
+ ASIO_CHECK(ex7.target<void>() == 0);
+ ASIO_CHECK(ex7 == null_ptr);
+ ASIO_CHECK(ex12 == ex6);
+ ASIO_CHECK(ex12 != ex8);
+}
+
+void any_io_executor_nothrow_construction_test()
+{
+ thread_pool pool(1);
+ asio::nullptr_t null_ptr = asio::nullptr_t();
+
+ asio::any_io_executor ex1;
+
+ ASIO_CHECK(ex1.target<void>() == 0);
+ ASIO_CHECK(ex1 == null_ptr);
+
+ asio::any_io_executor ex2(null_ptr);
+
+ ASIO_CHECK(ex2.target<void>() == 0);
+ ASIO_CHECK(ex2 == null_ptr);
+ ASIO_CHECK(ex2 == ex1);
+
+ asio::any_io_executor ex3(std::nothrow, pool.executor());
+
+ ASIO_CHECK(ex3.target<void>() != 0);
+ ASIO_CHECK(ex3 != null_ptr);
+ ASIO_CHECK(ex3 != ex1);
+
+ asio::any_io_executor ex4(std::nothrow, ex1);
+
+ ASIO_CHECK(ex4.target<void>() == 0);
+ ASIO_CHECK(ex4 == null_ptr);
+ ASIO_CHECK(ex4 == ex1);
+
+ asio::any_io_executor ex5(std::nothrow, ex3);
+
+ ASIO_CHECK(ex5.target<void>() != 0);
+ ASIO_CHECK(ex5 != null_ptr);
+ ASIO_CHECK(ex5 == ex3);
+
+ asio::any_io_executor ex6(std::nothrow, fat_executor(1));
+
+ ASIO_CHECK(ex6.target<void>() != 0);
+ ASIO_CHECK(ex6 != null_ptr);
+ ASIO_CHECK(ex6 != ex1);
+
+ asio::any_io_executor ex7(std::nothrow, fat_executor(1));
+
+ ASIO_CHECK(ex7.target<void>() != 0);
+ ASIO_CHECK(ex7 != null_ptr);
+ ASIO_CHECK(ex7 != ex1);
+ ASIO_CHECK(ex7 == ex6);
+
+ asio::any_io_executor ex8(std::nothrow, fat_executor(2));
+
+ ASIO_CHECK(ex8.target<void>() != 0);
+ ASIO_CHECK(ex8 != null_ptr);
+ ASIO_CHECK(ex8 != ex1);
+ ASIO_CHECK(ex8 != ex6);
+ ASIO_CHECK(ex8 != ex7);
+
+ asio::any_io_executor ex9(std::nothrow, ex6);
+
+ ASIO_CHECK(ex9.target<void>() != 0);
+ ASIO_CHECK(ex9 != null_ptr);
+ ASIO_CHECK(ex9 != ex1);
+ ASIO_CHECK(ex9 == ex6);
+ ASIO_CHECK(ex9 == ex7);
+ ASIO_CHECK(ex9 != ex8);
+
+ asio::any_io_executor ex10(std::nothrow, std::move(ex1));
+
+ ASIO_CHECK(ex10.target<void>() == 0);
+ ASIO_CHECK(ex10 == null_ptr);
+ ASIO_CHECK(ex1.target<void>() == 0);
+ ASIO_CHECK(ex1 == null_ptr);
+
+ asio::any_io_executor ex11(std::nothrow, std::move(ex3));
+
+ ASIO_CHECK(ex11.target<void>() != 0);
+ ASIO_CHECK(ex11 != null_ptr);
+ ASIO_CHECK(ex3.target<void>() == 0);
+ ASIO_CHECK(ex3 == null_ptr);
+ ASIO_CHECK(ex11 == ex5);
+
+ asio::any_io_executor ex12(std::nothrow, std::move(ex7));
+
+ ASIO_CHECK(ex12.target<void>() != 0);
+ ASIO_CHECK(ex12 != null_ptr);
+ ASIO_CHECK(ex7.target<void>() == 0);
+ ASIO_CHECK(ex7 == null_ptr);
+ ASIO_CHECK(ex12 == ex6);
+ ASIO_CHECK(ex12 != ex8);
+
+ next_nothrow_new_fails = true;
+ asio::any_io_executor ex13(std::nothrow, fat_executor(3));
+
+ ASIO_CHECK(ex13.target<void>() == 0);
+ ASIO_CHECK(ex13 == null_ptr);
+ ASIO_CHECK(ex13 == ex1);
+}
+
+void any_io_executor_assignment_test()
+{
+ thread_pool pool(1);
+ asio::nullptr_t null_ptr = asio::nullptr_t();
+
+ asio::any_io_executor ex1;
+
+ asio::any_io_executor ex2;
+ ex2 = null_ptr;
+
+ ASIO_CHECK(ex2.target<void>() == 0);
+
+ asio::any_io_executor ex3;
+ ex3 = pool.executor();
+
+ ASIO_CHECK(ex3.target<void>() != 0);
+
+ asio::any_io_executor ex4;
+ ex4 = ex1;
+
+ ASIO_CHECK(ex4.target<void>() == 0);
+ ASIO_CHECK(ex4 == ex1);
+
+ ex4 = ex3;
+
+ ASIO_CHECK(ex4.target<void>() != 0);
+ ASIO_CHECK(ex4 == ex3);
+
+ asio::any_io_executor ex5;
+ ex5 = fat_executor(1);
+
+ ASIO_CHECK(ex5.target<void>() != 0);
+ ASIO_CHECK(ex5 != null_ptr);
+ ASIO_CHECK(ex5 != ex1);
+
+ asio::any_io_executor ex6;
+ ex6 = fat_executor(1);
+
+ ASIO_CHECK(ex6.target<void>() != 0);
+ ASIO_CHECK(ex6 != null_ptr);
+ ASIO_CHECK(ex6 != ex1);
+ ASIO_CHECK(ex6 == ex5);
+
+ ex6 = fat_executor(2);
+
+ ASIO_CHECK(ex6.target<void>() != 0);
+ ASIO_CHECK(ex6 != null_ptr);
+ ASIO_CHECK(ex6 != ex1);
+ ASIO_CHECK(ex6 != ex5);
+
+ asio::any_io_executor ex7;
+ ex7 = ex5;
+
+ ASIO_CHECK(ex7.target<void>() != 0);
+ ASIO_CHECK(ex7 != null_ptr);
+ ASIO_CHECK(ex7 != ex1);
+ ASIO_CHECK(ex7 == ex5);
+ ASIO_CHECK(ex7 != ex6);
+
+ asio::any_io_executor ex8;
+ ex8 = std::move(ex1);
+
+ ASIO_CHECK(ex8.target<void>() == 0);
+ ASIO_CHECK(ex1.target<void>() == 0);
+
+ ex8 = std::move(ex3);
+
+ ASIO_CHECK(ex8.target<void>() != 0);
+ ASIO_CHECK(ex3.target<void>() == 0);
+ ASIO_CHECK(ex8 == ex4);
+
+ ex8 = std::move(ex5);
+
+ ASIO_CHECK(ex8.target<void>() != 0);
+ ASIO_CHECK(ex5.target<void>() == 0);
+ ASIO_CHECK(ex8 == ex7);
+}
+
+void any_io_executor_swap_test()
+{
+ thread_pool pool1(1);
+ thread_pool pool2(1);
+
+ asio::any_io_executor ex1(pool1.executor());
+ asio::any_io_executor ex2(pool2.executor());
+
+ asio::any_io_executor ex3(ex1);
+ asio::any_io_executor ex4(ex2);
+
+ ASIO_CHECK(ex3 == ex1);
+ ASIO_CHECK(ex4 == ex2);
+
+ ex3.swap(ex4);
+
+ ASIO_CHECK(ex3 == ex2);
+ ASIO_CHECK(ex4 == ex1);
+
+ execution::swap(ex3, ex4);
+
+ ASIO_CHECK(ex3 == ex1);
+ ASIO_CHECK(ex4 == ex2);
+}
+
+void any_io_executor_query_test()
+{
+ thread_pool pool(1);
+ asio::any_io_executor ex(pool.executor());
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::blocking)
+ == asio::execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::blocking.possibly)
+ == asio::execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::outstanding_work)
+ == asio::execution::outstanding_work.untracked);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::outstanding_work.untracked)
+ == asio::execution::outstanding_work.untracked);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::relationship)
+ == asio::execution::relationship.fork);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::relationship.fork)
+ == asio::execution::relationship.fork);
+}
+
+void any_io_executor_execute_test()
+{
+ int count = 0;
+ thread_pool pool(1);
+ asio::any_io_executor ex(pool.executor());
+
+ ex.execute(bindns::bind(increment, &count));
+
+ asio::prefer(ex, asio::execution::blocking.possibly).execute(
+ bindns::bind(increment, &count));
+
+ asio::require(ex, asio::execution::blocking.never).execute(
+ bindns::bind(increment, &count));
+
+ asio::require(
+ asio::prefer(ex, asio::execution::outstanding_work.tracked),
+ asio::execution::blocking.never
+ ).execute(bindns::bind(increment, &count));
+
+ asio::require(
+ asio::prefer(ex,
+ asio::execution::outstanding_work.untracked),
+ asio::execution::blocking.never
+ ).execute(bindns::bind(increment, &count));
+
+ asio::require(
+ asio::prefer(ex,
+ asio::execution::outstanding_work.untracked,
+ asio::execution::relationship.continuation),
+ asio::execution::blocking.never
+ ).execute(bindns::bind(increment, &count));
+
+ pool.wait();
+
+ ASIO_CHECK(count == 6);
+}
+
+ASIO_TEST_SUITE
+(
+ "any_io_executor",
+ ASIO_TEST_CASE(any_io_executor_construction_test)
+ ASIO_TEST_CASE(any_io_executor_nothrow_construction_test)
+ ASIO_TEST_CASE(any_io_executor_assignment_test)
+ ASIO_TEST_CASE(any_io_executor_swap_test)
+ ASIO_TEST_CASE(any_io_executor_query_test)
+ ASIO_TEST_CASE(any_io_executor_execute_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/append.cpp b/3rdparty/asio/src/tests/unit/append.cpp
new file mode 100644
index 00000000000..9aa00e3bfa4
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/append.cpp
@@ -0,0 +1,58 @@
+//
+// append.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/append.hpp"
+
+#include "asio/bind_executor.hpp"
+#include "asio/io_context.hpp"
+#include "asio/post.hpp"
+#include "asio/system_timer.hpp"
+#include "unit_test.hpp"
+
+void append_test()
+{
+ asio::io_context io1;
+ asio::io_context io2;
+ asio::system_timer timer1(io1);
+ int count = 0;
+
+ timer1.expires_after(asio::chrono::seconds(0));
+ timer1.async_wait(
+ asio::append(
+ asio::bind_executor(io2.get_executor(),
+ [&count](asio::error_code, int a, int b)
+ {
+ ++count;
+ ASIO_CHECK(a == 123);
+ ASIO_CHECK(b == 321);
+ }), 123, 321));
+
+ ASIO_CHECK(count == 0);
+
+ io1.run();
+
+ ASIO_CHECK(count == 0);
+
+ io2.run();
+
+ ASIO_CHECK(count == 1);
+}
+
+ASIO_TEST_SUITE
+(
+ "append",
+ ASIO_TEST_CASE(append_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/archetypes/async_ops.hpp b/3rdparty/asio/src/tests/unit/archetypes/async_ops.hpp
new file mode 100644
index 00000000000..3c2b1308bd8
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/archetypes/async_ops.hpp
@@ -0,0 +1,413 @@
+//
+// archetypes/async_ops.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ARCHETYPES_ASYNC_OPS_HPP
+#define ARCHETYPES_ASYNC_OPS_HPP
+
+#include <functional>
+#include "asio/associated_allocator.hpp"
+#include "asio/associated_executor.hpp"
+#include "asio/async_result.hpp"
+#include "asio/error.hpp"
+
+namespace archetypes {
+
+namespace bindns = std;
+
+template <typename CompletionToken>
+typename asio::async_result<asio::decay_t<CompletionToken>,
+ void()>::return_type
+async_op_0(CompletionToken&& token)
+{
+ typedef typename asio::async_result<asio::decay_t<CompletionToken>,
+ void()>::completion_handler_type handler_type;
+
+ asio::async_completion<CompletionToken,
+ void()> completion(token);
+
+ typename asio::associated_allocator<handler_type>::type a
+ = asio::get_associated_allocator(completion.completion_handler);
+
+ typename asio::associated_executor<handler_type>::type ex
+ = asio::get_associated_executor(completion.completion_handler);
+
+ ex.post(static_cast<handler_type&&>(completion.completion_handler), a);
+
+ return completion.result.get();
+}
+
+template <typename CompletionToken>
+typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(asio::error_code)>::return_type
+async_op_ec_0(bool ok, ASIO_MOVE_ARG(CompletionToken) token)
+{
+ typedef typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(asio::error_code)>::completion_handler_type handler_type;
+
+ asio::async_completion<CompletionToken,
+ void(asio::error_code)> completion(token);
+
+ typename asio::associated_allocator<handler_type>::type a
+ = asio::get_associated_allocator(completion.completion_handler);
+
+ typename asio::associated_executor<handler_type>::type ex
+ = asio::get_associated_executor(completion.completion_handler);
+
+ if (ok)
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ asio::error_code()), a);
+ }
+ else
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ asio::error_code(asio::error::operation_aborted)), a);
+ }
+
+ return completion.result.get();
+}
+
+template <typename CompletionToken>
+typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(std::exception_ptr)>::return_type
+async_op_ex_0(bool ok, ASIO_MOVE_ARG(CompletionToken) token)
+{
+ typedef typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(std::exception_ptr)>::completion_handler_type handler_type;
+
+ asio::async_completion<CompletionToken,
+ void(std::exception_ptr)> completion(token);
+
+ typename asio::associated_allocator<handler_type>::type a
+ = asio::get_associated_allocator(completion.completion_handler);
+
+ typename asio::associated_executor<handler_type>::type ex
+ = asio::get_associated_executor(completion.completion_handler);
+
+ if (ok)
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ std::exception_ptr()), a);
+ }
+ else
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ std::make_exception_ptr(std::runtime_error("blah"))), a);
+ }
+
+ return completion.result.get();
+}
+
+template <typename CompletionToken>
+typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(int)>::return_type
+async_op_1(ASIO_MOVE_ARG(CompletionToken) token)
+{
+ typedef typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(int)>::completion_handler_type handler_type;
+
+ asio::async_completion<CompletionToken,
+ void(int)> completion(token);
+
+ typename asio::associated_allocator<handler_type>::type a
+ = asio::get_associated_allocator(completion.completion_handler);
+
+ typename asio::associated_executor<handler_type>::type ex
+ = asio::get_associated_executor(completion.completion_handler);
+
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ 42), a);
+
+ return completion.result.get();
+}
+
+template <typename CompletionToken>
+typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(asio::error_code, int)>::return_type
+async_op_ec_1(bool ok, ASIO_MOVE_ARG(CompletionToken) token)
+{
+ typedef typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(asio::error_code, int)>::completion_handler_type
+ handler_type;
+
+ asio::async_completion<CompletionToken,
+ void(asio::error_code, int)> completion(token);
+
+ typename asio::associated_allocator<handler_type>::type a
+ = asio::get_associated_allocator(completion.completion_handler);
+
+ typename asio::associated_executor<handler_type>::type ex
+ = asio::get_associated_executor(completion.completion_handler);
+
+ if (ok)
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ asio::error_code(), 42), a);
+ }
+ else
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ asio::error_code(asio::error::operation_aborted),
+ 0), a);
+ }
+
+ return completion.result.get();
+}
+
+template <typename CompletionToken>
+typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(std::exception_ptr, int)>::return_type
+async_op_ex_1(bool ok, ASIO_MOVE_ARG(CompletionToken) token)
+{
+ typedef typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(std::exception_ptr, int)>::completion_handler_type
+ handler_type;
+
+ asio::async_completion<CompletionToken,
+ void(std::exception_ptr, int)> completion(token);
+
+ typename asio::associated_allocator<handler_type>::type a
+ = asio::get_associated_allocator(completion.completion_handler);
+
+ typename asio::associated_executor<handler_type>::type ex
+ = asio::get_associated_executor(completion.completion_handler);
+
+ if (ok)
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ std::exception_ptr(), 42), a);
+ }
+ else
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ std::make_exception_ptr(std::runtime_error("blah")), 0), a);
+ }
+
+ return completion.result.get();
+}
+
+template <typename CompletionToken>
+typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(int, double)>::return_type
+async_op_2(ASIO_MOVE_ARG(CompletionToken) token)
+{
+ typedef typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(int, double)>::completion_handler_type handler_type;
+
+ asio::async_completion<CompletionToken,
+ void(int, double)> completion(token);
+
+ typename asio::associated_allocator<handler_type>::type a
+ = asio::get_associated_allocator(completion.completion_handler);
+
+ typename asio::associated_executor<handler_type>::type ex
+ = asio::get_associated_executor(completion.completion_handler);
+
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ 42, 2.0), a);
+
+ return completion.result.get();
+}
+
+template <typename CompletionToken>
+typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(asio::error_code, int, double)>::return_type
+async_op_ec_2(bool ok, ASIO_MOVE_ARG(CompletionToken) token)
+{
+ typedef typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(asio::error_code, int, double)>::completion_handler_type
+ handler_type;
+
+ asio::async_completion<CompletionToken,
+ void(asio::error_code, int, double)> completion(token);
+
+ typename asio::associated_allocator<handler_type>::type a
+ = asio::get_associated_allocator(completion.completion_handler);
+
+ typename asio::associated_executor<handler_type>::type ex
+ = asio::get_associated_executor(completion.completion_handler);
+
+ if (ok)
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ asio::error_code(), 42, 2.0), a);
+ }
+ else
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ asio::error_code(asio::error::operation_aborted),
+ 0, 0.0), a);
+ }
+
+ return completion.result.get();
+}
+
+template <typename CompletionToken>
+typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(std::exception_ptr, int, double)>::return_type
+async_op_ex_2(bool ok, ASIO_MOVE_ARG(CompletionToken) token)
+{
+ typedef typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(std::exception_ptr, int, double)>::completion_handler_type
+ handler_type;
+
+ asio::async_completion<CompletionToken,
+ void(std::exception_ptr, int, double)> completion(token);
+
+ typename asio::associated_allocator<handler_type>::type a
+ = asio::get_associated_allocator(completion.completion_handler);
+
+ typename asio::associated_executor<handler_type>::type ex
+ = asio::get_associated_executor(completion.completion_handler);
+
+ if (ok)
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ std::exception_ptr(), 42, 2.0), a);
+ }
+ else
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ std::make_exception_ptr(std::runtime_error("blah")), 0, 0.0), a);
+ }
+
+ return completion.result.get();
+}
+
+template <typename CompletionToken>
+typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(int, double, char)>::return_type
+async_op_3(ASIO_MOVE_ARG(CompletionToken) token)
+{
+ typedef typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(int, double, char)>::completion_handler_type handler_type;
+
+ asio::async_completion<CompletionToken,
+ void(int, double, char)> completion(token);
+
+ typename asio::associated_allocator<handler_type>::type a
+ = asio::get_associated_allocator(completion.completion_handler);
+
+ typename asio::associated_executor<handler_type>::type ex
+ = asio::get_associated_executor(completion.completion_handler);
+
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ 42, 2.0, 'a'), a);
+
+ return completion.result.get();
+}
+
+template <typename CompletionToken>
+typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(asio::error_code, int, double, char)>::return_type
+async_op_ec_3(bool ok, ASIO_MOVE_ARG(CompletionToken) token)
+{
+ typedef typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(asio::error_code, int, double, char)>::completion_handler_type
+ handler_type;
+
+ asio::async_completion<CompletionToken,
+ void(asio::error_code, int, double, char)> completion(token);
+
+ typename asio::associated_allocator<handler_type>::type a
+ = asio::get_associated_allocator(completion.completion_handler);
+
+ typename asio::associated_executor<handler_type>::type ex
+ = asio::get_associated_executor(completion.completion_handler);
+
+ if (ok)
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ asio::error_code(), 42, 2.0, 'a'), a);
+ }
+ else
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ asio::error_code(asio::error::operation_aborted),
+ 0, 0.0, 'z'), a);
+ }
+
+ return completion.result.get();
+}
+
+template <typename CompletionToken>
+typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(std::exception_ptr, int, double, char)>::return_type
+async_op_ex_3(bool ok, ASIO_MOVE_ARG(CompletionToken) token)
+{
+ typedef typename asio::async_result<asio::decay_t<CompletionToken>,
+ void(std::exception_ptr, int, double, char)>::completion_handler_type
+ handler_type;
+
+ asio::async_completion<CompletionToken,
+ void(std::exception_ptr, int, double, char)> completion(token);
+
+ typename asio::associated_allocator<handler_type>::type a
+ = asio::get_associated_allocator(completion.completion_handler);
+
+ typename asio::associated_executor<handler_type>::type ex
+ = asio::get_associated_executor(completion.completion_handler);
+
+ if (ok)
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ std::exception_ptr(), 42, 2.0, 'a'), a);
+ }
+ else
+ {
+ ex.post(
+ bindns::bind(
+ static_cast<handler_type&&>(completion.completion_handler),
+ std::make_exception_ptr(std::runtime_error("blah")),
+ 0, 0.0, 'z'), a);
+ }
+
+ return completion.result.get();
+}
+
+} // namespace archetypes
+
+#endif // ARCHETYPES_ASYNC_OPS_HPP
diff --git a/3rdparty/asio/src/tests/unit/archetypes/async_result.hpp b/3rdparty/asio/src/tests/unit/archetypes/async_result.hpp
new file mode 100644
index 00000000000..bfd9cf1aac2
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/archetypes/async_result.hpp
@@ -0,0 +1,150 @@
+//
+// async_result.hpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ARCHETYPES_ASYNC_RESULT_HPP
+#define ARCHETYPES_ASYNC_RESULT_HPP
+
+#include <asio/async_result.hpp>
+#include <asio/system_executor.hpp>
+
+namespace archetypes {
+
+struct immediate_handler
+{
+};
+
+struct lazy_handler
+{
+};
+
+template <typename Signature>
+struct concrete_handler;
+
+template <typename R, typename Arg1>
+struct concrete_handler<R(Arg1)>
+{
+ concrete_handler()
+ {
+ }
+
+ void operator()(typename asio::decay<Arg1>::type)
+ {
+ }
+
+ concrete_handler(concrete_handler&&) {}
+private:
+ concrete_handler(const concrete_handler&);
+};
+
+template <typename R, typename Arg1, typename Arg2>
+struct concrete_handler<R(Arg1, Arg2)>
+{
+ concrete_handler()
+ {
+ }
+
+ void operator()(typename asio::decay<Arg1>::type,
+ typename asio::decay<Arg2>::type)
+ {
+ }
+};
+
+template <typename Signature>
+struct immediate_concrete_handler : concrete_handler<Signature>
+{
+ typedef asio::system_executor immediate_executor_type;
+
+ immediate_concrete_handler(immediate_handler)
+ {
+ }
+
+ immediate_executor_type get_immediate_executor() const noexcept
+ {
+ return immediate_executor_type();
+ }
+
+ immediate_concrete_handler(immediate_concrete_handler&&) {}
+private:
+ immediate_concrete_handler(const immediate_concrete_handler&);
+};
+
+template <typename Signature>
+struct lazy_concrete_handler : concrete_handler<Signature>
+{
+ lazy_concrete_handler(lazy_handler)
+ {
+ }
+
+ lazy_concrete_handler(lazy_concrete_handler&&) {}
+private:
+ lazy_concrete_handler(const lazy_concrete_handler&);
+};
+
+} // namespace archetypes
+
+namespace asio {
+
+template <typename Signature>
+class async_result<archetypes::immediate_handler, Signature>
+{
+public:
+ // The concrete completion handler type.
+ typedef archetypes::immediate_concrete_handler<Signature>
+ completion_handler_type;
+
+ // The return type of the initiating function.
+ typedef void return_type;
+
+ // Construct an async_result from a given handler.
+ explicit async_result(completion_handler_type&)
+ {
+ }
+
+ // Obtain the value to be returned from the initiating function.
+ void get()
+ {
+ }
+
+private:
+ // Disallow copying and assignment.
+ async_result(const async_result&) = delete;
+ async_result& operator=(const async_result&) = delete;
+};
+
+template <typename Signature>
+class async_result<archetypes::lazy_handler, Signature>
+{
+public:
+ // The concrete completion handler type.
+ typedef archetypes::lazy_concrete_handler<Signature> completion_handler_type;
+
+ // The return type of the initiating function.
+ typedef int return_type;
+
+ // Construct an async_result from a given handler.
+ explicit async_result(completion_handler_type&)
+ {
+ }
+
+ // Obtain the value to be returned from the initiating function.
+ return_type get()
+ {
+ return 42;
+ }
+
+private:
+ // Disallow copying and assignment.
+ async_result(const async_result&) = delete;
+ async_result& operator=(const async_result&) = delete;
+};
+
+} // namespace asio
+
+#endif // ARCHETYPES_ASYNC_RESULT_HPP
diff --git a/3rdparty/asio/src/tests/unit/archetypes/gettable_socket_option.hpp b/3rdparty/asio/src/tests/unit/archetypes/gettable_socket_option.hpp
new file mode 100644
index 00000000000..e1c2d3f0d4e
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/archetypes/gettable_socket_option.hpp
@@ -0,0 +1,54 @@
+//
+// gettable_socket_option.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ARCHETYPES_GETTABLE_SOCKET_OPTION_HPP
+#define ARCHETYPES_GETTABLE_SOCKET_OPTION_HPP
+
+#include <cstddef>
+
+namespace archetypes {
+
+template <typename PointerType>
+class gettable_socket_option
+{
+public:
+ template <typename Protocol>
+ int level(const Protocol&) const
+ {
+ return 0;
+ }
+
+ template <typename Protocol>
+ int name(const Protocol&) const
+ {
+ return 0;
+ }
+
+ template <typename Protocol>
+ PointerType* data(const Protocol&)
+ {
+ return 0;
+ }
+
+ template <typename Protocol>
+ std::size_t size(const Protocol&) const
+ {
+ return 0;
+ }
+
+ template <typename Protocol>
+ void resize(const Protocol&, std::size_t)
+ {
+ }
+};
+
+} // namespace archetypes
+
+#endif // ARCHETYPES_GETTABLE_SOCKET_OPTION_HPP
diff --git a/3rdparty/asio/src/tests/unit/archetypes/io_control_command.hpp b/3rdparty/asio/src/tests/unit/archetypes/io_control_command.hpp
new file mode 100644
index 00000000000..45ed07cf481
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/archetypes/io_control_command.hpp
@@ -0,0 +1,32 @@
+//
+// io_control_command.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ARCHETYPES_IO_CONTROL_COMMAND_HPP
+#define ARCHETYPES_IO_CONTROL_COMMAND_HPP
+
+namespace archetypes {
+
+class io_control_command
+{
+public:
+ int name() const
+ {
+ return 0;
+ }
+
+ void* data()
+ {
+ return 0;
+ }
+};
+
+} // namespace archetypes
+
+#endif // ARCHETYPES_IO_CONTROL_COMMAND_HPP
diff --git a/3rdparty/asio/src/tests/unit/archetypes/settable_socket_option.hpp b/3rdparty/asio/src/tests/unit/archetypes/settable_socket_option.hpp
new file mode 100644
index 00000000000..7a5867ba800
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/archetypes/settable_socket_option.hpp
@@ -0,0 +1,49 @@
+//
+// settable_socket_option.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef ARCHETYPES_SETTABLE_SOCKET_OPTION_HPP
+#define ARCHETYPES_SETTABLE_SOCKET_OPTION_HPP
+
+#include <cstddef>
+
+namespace archetypes {
+
+template <typename PointerType>
+class settable_socket_option
+{
+public:
+ template <typename Protocol>
+ int level(const Protocol&) const
+ {
+ return 0;
+ }
+
+ template <typename Protocol>
+ int name(const Protocol&) const
+ {
+ return 0;
+ }
+
+ template <typename Protocol>
+ const PointerType* data(const Protocol&) const
+ {
+ return 0;
+ }
+
+ template <typename Protocol>
+ std::size_t size(const Protocol&) const
+ {
+ return 0;
+ }
+};
+
+} // namespace archetypes
+
+#endif // ARCHETYPES_SETTABLE_SOCKET_OPTION_HPP
diff --git a/3rdparty/asio/src/tests/unit/as_tuple.cpp b/3rdparty/asio/src/tests/unit/as_tuple.cpp
new file mode 100644
index 00000000000..a176d95bb2e
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/as_tuple.cpp
@@ -0,0 +1,122 @@
+//
+// as_tuple.cpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/as_tuple.hpp"
+
+#include "asio/bind_executor.hpp"
+#include "asio/deferred.hpp"
+#include "asio/io_context.hpp"
+#include "asio/post.hpp"
+#include "asio/system_timer.hpp"
+#include "asio/use_future.hpp"
+#include "unit_test.hpp"
+
+void as_tuple_test()
+{
+ asio::io_context io1;
+ asio::io_context io2;
+ asio::system_timer timer1(io1);
+ int count = 0;
+
+ timer1.expires_after(asio::chrono::seconds(0));
+ timer1.async_wait(
+ asio::as_tuple(
+ asio::bind_executor(io2.get_executor(),
+ [&count](std::tuple<asio::error_code>)
+ {
+ ++count;
+ })));
+
+ ASIO_CHECK(count == 0);
+
+ io1.run();
+
+ ASIO_CHECK(count == 0);
+
+ io2.run();
+
+ ASIO_CHECK(count == 1);
+
+ timer1.async_wait(
+ asio::as_tuple(
+ asio::bind_executor(io2.get_executor(),
+ asio::deferred)))(
+ [&count](std::tuple<asio::error_code>)
+ {
+ ++count;
+ });
+
+ ASIO_CHECK(count == 1);
+
+ io1.restart();
+ io1.run();
+
+ ASIO_CHECK(count == 1);
+
+ io2.restart();
+ io2.run();
+
+ ASIO_CHECK(count == 2);
+
+# if defined(ASIO_HAS_STD_FUTURE_CLASS)
+ std::future<std::tuple<asio::error_code> > f = timer1.async_wait(
+ asio::as_tuple(
+ asio::bind_executor(io2.get_executor(),
+ asio::use_future)));
+
+ ASIO_CHECK(f.wait_for(std::chrono::seconds(0))
+ == std::future_status::timeout);
+
+ io1.restart();
+ io1.run();
+
+ ASIO_CHECK(f.wait_for(std::chrono::seconds(0))
+ == std::future_status::timeout);
+
+ io2.restart();
+ io2.run();
+
+ ASIO_CHECK(f.wait_for(std::chrono::seconds(0))
+ == std::future_status::ready);
+# endif // defined(ASIO_HAS_STD_FUTURE_CLASS)
+}
+
+void as_tuple_constness_test()
+{
+# if defined(ASIO_HAS_STD_FUTURE_CLASS)
+ asio::io_context io1;
+ asio::system_timer timer1(io1);
+
+ auto tok1 = asio::as_tuple(asio::use_future);
+ (void)timer1.async_wait(tok1);
+ (void)timer1.async_wait(std::move(tok1));
+
+ const auto tok2 = asio::as_tuple(asio::use_future);
+ (void)timer1.async_wait(tok2);
+ (void)timer1.async_wait(std::move(tok2));
+
+ constexpr auto tok3 = asio::as_tuple(asio::use_future);
+ (void)timer1.async_wait(tok3);
+ (void)timer1.async_wait(std::move(tok3));
+# endif // defined(ASIO_HAS_STD_FUTURE_CLASS)
+}
+
+ASIO_TEST_SUITE
+(
+ "as_tuple",
+ ASIO_TEST_CASE(as_tuple_test)
+ ASIO_COMPILE_TEST_CASE(as_tuple_constness_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/associated_allocator.cpp b/3rdparty/asio/src/tests/unit/associated_allocator.cpp
new file mode 100644
index 00000000000..69a8afb0d41
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/associated_allocator.cpp
@@ -0,0 +1,25 @@
+//
+// associated_allocator.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/associated_allocator.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "associated_allocator",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/associated_cancellation_slot.cpp b/3rdparty/asio/src/tests/unit/associated_cancellation_slot.cpp
new file mode 100644
index 00000000000..96d488458cb
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/associated_cancellation_slot.cpp
@@ -0,0 +1,25 @@
+//
+// associated_cancellation_slot.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/associated_cancellation_slot.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "associated_cancellation_slot",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/associated_executor.cpp b/3rdparty/asio/src/tests/unit/associated_executor.cpp
new file mode 100644
index 00000000000..60b1f00657f
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/associated_executor.cpp
@@ -0,0 +1,25 @@
+//
+// associated_executor.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/associated_executor.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "associated_executor",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/associated_immediate_executor.cpp b/3rdparty/asio/src/tests/unit/associated_immediate_executor.cpp
new file mode 100644
index 00000000000..f085a2cfcee
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/associated_immediate_executor.cpp
@@ -0,0 +1,25 @@
+//
+// associated_immediate_executor.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/associated_immediate_executor.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "associated_immediate_executor",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/associator.cpp b/3rdparty/asio/src/tests/unit/associator.cpp
new file mode 100644
index 00000000000..a35d95c66e0
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/associator.cpp
@@ -0,0 +1,25 @@
+//
+// associator.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/associator.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "associator",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/async_result.cpp b/3rdparty/asio/src/tests/unit/async_result.cpp
new file mode 100644
index 00000000000..75a4e91b71e
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/async_result.cpp
@@ -0,0 +1,25 @@
+//
+// async_result.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/async_result.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "async_result",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/awaitable.cpp b/3rdparty/asio/src/tests/unit/awaitable.cpp
new file mode 100644
index 00000000000..39ca8ddfdbe
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/awaitable.cpp
@@ -0,0 +1,25 @@
+//
+// awaitable.cpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/awaitable.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "awaitable",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_datagram_socket.cpp b/3rdparty/asio/src/tests/unit/basic_datagram_socket.cpp
new file mode 100644
index 00000000000..44fa2561646
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_datagram_socket.cpp
@@ -0,0 +1,25 @@
+//
+// basic_datagram_socket.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_datagram_socket.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_datagram_socket",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_deadline_timer.cpp b/3rdparty/asio/src/tests/unit/basic_deadline_timer.cpp
new file mode 100644
index 00000000000..ec6a6e37d18
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_deadline_timer.cpp
@@ -0,0 +1,25 @@
+//
+// basic_deadline_timer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_deadline_timer.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_deadline_timer",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_file.cpp b/3rdparty/asio/src/tests/unit/basic_file.cpp
new file mode 100644
index 00000000000..5308d1268b0
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_file.cpp
@@ -0,0 +1,25 @@
+//
+// basic_file.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_file.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_file",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_random_access_file.cpp b/3rdparty/asio/src/tests/unit/basic_random_access_file.cpp
new file mode 100644
index 00000000000..fffaee3e8a2
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_random_access_file.cpp
@@ -0,0 +1,25 @@
+//
+// basic_random_access_file.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_random_access_file.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_random_access_file",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_raw_socket.cpp b/3rdparty/asio/src/tests/unit/basic_raw_socket.cpp
new file mode 100644
index 00000000000..127df060b0c
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_raw_socket.cpp
@@ -0,0 +1,25 @@
+//
+// basic_raw_socket.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_raw_socket.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_raw_socket",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_readable_pipe.cpp b/3rdparty/asio/src/tests/unit/basic_readable_pipe.cpp
new file mode 100644
index 00000000000..f390acf4f98
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_readable_pipe.cpp
@@ -0,0 +1,25 @@
+//
+// basic_readable_pipe.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_readable_pipe.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_readable_pipe",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_seq_packet_socket.cpp b/3rdparty/asio/src/tests/unit/basic_seq_packet_socket.cpp
new file mode 100644
index 00000000000..c8b9bfa67bc
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_seq_packet_socket.cpp
@@ -0,0 +1,25 @@
+//
+// basic_seq_packet_socket.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_seq_packet_socket.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_seq_packet_socket",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_serial_port.cpp b/3rdparty/asio/src/tests/unit/basic_serial_port.cpp
new file mode 100644
index 00000000000..1a64348a989
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_serial_port.cpp
@@ -0,0 +1,26 @@
+//
+// basic_serial_port.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_serial_port.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_serial_port",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_signal_set.cpp b/3rdparty/asio/src/tests/unit/basic_signal_set.cpp
new file mode 100644
index 00000000000..01340178e69
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_signal_set.cpp
@@ -0,0 +1,25 @@
+//
+// basic_signal_set.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_signal_set.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_signal_set",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_socket.cpp b/3rdparty/asio/src/tests/unit/basic_socket.cpp
new file mode 100644
index 00000000000..c2814e6b96d
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_socket.cpp
@@ -0,0 +1,25 @@
+//
+// basic_socket.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_socket.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_socket",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_socket_acceptor.cpp b/3rdparty/asio/src/tests/unit/basic_socket_acceptor.cpp
new file mode 100644
index 00000000000..021a81628ae
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_socket_acceptor.cpp
@@ -0,0 +1,25 @@
+//
+// basic_socket_acceptor.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_socket_acceptor.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_socket_acceptor",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_stream_file.cpp b/3rdparty/asio/src/tests/unit/basic_stream_file.cpp
new file mode 100644
index 00000000000..9902122c9cb
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_stream_file.cpp
@@ -0,0 +1,25 @@
+//
+// basic_stream_file.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_stream_file.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_stream_file",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_stream_socket.cpp b/3rdparty/asio/src/tests/unit/basic_stream_socket.cpp
new file mode 100644
index 00000000000..1edbe5a530c
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_stream_socket.cpp
@@ -0,0 +1,25 @@
+//
+// basic_stream_socket.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_stream_socket.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_stream_socket",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_streambuf.cpp b/3rdparty/asio/src/tests/unit/basic_streambuf.cpp
new file mode 100644
index 00000000000..9529dd801fe
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_streambuf.cpp
@@ -0,0 +1,25 @@
+//
+// basic_streambuf.cpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_streambuf.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_streambuf",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_waitable_timer.cpp b/3rdparty/asio/src/tests/unit/basic_waitable_timer.cpp
new file mode 100644
index 00000000000..9d6be41b754
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_waitable_timer.cpp
@@ -0,0 +1,25 @@
+//
+// basic_waitable_timer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_waitable_timer.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_waitable_timer",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/basic_writable_pipe.cpp b/3rdparty/asio/src/tests/unit/basic_writable_pipe.cpp
new file mode 100644
index 00000000000..fc0d0fdd955
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/basic_writable_pipe.cpp
@@ -0,0 +1,25 @@
+//
+// basic_writable_pipe.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/basic_writable_pipe.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "basic_writable_pipe",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/bind_allocator.cpp b/3rdparty/asio/src/tests/unit/bind_allocator.cpp
new file mode 100644
index 00000000000..b7c11ffb53c
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/bind_allocator.cpp
@@ -0,0 +1,237 @@
+//
+// bind_allocator.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/bind_allocator.hpp"
+
+#include <functional>
+#include "asio/io_context.hpp"
+#include "asio/steady_timer.hpp"
+#include "unit_test.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)
+
+using namespace asio;
+namespace bindns = std;
+
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+typedef deadline_timer timer;
+namespace chronons = boost::posix_time;
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
+typedef steady_timer timer;
+namespace chronons = asio::chrono;
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+
+template <typename T>
+class test_allocator
+{
+public:
+ typedef T value_type;
+
+ explicit test_allocator(int* allocations)
+ : allocations_(allocations)
+ {
+ }
+
+ template <typename U>
+ test_allocator(const test_allocator<U>& other)
+ : allocations_(other.allocations_)
+ {
+ }
+
+ template <typename U>
+ struct rebind
+ {
+ typedef test_allocator<U> other;
+ };
+
+ bool operator==(const test_allocator&) const
+ {
+ return true;
+ }
+
+ bool operator!=(const test_allocator&) const
+ {
+ return false;
+ }
+
+ T* allocate(std::size_t n) const
+ {
+ ++(*allocations_);
+ return static_cast<T*>(::operator new(sizeof(T) * n));
+ }
+
+ void deallocate(T* p, std::size_t /*n*/) const
+ {
+ --(*allocations_);
+ ::operator delete(p);
+ }
+
+//private:
+ int* allocations_;
+};
+
+void increment(int* count)
+{
+ ++(*count);
+}
+
+void bind_allocator_to_function_object_test()
+{
+ io_context ioc;
+
+ int count = 0;
+ int allocations = 0;
+
+ timer t(ioc, chronons::seconds(1));
+ t.async_wait(
+ bind_allocator(
+ test_allocator<int>(&allocations),
+ bindns::bind(&increment, &count)));
+
+ ASIO_CHECK(count == 0);
+ ASIO_CHECK(allocations == 1);
+
+ ioc.run();
+
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(allocations == 0);
+
+ t.async_wait(
+ bind_allocator(
+ test_allocator<int>(&allocations),
+ bind_allocator(
+ std::allocator<void>(),
+ bindns::bind(&increment, &count))));
+
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(allocations == 1);
+
+ ioc.restart();
+ ioc.run();
+
+ ASIO_CHECK(count == 2);
+ ASIO_CHECK(allocations == 0);
+}
+
+struct incrementer_token_v1
+{
+ explicit incrementer_token_v1(int* c) : count(c) {}
+ int* count;
+};
+
+struct incrementer_handler_v1
+{
+ explicit incrementer_handler_v1(incrementer_token_v1 t) : count(t.count) {}
+ void operator()(asio::error_code){ increment(count); }
+ int* count;
+};
+
+namespace asio {
+
+template <>
+class async_result<incrementer_token_v1, void(asio::error_code)>
+{
+public:
+ typedef incrementer_handler_v1 completion_handler_type;
+ typedef void return_type;
+ explicit async_result(completion_handler_type&) {}
+ return_type get() {}
+};
+
+} // namespace asio
+
+void bind_allocator_to_completion_token_v1_test()
+{
+ io_context ioc;
+
+ int count = 0;
+ int allocations = 0;
+
+ timer t(ioc, chronons::seconds(1));
+ t.async_wait(
+ bind_allocator(
+ test_allocator<int>(&allocations),
+ incrementer_token_v1(&count)));
+
+ ASIO_CHECK(count == 0);
+ ASIO_CHECK(allocations == 1);
+
+ ioc.run();
+
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(allocations == 0);
+}
+
+struct incrementer_token_v2
+{
+ explicit incrementer_token_v2(int* c) : count(c) {}
+ int* count;
+};
+
+namespace asio {
+
+template <>
+class async_result<incrementer_token_v2, void(asio::error_code)>
+{
+public:
+#if !defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+ typedef void return_type;
+#endif // !defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+
+ template <typename Initiation, typename... Args>
+ static void initiate(Initiation initiation,
+ incrementer_token_v2 token, Args&&... args)
+ {
+ initiation(bindns::bind(&increment, token.count),
+ static_cast<Args&&>(args)...);
+ }
+};
+
+} // namespace asio
+
+void bind_allocator_to_completion_token_v2_test()
+{
+ io_context ioc;
+
+ int count = 0;
+ int allocations = 0;
+
+ timer t(ioc, chronons::seconds(1));
+ t.async_wait(
+ bind_allocator(
+ test_allocator<int>(&allocations),
+ incrementer_token_v2(&count)));
+
+ ASIO_CHECK(count == 0);
+ ASIO_CHECK(allocations == 1);
+
+ ioc.run();
+
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(allocations == 0);
+}
+
+ASIO_TEST_SUITE
+(
+ "bind_allocator",
+ ASIO_TEST_CASE(bind_allocator_to_function_object_test)
+ ASIO_TEST_CASE(bind_allocator_to_completion_token_v1_test)
+ ASIO_TEST_CASE(bind_allocator_to_completion_token_v2_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp b/3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp
new file mode 100644
index 00000000000..25b0ff1c995
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/bind_cancellation_slot.cpp
@@ -0,0 +1,202 @@
+//
+// bind_cancellation_slot.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/bind_cancellation_slot.hpp"
+
+#include <functional>
+#include "asio/cancellation_signal.hpp"
+#include "asio/io_context.hpp"
+#include "asio/steady_timer.hpp"
+#include "unit_test.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)
+
+using namespace asio;
+namespace bindns = std;
+
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+typedef deadline_timer timer;
+namespace chronons = boost::posix_time;
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
+typedef steady_timer timer;
+namespace chronons = asio::chrono;
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+
+void increment_on_cancel(int* count, const asio::error_code& error)
+{
+ if (error == asio::error::operation_aborted)
+ ++(*count);
+}
+
+void bind_cancellation_slot_to_function_object_test()
+{
+ io_context ioc;
+ cancellation_signal sig;
+
+ int count = 0;
+
+ timer t(ioc, chronons::seconds(5));
+ t.async_wait(
+ bind_cancellation_slot(sig.slot(),
+ bindns::bind(&increment_on_cancel,
+ &count, bindns::placeholders::_1)));
+
+ ioc.poll();
+
+ ASIO_CHECK(count == 0);
+
+ sig.emit(asio::cancellation_type::all);
+
+ ioc.run();
+
+ ASIO_CHECK(count == 1);
+
+ t.async_wait(
+ bind_cancellation_slot(sig.slot(),
+ bind_cancellation_slot(sig.slot(),
+ bindns::bind(&increment_on_cancel,
+ &count, bindns::placeholders::_1))));
+
+ ioc.restart();
+ ioc.poll();
+
+ ASIO_CHECK(count == 1);
+
+ sig.emit(asio::cancellation_type::all);
+
+ ioc.run();
+
+ ASIO_CHECK(count == 2);
+}
+
+struct incrementer_token_v1
+{
+ explicit incrementer_token_v1(int* c) : count(c) {}
+ int* count;
+};
+
+struct incrementer_handler_v1
+{
+ explicit incrementer_handler_v1(incrementer_token_v1 t) : count(t.count) {}
+
+ void operator()(asio::error_code error)
+ {
+ increment_on_cancel(count, error);
+ }
+
+ int* count;
+};
+
+namespace asio {
+
+template <>
+class async_result<incrementer_token_v1, void(asio::error_code)>
+{
+public:
+ typedef incrementer_handler_v1 completion_handler_type;
+ typedef void return_type;
+ explicit async_result(completion_handler_type&) {}
+ return_type get() {}
+};
+
+} // namespace asio
+
+void bind_cancellation_slot_to_completion_token_v1_test()
+{
+ io_context ioc;
+ cancellation_signal sig;
+
+ int count = 0;
+
+ timer t(ioc, chronons::seconds(5));
+ t.async_wait(
+ bind_cancellation_slot(sig.slot(),
+ incrementer_token_v1(&count)));
+
+ ioc.poll();
+
+ ASIO_CHECK(count == 0);
+
+ sig.emit(asio::cancellation_type::all);
+
+ ioc.run();
+
+ ASIO_CHECK(count == 1);
+}
+
+struct incrementer_token_v2
+{
+ explicit incrementer_token_v2(int* c) : count(c) {}
+ int* count;
+};
+
+namespace asio {
+
+template <>
+class async_result<incrementer_token_v2, void(asio::error_code)>
+{
+public:
+#if !defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+ typedef void return_type;
+#endif // !defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+
+ template <typename Initiation, typename... Args>
+ static void initiate(Initiation initiation,
+ incrementer_token_v2 token, Args&&... args)
+ {
+ initiation(
+ bindns::bind(&increment_on_cancel,
+ token.count, bindns::placeholders::_1),
+ static_cast<Args&&>(args)...);
+ }
+};
+
+} // namespace asio
+
+void bind_cancellation_slot_to_completion_token_v2_test()
+{
+ io_context ioc;
+ cancellation_signal sig;
+
+ int count = 0;
+
+ timer t(ioc, chronons::seconds(5));
+ t.async_wait(
+ bind_cancellation_slot(sig.slot(),
+ incrementer_token_v2(&count)));
+
+ ioc.poll();
+
+ ASIO_CHECK(count == 0);
+
+ sig.emit(asio::cancellation_type::all);
+
+ ioc.run();
+
+ ASIO_CHECK(count == 1);
+}
+
+ASIO_TEST_SUITE
+(
+ "bind_cancellation_slot",
+ ASIO_TEST_CASE(bind_cancellation_slot_to_function_object_test)
+ ASIO_TEST_CASE(bind_cancellation_slot_to_completion_token_v1_test)
+ ASIO_TEST_CASE(bind_cancellation_slot_to_completion_token_v2_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/bind_executor.cpp b/3rdparty/asio/src/tests/unit/bind_executor.cpp
new file mode 100644
index 00000000000..59be1cd14f3
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/bind_executor.cpp
@@ -0,0 +1,189 @@
+//
+// bind_executor.cpp
+// ~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/bind_executor.hpp"
+
+#include <functional>
+#include "asio/io_context.hpp"
+#include "asio/steady_timer.hpp"
+#include "unit_test.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)
+
+using namespace asio;
+namespace bindns = std;
+
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+typedef deadline_timer timer;
+namespace chronons = boost::posix_time;
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
+typedef steady_timer timer;
+namespace chronons = asio::chrono;
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+
+void increment(int* count)
+{
+ ++(*count);
+}
+
+void bind_executor_to_function_object_test()
+{
+ io_context ioc1;
+ io_context ioc2;
+
+ int count = 0;
+
+ timer t(ioc1, chronons::seconds(1));
+ t.async_wait(
+ bind_executor(
+ ioc2.get_executor(),
+ bindns::bind(&increment, &count)));
+
+ ioc1.run();
+
+ ASIO_CHECK(count == 0);
+
+ ioc2.run();
+
+ ASIO_CHECK(count == 1);
+
+ t.async_wait(
+ bind_executor(
+ ioc2.get_executor(),
+ bind_executor(
+ asio::system_executor(),
+ bindns::bind(&increment, &count))));
+
+ ioc1.restart();
+ ioc1.run();
+
+ ASIO_CHECK(count == 1);
+
+ ioc2.restart();
+ ioc2.run();
+
+ ASIO_CHECK(count == 2);
+}
+
+struct incrementer_token_v1
+{
+ explicit incrementer_token_v1(int* c) : count(c) {}
+ int* count;
+};
+
+struct incrementer_handler_v1
+{
+ explicit incrementer_handler_v1(incrementer_token_v1 t) : count(t.count) {}
+ void operator()(asio::error_code){ increment(count); }
+ int* count;
+};
+
+namespace asio {
+
+template <>
+class async_result<incrementer_token_v1, void(asio::error_code)>
+{
+public:
+ typedef incrementer_handler_v1 completion_handler_type;
+ typedef void return_type;
+ explicit async_result(completion_handler_type&) {}
+ return_type get() {}
+};
+
+} // namespace asio
+
+void bind_executor_to_completion_token_v1_test()
+{
+ io_context ioc1;
+ io_context ioc2;
+
+ int count = 0;
+
+ timer t(ioc1, chronons::seconds(1));
+ t.async_wait(
+ bind_executor(
+ ioc2.get_executor(),
+ incrementer_token_v1(&count)));
+
+ ioc1.run();
+
+ ASIO_CHECK(count == 0);
+
+ ioc2.run();
+
+ ASIO_CHECK(count == 1);
+}
+
+struct incrementer_token_v2
+{
+ explicit incrementer_token_v2(int* c) : count(c) {}
+ int* count;
+};
+
+namespace asio {
+
+template <>
+class async_result<incrementer_token_v2, void(asio::error_code)>
+{
+public:
+#if !defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+ typedef void return_type;
+#endif // !defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+
+ template <typename Initiation, typename... Args>
+ static void initiate(Initiation initiation,
+ incrementer_token_v2 token, Args&&... args)
+ {
+ initiation(bindns::bind(&increment, token.count),
+ static_cast<Args&&>(args)...);
+ }
+};
+
+} // namespace asio
+
+void bind_executor_to_completion_token_v2_test()
+{
+ io_context ioc1;
+ io_context ioc2;
+
+ int count = 0;
+
+ timer t(ioc1, chronons::seconds(1));
+ t.async_wait(
+ bind_executor(
+ ioc2.get_executor(),
+ incrementer_token_v2(&count)));
+
+ ioc1.run();
+
+ ASIO_CHECK(count == 0);
+
+ ioc2.run();
+
+ ASIO_CHECK(count == 1);
+}
+
+ASIO_TEST_SUITE
+(
+ "bind_executor",
+ ASIO_TEST_CASE(bind_executor_to_function_object_test)
+ ASIO_TEST_CASE(bind_executor_to_completion_token_v1_test)
+ ASIO_TEST_CASE(bind_executor_to_completion_token_v2_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/bind_immediate_executor.cpp b/3rdparty/asio/src/tests/unit/bind_immediate_executor.cpp
new file mode 100644
index 00000000000..ecf82de7470
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/bind_immediate_executor.cpp
@@ -0,0 +1,199 @@
+//
+// bind_immediate_executor.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/bind_immediate_executor.hpp"
+
+#include <functional>
+#include "asio/dispatch.hpp"
+#include "asio/io_context.hpp"
+#include "unit_test.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)
+
+using namespace asio;
+namespace bindns = std;
+
+struct initiate_immediate
+{
+ template <typename Handler>
+ void operator()(Handler&& handler, io_context* ctx) const
+ {
+ typename associated_immediate_executor<
+ Handler, io_context::executor_type>::type ex =
+ get_associated_immediate_executor(handler, ctx->get_executor());
+ dispatch(ex, static_cast<Handler&&>(handler));
+ }
+};
+
+template <ASIO_COMPLETION_TOKEN_FOR(void()) Token>
+ASIO_INITFN_AUTO_RESULT_TYPE_PREFIX(Token, void())
+async_immediate(io_context& ctx, Token&& token)
+ ASIO_INITFN_AUTO_RESULT_TYPE_SUFFIX((
+ async_initiate<Token, void()>(declval<initiate_immediate>(), token)))
+{
+ return async_initiate<Token, void()>(initiate_immediate(), token, &ctx);
+}
+
+void increment(int* count)
+{
+ ++(*count);
+}
+
+void bind_immediate_executor_to_function_object_test()
+{
+ io_context ioc1;
+ io_context ioc2;
+
+ int count = 0;
+
+ async_immediate(ioc1,
+ bind_immediate_executor(
+ ioc2.get_executor(),
+ bindns::bind(&increment, &count)));
+
+ ioc1.run();
+
+ ASIO_CHECK(count == 0);
+
+ ioc2.run();
+
+ ASIO_CHECK(count == 1);
+
+ async_immediate(ioc1,
+ bind_immediate_executor(
+ ioc2.get_executor(),
+ bind_immediate_executor(
+ asio::system_executor(),
+ bindns::bind(&increment, &count))));
+
+ ioc1.restart();
+ ioc1.run();
+
+ ASIO_CHECK(count == 1);
+
+ ioc2.restart();
+ ioc2.run();
+
+ ASIO_CHECK(count == 2);
+}
+
+struct incrementer_token_v1
+{
+ explicit incrementer_token_v1(int* c) : count(c) {}
+ int* count;
+};
+
+struct incrementer_handler_v1
+{
+ explicit incrementer_handler_v1(incrementer_token_v1 t) : count(t.count) {}
+ void operator()(){ increment(count); }
+ int* count;
+};
+
+namespace asio {
+
+template <>
+class async_result<incrementer_token_v1, void()>
+{
+public:
+ typedef incrementer_handler_v1 completion_handler_type;
+ typedef void return_type;
+ explicit async_result(completion_handler_type&) {}
+ return_type get() {}
+};
+
+} // namespace asio
+
+void bind_immediate_executor_to_completion_token_v1_test()
+{
+ io_context ioc1;
+ io_context ioc2;
+
+ int count = 0;
+
+ async_immediate(ioc1,
+ bind_immediate_executor(
+ ioc2.get_executor(),
+ incrementer_token_v1(&count)));
+
+ ioc1.run();
+
+ ASIO_CHECK(count == 0);
+
+ ioc2.run();
+
+ ASIO_CHECK(count == 1);
+}
+
+struct incrementer_token_v2
+{
+ explicit incrementer_token_v2(int* c) : count(c) {}
+ int* count;
+};
+
+namespace asio {
+
+template <>
+class async_result<incrementer_token_v2, void()>
+{
+public:
+#if !defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+ typedef void return_type;
+#endif // !defined(ASIO_HAS_RETURN_TYPE_DEDUCTION)
+
+ template <typename Initiation, typename... Args>
+ static void initiate(Initiation initiation,
+ incrementer_token_v2 token, Args&&... args)
+ {
+ initiation(bindns::bind(&increment, token.count),
+ static_cast<Args&&>(args)...);
+ }
+};
+
+} // namespace asio
+
+void bind_immediate_executor_to_completion_token_v2_test()
+{
+ io_context ioc1;
+ io_context ioc2;
+
+ int count = 0;
+
+ async_immediate(ioc1,
+ bind_immediate_executor(
+ ioc2.get_executor(),
+ incrementer_token_v2(&count)));
+
+ ioc1.run();
+
+ ASIO_CHECK(count == 0);
+
+ ioc2.run();
+
+ ASIO_CHECK(count == 1);
+}
+
+ASIO_TEST_SUITE
+(
+ "bind_immediate_executor",
+ ASIO_TEST_CASE(bind_immediate_executor_to_function_object_test)
+ ASIO_TEST_CASE(bind_immediate_executor_to_completion_token_v1_test)
+ ASIO_TEST_CASE(bind_immediate_executor_to_completion_token_v2_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/buffer.cpp b/3rdparty/asio/src/tests/unit/buffer.cpp
new file mode 100644
index 00000000000..9fa1db6e67f
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/buffer.cpp
@@ -0,0 +1,913 @@
+//
+// buffer.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/buffer.hpp"
+
+#include <array>
+#include <cstring>
+#include "unit_test.hpp"
+
+#if defined(ASIO_HAS_BOOST_ARRAY)
+# include <boost/array.hpp>
+#endif // defined(ASIO_HAS_BOOST_ARRAY)
+
+//------------------------------------------------------------------------------
+
+// buffer_compile test
+// ~~~~~~~~~~~~~~~~~~~
+// The following test checks that all overloads of the buffer function compile
+// and link correctly. Runtime failures are ignored.
+
+namespace buffer_compile {
+
+using namespace asio;
+
+template <typename T>
+class mutable_contiguous_container
+{
+public:
+ typedef T value_type;
+ typedef T* iterator;
+ typedef const T* const_iterator;
+ typedef T& reference;
+ typedef const T& const_reference;
+
+ mutable_contiguous_container() {}
+ std::size_t size() const { return 0; }
+ iterator begin() { return 0; }
+ const_iterator begin() const { return 0; }
+ iterator end() { return 0; }
+ const_iterator end() const { return 0; }
+};
+
+template <typename T>
+class const_contiguous_container
+{
+public:
+ typedef const T value_type;
+ typedef const T* iterator;
+ typedef const T* const_iterator;
+ typedef const T& reference;
+ typedef const T& const_reference;
+
+ const_contiguous_container() {}
+ std::size_t size() const { return 0; }
+ iterator begin() { return 0; }
+ const_iterator begin() const { return 0; }
+ iterator end() { return 0; }
+ const_iterator end() const { return 0; }
+};
+
+void test()
+{
+ try
+ {
+ char raw_data[1024];
+ const char const_raw_data[1024] = "";
+ void* void_ptr_data = raw_data;
+ const void* const_void_ptr_data = const_raw_data;
+#if defined(ASIO_HAS_BOOST_ARRAY)
+ boost::array<char, 1024> array_data;
+ const boost::array<char, 1024>& const_array_data_1 = array_data;
+ boost::array<const char, 1024> const_array_data_2 = { { 0 } };
+#endif // defined(ASIO_HAS_BOOST_ARRAY)
+ std::array<char, 1024> std_array_data;
+ const std::array<char, 1024>& const_std_array_data_1 = std_array_data;
+ std::array<const char, 1024> const_std_array_data_2 = { { 0 } };
+ std::vector<char> vector_data(1024);
+ const std::vector<char>& const_vector_data = vector_data;
+ std::string string_data(1024, ' ');
+ const std::string const_string_data(1024, ' ');
+ std::vector<mutable_buffer> mutable_buffer_sequence;
+ std::vector<const_buffer> const_buffer_sequence;
+#if defined(ASIO_HAS_STD_STRING_VIEW)
+ std::string_view string_view_data(string_data);
+#elif defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+ std::experimental::string_view string_view_data(string_data);
+#endif // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+ mutable_contiguous_container<char> mutable_contiguous_data;
+ const mutable_contiguous_container<char> const_mutable_contiguous_data;
+ const_contiguous_container<char> const_contiguous_data;
+ const const_contiguous_container<char> const_const_contiguous_data;
+
+ // mutable_buffer constructors.
+
+ mutable_buffer mb1;
+ mutable_buffer mb2(void_ptr_data, 1024);
+ mutable_buffer mb3(mb1);
+ (void)mb3;
+
+ // mutable_buffer functions.
+
+ void* ptr1 = mb1.data();
+ (void)ptr1;
+
+ std::size_t n1 = mb1.size();
+ (void)n1;
+
+ // mutable_buffer operators.
+
+ mb1 += 128;
+ mb1 = mb2 + 128;
+ mb1 = 128 + mb2;
+
+#if !defined(ASIO_NO_DEPRECATED)
+
+ // mutable_buffers_1 constructors.
+
+ mutable_buffers_1 mbc1(mb1);
+ mutable_buffers_1 mbc2(mbc1);
+
+ // mutable_buffers_1 functions.
+
+ mutable_buffers_1::const_iterator iter1 = mbc1.begin();
+ (void)iter1;
+ mutable_buffers_1::const_iterator iter2 = mbc1.end();
+ (void)iter2;
+
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ // const_buffer constructors.
+
+ const_buffer cb1;
+ const_buffer cb2(const_void_ptr_data, 1024);
+ const_buffer cb3(cb1);
+ (void)cb3;
+ const_buffer cb4(mb1);
+ (void)cb4;
+
+ // const_buffer functions.
+
+ const void* ptr2 = cb1.data();
+ (void)ptr2;
+
+ std::size_t n2 = cb1.size();
+ (void)n2;
+
+ // const_buffer operators.
+
+ cb1 += 128;
+ cb1 = cb2 + 128;
+ cb1 = 128 + cb2;
+
+#if !defined(ASIO_NO_DEPRECATED)
+
+ // const_buffers_1 constructors.
+
+ const_buffers_1 cbc1(cb1);
+ const_buffers_1 cbc2(cbc1);
+
+ // const_buffers_1 functions.
+
+ const_buffers_1::const_iterator iter3 = cbc1.begin();
+ (void)iter3;
+ const_buffers_1::const_iterator iter4 = cbc1.end();
+ (void)iter4;
+
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ // buffer_size function overloads.
+
+ std::size_t size1 = buffer_size(mb1);
+ (void)size1;
+ std::size_t size2 = buffer_size(cb1);
+ (void)size2;
+#if !defined(ASIO_NO_DEPRECATED)
+ std::size_t size3 = buffer_size(mbc1);
+ (void)size3;
+ std::size_t size4 = buffer_size(cbc1);
+ (void)size4;
+#endif // !defined(ASIO_NO_DEPRECATED)
+ std::size_t size5 = buffer_size(mutable_buffer_sequence);
+ (void)size5;
+ std::size_t size6 = buffer_size(const_buffer_sequence);
+ (void)size6;
+
+ // buffer_cast function overloads.
+
+#if !defined(ASIO_NO_DEPRECATED)
+ void* ptr3 = buffer_cast<void*>(mb1);
+ (void)ptr3;
+ const void* ptr4 = buffer_cast<const void*>(cb1);
+ (void)ptr4;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ // buffer function overloads.
+
+ mb1 = buffer(mb2);
+ mb1 = buffer(mb2, 128);
+ cb1 = buffer(cb2);
+ cb1 = buffer(cb2, 128);
+ mb1 = buffer(void_ptr_data, 1024);
+ cb1 = buffer(const_void_ptr_data, 1024);
+ mb1 = buffer(raw_data);
+ mb1 = buffer(raw_data, 1024);
+ cb1 = buffer(const_raw_data);
+ cb1 = buffer(const_raw_data, 1024);
+#if defined(ASIO_HAS_BOOST_ARRAY)
+ mb1 = buffer(array_data);
+ mb1 = buffer(array_data, 1024);
+ cb1 = buffer(const_array_data_1);
+ cb1 = buffer(const_array_data_1, 1024);
+ cb1 = buffer(const_array_data_2);
+ cb1 = buffer(const_array_data_2, 1024);
+#endif // defined(ASIO_HAS_BOOST_ARRAY)
+ mb1 = buffer(std_array_data);
+ mb1 = buffer(std_array_data, 1024);
+ cb1 = buffer(const_std_array_data_1);
+ cb1 = buffer(const_std_array_data_1, 1024);
+ cb1 = buffer(const_std_array_data_2);
+ cb1 = buffer(const_std_array_data_2, 1024);
+ mb1 = buffer(vector_data);
+ mb1 = buffer(vector_data, 1024);
+ cb1 = buffer(const_vector_data);
+ cb1 = buffer(const_vector_data, 1024);
+ mb1 = buffer(string_data);
+ mb1 = buffer(string_data, 1024);
+ cb1 = buffer(const_string_data);
+ cb1 = buffer(const_string_data, 1024);
+#if defined(ASIO_HAS_STRING_VIEW)
+ cb1 = buffer(string_view_data);
+ cb1 = buffer(string_view_data, 1024);
+#endif // defined(ASIO_HAS_STRING_VIEW)
+ mb1 = buffer(mutable_contiguous_data);
+ mb1 = buffer(mutable_contiguous_data, 1024);
+ cb1 = buffer(const_mutable_contiguous_data);
+ cb1 = buffer(const_mutable_contiguous_data, 1024);
+ cb1 = buffer(const_contiguous_data);
+ cb1 = buffer(const_contiguous_data, 1024);
+ cb1 = buffer(const_const_contiguous_data);
+ cb1 = buffer(const_const_contiguous_data, 1024);
+
+ // buffer_copy function overloads.
+
+ std::size_t size7 = buffer_copy(mb1, cb2);
+ (void)size7;
+#if !defined(ASIO_NO_DEPRECATED)
+ std::size_t size8 = buffer_copy(mb1, cbc2);
+ (void)size8;
+#endif // !defined(ASIO_NO_DEPRECATED)
+ std::size_t size9 = buffer_copy(mb1, mb2);
+ (void)size9;
+#if !defined(ASIO_NO_DEPRECATED)
+ std::size_t size10 = buffer_copy(mb1, mbc2);
+ (void)size10;
+#endif // !defined(ASIO_NO_DEPRECATED)
+ std::size_t size11 = buffer_copy(mb1, const_buffer_sequence);
+ (void)size11;
+#if !defined(ASIO_NO_DEPRECATED)
+ std::size_t size12 = buffer_copy(mbc1, cb2);
+ (void)size12;
+ std::size_t size13 = buffer_copy(mbc1, cbc2);
+ (void)size13;
+ std::size_t size14 = buffer_copy(mbc1, mb2);
+ (void)size14;
+ std::size_t size15 = buffer_copy(mbc1, mbc2);
+ (void)size15;
+ std::size_t size16 = buffer_copy(mbc1, const_buffer_sequence);
+ (void)size16;
+#endif // !defined(ASIO_NO_DEPRECATED)
+ std::size_t size17 = buffer_copy(mutable_buffer_sequence, cb2);
+ (void)size17;
+#if !defined(ASIO_NO_DEPRECATED)
+ std::size_t size18 = buffer_copy(mutable_buffer_sequence, cbc2);
+ (void)size18;
+#endif // !defined(ASIO_NO_DEPRECATED)
+ std::size_t size19 = buffer_copy(mutable_buffer_sequence, mb2);
+ (void)size19;
+#if !defined(ASIO_NO_DEPRECATED)
+ std::size_t size20 = buffer_copy(mutable_buffer_sequence, mbc2);
+ (void)size20;
+#endif // !defined(ASIO_NO_DEPRECATED)
+ std::size_t size21 = buffer_copy(
+ mutable_buffer_sequence, const_buffer_sequence);
+ (void)size21;
+ std::size_t size22 = buffer_copy(mb1, cb2, 128);
+ (void)size22;
+#if !defined(ASIO_NO_DEPRECATED)
+ std::size_t size23 = buffer_copy(mb1, cbc2, 128);
+ (void)size23;
+#endif // !defined(ASIO_NO_DEPRECATED)
+ std::size_t size24 = buffer_copy(mb1, mb2, 128);
+ (void)size24;
+#if !defined(ASIO_NO_DEPRECATED)
+ std::size_t size25 = buffer_copy(mb1, mbc2, 128);
+ (void)size25;
+#endif // !defined(ASIO_NO_DEPRECATED)
+ std::size_t size26 = buffer_copy(mb1, const_buffer_sequence, 128);
+ (void)size26;
+#if !defined(ASIO_NO_DEPRECATED)
+ std::size_t size27 = buffer_copy(mbc1, cb2, 128);
+ (void)size27;
+ std::size_t size28 = buffer_copy(mbc1, cbc2, 128);
+ (void)size28;
+ std::size_t size29 = buffer_copy(mbc1, mb2, 128);
+ (void)size29;
+ std::size_t size30 = buffer_copy(mbc1, mbc2, 128);
+ (void)size30;
+ std::size_t size31 = buffer_copy(mbc1, const_buffer_sequence, 128);
+ (void)size31;
+#endif // !defined(ASIO_NO_DEPRECATED)
+ std::size_t size32 = buffer_copy(mutable_buffer_sequence, cb2, 128);
+ (void)size32;
+#if !defined(ASIO_NO_DEPRECATED)
+ std::size_t size33 = buffer_copy(mutable_buffer_sequence, cbc2, 128);
+ (void)size33;
+#endif // !defined(ASIO_NO_DEPRECATED)
+ std::size_t size34 = buffer_copy(mutable_buffer_sequence, mb2, 128);
+ (void)size34;
+#if !defined(ASIO_NO_DEPRECATED)
+ std::size_t size35 = buffer_copy(mutable_buffer_sequence, mbc2, 128);
+ (void)size35;
+#endif // !defined(ASIO_NO_DEPRECATED)
+ std::size_t size36 = buffer_copy(
+ mutable_buffer_sequence, const_buffer_sequence, 128);
+ (void)size36;
+
+ // dynamic_buffer function overloads.
+
+ dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> db1 = dynamic_buffer(string_data);
+ (void)db1;
+ dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type> db2 = dynamic_buffer(string_data, 1024);
+ (void)db2;
+ dynamic_vector_buffer<char, std::allocator<char> >
+ db3 = dynamic_buffer(vector_data);
+ (void)db3;
+ dynamic_vector_buffer<char, std::allocator<char> >
+ db4 = dynamic_buffer(vector_data, 1024);
+ (void)db4;
+
+ // dynamic_buffer member functions.
+
+ std::size_t size37 = db1.size();
+ (void)size37;
+ std::size_t size38 = db3.size();
+ (void)size38;
+
+ std::size_t size39 = db1.max_size();
+ (void)size39;
+ std::size_t size40 = db3.max_size();
+ (void)size40;
+
+#if !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+ dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type>::const_buffers_type
+ cb5 = db1.data();
+ (void)cb5;
+ dynamic_vector_buffer<char, std::allocator<char> >::const_buffers_type
+ cb6 = db3.data();
+ (void)cb6;
+
+ dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type>::mutable_buffers_type mb5
+ = db1.prepare(1024);
+ (void)mb5;
+ dynamic_vector_buffer<char, std::allocator<char> >::mutable_buffers_type
+ mb6 = db3.prepare(1024);
+ (void)mb6;
+
+ db1.commit(1024);
+ db3.commit(1024);
+#endif // !defined(ASIO_NO_DYNAMIC_BUFFER_V1)
+
+ dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type>::mutable_buffers_type
+ mb7 = db1.data(0, 1);
+ (void)mb7;
+ dynamic_vector_buffer<char, std::allocator<char> >::mutable_buffers_type
+ mb8 = db3.data(0, 1);
+ (void)mb8;
+
+ dynamic_string_buffer<char, std::string::traits_type,
+ std::string::allocator_type>::const_buffers_type
+ cb7 = static_cast<const dynamic_string_buffer<char,
+ std::string::traits_type,
+ std::string::allocator_type>&>(db1).data(0, 1);
+ (void)cb7;
+ dynamic_vector_buffer<char, std::allocator<char> >::const_buffers_type
+ cb8 = static_cast<const dynamic_vector_buffer<char,
+ std::allocator<char> >&>(db3).data(0, 1);
+ (void)cb8;
+
+ db1.grow(1024);
+ db3.grow(1024);
+
+ db1.shrink(1024);
+ db3.shrink(1024);
+
+ db1.consume(0);
+ db3.consume(0);
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace buffer_compile
+
+//------------------------------------------------------------------------------
+
+namespace buffer_copy_runtime {
+
+using namespace asio;
+using namespace std;
+
+void test()
+{
+ char dest_data[256];
+ char source_data[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mutable_buffer mb1 = asio::buffer(dest_data);
+ mutable_buffer mb2 = asio::buffer(source_data);
+ std::size_t n = buffer_copy(mb1, mb2);
+ ASIO_CHECK(n == sizeof(source_data));
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mb1 = asio::buffer(dest_data);
+ const_buffer cb1 = asio::buffer(source_data);
+ n = buffer_copy(mb1, cb1);
+ ASIO_CHECK(n == sizeof(source_data));
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+#if !defined(ASIO_NO_DEPRECATED)
+ memset(dest_data, 0, sizeof(dest_data));
+ mb1 = asio::buffer(dest_data);
+ mutable_buffers_1 mbc1 = asio::buffer(source_data);
+ n = buffer_copy(mb1, mbc1);
+ ASIO_CHECK(n == sizeof(source_data));
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mb1 = asio::buffer(dest_data);
+ const_buffers_1 cbc1 = const_buffers_1(asio::buffer(source_data));
+ n = buffer_copy(mb1, cbc1);
+ ASIO_CHECK(n == sizeof(source_data));
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mbc1 = asio::buffer(dest_data);
+ mb1 = asio::buffer(source_data);
+ n = buffer_copy(mbc1, mb1);
+ ASIO_CHECK(n == sizeof(source_data));
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mbc1 = asio::buffer(dest_data);
+ cb1 = asio::buffer(source_data);
+ n = buffer_copy(mbc1, cb1);
+ ASIO_CHECK(n == sizeof(source_data));
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mbc1 = asio::buffer(dest_data);
+ mutable_buffers_1 mbc2 = asio::buffer(source_data);
+ n = buffer_copy(mbc1, mbc2);
+ ASIO_CHECK(n == sizeof(source_data));
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mbc1 = asio::buffer(dest_data);
+ cbc1 = const_buffers_1(asio::buffer(source_data));
+ n = buffer_copy(mbc1, cbc1);
+ ASIO_CHECK(n == sizeof(source_data));
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mb1 = asio::buffer(dest_data);
+ std::vector<mutable_buffer> mv1;
+ mv1.push_back(asio::buffer(source_data, 5));
+ mv1.push_back(asio::buffer(source_data) + 5);
+ n = buffer_copy(mb1, mv1);
+ ASIO_CHECK(n == sizeof(source_data));
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mb1 = asio::buffer(dest_data);
+ std::vector<const_buffer> cv1;
+ cv1.push_back(asio::buffer(source_data, 6));
+ cv1.push_back(asio::buffer(source_data) + 6);
+ n = buffer_copy(mb1, cv1);
+ ASIO_CHECK(n == sizeof(source_data));
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mv1.clear();
+ mv1.push_back(asio::buffer(dest_data, 7));
+ mv1.push_back(asio::buffer(dest_data) + 7);
+ cb1 = asio::buffer(source_data);
+ n = buffer_copy(mv1, cb1);
+ ASIO_CHECK(n == sizeof(source_data));
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mv1.clear();
+ mv1.push_back(asio::buffer(dest_data, 7));
+ mv1.push_back(asio::buffer(dest_data) + 7);
+ cv1.clear();
+ cv1.push_back(asio::buffer(source_data, 8));
+ cv1.push_back(asio::buffer(source_data) + 8);
+ n = buffer_copy(mv1, cv1);
+ ASIO_CHECK(n == sizeof(source_data));
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mb1 = asio::buffer(dest_data);
+ mb2 = asio::buffer(source_data);
+ n = buffer_copy(mb1, mb2, 10);
+ ASIO_CHECK(n == 10);
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mb1 = asio::buffer(dest_data);
+ cb1 = asio::buffer(source_data);
+ n = buffer_copy(mb1, cb1, 10);
+ ASIO_CHECK(n == 10);
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+#if !defined(ASIO_NO_DEPRECATED)
+ memset(dest_data, 0, sizeof(dest_data));
+ mb1 = asio::buffer(dest_data);
+ mbc1 = asio::buffer(source_data);
+ n = buffer_copy(mb1, mbc1, 10);
+ ASIO_CHECK(n == 10);
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mb1 = asio::buffer(dest_data);
+ cbc1 = const_buffers_1(asio::buffer(source_data));
+ n = buffer_copy(mb1, cbc1, 10);
+ ASIO_CHECK(n == 10);
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mbc1 = asio::buffer(dest_data);
+ mb1 = asio::buffer(source_data);
+ n = buffer_copy(mbc1, mb1, 10);
+ ASIO_CHECK(n == 10);
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mbc1 = asio::buffer(dest_data);
+ cb1 = asio::buffer(source_data);
+ n = buffer_copy(mbc1, cb1, 10);
+ ASIO_CHECK(n == 10);
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mbc1 = asio::buffer(dest_data);
+ mbc2 = asio::buffer(source_data);
+ n = buffer_copy(mbc1, mbc2, 10);
+ ASIO_CHECK(n == 10);
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mbc1 = asio::buffer(dest_data);
+ cbc1 = const_buffers_1(asio::buffer(source_data));
+ n = buffer_copy(mbc1, cbc1, 10);
+ ASIO_CHECK(n == 10);
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mb1 = asio::buffer(dest_data);
+ mv1.clear();
+ mv1.push_back(asio::buffer(source_data, 5));
+ mv1.push_back(asio::buffer(source_data) + 5);
+ n = buffer_copy(mb1, mv1, 10);
+ ASIO_CHECK(n == 10);
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mb1 = asio::buffer(dest_data);
+ cv1.clear();
+ cv1.push_back(asio::buffer(source_data, 6));
+ cv1.push_back(asio::buffer(source_data) + 6);
+ n = buffer_copy(mb1, cv1, 10);
+ ASIO_CHECK(n == 10);
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mv1.clear();
+ mv1.push_back(asio::buffer(dest_data, 7));
+ mv1.push_back(asio::buffer(dest_data) + 7);
+ cb1 = asio::buffer(source_data);
+ n = buffer_copy(mv1, cb1, 10);
+ ASIO_CHECK(n == 10);
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+
+ memset(dest_data, 0, sizeof(dest_data));
+ mv1.clear();
+ mv1.push_back(asio::buffer(dest_data, 7));
+ mv1.push_back(asio::buffer(dest_data) + 7);
+ cv1.clear();
+ cv1.push_back(asio::buffer(source_data, 8));
+ cv1.push_back(asio::buffer(source_data) + 8);
+ n = buffer_copy(mv1, cv1, 10);
+ ASIO_CHECK(n == 10);
+ ASIO_CHECK(memcmp(dest_data, source_data, n) == 0);
+}
+
+} // namespace buffer_copy_runtime
+
+//------------------------------------------------------------------------------
+
+namespace buffer_sequence {
+
+using namespace asio;
+using namespace std;
+
+struct valid_const_a
+{
+ typedef const_buffer* const_iterator;
+ typedef const_buffer value_type;
+ const_buffer* begin() const { return 0; }
+ const_buffer* end() const { return 0; }
+};
+
+struct valid_const_b
+{
+ const_buffer* begin() const { return 0; }
+ const_buffer* end() const { return 0; }
+};
+
+struct valid_mutable_a
+{
+ typedef mutable_buffer* const_iterator;
+ typedef mutable_buffer value_type;
+ mutable_buffer* begin() const { return 0; }
+ mutable_buffer* end() const { return 0; }
+};
+
+struct valid_mutable_b
+{
+ mutable_buffer* begin() const { return 0; }
+ mutable_buffer* end() const { return 0; }
+};
+
+struct invalid_const_a
+{
+ typedef int value_type;
+ int* begin() const { return 0; }
+ const_buffer* end() const { return 0; }
+};
+
+struct invalid_const_b
+{
+ typedef const_buffer value_type;
+ const_buffer* begin() const { return 0; }
+};
+
+struct invalid_const_c
+{
+ typedef const_buffer value_type;
+ const_buffer* end() const { return 0; }
+};
+
+struct invalid_const_d
+{
+ int* begin() const { return 0; }
+ const_buffer* end() const { return 0; }
+};
+
+struct invalid_const_e
+{
+ const_buffer* begin() const { return 0; }
+};
+
+struct invalid_const_f
+{
+ const_buffer* end() const { return 0; }
+};
+
+struct invalid_mutable_a
+{
+ typedef int value_type;
+ int* begin() const { return 0; }
+ mutable_buffer* end() const { return 0; }
+};
+
+struct invalid_mutable_b
+{
+ typedef mutable_buffer value_type;
+ mutable_buffer* begin() const { return 0; }
+};
+
+struct invalid_mutable_c
+{
+ typedef mutable_buffer value_type;
+ mutable_buffer* end() const { return 0; }
+};
+
+struct invalid_mutable_d
+{
+ int* begin() const { return 0; }
+ mutable_buffer* end() const { return 0; }
+};
+
+struct invalid_mutable_e
+{
+ mutable_buffer* begin() const { return 0; }
+};
+
+struct invalid_mutable_f
+{
+ mutable_buffer* end() const { return 0; }
+};
+
+void test()
+{
+ ASIO_CHECK(is_const_buffer_sequence<const_buffer>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<const_buffer>::value);
+
+ const_buffer b1;
+ ASIO_CHECK(buffer_sequence_begin(b1) == &b1);
+ ASIO_CHECK(buffer_sequence_end(b1) == &b1 + 1);
+
+ ASIO_CHECK(is_const_buffer_sequence<mutable_buffer>::value);
+ ASIO_CHECK(is_mutable_buffer_sequence<mutable_buffer>::value);
+
+ mutable_buffer b2;
+ ASIO_CHECK(buffer_sequence_begin(b2) == &b2);
+ ASIO_CHECK(buffer_sequence_end(b2) == &b2 + 1);
+
+#if !defined(ASIO_NO_DEPRECATED)
+ ASIO_CHECK(is_const_buffer_sequence<const_buffers_1>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<const_buffers_1>::value);
+
+ const_buffers_1 b3(0, 0);
+ ASIO_CHECK(buffer_sequence_begin(b3) == &b3);
+ ASIO_CHECK(buffer_sequence_end(b3) == &b3 + 1);
+
+ ASIO_CHECK(is_const_buffer_sequence<mutable_buffers_1>::value);
+ ASIO_CHECK(is_mutable_buffer_sequence<mutable_buffers_1>::value);
+
+ mutable_buffers_1 b4(0, 0);
+ ASIO_CHECK(buffer_sequence_begin(b4) == &b4);
+ ASIO_CHECK(buffer_sequence_end(b4) == &b4 + 1);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ ASIO_CHECK(is_const_buffer_sequence<vector<const_buffer> >::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<vector<const_buffer> >::value);
+
+ vector<const_buffer> b5;
+ ASIO_CHECK(buffer_sequence_begin(b5) == b5.begin());
+ ASIO_CHECK(buffer_sequence_end(b5) == b5.end());
+
+ ASIO_CHECK(is_const_buffer_sequence<vector<mutable_buffer> >::value);
+ ASIO_CHECK(is_mutable_buffer_sequence<vector<mutable_buffer> >::value);
+
+ vector<mutable_buffer> b6;
+ ASIO_CHECK(buffer_sequence_begin(b6) == b6.begin());
+ ASIO_CHECK(buffer_sequence_end(b6) == b6.end());
+
+ ASIO_CHECK(is_const_buffer_sequence<valid_const_a>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<valid_const_a>::value);
+
+ valid_const_a b7;
+ ASIO_CHECK(buffer_sequence_begin(b7) == b7.begin());
+ ASIO_CHECK(buffer_sequence_end(b7) == b7.end());
+
+ ASIO_CHECK(is_const_buffer_sequence<valid_const_b>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<valid_const_b>::value);
+
+ valid_const_b b8;
+ ASIO_CHECK(buffer_sequence_begin(b8) == b8.begin());
+ ASIO_CHECK(buffer_sequence_end(b8) == b8.end());
+
+ ASIO_CHECK(is_const_buffer_sequence<valid_mutable_a>::value);
+ ASIO_CHECK(is_mutable_buffer_sequence<valid_mutable_a>::value);
+
+ valid_mutable_a b9;
+ ASIO_CHECK(buffer_sequence_begin(b9) == b9.begin());
+ ASIO_CHECK(buffer_sequence_end(b9) == b9.end());
+
+ ASIO_CHECK(is_const_buffer_sequence<valid_mutable_b>::value);
+ ASIO_CHECK(is_mutable_buffer_sequence<valid_mutable_b>::value);
+
+ valid_mutable_b b10;
+ ASIO_CHECK(buffer_sequence_begin(b10) == b10.begin());
+ ASIO_CHECK(buffer_sequence_end(b10) == b10.end());
+
+ ASIO_CHECK(!is_const_buffer_sequence<invalid_const_a>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_const_a>::value);
+
+ ASIO_CHECK(!is_const_buffer_sequence<invalid_const_b>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_const_b>::value);
+
+ ASIO_CHECK(!is_const_buffer_sequence<invalid_const_c>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_const_c>::value);
+
+ ASIO_CHECK(!is_const_buffer_sequence<invalid_const_d>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_const_d>::value);
+
+ ASIO_CHECK(!is_const_buffer_sequence<invalid_const_e>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_const_e>::value);
+
+ ASIO_CHECK(!is_const_buffer_sequence<invalid_const_f>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_const_f>::value);
+
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_mutable_a>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_mutable_a>::value);
+
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_mutable_b>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_mutable_b>::value);
+
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_mutable_c>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_mutable_c>::value);
+
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_mutable_d>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_mutable_d>::value);
+
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_mutable_e>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_mutable_e>::value);
+
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_mutable_f>::value);
+ ASIO_CHECK(!is_mutable_buffer_sequence<invalid_mutable_f>::value);
+}
+
+} // namespace buffer_sequence
+
+namespace buffer_literals {
+
+void test()
+{
+#if defined(ASIO_HAS_USER_DEFINED_LITERALS)
+ using namespace asio::buffer_literals;
+ using namespace std; // For memcmp.
+
+ asio::const_buffer b1 = ""_buf;
+ ASIO_CHECK(b1.size() == 0);
+
+ asio::const_buffer b2 = "hello"_buf;
+ ASIO_CHECK(b2.size() == 5);
+ ASIO_CHECK(memcmp(b2.data(), "hello", 5) == 0);
+
+ asio::const_buffer b3 = 0x00_buf;
+ ASIO_CHECK(b3.size() == 1);
+ ASIO_CHECK(memcmp(b3.data(), "\x00", 1) == 0);
+
+ asio::const_buffer b4 = 0X01_buf;
+ ASIO_CHECK(b4.size() == 1);
+ ASIO_CHECK(memcmp(b4.data(), "\x01", 1) == 0);
+
+ asio::const_buffer b5 = 0xaB_buf;
+ ASIO_CHECK(b5.size() == 1);
+ ASIO_CHECK(memcmp(b5.data(), "\xab", 1) == 0);
+
+ asio::const_buffer b6 = 0xABcd_buf;
+ ASIO_CHECK(b6.size() == 2);
+ ASIO_CHECK(memcmp(b6.data(), "\xab\xcd", 2) == 0);
+
+ asio::const_buffer b7 = 0x01ab01cd01ef01ba01dc01fe_buf;
+ ASIO_CHECK(b7.size() == 12);
+ ASIO_CHECK(memcmp(b7.data(),
+ "\x01\xab\x01\xcd\x01\xef\x01\xba\x01\xdc\x01\xfe", 12) == 0);
+
+ asio::const_buffer b8 = 0b00000000_buf;
+ ASIO_CHECK(b8.size() == 1);
+ ASIO_CHECK(memcmp(b8.data(), "\x00", 1) == 0);
+
+ asio::const_buffer b9 = 0B00000001_buf;
+ ASIO_CHECK(b9.size() == 1);
+ ASIO_CHECK(memcmp(b9.data(), "\x01", 1) == 0);
+
+ asio::const_buffer b10 = 0B11111111_buf;
+ ASIO_CHECK(b10.size() == 1);
+ ASIO_CHECK(memcmp(b10.data(), "\xFF", 1) == 0);
+
+ asio::const_buffer b11 = 0b1111000000001111_buf;
+ ASIO_CHECK(b11.size() == 2);
+ ASIO_CHECK(memcmp(b11.data(), "\xF0\x0F", 2) == 0);
+#endif // (defined(ASIO_HAS_USER_DEFINED_LITERALS)
+}
+
+} // namespace buffer_literals
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "buffer",
+ ASIO_COMPILE_TEST_CASE(buffer_compile::test)
+ ASIO_TEST_CASE(buffer_copy_runtime::test)
+ ASIO_TEST_CASE(buffer_sequence::test)
+ ASIO_TEST_CASE(buffer_literals::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/buffer_registration.cpp b/3rdparty/asio/src/tests/unit/buffer_registration.cpp
new file mode 100644
index 00000000000..72826a394cc
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/buffer_registration.cpp
@@ -0,0 +1,25 @@
+//
+// buffer_registration.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/buffer_registration.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "buffer_registration",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/buffered_read_stream.cpp b/3rdparty/asio/src/tests/unit/buffered_read_stream.cpp
new file mode 100644
index 00000000000..21b4abc0bbb
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/buffered_read_stream.cpp
@@ -0,0 +1,329 @@
+//
+// buffered_read_stream.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/buffered_read_stream.hpp"
+
+#include <cstring>
+#include <functional>
+#include "archetypes/async_result.hpp"
+#include "asio/buffer.hpp"
+#include "asio/io_context.hpp"
+#include "asio/ip/tcp.hpp"
+#include "asio/system_error.hpp"
+#include "unit_test.hpp"
+
+#if defined(ASIO_HAS_BOOST_ARRAY)
+# include <boost/array.hpp>
+#else // defined(ASIO_HAS_BOOST_ARRAY)
+# include <array>
+#endif // defined(ASIO_HAS_BOOST_ARRAY)
+
+typedef asio::buffered_read_stream<
+ asio::ip::tcp::socket> stream_type;
+
+void write_some_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void fill_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void read_some_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void test_compile()
+{
+#if defined(ASIO_HAS_BOOST_ARRAY)
+ using boost::array;
+#else // defined(ASIO_HAS_BOOST_ARRAY)
+ using std::array;
+#endif // defined(ASIO_HAS_BOOST_ARRAY)
+
+ using namespace asio;
+
+ try
+ {
+ io_context ioc;
+ char mutable_char_buffer[128] = "";
+ const char const_char_buffer[128] = "";
+ array<asio::mutable_buffer, 2> mutable_buffers = {{
+ asio::buffer(mutable_char_buffer, 10),
+ asio::buffer(mutable_char_buffer + 10, 10) }};
+ array<asio::const_buffer, 2> const_buffers = {{
+ asio::buffer(const_char_buffer, 10),
+ asio::buffer(const_char_buffer + 10, 10) }};
+ archetypes::lazy_handler lazy;
+ asio::error_code ec;
+
+ stream_type stream1(ioc);
+ stream_type stream2(ioc, 1024);
+
+ stream_type::executor_type ex = stream1.get_executor();
+ (void)ex;
+
+ stream_type::lowest_layer_type& lowest_layer = stream1.lowest_layer();
+ (void)lowest_layer;
+
+ stream1.write_some(buffer(mutable_char_buffer));
+ stream1.write_some(buffer(const_char_buffer));
+ stream1.write_some(mutable_buffers);
+ stream1.write_some(const_buffers);
+ stream1.write_some(null_buffers());
+ stream1.write_some(buffer(mutable_char_buffer), ec);
+ stream1.write_some(buffer(const_char_buffer), ec);
+ stream1.write_some(mutable_buffers, ec);
+ stream1.write_some(const_buffers, ec);
+ stream1.write_some(null_buffers(), ec);
+
+ stream1.async_write_some(buffer(mutable_char_buffer), &write_some_handler);
+ stream1.async_write_some(buffer(const_char_buffer), &write_some_handler);
+ stream1.async_write_some(mutable_buffers, &write_some_handler);
+ stream1.async_write_some(const_buffers, &write_some_handler);
+ stream1.async_write_some(null_buffers(), &write_some_handler);
+ int i1 = stream1.async_write_some(buffer(mutable_char_buffer), lazy);
+ (void)i1;
+ int i2 = stream1.async_write_some(buffer(const_char_buffer), lazy);
+ (void)i2;
+ int i3 = stream1.async_write_some(mutable_buffers, lazy);
+ (void)i3;
+ int i4 = stream1.async_write_some(const_buffers, lazy);
+ (void)i4;
+ int i5 = stream1.async_write_some(null_buffers(), lazy);
+ (void)i5;
+
+ stream1.fill();
+ stream1.fill(ec);
+
+ stream1.async_fill(&fill_handler);
+ int i6 = stream1.async_fill(lazy);
+ (void)i6;
+
+ stream1.read_some(buffer(mutable_char_buffer));
+ stream1.read_some(mutable_buffers);
+ stream1.read_some(null_buffers());
+ stream1.read_some(buffer(mutable_char_buffer), ec);
+ stream1.read_some(mutable_buffers, ec);
+ stream1.read_some(null_buffers(), ec);
+
+ stream1.async_read_some(buffer(mutable_char_buffer), &read_some_handler);
+ stream1.async_read_some(mutable_buffers, &read_some_handler);
+ stream1.async_read_some(null_buffers(), &read_some_handler);
+ int i7 = stream1.async_read_some(buffer(mutable_char_buffer), lazy);
+ (void)i7;
+ int i8 = stream1.async_read_some(mutable_buffers, lazy);
+ (void)i8;
+ int i9 = stream1.async_read_some(null_buffers(), lazy);
+ (void)i9;
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+void test_sync_operations()
+{
+ using namespace std; // For memcmp.
+
+ asio::io_context io_context;
+
+ asio::ip::tcp::acceptor acceptor(io_context,
+ asio::ip::tcp::endpoint(asio::ip::tcp::v4(), 0));
+ asio::ip::tcp::endpoint server_endpoint = acceptor.local_endpoint();
+ server_endpoint.address(asio::ip::address_v4::loopback());
+
+ stream_type client_socket(io_context);
+ client_socket.lowest_layer().connect(server_endpoint);
+
+ stream_type server_socket(io_context);
+ acceptor.accept(server_socket.lowest_layer());
+
+ const char write_data[]
+ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ const asio::const_buffer write_buf = asio::buffer(write_data);
+
+ std::size_t bytes_written = 0;
+ while (bytes_written < sizeof(write_data))
+ {
+ bytes_written += client_socket.write_some(
+ asio::buffer(write_buf + bytes_written));
+ }
+
+ char read_data[sizeof(write_data)];
+ const asio::mutable_buffer read_buf = asio::buffer(read_data);
+
+ std::size_t bytes_read = 0;
+ while (bytes_read < sizeof(read_data))
+ {
+ bytes_read += server_socket.read_some(
+ asio::buffer(read_buf + bytes_read));
+ }
+
+ ASIO_CHECK(bytes_written == sizeof(write_data));
+ ASIO_CHECK(bytes_read == sizeof(read_data));
+ ASIO_CHECK(memcmp(write_data, read_data, sizeof(write_data)) == 0);
+
+ bytes_written = 0;
+ while (bytes_written < sizeof(write_data))
+ {
+ bytes_written += server_socket.write_some(
+ asio::buffer(write_buf + bytes_written));
+ }
+
+ bytes_read = 0;
+ while (bytes_read < sizeof(read_data))
+ {
+ bytes_read += client_socket.read_some(
+ asio::buffer(read_buf + bytes_read));
+ }
+
+ ASIO_CHECK(bytes_written == sizeof(write_data));
+ ASIO_CHECK(bytes_read == sizeof(read_data));
+ ASIO_CHECK(memcmp(write_data, read_data, sizeof(write_data)) == 0);
+
+ server_socket.close();
+ asio::error_code error;
+ bytes_read = client_socket.read_some(
+ asio::buffer(read_buf), error);
+
+ ASIO_CHECK(bytes_read == 0);
+ ASIO_CHECK(error == asio::error::eof);
+
+ client_socket.close(error);
+}
+
+void handle_accept(const asio::error_code& e)
+{
+ ASIO_CHECK(!e);
+}
+
+void handle_write(const asio::error_code& e,
+ std::size_t bytes_transferred,
+ std::size_t* total_bytes_written)
+{
+ ASIO_CHECK(!e);
+ if (e)
+ throw asio::system_error(e); // Terminate test.
+ *total_bytes_written += bytes_transferred;
+}
+
+void handle_read(const asio::error_code& e,
+ std::size_t bytes_transferred,
+ std::size_t* total_bytes_read)
+{
+ ASIO_CHECK(!e);
+ if (e)
+ throw asio::system_error(e); // Terminate test.
+ *total_bytes_read += bytes_transferred;
+}
+
+void handle_read_eof(const asio::error_code& e,
+ std::size_t bytes_transferred)
+{
+ ASIO_CHECK(e == asio::error::eof);
+ ASIO_CHECK(bytes_transferred == 0);
+}
+
+void test_async_operations()
+{
+ using namespace std; // For memcmp.
+
+ namespace bindns = std;
+ using bindns::placeholders::_1;
+ using bindns::placeholders::_2;
+
+ asio::io_context io_context;
+
+ asio::ip::tcp::acceptor acceptor(io_context,
+ asio::ip::tcp::endpoint(asio::ip::tcp::v4(), 0));
+ asio::ip::tcp::endpoint server_endpoint = acceptor.local_endpoint();
+ server_endpoint.address(asio::ip::address_v4::loopback());
+
+ stream_type client_socket(io_context);
+ client_socket.lowest_layer().connect(server_endpoint);
+
+ stream_type server_socket(io_context);
+ acceptor.async_accept(server_socket.lowest_layer(), &handle_accept);
+ io_context.run();
+ io_context.restart();
+
+ const char write_data[]
+ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ const asio::const_buffer write_buf = asio::buffer(write_data);
+
+ std::size_t bytes_written = 0;
+ while (bytes_written < sizeof(write_data))
+ {
+ client_socket.async_write_some(
+ asio::buffer(write_buf + bytes_written),
+ bindns::bind(handle_write, _1, _2, &bytes_written));
+ io_context.run();
+ io_context.restart();
+ }
+
+ char read_data[sizeof(write_data)];
+ const asio::mutable_buffer read_buf = asio::buffer(read_data);
+
+ std::size_t bytes_read = 0;
+ while (bytes_read < sizeof(read_data))
+ {
+ server_socket.async_read_some(
+ asio::buffer(read_buf + bytes_read),
+ bindns::bind(handle_read, _1, _2, &bytes_read));
+ io_context.run();
+ io_context.restart();
+ }
+
+ ASIO_CHECK(bytes_written == sizeof(write_data));
+ ASIO_CHECK(bytes_read == sizeof(read_data));
+ ASIO_CHECK(memcmp(write_data, read_data, sizeof(write_data)) == 0);
+
+ bytes_written = 0;
+ while (bytes_written < sizeof(write_data))
+ {
+ server_socket.async_write_some(
+ asio::buffer(write_buf + bytes_written),
+ bindns::bind(handle_write, _1, _2, &bytes_written));
+ io_context.run();
+ io_context.restart();
+ }
+
+ bytes_read = 0;
+ while (bytes_read < sizeof(read_data))
+ {
+ client_socket.async_read_some(
+ asio::buffer(read_buf + bytes_read),
+ bindns::bind(handle_read, _1, _2, &bytes_read));
+ io_context.run();
+ io_context.restart();
+ }
+
+ ASIO_CHECK(bytes_written == sizeof(write_data));
+ ASIO_CHECK(bytes_read == sizeof(read_data));
+ ASIO_CHECK(memcmp(write_data, read_data, sizeof(write_data)) == 0);
+
+ server_socket.close();
+ client_socket.async_read_some(asio::buffer(read_buf), handle_read_eof);
+}
+
+ASIO_TEST_SUITE
+(
+ "buffered_read_stream",
+ ASIO_COMPILE_TEST_CASE(test_compile)
+ ASIO_TEST_CASE(test_sync_operations)
+ ASIO_TEST_CASE(test_async_operations)
+)
diff --git a/3rdparty/asio/src/tests/unit/buffered_stream.cpp b/3rdparty/asio/src/tests/unit/buffered_stream.cpp
new file mode 100644
index 00000000000..4830ec277de
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/buffered_stream.cpp
@@ -0,0 +1,355 @@
+//
+// buffered_stream.cpp
+// ~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/buffered_stream.hpp"
+
+#include <cstring>
+#include <functional>
+#include "archetypes/async_result.hpp"
+#include "asio/buffer.hpp"
+#include "asio/io_context.hpp"
+#include "asio/ip/tcp.hpp"
+#include "asio/system_error.hpp"
+#include "unit_test.hpp"
+
+#if defined(ASIO_HAS_BOOST_ARRAY)
+# include <boost/array.hpp>
+#else // defined(ASIO_HAS_BOOST_ARRAY)
+# include <array>
+#endif // defined(ASIO_HAS_BOOST_ARRAY)
+
+typedef asio::buffered_stream<
+ asio::ip::tcp::socket> stream_type;
+
+void write_some_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void flush_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void fill_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void read_some_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void test_compile()
+{
+#if defined(ASIO_HAS_BOOST_ARRAY)
+ using boost::array;
+#else // defined(ASIO_HAS_BOOST_ARRAY)
+ using std::array;
+#endif // defined(ASIO_HAS_BOOST_ARRAY)
+
+ using namespace asio;
+
+ try
+ {
+ io_context ioc;
+ char mutable_char_buffer[128] = "";
+ const char const_char_buffer[128] = "";
+ array<asio::mutable_buffer, 2> mutable_buffers = {{
+ asio::buffer(mutable_char_buffer, 10),
+ asio::buffer(mutable_char_buffer + 10, 10) }};
+ array<asio::const_buffer, 2> const_buffers = {{
+ asio::buffer(const_char_buffer, 10),
+ asio::buffer(const_char_buffer + 10, 10) }};
+ archetypes::lazy_handler lazy;
+ asio::error_code ec;
+
+ stream_type stream1(ioc);
+ stream_type stream2(ioc, 1024, 1024);
+
+ stream_type::executor_type ex = stream1.get_executor();
+ (void)ex;
+
+ stream_type::lowest_layer_type& lowest_layer = stream1.lowest_layer();
+ (void)lowest_layer;
+
+ stream1.write_some(buffer(mutable_char_buffer));
+ stream1.write_some(buffer(const_char_buffer));
+ stream1.write_some(mutable_buffers);
+ stream1.write_some(const_buffers);
+ stream1.write_some(null_buffers());
+ stream1.write_some(buffer(mutable_char_buffer), ec);
+ stream1.write_some(buffer(const_char_buffer), ec);
+ stream1.write_some(mutable_buffers, ec);
+ stream1.write_some(const_buffers, ec);
+ stream1.write_some(null_buffers(), ec);
+
+ stream1.async_write_some(buffer(mutable_char_buffer), &write_some_handler);
+ stream1.async_write_some(buffer(const_char_buffer), &write_some_handler);
+ stream1.async_write_some(mutable_buffers, &write_some_handler);
+ stream1.async_write_some(const_buffers, &write_some_handler);
+ stream1.async_write_some(null_buffers(), &write_some_handler);
+ int i1 = stream1.async_write_some(buffer(mutable_char_buffer), lazy);
+ (void)i1;
+ int i2 = stream1.async_write_some(buffer(const_char_buffer), lazy);
+ (void)i2;
+ int i3 = stream1.async_write_some(mutable_buffers, lazy);
+ (void)i3;
+ int i4 = stream1.async_write_some(const_buffers, lazy);
+ (void)i4;
+ int i5 = stream1.async_write_some(null_buffers(), lazy);
+ (void)i5;
+
+ stream1.flush();
+ stream1.flush(ec);
+
+ stream1.async_flush(&flush_handler);
+ int i6 = stream1.async_flush(lazy);
+ (void)i6;
+
+ stream1.fill();
+ stream1.fill(ec);
+
+ stream1.async_fill(&fill_handler);
+ int i7 = stream1.async_fill(lazy);
+ (void)i7;
+
+ stream1.read_some(buffer(mutable_char_buffer));
+ stream1.read_some(mutable_buffers);
+ stream1.read_some(null_buffers());
+ stream1.read_some(buffer(mutable_char_buffer), ec);
+ stream1.read_some(mutable_buffers, ec);
+ stream1.read_some(null_buffers(), ec);
+
+ stream1.async_read_some(buffer(mutable_char_buffer), &read_some_handler);
+ stream1.async_read_some(mutable_buffers, &read_some_handler);
+ stream1.async_read_some(null_buffers(), &read_some_handler);
+ int i8 = stream1.async_read_some(buffer(mutable_char_buffer), lazy);
+ (void)i8;
+ int i9 = stream1.async_read_some(mutable_buffers, lazy);
+ (void)i9;
+ int i10 = stream1.async_read_some(null_buffers(), lazy);
+ (void)i10;
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+void test_sync_operations()
+{
+ using namespace std; // For memcmp.
+
+ asio::io_context io_context;
+
+ asio::ip::tcp::acceptor acceptor(io_context,
+ asio::ip::tcp::endpoint(asio::ip::tcp::v4(), 0));
+ asio::ip::tcp::endpoint server_endpoint = acceptor.local_endpoint();
+ server_endpoint.address(asio::ip::address_v4::loopback());
+
+ stream_type client_socket(io_context);
+ client_socket.lowest_layer().connect(server_endpoint);
+
+ stream_type server_socket(io_context);
+ acceptor.accept(server_socket.lowest_layer());
+
+ const char write_data[]
+ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ const asio::const_buffer write_buf = asio::buffer(write_data);
+
+ std::size_t bytes_written = 0;
+ while (bytes_written < sizeof(write_data))
+ {
+ bytes_written += client_socket.write_some(
+ asio::buffer(write_buf + bytes_written));
+ client_socket.flush();
+ }
+
+ char read_data[sizeof(write_data)];
+ const asio::mutable_buffer read_buf = asio::buffer(read_data);
+
+ std::size_t bytes_read = 0;
+ while (bytes_read < sizeof(read_data))
+ {
+ bytes_read += server_socket.read_some(
+ asio::buffer(read_buf + bytes_read));
+ }
+
+ ASIO_CHECK(bytes_written == sizeof(write_data));
+ ASIO_CHECK(bytes_read == sizeof(read_data));
+ ASIO_CHECK(memcmp(write_data, read_data, sizeof(write_data)) == 0);
+
+ bytes_written = 0;
+ while (bytes_written < sizeof(write_data))
+ {
+ bytes_written += server_socket.write_some(
+ asio::buffer(write_buf + bytes_written));
+ server_socket.flush();
+ }
+
+ bytes_read = 0;
+ while (bytes_read < sizeof(read_data))
+ {
+ bytes_read += client_socket.read_some(
+ asio::buffer(read_buf + bytes_read));
+ }
+
+ ASIO_CHECK(bytes_written == sizeof(write_data));
+ ASIO_CHECK(bytes_read == sizeof(read_data));
+ ASIO_CHECK(memcmp(write_data, read_data, sizeof(write_data)) == 0);
+
+ server_socket.close();
+ asio::error_code error;
+ bytes_read = client_socket.read_some(
+ asio::buffer(read_buf), error);
+
+ ASIO_CHECK(bytes_read == 0);
+ ASIO_CHECK(error == asio::error::eof);
+
+ client_socket.close(error);
+}
+
+void handle_accept(const asio::error_code& e)
+{
+ ASIO_CHECK(!e);
+}
+
+void handle_write(const asio::error_code& e,
+ std::size_t bytes_transferred,
+ std::size_t* total_bytes_written)
+{
+ ASIO_CHECK(!e);
+ if (e)
+ throw asio::system_error(e); // Terminate test.
+ *total_bytes_written += bytes_transferred;
+}
+
+void handle_flush(const asio::error_code& e)
+{
+ ASIO_CHECK(!e);
+}
+
+void handle_read(const asio::error_code& e,
+ std::size_t bytes_transferred,
+ std::size_t* total_bytes_read)
+{
+ ASIO_CHECK(!e);
+ if (e)
+ throw asio::system_error(e); // Terminate test.
+ *total_bytes_read += bytes_transferred;
+}
+
+void handle_read_eof(const asio::error_code& e,
+ std::size_t bytes_transferred)
+{
+ ASIO_CHECK(e == asio::error::eof);
+ ASIO_CHECK(bytes_transferred == 0);
+}
+
+void test_async_operations()
+{
+ using namespace std; // For memcmp.
+
+ namespace bindns = std;
+ using bindns::placeholders::_1;
+ using bindns::placeholders::_2;
+
+ asio::io_context io_context;
+
+ asio::ip::tcp::acceptor acceptor(io_context,
+ asio::ip::tcp::endpoint(asio::ip::tcp::v4(), 0));
+ asio::ip::tcp::endpoint server_endpoint = acceptor.local_endpoint();
+ server_endpoint.address(asio::ip::address_v4::loopback());
+
+ stream_type client_socket(io_context);
+ client_socket.lowest_layer().connect(server_endpoint);
+
+ stream_type server_socket(io_context);
+ acceptor.async_accept(server_socket.lowest_layer(), &handle_accept);
+ io_context.run();
+ io_context.restart();
+
+ const char write_data[]
+ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ const asio::const_buffer write_buf = asio::buffer(write_data);
+
+ std::size_t bytes_written = 0;
+ while (bytes_written < sizeof(write_data))
+ {
+ client_socket.async_write_some(
+ asio::buffer(write_buf + bytes_written),
+ bindns::bind(handle_write, _1, _2, &bytes_written));
+ io_context.run();
+ io_context.restart();
+ client_socket.async_flush(
+ bindns::bind(handle_flush, _1));
+ io_context.run();
+ io_context.restart();
+ }
+
+ char read_data[sizeof(write_data)];
+ const asio::mutable_buffer read_buf = asio::buffer(read_data);
+
+ std::size_t bytes_read = 0;
+ while (bytes_read < sizeof(read_data))
+ {
+ server_socket.async_read_some(
+ asio::buffer(read_buf + bytes_read),
+ bindns::bind(handle_read, _1, _2, &bytes_read));
+ io_context.run();
+ io_context.restart();
+ }
+
+ ASIO_CHECK(bytes_written == sizeof(write_data));
+ ASIO_CHECK(bytes_read == sizeof(read_data));
+ ASIO_CHECK(memcmp(write_data, read_data, sizeof(write_data)) == 0);
+
+ bytes_written = 0;
+ while (bytes_written < sizeof(write_data))
+ {
+ server_socket.async_write_some(
+ asio::buffer(write_buf + bytes_written),
+ bindns::bind(handle_write, _1, _2, &bytes_written));
+ io_context.run();
+ io_context.restart();
+ server_socket.async_flush(
+ bindns::bind(handle_flush, _1));
+ io_context.run();
+ io_context.restart();
+ }
+
+ bytes_read = 0;
+ while (bytes_read < sizeof(read_data))
+ {
+ client_socket.async_read_some(
+ asio::buffer(read_buf + bytes_read),
+ bindns::bind(handle_read, _1, _2, &bytes_read));
+ io_context.run();
+ io_context.restart();
+ }
+
+ ASIO_CHECK(bytes_written == sizeof(write_data));
+ ASIO_CHECK(bytes_read == sizeof(read_data));
+ ASIO_CHECK(memcmp(write_data, read_data, sizeof(write_data)) == 0);
+
+ server_socket.close();
+ client_socket.async_read_some(asio::buffer(read_buf), handle_read_eof);
+}
+
+ASIO_TEST_SUITE
+(
+ "buffered_stream",
+ ASIO_COMPILE_TEST_CASE(test_compile)
+ ASIO_TEST_CASE(test_sync_operations)
+ ASIO_TEST_CASE(test_async_operations)
+)
diff --git a/3rdparty/asio/src/tests/unit/buffered_write_stream.cpp b/3rdparty/asio/src/tests/unit/buffered_write_stream.cpp
new file mode 100644
index 00000000000..635ff984b8d
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/buffered_write_stream.cpp
@@ -0,0 +1,344 @@
+//
+// buffered_write_stream.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/buffered_write_stream.hpp"
+
+#include <cstring>
+#include <functional>
+#include "archetypes/async_result.hpp"
+#include "asio/buffer.hpp"
+#include "asio/io_context.hpp"
+#include "asio/ip/tcp.hpp"
+#include "asio/system_error.hpp"
+#include "unit_test.hpp"
+
+#if defined(ASIO_HAS_BOOST_ARRAY)
+# include <boost/array.hpp>
+#else // defined(ASIO_HAS_BOOST_ARRAY)
+# include <array>
+#endif // defined(ASIO_HAS_BOOST_ARRAY)
+
+typedef asio::buffered_write_stream<
+ asio::ip::tcp::socket> stream_type;
+
+void write_some_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void flush_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void read_some_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void test_compile()
+{
+#if defined(ASIO_HAS_BOOST_ARRAY)
+ using boost::array;
+#else // defined(ASIO_HAS_BOOST_ARRAY)
+ using std::array;
+#endif // defined(ASIO_HAS_BOOST_ARRAY)
+
+ using namespace asio;
+
+ try
+ {
+ io_context ioc;
+ char mutable_char_buffer[128] = "";
+ const char const_char_buffer[128] = "";
+ array<asio::mutable_buffer, 2> mutable_buffers = {{
+ asio::buffer(mutable_char_buffer, 10),
+ asio::buffer(mutable_char_buffer + 10, 10) }};
+ array<asio::const_buffer, 2> const_buffers = {{
+ asio::buffer(const_char_buffer, 10),
+ asio::buffer(const_char_buffer + 10, 10) }};
+ archetypes::lazy_handler lazy;
+ asio::error_code ec;
+
+ stream_type stream1(ioc);
+ stream_type stream2(ioc, 1024);
+
+ stream_type::executor_type ex = stream1.get_executor();
+ (void)ex;
+
+ stream_type::lowest_layer_type& lowest_layer = stream1.lowest_layer();
+ (void)lowest_layer;
+
+ stream1.write_some(buffer(mutable_char_buffer));
+ stream1.write_some(buffer(const_char_buffer));
+ stream1.write_some(mutable_buffers);
+ stream1.write_some(const_buffers);
+ stream1.write_some(null_buffers());
+ stream1.write_some(buffer(mutable_char_buffer), ec);
+ stream1.write_some(buffer(const_char_buffer), ec);
+ stream1.write_some(mutable_buffers, ec);
+ stream1.write_some(const_buffers, ec);
+ stream1.write_some(null_buffers(), ec);
+
+ stream1.async_write_some(buffer(mutable_char_buffer), &write_some_handler);
+ stream1.async_write_some(buffer(const_char_buffer), &write_some_handler);
+ stream1.async_write_some(mutable_buffers, &write_some_handler);
+ stream1.async_write_some(const_buffers, &write_some_handler);
+ stream1.async_write_some(null_buffers(), &write_some_handler);
+ int i1 = stream1.async_write_some(buffer(mutable_char_buffer), lazy);
+ (void)i1;
+ int i2 = stream1.async_write_some(buffer(const_char_buffer), lazy);
+ (void)i2;
+ int i3 = stream1.async_write_some(mutable_buffers, lazy);
+ (void)i3;
+ int i4 = stream1.async_write_some(const_buffers, lazy);
+ (void)i4;
+ int i5 = stream1.async_write_some(null_buffers(), lazy);
+ (void)i5;
+
+ stream1.flush();
+ stream1.flush(ec);
+
+ stream1.async_flush(&flush_handler);
+ int i6 = stream1.async_flush(lazy);
+ (void)i6;
+
+ stream1.read_some(buffer(mutable_char_buffer));
+ stream1.read_some(mutable_buffers);
+ stream1.read_some(null_buffers());
+ stream1.read_some(buffer(mutable_char_buffer), ec);
+ stream1.read_some(mutable_buffers, ec);
+ stream1.read_some(null_buffers(), ec);
+
+ stream1.async_read_some(buffer(mutable_char_buffer), &read_some_handler);
+ stream1.async_read_some(mutable_buffers, &read_some_handler);
+ stream1.async_read_some(null_buffers(), &read_some_handler);
+ int i7 = stream1.async_read_some(buffer(mutable_char_buffer), lazy);
+ (void)i7;
+ int i8 = stream1.async_read_some(mutable_buffers, lazy);
+ (void)i8;
+ int i9 = stream1.async_read_some(null_buffers(), lazy);
+ (void)i9;
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+void test_sync_operations()
+{
+ using namespace std; // For memcmp.
+
+ asio::io_context io_context;
+
+ asio::ip::tcp::acceptor acceptor(io_context,
+ asio::ip::tcp::endpoint(asio::ip::tcp::v4(), 0));
+ asio::ip::tcp::endpoint server_endpoint = acceptor.local_endpoint();
+ server_endpoint.address(asio::ip::address_v4::loopback());
+
+ stream_type client_socket(io_context);
+ client_socket.lowest_layer().connect(server_endpoint);
+
+ stream_type server_socket(io_context);
+ acceptor.accept(server_socket.lowest_layer());
+
+ const char write_data[]
+ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ const asio::const_buffer write_buf = asio::buffer(write_data);
+
+ std::size_t bytes_written = 0;
+ while (bytes_written < sizeof(write_data))
+ {
+ bytes_written += client_socket.write_some(
+ asio::buffer(write_buf + bytes_written));
+ client_socket.flush();
+ }
+
+ char read_data[sizeof(write_data)];
+ const asio::mutable_buffer read_buf = asio::buffer(read_data);
+
+ std::size_t bytes_read = 0;
+ while (bytes_read < sizeof(read_data))
+ {
+ bytes_read += server_socket.read_some(
+ asio::buffer(read_buf + bytes_read));
+ }
+
+ ASIO_CHECK(bytes_written == sizeof(write_data));
+ ASIO_CHECK(bytes_read == sizeof(read_data));
+ ASIO_CHECK(memcmp(write_data, read_data, sizeof(write_data)) == 0);
+
+ bytes_written = 0;
+ while (bytes_written < sizeof(write_data))
+ {
+ bytes_written += server_socket.write_some(
+ asio::buffer(write_buf + bytes_written));
+ server_socket.flush();
+ }
+
+ bytes_read = 0;
+ while (bytes_read < sizeof(read_data))
+ {
+ bytes_read += client_socket.read_some(
+ asio::buffer(read_buf + bytes_read));
+ }
+
+ ASIO_CHECK(bytes_written == sizeof(write_data));
+ ASIO_CHECK(bytes_read == sizeof(read_data));
+ ASIO_CHECK(memcmp(write_data, read_data, sizeof(write_data)) == 0);
+
+ server_socket.close();
+ asio::error_code error;
+ bytes_read = client_socket.read_some(
+ asio::buffer(read_buf), error);
+
+ ASIO_CHECK(bytes_read == 0);
+ ASIO_CHECK(error == asio::error::eof);
+
+ client_socket.close(error);
+}
+
+void handle_accept(const asio::error_code& e)
+{
+ ASIO_CHECK(!e);
+}
+
+void handle_write(const asio::error_code& e,
+ std::size_t bytes_transferred,
+ std::size_t* total_bytes_written)
+{
+ ASIO_CHECK(!e);
+ if (e)
+ throw asio::system_error(e); // Terminate test.
+ *total_bytes_written += bytes_transferred;
+}
+
+void handle_flush(const asio::error_code& e)
+{
+ ASIO_CHECK(!e);
+}
+
+void handle_read(const asio::error_code& e,
+ std::size_t bytes_transferred,
+ std::size_t* total_bytes_read)
+{
+ ASIO_CHECK(!e);
+ if (e)
+ throw asio::system_error(e); // Terminate test.
+ *total_bytes_read += bytes_transferred;
+}
+
+void handle_read_eof(const asio::error_code& e,
+ std::size_t bytes_transferred)
+{
+ ASIO_CHECK(e == asio::error::eof);
+ ASIO_CHECK(bytes_transferred == 0);
+}
+
+void test_async_operations()
+{
+ using namespace std; // For memcmp.
+
+ namespace bindns = std;
+ using bindns::placeholders::_1;
+ using bindns::placeholders::_2;
+
+ asio::io_context io_context;
+
+ asio::ip::tcp::acceptor acceptor(io_context,
+ asio::ip::tcp::endpoint(asio::ip::tcp::v4(), 0));
+ asio::ip::tcp::endpoint server_endpoint = acceptor.local_endpoint();
+ server_endpoint.address(asio::ip::address_v4::loopback());
+
+ stream_type client_socket(io_context);
+ client_socket.lowest_layer().connect(server_endpoint);
+
+ stream_type server_socket(io_context);
+ acceptor.async_accept(server_socket.lowest_layer(), &handle_accept);
+ io_context.run();
+ io_context.restart();
+
+ const char write_data[]
+ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ const asio::const_buffer write_buf = asio::buffer(write_data);
+
+ std::size_t bytes_written = 0;
+ while (bytes_written < sizeof(write_data))
+ {
+ client_socket.async_write_some(
+ asio::buffer(write_buf + bytes_written),
+ bindns::bind(handle_write, _1, _2, &bytes_written));
+ io_context.run();
+ io_context.restart();
+ client_socket.async_flush(
+ bindns::bind(handle_flush, _1));
+ io_context.run();
+ io_context.restart();
+ }
+
+ char read_data[sizeof(write_data)];
+ const asio::mutable_buffer read_buf = asio::buffer(read_data);
+
+ std::size_t bytes_read = 0;
+ while (bytes_read < sizeof(read_data))
+ {
+ server_socket.async_read_some(
+ asio::buffer(read_buf + bytes_read),
+ bindns::bind(handle_read, _1, _2, &bytes_read));
+ io_context.run();
+ io_context.restart();
+ }
+
+ ASIO_CHECK(bytes_written == sizeof(write_data));
+ ASIO_CHECK(bytes_read == sizeof(read_data));
+ ASIO_CHECK(memcmp(write_data, read_data, sizeof(write_data)) == 0);
+
+ bytes_written = 0;
+ while (bytes_written < sizeof(write_data))
+ {
+ server_socket.async_write_some(
+ asio::buffer(write_buf + bytes_written),
+ bindns::bind(handle_write, _1, _2, &bytes_written));
+ io_context.run();
+ io_context.restart();
+ server_socket.async_flush(
+ bindns::bind(handle_flush, _1));
+ io_context.run();
+ io_context.restart();
+ }
+
+ bytes_read = 0;
+ while (bytes_read < sizeof(read_data))
+ {
+ client_socket.async_read_some(
+ asio::buffer(read_buf + bytes_read),
+ bindns::bind(handle_read, _1, _2, &bytes_read));
+ io_context.run();
+ io_context.restart();
+ }
+
+ ASIO_CHECK(bytes_written == sizeof(write_data));
+ ASIO_CHECK(bytes_read == sizeof(read_data));
+ ASIO_CHECK(memcmp(write_data, read_data, sizeof(write_data)) == 0);
+
+ server_socket.close();
+ client_socket.async_read_some(asio::buffer(read_buf), handle_read_eof);
+}
+
+ASIO_TEST_SUITE
+(
+ "buffered_write_stream",
+ ASIO_COMPILE_TEST_CASE(test_compile)
+ ASIO_TEST_CASE(test_sync_operations)
+ ASIO_TEST_CASE(test_async_operations)
+)
diff --git a/3rdparty/asio/src/tests/unit/buffers_iterator.cpp b/3rdparty/asio/src/tests/unit/buffers_iterator.cpp
new file mode 100644
index 00000000000..071dc1bb8b3
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/buffers_iterator.cpp
@@ -0,0 +1,281 @@
+//
+// buffers_iterator.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/buffers_iterator.hpp"
+
+#include <array>
+#include "asio/buffer.hpp"
+#include "unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+// buffers_iterator_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all operations on the buffers_iterator compile
+// and link correctly. Runtime failures are ignored.
+
+namespace buffers_iterator_compile {
+
+using std::array;
+using std::vector;
+using namespace asio;
+
+void test()
+{
+ try
+ {
+ char data1[16], data2[16];
+ const char cdata1[16] = "", cdata2[16] = "";
+ mutable_buffer mb1 = buffer(data1);
+ array<mutable_buffer, 2> mb2 = {{ buffer(data1), buffer(data2) }};
+ std::vector<mutable_buffer> mb3;
+ mb3.push_back(buffer(data1));
+ const_buffer cb1 = buffer(cdata1);
+ array<const_buffer, 2> cb2 = {{ buffer(cdata1), buffer(cdata2) }};
+ vector<const_buffer> cb3;
+ cb3.push_back(buffer(cdata1));
+
+
+ // buffers_iterator constructors.
+
+ buffers_iterator<mutable_buffer, char> bi1;
+ buffers_iterator<mutable_buffer, const char> bi2;
+ buffers_iterator<array<mutable_buffer, 2>, char> bi3;
+ buffers_iterator<array<mutable_buffer, 2>, const char> bi4;
+ buffers_iterator<vector<mutable_buffer>, char> bi5;
+ buffers_iterator<vector<mutable_buffer>, const char> bi6;
+ buffers_iterator<const_buffer, char> bi7;
+ buffers_iterator<const_buffer, const char> bi8;
+ buffers_iterator<array<const_buffer, 2>, char> bi9;
+ buffers_iterator<array<const_buffer, 2>, const char> bi10;
+ buffers_iterator<vector<const_buffer>, char> bi11;
+ buffers_iterator<vector<const_buffer>, const char> bi12;
+
+ buffers_iterator<mutable_buffer, char> bi13(
+ buffers_iterator<mutable_buffer, char>::begin(mb1));
+ buffers_iterator<mutable_buffer, const char> bi14(
+ buffers_iterator<mutable_buffer, const char>::begin(mb1));
+ buffers_iterator<array<mutable_buffer, 2>, char> bi15(
+ buffers_iterator<array<mutable_buffer, 2>, char>::begin(mb2));
+ buffers_iterator<array<mutable_buffer, 2>, const char> bi16(
+ buffers_iterator<array<mutable_buffer, 2>, const char>::begin(mb2));
+ buffers_iterator<vector<mutable_buffer>, char> bi17(
+ buffers_iterator<vector<mutable_buffer>, char>::begin(mb3));
+ buffers_iterator<vector<mutable_buffer>, const char> bi18(
+ buffers_iterator<vector<mutable_buffer>, const char>::begin(mb3));
+ buffers_iterator<const_buffer, char> bi19(
+ buffers_iterator<const_buffer, char>::begin(cb1));
+ buffers_iterator<const_buffer, const char> bi20(
+ buffers_iterator<const_buffer, const char>::begin(cb1));
+ buffers_iterator<array<const_buffer, 2>, char> bi21(
+ buffers_iterator<array<const_buffer, 2>, char>::begin(cb2));
+ buffers_iterator<array<const_buffer, 2>, const char> bi22(
+ buffers_iterator<array<const_buffer, 2>, const char>::begin(cb2));
+ buffers_iterator<vector<const_buffer>, char> bi23(
+ buffers_iterator<vector<const_buffer>, char>::begin(cb3));
+ buffers_iterator<vector<const_buffer>, const char> bi24(
+ buffers_iterator<vector<const_buffer>, const char>::begin(cb3));
+
+ // buffers_iterator member functions.
+
+ bi1 = buffers_iterator<mutable_buffer, char>::begin(mb1);
+ bi2 = buffers_iterator<mutable_buffer, const char>::begin(mb1);
+ bi3 = buffers_iterator<array<mutable_buffer, 2>, char>::begin(mb2);
+ bi4 = buffers_iterator<array<mutable_buffer, 2>, const char>::begin(mb2);
+ bi5 = buffers_iterator<vector<mutable_buffer>, char>::begin(mb3);
+ bi6 = buffers_iterator<vector<mutable_buffer>, const char>::begin(mb3);
+ bi7 = buffers_iterator<const_buffer, char>::begin(cb1);
+ bi8 = buffers_iterator<const_buffer, const char>::begin(cb1);
+ bi9 = buffers_iterator<array<const_buffer, 2>, char>::begin(cb2);
+ bi10 = buffers_iterator<array<const_buffer, 2>, const char>::begin(cb2);
+ bi11 = buffers_iterator<vector<const_buffer>, char>::begin(cb3);
+ bi12 = buffers_iterator<vector<const_buffer>, const char>::begin(cb3);
+
+ bi1 = buffers_iterator<mutable_buffer, char>::end(mb1);
+ bi2 = buffers_iterator<mutable_buffer, const char>::end(mb1);
+ bi3 = buffers_iterator<array<mutable_buffer, 2>, char>::end(mb2);
+ bi4 = buffers_iterator<array<mutable_buffer, 2>, const char>::end(mb2);
+ bi5 = buffers_iterator<vector<mutable_buffer>, char>::end(mb3);
+ bi6 = buffers_iterator<vector<mutable_buffer>, const char>::end(mb3);
+ bi7 = buffers_iterator<const_buffer, char>::end(cb1);
+ bi8 = buffers_iterator<const_buffer, const char>::end(cb1);
+ bi9 = buffers_iterator<array<const_buffer, 2>, char>::end(cb2);
+ bi10 = buffers_iterator<array<const_buffer, 2>, const char>::end(cb2);
+ bi11 = buffers_iterator<vector<const_buffer>, char>::end(cb3);
+ bi12 = buffers_iterator<vector<const_buffer>, const char>::end(cb3);
+
+ // buffers_iterator related functions.
+
+ bi1 = buffers_begin(mb1);
+ bi3 = buffers_begin(mb2);
+ bi5 = buffers_begin(mb3);
+ bi7 = buffers_begin(cb1);
+ bi9 = buffers_begin(cb2);
+ bi11 = buffers_begin(cb3);
+
+ bi1 = buffers_end(mb1);
+ bi3 = buffers_end(mb2);
+ bi5 = buffers_end(mb3);
+ bi7 = buffers_end(cb1);
+ bi9 = buffers_end(cb2);
+ bi11 = buffers_end(cb3);
+
+ // RandomAccessIterator operations.
+
+ --bi1;
+ --bi2;
+ --bi3;
+ --bi4;
+ --bi5;
+ --bi6;
+ --bi7;
+ --bi8;
+ --bi9;
+ --bi10;
+ --bi11;
+ --bi12;
+
+ ++bi1;
+ ++bi2;
+ ++bi3;
+ ++bi4;
+ ++bi5;
+ ++bi6;
+ ++bi7;
+ ++bi8;
+ ++bi9;
+ ++bi10;
+ ++bi11;
+ ++bi12;
+
+ bi1--;
+ bi2--;
+ bi3--;
+ bi4--;
+ bi5--;
+ bi6--;
+ bi7--;
+ bi8--;
+ bi9--;
+ bi10--;
+ bi11--;
+ bi12--;
+
+ bi1++;
+ bi2++;
+ bi3++;
+ bi4++;
+ bi5++;
+ bi6++;
+ bi7++;
+ bi8++;
+ bi9++;
+ bi10++;
+ bi11++;
+ bi12++;
+
+ bi1 -= 1;
+ bi2 -= 1;
+ bi3 -= 1;
+ bi4 -= 1;
+ bi5 -= 1;
+ bi6 -= 1;
+ bi7 -= 1;
+ bi8 -= 1;
+ bi9 -= 1;
+ bi10 -= 1;
+ bi11 -= 1;
+ bi12 -= 1;
+
+ bi1 += 1;
+ bi2 += 1;
+ bi3 += 1;
+ bi4 += 1;
+ bi5 += 1;
+ bi6 += 1;
+ bi7 += 1;
+ bi8 += 1;
+ bi9 += 1;
+ bi10 += 1;
+ bi11 += 1;
+ bi12 += 1;
+
+ bi1 = bi1 - 1;
+ bi2 = bi2 - 1;
+ bi3 = bi3 - 1;
+ bi4 = bi4 - 1;
+ bi5 = bi5 - 1;
+ bi6 = bi6 - 1;
+ bi7 = bi7 - 1;
+ bi8 = bi8 - 1;
+ bi9 = bi9 - 1;
+ bi10 = bi10 - 1;
+ bi11 = bi11 - 1;
+ bi12 = bi12 - 1;
+
+ bi1 = bi1 + 1;
+ bi2 = bi2 + 1;
+ bi3 = bi3 + 1;
+ bi4 = bi4 + 1;
+ bi5 = bi5 + 1;
+ bi6 = bi6 + 1;
+ bi7 = bi7 + 1;
+ bi8 = bi8 + 1;
+ bi9 = bi9 + 1;
+ bi10 = bi10 + 1;
+ bi11 = bi11 + 1;
+ bi12 = bi12 + 1;
+
+ bi1 = (-1) + bi1;
+ bi2 = (-1) + bi2;
+ bi3 = (-1) + bi3;
+ bi4 = (-1) + bi4;
+ bi5 = (-1) + bi5;
+ bi6 = (-1) + bi6;
+ bi7 = (-1) + bi7;
+ bi8 = (-1) + bi8;
+ bi9 = (-1) + bi9;
+ bi10 = (-1) + bi10;
+ bi11 = (-1) + bi11;
+ bi12 = (-1) + bi12;
+
+ (void)static_cast<std::ptrdiff_t>(bi13 - bi1);
+ (void)static_cast<std::ptrdiff_t>(bi14 - bi2);
+ (void)static_cast<std::ptrdiff_t>(bi15 - bi3);
+ (void)static_cast<std::ptrdiff_t>(bi16 - bi4);
+ (void)static_cast<std::ptrdiff_t>(bi17 - bi5);
+ (void)static_cast<std::ptrdiff_t>(bi18 - bi6);
+ (void)static_cast<std::ptrdiff_t>(bi19 - bi7);
+ (void)static_cast<std::ptrdiff_t>(bi20 - bi8);
+ (void)static_cast<std::ptrdiff_t>(bi21 - bi9);
+ (void)static_cast<std::ptrdiff_t>(bi22 - bi10);
+ (void)static_cast<std::ptrdiff_t>(bi23 - bi11);
+ (void)static_cast<std::ptrdiff_t>(bi24 - bi12);
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace buffers_iterator_compile
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "buffers_iterator",
+ ASIO_COMPILE_TEST_CASE(buffers_iterator_compile::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/cancellation_signal.cpp b/3rdparty/asio/src/tests/unit/cancellation_signal.cpp
new file mode 100644
index 00000000000..0b0f72fcbcb
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/cancellation_signal.cpp
@@ -0,0 +1,25 @@
+//
+// cancellation_signal.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/cancellation_signal.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "cancellation_signal",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/cancellation_state.cpp b/3rdparty/asio/src/tests/unit/cancellation_state.cpp
new file mode 100644
index 00000000000..74bc6566916
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/cancellation_state.cpp
@@ -0,0 +1,25 @@
+//
+// cancellation_state.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/cancellation_state.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "cancellation_state",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/cancellation_type.cpp b/3rdparty/asio/src/tests/unit/cancellation_type.cpp
new file mode 100644
index 00000000000..fd6accb0a05
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/cancellation_type.cpp
@@ -0,0 +1,25 @@
+//
+// cancellation_type.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/cancellation_type.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "cancellation_type",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/co_spawn.cpp b/3rdparty/asio/src/tests/unit/co_spawn.cpp
new file mode 100644
index 00000000000..c5d1fbf776d
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/co_spawn.cpp
@@ -0,0 +1,133 @@
+//
+// co_spawn.cpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/co_spawn.hpp"
+
+#include "unit_test.hpp"
+
+#if defined(ASIO_HAS_CO_AWAIT)
+
+#include <stdexcept>
+#include "asio/any_completion_handler.hpp"
+#include "asio/bind_cancellation_slot.hpp"
+#include "asio/io_context.hpp"
+
+asio::awaitable<void> void_returning_coroutine()
+{
+ co_return;
+}
+
+asio::awaitable<int> int_returning_coroutine()
+{
+ co_return 42;
+}
+
+void test_co_spawn_with_any_completion_handler()
+{
+ asio::io_context ctx;
+
+ bool called = false;
+ asio::co_spawn(ctx, void_returning_coroutine(),
+ asio::any_completion_handler<void(std::exception_ptr)>(
+ [&](std::exception_ptr)
+ {
+ called = true;
+ }));
+
+ ASIO_CHECK(!called);
+
+ ctx.run();
+
+ ASIO_CHECK(called);
+
+ int result = 0;
+ asio::co_spawn(ctx, int_returning_coroutine(),
+ asio::any_completion_handler<void(std::exception_ptr, int)>(
+ [&](std::exception_ptr, int i)
+ {
+ result = i;
+ }));
+
+ ASIO_CHECK(result == 0);
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(result == 42);
+}
+
+void test_co_spawn_immediate_cancel()
+{
+ asio::cancellation_signal sig;
+ asio::io_context ctx;
+
+ std::exception_ptr result = nullptr;
+ bool called = false;
+ asio::co_spawn(ctx, void_returning_coroutine(),
+ asio::bind_cancellation_slot(sig.slot(),
+ [&](std::exception_ptr e)
+ {
+ result = e;
+ called = true;
+ }));
+
+ ASIO_CHECK(!called);
+ ASIO_CHECK(result == nullptr);
+
+ sig.emit(asio::cancellation_type::all);
+ ctx.run();
+
+ ASIO_CHECK(called);
+ ASIO_CHECK(result != nullptr);
+
+ result = nullptr;
+ called = false;
+ asio::co_spawn(ctx, int_returning_coroutine(),
+ asio::bind_cancellation_slot(sig.slot(),
+ [&](std::exception_ptr e, int i)
+ {
+ ASIO_CHECK(i != 42);
+ result = e;
+ called = true;
+ }));
+
+ ASIO_CHECK(!called);
+ ASIO_CHECK(result == nullptr);
+
+ sig.emit(asio::cancellation_type::all);
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(called);
+ ASIO_CHECK(result != nullptr);
+}
+
+ASIO_TEST_SUITE
+(
+ "co_spawn",
+ ASIO_TEST_CASE(test_co_spawn_with_any_completion_handler)
+ ASIO_TEST_CASE(test_co_spawn_immediate_cancel)
+)
+
+#else // defined(ASIO_HAS_CO_AWAIT)
+
+ASIO_TEST_SUITE
+(
+ "co_spawn",
+ ASIO_TEST_CASE(null_test)
+)
+
+#endif // defined(ASIO_HAS_CO_AWAIT)
diff --git a/3rdparty/asio/src/tests/unit/completion_condition.cpp b/3rdparty/asio/src/tests/unit/completion_condition.cpp
new file mode 100644
index 00000000000..106789e5e3c
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/completion_condition.cpp
@@ -0,0 +1,25 @@
+//
+// completion_condition.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/completion_condition.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "completion_condition",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/compose.cpp b/3rdparty/asio/src/tests/unit/compose.cpp
new file mode 100644
index 00000000000..c9820af2fd3
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/compose.cpp
@@ -0,0 +1,528 @@
+//
+// compose.cpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/compose.hpp"
+
+#include <functional>
+#include "asio/bind_cancellation_slot.hpp"
+#include "asio/cancellation_signal.hpp"
+#include "asio/io_context.hpp"
+#include "asio/post.hpp"
+#include "asio/system_timer.hpp"
+#include "unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+class impl_0_completion_args
+{
+public:
+ explicit impl_0_completion_args(asio::io_context& ioc)
+ : ioc_(ioc),
+ state_(starting)
+ {
+ }
+
+ template <typename Self>
+ void operator()(Self& self)
+ {
+ switch (state_)
+ {
+ case starting:
+ state_ = posting;
+ asio::post(ioc_, static_cast<Self&&>(self));
+ break;
+ case posting:
+ self.complete();
+ break;
+ default:
+ break;
+ }
+ }
+
+private:
+ asio::io_context& ioc_;
+ enum { starting, posting } state_;
+};
+
+template <typename CompletionToken>
+ASIO_INITFN_RESULT_TYPE(CompletionToken, void())
+async_0_completion_args(asio::io_context& ioc,
+ CompletionToken&& token)
+{
+ return asio::async_compose<CompletionToken, void()>(
+ impl_0_completion_args(ioc), token);
+}
+
+void compose_0_args_handler(int* count)
+{
+ ++(*count);
+}
+
+struct compose_0_args_lvalue_handler
+{
+ int* count_;
+
+ void operator()()
+ {
+ ++(*count_);
+ }
+};
+
+void compose_0_completion_args_test()
+{
+ namespace bindns = std;
+
+ asio::io_context ioc;
+ int count = 0;
+
+ async_0_completion_args(ioc, bindns::bind(&compose_0_args_handler, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+
+ ioc.restart();
+ count = 0;
+
+ compose_0_args_lvalue_handler lvalue_handler = { &count };
+ async_0_completion_args(ioc, lvalue_handler);
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+}
+
+//------------------------------------------------------------------------------
+
+class impl_1_completion_arg
+{
+public:
+ explicit impl_1_completion_arg(asio::io_context& ioc)
+ : ioc_(ioc),
+ state_(starting)
+ {
+ }
+
+ template <typename Self>
+ void operator()(Self& self)
+ {
+ switch (state_)
+ {
+ case starting:
+ state_ = posting;
+ asio::post(ioc_, static_cast<Self&&>(self));
+ break;
+ case posting:
+ self.complete(42);
+ break;
+ default:
+ break;
+ }
+ }
+
+private:
+ asio::io_context& ioc_;
+ enum { starting, posting } state_;
+};
+
+template <typename CompletionToken>
+ASIO_INITFN_RESULT_TYPE(CompletionToken, void(int))
+async_1_completion_arg(asio::io_context& ioc,
+ CompletionToken&& token)
+{
+ return asio::async_compose<CompletionToken, void(int)>(
+ impl_1_completion_arg(ioc), token);
+}
+
+void compose_1_arg_handler(int* count, int* result_out, int result)
+{
+ ++(*count);
+ *result_out = result;
+}
+
+struct compose_1_arg_lvalue_handler
+{
+ int* count_;
+ int* result_out_;
+
+ void operator()(int result)
+ {
+ ++(*count_);
+ *result_out_ = result;
+ }
+};
+
+void compose_1_completion_arg_test()
+{
+ namespace bindns = std;
+ using bindns::placeholders::_1;
+
+ asio::io_context ioc;
+ int count = 0;
+ int result = 0;
+
+ async_1_completion_arg(ioc,
+ bindns::bind(&compose_1_arg_handler, &count, &result, _1));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+ ASIO_CHECK(result == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == 42);
+
+ ioc.restart();
+ count = 0;
+ result = 0;
+
+ compose_1_arg_lvalue_handler lvalue_handler = { &count, &result };
+ async_1_completion_arg(ioc, lvalue_handler);
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+ ASIO_CHECK(result == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == 42);
+}
+
+//------------------------------------------------------------------------------
+
+typedef asio::enable_terminal_cancellation default_filter;
+
+template <typename CancellationFilter>
+class impl_cancellable
+{
+public:
+ explicit impl_cancellable(CancellationFilter cancellation_filter,
+ asio::system_timer& timer)
+ : cancellation_filter_(cancellation_filter),
+ timer_(timer),
+ state_(starting)
+ {
+ }
+
+ template <typename Self>
+ void operator()(Self& self,
+ const asio::error_code& ec = asio::error_code())
+ {
+ switch (state_)
+ {
+ case starting:
+ if (!asio::is_same<CancellationFilter, default_filter>::value)
+ self.reset_cancellation_state(cancellation_filter_);
+ state_ = waiting;
+ timer_.expires_after(asio::chrono::milliseconds(100));
+ timer_.async_wait(static_cast<Self&&>(self));
+ break;
+ case waiting:
+ self.complete(!ec);
+ break;
+ default:
+ break;
+ }
+ }
+
+private:
+ CancellationFilter cancellation_filter_;
+ asio::system_timer& timer_;
+ enum { starting, waiting } state_;
+};
+
+template <typename CancellationFilter, typename CompletionToken>
+ASIO_INITFN_RESULT_TYPE(CompletionToken, void(bool))
+async_cancellable(CancellationFilter cancellation_filter,
+ asio::system_timer& timer,
+ CompletionToken&& token)
+{
+ return asio::async_compose<CompletionToken, void(bool)>(
+ impl_cancellable<CancellationFilter>(cancellation_filter, timer), token);
+}
+
+void compose_partial_cancellation_handler(
+ int* count, bool* result_out, bool result)
+{
+ ++(*count);
+ *result_out = result;
+}
+
+void compose_default_cancellation_test()
+{
+ namespace bindns = std;
+ using bindns::placeholders::_1;
+
+ asio::io_context ioc;
+ asio::system_timer timer(ioc);
+ asio::cancellation_signal signal;
+ int count = 0;
+ bool result = false;
+
+ async_cancellable(default_filter(), timer,
+ bindns::bind(&compose_partial_cancellation_handler,
+ &count, &result, _1));
+
+ ioc.run();
+
+ // No cancellation, operation completes successfully.
+
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == true);
+
+ ioc.restart();
+ count = 0;
+ result = 0;
+
+ async_cancellable(default_filter(), timer,
+ asio::bind_cancellation_slot(signal.slot(),
+ bindns::bind(&compose_partial_cancellation_handler,
+ &count, &result, _1)));
+
+ // Total cancellation unsupported. Operation completes successfully.
+ signal.emit(asio::cancellation_type::total);
+
+ ioc.run();
+
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == true);
+
+ ioc.restart();
+ count = 0;
+ result = 0;
+
+ async_cancellable(default_filter(), timer,
+ asio::bind_cancellation_slot(signal.slot(),
+ bindns::bind(&compose_partial_cancellation_handler,
+ &count, &result, _1)));
+
+ // Partial cancellation unsupported. Operation completes successfully.
+ signal.emit(asio::cancellation_type::partial);
+
+ ioc.run();
+
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == true);
+
+ ioc.restart();
+ count = 0;
+ result = 0;
+
+ async_cancellable(default_filter(), timer,
+ asio::bind_cancellation_slot(signal.slot(),
+ bindns::bind(&compose_partial_cancellation_handler,
+ &count, &result, _1)));
+
+ // Terminal cancellation works. Operation completes with failure.
+ signal.emit(asio::cancellation_type::terminal);
+
+ ioc.run();
+
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == false);
+}
+
+void compose_partial_cancellation_test()
+{
+ namespace bindns = std;
+ using bindns::placeholders::_1;
+
+ asio::io_context ioc;
+ asio::system_timer timer(ioc);
+ asio::cancellation_signal signal;
+ int count = 0;
+ bool result = false;
+
+ async_cancellable(asio::enable_partial_cancellation(), timer,
+ bindns::bind(&compose_partial_cancellation_handler,
+ &count, &result, _1));
+
+ ioc.run();
+
+ // No cancellation, operation completes successfully.
+
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == true);
+
+ ioc.restart();
+ count = 0;
+ result = 0;
+
+ async_cancellable(asio::enable_partial_cancellation(), timer,
+ asio::bind_cancellation_slot(signal.slot(),
+ bindns::bind(&compose_partial_cancellation_handler,
+ &count, &result, _1)));
+
+ // Total cancellation unsupported. Operation completes successfully.
+ signal.emit(asio::cancellation_type::total);
+
+ ioc.run();
+
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == true);
+
+ ioc.restart();
+ count = 0;
+ result = 0;
+
+ async_cancellable(asio::enable_partial_cancellation(), timer,
+ asio::bind_cancellation_slot(signal.slot(),
+ bindns::bind(&compose_partial_cancellation_handler,
+ &count, &result, _1)));
+
+ // Partial cancellation works. Operation completes with failure.
+ signal.emit(asio::cancellation_type::partial);
+
+ ioc.run();
+
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == false);
+
+ ioc.restart();
+ count = 0;
+ result = 0;
+
+ async_cancellable(asio::enable_partial_cancellation(), timer,
+ asio::bind_cancellation_slot(signal.slot(),
+ bindns::bind(&compose_partial_cancellation_handler,
+ &count, &result, _1)));
+
+ // Terminal cancellation works. Operation completes with failure.
+ signal.emit(asio::cancellation_type::terminal);
+
+ ioc.run();
+
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == false);
+}
+
+void compose_total_cancellation_test()
+{
+ namespace bindns = std;
+ using bindns::placeholders::_1;
+
+ asio::io_context ioc;
+ asio::system_timer timer(ioc);
+ asio::cancellation_signal signal;
+ int count = 0;
+ bool result = false;
+
+ async_cancellable(asio::enable_total_cancellation(), timer,
+ bindns::bind(&compose_partial_cancellation_handler,
+ &count, &result, _1));
+
+ ioc.run();
+
+ // No cancellation, operation completes successfully.
+
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == true);
+
+ ioc.restart();
+ count = 0;
+ result = 0;
+
+ async_cancellable(asio::enable_total_cancellation(), timer,
+ asio::bind_cancellation_slot(signal.slot(),
+ bindns::bind(&compose_partial_cancellation_handler,
+ &count, &result, _1)));
+
+ // Total cancellation works. Operation completes with failure.
+ signal.emit(asio::cancellation_type::total);
+
+ ioc.run();
+
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == false);
+
+ ioc.restart();
+ count = 0;
+ result = 0;
+
+ async_cancellable(asio::enable_total_cancellation(), timer,
+ asio::bind_cancellation_slot(signal.slot(),
+ bindns::bind(&compose_partial_cancellation_handler,
+ &count, &result, _1)));
+
+ // Partial cancellation works. Operation completes with failure.
+ signal.emit(asio::cancellation_type::partial);
+
+ ioc.run();
+
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == false);
+
+ ioc.restart();
+ count = 0;
+ result = 0;
+
+ async_cancellable(asio::enable_total_cancellation(), timer,
+ asio::bind_cancellation_slot(signal.slot(),
+ bindns::bind(&compose_partial_cancellation_handler,
+ &count, &result, _1)));
+
+ // Terminal cancellation works. Operation completes with failure.
+ signal.emit(asio::cancellation_type::terminal);
+
+ ioc.run();
+
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+ ASIO_CHECK(result == false);
+}
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "compose",
+ ASIO_TEST_CASE(compose_0_completion_args_test)
+ ASIO_TEST_CASE(compose_1_completion_arg_test)
+ ASIO_TEST_CASE(compose_default_cancellation_test)
+ ASIO_TEST_CASE(compose_partial_cancellation_test)
+ ASIO_TEST_CASE(compose_total_cancellation_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/connect.cpp b/3rdparty/asio/src/tests/unit/connect.cpp
new file mode 100644
index 00000000000..16c0331b4a3
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/connect.cpp
@@ -0,0 +1,1180 @@
+//
+// connect.cpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/connect.hpp"
+
+#include <functional>
+#include <vector>
+#include "asio/detail/thread.hpp"
+#include "asio/ip/tcp.hpp"
+#include "unit_test.hpp"
+
+namespace bindns = std;
+using bindns::placeholders::_1;
+using bindns::placeholders::_2;
+
+class connection_sink
+{
+public:
+ connection_sink()
+ : acceptor_(io_context_,
+ asio::ip::tcp::endpoint(
+ asio::ip::address_v4::loopback(), 0)),
+ target_endpoint_(acceptor_.local_endpoint()),
+ socket_(io_context_),
+ thread_(bindns::bind(&connection_sink::run, this))
+ {
+ }
+
+ ~connection_sink()
+ {
+ io_context_.stop();
+ thread_.join();
+ }
+
+ asio::ip::tcp::endpoint target_endpoint()
+ {
+ return target_endpoint_;
+ }
+
+private:
+ void run()
+ {
+ io_context_.run();
+ }
+
+ void handle_accept()
+ {
+ socket_.close();
+ acceptor_.async_accept(socket_,
+ bindns::bind(&connection_sink::handle_accept, this));
+ }
+
+ asio::io_context io_context_;
+ asio::ip::tcp::acceptor acceptor_;
+ asio::ip::tcp::endpoint target_endpoint_;
+ asio::ip::tcp::socket socket_;
+ asio::detail::thread thread_;
+};
+
+bool true_cond_1(const asio::error_code& /*ec*/,
+ const asio::ip::tcp::endpoint& /*endpoint*/)
+{
+ return true;
+}
+
+struct true_cond_2
+{
+ template <typename Endpoint>
+ bool operator()(const asio::error_code& /*ec*/,
+ const Endpoint& /*endpoint*/)
+ {
+ return true;
+ }
+};
+
+std::vector<asio::ip::tcp::endpoint>::const_iterator legacy_true_cond_1(
+ const asio::error_code& /*ec*/,
+ std::vector<asio::ip::tcp::endpoint>::const_iterator next)
+{
+ return next;
+}
+
+struct legacy_true_cond_2
+{
+ template <typename Iterator>
+ Iterator operator()(const asio::error_code& /*ec*/, Iterator next)
+ {
+ return next;
+ }
+};
+
+bool false_cond(const asio::error_code& /*ec*/,
+ const asio::ip::tcp::endpoint& /*endpoint*/)
+{
+ return false;
+}
+
+void range_handler(const asio::error_code& ec,
+ const asio::ip::tcp::endpoint& endpoint,
+ asio::error_code* out_ec,
+ asio::ip::tcp::endpoint* out_endpoint)
+{
+ *out_ec = ec;
+ *out_endpoint = endpoint;
+}
+
+void iter_handler(const asio::error_code& ec,
+ std::vector<asio::ip::tcp::endpoint>::const_iterator iter,
+ asio::error_code* out_ec,
+ std::vector<asio::ip::tcp::endpoint>::const_iterator* out_iter)
+{
+ *out_ec = ec;
+ *out_iter = iter;
+}
+
+void test_connect_range()
+{
+ connection_sink sink;
+ asio::io_context io_context;
+ asio::ip::tcp::socket socket(io_context);
+ std::vector<asio::ip::tcp::endpoint> endpoints;
+ asio::ip::tcp::endpoint result;
+
+ try
+ {
+ result = asio::connect(socket, endpoints);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, endpoints);
+ ASIO_CHECK(result == endpoints[0]);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, endpoints);
+ ASIO_CHECK(result == endpoints[0]);
+
+ endpoints.insert(endpoints.begin(), asio::ip::tcp::endpoint());
+
+ result = asio::connect(socket, endpoints);
+ ASIO_CHECK(result == endpoints[1]);
+}
+
+void test_connect_range_ec()
+{
+ connection_sink sink;
+ asio::io_context io_context;
+ asio::ip::tcp::socket socket(io_context);
+ std::vector<asio::ip::tcp::endpoint> endpoints;
+ asio::ip::tcp::endpoint result;
+ asio::error_code ec;
+
+ result = asio::connect(socket, endpoints, ec);
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, endpoints, ec);
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, endpoints, ec);
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ endpoints.insert(endpoints.begin(), asio::ip::tcp::endpoint());
+
+ result = asio::connect(socket, endpoints, ec);
+ ASIO_CHECK(result == endpoints[1]);
+ ASIO_CHECK(!ec);
+}
+
+void test_connect_range_cond()
+{
+ connection_sink sink;
+ asio::io_context io_context;
+ asio::ip::tcp::socket socket(io_context);
+ std::vector<asio::ip::tcp::endpoint> endpoints;
+ asio::ip::tcp::endpoint result;
+
+ try
+ {
+ result = asio::connect(socket, endpoints, true_cond_1);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ try
+ {
+ result = asio::connect(socket, endpoints, true_cond_2());
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ try
+ {
+ result = asio::connect(socket, endpoints, legacy_true_cond_1);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ try
+ {
+ result = asio::connect(socket, endpoints, legacy_true_cond_2());
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ try
+ {
+ result = asio::connect(socket, endpoints, false_cond);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, endpoints, true_cond_1);
+ ASIO_CHECK(result == endpoints[0]);
+
+ result = asio::connect(socket, endpoints, true_cond_2());
+ ASIO_CHECK(result == endpoints[0]);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_1);
+ ASIO_CHECK(result == endpoints[0]);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_2());
+ ASIO_CHECK(result == endpoints[0]);
+
+ try
+ {
+ result = asio::connect(socket, endpoints, false_cond);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, endpoints, true_cond_1);
+ ASIO_CHECK(result == endpoints[0]);
+
+ result = asio::connect(socket, endpoints, true_cond_2());
+ ASIO_CHECK(result == endpoints[0]);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_1);
+ ASIO_CHECK(result == endpoints[0]);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_2());
+ ASIO_CHECK(result == endpoints[0]);
+
+ try
+ {
+ result = asio::connect(socket, endpoints, false_cond);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ endpoints.insert(endpoints.begin(), asio::ip::tcp::endpoint());
+
+ result = asio::connect(socket, endpoints, true_cond_1);
+ ASIO_CHECK(result == endpoints[1]);
+
+ result = asio::connect(socket, endpoints, true_cond_2());
+ ASIO_CHECK(result == endpoints[1]);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_1);
+ ASIO_CHECK(result == endpoints[1]);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_2());
+ ASIO_CHECK(result == endpoints[1]);
+
+ try
+ {
+ result = asio::connect(socket, endpoints, false_cond);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+}
+
+void test_connect_range_cond_ec()
+{
+ connection_sink sink;
+ asio::io_context io_context;
+ asio::ip::tcp::socket socket(io_context);
+ std::vector<asio::ip::tcp::endpoint> endpoints;
+ asio::ip::tcp::endpoint result;
+ asio::error_code ec;
+
+ result = asio::connect(socket, endpoints, true_cond_1, ec);
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ result = asio::connect(socket, endpoints, true_cond_2(), ec);
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_1, ec);
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_2(), ec);
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ result = asio::connect(socket, endpoints, false_cond, ec);
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, endpoints, true_cond_1, ec);
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, endpoints, true_cond_2(), ec);
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_1, ec);
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_2(), ec);
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, endpoints, false_cond, ec);
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, endpoints, true_cond_1, ec);
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, endpoints, true_cond_2(), ec);
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_1, ec);
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_2(), ec);
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, endpoints, false_cond, ec);
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.insert(endpoints.begin(), asio::ip::tcp::endpoint());
+
+ result = asio::connect(socket, endpoints, true_cond_1, ec);
+ ASIO_CHECK(result == endpoints[1]);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, endpoints, true_cond_2(), ec);
+ ASIO_CHECK(result == endpoints[1]);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_1, ec);
+ ASIO_CHECK(result == endpoints[1]);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, endpoints, legacy_true_cond_2(), ec);
+ ASIO_CHECK(result == endpoints[1]);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, endpoints, false_cond, ec);
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+}
+
+void test_connect_iter()
+{
+ connection_sink sink;
+ asio::io_context io_context;
+ asio::ip::tcp::socket socket(io_context);
+ std::vector<asio::ip::tcp::endpoint> endpoints;
+ const std::vector<asio::ip::tcp::endpoint>& cendpoints = endpoints;
+ std::vector<asio::ip::tcp::endpoint>::const_iterator result;
+
+ try
+ {
+ result = asio::connect(socket, cendpoints.begin(), cendpoints.end());
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, cendpoints.begin(), cendpoints.end());
+ ASIO_CHECK(result == cendpoints.begin());
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, cendpoints.begin(), cendpoints.end());
+ ASIO_CHECK(result == cendpoints.begin());
+
+ endpoints.insert(endpoints.begin(), asio::ip::tcp::endpoint());
+
+ result = asio::connect(socket, cendpoints.begin(), cendpoints.end());
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+}
+
+void test_connect_iter_ec()
+{
+ connection_sink sink;
+ asio::io_context io_context;
+ asio::ip::tcp::socket socket(io_context);
+ std::vector<asio::ip::tcp::endpoint> endpoints;
+ const std::vector<asio::ip::tcp::endpoint>& cendpoints = endpoints;
+ std::vector<asio::ip::tcp::endpoint>::const_iterator result;
+ asio::error_code ec;
+
+ result = asio::connect(socket,
+ cendpoints.begin(), cendpoints.end(), ec);
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket,
+ cendpoints.begin(), cendpoints.end(), ec);
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket,
+ cendpoints.begin(), cendpoints.end(), ec);
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ endpoints.insert(endpoints.begin(), asio::ip::tcp::endpoint());
+
+ result = asio::connect(socket,
+ cendpoints.begin(), cendpoints.end(), ec);
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+ ASIO_CHECK(!ec);
+}
+
+void test_connect_iter_cond()
+{
+ connection_sink sink;
+ asio::io_context io_context;
+ asio::ip::tcp::socket socket(io_context);
+ std::vector<asio::ip::tcp::endpoint> endpoints;
+ const std::vector<asio::ip::tcp::endpoint>& cendpoints = endpoints;
+ std::vector<asio::ip::tcp::endpoint>::const_iterator result;
+
+ try
+ {
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_1);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ try
+ {
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_2());
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ try
+ {
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_1);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ try
+ {
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_2());
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ try
+ {
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), false_cond);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_1);
+ ASIO_CHECK(result == cendpoints.begin());
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_2());
+ ASIO_CHECK(result == cendpoints.begin());
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_1);
+ ASIO_CHECK(result == cendpoints.begin());
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_2());
+ ASIO_CHECK(result == cendpoints.begin());
+
+ try
+ {
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), false_cond);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_1);
+ ASIO_CHECK(result == cendpoints.begin());
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_2());
+ ASIO_CHECK(result == cendpoints.begin());
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_1);
+ ASIO_CHECK(result == cendpoints.begin());
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_2());
+ ASIO_CHECK(result == cendpoints.begin());
+
+ try
+ {
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), false_cond);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+
+ endpoints.insert(endpoints.begin(), asio::ip::tcp::endpoint());
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_1);
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_2());
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_1);
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_2());
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+
+ try
+ {
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), false_cond);
+ ASIO_CHECK(false);
+ }
+ catch (asio::system_error& e)
+ {
+ ASIO_CHECK(e.code() == asio::error::not_found);
+ }
+}
+
+void test_connect_iter_cond_ec()
+{
+ connection_sink sink;
+ asio::io_context io_context;
+ asio::ip::tcp::socket socket(io_context);
+ std::vector<asio::ip::tcp::endpoint> endpoints;
+ const std::vector<asio::ip::tcp::endpoint>& cendpoints = endpoints;
+ std::vector<asio::ip::tcp::endpoint>::const_iterator result;
+ asio::error_code ec;
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_1, ec);
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_2(), ec);
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_1, ec);
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_2(), ec);
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), false_cond, ec);
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_1, ec);
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_2(), ec);
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_1, ec);
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_2(), ec);
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), false_cond, ec);
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_1, ec);
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_2(), ec);
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_1, ec);
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_2(), ec);
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), false_cond, ec);
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.insert(endpoints.begin(), asio::ip::tcp::endpoint());
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_1, ec);
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), true_cond_2(), ec);
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_1, ec);
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), legacy_true_cond_2(), ec);
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+ ASIO_CHECK(!ec);
+
+ result = asio::connect(socket, cendpoints.begin(),
+ cendpoints.end(), false_cond, ec);
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+}
+
+void test_async_connect_range()
+{
+ connection_sink sink;
+ asio::io_context io_context;
+ asio::ip::tcp::socket socket(io_context);
+ std::vector<asio::ip::tcp::endpoint> endpoints;
+ asio::ip::tcp::endpoint result;
+ asio::error_code ec;
+
+ asio::async_connect(socket, endpoints,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ asio::async_connect(socket, endpoints,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ asio::async_connect(socket, endpoints,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ endpoints.insert(endpoints.begin(), asio::ip::tcp::endpoint());
+
+ asio::async_connect(socket, endpoints,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[1]);
+ ASIO_CHECK(!ec);
+}
+
+void test_async_connect_range_cond()
+{
+ connection_sink sink;
+ asio::io_context io_context;
+ asio::ip::tcp::socket socket(io_context);
+ std::vector<asio::ip::tcp::endpoint> endpoints;
+ asio::ip::tcp::endpoint result;
+ asio::error_code ec;
+
+ asio::async_connect(socket, endpoints, true_cond_1,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ asio::async_connect(socket, endpoints, true_cond_2(),
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ asio::async_connect(socket, endpoints, legacy_true_cond_1,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ asio::async_connect(socket, endpoints, legacy_true_cond_2(),
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ asio::async_connect(socket, endpoints, false_cond,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ asio::async_connect(socket, endpoints, true_cond_1,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, endpoints, true_cond_2(),
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, endpoints, legacy_true_cond_1,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, endpoints, legacy_true_cond_2(),
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, endpoints, false_cond,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ asio::async_connect(socket, endpoints, true_cond_1,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, endpoints, true_cond_2(),
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, endpoints, legacy_true_cond_1,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, endpoints, legacy_true_cond_2(),
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[0]);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, endpoints, false_cond,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.insert(endpoints.begin(), asio::ip::tcp::endpoint());
+
+ asio::async_connect(socket, endpoints, true_cond_1,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[1]);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, endpoints, true_cond_2(),
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[1]);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, endpoints, legacy_true_cond_1,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[1]);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, endpoints, legacy_true_cond_2(),
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == endpoints[1]);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, endpoints, false_cond,
+ bindns::bind(range_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == asio::ip::tcp::endpoint());
+ ASIO_CHECK(ec == asio::error::not_found);
+}
+
+void test_async_connect_iter()
+{
+ connection_sink sink;
+ asio::io_context io_context;
+ asio::ip::tcp::socket socket(io_context);
+ std::vector<asio::ip::tcp::endpoint> endpoints;
+ const std::vector<asio::ip::tcp::endpoint>& cendpoints = endpoints;
+ std::vector<asio::ip::tcp::endpoint>::const_iterator result;
+ asio::error_code ec;
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ endpoints.insert(endpoints.begin(), asio::ip::tcp::endpoint());
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+ ASIO_CHECK(!ec);
+}
+
+void test_async_connect_iter_cond()
+{
+ connection_sink sink;
+ asio::io_context io_context;
+ asio::ip::tcp::socket socket(io_context);
+ std::vector<asio::ip::tcp::endpoint> endpoints;
+ const std::vector<asio::ip::tcp::endpoint>& cendpoints = endpoints;
+ std::vector<asio::ip::tcp::endpoint>::const_iterator result;
+ asio::error_code ec;
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ true_cond_1, bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ true_cond_2(), bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ legacy_true_cond_1, bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ legacy_true_cond_2(), bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ false_cond, bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ true_cond_1, bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ true_cond_2(), bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ legacy_true_cond_1, bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ legacy_true_cond_2(), bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ false_cond, bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.push_back(sink.target_endpoint());
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ true_cond_1, bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ true_cond_2(), bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ legacy_true_cond_1, bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ legacy_true_cond_2(), bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin());
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ false_cond, bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+
+ endpoints.insert(endpoints.begin(), asio::ip::tcp::endpoint());
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ true_cond_1, bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ true_cond_2(), bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ legacy_true_cond_1, bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ legacy_true_cond_2(), bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.begin() + 1);
+ ASIO_CHECK(!ec);
+
+ asio::async_connect(socket, cendpoints.begin(), cendpoints.end(),
+ false_cond, bindns::bind(iter_handler, _1, _2, &ec, &result));
+ io_context.restart();
+ io_context.run();
+ ASIO_CHECK(result == cendpoints.end());
+ ASIO_CHECK(ec == asio::error::not_found);
+}
+
+ASIO_TEST_SUITE
+(
+ "connect",
+ ASIO_TEST_CASE(test_connect_range)
+ ASIO_TEST_CASE(test_connect_range_ec)
+ ASIO_TEST_CASE(test_connect_range_cond)
+ ASIO_TEST_CASE(test_connect_range_cond_ec)
+ ASIO_TEST_CASE(test_connect_iter)
+ ASIO_TEST_CASE(test_connect_iter_ec)
+ ASIO_TEST_CASE(test_connect_iter_cond)
+ ASIO_TEST_CASE(test_connect_iter_cond_ec)
+ ASIO_TEST_CASE(test_async_connect_range)
+ ASIO_TEST_CASE(test_async_connect_range_cond)
+ ASIO_TEST_CASE(test_async_connect_iter)
+ ASIO_TEST_CASE(test_async_connect_iter_cond)
+)
diff --git a/3rdparty/asio/src/tests/unit/connect_pipe.cpp b/3rdparty/asio/src/tests/unit/connect_pipe.cpp
new file mode 100644
index 00000000000..8c71a5d093c
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/connect_pipe.cpp
@@ -0,0 +1,154 @@
+//
+// connect_pipe.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/connect_pipe.hpp"
+
+#include <functional>
+#include <string>
+#include "asio/io_context.hpp"
+#include "asio/read.hpp"
+#include "asio/readable_pipe.hpp"
+#include "asio/writable_pipe.hpp"
+#include "asio/write.hpp"
+#include "unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+// connect_pipe_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all connect_pipe functions compile and link
+// correctly. Runtime failures are ignored.
+
+namespace connect_pipe_compile {
+
+void test()
+{
+#if defined(ASIO_HAS_PIPE)
+ using namespace asio;
+
+ try
+ {
+ asio::io_context io_context;
+ asio::error_code ec1;
+
+ readable_pipe p1(io_context);
+ writable_pipe p2(io_context);
+ connect_pipe(p1, p2);
+
+ readable_pipe p3(io_context);
+ writable_pipe p4(io_context);
+ connect_pipe(p3, p4, ec1);
+ }
+ catch (std::exception&)
+ {
+ }
+#endif // defined(ASIO_HAS_PIPE)
+}
+
+} // namespace connect_pipe_compile
+
+//------------------------------------------------------------------------------
+
+// connect_pipe_runtime test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that connect_pipe operates correctly at runtime.
+
+namespace connect_pipe_runtime {
+
+static const char write_data[]
+ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+void handle_read(const asio::error_code& err,
+ size_t bytes_transferred, bool* called)
+{
+ *called = true;
+ ASIO_CHECK(!err);
+ ASIO_CHECK(bytes_transferred == sizeof(write_data));
+}
+
+void handle_write(const asio::error_code& err,
+ size_t bytes_transferred, bool* called)
+{
+ *called = true;
+ ASIO_CHECK(!err);
+ ASIO_CHECK(bytes_transferred == sizeof(write_data));
+}
+
+void test()
+{
+#if defined(ASIO_HAS_PIPE)
+ using namespace std; // For memcmp.
+ using namespace asio;
+
+ namespace bindns = std;
+ using bindns::placeholders::_1;
+ using bindns::placeholders::_2;
+
+ try
+ {
+ asio::io_context io_context;
+ asio::error_code ec1;
+ asio::error_code ec2;
+
+ readable_pipe p1(io_context);
+ writable_pipe p2(io_context);
+ connect_pipe(p1, p2);
+
+ std::string data1 = write_data;
+ asio::write(p2, asio::buffer(data1));
+
+ std::string data2;
+ data2.resize(data1.size());
+ asio::read(p1, asio::buffer(data2));
+
+ ASIO_CHECK(data1 == data2);
+
+ char read_buffer[sizeof(write_data)];
+ bool read_completed = false;
+ asio::async_read(p1,
+ asio::buffer(read_buffer),
+ bindns::bind(handle_read,
+ _1, _2, &read_completed));
+
+ bool write_completed = false;
+ asio::async_write(p2,
+ asio::buffer(write_data),
+ bindns::bind(handle_write,
+ _1, _2, &write_completed));
+
+ io_context.run();
+
+ ASIO_CHECK(read_completed);
+ ASIO_CHECK(write_completed);
+ ASIO_CHECK(memcmp(read_buffer, write_data, sizeof(write_data)) == 0);
+ }
+ catch (std::exception&)
+ {
+ ASIO_CHECK(false);
+ }
+#endif // defined(ASIO_HAS_PIPE)
+}
+
+} // namespace connect_pipe_compile
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "connect_pipe",
+ ASIO_COMPILE_TEST_CASE(connect_pipe_compile::test)
+ ASIO_TEST_CASE(connect_pipe_runtime::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/consign.cpp b/3rdparty/asio/src/tests/unit/consign.cpp
new file mode 100644
index 00000000000..b24f5281c75
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/consign.cpp
@@ -0,0 +1,56 @@
+//
+// consign.cpp
+// ~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/consign.hpp"
+
+#include "asio/bind_executor.hpp"
+#include "asio/io_context.hpp"
+#include "asio/post.hpp"
+#include "asio/system_timer.hpp"
+#include "unit_test.hpp"
+
+void consign_test()
+{
+ asio::io_context io1;
+ asio::io_context io2;
+ asio::system_timer timer1(io1);
+ int count = 0;
+
+ timer1.expires_after(asio::chrono::seconds(0));
+ timer1.async_wait(
+ asio::consign(
+ asio::bind_executor(io2.get_executor(),
+ [&count](asio::error_code)
+ {
+ ++count;
+ }), 123, 321));
+
+ ASIO_CHECK(count == 0);
+
+ io1.run();
+
+ ASIO_CHECK(count == 0);
+
+ io2.run();
+
+ ASIO_CHECK(count == 1);
+}
+
+ASIO_TEST_SUITE
+(
+ "consign",
+ ASIO_TEST_CASE(consign_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/coroutine.cpp b/3rdparty/asio/src/tests/unit/coroutine.cpp
new file mode 100644
index 00000000000..72e6953a31a
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/coroutine.cpp
@@ -0,0 +1,112 @@
+//
+// coroutine.cpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/coroutine.hpp"
+
+#include "unit_test.hpp"
+
+// Must come after all other headers.
+#include "asio/yield.hpp"
+
+//------------------------------------------------------------------------------
+
+// Coroutine completes via yield break.
+
+void yield_break_coro(asio::coroutine& coro)
+{
+ reenter (coro)
+ {
+ yield return;
+ yield break;
+ }
+}
+
+void yield_break_test()
+{
+ asio::coroutine coro;
+ ASIO_CHECK(!coro.is_complete());
+ yield_break_coro(coro);
+ ASIO_CHECK(!coro.is_complete());
+ yield_break_coro(coro);
+ ASIO_CHECK(coro.is_complete());
+}
+
+//------------------------------------------------------------------------------
+
+// Coroutine completes via return.
+
+void return_coro(asio::coroutine& coro)
+{
+ reenter (coro)
+ {
+ return;
+ }
+}
+
+void return_test()
+{
+ asio::coroutine coro;
+ return_coro(coro);
+ ASIO_CHECK(coro.is_complete());
+}
+
+//------------------------------------------------------------------------------
+
+// Coroutine completes via exception.
+
+void exception_coro(asio::coroutine& coro)
+{
+ reenter (coro)
+ {
+ throw 1;
+ }
+}
+
+void exception_test()
+{
+ asio::coroutine coro;
+ try { exception_coro(coro); } catch (int) {}
+ ASIO_CHECK(coro.is_complete());
+}
+
+//------------------------------------------------------------------------------
+
+// Coroutine completes by falling off the end.
+
+void fall_off_end_coro(asio::coroutine& coro)
+{
+ reenter (coro)
+ {
+ }
+}
+
+void fall_off_end_test()
+{
+ asio::coroutine coro;
+ fall_off_end_coro(coro);
+ ASIO_CHECK(coro.is_complete());
+}
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "coroutine",
+ ASIO_TEST_CASE(yield_break_test)
+ ASIO_TEST_CASE(return_test)
+ ASIO_TEST_CASE(exception_test)
+ ASIO_TEST_CASE(fall_off_end_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/deadline_timer.cpp b/3rdparty/asio/src/tests/unit/deadline_timer.cpp
new file mode 100644
index 00000000000..9bc7f16fcd2
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/deadline_timer.cpp
@@ -0,0 +1,444 @@
+//
+// deadline_timer.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/deadline_timer.hpp"
+
+#include "unit_test.hpp"
+
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+
+#include <boost/bind/bind.hpp>
+#include "archetypes/async_result.hpp"
+#include "asio/executor_work_guard.hpp"
+#include "asio/io_context.hpp"
+#include "asio/placeholders.hpp"
+#include "asio/thread.hpp"
+
+using namespace boost::posix_time;
+
+void increment(int* count)
+{
+ ++(*count);
+}
+
+void decrement_to_zero(asio::deadline_timer* t, int* count)
+{
+ if (*count > 0)
+ {
+ --(*count);
+
+ int before_value = *count;
+
+ t->expires_at(t->expires_at() + seconds(1));
+ t->async_wait(boost::bind(decrement_to_zero, t, count));
+
+ // Completion cannot nest, so count value should remain unchanged.
+ ASIO_CHECK(*count == before_value);
+ }
+}
+
+void increment_if_not_cancelled(int* count,
+ const asio::error_code& ec)
+{
+ if (!ec)
+ ++(*count);
+}
+
+void cancel_timer(asio::deadline_timer* t)
+{
+ std::size_t num_cancelled = t->cancel();
+ ASIO_CHECK(num_cancelled == 1);
+}
+
+void cancel_one_timer(asio::deadline_timer* t)
+{
+ std::size_t num_cancelled = t->cancel_one();
+ ASIO_CHECK(num_cancelled == 1);
+}
+
+ptime now()
+{
+#if defined(BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK)
+ return microsec_clock::universal_time();
+#else // defined(BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK)
+ return second_clock::universal_time();
+#endif // defined(BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK)
+}
+
+void deadline_timer_test()
+{
+ asio::io_context ioc;
+ int count = 0;
+
+ ptime start = now();
+
+ asio::deadline_timer t1(ioc, seconds(1));
+ t1.wait();
+
+ // The timer must block until after its expiry time.
+ ptime end = now();
+ ptime expected_end = start + seconds(1);
+ ASIO_CHECK(expected_end < end || expected_end == end);
+
+ start = now();
+
+ asio::deadline_timer t2(ioc, seconds(1) + microseconds(500000));
+ t2.wait();
+
+ // The timer must block until after its expiry time.
+ end = now();
+ expected_end = start + seconds(1) + microseconds(500000);
+ ASIO_CHECK(expected_end < end || expected_end == end);
+
+ t2.expires_at(t2.expires_at() + seconds(1));
+ t2.wait();
+
+ // The timer must block until after its expiry time.
+ end = now();
+ expected_end += seconds(1);
+ ASIO_CHECK(expected_end < end || expected_end == end);
+
+ start = now();
+
+ t2.expires_from_now(seconds(1) + microseconds(200000));
+ t2.wait();
+
+ // The timer must block until after its expiry time.
+ end = now();
+ expected_end = start + seconds(1) + microseconds(200000);
+ ASIO_CHECK(expected_end < end || expected_end == end);
+
+ start = now();
+
+ asio::deadline_timer t3(ioc, seconds(5));
+ t3.async_wait(boost::bind(increment, &count));
+
+ // No completions can be delivered until run() is called.
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all operations have finished, and
+ // this should not be until after the timer's expiry time.
+ ASIO_CHECK(count == 1);
+ end = now();
+ expected_end = start + seconds(1);
+ ASIO_CHECK(expected_end < end || expected_end == end);
+
+ count = 3;
+ start = now();
+
+ asio::deadline_timer t4(ioc, seconds(1));
+ t4.async_wait(boost::bind(decrement_to_zero, &t4, &count));
+
+ // No completions can be delivered until run() is called.
+ ASIO_CHECK(count == 3);
+
+ ioc.restart();
+ ioc.run();
+
+ // The run() call will not return until all operations have finished, and
+ // this should not be until after the timer's final expiry time.
+ ASIO_CHECK(count == 0);
+ end = now();
+ expected_end = start + seconds(3);
+ ASIO_CHECK(expected_end < end || expected_end == end);
+
+ count = 0;
+ start = now();
+
+ asio::deadline_timer t5(ioc, seconds(10));
+ t5.async_wait(boost::bind(increment_if_not_cancelled, &count,
+ asio::placeholders::error));
+ asio::deadline_timer t6(ioc, seconds(1));
+ t6.async_wait(boost::bind(cancel_timer, &t5));
+
+ // No completions can be delivered until run() is called.
+ ASIO_CHECK(count == 0);
+
+ ioc.restart();
+ ioc.run();
+
+ // The timer should have been cancelled, so count should not have changed.
+ // The total run time should not have been much more than 1 second (and
+ // certainly far less than 10 seconds).
+ ASIO_CHECK(count == 0);
+ end = now();
+ expected_end = start + seconds(2);
+ ASIO_CHECK(end < expected_end);
+
+ // Wait on the timer again without cancelling it. This time the asynchronous
+ // wait should run to completion and increment the counter.
+ t5.async_wait(boost::bind(increment_if_not_cancelled, &count,
+ asio::placeholders::error));
+
+ ioc.restart();
+ ioc.run();
+
+ // The timer should not have been cancelled, so count should have changed.
+ // The total time since the timer was created should be more than 10 seconds.
+ ASIO_CHECK(count == 1);
+ end = now();
+ expected_end = start + seconds(10);
+ ASIO_CHECK(expected_end < end || expected_end == end);
+
+ count = 0;
+ start = now();
+
+ // Start two waits on a timer, one of which will be cancelled. The one
+ // which is not cancelled should still run to completion and increment the
+ // counter.
+ asio::deadline_timer t7(ioc, seconds(3));
+ t7.async_wait(boost::bind(increment_if_not_cancelled, &count,
+ asio::placeholders::error));
+ t7.async_wait(boost::bind(increment_if_not_cancelled, &count,
+ asio::placeholders::error));
+ asio::deadline_timer t8(ioc, seconds(1));
+ t8.async_wait(boost::bind(cancel_one_timer, &t7));
+
+ ioc.restart();
+ ioc.run();
+
+ // One of the waits should not have been cancelled, so count should have
+ // changed. The total time since the timer was created should be more than 3
+ // seconds.
+ ASIO_CHECK(count == 1);
+ end = now();
+ expected_end = start + seconds(3);
+ ASIO_CHECK(expected_end < end || expected_end == end);
+}
+
+void timer_handler(const asio::error_code&)
+{
+}
+
+void deadline_timer_cancel_test()
+{
+ static asio::io_context io_context;
+ struct timer
+ {
+ asio::deadline_timer t;
+ timer() : t(io_context) { t.expires_at(boost::posix_time::pos_infin); }
+ } timers[50];
+
+ timers[2].t.async_wait(&timer_handler);
+ timers[41].t.async_wait(&timer_handler);
+ for (int i = 10; i < 20; ++i)
+ timers[i].t.async_wait(&timer_handler);
+
+ ASIO_CHECK(timers[2].t.cancel() == 1);
+ ASIO_CHECK(timers[41].t.cancel() == 1);
+ for (int i = 10; i < 20; ++i)
+ ASIO_CHECK(timers[i].t.cancel() == 1);
+}
+
+struct custom_allocation_timer_handler
+{
+ custom_allocation_timer_handler(int* count) : count_(count) {}
+ void operator()(const asio::error_code&) {}
+ int* count_;
+
+ template <typename T>
+ struct allocator
+ {
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ typedef T* pointer;
+ typedef const T* const_pointer;
+ typedef T& reference;
+ typedef const T& const_reference;
+ typedef T value_type;
+
+ template <typename U>
+ struct rebind
+ {
+ typedef allocator<U> other;
+ };
+
+ explicit allocator(int* count) noexcept
+ : count_(count)
+ {
+ }
+
+ allocator(const allocator& other) noexcept
+ : count_(other.count_)
+ {
+ }
+
+ template <typename U>
+ allocator(const allocator<U>& other) noexcept
+ : count_(other.count_)
+ {
+ }
+
+ pointer allocate(size_type n, const void* = 0)
+ {
+ ++(*count_);
+ return static_cast<T*>(::operator new(sizeof(T) * n));
+ }
+
+ void deallocate(pointer p, size_type)
+ {
+ --(*count_);
+ ::operator delete(p);
+ }
+
+ size_type max_size() const
+ {
+ return ~size_type(0);
+ }
+
+ void construct(pointer p, const T& v)
+ {
+ new (p) T(v);
+ }
+
+ void destroy(pointer p)
+ {
+ p->~T();
+ }
+
+ int* count_;
+ };
+
+ typedef allocator<int> allocator_type;
+
+ allocator_type get_allocator() const noexcept
+ {
+ return allocator_type(count_);
+ }
+};
+
+void deadline_timer_custom_allocation_test()
+{
+ static asio::io_context io_context;
+ struct timer
+ {
+ asio::deadline_timer t;
+ timer() : t(io_context) {}
+ } timers[100];
+
+ int allocation_count = 0;
+
+ for (int i = 0; i < 50; ++i)
+ {
+ timers[i].t.expires_at(boost::posix_time::pos_infin);
+ timers[i].t.async_wait(custom_allocation_timer_handler(&allocation_count));
+ }
+
+ for (int i = 50; i < 100; ++i)
+ {
+ timers[i].t.expires_at(boost::posix_time::neg_infin);
+ timers[i].t.async_wait(custom_allocation_timer_handler(&allocation_count));
+ }
+
+ for (int i = 0; i < 50; ++i)
+ timers[i].t.cancel();
+
+ io_context.run();
+
+ ASIO_CHECK(allocation_count == 0);
+}
+
+void io_context_run(asio::io_context* ioc)
+{
+ ioc->run();
+}
+
+void deadline_timer_thread_test()
+{
+ asio::io_context ioc;
+ asio::executor_work_guard<asio::io_context::executor_type> work
+ = asio::make_work_guard(ioc);
+ asio::deadline_timer t1(ioc);
+ asio::deadline_timer t2(ioc);
+ int count = 0;
+
+ asio::thread th(boost::bind(io_context_run, &ioc));
+
+ t2.expires_from_now(boost::posix_time::seconds(2));
+ t2.wait();
+
+ t1.expires_from_now(boost::posix_time::seconds(2));
+ t1.async_wait(boost::bind(increment, &count));
+
+ t2.expires_from_now(boost::posix_time::seconds(4));
+ t2.wait();
+
+ ioc.stop();
+ th.join();
+
+ ASIO_CHECK(count == 1);
+}
+
+void deadline_timer_async_result_test()
+{
+ asio::io_context ioc;
+ asio::deadline_timer t1(ioc);
+
+ t1.expires_from_now(boost::posix_time::seconds(1));
+ int i = t1.async_wait(archetypes::lazy_handler());
+ ASIO_CHECK(i == 42);
+
+ ioc.run();
+}
+
+asio::deadline_timer make_timer(asio::io_context& ioc, int* count)
+{
+ asio::deadline_timer t(ioc);
+ t.expires_from_now(boost::posix_time::seconds(1));
+ t.async_wait(boost::bind(increment, count));
+ return t;
+}
+
+void deadline_timer_move_test()
+{
+ asio::io_context io_context1;
+ asio::io_context io_context2;
+ int count = 0;
+
+ asio::deadline_timer t1 = make_timer(io_context1, &count);
+ asio::deadline_timer t2 = make_timer(io_context2, &count);
+ asio::deadline_timer t3 = std::move(t1);
+
+ t2 = std::move(t1);
+
+ io_context2.run();
+
+ ASIO_CHECK(count == 1);
+
+ io_context1.run();
+
+ ASIO_CHECK(count == 2);
+}
+
+ASIO_TEST_SUITE
+(
+ "deadline_timer",
+ ASIO_TEST_CASE(deadline_timer_test)
+ ASIO_TEST_CASE(deadline_timer_cancel_test)
+ ASIO_TEST_CASE(deadline_timer_custom_allocation_test)
+ ASIO_TEST_CASE(deadline_timer_thread_test)
+ ASIO_TEST_CASE(deadline_timer_async_result_test)
+ ASIO_TEST_CASE(deadline_timer_move_test)
+)
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
+ASIO_TEST_SUITE
+(
+ "deadline_timer",
+ ASIO_TEST_CASE(null_test)
+)
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
diff --git a/3rdparty/asio/src/tests/unit/defer.cpp b/3rdparty/asio/src/tests/unit/defer.cpp
new file mode 100644
index 00000000000..f41c1b9f025
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/defer.cpp
@@ -0,0 +1,25 @@
+//
+// defer.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/defer.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "defer",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/deferred.cpp b/3rdparty/asio/src/tests/unit/deferred.cpp
new file mode 100644
index 00000000000..b2db70d4b3d
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/deferred.cpp
@@ -0,0 +1,25 @@
+//
+// deferred.cpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/deferred.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "experimental/deferred",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/detached.cpp b/3rdparty/asio/src/tests/unit/detached.cpp
new file mode 100644
index 00000000000..506c13d8773
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/detached.cpp
@@ -0,0 +1,25 @@
+//
+// detached.cpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/detached.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "detached",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/dispatch.cpp b/3rdparty/asio/src/tests/unit/dispatch.cpp
new file mode 100644
index 00000000000..f6fb84d4f91
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/dispatch.cpp
@@ -0,0 +1,25 @@
+//
+// dispatch.cpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/dispatch.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "dispatch",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/error.cpp b/3rdparty/asio/src/tests/unit/error.cpp
new file mode 100644
index 00000000000..3f8aa75efbe
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/error.cpp
@@ -0,0 +1,89 @@
+//
+// error.cpp
+// ~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/error.hpp"
+
+#include <sstream>
+#include "unit_test.hpp"
+
+void test_error_code(const asio::error_code& code)
+{
+ asio::error_code error(code);
+ ASIO_CHECK(code == error);
+
+ ASIO_CHECK(!code || error);
+ ASIO_CHECK(!code || !!error);
+
+ asio::error_code error2(error);
+ ASIO_CHECK(error == error2);
+ ASIO_CHECK(!(error != error2));
+
+ asio::error_code error3;
+ error3 = error;
+ ASIO_CHECK(error == error3);
+ ASIO_CHECK(!(error != error3));
+
+ std::ostringstream os;
+ os << error;
+ ASIO_CHECK(!os.str().empty());
+}
+
+void error_test()
+{
+ test_error_code(asio::error::access_denied);
+ test_error_code(asio::error::address_family_not_supported);
+ test_error_code(asio::error::address_in_use);
+ test_error_code(asio::error::already_connected);
+ test_error_code(asio::error::already_started);
+ test_error_code(asio::error::connection_aborted);
+ test_error_code(asio::error::connection_refused);
+ test_error_code(asio::error::connection_reset);
+ test_error_code(asio::error::bad_descriptor);
+ test_error_code(asio::error::eof);
+ test_error_code(asio::error::fault);
+ test_error_code(asio::error::host_not_found);
+ test_error_code(asio::error::host_not_found_try_again);
+ test_error_code(asio::error::host_unreachable);
+ test_error_code(asio::error::in_progress);
+ test_error_code(asio::error::interrupted);
+ test_error_code(asio::error::invalid_argument);
+ test_error_code(asio::error::message_size);
+ test_error_code(asio::error::network_down);
+ test_error_code(asio::error::network_reset);
+ test_error_code(asio::error::network_unreachable);
+ test_error_code(asio::error::no_descriptors);
+ test_error_code(asio::error::no_buffer_space);
+ test_error_code(asio::error::no_data);
+ test_error_code(asio::error::no_memory);
+ test_error_code(asio::error::no_permission);
+ test_error_code(asio::error::no_protocol_option);
+ test_error_code(asio::error::no_recovery);
+ test_error_code(asio::error::not_connected);
+ test_error_code(asio::error::not_socket);
+ test_error_code(asio::error::operation_aborted);
+ test_error_code(asio::error::operation_not_supported);
+ test_error_code(asio::error::service_not_found);
+ test_error_code(asio::error::shut_down);
+ test_error_code(asio::error::timed_out);
+ test_error_code(asio::error::try_again);
+ test_error_code(asio::error::would_block);
+}
+
+ASIO_TEST_SUITE
+(
+ "error",
+ ASIO_TEST_CASE(error_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/execution/any_executor.cpp b/3rdparty/asio/src/tests/unit/execution/any_executor.cpp
new file mode 100644
index 00000000000..3e2dabdc5a5
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/execution/any_executor.cpp
@@ -0,0 +1,1202 @@
+//
+// any_executor.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/execution/any_executor.hpp"
+
+#include <cstring>
+#include <functional>
+#include "asio/thread_pool.hpp"
+#include "../unit_test.hpp"
+
+using namespace asio;
+namespace bindns = std;
+
+static bool next_nothrow_new_fails = false;
+
+void* operator new(std::size_t n,
+ const std::nothrow_t&) noexcept
+{
+ if (next_nothrow_new_fails)
+ {
+ next_nothrow_new_fails = false;
+ return 0;
+ }
+ return ::operator new(n);
+}
+
+struct fat_executor
+{
+ fat_executor(int id)
+ : id_(id)
+ {
+ std::memset(data_, 0, sizeof(data_));
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ std::size_t query(execution::occupancy_t) const
+ {
+ return 1;
+ }
+
+ friend bool operator==(const fat_executor& a,
+ const fat_executor& b) noexcept
+ {
+ return a.id_ == b.id_;
+ }
+
+ friend bool operator!=(const fat_executor& a,
+ const fat_executor& b) noexcept
+ {
+ return a.id_ != b.id_;
+ }
+
+ int id_;
+ unsigned char data_[1024];
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename F>
+struct execute_member<fat_executor, F>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <>
+struct query_member<fat_executor, execution::occupancy_t>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+ typedef std::size_t result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <>
+struct equality_comparable<fat_executor>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+void increment(int* count)
+{
+ ++(*count);
+}
+
+void any_executor_construction_test()
+{
+ typedef execution::any_executor<> ex_no_props_t;
+
+ typedef execution::any_executor<
+ execution::blocking_t
+ > ex_one_prop_t;
+
+ typedef execution::any_executor<
+ execution::blocking_t,
+ execution::occupancy_t
+ > ex_two_props_t;
+
+ thread_pool pool(1);
+ asio::nullptr_t null_ptr = asio::nullptr_t();
+
+ ex_two_props_t ex_two_props_1;
+
+ ASIO_CHECK(ex_two_props_1.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_1 == null_ptr);
+
+ ex_two_props_t ex_two_props_2(null_ptr);
+
+ ASIO_CHECK(ex_two_props_2.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_2 == null_ptr);
+ ASIO_CHECK(ex_two_props_2 == ex_two_props_1);
+
+ ex_two_props_t ex_two_props_3(pool.executor());
+
+ ASIO_CHECK(ex_two_props_3.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_3 != null_ptr);
+ ASIO_CHECK(ex_two_props_3 != ex_two_props_1);
+
+ ex_two_props_t ex_two_props_4(ex_two_props_1);
+
+ ASIO_CHECK(ex_two_props_4.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_4 == null_ptr);
+ ASIO_CHECK(ex_two_props_4 == ex_two_props_1);
+
+ ex_two_props_t ex_two_props_5(ex_two_props_3);
+
+ ASIO_CHECK(ex_two_props_5.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_5 != null_ptr);
+ ASIO_CHECK(ex_two_props_5 == ex_two_props_3);
+
+ ex_two_props_t ex_two_props_6 = fat_executor(1);
+
+ ASIO_CHECK(ex_two_props_6.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_6 != null_ptr);
+ ASIO_CHECK(ex_two_props_6 != ex_two_props_1);
+
+ ex_two_props_t ex_two_props_7 = fat_executor(1);
+
+ ASIO_CHECK(ex_two_props_7.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_7 != null_ptr);
+ ASIO_CHECK(ex_two_props_7 != ex_two_props_1);
+ ASIO_CHECK(ex_two_props_7 == ex_two_props_6);
+
+ ex_two_props_t ex_two_props_8 = fat_executor(2);
+
+ ASIO_CHECK(ex_two_props_8.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_8 != null_ptr);
+ ASIO_CHECK(ex_two_props_8 != ex_two_props_1);
+ ASIO_CHECK(ex_two_props_8 != ex_two_props_6);
+ ASIO_CHECK(ex_two_props_8 != ex_two_props_7);
+
+ ex_two_props_t ex_two_props_9(ex_two_props_6);
+
+ ASIO_CHECK(ex_two_props_9.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_9 != null_ptr);
+ ASIO_CHECK(ex_two_props_9 != ex_two_props_1);
+ ASIO_CHECK(ex_two_props_9 == ex_two_props_6);
+ ASIO_CHECK(ex_two_props_9 == ex_two_props_7);
+ ASIO_CHECK(ex_two_props_9 != ex_two_props_8);
+
+ ex_two_props_t ex_two_props_10(std::move(ex_two_props_1));
+
+ ASIO_CHECK(ex_two_props_10.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_10 == null_ptr);
+ ASIO_CHECK(ex_two_props_1.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_1 == null_ptr);
+
+ ex_two_props_t ex_two_props_11(std::move(ex_two_props_3));
+
+ ASIO_CHECK(ex_two_props_11.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_11 != null_ptr);
+ ASIO_CHECK(ex_two_props_3.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_3 == null_ptr);
+ ASIO_CHECK(ex_two_props_11 == ex_two_props_5);
+
+ ex_two_props_t ex_two_props_12(std::move(ex_two_props_7));
+
+ ASIO_CHECK(ex_two_props_12.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_12 != null_ptr);
+ ASIO_CHECK(ex_two_props_7.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_7 == null_ptr);
+ ASIO_CHECK(ex_two_props_12 == ex_two_props_6);
+ ASIO_CHECK(ex_two_props_12 != ex_two_props_8);
+
+ ex_one_prop_t ex_one_prop_1;
+
+ ASIO_CHECK(ex_one_prop_1.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_1 == null_ptr);
+
+ ex_one_prop_t ex_one_prop_2(null_ptr);
+
+ ASIO_CHECK(ex_one_prop_2.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_2 == null_ptr);
+ ASIO_CHECK(ex_one_prop_2 == ex_one_prop_1);
+
+ ex_one_prop_t ex_one_prop_3(pool.executor());
+
+ ASIO_CHECK(ex_one_prop_3.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_3 != null_ptr);
+ ASIO_CHECK(ex_one_prop_3 != ex_one_prop_1);
+
+ ex_one_prop_t ex_one_prop_4(ex_one_prop_1);
+
+ ASIO_CHECK(ex_one_prop_4.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_4 == null_ptr);
+ ASIO_CHECK(ex_one_prop_4 == ex_one_prop_1);
+
+ ex_one_prop_t ex_one_prop_5(ex_one_prop_3);
+
+ ASIO_CHECK(ex_one_prop_5.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_5 != null_ptr);
+ ASIO_CHECK(ex_one_prop_5 == ex_one_prop_3);
+
+ ex_one_prop_t ex_one_prop_6 = fat_executor(1);
+
+ ASIO_CHECK(ex_one_prop_6.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_6 != null_ptr);
+ ASIO_CHECK(ex_one_prop_6 != ex_one_prop_1);
+
+ ex_one_prop_t ex_one_prop_7 = fat_executor(1);
+
+ ASIO_CHECK(ex_one_prop_7.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_7 != null_ptr);
+ ASIO_CHECK(ex_one_prop_7 != ex_one_prop_1);
+ ASIO_CHECK(ex_one_prop_7 == ex_one_prop_6);
+
+ ex_one_prop_t ex_one_prop_8 = fat_executor(2);
+
+ ASIO_CHECK(ex_one_prop_8.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_8 != null_ptr);
+ ASIO_CHECK(ex_one_prop_8 != ex_one_prop_1);
+ ASIO_CHECK(ex_one_prop_8 != ex_one_prop_6);
+ ASIO_CHECK(ex_one_prop_8 != ex_one_prop_7);
+
+ ex_one_prop_t ex_one_prop_9(ex_one_prop_6);
+
+ ASIO_CHECK(ex_one_prop_9.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_9 != null_ptr);
+ ASIO_CHECK(ex_one_prop_9 != ex_one_prop_1);
+ ASIO_CHECK(ex_one_prop_9 == ex_one_prop_6);
+ ASIO_CHECK(ex_one_prop_9 == ex_one_prop_7);
+ ASIO_CHECK(ex_one_prop_9 != ex_one_prop_8);
+
+ ex_one_prop_t ex_one_prop_10(std::move(ex_one_prop_1));
+
+ ASIO_CHECK(ex_one_prop_10.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_10 == null_ptr);
+ ASIO_CHECK(ex_one_prop_1.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_1 == null_ptr);
+
+ ex_one_prop_t ex_one_prop_11(std::move(ex_one_prop_3));
+
+ ASIO_CHECK(ex_one_prop_11.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_11 != null_ptr);
+ ASIO_CHECK(ex_one_prop_3.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_3 == null_ptr);
+ ASIO_CHECK(ex_one_prop_11 == ex_one_prop_5);
+
+ ex_one_prop_t ex_one_prop_12(std::move(ex_one_prop_7));
+
+ ASIO_CHECK(ex_one_prop_12.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_12 != null_ptr);
+ ASIO_CHECK(ex_one_prop_7.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_7 == null_ptr);
+ ASIO_CHECK(ex_one_prop_12 == ex_one_prop_6);
+ ASIO_CHECK(ex_one_prop_12 != ex_one_prop_8);
+
+ ex_one_prop_t ex_one_prop_13(ex_two_props_1);
+
+ ASIO_CHECK(ex_one_prop_13.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_13 == null_ptr);
+
+ ex_one_prop_t ex_one_prop_14(ex_two_props_5);
+
+ ASIO_CHECK(ex_one_prop_14.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_14 != null_ptr);
+
+ ex_one_prop_t ex_one_prop_15(ex_two_props_9);
+
+ ASIO_CHECK(ex_one_prop_15.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_15 != null_ptr);
+
+ ex_no_props_t ex_no_props_1;
+
+ ASIO_CHECK(ex_no_props_1.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_1 == null_ptr);
+
+ ex_no_props_t ex_no_props_2(null_ptr);
+
+ ASIO_CHECK(ex_no_props_2.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_2 == null_ptr);
+ ASIO_CHECK(ex_no_props_2 == ex_no_props_1);
+
+ ex_no_props_t ex_no_props_3(pool.executor());
+
+ ASIO_CHECK(ex_no_props_3.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_3 != null_ptr);
+ ASIO_CHECK(ex_no_props_3 != ex_no_props_1);
+
+ ex_no_props_t ex_no_props_4(ex_no_props_1);
+
+ ASIO_CHECK(ex_no_props_4.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_4 == null_ptr);
+ ASIO_CHECK(ex_no_props_4 == ex_no_props_1);
+
+ ex_no_props_t ex_no_props_5(ex_no_props_3);
+
+ ASIO_CHECK(ex_no_props_5.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_5 != null_ptr);
+ ASIO_CHECK(ex_no_props_5 == ex_no_props_3);
+
+ ex_no_props_t ex_no_props_6 = fat_executor(1);
+
+ ASIO_CHECK(ex_no_props_6.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_6 != null_ptr);
+ ASIO_CHECK(ex_no_props_6 != ex_no_props_1);
+
+ ex_no_props_t ex_no_props_7 = fat_executor(1);
+
+ ASIO_CHECK(ex_no_props_7.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_7 != null_ptr);
+ ASIO_CHECK(ex_no_props_7 != ex_no_props_1);
+ ASIO_CHECK(ex_no_props_7 == ex_no_props_6);
+
+ ex_no_props_t ex_no_props_8 = fat_executor(2);
+
+ ASIO_CHECK(ex_no_props_8.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_8 != null_ptr);
+ ASIO_CHECK(ex_no_props_8 != ex_no_props_1);
+ ASIO_CHECK(ex_no_props_8 != ex_no_props_6);
+ ASIO_CHECK(ex_no_props_8 != ex_no_props_7);
+
+ ex_no_props_t ex_no_props_9(ex_no_props_6);
+
+ ASIO_CHECK(ex_no_props_9.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_9 != null_ptr);
+ ASIO_CHECK(ex_no_props_9 != ex_no_props_1);
+ ASIO_CHECK(ex_no_props_9 == ex_no_props_6);
+ ASIO_CHECK(ex_no_props_9 == ex_no_props_7);
+ ASIO_CHECK(ex_no_props_9 != ex_no_props_8);
+
+ ex_no_props_t ex_no_props_10(std::move(ex_no_props_1));
+
+ ASIO_CHECK(ex_no_props_10.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_10 == null_ptr);
+ ASIO_CHECK(ex_no_props_1.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_1 == null_ptr);
+
+ ex_no_props_t ex_no_props_11(std::move(ex_no_props_3));
+
+ ASIO_CHECK(ex_no_props_11.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_11 != null_ptr);
+ ASIO_CHECK(ex_no_props_3.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_3 == null_ptr);
+ ASIO_CHECK(ex_no_props_11 == ex_no_props_5);
+
+ ex_no_props_t ex_no_props_12(std::move(ex_no_props_7));
+
+ ASIO_CHECK(ex_no_props_12.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_12 != null_ptr);
+ ASIO_CHECK(ex_no_props_7.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_7 == null_ptr);
+ ASIO_CHECK(ex_no_props_12 == ex_no_props_6);
+ ASIO_CHECK(ex_no_props_12 != ex_no_props_8);
+
+ ex_no_props_t ex_no_props_13(ex_two_props_1);
+
+ ASIO_CHECK(ex_no_props_13.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_13 == null_ptr);
+
+ ex_no_props_t ex_no_props_14(ex_two_props_5);
+
+ ASIO_CHECK(ex_no_props_14.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_14 != null_ptr);
+
+ ex_no_props_t ex_no_props_15(ex_two_props_9);
+
+ ASIO_CHECK(ex_no_props_15.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_15 != null_ptr);
+
+ ex_no_props_t ex_no_props_16(ex_one_prop_1);
+
+ ASIO_CHECK(ex_no_props_16.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_16 == null_ptr);
+
+ ex_no_props_t ex_no_props_17(ex_one_prop_5);
+
+ ASIO_CHECK(ex_no_props_17.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_17 != null_ptr);
+
+ ex_no_props_t ex_no_props_18(ex_one_prop_9);
+
+ ASIO_CHECK(ex_no_props_18.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_18 != null_ptr);
+}
+
+void any_executor_nothrow_construction_test()
+{
+ typedef execution::any_executor<> ex_no_props_t;
+
+ typedef execution::any_executor<
+ execution::blocking_t
+ > ex_one_prop_t;
+
+ typedef execution::any_executor<
+ execution::blocking_t,
+ execution::occupancy_t
+ > ex_two_props_t;
+
+ thread_pool pool(1);
+ asio::nullptr_t null_ptr = asio::nullptr_t();
+
+ ex_two_props_t ex_two_props_1;
+
+ ASIO_CHECK(ex_two_props_1.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_1 == null_ptr);
+
+ ex_two_props_t ex_two_props_2(null_ptr);
+
+ ASIO_CHECK(ex_two_props_2.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_2 == null_ptr);
+ ASIO_CHECK(ex_two_props_2 == ex_two_props_1);
+
+ ex_two_props_t ex_two_props_3(std::nothrow, pool.executor());
+
+ ASIO_CHECK(ex_two_props_3.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_3 != null_ptr);
+ ASIO_CHECK(ex_two_props_3 != ex_two_props_1);
+
+ ex_two_props_t ex_two_props_4(std::nothrow, ex_two_props_1);
+
+ ASIO_CHECK(ex_two_props_4.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_4 == null_ptr);
+ ASIO_CHECK(ex_two_props_4 == ex_two_props_1);
+
+ ex_two_props_t ex_two_props_5(std::nothrow, ex_two_props_3);
+
+ ASIO_CHECK(ex_two_props_5.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_5 != null_ptr);
+ ASIO_CHECK(ex_two_props_5 == ex_two_props_3);
+
+ ex_two_props_t ex_two_props_6(std::nothrow, fat_executor(1));
+
+ ASIO_CHECK(ex_two_props_6.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_6 != null_ptr);
+ ASIO_CHECK(ex_two_props_6 != ex_two_props_1);
+
+ ex_two_props_t ex_two_props_7(std::nothrow, fat_executor(1));
+
+ ASIO_CHECK(ex_two_props_7.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_7 != null_ptr);
+ ASIO_CHECK(ex_two_props_7 != ex_two_props_1);
+ ASIO_CHECK(ex_two_props_7 == ex_two_props_6);
+
+ ex_two_props_t ex_two_props_8(std::nothrow, fat_executor(2));
+
+ ASIO_CHECK(ex_two_props_8.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_8 != null_ptr);
+ ASIO_CHECK(ex_two_props_8 != ex_two_props_1);
+ ASIO_CHECK(ex_two_props_8 != ex_two_props_6);
+ ASIO_CHECK(ex_two_props_8 != ex_two_props_7);
+
+ ex_two_props_t ex_two_props_9(std::nothrow, ex_two_props_6);
+
+ ASIO_CHECK(ex_two_props_9.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_9 != null_ptr);
+ ASIO_CHECK(ex_two_props_9 != ex_two_props_1);
+ ASIO_CHECK(ex_two_props_9 == ex_two_props_6);
+ ASIO_CHECK(ex_two_props_9 == ex_two_props_7);
+ ASIO_CHECK(ex_two_props_9 != ex_two_props_8);
+
+ ex_two_props_t ex_two_props_10(std::nothrow, std::move(ex_two_props_1));
+
+ ASIO_CHECK(ex_two_props_10.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_10 == null_ptr);
+ ASIO_CHECK(ex_two_props_1.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_1 == null_ptr);
+
+ ex_two_props_t ex_two_props_11(std::nothrow, std::move(ex_two_props_3));
+
+ ASIO_CHECK(ex_two_props_11.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_11 != null_ptr);
+ ASIO_CHECK(ex_two_props_3.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_3 == null_ptr);
+ ASIO_CHECK(ex_two_props_11 == ex_two_props_5);
+
+ ex_two_props_t ex_two_props_12(std::nothrow, std::move(ex_two_props_7));
+
+ ASIO_CHECK(ex_two_props_12.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_12 != null_ptr);
+ ASIO_CHECK(ex_two_props_7.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_7 == null_ptr);
+ ASIO_CHECK(ex_two_props_12 == ex_two_props_6);
+ ASIO_CHECK(ex_two_props_12 != ex_two_props_8);
+
+ next_nothrow_new_fails = true;
+ ex_two_props_t ex_two_props_13(std::nothrow, fat_executor(3));
+
+ ASIO_CHECK(ex_two_props_13.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_13 == null_ptr);
+ ASIO_CHECK(ex_two_props_13 == ex_two_props_1);
+
+ ex_one_prop_t ex_one_prop_1;
+
+ ASIO_CHECK(ex_one_prop_1.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_1 == null_ptr);
+
+ ex_one_prop_t ex_one_prop_2(null_ptr);
+
+ ASIO_CHECK(ex_one_prop_2.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_2 == null_ptr);
+ ASIO_CHECK(ex_one_prop_2 == ex_one_prop_1);
+
+ ex_one_prop_t ex_one_prop_3(std::nothrow, pool.executor());
+
+ ASIO_CHECK(ex_one_prop_3.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_3 != null_ptr);
+ ASIO_CHECK(ex_one_prop_3 != ex_one_prop_1);
+
+ ex_one_prop_t ex_one_prop_4(std::nothrow, ex_one_prop_1);
+
+ ASIO_CHECK(ex_one_prop_4.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_4 == null_ptr);
+ ASIO_CHECK(ex_one_prop_4 == ex_one_prop_1);
+
+ ex_one_prop_t ex_one_prop_5(std::nothrow, ex_one_prop_3);
+
+ ASIO_CHECK(ex_one_prop_5.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_5 != null_ptr);
+ ASIO_CHECK(ex_one_prop_5 == ex_one_prop_3);
+
+ ex_one_prop_t ex_one_prop_6 = fat_executor(1);
+
+ ASIO_CHECK(ex_one_prop_6.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_6 != null_ptr);
+ ASIO_CHECK(ex_one_prop_6 != ex_one_prop_1);
+
+ ex_one_prop_t ex_one_prop_7(std::nothrow, fat_executor(1));
+
+ ASIO_CHECK(ex_one_prop_7.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_7 != null_ptr);
+ ASIO_CHECK(ex_one_prop_7 != ex_one_prop_1);
+ ASIO_CHECK(ex_one_prop_7 == ex_one_prop_6);
+
+ ex_one_prop_t ex_one_prop_8(std::nothrow, fat_executor(2));
+
+ ASIO_CHECK(ex_one_prop_8.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_8 != null_ptr);
+ ASIO_CHECK(ex_one_prop_8 != ex_one_prop_1);
+ ASIO_CHECK(ex_one_prop_8 != ex_one_prop_6);
+ ASIO_CHECK(ex_one_prop_8 != ex_one_prop_7);
+
+ ex_one_prop_t ex_one_prop_9(std::nothrow, ex_one_prop_6);
+
+ ASIO_CHECK(ex_one_prop_9.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_9 != null_ptr);
+ ASIO_CHECK(ex_one_prop_9 != ex_one_prop_1);
+ ASIO_CHECK(ex_one_prop_9 == ex_one_prop_6);
+ ASIO_CHECK(ex_one_prop_9 == ex_one_prop_7);
+ ASIO_CHECK(ex_one_prop_9 != ex_one_prop_8);
+
+ ex_one_prop_t ex_one_prop_10(std::nothrow, std::move(ex_one_prop_1));
+
+ ASIO_CHECK(ex_one_prop_10.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_10 == null_ptr);
+ ASIO_CHECK(ex_one_prop_1.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_1 == null_ptr);
+
+ ex_one_prop_t ex_one_prop_11(std::nothrow, std::move(ex_one_prop_3));
+
+ ASIO_CHECK(ex_one_prop_11.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_11 != null_ptr);
+ ASIO_CHECK(ex_one_prop_3.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_3 == null_ptr);
+ ASIO_CHECK(ex_one_prop_11 == ex_one_prop_5);
+
+ ex_one_prop_t ex_one_prop_12(std::nothrow, std::move(ex_one_prop_7));
+
+ ASIO_CHECK(ex_one_prop_12.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_12 != null_ptr);
+ ASIO_CHECK(ex_one_prop_7.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_7 == null_ptr);
+ ASIO_CHECK(ex_one_prop_12 == ex_one_prop_6);
+ ASIO_CHECK(ex_one_prop_12 != ex_one_prop_8);
+
+ ex_one_prop_t ex_one_prop_13(std::nothrow, ex_two_props_1);
+
+ ASIO_CHECK(ex_one_prop_13.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_13 == null_ptr);
+
+ ex_one_prop_t ex_one_prop_14(std::nothrow, ex_two_props_5);
+
+ ASIO_CHECK(ex_one_prop_14.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_14 != null_ptr);
+
+ ex_one_prop_t ex_one_prop_15(std::nothrow, ex_two_props_9);
+
+ ASIO_CHECK(ex_one_prop_15.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_15 != null_ptr);
+
+ next_nothrow_new_fails = true;
+ ex_one_prop_t ex_one_prop_16(std::nothrow, fat_executor(3));
+
+ ASIO_CHECK(ex_one_prop_16.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_16 == null_ptr);
+ ASIO_CHECK(ex_one_prop_16 == ex_one_prop_1);
+
+ ex_no_props_t ex_no_props_1;
+
+ ASIO_CHECK(ex_no_props_1.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_1 == null_ptr);
+
+ ex_no_props_t ex_no_props_2(null_ptr);
+
+ ASIO_CHECK(ex_no_props_2.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_2 == null_ptr);
+ ASIO_CHECK(ex_no_props_2 == ex_no_props_1);
+
+ ex_no_props_t ex_no_props_3(std::nothrow, pool.executor());
+
+ ASIO_CHECK(ex_no_props_3.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_3 != null_ptr);
+ ASIO_CHECK(ex_no_props_3 != ex_no_props_1);
+
+ ex_no_props_t ex_no_props_4(std::nothrow, ex_no_props_1);
+
+ ASIO_CHECK(ex_no_props_4.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_4 == null_ptr);
+ ASIO_CHECK(ex_no_props_4 == ex_no_props_1);
+
+ ex_no_props_t ex_no_props_5(std::nothrow, ex_no_props_3);
+
+ ASIO_CHECK(ex_no_props_5.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_5 != null_ptr);
+ ASIO_CHECK(ex_no_props_5 == ex_no_props_3);
+
+ ex_no_props_t ex_no_props_6(std::nothrow, fat_executor(1));
+
+ ASIO_CHECK(ex_no_props_6.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_6 != null_ptr);
+ ASIO_CHECK(ex_no_props_6 != ex_no_props_1);
+
+ ex_no_props_t ex_no_props_7(std::nothrow, fat_executor(1));
+
+ ASIO_CHECK(ex_no_props_7.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_7 != null_ptr);
+ ASIO_CHECK(ex_no_props_7 != ex_no_props_1);
+ ASIO_CHECK(ex_no_props_7 == ex_no_props_6);
+
+ ex_no_props_t ex_no_props_8(std::nothrow, fat_executor(2));
+
+ ASIO_CHECK(ex_no_props_8.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_8 != null_ptr);
+ ASIO_CHECK(ex_no_props_8 != ex_no_props_1);
+ ASIO_CHECK(ex_no_props_8 != ex_no_props_6);
+ ASIO_CHECK(ex_no_props_8 != ex_no_props_7);
+
+ ex_no_props_t ex_no_props_9(std::nothrow, ex_no_props_6);
+
+ ASIO_CHECK(ex_no_props_9.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_9 != null_ptr);
+ ASIO_CHECK(ex_no_props_9 != ex_no_props_1);
+ ASIO_CHECK(ex_no_props_9 == ex_no_props_6);
+ ASIO_CHECK(ex_no_props_9 == ex_no_props_7);
+ ASIO_CHECK(ex_no_props_9 != ex_no_props_8);
+
+ ex_no_props_t ex_no_props_10(std::nothrow, std::move(ex_no_props_1));
+
+ ASIO_CHECK(ex_no_props_10.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_10 == null_ptr);
+ ASIO_CHECK(ex_no_props_1.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_1 == null_ptr);
+
+ ex_no_props_t ex_no_props_11(std::nothrow, std::move(ex_no_props_3));
+
+ ASIO_CHECK(ex_no_props_11.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_11 != null_ptr);
+ ASIO_CHECK(ex_no_props_3.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_3 == null_ptr);
+ ASIO_CHECK(ex_no_props_11 == ex_no_props_5);
+
+ ex_no_props_t ex_no_props_12(std::nothrow, std::move(ex_no_props_7));
+
+ ASIO_CHECK(ex_no_props_12.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_12 != null_ptr);
+ ASIO_CHECK(ex_no_props_7.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_7 == null_ptr);
+ ASIO_CHECK(ex_no_props_12 == ex_no_props_6);
+ ASIO_CHECK(ex_no_props_12 != ex_no_props_8);
+
+ ex_no_props_t ex_no_props_13(std::nothrow, ex_two_props_1);
+
+ ASIO_CHECK(ex_no_props_13.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_13 == null_ptr);
+
+ ex_no_props_t ex_no_props_14(std::nothrow, ex_two_props_5);
+
+ ASIO_CHECK(ex_no_props_14.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_14 != null_ptr);
+
+ ex_no_props_t ex_no_props_15(std::nothrow, ex_two_props_9);
+
+ ASIO_CHECK(ex_no_props_15.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_15 != null_ptr);
+
+ ex_no_props_t ex_no_props_16(std::nothrow, ex_one_prop_1);
+
+ ASIO_CHECK(ex_no_props_16.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_16 == null_ptr);
+
+ ex_no_props_t ex_no_props_17(std::nothrow, ex_one_prop_5);
+
+ ASIO_CHECK(ex_no_props_17.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_17 != null_ptr);
+
+ ex_no_props_t ex_no_props_18(std::nothrow, ex_one_prop_9);
+
+ ASIO_CHECK(ex_no_props_18.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_18 != null_ptr);
+
+ next_nothrow_new_fails = true;
+ ex_no_props_t ex_no_props_19(std::nothrow, fat_executor(3));
+
+ ASIO_CHECK(ex_no_props_19.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_19 == null_ptr);
+ ASIO_CHECK(ex_no_props_19 == ex_no_props_1);
+}
+
+void any_executor_assignment_test()
+{
+ typedef execution::any_executor<> ex_no_props_t;
+
+ typedef execution::any_executor<
+ execution::blocking_t
+ > ex_one_prop_t;
+
+ typedef execution::any_executor<
+ execution::blocking_t,
+ execution::occupancy_t
+ > ex_two_props_t;
+
+ thread_pool pool(1);
+ asio::nullptr_t null_ptr = asio::nullptr_t();
+
+ ex_two_props_t ex_two_props_1;
+
+ ex_two_props_t ex_two_props_2;
+ ex_two_props_2 = null_ptr;
+
+ ASIO_CHECK(ex_two_props_2.target<void>() == 0);
+
+ ex_two_props_t ex_two_props_3;
+ ex_two_props_3 = pool.executor();
+
+ ASIO_CHECK(ex_two_props_3.target<void>() != 0);
+
+ ex_two_props_t ex_two_props_4;
+ ex_two_props_4 = ex_two_props_1;
+
+ ASIO_CHECK(ex_two_props_4.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_4 == ex_two_props_1);
+
+ ex_two_props_4 = ex_two_props_3;
+
+ ASIO_CHECK(ex_two_props_4.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_4 == ex_two_props_3);
+
+ ex_two_props_t ex_two_props_5;
+ ex_two_props_5 = fat_executor(1);
+
+ ASIO_CHECK(ex_two_props_5.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_5 != null_ptr);
+ ASIO_CHECK(ex_two_props_5 != ex_two_props_1);
+
+ ex_two_props_t ex_two_props_6;
+ ex_two_props_6 = fat_executor(1);
+
+ ASIO_CHECK(ex_two_props_6.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_6 != null_ptr);
+ ASIO_CHECK(ex_two_props_6 != ex_two_props_1);
+ ASIO_CHECK(ex_two_props_6 == ex_two_props_5);
+
+ ex_two_props_6 = fat_executor(2);
+
+ ASIO_CHECK(ex_two_props_6.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_6 != null_ptr);
+ ASIO_CHECK(ex_two_props_6 != ex_two_props_1);
+ ASIO_CHECK(ex_two_props_6 != ex_two_props_5);
+
+ ex_two_props_t ex_two_props_7;
+ ex_two_props_7 = ex_two_props_5;
+
+ ASIO_CHECK(ex_two_props_7.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_7 != null_ptr);
+ ASIO_CHECK(ex_two_props_7 != ex_two_props_1);
+ ASIO_CHECK(ex_two_props_7 == ex_two_props_5);
+ ASIO_CHECK(ex_two_props_7 != ex_two_props_6);
+
+ ex_two_props_t ex_two_props_8;
+ ex_two_props_8 = std::move(ex_two_props_1);
+
+ ASIO_CHECK(ex_two_props_8.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_1.target<void>() == 0);
+
+ ex_two_props_8 = std::move(ex_two_props_3);
+
+ ASIO_CHECK(ex_two_props_8.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_3.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_8 == ex_two_props_4);
+
+ ex_two_props_8 = std::move(ex_two_props_5);
+
+ ASIO_CHECK(ex_two_props_8.target<void>() != 0);
+ ASIO_CHECK(ex_two_props_5.target<void>() == 0);
+ ASIO_CHECK(ex_two_props_8 == ex_two_props_7);
+
+ ex_one_prop_t ex_one_prop_1;
+
+ ex_one_prop_t ex_one_prop_2;
+ ex_one_prop_2 = null_ptr;
+
+ ASIO_CHECK(ex_one_prop_2.target<void>() == 0);
+
+ ex_one_prop_t ex_one_prop_3;
+ ex_one_prop_3 = pool.executor();
+
+ ASIO_CHECK(ex_one_prop_3.target<void>() != 0);
+
+ ex_one_prop_t ex_one_prop_4;
+ ex_one_prop_4 = ex_one_prop_1;
+
+ ASIO_CHECK(ex_one_prop_4.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_4 == ex_one_prop_1);
+
+ ex_one_prop_4 = ex_one_prop_3;
+
+ ASIO_CHECK(ex_one_prop_4.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_4 == ex_one_prop_3);
+
+ ex_one_prop_t ex_one_prop_5;
+ ex_one_prop_5 = fat_executor(1);
+
+ ASIO_CHECK(ex_one_prop_5.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_5 != null_ptr);
+ ASIO_CHECK(ex_one_prop_5 != ex_one_prop_1);
+
+ ex_one_prop_t ex_one_prop_6;
+ ex_one_prop_6 = fat_executor(1);
+
+ ASIO_CHECK(ex_one_prop_6.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_6 != null_ptr);
+ ASIO_CHECK(ex_one_prop_6 != ex_one_prop_1);
+ ASIO_CHECK(ex_one_prop_6 == ex_one_prop_5);
+
+ ex_one_prop_6 = fat_executor(2);
+
+ ASIO_CHECK(ex_one_prop_6.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_6 != null_ptr);
+ ASIO_CHECK(ex_one_prop_6 != ex_one_prop_1);
+ ASIO_CHECK(ex_one_prop_6 != ex_one_prop_5);
+
+ ex_one_prop_t ex_one_prop_7;
+ ex_one_prop_7 = ex_one_prop_5;
+
+ ASIO_CHECK(ex_one_prop_7.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_7 != null_ptr);
+ ASIO_CHECK(ex_one_prop_7 != ex_one_prop_1);
+ ASIO_CHECK(ex_one_prop_7 == ex_one_prop_5);
+ ASIO_CHECK(ex_one_prop_7 != ex_one_prop_6);
+
+ ex_one_prop_t ex_one_prop_8;
+ ex_one_prop_8 = std::move(ex_one_prop_1);
+
+ ASIO_CHECK(ex_one_prop_8.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_1.target<void>() == 0);
+
+ ex_one_prop_8 = std::move(ex_one_prop_3);
+
+ ASIO_CHECK(ex_one_prop_8.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_3.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_8 == ex_one_prop_4);
+
+ ex_one_prop_8 = std::move(ex_one_prop_5);
+
+ ASIO_CHECK(ex_one_prop_8.target<void>() != 0);
+ ASIO_CHECK(ex_one_prop_5.target<void>() == 0);
+ ASIO_CHECK(ex_one_prop_8 == ex_one_prop_7);
+
+ ex_one_prop_t ex_one_prop_9;
+ ex_one_prop_9 = ex_two_props_1;
+
+ ASIO_CHECK(ex_one_prop_9.target<void>() == 0);
+
+ ex_one_prop_9 = ex_two_props_4;
+
+ ASIO_CHECK(ex_one_prop_9.target<void>() != 0);
+
+ ex_one_prop_9 = ex_two_props_7;
+
+ ASIO_CHECK(ex_one_prop_9.target<void>() != 0);
+
+ ex_no_props_t ex_no_props_1;
+
+ ex_no_props_t ex_no_props_2;
+ ex_no_props_2 = null_ptr;
+
+ ASIO_CHECK(ex_no_props_2.target<void>() == 0);
+
+ ex_no_props_t ex_no_props_3;
+ ex_no_props_3 = pool.executor();
+
+ ASIO_CHECK(ex_no_props_3.target<void>() != 0);
+
+ ex_no_props_t ex_no_props_4;
+ ex_no_props_4 = ex_no_props_1;
+
+ ASIO_CHECK(ex_no_props_4.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_4 == ex_no_props_1);
+
+ ex_no_props_4 = ex_no_props_3;
+
+ ASIO_CHECK(ex_no_props_4.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_4 == ex_no_props_3);
+
+ ex_no_props_t ex_no_props_5;
+ ex_no_props_5 = fat_executor(1);
+
+ ASIO_CHECK(ex_no_props_5.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_5 != null_ptr);
+ ASIO_CHECK(ex_no_props_5 != ex_no_props_1);
+
+ ex_no_props_t ex_no_props_6;
+ ex_no_props_6 = fat_executor(1);
+
+ ASIO_CHECK(ex_no_props_6.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_6 != null_ptr);
+ ASIO_CHECK(ex_no_props_6 != ex_no_props_1);
+ ASIO_CHECK(ex_no_props_6 == ex_no_props_5);
+
+ ex_no_props_6 = fat_executor(2);
+
+ ASIO_CHECK(ex_no_props_6.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_6 != null_ptr);
+ ASIO_CHECK(ex_no_props_6 != ex_no_props_1);
+ ASIO_CHECK(ex_no_props_6 != ex_no_props_5);
+
+ ex_no_props_t ex_no_props_7;
+ ex_no_props_7 = ex_no_props_5;
+
+ ASIO_CHECK(ex_no_props_7.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_7 != null_ptr);
+ ASIO_CHECK(ex_no_props_7 != ex_no_props_1);
+ ASIO_CHECK(ex_no_props_7 == ex_no_props_5);
+ ASIO_CHECK(ex_no_props_7 != ex_no_props_6);
+
+ ex_no_props_t ex_no_props_8;
+ ex_no_props_8 = std::move(ex_no_props_1);
+
+ ASIO_CHECK(ex_no_props_8.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_1.target<void>() == 0);
+
+ ex_no_props_8 = std::move(ex_no_props_3);
+
+ ASIO_CHECK(ex_no_props_8.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_3.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_8 == ex_no_props_4);
+
+ ex_no_props_8 = std::move(ex_no_props_5);
+
+ ASIO_CHECK(ex_no_props_8.target<void>() != 0);
+ ASIO_CHECK(ex_no_props_5.target<void>() == 0);
+ ASIO_CHECK(ex_no_props_8 == ex_no_props_7);
+
+ ex_no_props_t ex_no_props_9;
+ ex_no_props_9 = ex_two_props_1;
+
+ ASIO_CHECK(ex_no_props_9.target<void>() == 0);
+
+ ex_no_props_9 = ex_two_props_4;
+
+ ASIO_CHECK(ex_no_props_9.target<void>() != 0);
+
+ ex_no_props_9 = ex_two_props_7;
+
+ ASIO_CHECK(ex_no_props_9.target<void>() != 0);
+
+ ex_no_props_9 = ex_one_prop_1;
+
+ ASIO_CHECK(ex_no_props_9.target<void>() == 0);
+
+ ex_no_props_9 = ex_one_prop_4;
+
+ ASIO_CHECK(ex_no_props_9.target<void>() != 0);
+
+ ex_no_props_9 = ex_one_prop_7;
+
+ ASIO_CHECK(ex_no_props_9.target<void>() != 0);
+}
+
+void any_executor_swap_test()
+{
+ typedef execution::any_executor<> ex_no_props_t;
+
+ typedef execution::any_executor<
+ execution::blocking_t
+ > ex_one_prop_t;
+
+ typedef execution::any_executor<
+ execution::blocking_t,
+ execution::occupancy_t
+ > ex_two_props_t;
+
+ thread_pool pool1(1);
+ thread_pool pool2(1);
+
+ ex_no_props_t ex_no_props_1(pool1.executor());
+ ex_no_props_t ex_no_props_2(pool2.executor());
+
+ ex_no_props_t ex_no_props_3(ex_no_props_1);
+ ex_no_props_t ex_no_props_4(ex_no_props_2);
+
+ ASIO_CHECK(ex_no_props_3 == ex_no_props_1);
+ ASIO_CHECK(ex_no_props_4 == ex_no_props_2);
+
+ ex_no_props_3.swap(ex_no_props_4);
+
+ ASIO_CHECK(ex_no_props_3 == ex_no_props_2);
+ ASIO_CHECK(ex_no_props_4 == ex_no_props_1);
+
+ execution::swap(ex_no_props_3, ex_no_props_4);
+
+ ASIO_CHECK(ex_no_props_3 == ex_no_props_1);
+ ASIO_CHECK(ex_no_props_4 == ex_no_props_2);
+
+ ex_one_prop_t ex_one_prop_1(pool1.executor());
+ ex_one_prop_t ex_one_prop_2(pool2.executor());
+
+ ex_one_prop_t ex_one_prop_3(ex_one_prop_1);
+ ex_one_prop_t ex_one_prop_4(ex_one_prop_2);
+
+ ASIO_CHECK(ex_one_prop_3 == ex_one_prop_1);
+ ASIO_CHECK(ex_one_prop_4 == ex_one_prop_2);
+
+ ex_one_prop_3.swap(ex_one_prop_4);
+
+ ASIO_CHECK(ex_one_prop_3 == ex_one_prop_2);
+ ASIO_CHECK(ex_one_prop_4 == ex_one_prop_1);
+
+ execution::swap(ex_one_prop_3, ex_one_prop_4);
+
+ ASIO_CHECK(ex_one_prop_3 == ex_one_prop_1);
+ ASIO_CHECK(ex_one_prop_4 == ex_one_prop_2);
+
+ ex_two_props_t ex_two_props_1(pool1.executor());
+ ex_two_props_t ex_two_props_2(pool2.executor());
+
+ ex_two_props_t ex_two_props_3(ex_two_props_1);
+ ex_two_props_t ex_two_props_4(ex_two_props_2);
+
+ ASIO_CHECK(ex_two_props_3 == ex_two_props_1);
+ ASIO_CHECK(ex_two_props_4 == ex_two_props_2);
+
+ ex_two_props_3.swap(ex_two_props_4);
+
+ ASIO_CHECK(ex_two_props_3 == ex_two_props_2);
+ ASIO_CHECK(ex_two_props_4 == ex_two_props_1);
+
+ execution::swap(ex_two_props_3, ex_two_props_4);
+
+ ASIO_CHECK(ex_two_props_3 == ex_two_props_1);
+ ASIO_CHECK(ex_two_props_4 == ex_two_props_2);
+}
+
+void any_executor_query_test()
+{
+ thread_pool pool(1);
+ execution::any_executor<
+ execution::blocking_t,
+ execution::outstanding_work_t,
+ execution::relationship_t,
+ execution::mapping_t::thread_t,
+ execution::occupancy_t>
+ ex(pool.executor());
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::blocking)
+ == asio::execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::blocking.possibly)
+ == asio::execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::outstanding_work)
+ == asio::execution::outstanding_work.untracked);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::outstanding_work.untracked)
+ == asio::execution::outstanding_work.untracked);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::relationship)
+ == asio::execution::relationship.fork);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::relationship.fork)
+ == asio::execution::relationship.fork);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::mapping)
+ == asio::execution::mapping.thread);
+
+ ASIO_CHECK(
+ asio::query(ex, asio::execution::occupancy)
+ == 1);
+}
+
+void any_executor_execute_test()
+{
+ int count = 0;
+ thread_pool pool(1);
+ execution::any_executor<
+ execution::blocking_t::possibly_t,
+ execution::blocking_t::never_t,
+ execution::outstanding_work_t::untracked_t,
+ execution::outstanding_work_t::tracked_t,
+ execution::relationship_t::continuation_t>
+ ex(pool.executor());
+
+ ex.execute(bindns::bind(increment, &count));
+
+ asio::require(ex, asio::execution::blocking.possibly).execute(
+ bindns::bind(increment, &count));
+
+ asio::require(ex, asio::execution::blocking.never).execute(
+ bindns::bind(increment, &count));
+
+ asio::require(ex,
+ asio::execution::blocking.never,
+ asio::execution::outstanding_work.tracked
+ ).execute(bindns::bind(increment, &count));
+
+ asio::require(ex,
+ asio::execution::blocking.never,
+ asio::execution::outstanding_work.untracked
+ ).execute(bindns::bind(increment, &count));
+
+ asio::require(ex,
+ asio::execution::blocking.never,
+ asio::execution::outstanding_work.untracked,
+ asio::execution::relationship.continuation
+ ).execute(bindns::bind(increment, &count));
+
+ pool.wait();
+
+ ASIO_CHECK(count == 6);
+}
+
+ASIO_TEST_SUITE
+(
+ "any_executor",
+ ASIO_TEST_CASE(any_executor_construction_test)
+ ASIO_TEST_CASE(any_executor_nothrow_construction_test)
+ ASIO_TEST_CASE(any_executor_assignment_test)
+ ASIO_TEST_CASE(any_executor_swap_test)
+ ASIO_TEST_CASE(any_executor_query_test)
+ ASIO_TEST_CASE(any_executor_execute_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/execution/blocking.cpp b/3rdparty/asio/src/tests/unit/execution/blocking.cpp
new file mode 100644
index 00000000000..ce2ba2f8ea5
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/execution/blocking.cpp
@@ -0,0 +1,1921 @@
+//
+// blocking.cpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/execution/blocking.hpp"
+
+#include "asio/prefer.hpp"
+#include "asio/query.hpp"
+#include "asio/require.hpp"
+#include "../unit_test.hpp"
+
+namespace exec = asio::execution;
+
+typedef exec::blocking_t s;
+typedef exec::blocking_t::possibly_t n1;
+typedef exec::blocking_t::always_t n2;
+typedef exec::blocking_t::never_t n3;
+
+struct ex_nq_nr
+{
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_nq_nr&, const ex_nq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_nq_nr&, const ex_nq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <>
+struct is_executor<ex_nq_nr> : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_cq_nr
+{
+ static constexpr ResultType query(ParamType) noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_cq_nr&, const ex_cq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_cq_nr&, const ex_cq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename ResultType, typename ParamType, typename Result>
+struct is_executor<ex_cq_nr<ResultType, ParamType, Result> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_static_constexpr_member<
+ ex_cq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef Result result_type; // Must return raw result type.
+
+ static constexpr result_type value()
+ {
+ return Result();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_mq_nr
+{
+ ResultType query(ParamType) const noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_nr&, const ex_mq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_nr&, const ex_mq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename ResultType, typename ParamType, typename Result>
+struct is_executor<ex_mq_nr<ResultType, ParamType, Result> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_member<
+ ex_mq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ResultType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_fq_nr
+{
+ friend ResultType query(const ex_fq_nr&, ParamType) noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_nr&, const ex_fq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_nr&, const ex_fq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename ResultType, typename ParamType, typename Result>
+struct is_executor<ex_fq_nr<ResultType, ParamType, Result> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_free<
+ ex_fq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ResultType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename CurrentType, typename OtherType>
+struct ex_mq_mr
+{
+ CurrentType query(CurrentType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ CurrentType query(OtherType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ ex_mq_mr<CurrentType, OtherType> require(
+ CurrentType) const noexcept
+ {
+ return ex_mq_mr<CurrentType, OtherType>();
+ }
+
+ ex_mq_mr<OtherType, CurrentType> require(
+ OtherType) const noexcept
+ {
+ return ex_mq_mr<OtherType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return false;
+ }
+};
+
+template <typename CurrentType>
+struct ex_mq_mr<CurrentType, CurrentType>
+{
+ CurrentType query(CurrentType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ ex_mq_mr<CurrentType, CurrentType> require(
+ CurrentType) const noexcept
+ {
+ return ex_mq_mr<CurrentType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename CurrentType, typename OtherType>
+struct is_executor<ex_mq_mr<CurrentType, OtherType> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct query_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ || asio::is_convertible<Param, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef CurrentType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_mq_mr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_mq_mr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename CurrentType, typename OtherType>
+struct ex_fq_fr
+{
+ friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend CurrentType query(const ex_fq_fr&, OtherType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend ex_fq_fr<CurrentType, OtherType> require(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, OtherType>();
+ }
+
+ friend ex_fq_fr<OtherType, CurrentType> require(
+ const ex_fq_fr&, OtherType) noexcept
+ {
+ return ex_fq_fr<OtherType, CurrentType>();
+ }
+
+ friend ex_fq_fr<CurrentType, OtherType> prefer(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, OtherType>();
+ }
+
+ friend ex_fq_fr<OtherType, CurrentType> prefer(
+ const ex_fq_fr&, OtherType) noexcept
+ {
+ return ex_fq_fr<OtherType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return false;
+ }
+};
+
+template <typename CurrentType>
+struct ex_fq_fr<CurrentType, CurrentType>
+{
+ friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend ex_fq_fr<CurrentType, CurrentType> require(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, CurrentType>();
+ }
+
+ friend ex_fq_fr<CurrentType, CurrentType> prefer(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename CurrentType, typename OtherType>
+struct is_executor<ex_fq_fr<CurrentType, OtherType> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct query_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ || asio::is_convertible<Param, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef CurrentType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct prefer_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct prefer_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_query()
+{
+ constexpr bool b1 =
+ asio::can_query<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_query<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_query<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_query<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_query()
+{
+ exec::blocking_t result1 = asio::query(Executor(), Param());
+ ASIO_CHECK(result1 == ExpectedResult());
+
+ Executor ex1 = {};
+ exec::blocking_t result2 = asio::query(ex1, Param());
+ ASIO_CHECK(result2 == ExpectedResult());
+
+ const Executor ex2 = {};
+ exec::blocking_t result3 = asio::query(ex2, Param());
+ ASIO_CHECK(result3 == ExpectedResult());
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_constexpr_query()
+{
+ constexpr Executor ex1 = {};
+ constexpr exec::blocking_t result1 = asio::query(ex1, Param());
+ ASIO_CHECK(result1 == ExpectedResult());
+}
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_require()
+{
+ constexpr bool b1 =
+ asio::can_require<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_require<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_require<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_require<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_require()
+{
+ ASIO_CHECK(
+ asio::query(
+ asio::require(Executor(), Param()),
+ Param()) == ExpectedResult());
+
+ Executor ex1 = {};
+ ASIO_CHECK(
+ asio::query(
+ asio::require(ex1, Param()),
+ Param()) == ExpectedResult());
+
+ const Executor ex2 = {};
+ ASIO_CHECK(
+ asio::query(
+ asio::require(ex2, Param()),
+ Param()) == ExpectedResult());
+}
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_prefer()
+{
+ constexpr bool b1 =
+ asio::can_prefer<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_prefer<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_prefer<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_prefer<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_prefer()
+{
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(Executor(), Param()),
+ s())) == s(ExpectedResult()));
+
+ Executor ex1 = {};
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(ex1, Param()),
+ s())) == s(ExpectedResult()));
+
+ const Executor ex2 = {};
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(ex2, Param()),
+ s())) == s(ExpectedResult()));
+}
+
+void test_vars()
+{
+ ASIO_CHECK(s() == exec::blocking);
+ ASIO_CHECK(s() != exec::blocking.possibly);
+ ASIO_CHECK(s() != exec::blocking.always);
+ ASIO_CHECK(s() != exec::blocking.never);
+ ASIO_CHECK(n1() == exec::blocking.possibly);
+ ASIO_CHECK(n1() != exec::blocking.always);
+ ASIO_CHECK(n1() != exec::blocking.never);
+ ASIO_CHECK(n2() == exec::blocking.always);
+ ASIO_CHECK(n2() != exec::blocking.possibly);
+ ASIO_CHECK(n2() != exec::blocking.never);
+ ASIO_CHECK(n3() == exec::blocking.never);
+ ASIO_CHECK(n3() != exec::blocking.possibly);
+ ASIO_CHECK(n3() != exec::blocking.always);
+}
+
+ASIO_TEST_SUITE
+(
+ "blocking",
+
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, s, true>)
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n2, false>)
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n3, false>)
+
+ ASIO_TEST_CASE3(test_query<ex_nq_nr, s, n1>)
+ ASIO_TEST_CASE3(test_query<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, s, n1>)
+ ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, s, false>)
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n2, false>)
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n3, false>)
+
+ ASIO_TEST_CASE3(test_require<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, s, false>)
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n2, false>)
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n3, true>)
+
+ ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n1, n1>)
+ ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n3, n1>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, n3, false>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, n3, false>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, n3, true>)
+
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n3>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n3>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n3>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n3>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n1>, s, n3>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n1>, n3, n3>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n2>, s, n3>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n2>, n3, n3>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n3>, s, n3>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n3>, n3, n3>)
+
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, n3, true>)
+
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n3>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n3>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n1>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n2>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n3>, n3, n3>)
+
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, n3, true>)
+
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n3, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n3, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n3>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n3, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n1, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n3, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n3>, n1, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n1>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n2>, n1, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n2>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n3>, n1, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n3>, n3, n3>)
+
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, n3, true>)
+
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n3>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n3>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n3>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n3>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n1>, s, n3>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n1>, n3, n3>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n2>, s, n3>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n2>, n3, n3>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n3>, s, n3>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n3>, n3, n3>)
+
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, n3, true>)
+
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n3>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n3>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n1>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n2>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n3>, n3, n3>)
+
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, n3, true>)
+
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n3, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n3, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n3>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n3, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n1, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n3, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n3>, n1, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n1>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n2>, n1, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n2>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n3>, n1, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n3>, n3, n3>)
+
+ ASIO_TEST_CASE(test_vars)
+)
diff --git a/3rdparty/asio/src/tests/unit/execution/blocking_adaptation.cpp b/3rdparty/asio/src/tests/unit/execution/blocking_adaptation.cpp
new file mode 100644
index 00000000000..b6e77dd31a9
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/execution/blocking_adaptation.cpp
@@ -0,0 +1,1323 @@
+//
+// blocking_adaptation.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/execution/blocking_adaptation.hpp"
+
+#include "asio/prefer.hpp"
+#include "asio/query.hpp"
+#include "asio/require.hpp"
+#include "../unit_test.hpp"
+
+namespace exec = asio::execution;
+
+typedef exec::blocking_adaptation_t s;
+typedef exec::blocking_adaptation_t::disallowed_t n1;
+typedef exec::blocking_adaptation_t::allowed_t n2;
+
+struct ex_nq_nr
+{
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_nq_nr&, const ex_nq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_nq_nr&, const ex_nq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <>
+struct equality_comparable<ex_nq_nr>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename Function>
+struct execute_member<ex_nq_nr, Function>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_cq_nr
+{
+ static constexpr ResultType query(ParamType) noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_cq_nr&, const ex_cq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_cq_nr&, const ex_cq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename ResultType, typename ParamType, typename Result>
+struct equality_comparable<ex_cq_nr<ResultType, ParamType, Result> >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Function>
+struct execute_member<ex_cq_nr<ResultType, ParamType, Result>, Function>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_static_constexpr_member<
+ ex_cq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef Result result_type; // Must return raw result type.
+
+ static constexpr result_type value()
+ {
+ return Result();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_mq_nr
+{
+ ResultType query(ParamType) const noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_nr&, const ex_mq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_nr&, const ex_mq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename ResultType, typename ParamType, typename Result>
+struct equality_comparable<ex_mq_nr<ResultType, ParamType, Result> >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Function>
+struct execute_member<ex_mq_nr<ResultType, ParamType, Result>, Function>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_member<
+ ex_mq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ResultType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_fq_nr
+{
+ friend ResultType query(const ex_fq_nr&, ParamType) noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_nr&, const ex_fq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_nr&, const ex_fq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename ResultType, typename ParamType, typename Result>
+struct equality_comparable<ex_fq_nr<ResultType, ParamType, Result> >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Function>
+struct execute_member<ex_fq_nr<ResultType, ParamType, Result>, Function>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_free<
+ ex_fq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ResultType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename CurrentType, typename OtherType>
+struct ex_mq_mr
+{
+ CurrentType query(CurrentType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ CurrentType query(OtherType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ ex_mq_mr<CurrentType, OtherType> require(
+ CurrentType) const noexcept
+ {
+ return ex_mq_mr<CurrentType, OtherType>();
+ }
+
+ ex_mq_mr<OtherType, CurrentType> require(
+ OtherType) const noexcept
+ {
+ return ex_mq_mr<OtherType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return false;
+ }
+};
+
+template <typename CurrentType>
+struct ex_mq_mr<CurrentType, CurrentType>
+{
+ CurrentType query(CurrentType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ ex_mq_mr<CurrentType, CurrentType> require(
+ CurrentType) const noexcept
+ {
+ return ex_mq_mr<CurrentType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return false;
+ }
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename CurrentType, typename OtherType>
+struct equality_comparable<ex_mq_mr<CurrentType, OtherType> >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Function>
+struct execute_member<ex_mq_mr<CurrentType, OtherType>, Function>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct query_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ || asio::is_convertible<Param, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef CurrentType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_mq_mr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_mq_mr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename CurrentType, typename OtherType>
+struct ex_fq_fr
+{
+ friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend CurrentType query(const ex_fq_fr&, OtherType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend ex_fq_fr<CurrentType, OtherType> require(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, OtherType>();
+ }
+
+ friend ex_fq_fr<OtherType, CurrentType> require(
+ const ex_fq_fr&, OtherType) noexcept
+ {
+ return ex_fq_fr<OtherType, CurrentType>();
+ }
+
+ friend ex_fq_fr<CurrentType, OtherType> prefer(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, OtherType>();
+ }
+
+ friend ex_fq_fr<OtherType, CurrentType> prefer(
+ const ex_fq_fr&, OtherType) noexcept
+ {
+ return ex_fq_fr<OtherType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return false;
+ }
+};
+
+template <typename CurrentType>
+struct ex_fq_fr<CurrentType, CurrentType>
+{
+ friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend ex_fq_fr<CurrentType, CurrentType> require(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, CurrentType>();
+ }
+
+ friend ex_fq_fr<CurrentType, CurrentType> prefer(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return false;
+ }
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <typename CurrentType, typename OtherType>
+struct equality_comparable<ex_fq_fr<CurrentType, OtherType> >
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Function>
+struct execute_member<ex_fq_fr<CurrentType, OtherType>, Function>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct query_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ || asio::is_convertible<Param, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef CurrentType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct prefer_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct prefer_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_query()
+{
+ constexpr bool b1 =
+ asio::can_query<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_query<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_query<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_query<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_query()
+{
+ exec::blocking_adaptation_t result1 = asio::query(Executor(), Param());
+ ASIO_CHECK(result1 == ExpectedResult());
+
+ Executor ex1 = {};
+ exec::blocking_adaptation_t result2 = asio::query(ex1, Param());
+ ASIO_CHECK(result2 == ExpectedResult());
+
+ const Executor ex2 = {};
+ exec::blocking_adaptation_t result3 = asio::query(ex2, Param());
+ ASIO_CHECK(result3 == ExpectedResult());
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_constexpr_query()
+{
+ constexpr Executor ex1 = {};
+ constexpr exec::blocking_adaptation_t result1 = asio::query(ex1, Param());
+ ASIO_CHECK(result1 == ExpectedResult());
+}
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_require()
+{
+ constexpr bool b1 =
+ asio::can_require<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_require<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_require<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_require<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+void do_nothing()
+{
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_require()
+{
+ ASIO_CHECK(
+ asio::query(
+ asio::require(Executor(), Param()),
+ Param()) == ExpectedResult());
+
+ Executor ex1 = {};
+
+ ASIO_CHECK(
+ asio::query(
+ asio::require(ex1, Param()),
+ Param()) == ExpectedResult());
+
+ ASIO_CHECK((
+ asio::execution::is_executor<
+ typename asio::decay<
+ typename asio::require_result<Executor&, Param>::type
+ >::type
+ >::value));
+
+ const Executor ex2 = {};
+
+ ASIO_CHECK(
+ asio::query(
+ asio::require(ex2, Param()),
+ Param()) == ExpectedResult());
+
+ ASIO_CHECK((
+ asio::execution::is_executor<
+ typename asio::decay<
+ typename asio::require_result<const Executor&, Param>::type
+ >::type
+ >::value));
+}
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_prefer()
+{
+ constexpr bool b1 =
+ asio::can_prefer<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_prefer<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_prefer<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_prefer<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_prefer()
+{
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(Executor(), Param()),
+ s())) == s(ExpectedResult()));
+
+ Executor ex1 = {};
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(ex1, Param()),
+ s())) == s(ExpectedResult()));
+
+ const Executor ex2 = {};
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(ex2, Param()),
+ s())) == s(ExpectedResult()));
+}
+
+void test_vars()
+{
+ ASIO_CHECK(s() == exec::blocking_adaptation);
+ ASIO_CHECK(s() != exec::blocking_adaptation.disallowed);
+ ASIO_CHECK(s() != exec::blocking_adaptation.allowed);
+ ASIO_CHECK(n1() == exec::blocking_adaptation.disallowed);
+ ASIO_CHECK(n1() != exec::blocking_adaptation.allowed);
+ ASIO_CHECK(n2() == exec::blocking_adaptation.allowed);
+ ASIO_CHECK(n2() != exec::blocking_adaptation.disallowed);
+}
+
+ASIO_TEST_SUITE
+(
+ "blocking_adaptation",
+
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, s, true>)
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n2, false>)
+
+ ASIO_TEST_CASE3(test_query<ex_nq_nr, s, n1>)
+ ASIO_TEST_CASE3(test_query<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, s, n1>)
+ ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, s, false>)
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n2, true>)
+
+ ASIO_TEST_CASE3(test_require<ex_nq_nr, n1, n1>)
+ ASIO_TEST_CASE3(test_require<ex_nq_nr, n2, n2>)
+
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, s, false>)
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n2, false>)
+
+ ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n1>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n1>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n2, n1>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n1, s, n1>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n2, false>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n1, n2>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_require<ex_mq_nr<s, s, n1>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_mq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_mq_nr<s, n1, n1>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_mq_nr<s, n1, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_mq_nr<s, n2, n1>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_mq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_mq_nr<n1, s, n1>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_mq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n2, false>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n1, n2>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_require<ex_fq_nr<s, s, n1>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_fq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_fq_nr<s, n1, n1>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_fq_nr<s, n1, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_fq_nr<s, n2, n1>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_fq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_fq_nr<n1, s, n1>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_fq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n2, false>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n1, n2>)
+
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n2, false>)
+
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n1, n2>)
+
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n2, false>)
+
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n1, n2>)
+
+ ASIO_TEST_CASE(test_vars)
+)
diff --git a/3rdparty/asio/src/tests/unit/execution/context_as.cpp b/3rdparty/asio/src/tests/unit/execution/context_as.cpp
new file mode 100644
index 00000000000..13311ba262b
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/execution/context_as.cpp
@@ -0,0 +1,147 @@
+//
+// context_as.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/execution/context_as.hpp"
+
+#include <functional>
+#include "asio/execution/any_executor.hpp"
+#include "asio/io_context.hpp"
+#include "asio/static_thread_pool.hpp"
+#include "../unit_test.hpp"
+
+using namespace asio;
+namespace bindns = std;
+
+void context_as_executor_query_test()
+{
+ static_thread_pool pool(1);
+
+ ASIO_CHECK(
+ &asio::query(pool.executor(),
+ execution::context_as_t<static_thread_pool&>())
+ == &pool);
+
+ execution::any_executor<
+ execution::context_as_t<static_thread_pool&>
+ > ex1 = pool.executor();
+
+ ASIO_CHECK(
+ &asio::query(ex1,
+ execution::context_as_t<static_thread_pool&>())
+ == &pool);
+
+ ASIO_CHECK(
+ &asio::query(ex1, execution::context)
+ == &pool);
+
+ ASIO_CHECK(
+ &asio::query(pool.executor(),
+ execution::context_as_t<const static_thread_pool&>())
+ == &pool);
+
+ execution::any_executor<
+ execution::context_as_t<const static_thread_pool&>
+ > ex2 = pool.executor();
+
+ ASIO_CHECK(
+ &asio::query(ex2,
+ execution::context_as_t<const static_thread_pool&>())
+ == &pool);
+
+ ASIO_CHECK(
+ &asio::query(ex2, execution::context)
+ == &pool);
+
+ io_context io_ctx;
+
+ ASIO_CHECK(
+ &asio::query(io_ctx.get_executor(),
+ execution::context_as_t<io_context&>())
+ == &io_ctx);
+
+ execution::any_executor<
+ execution::context_as_t<io_context&>
+ > ex3 = io_ctx.get_executor();
+
+ ASIO_CHECK(
+ &asio::query(ex3,
+ execution::context_as_t<io_context&>())
+ == &io_ctx);
+
+ ASIO_CHECK(
+ &asio::query(ex3, execution::context)
+ == &io_ctx);
+
+ ASIO_CHECK(
+ &asio::query(io_ctx.get_executor(),
+ execution::context_as_t<const io_context&>())
+ == &io_ctx);
+
+ execution::any_executor<
+ execution::context_as_t<const io_context&>
+ > ex4 = io_ctx.get_executor();
+
+ ASIO_CHECK(
+ &asio::query(ex4,
+ execution::context_as_t<const io_context&>())
+ == &io_ctx);
+
+ ASIO_CHECK(
+ &asio::query(ex4, execution::context)
+ == &io_ctx);
+
+ ASIO_CHECK(
+ &asio::query(io_ctx.get_executor(),
+ execution::context_as_t<execution_context&>())
+ == &io_ctx);
+
+ execution::any_executor<
+ execution::context_as_t<execution_context&>
+ > ex5 = io_ctx.get_executor();
+
+ ASIO_CHECK(
+ &asio::query(ex5,
+ execution::context_as_t<execution_context&>())
+ == &io_ctx);
+
+ ASIO_CHECK(
+ &asio::query(ex5, execution::context)
+ == &io_ctx);
+
+ ASIO_CHECK(
+ &asio::query(io_ctx.get_executor(),
+ execution::context_as_t<const execution_context&>())
+ == &io_ctx);
+
+ execution::any_executor<
+ execution::context_as_t<const execution_context&>
+ > ex6 = io_ctx.get_executor();
+
+ ASIO_CHECK(
+ &asio::query(ex6,
+ execution::context_as_t<const execution_context&>())
+ == &io_ctx);
+
+ ASIO_CHECK(
+ &asio::query(ex6, execution::context)
+ == &io_ctx);
+}
+
+ASIO_TEST_SUITE
+(
+ "context_as",
+ ASIO_TEST_CASE(context_as_executor_query_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/execution/executor.cpp b/3rdparty/asio/src/tests/unit/execution/executor.cpp
new file mode 100644
index 00000000000..8b02622bdca
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/execution/executor.cpp
@@ -0,0 +1,106 @@
+//
+// executor.cpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/execution/executor.hpp"
+
+#include "../unit_test.hpp"
+
+struct not_an_executor
+{
+};
+
+struct executor
+{
+ executor()
+ {
+ }
+
+ executor(const executor&) noexcept
+ {
+ }
+
+ executor(executor&&) noexcept
+ {
+ }
+
+ template <typename F>
+ void execute(F&& f) const noexcept
+ {
+ (void)f;
+ }
+
+ bool operator==(const executor&) const noexcept
+ {
+ return true;
+ }
+
+ bool operator!=(const executor&) const noexcept
+ {
+ return false;
+ }
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename F>
+struct execute_member<executor, F>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_SET_ERROR_MEMBER_TRAIT)
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <>
+struct equality_comparable<executor>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+void is_executor_test()
+{
+ ASIO_CHECK((
+ !asio::execution::is_executor<
+ void
+ >::value));
+
+ ASIO_CHECK((
+ !asio::execution::is_executor<
+ not_an_executor
+ >::value));
+
+ ASIO_CHECK((
+ asio::execution::is_executor<
+ executor
+ >::value));
+}
+
+ASIO_TEST_SUITE
+(
+ "executor",
+ ASIO_TEST_CASE(is_executor_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/execution/invocable_archetype.cpp b/3rdparty/asio/src/tests/unit/execution/invocable_archetype.cpp
new file mode 100644
index 00000000000..5dbfb94d9f4
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/execution/invocable_archetype.cpp
@@ -0,0 +1,25 @@
+//
+// invocable_archetype.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/execution/invocable_archetype.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "invocable_archetype",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/execution/mapping.cpp b/3rdparty/asio/src/tests/unit/execution/mapping.cpp
new file mode 100644
index 00000000000..399aae3ea90
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/execution/mapping.cpp
@@ -0,0 +1,1985 @@
+//
+// mapping.cpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/execution/mapping.hpp"
+
+#include "asio/prefer.hpp"
+#include "asio/query.hpp"
+#include "asio/require.hpp"
+#include "../unit_test.hpp"
+
+namespace exec = asio::execution;
+
+typedef exec::mapping_t s;
+typedef exec::mapping_t::thread_t n1;
+typedef exec::mapping_t::new_thread_t n2;
+typedef exec::mapping_t::other_t n3;
+
+struct ex_nq_nr
+{
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_nq_nr&, const ex_nq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_nq_nr&, const ex_nq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <>
+struct is_executor<ex_nq_nr> : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_cq_nr
+{
+ static constexpr ResultType query(ParamType) noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_cq_nr&, const ex_cq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_cq_nr&, const ex_cq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename ResultType, typename ParamType, typename Result>
+struct is_executor<ex_cq_nr<ResultType, ParamType, Result> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_static_constexpr_member<
+ ex_cq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef Result result_type; // Must return raw result type.
+
+ static constexpr result_type value()
+ {
+ return Result();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_mq_nr
+{
+ ResultType query(ParamType) const noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_nr&, const ex_mq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_nr&, const ex_mq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename ResultType, typename ParamType, typename Result>
+struct is_executor<ex_mq_nr<ResultType, ParamType, Result> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_member<
+ ex_mq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ResultType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_fq_nr
+{
+ friend ResultType query(const ex_fq_nr&, ParamType) noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_nr&, const ex_fq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_nr&, const ex_fq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename ResultType, typename ParamType, typename Result>
+struct is_executor<ex_fq_nr<ResultType, ParamType, Result> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_free<
+ ex_fq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ResultType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename CurrentType, typename OtherType>
+struct ex_mq_mr
+{
+ CurrentType query(CurrentType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ CurrentType query(OtherType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ ex_mq_mr<CurrentType, OtherType> require(
+ CurrentType) const noexcept
+ {
+ return ex_mq_mr<CurrentType, OtherType>();
+ }
+
+ ex_mq_mr<OtherType, CurrentType> require(
+ OtherType) const noexcept
+ {
+ return ex_mq_mr<OtherType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return false;
+ }
+};
+
+template <typename CurrentType>
+struct ex_mq_mr<CurrentType, CurrentType>
+{
+ CurrentType query(CurrentType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ ex_mq_mr<CurrentType, CurrentType> require(
+ CurrentType) const noexcept
+ {
+ return ex_mq_mr<CurrentType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename CurrentType, typename OtherType>
+struct is_executor<ex_mq_mr<CurrentType, OtherType> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct query_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ || asio::is_convertible<Param, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef CurrentType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_mq_mr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_mq_mr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename CurrentType, typename OtherType>
+struct ex_fq_fr
+{
+ friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend CurrentType query(const ex_fq_fr&, OtherType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend ex_fq_fr<CurrentType, OtherType> require(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, OtherType>();
+ }
+
+ friend ex_fq_fr<OtherType, CurrentType> require(
+ const ex_fq_fr&, OtherType) noexcept
+ {
+ return ex_fq_fr<OtherType, CurrentType>();
+ }
+
+ friend ex_fq_fr<CurrentType, OtherType> prefer(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, OtherType>();
+ }
+
+ friend ex_fq_fr<OtherType, CurrentType> prefer(
+ const ex_fq_fr&, OtherType) noexcept
+ {
+ return ex_fq_fr<OtherType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return false;
+ }
+};
+
+template <typename CurrentType>
+struct ex_fq_fr<CurrentType, CurrentType>
+{
+ friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend ex_fq_fr<CurrentType, CurrentType> require(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, CurrentType>();
+ }
+
+ friend ex_fq_fr<CurrentType, CurrentType> prefer(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename CurrentType, typename OtherType>
+struct is_executor<ex_fq_fr<CurrentType, OtherType> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct query_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ || asio::is_convertible<Param, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef CurrentType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct prefer_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct prefer_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_query()
+{
+ constexpr bool b1 =
+ asio::can_query<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_query<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_query<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_query<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_query()
+{
+ exec::mapping_t result1 = asio::query(Executor(), Param());
+ ASIO_CHECK(result1 == ExpectedResult());
+
+ Executor ex1 = {};
+ exec::mapping_t result2 = asio::query(ex1, Param());
+ ASIO_CHECK(result2 == ExpectedResult());
+
+ const Executor ex2 = {};
+ exec::mapping_t result3 = asio::query(ex2, Param());
+ ASIO_CHECK(result3 == ExpectedResult());
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_constexpr_query()
+{
+ constexpr Executor ex1 = {};
+ constexpr exec::mapping_t result1 = asio::query(ex1, Param());
+ ASIO_CHECK(result1 == ExpectedResult());
+}
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_require()
+{
+ constexpr bool b1 =
+ asio::can_require<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_require<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_require<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_require<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_require()
+{
+ ASIO_CHECK(
+ asio::query(
+ asio::require(Executor(), Param()),
+ Param()) == ExpectedResult());
+
+ Executor ex1 = {};
+ ASIO_CHECK(
+ asio::query(
+ asio::require(ex1, Param()),
+ Param()) == ExpectedResult());
+
+ const Executor ex2 = {};
+ ASIO_CHECK(
+ asio::query(
+ asio::require(ex2, Param()),
+ Param()) == ExpectedResult());
+}
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_prefer()
+{
+ constexpr bool b1 =
+ asio::can_prefer<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_prefer<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_prefer<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_prefer<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_prefer()
+{
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(Executor(), Param()),
+ s())) == s(ExpectedResult()));
+
+ Executor ex1 = {};
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(ex1, Param()),
+ s())) == s(ExpectedResult()));
+
+ const Executor ex2 = {};
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(ex2, Param()),
+ s())) == s(ExpectedResult()));
+}
+
+void test_vars()
+{
+ ASIO_CHECK(s() == exec::mapping);
+ ASIO_CHECK(s() != exec::mapping.thread);
+ ASIO_CHECK(s() != exec::mapping.new_thread);
+ ASIO_CHECK(s() != exec::mapping.other);
+ ASIO_CHECK(n1() == exec::mapping.thread);
+ ASIO_CHECK(n1() != exec::mapping.new_thread);
+ ASIO_CHECK(n1() != exec::mapping.other);
+ ASIO_CHECK(n2() == exec::mapping.new_thread);
+ ASIO_CHECK(n2() != exec::mapping.thread);
+ ASIO_CHECK(n2() != exec::mapping.other);
+ ASIO_CHECK(n3() == exec::mapping.other);
+ ASIO_CHECK(n3() != exec::mapping.thread);
+ ASIO_CHECK(n3() != exec::mapping.new_thread);
+}
+
+ASIO_TEST_SUITE
+(
+ "mapping",
+
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, s, true>)
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n2, false>)
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n3, false>)
+
+ ASIO_TEST_CASE3(test_query<ex_nq_nr, s, n1>)
+ ASIO_TEST_CASE3(test_query<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, s, n1>)
+ ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, s, false>)
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n2, false>)
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n3, false>)
+
+ ASIO_TEST_CASE3(test_require<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, s, false>)
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n2, true>)
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n3, true>)
+
+ ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n1, n1>)
+ ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n2, n1>)
+ ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n3, n1>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n3, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n3, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n3, s, n3>, n3, false>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n3, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, s, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n3, n3>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n3, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n3, s, n3>, n3, false>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n3, n3>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n3, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n3, s, n3>, n3, true>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n3, n3>, n3, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n3, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n3, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n3, s, n3>, n1, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n3, s, n3>, n2, n3>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n3, s, n3>, n3, n3>)
+
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n3, n3>, n3, true>)
+
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n3>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n3>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n3>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n3>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n1>, s, n3>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n1>, n3, n3>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n2>, s, n3>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n2>, n3, n3>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n3>, s, n3>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n3, n3>, n3, n3>)
+
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n3, n3>, n3, true>)
+
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n3>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n3>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n1>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n2>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n3, n3>, n3, n3>)
+
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n3, n3>, n3, true>)
+
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n2, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n3, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n3, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n3>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n3>, n2, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n3, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n1, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n3, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n3>, n1, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n3>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n1>, n2, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n1>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n2>, n1, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n2>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n3>, n1, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n3>, n2, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n3, n3>, n3, n3>)
+
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n3, n3>, n3, true>)
+
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n3>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n3>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n3>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n3>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n1>, s, n3>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n1>, n3, n3>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n2>, s, n3>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n2>, n3, n3>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n3>, s, n3>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n3, n3>, n3, n3>)
+
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n3, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n3, n3>, n3, true>)
+
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n3>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n3>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n1>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n2>, n3, n3>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n3, n3>, n3, n3>)
+
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n3>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n1>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n2>, n3, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n3, n3>, n3, true>)
+
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n2, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n3, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n3, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n3>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n3>, n2, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n3, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n1, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n3, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n3>, n1, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n3>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n3>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n1>, n2, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n1>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n2>, n1, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n2>, n3, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n3>, n1, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n3>, n2, n3>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n3, n3>, n3, n3>)
+
+ ASIO_TEST_CASE(test_vars)
+)
diff --git a/3rdparty/asio/src/tests/unit/execution/outstanding_work.cpp b/3rdparty/asio/src/tests/unit/execution/outstanding_work.cpp
new file mode 100644
index 00000000000..cddd0b52c23
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/execution/outstanding_work.cpp
@@ -0,0 +1,1252 @@
+//
+// outstanding_work.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/execution/outstanding_work.hpp"
+
+#include "asio/prefer.hpp"
+#include "asio/query.hpp"
+#include "asio/require.hpp"
+#include "../unit_test.hpp"
+
+namespace exec = asio::execution;
+
+typedef exec::outstanding_work_t s;
+typedef exec::outstanding_work_t::untracked_t n1;
+typedef exec::outstanding_work_t::tracked_t n2;
+
+struct ex_nq_nr
+{
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_nq_nr&, const ex_nq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_nq_nr&, const ex_nq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <>
+struct is_executor<ex_nq_nr> : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_cq_nr
+{
+ static constexpr ResultType query(ParamType) noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_cq_nr&, const ex_cq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_cq_nr&, const ex_cq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename ResultType, typename ParamType, typename Result>
+struct is_executor<ex_cq_nr<ResultType, ParamType, Result> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_static_constexpr_member<
+ ex_cq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef Result result_type; // Must return raw result type.
+
+ static constexpr result_type value()
+ {
+ return Result();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_mq_nr
+{
+ ResultType query(ParamType) const noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_nr&, const ex_mq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_nr&, const ex_mq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename ResultType, typename ParamType, typename Result>
+struct is_executor<ex_mq_nr<ResultType, ParamType, Result> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_member<
+ ex_mq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ResultType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_fq_nr
+{
+ friend ResultType query(const ex_fq_nr&, ParamType) noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_nr&, const ex_fq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_nr&, const ex_fq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename ResultType, typename ParamType, typename Result>
+struct is_executor<ex_fq_nr<ResultType, ParamType, Result> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_free<
+ ex_fq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ResultType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename CurrentType, typename OtherType>
+struct ex_mq_mr
+{
+ CurrentType query(CurrentType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ CurrentType query(OtherType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ ex_mq_mr<CurrentType, OtherType> require(
+ CurrentType) const noexcept
+ {
+ return ex_mq_mr<CurrentType, OtherType>();
+ }
+
+ ex_mq_mr<OtherType, CurrentType> require(
+ OtherType) const noexcept
+ {
+ return ex_mq_mr<OtherType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return false;
+ }
+};
+
+template <typename CurrentType>
+struct ex_mq_mr<CurrentType, CurrentType>
+{
+ CurrentType query(CurrentType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ ex_mq_mr<CurrentType, CurrentType> require(
+ CurrentType) const noexcept
+ {
+ return ex_mq_mr<CurrentType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename CurrentType, typename OtherType>
+struct is_executor<ex_mq_mr<CurrentType, OtherType> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct query_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ || asio::is_convertible<Param, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef CurrentType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_mq_mr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_mq_mr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename CurrentType, typename OtherType>
+struct ex_fq_fr
+{
+ friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend CurrentType query(const ex_fq_fr&, OtherType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend ex_fq_fr<CurrentType, OtherType> require(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, OtherType>();
+ }
+
+ friend ex_fq_fr<OtherType, CurrentType> require(
+ const ex_fq_fr&, OtherType) noexcept
+ {
+ return ex_fq_fr<OtherType, CurrentType>();
+ }
+
+ friend ex_fq_fr<CurrentType, OtherType> prefer(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, OtherType>();
+ }
+
+ friend ex_fq_fr<OtherType, CurrentType> prefer(
+ const ex_fq_fr&, OtherType) noexcept
+ {
+ return ex_fq_fr<OtherType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return false;
+ }
+};
+
+template <typename CurrentType>
+struct ex_fq_fr<CurrentType, CurrentType>
+{
+ friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend ex_fq_fr<CurrentType, CurrentType> require(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, CurrentType>();
+ }
+
+ friend ex_fq_fr<CurrentType, CurrentType> prefer(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename CurrentType, typename OtherType>
+struct is_executor<ex_fq_fr<CurrentType, OtherType> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct query_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ || asio::is_convertible<Param, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef CurrentType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct prefer_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct prefer_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_query()
+{
+ constexpr bool b1 =
+ asio::can_query<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_query<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_query<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_query<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_query()
+{
+ exec::outstanding_work_t result1 = asio::query(Executor(), Param());
+ ASIO_CHECK(result1 == ExpectedResult());
+
+ Executor ex1 = {};
+ exec::outstanding_work_t result2 = asio::query(ex1, Param());
+ ASIO_CHECK(result2 == ExpectedResult());
+
+ const Executor ex2 = {};
+ exec::outstanding_work_t result3 = asio::query(ex2, Param());
+ ASIO_CHECK(result3 == ExpectedResult());
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_constexpr_query()
+{
+ constexpr Executor ex1 = {};
+ constexpr exec::outstanding_work_t result1 = asio::query(ex1, Param());
+ ASIO_CHECK(result1 == ExpectedResult());
+}
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_require()
+{
+ constexpr bool b1 =
+ asio::can_require<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_require<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_require<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_require<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_require()
+{
+ ASIO_CHECK(
+ asio::query(
+ asio::require(Executor(), Param()),
+ Param()) == ExpectedResult());
+
+ Executor ex1 = {};
+ ASIO_CHECK(
+ asio::query(
+ asio::require(ex1, Param()),
+ Param()) == ExpectedResult());
+
+ const Executor ex2 = {};
+ ASIO_CHECK(
+ asio::query(
+ asio::require(ex2, Param()),
+ Param()) == ExpectedResult());
+}
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_prefer()
+{
+ constexpr bool b1 =
+ asio::can_prefer<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_prefer<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_prefer<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_prefer<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_prefer()
+{
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(Executor(), Param()),
+ s())) == s(ExpectedResult()));
+
+ Executor ex1 = {};
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(ex1, Param()),
+ s())) == s(ExpectedResult()));
+
+ const Executor ex2 = {};
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(ex2, Param()),
+ s())) == s(ExpectedResult()));
+}
+
+void test_vars()
+{
+ ASIO_CHECK(s() == exec::outstanding_work);
+ ASIO_CHECK(s() != exec::outstanding_work.untracked);
+ ASIO_CHECK(s() != exec::outstanding_work.tracked);
+ ASIO_CHECK(n1() == exec::outstanding_work.untracked);
+ ASIO_CHECK(n1() != exec::outstanding_work.tracked);
+ ASIO_CHECK(n2() == exec::outstanding_work.tracked);
+ ASIO_CHECK(n2() != exec::outstanding_work.untracked);
+}
+
+ASIO_TEST_SUITE
+(
+ "outstanding_work",
+
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, s, true>)
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n2, false>)
+
+ ASIO_TEST_CASE3(test_query<ex_nq_nr, s, n1>)
+ ASIO_TEST_CASE3(test_query<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, s, n1>)
+ ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, s, false>)
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n2, false>)
+
+ ASIO_TEST_CASE3(test_require<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, s, false>)
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n2, true>)
+
+ ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n1, n1>)
+ ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n2, n1>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n2, false>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n2, false>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n2, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n1, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n2, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n1, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE(test_vars)
+)
diff --git a/3rdparty/asio/src/tests/unit/execution/prefer_only.cpp b/3rdparty/asio/src/tests/unit/execution/prefer_only.cpp
new file mode 100644
index 00000000000..60500002475
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/execution/prefer_only.cpp
@@ -0,0 +1,533 @@
+//
+// prefer_only.cpp
+// ~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/execution/prefer_only.hpp"
+
+#include <functional>
+#include "asio/execution/any_executor.hpp"
+#include "../unit_test.hpp"
+
+using namespace asio;
+namespace bindns = std;
+
+static int possibly_blocking_count = 0;
+static int never_blocking_count = 0;
+
+struct possibly_blocking_executor
+{
+ template <typename F>
+ void execute(const F&) const
+ {
+ ++possibly_blocking_count;
+ }
+
+ friend bool operator==(const possibly_blocking_executor&,
+ const possibly_blocking_executor&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const possibly_blocking_executor&,
+ const possibly_blocking_executor&) noexcept
+ {
+ return false;
+ }
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename F>
+struct execute_member<possibly_blocking_executor, F>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <>
+struct equality_comparable<possibly_blocking_executor>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+struct never_blocking_executor
+{
+ static constexpr execution::blocking_t::never_t
+ query(execution::blocking_t) noexcept
+ {
+ return execution::blocking_t::never_t();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ ++never_blocking_count;
+ }
+
+ friend bool operator==(const never_blocking_executor&,
+ const never_blocking_executor&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const never_blocking_executor&,
+ const never_blocking_executor&) noexcept
+ {
+ return false;
+ }
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename F>
+struct execute_member<never_blocking_executor, F>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <>
+struct equality_comparable<never_blocking_executor>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename Param>
+struct query_static_constexpr_member<
+ never_blocking_executor, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, execution::blocking_t>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef execution::blocking_t::never_t result_type;
+
+ static constexpr result_type value()
+ {
+ return result_type();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+struct either_blocking_executor
+{
+ execution::blocking_t blocking_;
+
+ explicit either_blocking_executor(execution::blocking_t b)
+ : blocking_(b)
+ {
+ }
+
+ execution::blocking_t query(execution::blocking_t) const noexcept
+ {
+ return blocking_;
+ }
+
+ either_blocking_executor require(execution::blocking_t::possibly_t) const
+ {
+ return either_blocking_executor(execution::blocking.possibly);
+ }
+
+ either_blocking_executor require(execution::blocking_t::never_t) const
+ {
+ return either_blocking_executor(execution::blocking.never);
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ if (blocking_ == execution::blocking.never)
+ ++never_blocking_count;
+ else
+ ++possibly_blocking_count;
+ }
+
+ friend bool operator==(const either_blocking_executor& a,
+ const either_blocking_executor& b) noexcept
+ {
+ return a.blocking_ == b.blocking_;
+ }
+
+ friend bool operator!=(const either_blocking_executor& a,
+ const either_blocking_executor& b) noexcept
+ {
+ return a.blocking_ != b.blocking_;
+ }
+};
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+template <typename F>
+struct execute_member<either_blocking_executor, F>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+ typedef void result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+template <>
+struct equality_comparable<either_blocking_executor>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename Param>
+struct query_member<
+ either_blocking_executor, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, execution::blocking_t>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef execution::blocking_t result_type;
+};
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename Param>
+struct require_member<
+ either_blocking_executor, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, execution::blocking_t>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = false;
+
+ typedef either_blocking_executor result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+void prefer_only_executor_query_test()
+{
+ typedef execution::any_executor<
+ execution::blocking_t,
+ execution::prefer_only<execution::blocking_t::possibly_t>,
+ execution::prefer_only<execution::blocking_t::never_t>
+ > executor_type;
+
+ executor_type ex1 = possibly_blocking_executor();
+
+ ASIO_CHECK(
+ asio::query(ex1, execution::blocking)
+ == execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex1, execution::blocking.possibly)
+ == execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex1, execution::blocking.never)
+ == execution::blocking.possibly);
+
+ executor_type ex2 = asio::prefer(ex1, execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex2, execution::blocking)
+ == execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex2, execution::blocking.possibly)
+ == execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex2, execution::blocking.never)
+ == execution::blocking.possibly);
+
+ executor_type ex3 = asio::prefer(ex1, execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex3, execution::blocking)
+ == execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex3, execution::blocking.possibly)
+ == execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex3, execution::blocking.never)
+ == execution::blocking.possibly);
+
+ executor_type ex4 = never_blocking_executor();
+
+ ASIO_CHECK(
+ asio::query(ex4, execution::blocking)
+ == execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex4, execution::blocking.possibly)
+ == execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex4, execution::blocking.never)
+ == execution::blocking.never);
+
+ executor_type ex5 = asio::prefer(ex4, execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex5, execution::blocking)
+ == execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex5, execution::blocking.possibly)
+ == execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex5, execution::blocking.never)
+ == execution::blocking.never);
+
+ executor_type ex6 = asio::prefer(ex4, execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex6, execution::blocking)
+ == execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex6, execution::blocking.possibly)
+ == execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex6, execution::blocking.never)
+ == execution::blocking.never);
+
+ executor_type ex7 = either_blocking_executor(execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex7, execution::blocking)
+ == execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex7, execution::blocking.possibly)
+ == execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex7, execution::blocking.never)
+ == execution::blocking.possibly);
+
+ executor_type ex8 = asio::prefer(ex7, execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex8, execution::blocking)
+ == execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex8, execution::blocking.possibly)
+ == execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex8, execution::blocking.never)
+ == execution::blocking.possibly);
+
+ executor_type ex9 = asio::prefer(ex7, execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex9, execution::blocking)
+ == execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex9, execution::blocking.possibly)
+ == execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex9, execution::blocking.never)
+ == execution::blocking.never);
+
+ executor_type ex10 = either_blocking_executor(execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex10, execution::blocking)
+ == execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex10, execution::blocking.possibly)
+ == execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex10, execution::blocking.never)
+ == execution::blocking.never);
+
+ executor_type ex11 = asio::prefer(ex7, execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex11, execution::blocking)
+ == execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex11, execution::blocking.possibly)
+ == execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ex11, execution::blocking.never)
+ == execution::blocking.possibly);
+
+ executor_type ex12 = asio::prefer(ex7, execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex12, execution::blocking)
+ == execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex12, execution::blocking.possibly)
+ == execution::blocking.never);
+
+ ASIO_CHECK(
+ asio::query(ex12, execution::blocking.never)
+ == execution::blocking.never);
+}
+
+void do_nothing()
+{
+}
+
+void prefer_only_executor_execute_test()
+{
+ typedef execution::any_executor<
+ execution::blocking_t,
+ execution::prefer_only<execution::blocking_t::possibly_t>,
+ execution::prefer_only<execution::blocking_t::never_t>
+ > executor_type;
+
+ executor_type ex1 = possibly_blocking_executor();
+
+ ex1.execute(&do_nothing);
+ ASIO_CHECK(possibly_blocking_count == 1);
+ ASIO_CHECK(never_blocking_count == 0);
+
+ executor_type ex2 = asio::prefer(ex1, execution::blocking.possibly);
+
+ ex2.execute(&do_nothing);
+ ASIO_CHECK(possibly_blocking_count == 2);
+ ASIO_CHECK(never_blocking_count == 0);
+
+ executor_type ex3 = asio::prefer(ex1, execution::blocking.never);
+
+ ex3.execute(&do_nothing);
+ ASIO_CHECK(possibly_blocking_count == 3);
+ ASIO_CHECK(never_blocking_count == 0);
+
+ executor_type ex4 = never_blocking_executor();
+
+ ex4.execute(&do_nothing);
+ ASIO_CHECK(possibly_blocking_count == 3);
+ ASIO_CHECK(never_blocking_count == 1);
+
+ executor_type ex5 = asio::prefer(ex4, execution::blocking.possibly);
+
+ ex5.execute(&do_nothing);
+ ASIO_CHECK(possibly_blocking_count == 3);
+ ASIO_CHECK(never_blocking_count == 2);
+
+ executor_type ex6 = asio::prefer(ex4, execution::blocking.never);
+
+ ex6.execute(&do_nothing);
+ ASIO_CHECK(possibly_blocking_count == 3);
+ ASIO_CHECK(never_blocking_count == 3);
+
+ executor_type ex7 = either_blocking_executor(execution::blocking.possibly);
+
+ ex7.execute(&do_nothing);
+ ASIO_CHECK(possibly_blocking_count == 4);
+ ASIO_CHECK(never_blocking_count == 3);
+
+ executor_type ex8 = asio::prefer(ex7, execution::blocking.possibly);
+
+ ex8.execute(&do_nothing);
+ ASIO_CHECK(possibly_blocking_count == 5);
+ ASIO_CHECK(never_blocking_count == 3);
+
+ executor_type ex9 = asio::prefer(ex7, execution::blocking.never);
+
+ ex9.execute(&do_nothing);
+ ASIO_CHECK(possibly_blocking_count == 5);
+ ASIO_CHECK(never_blocking_count == 4);
+
+ executor_type ex10 = either_blocking_executor(execution::blocking.never);
+
+ ex10.execute(&do_nothing);
+ ASIO_CHECK(possibly_blocking_count == 5);
+ ASIO_CHECK(never_blocking_count == 5);
+
+ executor_type ex11 = asio::prefer(ex7, execution::blocking.possibly);
+
+ ex11.execute(&do_nothing);
+ ASIO_CHECK(possibly_blocking_count == 6);
+ ASIO_CHECK(never_blocking_count == 5);
+
+ executor_type ex12 = asio::prefer(ex7, execution::blocking.never);
+
+ ex12.execute(&do_nothing);
+ ASIO_CHECK(possibly_blocking_count == 6);
+ ASIO_CHECK(never_blocking_count == 6);
+}
+
+ASIO_TEST_SUITE
+(
+ "prefer_only",
+ ASIO_TEST_CASE(prefer_only_executor_query_test)
+ ASIO_TEST_CASE(prefer_only_executor_execute_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/execution/relationship.cpp b/3rdparty/asio/src/tests/unit/execution/relationship.cpp
new file mode 100644
index 00000000000..a91144e8125
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/execution/relationship.cpp
@@ -0,0 +1,1252 @@
+//
+// relationship.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/execution/relationship.hpp"
+
+#include "asio/prefer.hpp"
+#include "asio/query.hpp"
+#include "asio/require.hpp"
+#include "../unit_test.hpp"
+
+namespace exec = asio::execution;
+
+typedef exec::relationship_t s;
+typedef exec::relationship_t::fork_t n1;
+typedef exec::relationship_t::continuation_t n2;
+
+struct ex_nq_nr
+{
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_nq_nr&, const ex_nq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_nq_nr&, const ex_nq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <>
+struct is_executor<ex_nq_nr> : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_cq_nr
+{
+ static constexpr ResultType query(ParamType) noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_cq_nr&, const ex_cq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_cq_nr&, const ex_cq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename ResultType, typename ParamType, typename Result>
+struct is_executor<ex_cq_nr<ResultType, ParamType, Result> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_static_constexpr_member<
+ ex_cq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef Result result_type; // Must return raw result type.
+
+ static constexpr result_type value()
+ {
+ return Result();
+ }
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_STATIC_CONSTEXPR_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_mq_nr
+{
+ ResultType query(ParamType) const noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_nr&, const ex_mq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_nr&, const ex_mq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename ResultType, typename ParamType, typename Result>
+struct is_executor<ex_mq_nr<ResultType, ParamType, Result> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_member<
+ ex_mq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ResultType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename ResultType, typename ParamType, typename Result>
+struct ex_fq_nr
+{
+ friend ResultType query(const ex_fq_nr&, ParamType) noexcept
+ {
+ return Result();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_nr&, const ex_fq_nr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_nr&, const ex_fq_nr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename ResultType, typename ParamType, typename Result>
+struct is_executor<ex_fq_nr<ResultType, ParamType, Result> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename ResultType, typename ParamType,
+ typename Result, typename Param>
+struct query_free<
+ ex_fq_nr<ResultType, ParamType, Result>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, ParamType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ResultType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename CurrentType, typename OtherType>
+struct ex_mq_mr
+{
+ CurrentType query(CurrentType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ CurrentType query(OtherType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ ex_mq_mr<CurrentType, OtherType> require(
+ CurrentType) const noexcept
+ {
+ return ex_mq_mr<CurrentType, OtherType>();
+ }
+
+ ex_mq_mr<OtherType, CurrentType> require(
+ OtherType) const noexcept
+ {
+ return ex_mq_mr<OtherType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return false;
+ }
+};
+
+template <typename CurrentType>
+struct ex_mq_mr<CurrentType, CurrentType>
+{
+ CurrentType query(CurrentType) const noexcept
+ {
+ return CurrentType();
+ }
+
+ ex_mq_mr<CurrentType, CurrentType> require(
+ CurrentType) const noexcept
+ {
+ return ex_mq_mr<CurrentType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_mq_mr&, const ex_mq_mr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename CurrentType, typename OtherType>
+struct is_executor<ex_mq_mr<CurrentType, OtherType> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct query_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ || asio::is_convertible<Param, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef CurrentType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_mq_mr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_member<
+ ex_mq_mr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_mq_mr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename CurrentType, typename OtherType>
+struct ex_fq_fr
+{
+ friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend CurrentType query(const ex_fq_fr&, OtherType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend ex_fq_fr<CurrentType, OtherType> require(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, OtherType>();
+ }
+
+ friend ex_fq_fr<OtherType, CurrentType> require(
+ const ex_fq_fr&, OtherType) noexcept
+ {
+ return ex_fq_fr<OtherType, CurrentType>();
+ }
+
+ friend ex_fq_fr<CurrentType, OtherType> prefer(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, OtherType>();
+ }
+
+ friend ex_fq_fr<OtherType, CurrentType> prefer(
+ const ex_fq_fr&, OtherType) noexcept
+ {
+ return ex_fq_fr<OtherType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return false;
+ }
+};
+
+template <typename CurrentType>
+struct ex_fq_fr<CurrentType, CurrentType>
+{
+ friend CurrentType query(const ex_fq_fr&, CurrentType) noexcept
+ {
+ return CurrentType();
+ }
+
+ friend ex_fq_fr<CurrentType, CurrentType> require(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, CurrentType>();
+ }
+
+ friend ex_fq_fr<CurrentType, CurrentType> prefer(
+ const ex_fq_fr&, CurrentType) noexcept
+ {
+ return ex_fq_fr<CurrentType, CurrentType>();
+ }
+
+ template <typename F>
+ void execute(const F&) const
+ {
+ }
+
+ friend bool operator==(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return true;
+ }
+
+ friend bool operator!=(const ex_fq_fr&, const ex_fq_fr&) noexcept
+ {
+ return false;
+ }
+};
+
+#if !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace execution {
+
+template <typename CurrentType, typename OtherType>
+struct is_executor<ex_fq_fr<CurrentType, OtherType> >
+ : asio::true_type
+{
+};
+
+} // namespace execution
+} // namespace asio
+
+#endif // !defined(ASIO_HAS_DEDUCED_EXECUTION_IS_EXECUTOR_TRAIT)
+
+namespace asio {
+namespace traits {
+
+#if !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct query_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ || asio::is_convertible<Param, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef CurrentType result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_QUERY_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct require_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_FREE_TRAIT)
+
+#if !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct prefer_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, CurrentType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<CurrentType, OtherType> result_type;
+};
+
+template <typename CurrentType, typename OtherType, typename Param>
+struct prefer_free<
+ ex_fq_fr<CurrentType, OtherType>, Param,
+ typename asio::enable_if<
+ asio::is_convertible<Param, OtherType>::value
+ && !asio::is_same<CurrentType, OtherType>::value
+ >::type>
+{
+ static constexpr bool is_valid = true;
+ static constexpr bool is_noexcept = true;
+
+ typedef ex_fq_fr<OtherType, CurrentType> result_type;
+};
+
+#endif // !defined(ASIO_HAS_DEDUCED_PREFER_FREE_TRAIT)
+
+} // namespace traits
+} // namespace asio
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_query()
+{
+ constexpr bool b1 =
+ asio::can_query<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_query<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_query<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_query<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_query()
+{
+ exec::relationship_t result1 = asio::query(Executor(), Param());
+ ASIO_CHECK(result1 == ExpectedResult());
+
+ Executor ex1 = {};
+ exec::relationship_t result2 = asio::query(ex1, Param());
+ ASIO_CHECK(result2 == ExpectedResult());
+
+ const Executor ex2 = {};
+ exec::relationship_t result3 = asio::query(ex2, Param());
+ ASIO_CHECK(result3 == ExpectedResult());
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_constexpr_query()
+{
+ constexpr Executor ex1 = {};
+ constexpr exec::relationship_t result1 = asio::query(ex1, Param());
+ ASIO_CHECK(result1 == ExpectedResult());
+}
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_require()
+{
+ constexpr bool b1 =
+ asio::can_require<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_require<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_require<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_require<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_require()
+{
+ ASIO_CHECK(
+ asio::query(
+ asio::require(Executor(), Param()),
+ Param()) == ExpectedResult());
+
+ Executor ex1 = {};
+ ASIO_CHECK(
+ asio::query(
+ asio::require(ex1, Param()),
+ Param()) == ExpectedResult());
+
+ const Executor ex2 = {};
+ ASIO_CHECK(
+ asio::query(
+ asio::require(ex2, Param()),
+ Param()) == ExpectedResult());
+}
+
+template <typename Executor, typename Param, bool ExpectedResult>
+void test_can_prefer()
+{
+ constexpr bool b1 =
+ asio::can_prefer<Executor, Param>::value;
+ ASIO_CHECK(b1 == ExpectedResult);
+
+ constexpr bool b2 =
+ asio::can_prefer<const Executor, Param>::value;
+ ASIO_CHECK(b2 == ExpectedResult);
+
+ constexpr bool b3 =
+ asio::can_prefer<Executor&, Param>::value;
+ ASIO_CHECK(b3 == ExpectedResult);
+
+ constexpr bool b4 =
+ asio::can_prefer<const Executor&, Param>::value;
+ ASIO_CHECK(b4 == ExpectedResult);
+}
+
+template <typename Executor, typename Param, typename ExpectedResult>
+void test_prefer()
+{
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(Executor(), Param()),
+ s())) == s(ExpectedResult()));
+
+ Executor ex1 = {};
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(ex1, Param()),
+ s())) == s(ExpectedResult()));
+
+ const Executor ex2 = {};
+ ASIO_CHECK(
+ s(asio::query(
+ asio::prefer(ex2, Param()),
+ s())) == s(ExpectedResult()));
+}
+
+void test_vars()
+{
+ ASIO_CHECK(s() == exec::relationship);
+ ASIO_CHECK(s() != exec::relationship.fork);
+ ASIO_CHECK(s() != exec::relationship.continuation);
+ ASIO_CHECK(n1() == exec::relationship.fork);
+ ASIO_CHECK(n1() != exec::relationship.continuation);
+ ASIO_CHECK(n2() == exec::relationship.continuation);
+ ASIO_CHECK(n2() != exec::relationship.fork);
+}
+
+ASIO_TEST_SUITE
+(
+ "relationship",
+
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, s, true>)
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_query<ex_nq_nr, n2, false>)
+
+ ASIO_TEST_CASE3(test_query<ex_nq_nr, s, n1>)
+ ASIO_TEST_CASE3(test_query<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, s, n1>)
+ ASIO_TEST_CASE3(test_constexpr_query<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, s, false>)
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_require<ex_nq_nr, n2, false>)
+
+ ASIO_TEST_CASE3(test_require<ex_nq_nr, n1, n1>)
+
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, s, false>)
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n1, true>)
+ ASIO_TEST_CASE3(test_can_prefer<ex_nq_nr, n2, true>)
+
+ ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n1, n1>)
+ ASIO_TEST_CASE3(test_prefer<ex_nq_nr, n2, n1>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_cq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_cq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_constexpr_query<ex_cq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_cq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_require<ex_cq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n1, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_cq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n1, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_cq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_mq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_mq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_mq_nr<n2, s, n2>, n2, false>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n1, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_mq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n1, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_mq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, s, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_query<ex_fq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, s, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, s, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_query<ex_fq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, s, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n1, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<s, n2, n2>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n1, s, n1>, n2, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n1, false>)
+ ASIO_TEST_CASE5(test_can_require<ex_fq_nr<n2, s, n2>, n2, false>)
+
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, s, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n1, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<s, n2, n2>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n1, s, n1>, n2, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, s, false>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n1, true>)
+ ASIO_TEST_CASE5(test_can_prefer<ex_fq_nr<n2, s, n2>, n2, true>)
+
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, s, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n1, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<s, n2, n2>, n2, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n1, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n1, s, n1>, n2, n1>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n1, n2>)
+ ASIO_TEST_CASE5(test_prefer<ex_fq_nr<n2, s, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_mq_mr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_mq_mr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_mq_mr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_mq_mr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_mq_mr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n1>, n2, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n1, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_mq_mr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, s, true>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_query<ex_fq_fr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, s, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, s, n2>)
+ ASIO_TEST_CASE4(test_query<ex_fq_fr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n1>, n2, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n1, false>)
+ ASIO_TEST_CASE4(test_can_require<ex_fq_fr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_require<ex_fq_fr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n1, n2>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n1>, n2, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, s, false>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n1, true>)
+ ASIO_TEST_CASE4(test_can_prefer<ex_fq_fr<n2, n2>, n2, true>)
+
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n1>, n2, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n1, n2>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n1, n1>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n1>, n2, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n1, n2>)
+ ASIO_TEST_CASE4(test_prefer<ex_fq_fr<n2, n2>, n2, n2>)
+
+ ASIO_TEST_CASE(test_vars)
+)
diff --git a/3rdparty/asio/src/tests/unit/execution_context.cpp b/3rdparty/asio/src/tests/unit/execution_context.cpp
new file mode 100644
index 00000000000..cf5a499e256
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/execution_context.cpp
@@ -0,0 +1,25 @@
+//
+// execution_context.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/execution_context.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "execution_context",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/executor.cpp b/3rdparty/asio/src/tests/unit/executor.cpp
new file mode 100644
index 00000000000..7ea75055aa4
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/executor.cpp
@@ -0,0 +1,25 @@
+//
+// executor.cpp
+// ~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/executor.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "executor",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/executor_work_guard.cpp b/3rdparty/asio/src/tests/unit/executor_work_guard.cpp
new file mode 100644
index 00000000000..5d7aecd5c7c
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/executor_work_guard.cpp
@@ -0,0 +1,25 @@
+//
+// executor_work_guard.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/executor_work_guard.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "executor_work_guard",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/awaitable_operators.cpp b/3rdparty/asio/src/tests/unit/experimental/awaitable_operators.cpp
new file mode 100644
index 00000000000..e79eeae3eea
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/awaitable_operators.cpp
@@ -0,0 +1,297 @@
+//
+// experimental/awaitable_operators.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Prevent link dependency on the Boost.System library.
+#if !defined(BOOST_SYSTEM_NO_DEPRECATED)
+#define BOOST_SYSTEM_NO_DEPRECATED
+#endif // !defined(BOOST_SYSTEM_NO_DEPRECATED)
+
+// Test that header file is self-contained.
+#include "asio/experimental/awaitable_operators.hpp"
+
+#include "asio/co_spawn.hpp"
+#include "asio/detached.hpp"
+#include "asio/io_context.hpp"
+#include "asio/post.hpp"
+#include "../unit_test.hpp"
+
+using asio::awaitable;
+using namespace asio::experimental::awaitable_operators;
+
+struct move_only
+{
+ move_only(int i) : value(i) {}
+ move_only(const move_only&) = delete;
+ move_only(move_only&&) {}
+ move_only& operator=(const move_only&) = delete;
+ move_only& operator=(move_only&&) { return *this; }
+ int value;
+};
+
+awaitable<void> void_ok()
+{
+ co_return;
+}
+
+awaitable<void> void_ex()
+{
+ throw std::runtime_error("exception");
+ co_return;
+}
+
+awaitable<void> void_post_loop()
+{
+ for (;;)
+ co_await asio::post(asio::use_awaitable);
+}
+
+awaitable<int> int_0()
+{
+ co_return 0;
+}
+
+awaitable<int> int_1()
+{
+ co_return 1;
+}
+
+awaitable<int> int_2()
+{
+ co_return 2;
+}
+
+awaitable<int> int_ex()
+{
+ throw std::runtime_error("exception");
+ co_return -1;
+}
+
+awaitable<move_only> move_only_0()
+{
+ co_return move_only(0);
+}
+
+awaitable<move_only> move_only_1()
+{
+ co_return move_only(1);
+}
+
+awaitable<move_only> move_only_2()
+{
+ co_return move_only(2);
+}
+
+awaitable<move_only> move_only_ex()
+{
+ throw std::runtime_error("exception");
+ co_return move_only(-1);
+}
+
+awaitable<void> do_test_and_awaitable_operator()
+{
+ int i;
+ std::tuple<int, int> ii;
+ std::tuple<int, int, int> iii;
+
+ co_await (void_ok() && void_ok());
+ co_await (void_ok() && void_ok() && void_ok());
+ try { co_await (void_ex() && void_ok()); } catch (...) {}
+ try { co_await (void_ex() && void_ok() && void_ok()); } catch (...) {}
+ try { co_await (void_ex() && void_post_loop()); } catch (...) {}
+ try { co_await (void_ex() && void_ok() && void_post_loop()); } catch (...) {}
+
+ i = co_await (void_ok() && int_0());
+ ASIO_CHECK(i == 0);
+
+ i = co_await (void_ok() && int_1());
+ ASIO_CHECK(i == 1);
+
+ i = co_await (int_0() && void_ok());
+ ASIO_CHECK(i == 0);
+
+ ii = co_await (int_0() && int_1());
+ ASIO_CHECK(std::get<0>(ii) == 0);
+ ASIO_CHECK(std::get<1>(ii) == 1);
+
+ i = co_await (void_ok() && void_ok() && int_0());
+ ASIO_CHECK(i == 0);
+
+ i = co_await (void_ok() && int_0() && void_ok());
+ ASIO_CHECK(i == 0);
+
+ ii = co_await (void_ok() && int_0() && int_1());
+ ASIO_CHECK(std::get<0>(ii) == 0);
+ ASIO_CHECK(std::get<1>(ii) == 1);
+
+ ii = co_await (int_0() && void_ok() && int_1());
+ ASIO_CHECK(std::get<0>(ii) == 0);
+ ASIO_CHECK(std::get<1>(ii) == 1);
+
+ iii = co_await (int_0() && int_1() && int_2());
+ ASIO_CHECK(std::get<0>(iii) == 0);
+ ASIO_CHECK(std::get<1>(iii) == 1);
+ ASIO_CHECK(std::get<2>(iii) == 2);
+}
+
+void test_and_awaitable_operator()
+{
+ asio::io_context ctx;
+ co_spawn(ctx, do_test_and_awaitable_operator(), asio::detached);
+ ctx.run();
+}
+
+awaitable<void> do_test_or_awaitable_operator()
+{
+ std::variant<int, int> ii;
+ std::variant<int, std::monostate> iv;
+ std::variant<std::monostate, int> vi;
+ std::variant<std::monostate, std::monostate> vv;
+ std::variant<int, int, int> iii;
+ std::variant<int, int, std::monostate> iiv;
+ std::variant<int, std::monostate, int> ivi;
+ std::variant<int, std::monostate, std::monostate> ivv;
+ std::variant<std::monostate, int, int> vii;
+ std::variant<std::monostate, int, std::monostate> viv;
+ std::variant<std::monostate, std::monostate, int> vvi;
+ std::variant<std::monostate, std::monostate, std::monostate> vvv;
+
+ vv = co_await (void_ok() || void_ok());
+ ASIO_CHECK(vv.index() == 0);
+
+ vv = co_await (void_ex() || void_ok());
+ ASIO_CHECK(vv.index() == 1);
+
+ vi = co_await (void_ok() || int_0());
+ ASIO_CHECK(vi.index() == 0);
+
+ vi = co_await (void_ex() || int_0());
+ ASIO_CHECK(vi.index() == 1);
+
+ iv = co_await (int_0() || void_ex());
+ ASIO_CHECK(iv.index() == 0);
+ ASIO_CHECK(std::get<0>(iv) == 0);
+
+ ii = co_await (int_0() || int_1());
+ ASIO_CHECK(ii.index() == 0);
+ ASIO_CHECK(std::get<0>(ii) == 0);
+
+ ii = co_await (int_ex() || int_1());
+ ASIO_CHECK(ii.index() == 1);
+ ASIO_CHECK(std::get<1>(ii) == 1);
+
+ vvv = co_await (void_ok() || void_ok() || void_ok());
+ ASIO_CHECK(vvv.index() == 0);
+
+ vvv = co_await (void_ex() || void_ok() || void_ok());
+ ASIO_CHECK(vvv.index() == 1);
+
+ vvv = co_await (void_ex() || void_ex() || void_ok());
+ ASIO_CHECK(vvv.index() == 2);
+
+ vvi = co_await (void_ok() || void_ok() || int_0());
+ ASIO_CHECK(vvi.index() == 0);
+
+ viv = co_await (void_ok() || int_0() || void_ok());
+ ASIO_CHECK(viv.index() == 0);
+
+ viv = co_await (void_ex() || int_0() || void_ok());
+ ASIO_CHECK(viv.index() == 1);
+ ASIO_CHECK(std::get<1>(viv) == 0);
+
+ vii = co_await (void_ex() || int_0() || int_1());
+ ASIO_CHECK(vii.index() == 1);
+ ASIO_CHECK(std::get<1>(vii) == 0);
+
+ ivv = co_await (int_0() || void_ok() || void_ok());
+ ASIO_CHECK(ivv.index() == 0);
+ ASIO_CHECK(std::get<0>(ivv) == 0);
+
+ ivv = co_await (int_ex() || void_ok() || void_ok());
+ ASIO_CHECK(ivv.index() == 1);
+
+ ivi = co_await (int_0() || void_ok() || int_1());
+ ASIO_CHECK(ivi.index() == 0);
+ ASIO_CHECK(std::get<0>(ivi) == 0);
+
+ ivi = co_await (int_ex() || void_ok() || int_1());
+ ASIO_CHECK(ivi.index() == 1);
+
+ iiv = co_await (int_0() || int_1() || void_ok());
+ ASIO_CHECK(iiv.index() == 0);
+ ASIO_CHECK(std::get<0>(iiv) == 0);
+
+ iiv = co_await (int_ex() || int_1() || void_ok());
+ ASIO_CHECK(iiv.index() == 1);
+ ASIO_CHECK(std::get<0>(iiv) == 1);
+
+ iiv = co_await (int_ex() || int_ex() || void_ok());
+ ASIO_CHECK(iiv.index() == 2);
+
+ iii = co_await (int_0() || int_1() || int_2());
+ ASIO_CHECK(iii.index() == 0);
+ ASIO_CHECK(std::get<0>(iii) == 0);
+
+ iii = co_await (int_ex() || int_1() || int_2());
+ ASIO_CHECK(iii.index() == 1);
+ ASIO_CHECK(std::get<1>(iii) == 1);
+
+ iii = co_await (int_ex() || int_ex() || int_2());
+ ASIO_CHECK(iii.index() == 2);
+ ASIO_CHECK(std::get<2>(iii) == 2);
+
+ std::variant<move_only, int> mi = co_await (move_only_0() || int_1());
+ ASIO_CHECK(mi.index() == 0);
+ ASIO_CHECK(std::get<0>(mi).value == 0);
+
+ mi = co_await (move_only_ex() || int_1());
+ ASIO_CHECK(mi.index() == 1);
+ ASIO_CHECK(std::get<1>(mi) == 1);
+
+ std::variant<move_only, move_only> mm =
+ co_await (move_only_0() || move_only_1());
+ ASIO_CHECK(mm.index() == 0);
+ ASIO_CHECK(std::get<0>(mm).value == 0);
+
+ mm = co_await (move_only_ex() || move_only_1());
+ ASIO_CHECK(mm.index() == 1);
+ ASIO_CHECK(std::get<1>(mm).value == 1);
+
+ std::variant<move_only, move_only, move_only> mmm =
+ co_await (move_only_0() || move_only_1() || move_only_2());
+ ASIO_CHECK(mmm.index() == 0);
+ ASIO_CHECK(std::get<0>(mmm).value == 0);
+
+ mmm = co_await (move_only_ex() || move_only_1() || move_only_2());
+ ASIO_CHECK(mmm.index() == 1);
+ ASIO_CHECK(std::get<1>(mmm).value == 1);
+
+ mmm = co_await (move_only_ex() || move_only_ex() || move_only_2());
+ ASIO_CHECK(mmm.index() == 2);
+ ASIO_CHECK(std::get<2>(mmm).value == 2);
+}
+
+void test_or_awaitable_operator()
+{
+ asio::io_context ctx;
+ co_spawn(ctx, do_test_or_awaitable_operator(), asio::detached);
+ ctx.run();
+}
+
+ASIO_TEST_SUITE
+(
+ "experimental/awaitable_operators",
+ ASIO_TEST_CASE(test_and_awaitable_operator)
+ ASIO_TEST_CASE(test_or_awaitable_operator)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/basic_channel.cpp b/3rdparty/asio/src/tests/unit/experimental/basic_channel.cpp
new file mode 100644
index 00000000000..a277efeb27c
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/basic_channel.cpp
@@ -0,0 +1,25 @@
+//
+// experimental/basic_channel.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/basic_channel.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "experimental/basic_channel",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/basic_concurrent_channel.cpp b/3rdparty/asio/src/tests/unit/experimental/basic_concurrent_channel.cpp
new file mode 100644
index 00000000000..413d1870bd9
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/basic_concurrent_channel.cpp
@@ -0,0 +1,25 @@
+//
+// experimental/basic_concurrent_channel.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/basic_concurrent_channel.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "experimental/basic_concurrent_channel",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/channel.cpp b/3rdparty/asio/src/tests/unit/experimental/channel.cpp
new file mode 100644
index 00000000000..6c5b67fe570
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/channel.cpp
@@ -0,0 +1,888 @@
+//
+// experimental/channel.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/channel.hpp"
+
+#include <utility>
+#include "asio/any_completion_handler.hpp"
+#include "asio/bind_executor.hpp"
+#include "asio/bind_immediate_executor.hpp"
+#include "asio/error.hpp"
+#include "asio/io_context.hpp"
+#include "asio/system_executor.hpp"
+#include "../unit_test.hpp"
+
+using namespace asio;
+using namespace asio::experimental;
+
+void unbuffered_channel_test()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx);
+
+ ASIO_CHECK(ch1.is_open());
+ ASIO_CHECK(!ch1.ready());
+
+ bool b1 = ch1.try_send(asio::error::eof, "hello");
+
+ ASIO_CHECK(!b1);
+
+ std::string s1 = "abcdefghijklmnopqrstuvwxyz";
+ bool b2 = ch1.try_send(asio::error::eof, std::move(s1));
+
+ ASIO_CHECK(!b2);
+ ASIO_CHECK(!s1.empty());
+
+ asio::error_code ec1;
+ std::string s2;
+ ch1.async_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec1 = ec;
+ s2 = std::move(s);
+ });
+
+ bool b3 = ch1.try_send(asio::error::eof, std::move(s1));
+
+ ASIO_CHECK(b3);
+ ASIO_CHECK(s1.empty());
+
+ ctx.run();
+
+ ASIO_CHECK(ec1 == asio::error::eof);
+ ASIO_CHECK(s2 == "abcdefghijklmnopqrstuvwxyz");
+
+ bool b4 = ch1.try_receive([](asio::error_code, std::string){});
+
+ ASIO_CHECK(!b4);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s3 = "zyxwvutsrqponmlkjihgfedcba";
+ ch1.async_send(asio::error::eof, std::move(s3),
+ [&](asio::error_code ec)
+ {
+ ec2 = ec;
+ });
+
+ asio::error_code ec3;
+ std::string s4;
+ bool b5 = ch1.try_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec3 = ec;
+ s4 = s;
+ });
+
+ ASIO_CHECK(b5);
+ ASIO_CHECK(ec3 == asio::error::eof);
+ ASIO_CHECK(s4 == "zyxwvutsrqponmlkjihgfedcba");
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(!ec2);
+}
+
+void buffered_channel_test()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx, 1);
+
+ ASIO_CHECK(ch1.is_open());
+ ASIO_CHECK(!ch1.ready());
+
+ bool b1 = ch1.try_send(asio::error::eof, "hello");
+
+ ASIO_CHECK(b1);
+
+ std::string s1 = "abcdefghijklmnopqrstuvwxyz";
+ bool b2 = ch1.try_send(asio::error::eof, std::move(s1));
+
+ ASIO_CHECK(!b2);
+ ASIO_CHECK(!s1.empty());
+
+ asio::error_code ec1;
+ std::string s2;
+ ch1.async_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec1 = ec;
+ s2 = std::move(s);
+ });
+
+ ctx.run();
+
+ ASIO_CHECK(ec1 == asio::error::eof);
+ ASIO_CHECK(s2 == "hello");
+
+ bool b4 = ch1.try_receive([](asio::error_code, std::string){});
+
+ ASIO_CHECK(!b4);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s3 = "zyxwvutsrqponmlkjihgfedcba";
+ ch1.async_send(asio::error::eof, std::move(s3),
+ [&](asio::error_code ec)
+ {
+ ec2 = ec;
+ });
+
+ asio::error_code ec3;
+ std::string s4;
+ bool b5 = ch1.try_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec3 = ec;
+ s4 = s;
+ });
+
+ ASIO_CHECK(b5);
+ ASIO_CHECK(ec3 == asio::error::eof);
+ ASIO_CHECK(s4 == "zyxwvutsrqponmlkjihgfedcba");
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(!ec2);
+
+ bool b6 = ch1.try_send(asio::error_code(), "goodbye");
+
+ ASIO_CHECK(b6);
+
+ ch1.close();
+
+ asio::error_code ec4;
+ std::string s5;
+ ch1.async_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec4 = ec;
+ s5 = std::move(s);
+ });
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(!ec4);
+ ASIO_CHECK(s5 == "goodbye");
+
+ asio::error_code ec5;
+ std::string s6;
+ ch1.async_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec5 = ec;
+ s6 = std::move(s);
+ });
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(ec5 == asio::experimental::channel_errc::channel_closed);
+ ASIO_CHECK(s6.empty());
+}
+
+void buffered_error_channel_test()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code)> ch1(ctx, 1);
+
+ ASIO_CHECK(ch1.is_open());
+ ASIO_CHECK(!ch1.ready());
+
+ bool b1 = ch1.try_send(asio::error::eof);
+
+ ASIO_CHECK(b1);
+
+ bool b2 = ch1.try_send(asio::error::eof);
+
+ ASIO_CHECK(!b2);
+
+ asio::error_code ec1;
+ ch1.async_receive(
+ [&](asio::error_code ec)
+ {
+ ec1 = ec;
+ });
+
+ ctx.run();
+
+ ASIO_CHECK(ec1 == asio::error::eof);
+
+ bool b4 = ch1.try_receive([](asio::error_code){});
+
+ ASIO_CHECK(!b4);
+
+ asio::error_code ec2 = asio::error::would_block;
+ ch1.async_send(asio::error::eof,
+ [&](asio::error_code ec)
+ {
+ ec2 = ec;
+ });
+
+ asio::error_code ec3;
+ bool b5 = ch1.try_receive(
+ [&](asio::error_code ec)
+ {
+ ec3 = ec;
+ });
+
+ ASIO_CHECK(b5);
+ ASIO_CHECK(ec3 == asio::error::eof);
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(!ec2);
+}
+
+void unbuffered_non_immediate_receive()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1 = "0123456789";
+ ch1.async_send(asio::error::eof, std::move(s1),
+ [&](asio::error_code ec)
+ {
+ ec1 = ec;
+ });
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s2;
+ ch1.async_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec2 = ec;
+ s2 = std::move(s);
+ });
+
+ ASIO_CHECK(ec2 == asio::error::would_block);
+
+ ctx.run();
+
+ ASIO_CHECK(!ec1);
+ ASIO_CHECK(ec2 == asio::error::eof);
+ ASIO_CHECK(s2 == "0123456789");
+}
+
+void unbuffered_immediate_receive()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1 = "0123456789";
+ ch1.async_send(asio::error::eof, std::move(s1),
+ [&](asio::error_code ec)
+ {
+ ec1 = ec;
+ });
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s2;
+ ch1.async_receive(
+ bind_immediate_executor(system_executor(),
+ [&](asio::error_code ec, std::string s)
+ {
+ ec2 = ec;
+ s2 = std::move(s);
+ }));
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+ ASIO_CHECK(ec2 == asio::error::eof);
+ ASIO_CHECK(s2 == "0123456789");
+
+ ctx.run();
+
+ ASIO_CHECK(!ec1);
+}
+
+void unbuffered_executor_receive()
+{
+ io_context ctx;
+ io_context ctx2;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1 = "0123456789";
+ ch1.async_send(asio::error::eof, std::move(s1),
+ [&](asio::error_code ec)
+ {
+ ec1 = ec;
+ });
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s2;
+ ch1.async_receive(
+ bind_executor(ctx2,
+ [&](asio::error_code ec, std::string s)
+ {
+ ec2 = ec;
+ s2 = std::move(s);
+ }));
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+ ASIO_CHECK(ec2 == asio::error::would_block);
+
+ ctx.run();
+
+ ASIO_CHECK(!ec1);
+ ASIO_CHECK(ec2 == asio::error::would_block);
+
+ ctx2.run();
+
+ ASIO_CHECK(ec2 == asio::error::eof);
+ ASIO_CHECK(s2 == "0123456789");
+}
+
+void unbuffered_non_immediate_send()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1;
+ ch1.async_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec1 = ec;
+ s1 = std::move(s);
+ });
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s2 = "0123456789";
+ ch1.async_send(asio::error::eof, std::move(s2),
+ [&](asio::error_code ec)
+ {
+ ec2 = ec;
+ });
+
+ ASIO_CHECK(ec2 == asio::error::would_block);
+
+ ctx.run();
+
+ ASIO_CHECK(ec1 == asio::error::eof);
+ ASIO_CHECK(s1 == "0123456789");
+ ASIO_CHECK(!ec2);
+}
+
+void unbuffered_immediate_send()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1;
+ ch1.async_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec1 = ec;
+ s1 = std::move(s);
+ });
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s2 = "0123456789";
+ ch1.async_send(asio::error::eof, std::move(s2),
+ bind_immediate_executor(system_executor(),
+ [&](asio::error_code ec)
+ {
+ ec2 = ec;
+ }));
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+ ASIO_CHECK(!ec2);
+
+ ctx.run();
+
+ ASIO_CHECK(ec1 == asio::error::eof);
+ ASIO_CHECK(s1 == "0123456789");
+}
+
+void unbuffered_executor_send()
+{
+ io_context ctx;
+ io_context ctx2;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1;
+ ch1.async_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec1 = ec;
+ s1 = std::move(s);
+ });
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s2 = "0123456789";
+ ch1.async_send(asio::error::eof, std::move(s2),
+ bind_executor(ctx2,
+ [&](asio::error_code ec)
+ {
+ ec2 = ec;
+ }));
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+ ASIO_CHECK(ec2 == asio::error::would_block);
+
+ ctx.run();
+
+ ASIO_CHECK(ec1 == asio::error::eof);
+ ASIO_CHECK(s1 == "0123456789");
+ ASIO_CHECK(ec2 == asio::error::would_block);
+
+ ctx2.run();
+
+ ASIO_CHECK(!ec2);
+}
+
+void buffered_non_immediate_receive()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx, 1);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1 = "0123456789";
+ ch1.async_send(asio::error::eof, std::move(s1),
+ [&](asio::error_code ec)
+ {
+ ec1 = ec;
+ });
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ ctx.run();
+
+ ASIO_CHECK(!ec1);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s2;
+ ch1.async_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec2 = ec;
+ s2 = std::move(s);
+ });
+
+ ASIO_CHECK(ec2 == asio::error::would_block);
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(ec2 == asio::error::eof);
+ ASIO_CHECK(s2 == "0123456789");
+}
+
+void buffered_immediate_receive()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx, 1);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1 = "0123456789";
+ ch1.async_send(asio::error::eof, std::move(s1),
+ [&](asio::error_code ec)
+ {
+ ec1 = ec;
+ });
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ ctx.run();
+
+ ASIO_CHECK(!ec1);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s2;
+ ch1.async_receive(
+ bind_immediate_executor(system_executor(),
+ [&](asio::error_code ec, std::string s)
+ {
+ ec2 = ec;
+ s2 = std::move(s);
+ }));
+
+ ASIO_CHECK(ec2 == asio::error::eof);
+ ASIO_CHECK(s2 == "0123456789");
+
+ ctx.restart();
+ ctx.run();
+}
+
+void buffered_executor_receive()
+{
+ io_context ctx;
+ io_context ctx2;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx, 1);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1 = "0123456789";
+ ch1.async_send(asio::error::eof, std::move(s1),
+ [&](asio::error_code ec)
+ {
+ ec1 = ec;
+ });
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ ctx.run();
+
+ ASIO_CHECK(!ec1);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s2;
+ ch1.async_receive(
+ bind_executor(ctx2,
+ [&](asio::error_code ec, std::string s)
+ {
+ ec2 = ec;
+ s2 = std::move(s);
+ }));
+
+ ASIO_CHECK(ec2 == asio::error::would_block);
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(ec2 == asio::error::would_block);
+
+ ctx2.run();
+
+ ASIO_CHECK(ec2 == asio::error::eof);
+ ASIO_CHECK(s2 == "0123456789");
+}
+
+void buffered_non_immediate_send()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx, 1);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1 = "0123456789";
+ ch1.async_send(asio::error::eof, std::move(s1),
+ [&](asio::error_code ec)
+ {
+ ec1 = ec;
+ });
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ ctx.run();
+
+ ASIO_CHECK(!ec1);
+}
+
+void buffered_immediate_send()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx, 1);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1 = "0123456789";
+ ch1.async_send(asio::error::eof, std::move(s1),
+ bind_immediate_executor(system_executor(),
+ [&](asio::error_code ec)
+ {
+ ec1 = ec;
+ }));
+
+ ASIO_CHECK(!ec1);
+
+ ctx.run();
+}
+
+void buffered_executor_send()
+{
+ io_context ctx;
+ io_context ctx2;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx, 1);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1 = "0123456789";
+ ch1.async_send(asio::error::eof, std::move(s1),
+ bind_executor(ctx2,
+ [&](asio::error_code ec)
+ {
+ ec1 = ec;
+ }));
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ ctx.run();
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ ctx2.run();
+
+ ASIO_CHECK(!ec1);
+}
+
+void try_send_via_dispatch()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1;
+ ch1.async_receive(
+ bind_executor(asio::system_executor(),
+ [&](asio::error_code ec, std::string s)
+ {
+ ec1 = ec;
+ s1 = std::move(s);
+ }));
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ ctx.poll();
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ std::string s2 = "0123456789";
+ ch1.try_send_via_dispatch(asio::error::eof, std::move(s2));
+
+ ASIO_CHECK(ec1 == asio::error::eof);
+ ASIO_CHECK(s1 == "0123456789");
+ ASIO_CHECK(s2.empty());
+}
+
+void try_send_n_via_dispatch()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1;
+ ch1.async_receive(
+ bind_executor(asio::system_executor(),
+ [&](asio::error_code ec, std::string s)
+ {
+ ec1 = ec;
+ s1 = std::move(s);
+ }));
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s2;
+ ch1.async_receive(
+ bind_executor(asio::system_executor(),
+ [&](asio::error_code ec, std::string s)
+ {
+ ec2 = ec;
+ s2 = std::move(s);
+ }));
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ ctx.poll();
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+ ASIO_CHECK(ec2 == asio::error::would_block);
+
+ std::string s3 = "0123456789";
+ ch1.try_send_n_via_dispatch(2, asio::error::eof, std::move(s3));
+
+ ASIO_CHECK(ec1 == asio::error::eof);
+ ASIO_CHECK(s1 == "0123456789");
+ ASIO_CHECK(ec2 == asio::error::eof);
+ ASIO_CHECK(s2 == "0123456789");
+ ASIO_CHECK(s3.empty());
+}
+
+struct multi_signature_handler
+{
+ std::string* s_;
+ asio::error_code* ec_;
+
+ void operator()(std::string s)
+ {
+ *s_ = s;
+ }
+
+ void operator()(asio::error_code ec)
+ {
+ *ec_ = ec;
+ }
+};
+
+void implicit_error_signature_channel_test()
+{
+ io_context ctx;
+
+ channel<void(std::string)> ch1(ctx);
+
+ ASIO_CHECK(ch1.is_open());
+ ASIO_CHECK(!ch1.ready());
+
+ bool b1 = ch1.try_send("hello");
+
+ ASIO_CHECK(!b1);
+
+ std::string s1 = "abcdefghijklmnopqrstuvwxyz";
+ bool b2 = ch1.try_send(std::move(s1));
+
+ ASIO_CHECK(!b2);
+ ASIO_CHECK(!s1.empty());
+
+ std::string s2;
+ asio::error_code ec1 = asio::error::would_block;
+ multi_signature_handler h1 = {&s2, &ec1};
+ ch1.async_receive(h1);
+
+ bool b3 = ch1.try_send(std::move(s1));
+
+ ASIO_CHECK(b3);
+ ASIO_CHECK(s1.empty());
+
+ ctx.run();
+
+ ASIO_CHECK(s2 == "abcdefghijklmnopqrstuvwxyz");
+ ASIO_CHECK(ec1 == asio::error::would_block);
+
+ std::string s3;
+ asio::error_code ec2;
+ multi_signature_handler h2 = {&s3, &ec2};
+ bool b4 = ch1.try_receive(h2);
+
+ ASIO_CHECK(!b4);
+
+ std::string s4 = "zyxwvutsrqponmlkjihgfedcba";
+ asio::error_code ec3;
+ ch1.async_send(std::move(s4),
+ [&](asio::error_code ec)
+ {
+ ec3 = ec;
+ });
+
+ std::string s5;
+ asio::error_code ec4 = asio::error::would_block;
+ multi_signature_handler h3 = {&s5, &ec4};
+ bool b5 = ch1.try_receive(h3);
+
+ ASIO_CHECK(b5);
+ ASIO_CHECK(ec4 == asio::error::would_block);
+ ASIO_CHECK(s5 == "zyxwvutsrqponmlkjihgfedcba");
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(!ec3);
+
+ std::string s6;
+ asio::error_code ec5 = asio::error::would_block;
+ multi_signature_handler h4 = {&s6, &ec5};
+ ch1.async_receive(h4);
+
+ ch1.close();
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(s6.empty());
+ ASIO_CHECK(ec5 == asio::experimental::channel_errc::channel_closed);
+}
+
+void channel_with_any_completion_handler_test()
+{
+ io_context ctx;
+
+ channel<void(asio::error_code, std::string)> ch1(ctx);
+
+ asio::error_code ec1 = asio::error::would_block;
+ std::string s1;
+ ch1.async_receive(
+ asio::any_completion_handler<
+ void(asio::error_code, std::string)>(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec1 = ec;
+ s1 = std::move(s);
+ }));
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s2 = "zyxwvutsrqponmlkjihgfedcba";
+ ch1.async_send(asio::error::eof, std::move(s2),
+ asio::any_completion_handler<void(asio::error_code)>(
+ [&](asio::error_code ec)
+ {
+ ec2 = ec;
+ }));
+
+ ASIO_CHECK(ec1 == asio::error::would_block);
+ ASIO_CHECK(ec2 == asio::error::would_block);
+
+ ctx.run();
+
+ ASIO_CHECK(ec1 == asio::error::eof);
+ ASIO_CHECK(s1 == "zyxwvutsrqponmlkjihgfedcba");
+ ASIO_CHECK(!ec2);
+}
+
+ASIO_TEST_SUITE
+(
+ "experimental/channel",
+ ASIO_TEST_CASE(unbuffered_channel_test)
+ ASIO_TEST_CASE(buffered_channel_test)
+ ASIO_TEST_CASE(buffered_error_channel_test)
+ ASIO_TEST_CASE(unbuffered_non_immediate_receive)
+ ASIO_TEST_CASE(unbuffered_immediate_receive)
+ ASIO_TEST_CASE(unbuffered_executor_receive)
+ ASIO_TEST_CASE(unbuffered_non_immediate_send)
+ ASIO_TEST_CASE(unbuffered_immediate_send)
+ ASIO_TEST_CASE(unbuffered_executor_send)
+ ASIO_TEST_CASE(buffered_non_immediate_receive)
+ ASIO_TEST_CASE(buffered_immediate_receive)
+ ASIO_TEST_CASE(buffered_executor_receive)
+ ASIO_TEST_CASE(buffered_non_immediate_send)
+ ASIO_TEST_CASE(buffered_immediate_send)
+ ASIO_TEST_CASE(buffered_executor_send)
+ ASIO_TEST_CASE(try_send_via_dispatch)
+ ASIO_TEST_CASE(try_send_n_via_dispatch)
+ ASIO_TEST_CASE(implicit_error_signature_channel_test)
+ ASIO_TEST_CASE(channel_with_any_completion_handler_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/channel_traits.cpp b/3rdparty/asio/src/tests/unit/experimental/channel_traits.cpp
new file mode 100644
index 00000000000..b1c326f874d
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/channel_traits.cpp
@@ -0,0 +1,25 @@
+//
+// experimental/channel_traits.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/channel_traits.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "experimental/channel_traits",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/co_composed.cpp b/3rdparty/asio/src/tests/unit/experimental/co_composed.cpp
new file mode 100644
index 00000000000..755cd46d788
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/co_composed.cpp
@@ -0,0 +1,518 @@
+//
+// experimental/co_composed.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Prevent link dependency on the Boost.System library.
+#if !defined(BOOST_SYSTEM_NO_DEPRECATED)
+#define BOOST_SYSTEM_NO_DEPRECATED
+#endif // !defined(BOOST_SYSTEM_NO_DEPRECATED)
+
+// Test that header file is self-contained.
+#include "asio/experimental/co_composed.hpp"
+
+#include "asio/bind_cancellation_slot.hpp"
+#include "asio/deferred.hpp"
+#include "asio/detached.hpp"
+#include "asio/io_context.hpp"
+#include "asio/post.hpp"
+#include "../unit_test.hpp"
+
+template <typename CompletionToken>
+auto async_throw(CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void()>(
+ [](auto) { throw 42; }, token);
+}
+
+template <typename CompletionToken>
+auto throw_first(CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void()>(
+ asio::experimental::co_composed(
+ [](auto state) -> void
+ {
+ throw 42;
+ co_yield state.complete();
+ }), token);
+}
+
+void test_throw_first()
+{
+ try
+ {
+ throw_first(asio::detached);
+ ASIO_CHECK(0);
+ }
+ catch (int)
+ {
+ }
+}
+
+template <typename CompletionToken>
+auto throw_after_await(asio::io_context& ctx, CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void()>(
+ asio::experimental::co_composed(
+ [](auto state, asio::io_context& ctx) -> void
+ {
+ co_await asio::post(ctx, asio::deferred);
+ throw 42;
+ co_yield state.complete();
+ }), token, std::ref(ctx));
+}
+
+void test_throw_after_await()
+{
+ try
+ {
+ asio::io_context ctx(1);
+ throw_after_await(ctx, asio::detached);
+ ctx.run();
+ ASIO_CHECK(0);
+ }
+ catch (int)
+ {
+ }
+}
+
+template <typename CompletionToken>
+auto throw_in_first_suspend(CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void()>(
+ asio::experimental::co_composed(
+ [](auto state) -> void
+ {
+ co_await async_throw(asio::deferred);
+ co_yield state.complete();
+ }), token);
+}
+
+void test_throw_in_first_suspend()
+{
+ try
+ {
+ throw_in_first_suspend(asio::detached);
+ ASIO_CHECK(0);
+ }
+ catch (int)
+ {
+ }
+}
+
+template <typename CompletionToken>
+auto throw_in_suspend_after_await(
+ asio::io_context& ctx, CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void()>(
+ asio::experimental::co_composed(
+ [](auto state, asio::io_context& ctx) -> void
+ {
+ co_await asio::post(ctx, asio::deferred);
+ co_await async_throw(asio::deferred);
+ co_yield state.complete();
+ }), token, std::ref(ctx));
+}
+
+void test_throw_in_suspend_after_await()
+{
+ try
+ {
+ asio::io_context ctx(1);
+ throw_in_suspend_after_await(ctx, asio::detached);
+ ctx.run();
+ ASIO_CHECK(0);
+ }
+ catch (int)
+ {
+ }
+}
+
+template <typename CompletionToken>
+auto post_loop(asio::io_context& ctx, CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void(int)>(
+ asio::experimental::co_composed(
+ [](auto state, asio::io_context& ctx) -> void
+ {
+ int i = 0;
+ for (; i < 100; ++i)
+ co_await asio::post(ctx, asio::deferred);
+ co_yield state.complete(i);
+ }, ctx), token, std::ref(ctx));
+}
+
+void test_post_loop()
+{
+ asio::io_context ctx(1);
+ int count = 0;
+ post_loop(ctx, [&](int i){ count = i; });
+ ctx.run();
+ ASIO_CHECK(count == 100);
+}
+
+template <typename CompletionToken>
+auto nested_post(asio::io_context& ctx, CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void()>(
+ asio::experimental::co_composed(
+ [](auto state, asio::io_context& ctx) -> void
+ {
+ co_await asio::post(ctx, asio::deferred);
+ co_yield state.complete();
+ }, ctx), token, std::ref(ctx));
+}
+
+template <typename CompletionToken>
+auto nested_post_loop(asio::io_context& ctx, CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void(int)>(
+ asio::experimental::co_composed(
+ [](auto state, asio::io_context& ctx) -> void
+ {
+ int i = 0;
+ for (; i < 100; ++i)
+ co_await nested_post(ctx, asio::deferred);
+ co_yield state.complete(i);
+ }, ctx), token, std::ref(ctx));
+}
+
+void test_nested_post_loop()
+{
+ asio::io_context ctx(1);
+ int count = 0;
+ nested_post_loop(ctx, [&](int i){ count = i; });
+ ctx.run();
+ ASIO_CHECK(count == 100);
+}
+
+template <typename CompletionToken>
+auto post_loop_return_1_0(asio::io_context& ctx, CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void()>(
+ asio::experimental::co_composed<void()>(
+ [](auto, asio::io_context& ctx) -> void
+ {
+ int i = 0;
+ for (; i < 100; ++i)
+ co_await asio::post(ctx, asio::deferred);
+ co_return {};
+ }, ctx), token, std::ref(ctx));
+}
+
+void test_post_loop_return_1_0()
+{
+ asio::io_context ctx(1);
+ bool done = false;
+ post_loop_return_1_0(ctx, [&]{ done = true; });
+ ctx.run();
+ ASIO_CHECK(done);
+}
+
+template <typename CompletionToken>
+auto post_loop_return_1_1(asio::io_context& ctx, CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void(int)>(
+ asio::experimental::co_composed<void(int)>(
+ [](auto, asio::io_context& ctx) -> void
+ {
+ int i = 0;
+ for (; i < 100; ++i)
+ co_await asio::post(ctx, asio::deferred);
+ co_return {i};
+ }, ctx), token, std::ref(ctx));
+}
+
+void test_post_loop_return_1_1()
+{
+ asio::io_context ctx(1);
+ int count = 0;
+ post_loop_return_1_1(ctx, [&](int i){ count = i; });
+ ctx.run();
+ ASIO_CHECK(count == 100);
+}
+
+template <typename CompletionToken>
+auto post_loop_return_1_2(asio::io_context& ctx, CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void(int, char)>(
+ asio::experimental::co_composed<void(int, char)>(
+ [](auto, asio::io_context& ctx) -> void
+ {
+ int i = 0;
+ for (; i < 100; ++i)
+ co_await asio::post(ctx, asio::deferred);
+ co_return {i, 'A'};
+ }, ctx), token, std::ref(ctx));
+}
+
+void test_post_loop_return_1_2()
+{
+ asio::io_context ctx(1);
+ int count = 0;
+ char ch = 0;
+ post_loop_return_1_2(ctx, [&](int i, char c){ count = i, ch = c; });
+ ctx.run();
+ ASIO_CHECK(count == 100);
+ ASIO_CHECK(ch == 'A');
+}
+
+template <typename CompletionToken>
+auto post_loop_return_2(asio::io_context& ctx, CompletionToken&& token)
+{
+ return asio::async_initiate<CompletionToken, void(), void(int)>(
+ asio::experimental::co_composed<void(), void(int)>(
+ [](auto, asio::io_context& ctx) -> void
+ {
+ int i = 0;
+ for (; i < 100; ++i)
+ co_await asio::post(ctx, asio::deferred);
+ co_return {i};
+ }, ctx), token, std::ref(ctx));
+}
+
+void test_post_loop_return_2()
+{
+ asio::io_context ctx(1);
+ int count = 0;
+ post_loop_return_2(ctx, [&](int i = 0){ count = i; });
+ ctx.run();
+ ASIO_CHECK(count == 100);
+}
+
+template <typename CompletionToken>
+auto complete_on_cancel(asio::io_context& ctx, CompletionToken&& token)
+{
+ return asio::async_initiate<
+ CompletionToken, void(asio::error_code, int)>(
+ asio::experimental::co_composed<
+ void(asio::error_code, int)>(
+ [](auto state, asio::io_context& ctx) -> void
+ {
+ state.on_cancellation_complete_with(
+ asio::error::invalid_argument, 42);
+ int i = 0;
+ for (; i < 100; ++i)
+ co_await asio::post(ctx, asio::deferred);
+ co_return {asio::error::eof, i};
+ }, ctx), token, std::ref(ctx));
+}
+
+void test_complete_on_cancel()
+{
+ asio::io_context ctx(1);
+ int count = 0;
+ asio::error_code ec;
+ asio::cancellation_signal cancel;
+
+ complete_on_cancel(ctx,
+ [&](asio::error_code e, int i)
+ {
+ ec = e;
+ count = i;
+ });
+
+ ctx.run();
+
+ ASIO_CHECK(ec == asio::error::eof);
+ ASIO_CHECK(count == 100);
+
+ complete_on_cancel(ctx,
+ asio::bind_cancellation_slot(cancel.slot(),
+ [&](asio::error_code e, int i)
+ {
+ ec = e;
+ count = i;
+ }));
+
+ ctx.restart();
+ ctx.run_one();
+ cancel.emit(asio::cancellation_type::all);
+ ctx.run();
+
+ ASIO_CHECK(ec == asio::error::invalid_argument);
+ ASIO_CHECK(count == 42);
+
+ complete_on_cancel(ctx,
+ asio::bind_cancellation_slot(cancel.slot(),
+ [&](asio::error_code e, int i)
+ {
+ ec = e;
+ count = i;
+ }));
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(ec == asio::error::eof);
+ ASIO_CHECK(count == 100);
+}
+
+template <typename CompletionToken>
+auto complete_with_default_on_cancel(
+ asio::io_context& ctx, CompletionToken&& token)
+{
+ return asio::async_initiate<
+ CompletionToken, void(asio::error_code, int)>(
+ asio::experimental::co_composed<
+ void(asio::error_code, int)>(
+ [](auto, asio::io_context& ctx) -> void
+ {
+ int i = 0;
+ for (; i < 100; ++i)
+ co_await asio::post(ctx, asio::deferred);
+ co_return {asio::error::eof, i};
+ }, ctx), token, std::ref(ctx));
+}
+
+void test_complete_with_default_on_cancel()
+{
+ asio::io_context ctx(1);
+ int count = 0;
+ asio::error_code ec;
+ asio::cancellation_signal cancel;
+
+ complete_with_default_on_cancel(ctx,
+ [&](asio::error_code e, int i)
+ {
+ ec = e;
+ count = i;
+ });
+
+ ctx.run();
+
+ ASIO_CHECK(ec == asio::error::eof);
+ ASIO_CHECK(count == 100);
+
+ complete_with_default_on_cancel(ctx,
+ asio::bind_cancellation_slot(cancel.slot(),
+ [&](asio::error_code e, int i)
+ {
+ ec = e;
+ count = i;
+ }));
+
+ ctx.restart();
+ ctx.run_one();
+ cancel.emit(asio::cancellation_type::all);
+ ctx.run();
+
+ ASIO_CHECK(ec == asio::error::operation_aborted);
+ ASIO_CHECK(count == 0);
+
+ complete_with_default_on_cancel(ctx,
+ asio::bind_cancellation_slot(cancel.slot(),
+ [&](asio::error_code e, int i)
+ {
+ ec = e;
+ count = i;
+ }));
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(ec == asio::error::eof);
+ ASIO_CHECK(count == 100);
+}
+
+template <typename CompletionToken>
+auto throw_on_cancel(asio::io_context& ctx, CompletionToken&& token)
+{
+ return asio::async_initiate<
+ CompletionToken, void(asio::error_code, int)>(
+ asio::experimental::co_composed<
+ void(asio::error_code, int)>(
+ [](auto state, asio::io_context& ctx) -> void
+ {
+ try
+ {
+ state.throw_if_cancelled(true);
+ int i = 0;
+ for (; i < 100; ++i)
+ co_await asio::post(ctx, asio::deferred);
+ co_return {asio::error::eof, i};
+ }
+ catch (...)
+ {
+ co_return {asio::error::invalid_argument, 42};
+ }
+ }, ctx), token, std::ref(ctx));
+}
+
+void test_throw_on_cancel()
+{
+ asio::io_context ctx(1);
+ int count = 0;
+ asio::error_code ec;
+ asio::cancellation_signal cancel;
+
+ throw_on_cancel(ctx,
+ [&](asio::error_code e, int i)
+ {
+ ec = e;
+ count = i;
+ });
+
+ ctx.run();
+
+ ASIO_CHECK(ec == asio::error::eof);
+ ASIO_CHECK(count == 100);
+
+ throw_on_cancel(ctx,
+ asio::bind_cancellation_slot(cancel.slot(),
+ [&](asio::error_code e, int i)
+ {
+ ec = e;
+ count = i;
+ }));
+
+ ctx.restart();
+ ctx.run_one();
+ cancel.emit(asio::cancellation_type::all);
+ ctx.run();
+
+ ASIO_CHECK(ec == asio::error::invalid_argument);
+ ASIO_CHECK(count == 42);
+
+ throw_on_cancel(ctx,
+ asio::bind_cancellation_slot(cancel.slot(),
+ [&](asio::error_code e, int i)
+ {
+ ec = e;
+ count = i;
+ }));
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(ec == asio::error::eof);
+ ASIO_CHECK(count == 100);
+}
+
+ASIO_TEST_SUITE
+(
+ "experimental/co_composed",
+ ASIO_TEST_CASE(test_throw_first)
+ ASIO_TEST_CASE(test_throw_after_await)
+ ASIO_TEST_CASE(test_throw_in_first_suspend)
+ ASIO_TEST_CASE(test_throw_in_suspend_after_await)
+ ASIO_TEST_CASE(test_post_loop)
+ ASIO_TEST_CASE(test_nested_post_loop)
+ ASIO_TEST_CASE(test_post_loop_return_1_0)
+ ASIO_TEST_CASE(test_post_loop_return_1_1)
+ ASIO_TEST_CASE(test_post_loop_return_1_2)
+ ASIO_TEST_CASE(test_post_loop_return_2)
+ ASIO_TEST_CASE(test_complete_on_cancel)
+ ASIO_TEST_CASE(test_complete_with_default_on_cancel)
+ ASIO_TEST_CASE(test_throw_on_cancel)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/concurrent_channel.cpp b/3rdparty/asio/src/tests/unit/experimental/concurrent_channel.cpp
new file mode 100644
index 00000000000..e64e9051638
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/concurrent_channel.cpp
@@ -0,0 +1,165 @@
+//
+// experimental/concurrent_channel.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/concurrent_channel.hpp"
+
+#include <utility>
+#include "asio/error.hpp"
+#include "asio/io_context.hpp"
+#include "../unit_test.hpp"
+
+using namespace asio;
+using namespace asio::experimental;
+
+void unbuffered_concurrent_channel_test()
+{
+ io_context ctx;
+
+ concurrent_channel<void(asio::error_code, std::string)> ch1(ctx);
+
+ ASIO_CHECK(ch1.is_open());
+ ASIO_CHECK(!ch1.ready());
+
+ bool b1 = ch1.try_send(asio::error::eof, "hello");
+
+ ASIO_CHECK(!b1);
+
+ std::string s1 = "abcdefghijklmnopqrstuvwxyz";
+ bool b2 = ch1.try_send(asio::error::eof, std::move(s1));
+
+ ASIO_CHECK(!b2);
+ ASIO_CHECK(!s1.empty());
+
+ asio::error_code ec1;
+ std::string s2;
+ ch1.async_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec1 = ec;
+ s2 = std::move(s);
+ });
+
+ bool b3 = ch1.try_send(asio::error::eof, std::move(s1));
+
+ ASIO_CHECK(b3);
+ ASIO_CHECK(s1.empty());
+
+ ctx.run();
+
+ ASIO_CHECK(ec1 == asio::error::eof);
+ ASIO_CHECK(s2 == "abcdefghijklmnopqrstuvwxyz");
+
+ bool b4 = ch1.try_receive([](asio::error_code, std::string){});
+
+ ASIO_CHECK(!b4);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s3 = "zyxwvutsrqponmlkjihgfedcba";
+ ch1.async_send(asio::error::eof, std::move(s3),
+ [&](asio::error_code ec)
+ {
+ ec2 = ec;
+ });
+
+ asio::error_code ec3;
+ std::string s4;
+ bool b5 = ch1.try_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec3 = ec;
+ s4 = s;
+ });
+
+ ASIO_CHECK(b5);
+ ASIO_CHECK(ec3 == asio::error::eof);
+ ASIO_CHECK(s4 == "zyxwvutsrqponmlkjihgfedcba");
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(!ec2);
+};
+
+void buffered_concurrent_channel_test()
+{
+ io_context ctx;
+
+ concurrent_channel<void(asio::error_code, std::string)> ch1(ctx, 1);
+
+ ASIO_CHECK(ch1.is_open());
+ ASIO_CHECK(!ch1.ready());
+
+ bool b1 = ch1.try_send(asio::error::eof, "hello");
+
+ ASIO_CHECK(b1);
+
+ std::string s1 = "abcdefghijklmnopqrstuvwxyz";
+ bool b2 = ch1.try_send(asio::error::eof, std::move(s1));
+
+ ASIO_CHECK(!b2);
+ ASIO_CHECK(!s1.empty());
+
+ asio::error_code ec1;
+ std::string s2;
+ ch1.async_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec1 = ec;
+ s2 = std::move(s);
+ });
+
+ ctx.run();
+
+ ASIO_CHECK(ec1 == asio::error::eof);
+ ASIO_CHECK(s2 == "hello");
+
+ bool b4 = ch1.try_receive([](asio::error_code, std::string){});
+
+ ASIO_CHECK(!b4);
+
+ asio::error_code ec2 = asio::error::would_block;
+ std::string s3 = "zyxwvutsrqponmlkjihgfedcba";
+ ch1.async_send(asio::error::eof, std::move(s3),
+ [&](asio::error_code ec)
+ {
+ ec2 = ec;
+ });
+
+ asio::error_code ec3;
+ std::string s4;
+ bool b5 = ch1.try_receive(
+ [&](asio::error_code ec, std::string s)
+ {
+ ec3 = ec;
+ s4 = s;
+ });
+
+ ASIO_CHECK(b5);
+ ASIO_CHECK(ec3 == asio::error::eof);
+ ASIO_CHECK(s4 == "zyxwvutsrqponmlkjihgfedcba");
+
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(!ec2);
+};
+
+ASIO_TEST_SUITE
+(
+ "experimental/concurrent_channel",
+ ASIO_TEST_CASE(unbuffered_concurrent_channel_test)
+ ASIO_TEST_CASE(buffered_concurrent_channel_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/coro/allocator.cpp b/3rdparty/asio/src/tests/unit/experimental/coro/allocator.cpp
new file mode 100644
index 00000000000..845906df853
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/coro/allocator.cpp
@@ -0,0 +1,113 @@
+//
+// experimental/coro/partial.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/coro.hpp"
+
+#include <vector>
+#include "asio/io_context.hpp"
+#include "../../unit_test.hpp"
+
+namespace exp = asio::experimental;
+
+namespace coro {
+
+template<typename Value = void>
+struct tracked_allocator
+{
+ using value_type = Value;
+ std::vector<std::pair<void*, std::size_t>> & allocs, &deallocs;
+
+ tracked_allocator(std::vector<std::pair<void*, std::size_t>> & allocs,
+ std::vector<std::pair<void*, std::size_t>> & deallocs) : allocs(allocs), deallocs(deallocs) {}
+
+
+ template<typename T>
+ tracked_allocator(const tracked_allocator<T> & a) : allocs(a.allocs), deallocs(a.deallocs) {}
+
+ value_type* allocate(std::size_t n)
+ {
+ auto p = new char[n * sizeof(Value)];
+ allocs.emplace_back(p, n);
+ return reinterpret_cast<value_type*>(p);
+ }
+
+ void deallocate(void* p, std::size_t n)
+ {
+ deallocs.emplace_back(p, n);
+ delete[] static_cast<char*>(p);
+// ASIO_CHECK(allocs.back() == deallocs.back());
+ }
+
+ bool operator==(const tracked_allocator & rhs) const
+ {
+ return &allocs == &rhs.allocs
+ && &deallocs == &rhs.deallocs;
+ }
+};
+
+exp::coro<void, void, asio::any_io_executor, tracked_allocator<void>>
+ alloc_test_impl(asio::io_context & ctx, int, std::allocator_arg_t, tracked_allocator<void> ta, double)
+{
+ co_return ;
+}
+
+void alloc_test()
+{
+ std::vector<std::pair<void*, std::size_t>> allocs, deallocs;
+ asio::io_context ctx;
+ bool ran = false;
+
+ {
+ auto pp = alloc_test_impl(ctx, 42, std::allocator_arg, {allocs, deallocs}, 42.);
+
+ ASIO_CHECK(allocs.size() == 1u);
+ ASIO_CHECK(deallocs.empty());
+
+ pp.async_resume([&](auto e){ran = true; ASIO_CHECK(!e);});
+ ctx.run();
+ ASIO_CHECK(deallocs.size() == 0u);
+ }
+ ctx.restart();
+ ctx.run();
+ ASIO_CHECK(deallocs.size() == 1u);
+ ASIO_CHECK(allocs == deallocs);
+
+ ASIO_CHECK(ran);
+
+ ran = false;
+
+ auto p = asio::experimental::detail::post_coroutine(
+ ctx,
+ asio::bind_allocator(tracked_allocator{allocs, deallocs}, [&]{ran = true;})).handle;
+ ASIO_CHECK(allocs.size() == 2u);
+ ASIO_CHECK(deallocs.size() == 1u);
+ p.resume();
+ ASIO_CHECK(allocs.size() == 3u);
+ ASIO_CHECK(deallocs.size() == 2u);
+ ctx.restart();
+ ctx.run();
+
+ ASIO_CHECK(allocs == deallocs);
+}
+
+} // namespace coro
+
+ASIO_TEST_SUITE
+(
+ "coro/allocate",
+ ASIO_TEST_CASE(::coro::alloc_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/coro/cancel.cpp b/3rdparty/asio/src/tests/unit/experimental/coro/cancel.cpp
new file mode 100644
index 00000000000..38cf1067908
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/coro/cancel.cpp
@@ -0,0 +1,179 @@
+//
+// experimental/coro/cancel.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/coro.hpp"
+#include <iostream>
+#include "asio/bind_cancellation_slot.hpp"
+#include "asio/io_context.hpp"
+#include "asio/steady_timer.hpp"
+#include "asio/this_coro.hpp"
+#include "../../unit_test.hpp"
+
+using namespace asio::experimental;
+namespace this_coro = asio::this_coro;
+
+namespace coro {
+
+
+auto coro_simple_cancel_impl(asio::io_context& ) noexcept
+ -> asio::experimental::coro<void() noexcept, asio::error_code>
+{
+ ASIO_CHECK(
+ !(co_await this_coro::cancellation_state).cancelled());
+
+ asio::steady_timer timer{
+ co_await this_coro::executor,
+ std::chrono::seconds(1)};
+
+ ASIO_CHECK(
+ !(co_await this_coro::cancellation_state).cancelled());
+
+ auto ec = co_await timer;
+
+ ASIO_CHECK(
+ (co_await this_coro::cancellation_state).cancelled());
+
+ co_return ec;
+}
+
+void coro_simple_cancel()
+{
+ asio::io_context ctx;
+ asio::cancellation_signal sig;
+
+ auto k = coro_simple_cancel_impl(ctx);
+
+ asio::error_code res_ec;
+ k.async_resume(
+ asio::bind_cancellation_slot(sig.slot(),
+ [&](asio::error_code ec) {res_ec = ec;}));
+ asio::post(ctx, [&]{sig.emit(asio::cancellation_type::all);});
+
+ ASIO_CHECK(!res_ec);
+
+ ctx.run();
+
+ ASIO_CHECK(res_ec == asio::error::operation_aborted);
+}
+
+auto coro_throw_cancel_impl(asio::io_context& )
+ -> asio::experimental::coro<void() , void>
+{
+ asio::steady_timer timer{
+ co_await this_coro::executor,
+ std::chrono::seconds(1)};
+ co_await timer;
+}
+
+void coro_throw_cancel()
+{
+ asio::io_context ctx;
+ asio::cancellation_signal sig;
+
+ auto k = coro_throw_cancel_impl(ctx);
+
+ std::exception_ptr res_ex;
+ k.async_resume(
+ asio::bind_cancellation_slot(sig.slot(),
+ [&](std::exception_ptr ex) {res_ex = ex;}));
+ asio::post(ctx, [&]{sig.emit(asio::cancellation_type::all);});
+
+ ASIO_CHECK(!res_ex);
+
+ ctx.run();
+
+ ASIO_CHECK(res_ex);
+ try
+ {
+ if (res_ex)
+ std::rethrow_exception(res_ex);
+ }
+ catch (asio::system_error& se)
+ {
+ ASIO_CHECK(se.code() == asio::error::operation_aborted);
+ }
+}
+
+auto coro_simple_cancel_nested_k(asio::io_context&, int& cnt) noexcept
+ -> asio::experimental::coro<
+ void() noexcept,
+ asio::error_code>
+{
+ asio::steady_timer timer{
+ co_await this_coro::executor,
+ std::chrono::milliseconds(100)};
+
+ ASIO_CHECK(!(co_await this_coro::cancellation_state).cancelled());
+ auto ec = co_await timer;
+ cnt++;
+ ASIO_CHECK((co_await this_coro::cancellation_state).cancelled());
+
+ co_return ec;
+}
+
+auto coro_simple_cancel_nested_kouter(
+ asio::io_context& ctx, int& cnt) noexcept
+ -> asio::experimental::coro<
+ asio::error_code() noexcept,
+ asio::error_code>
+{
+ ASIO_CHECK(cnt == 0);
+ co_yield co_await coro_simple_cancel_nested_k(ctx, cnt);
+ ASIO_CHECK(cnt == 1);
+ auto ec = co_await coro_simple_cancel_nested_k(ctx, cnt);
+ ASIO_CHECK(cnt == 2);
+ co_return ec;
+}
+
+void coro_simple_cancel_nested()
+{
+ asio::io_context ctx;
+ asio::cancellation_signal sig;
+
+ int cnt = 0;
+ auto kouter = coro_simple_cancel_nested_kouter(ctx, cnt);
+
+ asio::error_code res_ec;
+ kouter.async_resume(
+ asio::bind_cancellation_slot(sig.slot(),
+ [&](asio::error_code ec) {res_ec = ec;}));
+ asio::post(ctx, [&]{sig.emit(asio::cancellation_type::all);});
+ ASIO_CHECK(!res_ec);
+ ctx.run();
+ ASIO_CHECK(res_ec == asio::error::operation_aborted);
+
+ ctx.restart();
+ res_ec = {};
+ kouter.async_resume(
+ asio::bind_cancellation_slot(sig.slot(),
+ [&](asio::error_code ec) {res_ec = ec;}));
+ asio::post(ctx, [&]{sig.emit(asio::cancellation_type::all);});
+ ASIO_CHECK(!res_ec);
+ ctx.run();
+ ASIO_CHECK(res_ec == asio::error::operation_aborted);
+ ASIO_CHECK(cnt == 2);
+}
+
+} // namespace coro
+
+ASIO_TEST_SUITE
+(
+ "coro/cancel",
+ ASIO_TEST_CASE(::coro::coro_simple_cancel)
+ ASIO_TEST_CASE(::coro::coro_throw_cancel)
+ ASIO_TEST_CASE(::coro::coro_simple_cancel_nested)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/coro/co_spawn.cpp b/3rdparty/asio/src/tests/unit/experimental/coro/co_spawn.cpp
new file mode 100644
index 00000000000..8e6586252f2
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/coro/co_spawn.cpp
@@ -0,0 +1,67 @@
+//
+// experimental/coro/co_spawn.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/co_spawn.hpp"
+
+#include <iostream>
+#include "asio/io_context.hpp"
+#include "asio/steady_timer.hpp"
+#include "asio/this_coro.hpp"
+#include "../../unit_test.hpp"
+
+using namespace asio::experimental;
+namespace this_coro = asio::this_coro;
+
+namespace coro {
+
+auto coro_simple_co_spawn_impl(asio::io_context& , bool &done) noexcept
+ -> asio::experimental::coro<void() noexcept, int>
+{
+ asio::steady_timer timer(
+ co_await this_coro::executor,
+ std::chrono::milliseconds(10));
+
+ done = true;
+
+ co_return 42;
+}
+
+void coro_co_spawn()
+{
+ asio::io_context ctx;
+
+ bool done1 = false;
+ bool done2 = false;
+ int res = 0;
+
+ co_spawn(coro_simple_co_spawn_impl(ctx, done1),
+ [&](int r){done2= true; res = r;});
+
+ ctx.run();
+
+ ASIO_CHECK(done1);
+ ASIO_CHECK(done2);
+ ASIO_CHECK(res == 42);
+}
+
+} // namespace coro
+
+ASIO_TEST_SUITE
+(
+ "coro/co_spawn",
+ ASIO_TEST_CASE(::coro::coro_co_spawn)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/coro/exception.cpp b/3rdparty/asio/src/tests/unit/experimental/coro/exception.cpp
new file mode 100644
index 00000000000..f4d782e9903
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/coro/exception.cpp
@@ -0,0 +1,172 @@
+//
+// experimental/coro/exception.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/coro.hpp"
+
+#include "asio/co_spawn.hpp"
+#include "asio/detached.hpp"
+#include "asio/io_context.hpp"
+#include "asio/use_awaitable.hpp"
+#include "asio/awaitable.hpp"
+#include "../../unit_test.hpp"
+
+using namespace asio::experimental;
+
+namespace coro {
+
+template <typename Func>
+struct on_scope_exit
+{
+ Func func;
+
+ static_assert(noexcept(func()));
+
+ on_scope_exit(const Func &f)
+ : func(static_cast< Func && >(f))
+ {
+ }
+
+ on_scope_exit(Func &&f)
+ : func(f)
+ {
+ }
+
+ on_scope_exit(const on_scope_exit &) = delete;
+
+ ~on_scope_exit()
+ {
+ func();
+ }
+};
+
+asio::experimental::coro<int> throwing_generator(
+ asio::any_io_executor, int &last, bool &destroyed)
+{
+ on_scope_exit x = [&]() noexcept { destroyed = true; };
+ (void)x;
+
+ int i = 0;
+ while (i < 3)
+ co_yield last = ++i;
+
+ throw std::runtime_error("throwing-generator");
+}
+
+asio::awaitable<void> throwing_generator_test()
+{
+ int val = 0;
+ bool destr = false;
+ {
+ auto gi = throwing_generator(
+ co_await asio::this_coro::executor,
+ val, destr);
+ bool caught = false;
+ try
+ {
+ for (int i = 0; i < 10; i++)
+ {
+ ASIO_CHECK(val == i);
+ const auto next = co_await gi.async_resume(asio::use_awaitable);
+ ASIO_CHECK(next);
+ ASIO_CHECK(val == *next);
+ ASIO_CHECK(val == i + 1);
+ }
+ }
+ catch (std::runtime_error &err)
+ {
+ caught = true;
+ using std::operator ""sv;
+ ASIO_CHECK(err.what() == "throwing-generator"sv);
+ }
+ ASIO_CHECK(val == 3);
+ ASIO_CHECK(caught);
+ }
+ ASIO_CHECK(destr);
+};
+
+void run_throwing_generator_test()
+{
+ asio::io_context ctx;
+ asio::co_spawn(ctx, throwing_generator_test(), asio::detached);
+ ctx.run();
+}
+
+asio::experimental::coro<int(int)> throwing_stacked(
+ asio::any_io_executor exec, int &val,
+ bool &destroyed_inner, bool &destroyed)
+{
+ ASIO_CHECK((co_await asio::this_coro::throw_if_cancelled()));
+
+ on_scope_exit x = [&]() noexcept { destroyed = true; };
+ (void)x;
+
+ auto gen = throwing_generator(exec, val, destroyed_inner);
+ while (auto next = co_await gen) // 1, 2, 4, 8, ...
+ ASIO_CHECK(42 ==(co_yield *next)); // offset is delayed by one cycle
+}
+
+asio::awaitable<void> throwing_generator_stacked_test()
+{
+ int val = 0;
+ bool destr = false, destr_inner = false;
+ {
+ auto gi = throwing_stacked(
+ co_await asio::this_coro::executor,
+ val, destr, destr_inner);
+ bool caught = false;
+ try
+ {
+ for (int i = 0; i < 10; i++)
+ {
+ ASIO_CHECK(val == i);
+ const auto next =
+ co_await gi.async_resume(42, asio::use_awaitable);
+ ASIO_CHECK(next);
+ ASIO_CHECK(val == *next);
+ ASIO_CHECK(val == i + 1);
+ }
+ }
+ catch (std::runtime_error &err)
+ {
+ caught = true;
+ using std::operator ""sv;
+ ASIO_CHECK(err.what() == "throwing-generator"sv);
+ }
+ ASIO_CHECK(val == 3);
+ ASIO_CHECK(caught);
+ }
+ ASIO_CHECK(destr);
+ ASIO_CHECK(destr_inner);
+};
+
+void run_throwing_generator_stacked_test()
+{
+ asio::io_context ctx;
+ asio::co_spawn(ctx,
+ throwing_generator_stacked_test,
+ asio::detached);
+ ctx.run();
+}
+
+} // namespace coro
+
+ASIO_TEST_SUITE
+(
+ "coro/exception",
+ ASIO_TEST_CASE(::coro::run_throwing_generator_stacked_test)
+ ASIO_TEST_CASE(::coro::run_throwing_generator_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/coro/executor.cpp b/3rdparty/asio/src/tests/unit/experimental/coro/executor.cpp
new file mode 100644
index 00000000000..e0893da2e50
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/coro/executor.cpp
@@ -0,0 +1,116 @@
+//
+// experimental/coro/executor.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/coro.hpp"
+
+#include "asio/thread_pool.hpp"
+#include "asio/io_context.hpp"
+#include "../../unit_test.hpp"
+
+using namespace asio::experimental;
+
+namespace coro {
+
+#define ASIO_CHECKPOINT() \
+ ASIO_TEST_IOSTREAM << __FILE__ << "(" << __LINE__ << "): " \
+ << asio::detail::test_name() << ": " \
+ << "Checkpoint" << std::endl;
+
+template <typename T>
+void different_execs()
+{
+ asio::thread_pool th_ctx{1u};
+ asio::io_context ctx;
+
+ auto o = std::make_optional(
+ asio::prefer(th_ctx.get_executor(),
+ asio::execution::outstanding_work.tracked));
+
+ static bool ran_inner = false, ran_outer = false;
+
+ struct c_inner_t
+ {
+ auto operator()(asio::any_io_executor e) -> asio::experimental::coro<T>
+ {
+ auto p = e.target<asio::thread_pool::executor_type>();
+ ASIO_CHECKPOINT();
+ ASIO_CHECK(p);
+ ASIO_CHECK(p->running_in_this_thread());
+ ran_inner = true;
+ co_return;
+ };
+
+ };
+
+ c_inner_t c_inner;
+
+ struct c_outer_t
+ {
+
+ auto operator()(asio::any_io_executor e, int,
+ asio::experimental::coro<T> tp)
+ -> asio::experimental::coro<void>
+ {
+ auto p = e.target<asio::io_context::executor_type>();
+
+ ASIO_CHECK(p);
+ ASIO_CHECK(p->running_in_this_thread());
+ ASIO_CHECKPOINT();
+
+ co_await tp;
+
+ ASIO_CHECKPOINT();
+ ASIO_CHECK(p->running_in_this_thread());
+
+ ran_outer = true;
+ };
+ };
+
+ c_outer_t c_outer;
+
+ bool ran = false;
+ std::exception_ptr ex;
+
+ auto c = c_outer(ctx.get_executor(), 10, c_inner(th_ctx.get_executor()));
+ c.async_resume(
+ [&](std::exception_ptr e)
+ {
+ ASIO_CHECK(!e);
+ ASIO_CHECKPOINT();
+ ran = true;
+ });
+
+ ASIO_CHECK(!ran);
+ ctx.run();
+ o.reset();
+ ASIO_CHECK(ran);
+ ASIO_CHECK(ran_inner);
+ ASIO_CHECK(ran_outer);
+ ASIO_CHECK(!ex);
+
+ th_ctx.stop();
+ th_ctx.join();
+}
+
+} // namespace coro
+
+ASIO_TEST_SUITE
+(
+ "coro/partial",
+ ASIO_TEST_CASE(::coro::different_execs<void>)
+ ASIO_TEST_CASE(::coro::different_execs<int()>)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/coro/partial.cpp b/3rdparty/asio/src/tests/unit/experimental/coro/partial.cpp
new file mode 100644
index 00000000000..651b8292204
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/coro/partial.cpp
@@ -0,0 +1,45 @@
+//
+// experimental/coro/partial.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/coro.hpp"
+
+#include "asio/io_context.hpp"
+#include "../../unit_test.hpp"
+
+using namespace asio::experimental;
+
+namespace coro {
+
+void partial()
+{
+ asio::io_context ctx;
+ bool ran = false;
+ auto p = detail::post_coroutine(ctx, [&]{ran = true;}).handle;
+ ASIO_CHECK(!ran);
+ p.resume();
+ ASIO_CHECK(!ran);
+ ctx.run();
+ ASIO_CHECK(ran);
+}
+
+} // namespace coro
+
+ASIO_TEST_SUITE
+(
+ "coro/partial",
+ ASIO_TEST_CASE(::coro::partial)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/coro/simple_test.cpp b/3rdparty/asio/src/tests/unit/experimental/coro/simple_test.cpp
new file mode 100644
index 00000000000..5eac0688548
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/coro/simple_test.cpp
@@ -0,0 +1,264 @@
+//
+// experimental/coro/simple_test.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/coro.hpp"
+
+#include "asio/co_spawn.hpp"
+#include "asio/detached.hpp"
+#include "asio/io_context.hpp"
+#include "asio/use_awaitable.hpp"
+#include <iostream>
+#include <vector>
+#include "../../unit_test.hpp"
+
+using namespace asio::experimental;
+
+namespace asio {
+namespace experimental {
+
+template struct coro<void(), void, any_io_executor>;
+template struct coro<int(), void, any_io_executor>;
+template struct coro<void(), int, any_io_executor>;
+template struct coro<int(int), void, any_io_executor>;
+template struct coro<int(), int, any_io_executor>;
+template struct coro<int(int), int, any_io_executor>;
+
+template struct coro<void() noexcept, void, any_io_executor>;
+template struct coro<int() noexcept, void, any_io_executor>;
+template struct coro<void() noexcept, int, any_io_executor>;
+template struct coro<int(int) noexcept, void, any_io_executor>;
+template struct coro<int() noexcept, int, any_io_executor>;
+template struct coro<int(int) noexcept, int, any_io_executor>;
+
+} // namespace experimental
+} // namespace asio
+
+namespace coro {
+
+template <typename Func>
+struct on_scope_exit
+{
+ Func func;
+
+ static_assert(noexcept(func()));
+
+ on_scope_exit(const Func &f)
+ : func(static_cast< Func && >(f))
+ {
+ }
+
+ on_scope_exit(Func &&f)
+ : func(f)
+ {
+ }
+
+ on_scope_exit(const on_scope_exit &) = delete;
+
+ ~on_scope_exit()
+ {
+ func();
+ }
+};
+
+asio::experimental::coro<int> generator_impl(
+ asio::any_io_executor, int& last, bool& destroyed)
+{
+ on_scope_exit x = [&]() noexcept { destroyed = true; };
+ (void)x;
+
+ int i = 0;
+ while (true)
+ co_yield last = ++i;
+}
+
+asio::awaitable<void> generator_test()
+{
+ int val = 0;
+ bool destr = false;
+ {
+ auto gi = generator_impl(
+ co_await asio::this_coro::executor, val, destr);
+
+ for (int i = 0; i < 10; i++)
+ {
+ ASIO_CHECK(val == i);
+ const auto next = co_await gi.async_resume(asio::use_awaitable);
+ ASIO_CHECK(next);
+ ASIO_CHECK(val == *next);
+ ASIO_CHECK(val == i + 1);
+ }
+
+ ASIO_CHECK(!destr);
+ }
+ ASIO_CHECK(destr);
+};
+
+void run_generator_test()
+{
+ asio::io_context ctx;
+ asio::co_spawn(ctx, generator_test, asio::detached);
+ ctx.run();
+}
+
+asio::experimental::coro<void, int> task_test(asio::io_context&)
+{
+ co_return 42;
+}
+
+asio::experimental::coro<void, int> task_throw(asio::io_context&)
+{
+ throw std::logic_error(__func__);
+ co_return 42;
+}
+
+void run_task_test()
+{
+ asio::io_context ctx;
+
+ bool tt1 = false;
+ bool tt2 = false;
+ bool tt3 = false;
+ bool tt4 = false;
+ auto tt = task_test(ctx);
+ tt.async_resume(
+ [&](std::exception_ptr pt, int i)
+ {
+ tt1 = true;
+ ASIO_CHECK(!pt);
+ ASIO_CHECK(i == 42);
+ tt.async_resume(
+ [&](std::exception_ptr pt, int)
+ {
+ tt2 = true;
+ ASIO_CHECK(pt);
+ });
+ });
+
+ auto tt_2 = task_throw(ctx);
+
+ tt_2.async_resume(
+ [&](std::exception_ptr pt, int)
+ {
+ tt3 = true;
+ ASIO_CHECK(pt);
+ tt.async_resume(
+ [&](std::exception_ptr pt, int)
+ {
+ tt4 = true;
+ ASIO_CHECK(pt);
+ });
+ });
+
+ ctx.run();
+
+ ASIO_CHECK(tt1);
+ ASIO_CHECK(tt2);
+ ASIO_CHECK(tt3);
+ ASIO_CHECK(tt4);
+}
+
+asio::experimental::coro<char> completion_generator_test_impl(
+ asio::any_io_executor, int limit)
+{
+ for (int i = 0; i < limit; i++)
+ co_yield i;
+}
+
+asio::awaitable<void> completion_generator_test()
+{
+ std::vector<int> res;
+ auto g = completion_generator_test_impl(
+ co_await asio::this_coro::executor, 10);
+
+ ASIO_CHECK(g.is_open());
+ while (auto val = co_await g.async_resume(asio::use_awaitable))
+ res.push_back(*val);
+
+ ASIO_CHECK(!g.is_open());
+ ASIO_CHECK((res == std::vector{0,1,2,3,4,5,6,7,8,9}));
+};
+
+
+void run_completion_generator_test()
+{
+ asio::io_context ctx;
+ asio::co_spawn(ctx, completion_generator_test, asio::detached);
+ ctx.run();
+}
+
+asio::experimental::coro<int(int)>
+symmetrical_test_impl(asio::any_io_executor)
+{
+ int i = 0;
+ while (true)
+ i = (co_yield i) + i;
+}
+
+asio::awaitable<void> symmetrical_test()
+{
+ auto g = symmetrical_test_impl(co_await asio::this_coro::executor);
+
+ ASIO_CHECK(g.is_open());
+
+ ASIO_CHECK(0 == (co_await g.async_resume(0,
+ asio::use_awaitable)).value_or(-1));
+
+ ASIO_CHECK(1 == (co_await g.async_resume(1,
+ asio::use_awaitable)).value_or(-1));
+
+ ASIO_CHECK(3 == (co_await g.async_resume(2,
+ asio::use_awaitable)).value_or(-1));
+
+ ASIO_CHECK(6 == (co_await g.async_resume(3,
+ asio::use_awaitable)).value_or(-1));
+
+ ASIO_CHECK(10 == (co_await g.async_resume(4,
+ asio::use_awaitable)).value_or(-1));
+
+ ASIO_CHECK(15 == (co_await g.async_resume(5,
+ asio::use_awaitable)).value_or(-1));
+
+ ASIO_CHECK(21 == (co_await g.async_resume(6,
+ asio::use_awaitable)).value_or(-1));
+
+ ASIO_CHECK(28 == (co_await g.async_resume(7,
+ asio::use_awaitable)).value_or(-1));
+
+ ASIO_CHECK(36 == (co_await g.async_resume(8,
+ asio::use_awaitable)).value_or(-1));
+
+ ASIO_CHECK(45 == (co_await g.async_resume(9,
+ asio::use_awaitable)).value_or(-1));
+};
+
+void run_symmetrical_test()
+{
+ asio::io_context ctx;
+ asio::co_spawn(ctx, symmetrical_test, asio::detached);
+ ctx.run();
+}
+
+} // namespace coro
+
+ASIO_TEST_SUITE
+(
+ "coro/simple_test",
+ ASIO_TEST_CASE(::coro::run_generator_test)
+ ASIO_TEST_CASE(::coro::run_task_test)
+ ASIO_TEST_CASE(::coro::run_symmetrical_test)
+ ASIO_TEST_CASE(::coro::run_completion_generator_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/coro/stack_test.cpp b/3rdparty/asio/src/tests/unit/experimental/coro/stack_test.cpp
new file mode 100644
index 00000000000..9177161afcf
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/coro/stack_test.cpp
@@ -0,0 +1,83 @@
+//
+// experimental/coro/stack_test.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/coro.hpp"
+
+#include "asio/detached.hpp"
+#include "asio/io_context.hpp"
+#include <iostream>
+#include "../../unit_test.hpp"
+
+using namespace asio::experimental;
+
+namespace coro {
+
+asio::experimental::coro<int()>
+ stack_generator(asio::any_io_executor, int i = 1)
+{
+ for (;;)
+ {
+ co_yield i;
+ i *= 2;
+ }
+}
+
+asio::experimental::coro<int(int)>
+stack_accumulate(asio::any_io_executor exec)
+{
+ auto gen = stack_generator(exec);
+ int offset = 0;
+ while (auto next = co_await gen) // 1, 2, 4, 8, ...
+ offset = co_yield *next + offset; // offset is delayed by one cycle
+}
+
+asio::experimental::coro<int>
+main_stack_coro(asio::io_context&, bool & done)
+{
+ auto g = stack_accumulate(co_await asio::this_coro::executor);
+
+ ASIO_CHECK(g.is_open());
+ ASIO_CHECK(1 == (co_await g(1000)).value_or(-1));
+ ASIO_CHECK(2002 == (co_await g(2000)).value_or(-1));
+ ASIO_CHECK(3004 == (co_await g(3000)).value_or(-1));
+ ASIO_CHECK(4008 == (co_await g(4000)).value_or(-1));
+ ASIO_CHECK(5016 == (co_await g(5000)).value_or(-1));
+ ASIO_CHECK(6032 == (co_await g(6000)).value_or(-1));
+ ASIO_CHECK(7064 == (co_await g(7000)).value_or(-1));
+ ASIO_CHECK(8128 == (co_await g(8000)).value_or(-1));
+ ASIO_CHECK(9256 == (co_await g(9000)).value_or(-1));
+ ASIO_CHECK(511 == (co_await g(-1)).value_or(-1));
+ done = true;
+}
+
+void stack_test()
+{
+ bool done = false;
+ asio::io_context ctx;
+ auto k = main_stack_coro(ctx, done);
+ k.async_resume(asio::detached);
+ ctx.run();
+ ASIO_CHECK(done);
+}
+
+} // namespace coro
+
+ASIO_TEST_SUITE
+(
+ "coro/stack_test",
+ ASIO_TEST_CASE(::coro::stack_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/coro/use_coro.cpp b/3rdparty/asio/src/tests/unit/experimental/coro/use_coro.cpp
new file mode 100644
index 00000000000..f2cb7adfcdd
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/coro/use_coro.cpp
@@ -0,0 +1,77 @@
+//
+// experimental/coro/use_coro.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/use_coro.hpp"
+
+#include "asio/steady_timer.hpp"
+#include <iostream>
+#include "../../unit_test.hpp"
+
+using namespace asio::experimental;
+
+namespace coro {
+
+asio::experimental::coro<void(), int>
+awaiter(asio::any_io_executor exec)
+{
+ asio::steady_timer timer{exec};
+ co_await timer.async_wait(use_coro);
+ co_return 42;
+}
+
+asio::experimental::coro<void() noexcept, int>
+awaiter_noexcept(asio::any_io_executor exec)
+{
+ asio::steady_timer timer{exec};
+ auto ec = co_await timer.async_wait(asio::deferred);
+ ASIO_CHECK(ec == asio::error_code{});
+ co_return 42;
+}
+
+void stack_test2()
+{
+ bool done = false;
+ asio::io_context ctx;
+
+ auto k = awaiter(ctx.get_executor());
+ auto k2 = awaiter_noexcept(ctx.get_executor());
+
+ k.async_resume(
+ [&](std::exception_ptr ex, int res)
+ {
+ ASIO_CHECK(!ex);
+ ASIO_CHECK(res == 42);
+ done = true;
+ });
+
+ k2.async_resume([&](int res)
+ {
+ ASIO_CHECK(res == 42);
+ done = true;
+ });
+
+ ctx.run();
+ ASIO_CHECK(done);
+}
+
+} // namespace coro
+
+ASIO_TEST_SUITE
+(
+ "coro/use_coro",
+ ASIO_TEST_CASE(::coro::stack_test2)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/parallel_group.cpp b/3rdparty/asio/src/tests/unit/experimental/parallel_group.cpp
new file mode 100644
index 00000000000..c91c95f157d
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/parallel_group.cpp
@@ -0,0 +1,25 @@
+//
+// experimental/parallel_group.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/parallel_group.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "experimental/parallel_group",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/experimental/promise.cpp b/3rdparty/asio/src/tests/unit/experimental/promise.cpp
new file mode 100644
index 00000000000..67923a4c726
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/experimental/promise.cpp
@@ -0,0 +1,226 @@
+//
+// promise.cpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2021-2023 Klemens D. Morgenstern
+// (klemens dot morgenstern at gmx dot net)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/experimental/promise.hpp"
+
+#include "asio/append.hpp"
+#include "asio/bind_cancellation_slot.hpp"
+#include "asio/compose.hpp"
+#include "asio/deferred.hpp"
+#include "asio/experimental/use_promise.hpp"
+#include "asio/steady_timer.hpp"
+#include "../unit_test.hpp"
+
+namespace promise {
+
+void promise_tester()
+{
+ using namespace asio;
+ using namespace std::chrono;
+
+ io_context ctx;
+
+ steady_timer timer1{ctx}, timer2{ctx};
+
+ const auto started_when = steady_clock::now();
+ timer1.expires_at(started_when + milliseconds(5000));
+ timer2.expires_at(started_when + milliseconds(1000));
+ auto p1 = timer1.async_wait(experimental::use_promise);
+
+ steady_clock::time_point completed_when;
+ asio::error_code ec;
+ bool called = false;
+
+ p1([&](asio::error_code ec_)
+ {
+ ec = ec_;
+ called = true;
+ completed_when = steady_clock::now();
+ });
+
+ steady_clock::time_point timer2_done;
+ timer2.async_wait(
+ [&](asio::error_code)
+ {
+ timer2_done = steady_clock::now();
+ p1.cancel();
+ });
+
+ ctx.run();
+
+ static_assert(
+ asio::is_async_operation<decltype(p1)>::value,
+ "promise is async_op");
+
+ ASIO_CHECK(timer2_done + milliseconds(1) > started_when);
+ ASIO_CHECK(completed_when > timer2_done);
+ ASIO_CHECK(called);
+ ASIO_CHECK(ec == error::operation_aborted);
+
+ timer1.expires_after(milliseconds(0));
+ auto p2 = timer1.async_wait(
+ asio::append(experimental::use_promise, 123));
+
+ ec = asio::error::would_block;
+ called = false;
+
+ p2([&](asio::error_code ec_, int i)
+ {
+ ASIO_CHECK(i == 123);
+ ec = ec_;
+ called = true;
+ });
+
+ ASIO_CHECK(ec == asio::error::would_block);
+ ASIO_CHECK(!called);
+
+ ctx.restart();
+ ctx.run();
+
+ static_assert(
+ asio::is_async_operation<decltype(p2)>::value,
+ "promise is async_op");
+
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(called);
+}
+
+void promise_slot_tester()
+{
+ using namespace asio;
+ using namespace std::chrono;
+
+ io_context ctx;
+
+ steady_timer timer1{ctx}, timer2{ctx};
+
+ const auto started_when = steady_clock::now();
+ timer1.expires_at(started_when + milliseconds(2500));
+ timer2.expires_at(started_when + milliseconds(1000));
+ auto p = timer1.async_wait(experimental::use_promise);
+
+ steady_clock::time_point completed_when;
+ asio::error_code ec;
+ bool called = false;
+
+ asio::cancellation_signal sig;
+
+ p(asio::bind_cancellation_slot(
+ sig.slot(),
+ [&](asio::error_code ec_)
+ {
+ ec = ec_;
+ called = true;
+ completed_when = steady_clock::now();
+ }));
+
+ steady_clock::time_point timer2_done;
+ timer2.async_wait(
+ [&](asio::error_code)
+ {
+ timer2_done = steady_clock::now();
+ sig.emit(asio::cancellation_type::all);
+ });
+
+ ctx.run();
+
+ static_assert(
+ asio::is_async_operation<decltype(p)>::value,
+ "promise is async_op");
+
+ ASIO_CHECK(timer2_done + milliseconds(1) > started_when);
+ ASIO_CHECK(completed_when > timer2_done);
+ ASIO_CHECK(called);
+ ASIO_CHECK(ec == error::operation_aborted);
+}
+
+void early_completion()
+{
+ using namespace asio;
+ using namespace std::chrono;
+
+ io_context ctx;
+ auto p = asio::post(ctx, asio::experimental::use_promise);
+ ctx.run();
+
+ ASIO_CHECK(p.completed());
+
+ bool completed = false;
+ p([&]{completed = true;});
+ ASIO_CHECK(!completed);
+ ctx.restart();
+ ctx.run();
+ ASIO_CHECK(completed);
+}
+
+struct test_cancel_impl_op
+{
+ asio::steady_timer & tim;
+ asio::error_code &ec;
+ template<typename Self>
+ void operator()(Self& self)
+ {
+ tim.async_wait(std::forward<Self>(self));
+ }
+
+ template<typename Self>
+ void operator()(Self& self, asio::error_code ec_)
+ {
+ ec = ec_;
+ self.complete(ec_);
+ }
+};
+
+template <typename CompletionToken>
+ASIO_INITFN_AUTO_RESULT_TYPE(
+ CompletionToken, void(asio::error_code))
+test_cancel_impl(asio::steady_timer & tim,
+ asio::error_code &ec,
+ CompletionToken&& token)
+{
+ return asio::async_compose<CompletionToken, void(asio::error_code)>(
+ test_cancel_impl_op{tim, ec}, token, tim);
+}
+
+void test_cancel()
+{
+ asio::io_context ctx;
+ asio::steady_timer tim{ctx, std::chrono::seconds(10)};
+ asio::error_code ec;
+
+ {
+ auto p = test_cancel_impl(
+ tim, ec, asio::experimental::use_promise);
+ }
+
+ ctx.run();
+
+ ASIO_CHECK_MESSAGE(
+ ec == asio::error::operation_aborted,
+ ec.message());
+}
+
+} // namespace promise
+
+ASIO_TEST_SUITE
+(
+ "promise",
+ ASIO_TEST_CASE(promise::promise_tester)
+ ASIO_TEST_CASE(promise::promise_slot_tester)
+ ASIO_TEST_CASE(promise::early_completion)
+ ASIO_TEST_CASE(promise::test_cancel)
+)
diff --git a/3rdparty/asio/src/tests/unit/file_base.cpp b/3rdparty/asio/src/tests/unit/file_base.cpp
new file mode 100644
index 00000000000..9f517fd8e37
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/file_base.cpp
@@ -0,0 +1,25 @@
+//
+// file_base.cpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/post.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "file_base",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/generic/basic_endpoint.cpp b/3rdparty/asio/src/tests/unit/generic/basic_endpoint.cpp
new file mode 100644
index 00000000000..c02f32b8c73
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/generic/basic_endpoint.cpp
@@ -0,0 +1,25 @@
+//
+// generic/basic_endpoint.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/generic/basic_endpoint.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "generic/basic_endpoint",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/generic/datagram_protocol.cpp b/3rdparty/asio/src/tests/unit/generic/datagram_protocol.cpp
new file mode 100644
index 00000000000..23957a7a15d
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/generic/datagram_protocol.cpp
@@ -0,0 +1,292 @@
+//
+// generic/datagram_protocol.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/generic/datagram_protocol.hpp"
+
+#include <cstring>
+#include "asio/io_context.hpp"
+#include "asio/ip/udp.hpp"
+#include "../unit_test.hpp"
+#include "../archetypes/async_result.hpp"
+
+#if defined(__cplusplus_cli) || defined(__cplusplus_winrt)
+# define generic cpp_generic
+#endif
+
+//------------------------------------------------------------------------------
+
+// generic_datagram_protocol_socket_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// generic::datagram_socket::socket compile and link correctly. Runtime
+// failures are ignored.
+
+namespace generic_datagram_protocol_socket_compile {
+
+void connect_handler(const asio::error_code&)
+{
+}
+
+void send_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void receive_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void test()
+{
+ using namespace asio;
+ namespace generic = asio::generic;
+ typedef generic::datagram_protocol dp;
+
+ const int af_inet = ASIO_OS_DEF(AF_INET);
+ const int ipproto_udp = ASIO_OS_DEF(IPPROTO_UDP);
+ const int sock_dgram = ASIO_OS_DEF(SOCK_DGRAM);
+
+ try
+ {
+ io_context ioc;
+ char mutable_char_buffer[128] = "";
+ const char const_char_buffer[128] = "";
+ socket_base::message_flags in_flags = 0;
+ socket_base::send_buffer_size socket_option;
+ socket_base::bytes_readable io_control_command;
+ archetypes::immediate_handler immediate;
+ asio::error_code ec;
+
+ // basic_datagram_socket constructors.
+
+ dp::socket socket1(ioc);
+ dp::socket socket2(ioc, dp(af_inet, ipproto_udp));
+ dp::socket socket3(ioc, dp::endpoint());
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ dp::socket::native_handle_type native_socket1
+ = ::socket(af_inet, sock_dgram, 0);
+ dp::socket socket4(ioc, dp(af_inet, ipproto_udp), native_socket1);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ dp::socket socket5(std::move(socket4));
+ asio::ip::udp::socket udp_socket(ioc);
+ dp::socket socket6(std::move(udp_socket));
+
+ // basic_datagram_socket operators.
+
+ socket1 = dp::socket(ioc);
+ socket1 = std::move(socket2);
+ socket1 = asio::ip::udp::socket(ioc);
+
+ // basic_io_object functions.
+
+ dp::socket::executor_type ex = socket1.get_executor();
+ (void)ex;
+
+ // basic_socket functions.
+
+ dp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
+ (void)lowest_layer;
+
+ socket1.open(dp(af_inet, ipproto_udp));
+ socket1.open(dp(af_inet, ipproto_udp), ec);
+
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ dp::socket::native_handle_type native_socket2
+ = ::socket(af_inet, sock_dgram, 0);
+ socket1.assign(dp(af_inet, ipproto_udp), native_socket2);
+ dp::socket::native_handle_type native_socket3
+ = ::socket(af_inet, sock_dgram, 0);
+ socket1.assign(dp(af_inet, ipproto_udp), native_socket3, ec);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ bool is_open = socket1.is_open();
+ (void)is_open;
+
+ socket1.close();
+ socket1.close(ec);
+
+ dp::socket::native_handle_type native_socket4 = socket1.native_handle();
+ (void)native_socket4;
+
+ socket1.cancel();
+ socket1.cancel(ec);
+
+ bool at_mark1 = socket1.at_mark();
+ (void)at_mark1;
+ bool at_mark2 = socket1.at_mark(ec);
+ (void)at_mark2;
+
+ std::size_t available1 = socket1.available();
+ (void)available1;
+ std::size_t available2 = socket1.available(ec);
+ (void)available2;
+
+ socket1.bind(dp::endpoint());
+ socket1.bind(dp::endpoint(), ec);
+
+ socket1.connect(dp::endpoint());
+ socket1.connect(dp::endpoint(), ec);
+
+ socket1.async_connect(dp::endpoint(), connect_handler);
+ socket1.async_connect(dp::endpoint(), immediate);
+
+ socket1.set_option(socket_option);
+ socket1.set_option(socket_option, ec);
+
+ socket1.get_option(socket_option);
+ socket1.get_option(socket_option, ec);
+
+ socket1.io_control(io_control_command);
+ socket1.io_control(io_control_command, ec);
+
+ dp::endpoint endpoint1 = socket1.local_endpoint();
+ (void)endpoint1;
+ dp::endpoint endpoint2 = socket1.local_endpoint(ec);
+ (void)endpoint2;
+
+ dp::endpoint endpoint3 = socket1.remote_endpoint();
+ (void)endpoint3;
+ dp::endpoint endpoint4 = socket1.remote_endpoint(ec);
+ (void)endpoint4;
+
+ socket1.shutdown(socket_base::shutdown_both);
+ socket1.shutdown(socket_base::shutdown_both, ec);
+
+ // basic_datagram_socket functions.
+
+ socket1.send(buffer(mutable_char_buffer));
+ socket1.send(buffer(const_char_buffer));
+ socket1.send(null_buffers());
+ socket1.send(buffer(mutable_char_buffer), in_flags);
+ socket1.send(buffer(const_char_buffer), in_flags);
+ socket1.send(null_buffers(), in_flags);
+ socket1.send(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.send(buffer(const_char_buffer), in_flags, ec);
+ socket1.send(null_buffers(), in_flags, ec);
+
+ socket1.async_send(buffer(mutable_char_buffer), send_handler);
+ socket1.async_send(buffer(const_char_buffer), send_handler);
+ socket1.async_send(null_buffers(), send_handler);
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler);
+ socket1.async_send(buffer(const_char_buffer), in_flags, send_handler);
+ socket1.async_send(null_buffers(), in_flags, send_handler);
+ socket1.async_send(buffer(mutable_char_buffer), immediate);
+ socket1.async_send(buffer(const_char_buffer), immediate);
+ socket1.async_send(null_buffers(), immediate);
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, immediate);
+ socket1.async_send(buffer(const_char_buffer), in_flags, immediate);
+ socket1.async_send(null_buffers(), in_flags, immediate);
+
+ socket1.send_to(buffer(mutable_char_buffer),
+ dp::endpoint());
+ socket1.send_to(buffer(const_char_buffer),
+ dp::endpoint());
+ socket1.send_to(null_buffers(),
+ dp::endpoint());
+ socket1.send_to(buffer(mutable_char_buffer),
+ dp::endpoint(), in_flags);
+ socket1.send_to(buffer(const_char_buffer),
+ dp::endpoint(), in_flags);
+ socket1.send_to(null_buffers(),
+ dp::endpoint(), in_flags);
+ socket1.send_to(buffer(mutable_char_buffer),
+ dp::endpoint(), in_flags, ec);
+ socket1.send_to(buffer(const_char_buffer),
+ dp::endpoint(), in_flags, ec);
+ socket1.send_to(null_buffers(),
+ dp::endpoint(), in_flags, ec);
+
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ dp::endpoint(), send_handler);
+ socket1.async_send_to(buffer(const_char_buffer),
+ dp::endpoint(), send_handler);
+ socket1.async_send_to(null_buffers(),
+ dp::endpoint(), send_handler);
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ dp::endpoint(), in_flags, send_handler);
+ socket1.async_send_to(buffer(const_char_buffer),
+ dp::endpoint(), in_flags, send_handler);
+ socket1.async_send_to(null_buffers(),
+ dp::endpoint(), in_flags, send_handler);
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ dp::endpoint(), immediate);
+ socket1.async_send_to(buffer(const_char_buffer),
+ dp::endpoint(), immediate);
+ socket1.async_send_to(null_buffers(),
+ dp::endpoint(), immediate);
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ dp::endpoint(), in_flags, immediate);
+ socket1.async_send_to(buffer(const_char_buffer),
+ dp::endpoint(), in_flags, immediate);
+ socket1.async_send_to(null_buffers(),
+ dp::endpoint(), in_flags, immediate);
+
+ socket1.receive(buffer(mutable_char_buffer));
+ socket1.receive(null_buffers());
+ socket1.receive(buffer(mutable_char_buffer), in_flags);
+ socket1.receive(null_buffers(), in_flags);
+ socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.receive(null_buffers(), in_flags, ec);
+
+ socket1.async_receive(buffer(mutable_char_buffer), receive_handler);
+ socket1.async_receive(null_buffers(), receive_handler);
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags,
+ receive_handler);
+ socket1.async_receive(null_buffers(), in_flags, receive_handler);
+ socket1.async_receive(buffer(mutable_char_buffer), immediate);
+ socket1.async_receive(null_buffers(), immediate);
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags, immediate);
+ socket1.async_receive(null_buffers(), in_flags, immediate);
+
+ dp::endpoint endpoint;
+ socket1.receive_from(buffer(mutable_char_buffer), endpoint);
+ socket1.receive_from(null_buffers(), endpoint);
+ socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags);
+ socket1.receive_from(null_buffers(), endpoint, in_flags);
+ socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags, ec);
+ socket1.receive_from(null_buffers(), endpoint, in_flags, ec);
+
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, receive_handler);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, receive_handler);
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, in_flags, receive_handler);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, in_flags, receive_handler);
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, immediate);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, immediate);
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, in_flags, immediate);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, in_flags, immediate);
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace generic_datagram_protocol_socket_compile
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "generic/datagram_protocol",
+ ASIO_COMPILE_TEST_CASE(generic_datagram_protocol_socket_compile::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/generic/raw_protocol.cpp b/3rdparty/asio/src/tests/unit/generic/raw_protocol.cpp
new file mode 100644
index 00000000000..d20ef5ba870
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/generic/raw_protocol.cpp
@@ -0,0 +1,293 @@
+//
+// generic/raw_protocol.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/generic/raw_protocol.hpp"
+
+#include <cstring>
+#include "asio/io_context.hpp"
+#include "asio/ip/icmp.hpp"
+#include "../unit_test.hpp"
+#include "../archetypes/async_result.hpp"
+
+#if defined(__cplusplus_cli) || defined(__cplusplus_winrt)
+# define generic cpp_generic
+#endif
+
+//------------------------------------------------------------------------------
+
+// generic_raw_protocol_socket_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// generic::raw_socket::socket compile and link correctly. Runtime failures
+// are ignored.
+
+namespace generic_raw_protocol_socket_compile {
+
+void connect_handler(const asio::error_code&)
+{
+}
+
+void send_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void receive_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void test()
+{
+ using namespace asio;
+ namespace generic = asio::generic;
+ typedef generic::raw_protocol rp;
+
+ const int af_inet = ASIO_OS_DEF(AF_INET);
+ const int ipproto_icmp = ASIO_OS_DEF(IPPROTO_ICMP);
+ const int sock_raw = ASIO_OS_DEF(SOCK_RAW);
+
+ try
+ {
+ io_context ioc;
+ char mutable_char_buffer[128] = "";
+ const char const_char_buffer[128] = "";
+ socket_base::message_flags in_flags = 0;
+ socket_base::send_buffer_size socket_option;
+ socket_base::bytes_readable io_control_command;
+ archetypes::immediate_handler immediate;
+ asio::error_code ec;
+
+ // basic_raw_socket constructors.
+
+ rp::socket socket1(ioc);
+ rp::socket socket2(ioc, rp(af_inet, ipproto_icmp));
+ rp::socket socket3(ioc, rp::endpoint());
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ rp::socket::native_handle_type native_socket1
+ = ::socket(af_inet, sock_raw, 0);
+ rp::socket socket4(ioc, rp(af_inet, ipproto_icmp), native_socket1);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ rp::socket socket5(std::move(socket4));
+ asio::ip::icmp::socket icmp_socket(ioc);
+ rp::socket socket6(std::move(icmp_socket));
+
+ // basic_datagram_socket operators.
+
+ socket1 = rp::socket(ioc);
+ socket1 = std::move(socket2);
+ socket1 = asio::ip::icmp::socket(ioc);
+
+ // basic_io_object functions.
+
+ rp::socket::executor_type ex = socket1.get_executor();
+ (void)ex;
+
+ // basic_socket functions.
+
+ rp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
+ (void)lowest_layer;
+
+ socket1.open(rp(af_inet, ipproto_icmp));
+ socket1.open(rp(af_inet, ipproto_icmp), ec);
+
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ rp::socket::native_handle_type native_socket2
+ = ::socket(af_inet, sock_raw, 0);
+ socket1.assign(rp(af_inet, ipproto_icmp), native_socket2);
+ rp::socket::native_handle_type native_socket3
+ = ::socket(af_inet, sock_raw, 0);
+ socket1.assign(rp(af_inet, ipproto_icmp), native_socket3, ec);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ bool is_open = socket1.is_open();
+ (void)is_open;
+
+ socket1.close();
+ socket1.close(ec);
+
+ rp::socket::native_handle_type native_socket4 = socket1.native_handle();
+ (void)native_socket4;
+
+ socket1.cancel();
+ socket1.cancel(ec);
+
+ bool at_mark1 = socket1.at_mark();
+ (void)at_mark1;
+ bool at_mark2 = socket1.at_mark(ec);
+ (void)at_mark2;
+
+ std::size_t available1 = socket1.available();
+ (void)available1;
+ std::size_t available2 = socket1.available(ec);
+ (void)available2;
+
+ socket1.bind(rp::endpoint());
+ socket1.bind(rp::endpoint(), ec);
+
+ socket1.connect(rp::endpoint());
+ socket1.connect(rp::endpoint(), ec);
+
+ socket1.async_connect(rp::endpoint(), connect_handler);
+ socket1.async_connect(rp::endpoint(), immediate);
+
+ socket1.set_option(socket_option);
+ socket1.set_option(socket_option, ec);
+
+ socket1.get_option(socket_option);
+ socket1.get_option(socket_option, ec);
+
+ socket1.io_control(io_control_command);
+ socket1.io_control(io_control_command, ec);
+
+ rp::endpoint endpoint1 = socket1.local_endpoint();
+ (void)endpoint1;
+ rp::endpoint endpoint2 = socket1.local_endpoint(ec);
+ (void)endpoint2;
+
+ rp::endpoint endpoint3 = socket1.remote_endpoint();
+ (void)endpoint3;
+ rp::endpoint endpoint4 = socket1.remote_endpoint(ec);
+ (void)endpoint4;
+
+ socket1.shutdown(socket_base::shutdown_both);
+ socket1.shutdown(socket_base::shutdown_both, ec);
+
+ // basic_raw_socket functions.
+
+ socket1.send(buffer(mutable_char_buffer));
+ socket1.send(buffer(const_char_buffer));
+ socket1.send(null_buffers());
+ socket1.send(buffer(mutable_char_buffer), in_flags);
+ socket1.send(buffer(const_char_buffer), in_flags);
+ socket1.send(null_buffers(), in_flags);
+ socket1.send(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.send(buffer(const_char_buffer), in_flags, ec);
+ socket1.send(null_buffers(), in_flags, ec);
+
+ socket1.async_send(buffer(mutable_char_buffer), send_handler);
+ socket1.async_send(buffer(const_char_buffer), send_handler);
+ socket1.async_send(null_buffers(), send_handler);
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler);
+ socket1.async_send(buffer(const_char_buffer), in_flags, send_handler);
+ socket1.async_send(null_buffers(), in_flags, send_handler);
+ socket1.async_send(buffer(mutable_char_buffer), immediate);
+ socket1.async_send(buffer(const_char_buffer), immediate);
+ socket1.async_send(null_buffers(), immediate);
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, immediate);
+ socket1.async_send(buffer(const_char_buffer), in_flags, immediate);
+ socket1.async_send(null_buffers(), in_flags, immediate);
+
+ socket1.send_to(buffer(mutable_char_buffer),
+ rp::endpoint());
+ socket1.send_to(buffer(const_char_buffer),
+ rp::endpoint());
+ socket1.send_to(null_buffers(),
+ rp::endpoint());
+ socket1.send_to(buffer(mutable_char_buffer),
+ rp::endpoint(), in_flags);
+ socket1.send_to(buffer(const_char_buffer),
+ rp::endpoint(), in_flags);
+ socket1.send_to(null_buffers(),
+ rp::endpoint(), in_flags);
+ socket1.send_to(buffer(mutable_char_buffer),
+ rp::endpoint(), in_flags, ec);
+ socket1.send_to(buffer(const_char_buffer),
+ rp::endpoint(), in_flags, ec);
+ socket1.send_to(null_buffers(),
+ rp::endpoint(), in_flags, ec);
+
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ rp::endpoint(), send_handler);
+ socket1.async_send_to(buffer(const_char_buffer),
+ rp::endpoint(), send_handler);
+ socket1.async_send_to(null_buffers(),
+ rp::endpoint(), send_handler);
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ rp::endpoint(), in_flags, send_handler);
+ socket1.async_send_to(buffer(const_char_buffer),
+ rp::endpoint(), in_flags, send_handler);
+ socket1.async_send_to(null_buffers(),
+ rp::endpoint(), in_flags, send_handler);
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ rp::endpoint(), immediate);
+ socket1.async_send_to(buffer(const_char_buffer),
+ rp::endpoint(), immediate);
+ socket1.async_send_to(null_buffers(),
+ rp::endpoint(), immediate);
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ rp::endpoint(), in_flags, immediate);
+ socket1.async_send_to(buffer(const_char_buffer),
+ rp::endpoint(), in_flags, immediate);
+ socket1.async_send_to(null_buffers(),
+ rp::endpoint(), in_flags, immediate);
+
+ socket1.receive(buffer(mutable_char_buffer));
+ socket1.receive(null_buffers());
+ socket1.receive(buffer(mutable_char_buffer), in_flags);
+ socket1.receive(null_buffers(), in_flags);
+ socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.receive(null_buffers(), in_flags, ec);
+
+ socket1.async_receive(buffer(mutable_char_buffer), receive_handler);
+ socket1.async_receive(null_buffers(), receive_handler);
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags,
+ receive_handler);
+ socket1.async_receive(null_buffers(), in_flags, receive_handler);
+ socket1.async_receive(buffer(mutable_char_buffer), immediate);
+ socket1.async_receive(null_buffers(), immediate);
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags,
+ immediate);
+ socket1.async_receive(null_buffers(), in_flags, immediate);
+
+ rp::endpoint endpoint;
+ socket1.receive_from(buffer(mutable_char_buffer), endpoint);
+ socket1.receive_from(null_buffers(), endpoint);
+ socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags);
+ socket1.receive_from(null_buffers(), endpoint, in_flags);
+ socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags, ec);
+ socket1.receive_from(null_buffers(), endpoint, in_flags, ec);
+
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, receive_handler);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, receive_handler);
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, in_flags, receive_handler);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, in_flags, receive_handler);
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, immediate);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, immediate);
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, in_flags, immediate);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, in_flags, immediate);
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace generic_raw_protocol_socket_compile
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "generic/raw_protocol",
+ ASIO_COMPILE_TEST_CASE(generic_raw_protocol_socket_compile::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/generic/seq_packet_protocol.cpp b/3rdparty/asio/src/tests/unit/generic/seq_packet_protocol.cpp
new file mode 100644
index 00000000000..587445b1f05
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/generic/seq_packet_protocol.cpp
@@ -0,0 +1,212 @@
+//
+// generic/seq_packet_protocol.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/generic/seq_packet_protocol.hpp"
+
+#include <cstring>
+#include "asio/io_context.hpp"
+#include "../unit_test.hpp"
+#include "../archetypes/async_result.hpp"
+
+#if defined(__cplusplus_cli) || defined(__cplusplus_winrt)
+# define generic cpp_generic
+#endif
+
+//------------------------------------------------------------------------------
+
+// generic_seq_packet_protocol_socket_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// generic::seq_packet_socket::socket compile and link correctly. Runtime
+// failures are ignored.
+
+namespace generic_seq_packet_protocol_socket_compile {
+
+void connect_handler(const asio::error_code&)
+{
+}
+
+void send_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void receive_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void test()
+{
+ using namespace asio;
+ namespace generic = asio::generic;
+ typedef generic::seq_packet_protocol spp;
+
+ const int af_inet = ASIO_OS_DEF(AF_INET);
+ const int sock_seqpacket = ASIO_OS_DEF(SOCK_SEQPACKET);
+
+ try
+ {
+ io_context ioc;
+ char mutable_char_buffer[128] = "";
+ const char const_char_buffer[128] = "";
+ const socket_base::message_flags in_flags = 0;
+ socket_base::message_flags out_flags = 0;
+ socket_base::send_buffer_size socket_option;
+ socket_base::bytes_readable io_control_command;
+ archetypes::immediate_handler immediate;
+ asio::error_code ec;
+
+ // basic_seq_packet_socket constructors.
+
+ spp::socket socket1(ioc);
+ spp::socket socket2(ioc, spp(af_inet, 0));
+ spp::socket socket3(ioc, spp::endpoint());
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ spp::socket::native_handle_type native_socket1
+ = ::socket(af_inet, sock_seqpacket, 0);
+ spp::socket socket4(ioc, spp(af_inet, 0), native_socket1);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ spp::socket socket5(std::move(socket4));
+
+ // basic_seq_packet_socket operators.
+
+ socket1 = spp::socket(ioc);
+ socket1 = std::move(socket2);
+
+ // basic_io_object functions.
+
+ spp::socket::executor_type ex = socket1.get_executor();
+ (void)ex;
+
+ // basic_socket functions.
+
+ spp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
+ (void)lowest_layer;
+
+ socket1.open(spp(af_inet, 0));
+ socket1.open(spp(af_inet, 0), ec);
+
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ spp::socket::native_handle_type native_socket2
+ = ::socket(af_inet, sock_seqpacket, 0);
+ socket1.assign(spp(af_inet, 0), native_socket2);
+ spp::socket::native_handle_type native_socket3
+ = ::socket(af_inet, sock_seqpacket, 0);
+ socket1.assign(spp(af_inet, 0), native_socket3, ec);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ bool is_open = socket1.is_open();
+ (void)is_open;
+
+ socket1.close();
+ socket1.close(ec);
+
+ spp::socket::native_handle_type native_socket4 = socket1.native_handle();
+ (void)native_socket4;
+
+ socket1.cancel();
+ socket1.cancel(ec);
+
+ bool at_mark1 = socket1.at_mark();
+ (void)at_mark1;
+ bool at_mark2 = socket1.at_mark(ec);
+ (void)at_mark2;
+
+ std::size_t available1 = socket1.available();
+ (void)available1;
+ std::size_t available2 = socket1.available(ec);
+ (void)available2;
+
+ socket1.bind(spp::endpoint());
+ socket1.bind(spp::endpoint(), ec);
+
+ socket1.connect(spp::endpoint());
+ socket1.connect(spp::endpoint(), ec);
+
+ socket1.async_connect(spp::endpoint(), connect_handler);
+ socket1.async_connect(spp::endpoint(), immediate);
+
+ socket1.set_option(socket_option);
+ socket1.set_option(socket_option, ec);
+
+ socket1.get_option(socket_option);
+ socket1.get_option(socket_option, ec);
+
+ socket1.io_control(io_control_command);
+ socket1.io_control(io_control_command, ec);
+
+ spp::endpoint endpoint1 = socket1.local_endpoint();
+ (void)endpoint1;
+ spp::endpoint endpoint2 = socket1.local_endpoint(ec);
+ (void)endpoint2;
+
+ spp::endpoint endpoint3 = socket1.remote_endpoint();
+ (void)endpoint3;
+ spp::endpoint endpoint4 = socket1.remote_endpoint(ec);
+ (void)endpoint4;
+
+ socket1.shutdown(socket_base::shutdown_both);
+ socket1.shutdown(socket_base::shutdown_both, ec);
+
+ // basic_seq_packet_socket functions.
+
+ socket1.send(buffer(mutable_char_buffer), in_flags);
+ socket1.send(buffer(const_char_buffer), in_flags);
+ socket1.send(null_buffers(), in_flags);
+ socket1.send(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.send(buffer(const_char_buffer), in_flags, ec);
+ socket1.send(null_buffers(), in_flags, ec);
+
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler);
+ socket1.async_send(buffer(const_char_buffer), in_flags, send_handler);
+ socket1.async_send(null_buffers(), in_flags, send_handler);
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, immediate);
+ socket1.async_send(buffer(const_char_buffer), in_flags, immediate);
+ socket1.async_send(null_buffers(), in_flags, immediate);
+
+ socket1.receive(buffer(mutable_char_buffer), out_flags);
+ socket1.receive(null_buffers(), out_flags);
+ socket1.receive(buffer(mutable_char_buffer), in_flags, out_flags);
+ socket1.receive(null_buffers(), in_flags, out_flags);
+ socket1.receive(buffer(mutable_char_buffer), in_flags, out_flags, ec);
+ socket1.receive(null_buffers(), in_flags, out_flags, ec);
+
+ socket1.async_receive(buffer(mutable_char_buffer), out_flags,
+ receive_handler);
+ socket1.async_receive(null_buffers(), out_flags, receive_handler);
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags,
+ out_flags, receive_handler);
+ socket1.async_receive(null_buffers(), in_flags, out_flags, receive_handler);
+ socket1.async_receive(buffer(mutable_char_buffer), out_flags, immediate);
+ socket1.async_receive(null_buffers(), out_flags, immediate);
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags,
+ out_flags, immediate);
+ socket1.async_receive(null_buffers(), in_flags, out_flags, immediate);
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace generic_seq_packet_protocol_socket_compile
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "generic/seq_packet_protocol",
+ ASIO_COMPILE_TEST_CASE(generic_seq_packet_protocol_socket_compile::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/generic/stream_protocol.cpp b/3rdparty/asio/src/tests/unit/generic/stream_protocol.cpp
new file mode 100644
index 00000000000..dedf6d76cee
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/generic/stream_protocol.cpp
@@ -0,0 +1,263 @@
+//
+// generic/stream_protocol.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/generic/stream_protocol.hpp"
+
+#include <cstring>
+#include "asio/io_context.hpp"
+#include "asio/ip/tcp.hpp"
+#include "../unit_test.hpp"
+#include "../archetypes/async_result.hpp"
+
+#if defined(__cplusplus_cli) || defined(__cplusplus_winrt)
+# define generic cpp_generic
+#endif
+
+//------------------------------------------------------------------------------
+
+// generic_stream_protocol_socket_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// generic::stream_protocol::socket compile and link correctly. Runtime
+// failures are ignored.
+
+namespace generic_stream_protocol_socket_compile {
+
+void connect_handler(const asio::error_code&)
+{
+}
+
+void send_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void receive_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void write_some_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void read_some_handler(const asio::error_code&, std::size_t)
+{
+}
+
+void test()
+{
+ using namespace asio;
+ namespace generic = asio::generic;
+ typedef generic::stream_protocol sp;
+
+ const int af_inet = ASIO_OS_DEF(AF_INET);
+ const int ipproto_tcp = ASIO_OS_DEF(IPPROTO_TCP);
+ const int sock_stream = ASIO_OS_DEF(SOCK_STREAM);
+
+ try
+ {
+ io_context ioc;
+ char mutable_char_buffer[128] = "";
+ const char const_char_buffer[128] = "";
+ socket_base::message_flags in_flags = 0;
+ socket_base::keep_alive socket_option;
+ socket_base::bytes_readable io_control_command;
+ archetypes::immediate_handler immediate;
+ asio::error_code ec;
+
+ // basic_stream_socket constructors.
+
+ sp::socket socket1(ioc);
+ sp::socket socket2(ioc, sp(af_inet, ipproto_tcp));
+ sp::socket socket3(ioc, sp::endpoint());
+#if defined(ASIO_WINDOWS_RUNTIME)
+ Windows::Networking::Sockets::StreamSocket^ native_socket1 = nullptr;
+#else // defined(ASIO_WINDOWS_RUNTIME)
+ sp::socket::native_handle_type native_socket1
+ = ::socket(af_inet, sock_stream, 0);
+#endif // defined(ASIO_WINDOWS_RUNTIME)
+ sp::socket socket4(ioc, sp(af_inet, ipproto_tcp), native_socket1);
+
+ sp::socket socket5(std::move(socket4));
+ asio::ip::tcp::socket tcp_socket(ioc);
+ sp::socket socket6(std::move(tcp_socket));
+
+ // basic_stream_socket operators.
+
+ socket1 = sp::socket(ioc);
+ socket1 = std::move(socket2);
+ socket1 = asio::ip::tcp::socket(ioc);
+
+ // basic_io_object functions.
+
+ sp::socket::executor_type ex = socket1.get_executor();
+ (void)ex;
+
+ // basic_socket functions.
+
+ sp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
+ (void)lowest_layer;
+
+ socket1.open(sp(af_inet, ipproto_tcp));
+ socket1.open(sp(af_inet, ipproto_tcp), ec);
+
+#if defined(ASIO_WINDOWS_RUNTIME)
+ Windows::Networking::Sockets::StreamSocket^ native_socket2 = nullptr;
+#else // defined(ASIO_WINDOWS_RUNTIME)
+ sp::socket::native_handle_type native_socket2
+ = ::socket(af_inet, sock_stream, 0);
+#endif // defined(ASIO_WINDOWS_RUNTIME)
+ socket1.assign(sp(af_inet, ipproto_tcp), native_socket2);
+#if defined(ASIO_WINDOWS_RUNTIME)
+ Windows::Networking::Sockets::StreamSocket^ native_socket3 = nullptr;
+#else // defined(ASIO_WINDOWS_RUNTIME)
+ sp::socket::native_handle_type native_socket3
+ = ::socket(af_inet, sock_stream, 0);
+#endif // defined(ASIO_WINDOWS_RUNTIME)
+ socket1.assign(sp(af_inet, ipproto_tcp), native_socket3, ec);
+
+ bool is_open = socket1.is_open();
+ (void)is_open;
+
+ socket1.close();
+ socket1.close(ec);
+
+ sp::socket::native_handle_type native_socket4 = socket1.native_handle();
+ (void)native_socket4;
+
+ socket1.cancel();
+ socket1.cancel(ec);
+
+ bool at_mark1 = socket1.at_mark();
+ (void)at_mark1;
+ bool at_mark2 = socket1.at_mark(ec);
+ (void)at_mark2;
+
+ std::size_t available1 = socket1.available();
+ (void)available1;
+ std::size_t available2 = socket1.available(ec);
+ (void)available2;
+
+ socket1.bind(sp::endpoint());
+ socket1.bind(sp::endpoint(), ec);
+
+ socket1.connect(sp::endpoint());
+ socket1.connect(sp::endpoint(), ec);
+
+ socket1.async_connect(sp::endpoint(), connect_handler);
+ socket1.async_connect(sp::endpoint(), immediate);
+
+ socket1.set_option(socket_option);
+ socket1.set_option(socket_option, ec);
+
+ socket1.get_option(socket_option);
+ socket1.get_option(socket_option, ec);
+
+ socket1.io_control(io_control_command);
+ socket1.io_control(io_control_command, ec);
+
+ sp::endpoint endpoint1 = socket1.local_endpoint();
+ (void)endpoint1;
+ sp::endpoint endpoint2 = socket1.local_endpoint(ec);
+ (void)endpoint2;
+
+ sp::endpoint endpoint3 = socket1.remote_endpoint();
+ (void)endpoint3;
+ sp::endpoint endpoint4 = socket1.remote_endpoint(ec);
+ (void)endpoint4;
+
+ socket1.shutdown(socket_base::shutdown_both);
+ socket1.shutdown(socket_base::shutdown_both, ec);
+
+ // basic_stream_socket functions.
+
+ socket1.send(buffer(mutable_char_buffer));
+ socket1.send(buffer(const_char_buffer));
+ socket1.send(null_buffers());
+ socket1.send(buffer(mutable_char_buffer), in_flags);
+ socket1.send(buffer(const_char_buffer), in_flags);
+ socket1.send(null_buffers(), in_flags);
+ socket1.send(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.send(buffer(const_char_buffer), in_flags, ec);
+ socket1.send(null_buffers(), in_flags, ec);
+
+ socket1.async_send(buffer(mutable_char_buffer), send_handler);
+ socket1.async_send(buffer(const_char_buffer), send_handler);
+ socket1.async_send(null_buffers(), send_handler);
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler);
+ socket1.async_send(buffer(const_char_buffer), in_flags, send_handler);
+ socket1.async_send(null_buffers(), in_flags, send_handler);
+ socket1.async_send(buffer(mutable_char_buffer), immediate);
+ socket1.async_send(buffer(const_char_buffer), immediate);
+ socket1.async_send(null_buffers(), immediate);
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, immediate);
+ socket1.async_send(buffer(const_char_buffer), in_flags, immediate);
+ socket1.async_send(null_buffers(), in_flags, immediate);
+
+ socket1.receive(buffer(mutable_char_buffer));
+ socket1.receive(null_buffers());
+ socket1.receive(buffer(mutable_char_buffer), in_flags);
+ socket1.receive(null_buffers(), in_flags);
+ socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.receive(null_buffers(), in_flags, ec);
+
+ socket1.async_receive(buffer(mutable_char_buffer), receive_handler);
+ socket1.async_receive(null_buffers(), receive_handler);
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags,
+ receive_handler);
+ socket1.async_receive(null_buffers(), in_flags, receive_handler);
+ socket1.async_receive(buffer(mutable_char_buffer), immediate);
+ socket1.async_receive(null_buffers(), immediate);
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags,
+ immediate);
+ socket1.async_receive(null_buffers(), in_flags, immediate);
+
+ socket1.write_some(buffer(mutable_char_buffer));
+ socket1.write_some(buffer(const_char_buffer));
+ socket1.write_some(null_buffers());
+ socket1.write_some(buffer(mutable_char_buffer), ec);
+ socket1.write_some(buffer(const_char_buffer), ec);
+ socket1.write_some(null_buffers(), ec);
+
+ socket1.async_write_some(buffer(mutable_char_buffer), write_some_handler);
+ socket1.async_write_some(buffer(const_char_buffer), write_some_handler);
+ socket1.async_write_some(null_buffers(), write_some_handler);
+ socket1.async_write_some(buffer(mutable_char_buffer), immediate);
+ socket1.async_write_some(buffer(const_char_buffer), immediate);
+ socket1.async_write_some(null_buffers(), immediate);
+
+ socket1.read_some(buffer(mutable_char_buffer));
+ socket1.read_some(buffer(mutable_char_buffer), ec);
+ socket1.read_some(null_buffers(), ec);
+
+ socket1.async_read_some(buffer(mutable_char_buffer), read_some_handler);
+ socket1.async_read_some(null_buffers(), read_some_handler);
+ socket1.async_read_some(buffer(mutable_char_buffer), immediate);
+ socket1.async_read_some(null_buffers(), immediate);
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace generic_stream_protocol_socket_compile
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "generic/stream_protocol",
+ ASIO_COMPILE_TEST_CASE(generic_stream_protocol_socket_compile::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/high_resolution_timer.cpp b/3rdparty/asio/src/tests/unit/high_resolution_timer.cpp
new file mode 100644
index 00000000000..b8dd448c321
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/high_resolution_timer.cpp
@@ -0,0 +1,30 @@
+//
+// high_resolution_timer.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Prevent link dependency on the Boost.System library.
+#if !defined(BOOST_SYSTEM_NO_DEPRECATED)
+#define BOOST_SYSTEM_NO_DEPRECATED
+#endif // !defined(BOOST_SYSTEM_NO_DEPRECATED)
+
+// Test that header file is self-contained.
+#include "asio/high_resolution_timer.hpp"
+
+#include "unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "high_resolution_timer",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/io_context.cpp b/3rdparty/asio/src/tests/unit/io_context.cpp
new file mode 100644
index 00000000000..4341fb62e1e
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/io_context.cpp
@@ -0,0 +1,566 @@
+//
+// io_context.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/io_context.hpp"
+
+#include <functional>
+#include <sstream>
+#include "asio/bind_executor.hpp"
+#include "asio/dispatch.hpp"
+#include "asio/post.hpp"
+#include "asio/thread.hpp"
+#include "unit_test.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)
+
+using namespace asio;
+namespace bindns = std;
+
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+typedef deadline_timer timer;
+namespace chronons = boost::posix_time;
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
+typedef steady_timer timer;
+namespace chronons = asio::chrono;
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+
+void increment(int* count)
+{
+ ++(*count);
+}
+
+void decrement_to_zero(io_context* ioc, int* count)
+{
+ if (*count > 0)
+ {
+ --(*count);
+
+ int before_value = *count;
+ asio::post(*ioc, bindns::bind(decrement_to_zero, ioc, count));
+
+ // Handler execution cannot nest, so count value should remain unchanged.
+ ASIO_CHECK(*count == before_value);
+ }
+}
+
+void nested_decrement_to_zero(io_context* ioc, int* count)
+{
+ if (*count > 0)
+ {
+ --(*count);
+
+ asio::dispatch(*ioc,
+ bindns::bind(nested_decrement_to_zero, ioc, count));
+
+ // Handler execution is nested, so count value should now be zero.
+ ASIO_CHECK(*count == 0);
+ }
+}
+
+void sleep_increment(io_context* ioc, int* count)
+{
+ timer t(*ioc, chronons::seconds(2));
+ t.wait();
+
+ if (++(*count) < 3)
+ asio::post(*ioc, bindns::bind(sleep_increment, ioc, count));
+}
+
+void start_sleep_increments(io_context* ioc, int* count)
+{
+ // Give all threads a chance to start.
+ timer t(*ioc, chronons::seconds(2));
+ t.wait();
+
+ // Start the first of three increments.
+ asio::post(*ioc, bindns::bind(sleep_increment, ioc, count));
+}
+
+void throw_exception()
+{
+ throw 1;
+}
+
+void io_context_run(io_context* ioc)
+{
+ ioc->run();
+}
+
+void io_context_test()
+{
+ io_context ioc;
+ int count = 0;
+
+ asio::post(ioc, bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ ioc.restart();
+ asio::post(ioc, bindns::bind(increment, &count));
+ asio::post(ioc, bindns::bind(increment, &count));
+ asio::post(ioc, bindns::bind(increment, &count));
+ asio::post(ioc, bindns::bind(increment, &count));
+ asio::post(ioc, bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 5);
+
+ count = 0;
+ ioc.restart();
+ executor_work_guard<io_context::executor_type> w = make_work_guard(ioc);
+ asio::post(ioc, bindns::bind(&io_context::stop, &ioc));
+ ASIO_CHECK(!ioc.stopped());
+ ioc.run();
+
+ // The only operation executed should have been to stop run().
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.restart();
+ asio::post(ioc, bindns::bind(increment, &count));
+ w.reset();
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+
+ count = 10;
+ ioc.restart();
+ asio::post(ioc, bindns::bind(decrement_to_zero, &ioc, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 10);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ count = 10;
+ ioc.restart();
+ asio::post(ioc, bindns::bind(nested_decrement_to_zero, &ioc, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 10);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ count = 10;
+ ioc.restart();
+ asio::dispatch(ioc,
+ bindns::bind(nested_decrement_to_zero, &ioc, &count));
+
+ // No handlers can be called until run() is called, even though nested
+ // delivery was specifically allowed in the previous call.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 10);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ count = 0;
+ int count2 = 0;
+ ioc.restart();
+ ASIO_CHECK(!ioc.stopped());
+ asio::post(ioc, bindns::bind(start_sleep_increments, &ioc, &count));
+ asio::post(ioc, bindns::bind(start_sleep_increments, &ioc, &count2));
+ thread thread1(bindns::bind(io_context_run, &ioc));
+ thread thread2(bindns::bind(io_context_run, &ioc));
+ thread1.join();
+ thread2.join();
+
+ // The run() calls will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 3);
+ ASIO_CHECK(count2 == 3);
+
+ count = 10;
+ io_context ioc2;
+ asio::dispatch(ioc, asio::bind_executor(ioc2,
+ bindns::bind(decrement_to_zero, &ioc2, &count)));
+ ioc.restart();
+ ASIO_CHECK(!ioc.stopped());
+ ioc.run();
+
+ // No decrement_to_zero handlers can be called until run() is called on the
+ // second io_context object.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 10);
+
+ ioc2.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(count == 0);
+
+ count = 0;
+ int exception_count = 0;
+ ioc.restart();
+ asio::post(ioc, &throw_exception);
+ asio::post(ioc, bindns::bind(increment, &count));
+ asio::post(ioc, bindns::bind(increment, &count));
+ asio::post(ioc, &throw_exception);
+ asio::post(ioc, bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+ ASIO_CHECK(exception_count == 0);
+
+ for (;;)
+ {
+ try
+ {
+ ioc.run();
+ break;
+ }
+ catch (int)
+ {
+ ++exception_count;
+ }
+ }
+
+ // The run() calls will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 3);
+ ASIO_CHECK(exception_count == 2);
+}
+
+class test_service : public asio::io_context::service
+{
+public:
+ static asio::io_context::id id;
+ test_service(asio::io_context& s)
+ : asio::io_context::service(s) {}
+private:
+ virtual void shutdown_service() {}
+};
+
+asio::io_context::id test_service::id;
+
+void io_context_service_test()
+{
+ asio::io_context ioc1;
+ asio::io_context ioc2;
+ asio::io_context ioc3;
+
+ // Implicit service registration.
+
+ asio::use_service<test_service>(ioc1);
+
+ ASIO_CHECK(asio::has_service<test_service>(ioc1));
+
+ test_service* svc1 = new test_service(ioc1);
+ try
+ {
+ asio::add_service(ioc1, svc1);
+ ASIO_ERROR("add_service did not throw");
+ }
+ catch (asio::service_already_exists&)
+ {
+ }
+ delete svc1;
+
+ // Explicit service registration.
+
+ test_service* svc2 = new test_service(ioc2);
+ asio::add_service(ioc2, svc2);
+
+ ASIO_CHECK(asio::has_service<test_service>(ioc2));
+ ASIO_CHECK(&asio::use_service<test_service>(ioc2) == svc2);
+
+ test_service* svc3 = new test_service(ioc2);
+ try
+ {
+ asio::add_service(ioc2, svc3);
+ ASIO_ERROR("add_service did not throw");
+ }
+ catch (asio::service_already_exists&)
+ {
+ }
+ delete svc3;
+
+ // Explicit registration with invalid owner.
+
+ test_service* svc4 = new test_service(ioc2);
+ try
+ {
+ asio::add_service(ioc3, svc4);
+ ASIO_ERROR("add_service did not throw");
+ }
+ catch (asio::invalid_service_owner&)
+ {
+ }
+ delete svc4;
+
+ ASIO_CHECK(!asio::has_service<test_service>(ioc3));
+}
+
+void io_context_executor_query_test()
+{
+ io_context ioc;
+
+ ASIO_CHECK(
+ &asio::query(ioc.get_executor(),
+ asio::execution::context)
+ == &ioc);
+
+ ASIO_CHECK(
+ asio::query(ioc.get_executor(),
+ asio::execution::blocking)
+ == asio::execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ioc.get_executor(),
+ asio::execution::blocking.possibly)
+ == asio::execution::blocking.possibly);
+
+ ASIO_CHECK(
+ asio::query(ioc.get_executor(),
+ asio::execution::outstanding_work)
+ == asio::execution::outstanding_work.untracked);
+
+ ASIO_CHECK(
+ asio::query(ioc.get_executor(),
+ asio::execution::outstanding_work.untracked)
+ == asio::execution::outstanding_work.untracked);
+
+ ASIO_CHECK(
+ asio::query(ioc.get_executor(),
+ asio::execution::relationship)
+ == asio::execution::relationship.fork);
+
+ ASIO_CHECK(
+ asio::query(ioc.get_executor(),
+ asio::execution::relationship.fork)
+ == asio::execution::relationship.fork);
+
+ ASIO_CHECK(
+ asio::query(ioc.get_executor(),
+ asio::execution::mapping)
+ == asio::execution::mapping.thread);
+
+ ASIO_CHECK(
+ asio::query(ioc.get_executor(),
+ asio::execution::allocator)
+ == std::allocator<void>());
+}
+
+void io_context_executor_execute_test()
+{
+ io_context ioc;
+ int count = 0;
+
+ ioc.get_executor().execute(bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ ioc.restart();
+ asio::require(ioc.get_executor(),
+ asio::execution::blocking.possibly
+ ).execute(bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ ioc.restart();
+ asio::require(ioc.get_executor(),
+ asio::execution::blocking.never
+ ).execute(bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ ioc.restart();
+ ASIO_CHECK(!ioc.stopped());
+
+ asio::require(ioc.get_executor(),
+ asio::execution::blocking.never,
+ asio::execution::outstanding_work.tracked
+ ).execute(bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ ioc.restart();
+ asio::require(ioc.get_executor(),
+ asio::execution::blocking.never,
+ asio::execution::outstanding_work.untracked
+ ).execute(bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ ioc.restart();
+ asio::require(ioc.get_executor(),
+ asio::execution::blocking.never,
+ asio::execution::outstanding_work.untracked,
+ asio::execution::relationship.fork
+ ).execute(bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ ioc.restart();
+ asio::require(ioc.get_executor(),
+ asio::execution::blocking.never,
+ asio::execution::outstanding_work.untracked,
+ asio::execution::relationship.continuation
+ ).execute(bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ ioc.restart();
+ asio::prefer(
+ asio::require(ioc.get_executor(),
+ asio::execution::blocking.never,
+ asio::execution::outstanding_work.untracked,
+ asio::execution::relationship.continuation),
+ asio::execution::allocator(std::allocator<void>())
+ ).execute(bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ ioc.restart();
+ asio::prefer(
+ asio::require(ioc.get_executor(),
+ asio::execution::blocking.never,
+ asio::execution::outstanding_work.untracked,
+ asio::execution::relationship.continuation),
+ asio::execution::allocator
+ ).execute(bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(!ioc.stopped());
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(ioc.stopped());
+ ASIO_CHECK(count == 1);
+}
+
+ASIO_TEST_SUITE
+(
+ "io_context",
+ ASIO_TEST_CASE(io_context_test)
+ ASIO_TEST_CASE(io_context_service_test)
+ ASIO_TEST_CASE(io_context_executor_query_test)
+ ASIO_TEST_CASE(io_context_executor_execute_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/io_context_strand.cpp b/3rdparty/asio/src/tests/unit/io_context_strand.cpp
new file mode 100644
index 00000000000..be03eb40dd2
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/io_context_strand.cpp
@@ -0,0 +1,316 @@
+//
+// io_context_strand.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/io_context_strand.hpp"
+
+#include <functional>
+#include <sstream>
+#include "asio/io_context.hpp"
+#include "asio/dispatch.hpp"
+#include "asio/post.hpp"
+#include "asio/thread.hpp"
+#include "unit_test.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)
+
+using namespace asio;
+
+namespace bindns = std;
+
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+typedef deadline_timer timer;
+namespace chronons = boost::posix_time;
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
+typedef steady_timer timer;
+namespace chronons = asio::chrono;
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+
+void increment(int* count)
+{
+ ++(*count);
+}
+
+void increment_without_lock(io_context::strand* s, int* count)
+{
+ ASIO_CHECK(!s->running_in_this_thread());
+
+ int original_count = *count;
+
+ dispatch(*s, bindns::bind(increment, count));
+
+ // No other functions are currently executing through the locking dispatcher,
+ // so the previous call to dispatch should have successfully nested.
+ ASIO_CHECK(*count == original_count + 1);
+}
+
+void increment_with_lock(io_context::strand* s, int* count)
+{
+ ASIO_CHECK(s->running_in_this_thread());
+
+ int original_count = *count;
+
+ dispatch(*s, bindns::bind(increment, count));
+
+ // The current function already holds the strand's lock, so the
+ // previous call to dispatch should have successfully nested.
+ ASIO_CHECK(*count == original_count + 1);
+}
+
+void sleep_increment(io_context* ioc, int* count)
+{
+ timer t(*ioc, chronons::seconds(2));
+ t.wait();
+
+ ++(*count);
+}
+
+void increment_by_a(int* count, int a)
+{
+ (*count) += a;
+}
+
+void increment_by_a_b(int* count, int a, int b)
+{
+ (*count) += a + b;
+}
+
+void increment_by_a_b_c(int* count, int a, int b, int c)
+{
+ (*count) += a + b + c;
+}
+
+void increment_by_a_b_c_d(int* count, int a, int b, int c, int d)
+{
+ (*count) += a + b + c + d;
+}
+
+void start_sleep_increments(io_context* ioc, io_context::strand* s, int* count)
+{
+ // Give all threads a chance to start.
+ timer t(*ioc, chronons::seconds(2));
+ t.wait();
+
+ // Start three increments.
+ post(*s, bindns::bind(sleep_increment, ioc, count));
+ post(*s, bindns::bind(sleep_increment, ioc, count));
+ post(*s, bindns::bind(sleep_increment, ioc, count));
+}
+
+void throw_exception()
+{
+ throw 1;
+}
+
+void io_context_run(io_context* ioc)
+{
+ ioc->run();
+}
+
+void strand_test()
+{
+ io_context ioc;
+ io_context::strand s(ioc);
+ int count = 0;
+
+ post(ioc, bindns::bind(increment_without_lock, &s, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ ioc.restart();
+ post(s, bindns::bind(increment_with_lock, &s, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(count == 0);
+
+ ioc.run();
+
+ // The run() call will not return until all work has finished.
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ ioc.restart();
+ post(ioc, bindns::bind(start_sleep_increments, &ioc, &s, &count));
+ thread thread1(bindns::bind(io_context_run, &ioc));
+ thread thread2(bindns::bind(io_context_run, &ioc));
+
+ // Check all events run one after another even though there are two threads.
+ timer timer1(ioc, chronons::seconds(3));
+ timer1.wait();
+ ASIO_CHECK(count == 0);
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+ timer1.expires_at(timer1.expires_at() + chronons::seconds(2));
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
+ timer1.expires_at(timer1.expiry() + chronons::seconds(2));
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+ timer1.wait();
+ ASIO_CHECK(count == 1);
+#if defined(ASIO_HAS_BOOST_DATE_TIME)
+ timer1.expires_at(timer1.expires_at() + chronons::seconds(2));
+#else // defined(ASIO_HAS_BOOST_DATE_TIME)
+ timer1.expires_at(timer1.expiry() + chronons::seconds(2));
+#endif // defined(ASIO_HAS_BOOST_DATE_TIME)
+ timer1.wait();
+ ASIO_CHECK(count == 2);
+
+ thread1.join();
+ thread2.join();
+
+ // The run() calls will not return until all work has finished.
+ ASIO_CHECK(count == 3);
+
+ count = 0;
+ int exception_count = 0;
+ ioc.restart();
+ post(s, throw_exception);
+ post(s, bindns::bind(increment, &count));
+ post(s, bindns::bind(increment, &count));
+ post(s, throw_exception);
+ post(s, bindns::bind(increment, &count));
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(count == 0);
+ ASIO_CHECK(exception_count == 0);
+
+ for (;;)
+ {
+ try
+ {
+ ioc.run();
+ break;
+ }
+ catch (int)
+ {
+ ++exception_count;
+ }
+ }
+
+ // The run() calls will not return until all work has finished.
+ ASIO_CHECK(count == 3);
+ ASIO_CHECK(exception_count == 2);
+
+ count = 0;
+ ioc.restart();
+
+ // Check for clean shutdown when handlers posted through an orphaned strand
+ // are abandoned.
+ {
+ io_context::strand s2(ioc);
+ post(s2, bindns::bind(increment, &count));
+ post(s2, bindns::bind(increment, &count));
+ post(s2, bindns::bind(increment, &count));
+ }
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(count == 0);
+}
+
+void strand_wrap_test()
+{
+#if !defined(ASIO_NO_DEPRECATED)
+ io_context ioc;
+ io_context::strand s(ioc);
+ int count = 0;
+
+ s.wrap(bindns::bind(increment, &count))();
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(count == 0);
+
+ ioc.restart();
+ ioc.run();
+
+ // The run() calls will not return until all work has finished.
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ s.wrap(increment)(&count);
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(count == 0);
+
+ ioc.restart();
+ ioc.run();
+
+ // The run() calls will not return until all work has finished.
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ s.wrap(increment_by_a)(&count, 1);
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(count == 0);
+
+ ioc.restart();
+ ioc.run();
+
+ // The run() calls will not return until all work has finished.
+ ASIO_CHECK(count == 1);
+
+ count = 0;
+ s.wrap(increment_by_a_b)(&count, 1, 2);
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(count == 0);
+
+ ioc.restart();
+ ioc.run();
+
+ // The run() calls will not return until all work has finished.
+ ASIO_CHECK(count == 3);
+
+ count = 0;
+ s.wrap(increment_by_a_b_c)(&count, 1, 2, 3);
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(count == 0);
+
+ ioc.restart();
+ ioc.run();
+
+ // The run() calls will not return until all work has finished.
+ ASIO_CHECK(count == 6);
+
+ count = 0;
+ s.wrap(increment_by_a_b_c_d)(&count, 1, 2, 3, 4);
+
+ // No handlers can be called until run() is called.
+ ASIO_CHECK(count == 0);
+
+ ioc.restart();
+ ioc.run();
+
+ // The run() calls will not return until all work has finished.
+ ASIO_CHECK(count == 10);
+#endif // !defined(ASIO_NO_DEPRECATED)
+}
+
+ASIO_TEST_SUITE
+(
+ "strand",
+ ASIO_TEST_CASE(strand_test)
+ ASIO_TEST_CASE(strand_wrap_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/address.cpp b/3rdparty/asio/src/tests/unit/ip/address.cpp
new file mode 100644
index 00000000000..a13a343c8e9
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/address.cpp
@@ -0,0 +1,147 @@
+//
+// address.cpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/address.hpp"
+
+#include "../unit_test.hpp"
+#include <sstream>
+
+//------------------------------------------------------------------------------
+
+// ip_address_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::address compile and link correctly. Runtime failures are ignored.
+
+namespace ip_address_compile {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ asio::error_code ec;
+
+ // address constructors.
+
+ ip::address addr1;
+ const ip::address_v4 const_addr_v4;
+ ip::address addr2(const_addr_v4);
+ const ip::address_v6 const_addr_v6;
+ ip::address addr3(const_addr_v6);
+
+ // address functions.
+
+ bool b = addr1.is_v4();
+ (void)b;
+
+ b = addr1.is_v6();
+ (void)b;
+
+ b = addr1.is_loopback();
+ (void)b;
+
+ b = addr1.is_unspecified();
+ (void)b;
+
+ b = addr1.is_multicast();
+ (void)b;
+
+ ip::address_v4 addr_v4_value = addr1.to_v4();
+ (void)addr_v4_value;
+
+ ip::address_v6 addr_v6_value = addr1.to_v6();
+ (void)addr_v6_value;
+
+ std::string string_value = addr1.to_string();
+#if !defined(ASIO_NO_DEPRECATED)
+ string_value = addr1.to_string(ec);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ // address static functions.
+
+#if !defined(ASIO_NO_DEPRECATED)
+ addr1 = ip::address::from_string("127.0.0.1");
+ addr1 = ip::address::from_string("127.0.0.1", ec);
+ addr1 = ip::address::from_string(string_value);
+ addr1 = ip::address::from_string(string_value, ec);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ // address comparisons.
+
+ b = (addr1 == addr2);
+ (void)b;
+
+ b = (addr1 != addr2);
+ (void)b;
+
+ b = (addr1 < addr2);
+ (void)b;
+
+ b = (addr1 > addr2);
+ (void)b;
+
+ b = (addr1 <= addr2);
+ (void)b;
+
+ b = (addr1 >= addr2);
+ (void)b;
+
+ // address creation functions.
+
+ addr1 = ip::make_address("127.0.0.1");
+ addr1 = ip::make_address("127.0.0.1", ec);
+ addr1 = ip::make_address(string_value);
+ addr1 = ip::make_address(string_value, ec);
+#if defined(ASIO_HAS_STRING_VIEW)
+# if defined(ASIO_HAS_STD_STRING_VIEW)
+ std::string_view string_view_value("127.0.0.1");
+# elif defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+ std::experimental::string_view string_view_value("127.0.0.1");
+# endif // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+ addr1 = ip::make_address(string_view_value);
+ addr1 = ip::make_address(string_view_value, ec);
+#endif // defined(ASIO_HAS_STRING_VIEW)
+
+ // address I/O.
+
+ std::ostringstream os;
+ os << addr1;
+
+#if !defined(BOOST_NO_STD_WSTREAMBUF)
+ std::wostringstream wos;
+ wos << addr1;
+#endif // !defined(BOOST_NO_STD_WSTREAMBUF)
+
+ std::size_t hash1 = std::hash<ip::address>()(addr1);
+ (void)hash1;
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_address_compile
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/address",
+ ASIO_COMPILE_TEST_CASE(ip_address_compile::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/address_v4.cpp b/3rdparty/asio/src/tests/unit/ip/address_v4.cpp
new file mode 100644
index 00000000000..6fb361b9544
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/address_v4.cpp
@@ -0,0 +1,329 @@
+//
+// address_v4.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/address_v4.hpp"
+
+#include "../unit_test.hpp"
+#include <sstream>
+
+//------------------------------------------------------------------------------
+
+// ip_address_v4_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::address_v4 compile and link correctly. Runtime failures are ignored.
+
+namespace ip_address_v4_compile {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ asio::error_code ec;
+
+ // address_v4 constructors.
+
+ ip::address_v4 addr1;
+ const ip::address_v4::bytes_type const_bytes_value = { { 127, 0, 0, 1 } };
+ ip::address_v4 addr2(const_bytes_value);
+ const unsigned long const_ulong_value = 0x7F000001;
+ ip::address_v4 addr3(const_ulong_value);
+
+ // address_v4 functions.
+
+ bool b = addr1.is_loopback();
+ (void)b;
+
+ b = addr1.is_unspecified();
+ (void)b;
+
+#if !defined(ASIO_NO_DEPRECATED)
+ b = addr1.is_class_a();
+ (void)b;
+
+ b = addr1.is_class_b();
+ (void)b;
+
+ b = addr1.is_class_c();
+ (void)b;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ b = addr1.is_multicast();
+ (void)b;
+
+ ip::address_v4::bytes_type bytes_value = addr1.to_bytes();
+ (void)bytes_value;
+
+ ip::address_v4::uint_type uint_value = addr1.to_uint();
+ (void)uint_value;
+
+#if !defined(ASIO_NO_DEPRECATED)
+ unsigned long ulong_value = addr1.to_ulong();
+ (void)ulong_value;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ std::string string_value = addr1.to_string();
+#if !defined(ASIO_NO_DEPRECATED)
+ string_value = addr1.to_string(ec);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ // address_v4 static functions.
+
+#if !defined(ASIO_NO_DEPRECATED)
+ addr1 = ip::address_v4::from_string("127.0.0.1");
+ addr1 = ip::address_v4::from_string("127.0.0.1", ec);
+ addr1 = ip::address_v4::from_string(string_value);
+ addr1 = ip::address_v4::from_string(string_value, ec);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ addr1 = ip::address_v4::any();
+
+ addr1 = ip::address_v4::loopback();
+
+ addr1 = ip::address_v4::broadcast();
+
+#if !defined(ASIO_NO_DEPRECATED)
+ addr1 = ip::address_v4::broadcast(addr2, addr3);
+
+ addr1 = ip::address_v4::netmask(addr2);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ // address_v4 comparisons.
+
+ b = (addr1 == addr2);
+ (void)b;
+
+ b = (addr1 != addr2);
+ (void)b;
+
+ b = (addr1 < addr2);
+ (void)b;
+
+ b = (addr1 > addr2);
+ (void)b;
+
+ b = (addr1 <= addr2);
+ (void)b;
+
+ b = (addr1 >= addr2);
+ (void)b;
+
+ // address_v4 creation functions.
+
+ addr1 = ip::make_address_v4(const_bytes_value);
+ addr1 = ip::make_address_v4(const_ulong_value);
+ addr1 = ip::make_address_v4("127.0.0.1");
+ addr1 = ip::make_address_v4("127.0.0.1", ec);
+ addr1 = ip::make_address_v4(string_value);
+ addr1 = ip::make_address_v4(string_value, ec);
+#if defined(ASIO_HAS_STRING_VIEW)
+# if defined(ASIO_HAS_STD_STRING_VIEW)
+ std::string_view string_view_value("127.0.0.1");
+# elif defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+ std::experimental::string_view string_view_value("127.0.0.1");
+# endif // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+ addr1 = ip::make_address_v4(string_view_value);
+ addr1 = ip::make_address_v4(string_view_value, ec);
+#endif // defined(ASIO_HAS_STRING_VIEW)
+
+ // address_v4 I/O.
+
+ std::ostringstream os;
+ os << addr1;
+
+#if !defined(BOOST_NO_STD_WSTREAMBUF)
+ std::wostringstream wos;
+ wos << addr1;
+#endif // !defined(BOOST_NO_STD_WSTREAMBUF)
+
+#if defined(ASIO_HAS_STD_HASH)
+ std::size_t hash1 = std::hash<ip::address_v4>()(addr1);
+ (void)hash1;
+#endif // defined(ASIO_HAS_STD_HASH)
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_address_v4_compile
+
+//------------------------------------------------------------------------------
+
+// ip_address_v4_runtime test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that the various public member functions meet the
+// necessary postconditions.
+
+namespace ip_address_v4_runtime {
+
+void test()
+{
+ using asio::ip::address_v4;
+
+ address_v4 a1;
+ ASIO_CHECK(a1.to_bytes()[0] == 0);
+ ASIO_CHECK(a1.to_bytes()[1] == 0);
+ ASIO_CHECK(a1.to_bytes()[2] == 0);
+ ASIO_CHECK(a1.to_bytes()[3] == 0);
+ ASIO_CHECK(a1.to_uint() == 0);
+#if !defined(ASIO_NO_DEPRECATED)
+ ASIO_CHECK(a1.to_ulong() == 0);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ address_v4::bytes_type b1 = {{ 1, 2, 3, 4 }};
+ address_v4 a2(b1);
+ ASIO_CHECK(a2.to_bytes()[0] == 1);
+ ASIO_CHECK(a2.to_bytes()[1] == 2);
+ ASIO_CHECK(a2.to_bytes()[2] == 3);
+ ASIO_CHECK(a2.to_bytes()[3] == 4);
+ ASIO_CHECK(((a2.to_uint() >> 24) & 0xFF) == b1[0]);
+ ASIO_CHECK(((a2.to_uint() >> 16) & 0xFF) == b1[1]);
+ ASIO_CHECK(((a2.to_uint() >> 8) & 0xFF) == b1[2]);
+ ASIO_CHECK((a2.to_uint() & 0xFF) == b1[3]);
+#if !defined(ASIO_NO_DEPRECATED)
+ ASIO_CHECK(((a2.to_ulong() >> 24) & 0xFF) == b1[0]);
+ ASIO_CHECK(((a2.to_ulong() >> 16) & 0xFF) == b1[1]);
+ ASIO_CHECK(((a2.to_ulong() >> 8) & 0xFF) == b1[2]);
+ ASIO_CHECK((a2.to_ulong() & 0xFF) == b1[3]);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ address_v4 a3(0x01020304);
+ ASIO_CHECK(a3.to_bytes()[0] == 1);
+ ASIO_CHECK(a3.to_bytes()[1] == 2);
+ ASIO_CHECK(a3.to_bytes()[2] == 3);
+ ASIO_CHECK(a3.to_bytes()[3] == 4);
+ ASIO_CHECK(a3.to_uint() == 0x01020304);
+#if !defined(ASIO_NO_DEPRECATED)
+ ASIO_CHECK(a3.to_ulong() == 0x01020304);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ ASIO_CHECK(address_v4(0x7F000001).is_loopback());
+ ASIO_CHECK(address_v4(0x7F000002).is_loopback());
+ ASIO_CHECK(!address_v4(0x00000000).is_loopback());
+ ASIO_CHECK(!address_v4(0x01020304).is_loopback());
+
+ ASIO_CHECK(address_v4(0x00000000).is_unspecified());
+ ASIO_CHECK(!address_v4(0x7F000001).is_unspecified());
+ ASIO_CHECK(!address_v4(0x01020304).is_unspecified());
+
+#if !defined(ASIO_NO_DEPRECATED)
+ ASIO_CHECK(address_v4(0x01000000).is_class_a());
+ ASIO_CHECK(address_v4(0x7F000000).is_class_a());
+ ASIO_CHECK(!address_v4(0x80000000).is_class_a());
+ ASIO_CHECK(!address_v4(0xBFFF0000).is_class_a());
+ ASIO_CHECK(!address_v4(0xC0000000).is_class_a());
+ ASIO_CHECK(!address_v4(0xDFFFFF00).is_class_a());
+ ASIO_CHECK(!address_v4(0xE0000000).is_class_a());
+ ASIO_CHECK(!address_v4(0xEFFFFFFF).is_class_a());
+ ASIO_CHECK(!address_v4(0xF0000000).is_class_a());
+ ASIO_CHECK(!address_v4(0xFFFFFFFF).is_class_a());
+
+ ASIO_CHECK(!address_v4(0x01000000).is_class_b());
+ ASIO_CHECK(!address_v4(0x7F000000).is_class_b());
+ ASIO_CHECK(address_v4(0x80000000).is_class_b());
+ ASIO_CHECK(address_v4(0xBFFF0000).is_class_b());
+ ASIO_CHECK(!address_v4(0xC0000000).is_class_b());
+ ASIO_CHECK(!address_v4(0xDFFFFF00).is_class_b());
+ ASIO_CHECK(!address_v4(0xE0000000).is_class_b());
+ ASIO_CHECK(!address_v4(0xEFFFFFFF).is_class_b());
+ ASIO_CHECK(!address_v4(0xF0000000).is_class_b());
+ ASIO_CHECK(!address_v4(0xFFFFFFFF).is_class_b());
+
+ ASIO_CHECK(!address_v4(0x01000000).is_class_c());
+ ASIO_CHECK(!address_v4(0x7F000000).is_class_c());
+ ASIO_CHECK(!address_v4(0x80000000).is_class_c());
+ ASIO_CHECK(!address_v4(0xBFFF0000).is_class_c());
+ ASIO_CHECK(address_v4(0xC0000000).is_class_c());
+ ASIO_CHECK(address_v4(0xDFFFFF00).is_class_c());
+ ASIO_CHECK(!address_v4(0xE0000000).is_class_c());
+ ASIO_CHECK(!address_v4(0xEFFFFFFF).is_class_c());
+ ASIO_CHECK(!address_v4(0xF0000000).is_class_c());
+ ASIO_CHECK(!address_v4(0xFFFFFFFF).is_class_c());
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ ASIO_CHECK(!address_v4(0x01000000).is_multicast());
+ ASIO_CHECK(!address_v4(0x7F000000).is_multicast());
+ ASIO_CHECK(!address_v4(0x80000000).is_multicast());
+ ASIO_CHECK(!address_v4(0xBFFF0000).is_multicast());
+ ASIO_CHECK(!address_v4(0xC0000000).is_multicast());
+ ASIO_CHECK(!address_v4(0xDFFFFF00).is_multicast());
+ ASIO_CHECK(address_v4(0xE0000000).is_multicast());
+ ASIO_CHECK(address_v4(0xEFFFFFFF).is_multicast());
+ ASIO_CHECK(!address_v4(0xF0000000).is_multicast());
+ ASIO_CHECK(!address_v4(0xFFFFFFFF).is_multicast());
+
+ address_v4 a4 = address_v4::any();
+ ASIO_CHECK(a4.to_bytes()[0] == 0);
+ ASIO_CHECK(a4.to_bytes()[1] == 0);
+ ASIO_CHECK(a4.to_bytes()[2] == 0);
+ ASIO_CHECK(a4.to_bytes()[3] == 0);
+ ASIO_CHECK(a4.to_uint() == 0);
+#if !defined(ASIO_NO_DEPRECATED)
+ ASIO_CHECK(a4.to_ulong() == 0);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ address_v4 a5 = address_v4::loopback();
+ ASIO_CHECK(a5.to_bytes()[0] == 0x7F);
+ ASIO_CHECK(a5.to_bytes()[1] == 0);
+ ASIO_CHECK(a5.to_bytes()[2] == 0);
+ ASIO_CHECK(a5.to_bytes()[3] == 0x01);
+ ASIO_CHECK(a5.to_uint() == 0x7F000001);
+#if !defined(ASIO_NO_DEPRECATED)
+ ASIO_CHECK(a5.to_ulong() == 0x7F000001);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ address_v4 a6 = address_v4::broadcast();
+ ASIO_CHECK(a6.to_bytes()[0] == 0xFF);
+ ASIO_CHECK(a6.to_bytes()[1] == 0xFF);
+ ASIO_CHECK(a6.to_bytes()[2] == 0xFF);
+ ASIO_CHECK(a6.to_bytes()[3] == 0xFF);
+ ASIO_CHECK(a6.to_uint() == 0xFFFFFFFF);
+#if !defined(ASIO_NO_DEPRECATED)
+ ASIO_CHECK(a6.to_ulong() == 0xFFFFFFFF);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+#if !defined(ASIO_NO_DEPRECATED)
+ address_v4 class_a_net(0xFF000000);
+ address_v4 class_b_net(0xFFFF0000);
+ address_v4 class_c_net(0xFFFFFF00);
+ address_v4 other_net(0xFFFFFFFF);
+ ASIO_CHECK(address_v4::netmask(address_v4(0x01000000)) == class_a_net);
+ ASIO_CHECK(address_v4::netmask(address_v4(0x7F000000)) == class_a_net);
+ ASIO_CHECK(address_v4::netmask(address_v4(0x80000000)) == class_b_net);
+ ASIO_CHECK(address_v4::netmask(address_v4(0xBFFF0000)) == class_b_net);
+ ASIO_CHECK(address_v4::netmask(address_v4(0xC0000000)) == class_c_net);
+ ASIO_CHECK(address_v4::netmask(address_v4(0xDFFFFF00)) == class_c_net);
+ ASIO_CHECK(address_v4::netmask(address_v4(0xE0000000)) == other_net);
+ ASIO_CHECK(address_v4::netmask(address_v4(0xEFFFFFFF)) == other_net);
+ ASIO_CHECK(address_v4::netmask(address_v4(0xF0000000)) == other_net);
+ ASIO_CHECK(address_v4::netmask(address_v4(0xFFFFFFFF)) == other_net);
+#endif // !defined(ASIO_NO_DEPRECATED)
+}
+
+} // namespace ip_address_v4_runtime
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/address_v4",
+ ASIO_COMPILE_TEST_CASE(ip_address_v4_compile::test)
+ ASIO_TEST_CASE(ip_address_v4_runtime::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/address_v4_iterator.cpp b/3rdparty/asio/src/tests/unit/ip/address_v4_iterator.cpp
new file mode 100644
index 00000000000..8b651b52582
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/address_v4_iterator.cpp
@@ -0,0 +1,27 @@
+//
+// address_v4_iterator.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/address_v4_iterator.hpp"
+
+#include "../unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/address_v4_iterator",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/address_v4_range.cpp b/3rdparty/asio/src/tests/unit/ip/address_v4_range.cpp
new file mode 100644
index 00000000000..1b36744cb53
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/address_v4_range.cpp
@@ -0,0 +1,27 @@
+//
+// address_v4_range.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/address_v4_range.hpp"
+
+#include "../unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/address_v4_range",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/address_v6.cpp b/3rdparty/asio/src/tests/unit/ip/address_v6.cpp
new file mode 100644
index 00000000000..026c5fa4f9a
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/address_v6.cpp
@@ -0,0 +1,414 @@
+//
+// address_v6.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/address_v6.hpp"
+
+#include "../unit_test.hpp"
+#include <sstream>
+
+//------------------------------------------------------------------------------
+
+// ip_address_v6_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::address_v6 compile and link correctly. Runtime failures are ignored.
+
+namespace ip_address_v6_compile {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ asio::error_code ec;
+
+ // address_v6 constructors.
+
+ ip::address_v6 addr1;
+ const ip::address_v6::bytes_type const_bytes_value = { { 0 } };
+ ip::address_v6 addr2(const_bytes_value);
+
+ // address_v6 functions.
+
+ unsigned long scope_id = addr1.scope_id();
+ addr1.scope_id(scope_id);
+
+ bool b = addr1.is_unspecified();
+ (void)b;
+
+ b = addr1.is_loopback();
+ (void)b;
+
+ b = addr1.is_multicast();
+ (void)b;
+
+ b = addr1.is_link_local();
+ (void)b;
+
+ b = addr1.is_site_local();
+ (void)b;
+
+ b = addr1.is_v4_mapped();
+ (void)b;
+
+#if !defined(ASIO_NO_DEPRECATED)
+ b = addr1.is_v4_compatible();
+ (void)b;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ b = addr1.is_multicast_node_local();
+ (void)b;
+
+ b = addr1.is_multicast_link_local();
+ (void)b;
+
+ b = addr1.is_multicast_site_local();
+ (void)b;
+
+ b = addr1.is_multicast_org_local();
+ (void)b;
+
+ b = addr1.is_multicast_global();
+ (void)b;
+
+ ip::address_v6::bytes_type bytes_value = addr1.to_bytes();
+ (void)bytes_value;
+
+ std::string string_value = addr1.to_string();
+#if !defined(ASIO_NO_DEPRECATED)
+ string_value = addr1.to_string(ec);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+#if !defined(ASIO_NO_DEPRECATED)
+ ip::address_v4 addr3 = addr1.to_v4();
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ // address_v6 static functions.
+
+#if !defined(ASIO_NO_DEPRECATED)
+ addr1 = ip::address_v6::from_string("0::0");
+ addr1 = ip::address_v6::from_string("0::0", ec);
+ addr1 = ip::address_v6::from_string(string_value);
+ addr1 = ip::address_v6::from_string(string_value, ec);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ addr1 = ip::address_v6::any();
+
+ addr1 = ip::address_v6::loopback();
+
+#if !defined(ASIO_NO_DEPRECATED)
+ addr1 = ip::address_v6::v4_mapped(addr3);
+
+ addr1 = ip::address_v6::v4_compatible(addr3);
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ // address_v6 comparisons.
+
+ b = (addr1 == addr2);
+ (void)b;
+
+ b = (addr1 != addr2);
+ (void)b;
+
+ b = (addr1 < addr2);
+ (void)b;
+
+ b = (addr1 > addr2);
+ (void)b;
+
+ b = (addr1 <= addr2);
+ (void)b;
+
+ b = (addr1 >= addr2);
+ (void)b;
+
+ // address_v6 creation functions.
+
+ addr1 = ip::make_address_v6(const_bytes_value, scope_id);
+ addr1 = ip::make_address_v6("0::0");
+ addr1 = ip::make_address_v6("0::0", ec);
+ addr1 = ip::make_address_v6(string_value);
+ addr1 = ip::make_address_v6(string_value, ec);
+#if defined(ASIO_HAS_STRING_VIEW)
+# if defined(ASIO_HAS_STD_STRING_VIEW)
+ std::string_view string_view_value("0::0");
+# else // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+ std::experimental::string_view string_view_value("0::0");
+# endif // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+ addr1 = ip::make_address_v6(string_view_value);
+ addr1 = ip::make_address_v6(string_view_value, ec);
+#endif // defined(ASIO_HAS_STRING_VIEW)
+
+ // address_v6 IPv4-mapped conversion.
+#if defined(ASIO_NO_DEPRECATED)
+ ip::address_v4 addr3;
+#endif // defined(ASIO_NO_DEPRECATED)
+ addr1 = ip::make_address_v6(ip::v4_mapped, addr3);
+ addr3 = ip::make_address_v4(ip::v4_mapped, addr1);
+
+ // address_v6 I/O.
+
+ std::ostringstream os;
+ os << addr1;
+
+#if !defined(BOOST_NO_STD_WSTREAMBUF)
+ std::wostringstream wos;
+ wos << addr1;
+#endif // !defined(BOOST_NO_STD_WSTREAMBUF)
+
+#if defined(ASIO_HAS_STD_HASH)
+ std::size_t hash1 = std::hash<ip::address_v6>()(addr1);
+ (void)hash1;
+#endif // defined(ASIO_HAS_STD_HASH)
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_address_v6_compile
+
+//------------------------------------------------------------------------------
+
+// ip_address_v6_runtime test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that the various public member functions meet the
+// necessary postconditions.
+
+namespace ip_address_v6_runtime {
+
+void test()
+{
+ using asio::ip::address_v6;
+
+ address_v6 a1;
+ ASIO_CHECK(a1.is_unspecified());
+ ASIO_CHECK(a1.scope_id() == 0);
+
+ address_v6::bytes_type b1 = {{ 1, 2, 3, 4, 5,
+ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }};
+ address_v6 a2(b1, 12345);
+ ASIO_CHECK(a2.to_bytes()[0] == 1);
+ ASIO_CHECK(a2.to_bytes()[1] == 2);
+ ASIO_CHECK(a2.to_bytes()[2] == 3);
+ ASIO_CHECK(a2.to_bytes()[3] == 4);
+ ASIO_CHECK(a2.to_bytes()[4] == 5);
+ ASIO_CHECK(a2.to_bytes()[5] == 6);
+ ASIO_CHECK(a2.to_bytes()[6] == 7);
+ ASIO_CHECK(a2.to_bytes()[7] == 8);
+ ASIO_CHECK(a2.to_bytes()[8] == 9);
+ ASIO_CHECK(a2.to_bytes()[9] == 10);
+ ASIO_CHECK(a2.to_bytes()[10] == 11);
+ ASIO_CHECK(a2.to_bytes()[11] == 12);
+ ASIO_CHECK(a2.to_bytes()[12] == 13);
+ ASIO_CHECK(a2.to_bytes()[13] == 14);
+ ASIO_CHECK(a2.to_bytes()[14] == 15);
+ ASIO_CHECK(a2.to_bytes()[15] == 16);
+ ASIO_CHECK(a2.scope_id() == 12345);
+
+ address_v6 a3;
+ a3.scope_id(12345);
+ ASIO_CHECK(a3.scope_id() == 12345);
+
+ address_v6 unspecified_address;
+ address_v6::bytes_type loopback_bytes = {{ 0 }};
+ loopback_bytes[15] = 1;
+ address_v6 loopback_address(loopback_bytes);
+ address_v6::bytes_type link_local_bytes = {{ 0xFE, 0x80, 1 }};
+ address_v6 link_local_address(link_local_bytes);
+ address_v6::bytes_type site_local_bytes = {{ 0xFE, 0xC0, 1 }};
+ address_v6 site_local_address(site_local_bytes);
+ address_v6::bytes_type v4_mapped_bytes = {{ 0 }};
+ v4_mapped_bytes[10] = 0xFF, v4_mapped_bytes[11] = 0xFF;
+ v4_mapped_bytes[12] = 1, v4_mapped_bytes[13] = 2;
+ v4_mapped_bytes[14] = 3, v4_mapped_bytes[15] = 4;
+ address_v6 v4_mapped_address(v4_mapped_bytes);
+ address_v6::bytes_type v4_compat_bytes = {{ 0 }};
+ v4_compat_bytes[12] = 1, v4_compat_bytes[13] = 2;
+ v4_compat_bytes[14] = 3, v4_compat_bytes[15] = 4;
+ address_v6 v4_compat_address(v4_compat_bytes);
+ address_v6::bytes_type mcast_global_bytes = {{ 0xFF, 0x0E, 1 }};
+ address_v6 mcast_global_address(mcast_global_bytes);
+ address_v6::bytes_type mcast_link_local_bytes = {{ 0xFF, 0x02, 1 }};
+ address_v6 mcast_link_local_address(mcast_link_local_bytes);
+ address_v6::bytes_type mcast_node_local_bytes = {{ 0xFF, 0x01, 1 }};
+ address_v6 mcast_node_local_address(mcast_node_local_bytes);
+ address_v6::bytes_type mcast_org_local_bytes = {{ 0xFF, 0x08, 1 }};
+ address_v6 mcast_org_local_address(mcast_org_local_bytes);
+ address_v6::bytes_type mcast_site_local_bytes = {{ 0xFF, 0x05, 1 }};
+ address_v6 mcast_site_local_address(mcast_site_local_bytes);
+
+ ASIO_CHECK(!unspecified_address.is_loopback());
+ ASIO_CHECK(loopback_address.is_loopback());
+ ASIO_CHECK(!link_local_address.is_loopback());
+ ASIO_CHECK(!site_local_address.is_loopback());
+ ASIO_CHECK(!v4_mapped_address.is_loopback());
+ ASIO_CHECK(!v4_compat_address.is_loopback());
+ ASIO_CHECK(!mcast_global_address.is_loopback());
+ ASIO_CHECK(!mcast_link_local_address.is_loopback());
+ ASIO_CHECK(!mcast_node_local_address.is_loopback());
+ ASIO_CHECK(!mcast_org_local_address.is_loopback());
+ ASIO_CHECK(!mcast_site_local_address.is_loopback());
+
+ ASIO_CHECK(unspecified_address.is_unspecified());
+ ASIO_CHECK(!loopback_address.is_unspecified());
+ ASIO_CHECK(!link_local_address.is_unspecified());
+ ASIO_CHECK(!site_local_address.is_unspecified());
+ ASIO_CHECK(!v4_mapped_address.is_unspecified());
+ ASIO_CHECK(!v4_compat_address.is_unspecified());
+ ASIO_CHECK(!mcast_global_address.is_unspecified());
+ ASIO_CHECK(!mcast_link_local_address.is_unspecified());
+ ASIO_CHECK(!mcast_node_local_address.is_unspecified());
+ ASIO_CHECK(!mcast_org_local_address.is_unspecified());
+ ASIO_CHECK(!mcast_site_local_address.is_unspecified());
+
+ ASIO_CHECK(!unspecified_address.is_link_local());
+ ASIO_CHECK(!loopback_address.is_link_local());
+ ASIO_CHECK(link_local_address.is_link_local());
+ ASIO_CHECK(!site_local_address.is_link_local());
+ ASIO_CHECK(!v4_mapped_address.is_link_local());
+ ASIO_CHECK(!v4_compat_address.is_link_local());
+ ASIO_CHECK(!mcast_global_address.is_link_local());
+ ASIO_CHECK(!mcast_link_local_address.is_link_local());
+ ASIO_CHECK(!mcast_node_local_address.is_link_local());
+ ASIO_CHECK(!mcast_org_local_address.is_link_local());
+ ASIO_CHECK(!mcast_site_local_address.is_link_local());
+
+ ASIO_CHECK(!unspecified_address.is_site_local());
+ ASIO_CHECK(!loopback_address.is_site_local());
+ ASIO_CHECK(!link_local_address.is_site_local());
+ ASIO_CHECK(site_local_address.is_site_local());
+ ASIO_CHECK(!v4_mapped_address.is_site_local());
+ ASIO_CHECK(!v4_compat_address.is_site_local());
+ ASIO_CHECK(!mcast_global_address.is_site_local());
+ ASIO_CHECK(!mcast_link_local_address.is_site_local());
+ ASIO_CHECK(!mcast_node_local_address.is_site_local());
+ ASIO_CHECK(!mcast_org_local_address.is_site_local());
+ ASIO_CHECK(!mcast_site_local_address.is_site_local());
+
+ ASIO_CHECK(!unspecified_address.is_v4_mapped());
+ ASIO_CHECK(!loopback_address.is_v4_mapped());
+ ASIO_CHECK(!link_local_address.is_v4_mapped());
+ ASIO_CHECK(!site_local_address.is_v4_mapped());
+ ASIO_CHECK(v4_mapped_address.is_v4_mapped());
+ ASIO_CHECK(!v4_compat_address.is_v4_mapped());
+ ASIO_CHECK(!mcast_global_address.is_v4_mapped());
+ ASIO_CHECK(!mcast_link_local_address.is_v4_mapped());
+ ASIO_CHECK(!mcast_node_local_address.is_v4_mapped());
+ ASIO_CHECK(!mcast_org_local_address.is_v4_mapped());
+ ASIO_CHECK(!mcast_site_local_address.is_v4_mapped());
+
+#if !defined(ASIO_NO_DEPRECATED)
+ ASIO_CHECK(!unspecified_address.is_v4_compatible());
+ ASIO_CHECK(!loopback_address.is_v4_compatible());
+ ASIO_CHECK(!link_local_address.is_v4_compatible());
+ ASIO_CHECK(!site_local_address.is_v4_compatible());
+ ASIO_CHECK(!v4_mapped_address.is_v4_compatible());
+ ASIO_CHECK(v4_compat_address.is_v4_compatible());
+ ASIO_CHECK(!mcast_global_address.is_v4_compatible());
+ ASIO_CHECK(!mcast_link_local_address.is_v4_compatible());
+ ASIO_CHECK(!mcast_node_local_address.is_v4_compatible());
+ ASIO_CHECK(!mcast_org_local_address.is_v4_compatible());
+ ASIO_CHECK(!mcast_site_local_address.is_v4_compatible());
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ ASIO_CHECK(!unspecified_address.is_multicast());
+ ASIO_CHECK(!loopback_address.is_multicast());
+ ASIO_CHECK(!link_local_address.is_multicast());
+ ASIO_CHECK(!site_local_address.is_multicast());
+ ASIO_CHECK(!v4_mapped_address.is_multicast());
+ ASIO_CHECK(!v4_compat_address.is_multicast());
+ ASIO_CHECK(mcast_global_address.is_multicast());
+ ASIO_CHECK(mcast_link_local_address.is_multicast());
+ ASIO_CHECK(mcast_node_local_address.is_multicast());
+ ASIO_CHECK(mcast_org_local_address.is_multicast());
+ ASIO_CHECK(mcast_site_local_address.is_multicast());
+
+ ASIO_CHECK(!unspecified_address.is_multicast_global());
+ ASIO_CHECK(!loopback_address.is_multicast_global());
+ ASIO_CHECK(!link_local_address.is_multicast_global());
+ ASIO_CHECK(!site_local_address.is_multicast_global());
+ ASIO_CHECK(!v4_mapped_address.is_multicast_global());
+ ASIO_CHECK(!v4_compat_address.is_multicast_global());
+ ASIO_CHECK(mcast_global_address.is_multicast_global());
+ ASIO_CHECK(!mcast_link_local_address.is_multicast_global());
+ ASIO_CHECK(!mcast_node_local_address.is_multicast_global());
+ ASIO_CHECK(!mcast_org_local_address.is_multicast_global());
+ ASIO_CHECK(!mcast_site_local_address.is_multicast_global());
+
+ ASIO_CHECK(!unspecified_address.is_multicast_link_local());
+ ASIO_CHECK(!loopback_address.is_multicast_link_local());
+ ASIO_CHECK(!link_local_address.is_multicast_link_local());
+ ASIO_CHECK(!site_local_address.is_multicast_link_local());
+ ASIO_CHECK(!v4_mapped_address.is_multicast_link_local());
+ ASIO_CHECK(!v4_compat_address.is_multicast_link_local());
+ ASIO_CHECK(!mcast_global_address.is_multicast_link_local());
+ ASIO_CHECK(mcast_link_local_address.is_multicast_link_local());
+ ASIO_CHECK(!mcast_node_local_address.is_multicast_link_local());
+ ASIO_CHECK(!mcast_org_local_address.is_multicast_link_local());
+ ASIO_CHECK(!mcast_site_local_address.is_multicast_link_local());
+
+ ASIO_CHECK(!unspecified_address.is_multicast_node_local());
+ ASIO_CHECK(!loopback_address.is_multicast_node_local());
+ ASIO_CHECK(!link_local_address.is_multicast_node_local());
+ ASIO_CHECK(!site_local_address.is_multicast_node_local());
+ ASIO_CHECK(!v4_mapped_address.is_multicast_node_local());
+ ASIO_CHECK(!v4_compat_address.is_multicast_node_local());
+ ASIO_CHECK(!mcast_global_address.is_multicast_node_local());
+ ASIO_CHECK(!mcast_link_local_address.is_multicast_node_local());
+ ASIO_CHECK(mcast_node_local_address.is_multicast_node_local());
+ ASIO_CHECK(!mcast_org_local_address.is_multicast_node_local());
+ ASIO_CHECK(!mcast_site_local_address.is_multicast_node_local());
+
+ ASIO_CHECK(!unspecified_address.is_multicast_org_local());
+ ASIO_CHECK(!loopback_address.is_multicast_org_local());
+ ASIO_CHECK(!link_local_address.is_multicast_org_local());
+ ASIO_CHECK(!site_local_address.is_multicast_org_local());
+ ASIO_CHECK(!v4_mapped_address.is_multicast_org_local());
+ ASIO_CHECK(!v4_compat_address.is_multicast_org_local());
+ ASIO_CHECK(!mcast_global_address.is_multicast_org_local());
+ ASIO_CHECK(!mcast_link_local_address.is_multicast_org_local());
+ ASIO_CHECK(!mcast_node_local_address.is_multicast_org_local());
+ ASIO_CHECK(mcast_org_local_address.is_multicast_org_local());
+ ASIO_CHECK(!mcast_site_local_address.is_multicast_org_local());
+
+ ASIO_CHECK(!unspecified_address.is_multicast_site_local());
+ ASIO_CHECK(!loopback_address.is_multicast_site_local());
+ ASIO_CHECK(!link_local_address.is_multicast_site_local());
+ ASIO_CHECK(!site_local_address.is_multicast_site_local());
+ ASIO_CHECK(!v4_mapped_address.is_multicast_site_local());
+ ASIO_CHECK(!v4_compat_address.is_multicast_site_local());
+ ASIO_CHECK(!mcast_global_address.is_multicast_site_local());
+ ASIO_CHECK(!mcast_link_local_address.is_multicast_site_local());
+ ASIO_CHECK(!mcast_node_local_address.is_multicast_site_local());
+ ASIO_CHECK(!mcast_org_local_address.is_multicast_site_local());
+ ASIO_CHECK(mcast_site_local_address.is_multicast_site_local());
+
+ ASIO_CHECK(address_v6::loopback().is_loopback());
+}
+
+} // namespace ip_address_v6_runtime
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/address_v6",
+ ASIO_COMPILE_TEST_CASE(ip_address_v6_compile::test)
+ ASIO_TEST_CASE(ip_address_v6_runtime::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/address_v6_iterator.cpp b/3rdparty/asio/src/tests/unit/ip/address_v6_iterator.cpp
new file mode 100644
index 00000000000..ef62dc645c2
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/address_v6_iterator.cpp
@@ -0,0 +1,27 @@
+//
+// address_v6_iterator.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/address_v6_iterator.hpp"
+
+#include "../unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/address_v6_iterator",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/address_v6_range.cpp b/3rdparty/asio/src/tests/unit/ip/address_v6_range.cpp
new file mode 100644
index 00000000000..b0477214d7e
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/address_v6_range.cpp
@@ -0,0 +1,27 @@
+//
+// address_v6_range.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/address_v6_range.hpp"
+
+#include "../unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/address_v6_range",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/basic_endpoint.cpp b/3rdparty/asio/src/tests/unit/ip/basic_endpoint.cpp
new file mode 100644
index 00000000000..d4aadb6febc
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/basic_endpoint.cpp
@@ -0,0 +1,25 @@
+//
+// basic_endpoint.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/basic_endpoint.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "ip/basic_endpoint",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/basic_resolver.cpp b/3rdparty/asio/src/tests/unit/ip/basic_resolver.cpp
new file mode 100644
index 00000000000..698a2bad25f
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/basic_resolver.cpp
@@ -0,0 +1,25 @@
+//
+// basic_resolver.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/basic_resolver.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "ip/basic_resolver",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/basic_resolver_entry.cpp b/3rdparty/asio/src/tests/unit/ip/basic_resolver_entry.cpp
new file mode 100644
index 00000000000..7de5b6fc2c0
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/basic_resolver_entry.cpp
@@ -0,0 +1,25 @@
+//
+// basic_resolver_entry.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/basic_resolver_entry.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "ip/basic_resolver_entry",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/basic_resolver_iterator.cpp b/3rdparty/asio/src/tests/unit/ip/basic_resolver_iterator.cpp
new file mode 100644
index 00000000000..df7a54a79af
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/basic_resolver_iterator.cpp
@@ -0,0 +1,25 @@
+//
+// basic_resolver_iterator.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/basic_resolver_iterator.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "ip/basic_resolver_iterator",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/basic_resolver_query.cpp b/3rdparty/asio/src/tests/unit/ip/basic_resolver_query.cpp
new file mode 100644
index 00000000000..6d10e449482
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/basic_resolver_query.cpp
@@ -0,0 +1,25 @@
+//
+// basic_resolver_query.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/basic_resolver_query.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "ip/basic_resolver_query",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/host_name.cpp b/3rdparty/asio/src/tests/unit/ip/host_name.cpp
new file mode 100644
index 00000000000..6972cbf6f4a
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/host_name.cpp
@@ -0,0 +1,55 @@
+//
+// host_name.cpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/host_name.hpp"
+
+#include "../unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+// ip_host_name_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all host_name functions compile and link
+// correctly. Runtime failures are ignored.
+
+namespace ip_host_name_compile {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ asio::error_code ec;
+
+ std::string host_name = ip::host_name();
+ std::string host_name2 = ip::host_name(ec);
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_host_name_compile
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/host_name",
+ ASIO_COMPILE_TEST_CASE(ip_host_name_compile::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/icmp.cpp b/3rdparty/asio/src/tests/unit/ip/icmp.cpp
new file mode 100644
index 00000000000..ec60267b30f
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/icmp.cpp
@@ -0,0 +1,606 @@
+//
+// icmp.cpp
+// ~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/icmp.hpp"
+
+#include <cstring>
+#include "asio/io_context.hpp"
+#include "asio/placeholders.hpp"
+#include "../unit_test.hpp"
+#include "../archetypes/async_result.hpp"
+#include "../archetypes/gettable_socket_option.hpp"
+#include "../archetypes/io_control_command.hpp"
+#include "../archetypes/settable_socket_option.hpp"
+
+//------------------------------------------------------------------------------
+
+// ip_icmp_socket_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::icmp::socket compile and link correctly. Runtime failures are ignored.
+
+namespace ip_icmp_socket_compile {
+
+struct connect_handler
+{
+ connect_handler() {}
+ void operator()(const asio::error_code&) {}
+ connect_handler(connect_handler&&) {}
+private:
+ connect_handler(const connect_handler&);
+};
+
+struct send_handler
+{
+ send_handler() {}
+ void operator()(const asio::error_code&, std::size_t) {}
+ send_handler(send_handler&&) {}
+private:
+ send_handler(const send_handler&);
+};
+
+struct receive_handler
+{
+ receive_handler() {}
+ void operator()(const asio::error_code&, std::size_t) {}
+ receive_handler(receive_handler&&) {}
+private:
+ receive_handler(const receive_handler&);
+};
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ io_context ioc;
+ const io_context::executor_type ioc_ex = ioc.get_executor();
+ char mutable_char_buffer[128] = "";
+ const char const_char_buffer[128] = "";
+ socket_base::message_flags in_flags = 0;
+ archetypes::settable_socket_option<void> settable_socket_option1;
+ archetypes::settable_socket_option<int> settable_socket_option2;
+ archetypes::settable_socket_option<double> settable_socket_option3;
+ archetypes::gettable_socket_option<void> gettable_socket_option1;
+ archetypes::gettable_socket_option<int> gettable_socket_option2;
+ archetypes::gettable_socket_option<double> gettable_socket_option3;
+ archetypes::io_control_command io_control_command;
+ archetypes::immediate_handler immediate;
+ archetypes::lazy_handler lazy;
+ asio::error_code ec;
+
+ // basic_datagram_socket constructors.
+
+ ip::icmp::socket socket1(ioc);
+ ip::icmp::socket socket2(ioc, ip::icmp::v4());
+ ip::icmp::socket socket3(ioc, ip::icmp::v6());
+ ip::icmp::socket socket4(ioc, ip::icmp::endpoint(ip::icmp::v4(), 0));
+ ip::icmp::socket socket5(ioc, ip::icmp::endpoint(ip::icmp::v6(), 0));
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ ip::icmp::socket::native_handle_type native_socket1
+ = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ ip::icmp::socket socket6(ioc, ip::icmp::v4(), native_socket1);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ ip::icmp::socket socket7(ioc_ex);
+ ip::icmp::socket socket8(ioc_ex, ip::icmp::v4());
+ ip::icmp::socket socket9(ioc_ex, ip::icmp::v6());
+ ip::icmp::socket socket10(ioc_ex, ip::icmp::endpoint(ip::icmp::v4(), 0));
+ ip::icmp::socket socket11(ioc_ex, ip::icmp::endpoint(ip::icmp::v6(), 0));
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ ip::icmp::socket::native_handle_type native_socket2
+ = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ ip::icmp::socket socket12(ioc_ex, ip::icmp::v4(), native_socket2);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ ip::icmp::socket socket13(std::move(socket6));
+
+ // basic_datagram_socket operators.
+
+ socket1 = ip::icmp::socket(ioc);
+ socket1 = std::move(socket2);
+
+ // basic_io_object functions.
+
+ ip::icmp::socket::executor_type ex = socket1.get_executor();
+ (void)ex;
+
+ // basic_socket functions.
+
+ ip::icmp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
+ (void)lowest_layer;
+
+ const ip::icmp::socket& socket14 = socket1;
+ const ip::icmp::socket::lowest_layer_type& lowest_layer2
+ = socket14.lowest_layer();
+ (void)lowest_layer2;
+
+ socket1.open(ip::icmp::v4());
+ socket1.open(ip::icmp::v6());
+ socket1.open(ip::icmp::v4(), ec);
+ socket1.open(ip::icmp::v6(), ec);
+
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ ip::icmp::socket::native_handle_type native_socket3
+ = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ socket1.assign(ip::icmp::v4(), native_socket3);
+ ip::icmp::socket::native_handle_type native_socket4
+ = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ socket1.assign(ip::icmp::v4(), native_socket4, ec);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ bool is_open = socket1.is_open();
+ (void)is_open;
+
+ socket1.close();
+ socket1.close(ec);
+
+ socket1.release();
+ socket1.release(ec);
+
+ ip::icmp::socket::native_handle_type native_socket5
+ = socket1.native_handle();
+ (void)native_socket5;
+
+ socket1.cancel();
+ socket1.cancel(ec);
+
+ bool at_mark1 = socket1.at_mark();
+ (void)at_mark1;
+ bool at_mark2 = socket1.at_mark(ec);
+ (void)at_mark2;
+
+ std::size_t available1 = socket1.available();
+ (void)available1;
+ std::size_t available2 = socket1.available(ec);
+ (void)available2;
+
+ socket1.bind(ip::icmp::endpoint(ip::icmp::v4(), 0));
+ socket1.bind(ip::icmp::endpoint(ip::icmp::v6(), 0));
+ socket1.bind(ip::icmp::endpoint(ip::icmp::v4(), 0), ec);
+ socket1.bind(ip::icmp::endpoint(ip::icmp::v6(), 0), ec);
+
+ socket1.connect(ip::icmp::endpoint(ip::icmp::v4(), 0));
+ socket1.connect(ip::icmp::endpoint(ip::icmp::v6(), 0));
+ socket1.connect(ip::icmp::endpoint(ip::icmp::v4(), 0), ec);
+ socket1.connect(ip::icmp::endpoint(ip::icmp::v6(), 0), ec);
+
+ socket1.async_connect(ip::icmp::endpoint(ip::icmp::v4(), 0),
+ connect_handler());
+ socket1.async_connect(ip::icmp::endpoint(ip::icmp::v6(), 0),
+ connect_handler());
+ socket1.async_connect(ip::icmp::endpoint(ip::icmp::v4(), 0), immediate);
+ socket1.async_connect(ip::icmp::endpoint(ip::icmp::v6(), 0), immediate);
+ int i1 = socket1.async_connect(ip::icmp::endpoint(ip::icmp::v4(), 0), lazy);
+ (void)i1;
+ int i2 = socket1.async_connect(ip::icmp::endpoint(ip::icmp::v6(), 0), lazy);
+ (void)i2;
+
+ socket1.set_option(settable_socket_option1);
+ socket1.set_option(settable_socket_option1, ec);
+ socket1.set_option(settable_socket_option2);
+ socket1.set_option(settable_socket_option2, ec);
+ socket1.set_option(settable_socket_option3);
+ socket1.set_option(settable_socket_option3, ec);
+
+ socket1.get_option(gettable_socket_option1);
+ socket1.get_option(gettable_socket_option1, ec);
+ socket1.get_option(gettable_socket_option2);
+ socket1.get_option(gettable_socket_option2, ec);
+ socket1.get_option(gettable_socket_option3);
+ socket1.get_option(gettable_socket_option3, ec);
+
+ socket1.io_control(io_control_command);
+ socket1.io_control(io_control_command, ec);
+
+ bool non_blocking1 = socket1.non_blocking();
+ (void)non_blocking1;
+ socket1.non_blocking(true);
+ socket1.non_blocking(false, ec);
+
+ bool non_blocking2 = socket1.native_non_blocking();
+ (void)non_blocking2;
+ socket1.native_non_blocking(true);
+ socket1.native_non_blocking(false, ec);
+
+ ip::icmp::endpoint endpoint1 = socket1.local_endpoint();
+ (void)endpoint1;
+ ip::icmp::endpoint endpoint2 = socket1.local_endpoint(ec);
+ (void)endpoint2;
+
+ ip::icmp::endpoint endpoint3 = socket1.remote_endpoint();
+ (void)endpoint3;
+ ip::icmp::endpoint endpoint4 = socket1.remote_endpoint(ec);
+ (void)endpoint4;
+
+ socket1.shutdown(socket_base::shutdown_both);
+ socket1.shutdown(socket_base::shutdown_both, ec);
+
+ // basic_datagram_socket functions.
+
+ socket1.send(buffer(mutable_char_buffer));
+ socket1.send(buffer(const_char_buffer));
+ socket1.send(null_buffers());
+ socket1.send(buffer(mutable_char_buffer), in_flags);
+ socket1.send(buffer(const_char_buffer), in_flags);
+ socket1.send(null_buffers(), in_flags);
+ socket1.send(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.send(buffer(const_char_buffer), in_flags, ec);
+ socket1.send(null_buffers(), in_flags, ec);
+
+ socket1.async_send(buffer(mutable_char_buffer), send_handler());
+ socket1.async_send(buffer(const_char_buffer), send_handler());
+ socket1.async_send(null_buffers(), send_handler());
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler());
+ socket1.async_send(buffer(const_char_buffer), in_flags, send_handler());
+ socket1.async_send(null_buffers(), in_flags, send_handler());
+ socket1.async_send(buffer(mutable_char_buffer), immediate);
+ socket1.async_send(buffer(const_char_buffer), immediate);
+ socket1.async_send(null_buffers(), immediate);
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, immediate);
+ socket1.async_send(buffer(const_char_buffer), in_flags, immediate);
+ socket1.async_send(null_buffers(), in_flags, immediate);
+ int i3 = socket1.async_send(buffer(mutable_char_buffer), lazy);
+ (void)i3;
+ int i4 = socket1.async_send(buffer(const_char_buffer), lazy);
+ (void)i4;
+ int i5 = socket1.async_send(null_buffers(), lazy);
+ (void)i5;
+ int i6 = socket1.async_send(buffer(mutable_char_buffer), in_flags, lazy);
+ (void)i6;
+ int i7 = socket1.async_send(buffer(const_char_buffer), in_flags, lazy);
+ (void)i7;
+ int i8 = socket1.async_send(null_buffers(), in_flags, lazy);
+ (void)i8;
+
+ socket1.send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0));
+ socket1.send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0));
+ socket1.send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0));
+ socket1.send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0));
+ socket1.send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v4(), 0));
+ socket1.send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v6(), 0));
+ socket1.send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags);
+ socket1.send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags);
+ socket1.send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags);
+ socket1.send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags);
+ socket1.send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags);
+ socket1.send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags);
+ socket1.send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, ec);
+ socket1.send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, ec);
+ socket1.send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, ec);
+ socket1.send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, ec);
+ socket1.send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, ec);
+ socket1.send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, ec);
+
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), send_handler());
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), send_handler());
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), send_handler());
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), send_handler());
+ socket1.async_send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), send_handler());
+ socket1.async_send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), send_handler());
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, send_handler());
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, send_handler());
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, send_handler());
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, send_handler());
+ socket1.async_send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, send_handler());
+ socket1.async_send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, send_handler());
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), immediate);
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), immediate);
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), immediate);
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), immediate);
+ socket1.async_send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), immediate);
+ socket1.async_send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), immediate);
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, immediate);
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, immediate);
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, immediate);
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, immediate);
+ socket1.async_send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, immediate);
+ socket1.async_send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, immediate);
+ int i9 = socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), lazy);
+ (void)i9;
+ int i10 = socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), lazy);
+ (void)i10;
+ int i11 = socket1.async_send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), lazy);
+ (void)i11;
+ int i12 = socket1.async_send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), lazy);
+ (void)i12;
+ int i13 = socket1.async_send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), lazy);
+ (void)i13;
+ int i14 = socket1.async_send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), lazy);
+ (void)i14;
+ int i15 = socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, lazy);
+ (void)i15;
+ int i16 = socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, lazy);
+ (void)i16;
+ int i17 = socket1.async_send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, lazy);
+ (void)i17;
+ int i18 = socket1.async_send_to(buffer(const_char_buffer),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, lazy);
+ (void)i18;
+ int i19 = socket1.async_send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v4(), 0), in_flags, lazy);
+ (void)i19;
+ int i20 = socket1.async_send_to(null_buffers(),
+ ip::icmp::endpoint(ip::icmp::v6(), 0), in_flags, lazy);
+ (void)i20;
+
+ socket1.receive(buffer(mutable_char_buffer));
+ socket1.receive(null_buffers());
+ socket1.receive(buffer(mutable_char_buffer), in_flags);
+ socket1.receive(null_buffers(), in_flags);
+ socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.receive(null_buffers(), in_flags, ec);
+
+ socket1.async_receive(buffer(mutable_char_buffer), receive_handler());
+ socket1.async_receive(null_buffers(), receive_handler());
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags,
+ receive_handler());
+ socket1.async_receive(null_buffers(), in_flags, receive_handler());
+ socket1.async_receive(buffer(mutable_char_buffer), immediate);
+ socket1.async_receive(null_buffers(), immediate);
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags, immediate);
+ socket1.async_receive(null_buffers(), in_flags, immediate);
+ int i21 = socket1.async_receive(buffer(mutable_char_buffer), lazy);
+ (void)i21;
+ int i22 = socket1.async_receive(null_buffers(), lazy);
+ (void)i22;
+ int i23 = socket1.async_receive(buffer(mutable_char_buffer),
+ in_flags, lazy);
+ (void)i23;
+ int i24 = socket1.async_receive(null_buffers(), in_flags, lazy);
+ (void)i24;
+
+ ip::icmp::endpoint endpoint;
+ socket1.receive_from(buffer(mutable_char_buffer), endpoint);
+ socket1.receive_from(null_buffers(), endpoint);
+ socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags);
+ socket1.receive_from(null_buffers(), endpoint, in_flags);
+ socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags, ec);
+ socket1.receive_from(null_buffers(), endpoint, in_flags, ec);
+
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, receive_handler());
+ socket1.async_receive_from(null_buffers(),
+ endpoint, receive_handler());
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, in_flags, receive_handler());
+ socket1.async_receive_from(null_buffers(),
+ endpoint, in_flags, receive_handler());
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, immediate);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, immediate);
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, in_flags, immediate);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, in_flags, immediate);
+ int i25 = socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, lazy);
+ (void)i25;
+ int i26 = socket1.async_receive_from(null_buffers(),
+ endpoint, lazy);
+ (void)i26;
+ int i27 = socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, in_flags, lazy);
+ (void)i27;
+ int i28 = socket1.async_receive_from(null_buffers(),
+ endpoint, in_flags, lazy);
+ (void)i28;
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_icmp_socket_compile
+
+//------------------------------------------------------------------------------
+
+// ip_icmp_resolver_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::icmp::resolver compile and link correctly. Runtime failures are ignored.
+
+namespace ip_icmp_resolver_compile {
+
+struct resolve_handler
+{
+ resolve_handler() {}
+ void operator()(const asio::error_code&,
+ asio::ip::icmp::resolver::results_type) {}
+ resolve_handler(resolve_handler&&) {}
+private:
+ resolve_handler(const resolve_handler&);
+};
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ io_context ioc;
+ const io_context::executor_type ioc_ex = ioc.get_executor();
+ archetypes::lazy_handler lazy;
+ asio::error_code ec;
+#if !defined(ASIO_NO_DEPRECATED)
+ ip::icmp::resolver::query q(ip::icmp::v4(), "localhost", "0");
+#endif // !defined(ASIO_NO_DEPRECATED)
+ ip::icmp::endpoint e(ip::address_v4::loopback(), 0);
+
+ // basic_resolver constructors.
+
+ ip::icmp::resolver resolver(ioc);
+ ip::icmp::resolver resolver2(ioc_ex);
+
+ ip::icmp::resolver resolver3(std::move(resolver));
+
+ // basic_resolver operators.
+
+ resolver = ip::icmp::resolver(ioc);
+ resolver = std::move(resolver3);
+
+ // basic_io_object functions.
+
+ ip::icmp::resolver::executor_type ex = resolver.get_executor();
+ (void)ex;
+
+ // basic_resolver functions.
+
+ resolver.cancel();
+
+#if !defined(ASIO_NO_DEPRECATED)
+ ip::icmp::resolver::results_type results1 = resolver.resolve(q);
+ (void)results1;
+
+ ip::icmp::resolver::results_type results2 = resolver.resolve(q, ec);
+ (void)results2;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ ip::icmp::resolver::results_type results3 = resolver.resolve("", "");
+ (void)results3;
+
+ ip::icmp::resolver::results_type results4 = resolver.resolve("", "", ec);
+ (void)results4;
+
+ ip::icmp::resolver::results_type results5 =
+ resolver.resolve("", "", ip::icmp::resolver::flags());
+ (void)results5;
+
+ ip::icmp::resolver::results_type results6 =
+ resolver.resolve("", "", ip::icmp::resolver::flags(), ec);
+ (void)results6;
+
+ ip::icmp::resolver::results_type results7 =
+ resolver.resolve(ip::icmp::v4(), "", "");
+ (void)results7;
+
+ ip::icmp::resolver::results_type results8 =
+ resolver.resolve(ip::icmp::v4(), "", "", ec);
+ (void)results8;
+
+ ip::icmp::resolver::results_type results9 =
+ resolver.resolve(ip::icmp::v4(), "", "", ip::icmp::resolver::flags());
+ (void)results9;
+
+ ip::icmp::resolver::results_type results10 =
+ resolver.resolve(ip::icmp::v4(), "", "", ip::icmp::resolver::flags(), ec);
+ (void)results10;
+
+ ip::icmp::resolver::results_type results11 = resolver.resolve(e);
+ (void)results11;
+
+ ip::icmp::resolver::results_type results12 = resolver.resolve(e, ec);
+ (void)results12;
+
+#if !defined(ASIO_NO_DEPRECATED)
+ resolver.async_resolve(q, resolve_handler());
+ int i1 = resolver.async_resolve(q, lazy);
+ (void)i1;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ resolver.async_resolve("", "", resolve_handler());
+ int i2 = resolver.async_resolve("", "", lazy);
+ (void)i2;
+
+ resolver.async_resolve("", "",
+ ip::icmp::resolver::flags(), resolve_handler());
+ int i3 = resolver.async_resolve("", "",
+ ip::icmp::resolver::flags(), lazy);
+ (void)i3;
+ resolver.async_resolve(ip::icmp::v4(), "", "", resolve_handler());
+ int i4 = resolver.async_resolve(ip::icmp::v4(), "", "", lazy);
+ (void)i4;
+
+ resolver.async_resolve(ip::icmp::v4(),
+ "", "", ip::icmp::resolver::flags(), resolve_handler());
+ int i5 = resolver.async_resolve(ip::icmp::v4(),
+ "", "", ip::icmp::resolver::flags(), lazy);
+ (void)i5;
+
+ resolver.async_resolve(e, resolve_handler());
+ int i6 = resolver.async_resolve(e, lazy);
+ (void)i6;
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_icmp_resolver_compile
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/icmp",
+ ASIO_COMPILE_TEST_CASE(ip_icmp_socket_compile::test)
+ ASIO_COMPILE_TEST_CASE(ip_icmp_resolver_compile::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/multicast.cpp b/3rdparty/asio/src/tests/unit/ip/multicast.cpp
new file mode 100644
index 00000000000..4f0b3f45e14
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/multicast.cpp
@@ -0,0 +1,363 @@
+//
+// multicast.cpp
+// ~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/multicast.hpp"
+
+#include "asio/io_context.hpp"
+#include "asio/ip/udp.hpp"
+#include "../unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+// ip_multicast_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all nested classes, enums and constants in
+// ip::multicast compile and link correctly. Runtime failures are ignored.
+
+namespace ip_multicast_compile {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ io_context ioc;
+ ip::udp::socket sock(ioc);
+ const ip::address address;
+ const ip::address_v4 address_v4;
+ const ip::address_v6 address_v6;
+
+ // join_group class.
+
+ ip::multicast::join_group join_group1;
+ ip::multicast::join_group join_group2(address);
+ ip::multicast::join_group join_group3(address_v4);
+ ip::multicast::join_group join_group4(address_v4, address_v4);
+ ip::multicast::join_group join_group5(address_v6);
+ ip::multicast::join_group join_group6(address_v6, 1);
+ sock.set_option(join_group6);
+
+ // leave_group class.
+
+ ip::multicast::leave_group leave_group1;
+ ip::multicast::leave_group leave_group2(address);
+ ip::multicast::leave_group leave_group3(address_v4);
+ ip::multicast::leave_group leave_group4(address_v4, address_v4);
+ ip::multicast::leave_group leave_group5(address_v6);
+ ip::multicast::leave_group leave_group6(address_v6, 1);
+ sock.set_option(leave_group6);
+
+ // outbound_interface class.
+
+ ip::multicast::outbound_interface outbound_interface1;
+ ip::multicast::outbound_interface outbound_interface2(address_v4);
+ ip::multicast::outbound_interface outbound_interface3(1);
+ sock.set_option(outbound_interface3);
+
+ // hops class.
+
+ ip::multicast::hops hops1(1024);
+ sock.set_option(hops1);
+ ip::multicast::hops hops2;
+ sock.get_option(hops2);
+ hops1 = 1;
+ (void)static_cast<int>(hops1.value());
+
+ // enable_loopback class.
+
+ ip::multicast::enable_loopback enable_loopback1(true);
+ sock.set_option(enable_loopback1);
+ ip::multicast::enable_loopback enable_loopback2;
+ sock.get_option(enable_loopback2);
+ enable_loopback1 = true;
+ (void)static_cast<bool>(enable_loopback1);
+ (void)static_cast<bool>(!enable_loopback1);
+ (void)static_cast<bool>(enable_loopback1.value());
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_multicast_compile
+
+//------------------------------------------------------------------------------
+
+// ip_multicast_runtime test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks the runtime operation of the socket options defined
+// in the ip::multicast namespace.
+
+namespace ip_multicast_runtime {
+
+#if defined(__hpux)
+// HP-UX doesn't declare this function extern "C", so it is declared again here
+// to avoid a linker error about an undefined symbol.
+extern "C" unsigned int if_nametoindex(const char*);
+#endif // defined(__hpux)
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ io_context ioc;
+ asio::error_code ec;
+
+ ip::udp::endpoint ep_v4(ip::address_v4::loopback(), 0);
+ ip::udp::socket sock_v4(ioc);
+ sock_v4.open(ep_v4.protocol(), ec);
+ sock_v4.bind(ep_v4, ec);
+ bool have_v4 = !ec;
+
+ ip::udp::endpoint ep_v6(ip::address_v6::loopback(), 0);
+ ip::udp::socket sock_v6(ioc);
+ sock_v6.open(ep_v6.protocol(), ec);
+ sock_v6.bind(ep_v6, ec);
+ bool have_v6 = !ec;
+
+ ASIO_CHECK(have_v4 || have_v6);
+
+#if defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ // Windows CE seems to have problems with some multicast group addresses.
+ // The following address works on CE, but as it is not a private multicast
+ // address it will not be used on other platforms.
+ const ip::address multicast_address_v4 = ip::make_address("239.0.0.4", ec);
+#else // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ const ip::address multicast_address_v4 = ip::make_address("239.255.0.1", ec);
+#endif // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ ASIO_CHECK(!have_v4 || !ec);
+
+#if (defined(__MACH__) && defined(__APPLE__)) \
+ || defined(__FreeBSD__) \
+ || defined(__NetBSD__) \
+ || defined(__OpenBSD__)
+ const ip::address multicast_address_v6 = ip::make_address("ff02::1%lo0", ec);
+#else // (defined(__MACH__) && defined(__APPLE__))
+ // || defined(__FreeBSD__)
+ // || defined(__NetBSD__)
+ // || defined(__OpenBSD__)
+ const ip::address multicast_address_v6 = ip::make_address("ff01::1", ec);
+#endif // (defined(__MACH__) && defined(__APPLE__))
+ // || defined(__FreeBSD__)
+ // || defined(__NetBSD__)
+ // || defined(__OpenBSD__)
+ ASIO_CHECK(!have_v6 || !ec);
+
+ // join_group class.
+
+ if (have_v4)
+ {
+ ip::multicast::join_group join_group(multicast_address_v4);
+ sock_v4.set_option(join_group, ec);
+ ASIO_CHECK_MESSAGE(!ec || ec == error::no_such_device,
+ ec.value() << ", " << ec.message());
+
+ if (!ec)
+ {
+ // leave_group class.
+
+ ip::multicast::leave_group leave_group(multicast_address_v4);
+ sock_v4.set_option(leave_group, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+ }
+ }
+
+ if (have_v6)
+ {
+ ip::multicast::join_group join_group(multicast_address_v6);
+ sock_v6.set_option(join_group, ec);
+ ASIO_CHECK_MESSAGE(!ec || ec == error::no_such_device,
+ ec.value() << ", " << ec.message());
+
+ if (!ec)
+ {
+ // leave_group class.
+
+ ip::multicast::leave_group leave_group(multicast_address_v6);
+ sock_v6.set_option(leave_group, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+ }
+ }
+
+ // outbound_interface class.
+
+ if (have_v4)
+ {
+ ip::multicast::outbound_interface outbound_interface(
+ ip::address_v4::loopback());
+ sock_v4.set_option(outbound_interface, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+ }
+
+ if (have_v6)
+ {
+#if defined(__hpux)
+ ip::multicast::outbound_interface outbound_interface(if_nametoindex("lo0"));
+#else
+ ip::multicast::outbound_interface outbound_interface(1);
+#endif
+ sock_v6.set_option(outbound_interface, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+ }
+
+ // hops class.
+
+ if (have_v4)
+ {
+ ip::multicast::hops hops1(1);
+ ASIO_CHECK(hops1.value() == 1);
+ sock_v4.set_option(hops1, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+
+ ip::multicast::hops hops2;
+ sock_v4.get_option(hops2, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+ ASIO_CHECK(hops2.value() == 1);
+
+ ip::multicast::hops hops3(0);
+ ASIO_CHECK(hops3.value() == 0);
+ sock_v4.set_option(hops3, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+
+ ip::multicast::hops hops4;
+ sock_v4.get_option(hops4, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+ ASIO_CHECK(hops4.value() == 0);
+ }
+
+ if (have_v6)
+ {
+ ip::multicast::hops hops1(1);
+ ASIO_CHECK(hops1.value() == 1);
+ sock_v6.set_option(hops1, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+
+ ip::multicast::hops hops2;
+ sock_v6.get_option(hops2, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+ ASIO_CHECK(hops2.value() == 1);
+
+ ip::multicast::hops hops3(0);
+ ASIO_CHECK(hops3.value() == 0);
+ sock_v6.set_option(hops3, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+
+ ip::multicast::hops hops4;
+ sock_v6.get_option(hops4, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+ ASIO_CHECK(hops4.value() == 0);
+ }
+
+ // enable_loopback class.
+
+ if (have_v4)
+ {
+ ip::multicast::enable_loopback enable_loopback1(true);
+ ASIO_CHECK(enable_loopback1.value());
+ ASIO_CHECK(static_cast<bool>(enable_loopback1));
+ ASIO_CHECK(!!enable_loopback1);
+ sock_v4.set_option(enable_loopback1, ec);
+#if defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ // Option is not supported under Windows CE.
+ ASIO_CHECK_MESSAGE(ec == asio::error::no_protocol_option,
+ ec.value() << ", " << ec.message());
+#else // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+#endif // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+
+ ip::multicast::enable_loopback enable_loopback2;
+ sock_v4.get_option(enable_loopback2, ec);
+#if defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ // Not supported under Windows CE but can get value.
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+#else // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+ ASIO_CHECK(enable_loopback2.value());
+ ASIO_CHECK(static_cast<bool>(enable_loopback2));
+ ASIO_CHECK(!!enable_loopback2);
+#endif // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+
+ ip::multicast::enable_loopback enable_loopback3(false);
+ ASIO_CHECK(!enable_loopback3.value());
+ ASIO_CHECK(!static_cast<bool>(enable_loopback3));
+ ASIO_CHECK(!enable_loopback3);
+ sock_v4.set_option(enable_loopback3, ec);
+#if defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ // Option is not supported under Windows CE.
+ ASIO_CHECK_MESSAGE(ec == asio::error::no_protocol_option,
+ ec.value() << ", " << ec.message());
+#else // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+#endif // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+
+ ip::multicast::enable_loopback enable_loopback4;
+ sock_v4.get_option(enable_loopback4, ec);
+#if defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ // Not supported under Windows CE but can get value.
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+#else // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+ ASIO_CHECK(!enable_loopback4.value());
+ ASIO_CHECK(!static_cast<bool>(enable_loopback4));
+ ASIO_CHECK(!enable_loopback4);
+#endif // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ }
+
+ if (have_v6)
+ {
+ ip::multicast::enable_loopback enable_loopback1(true);
+ ASIO_CHECK(enable_loopback1.value());
+ ASIO_CHECK(static_cast<bool>(enable_loopback1));
+ ASIO_CHECK(!!enable_loopback1);
+ sock_v6.set_option(enable_loopback1, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+
+ ip::multicast::enable_loopback enable_loopback2;
+ sock_v6.get_option(enable_loopback2, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+ ASIO_CHECK(enable_loopback2.value());
+ ASIO_CHECK(static_cast<bool>(enable_loopback2));
+ ASIO_CHECK(!!enable_loopback2);
+
+ ip::multicast::enable_loopback enable_loopback3(false);
+ ASIO_CHECK(!enable_loopback3.value());
+ ASIO_CHECK(!static_cast<bool>(enable_loopback3));
+ ASIO_CHECK(!enable_loopback3);
+ sock_v6.set_option(enable_loopback3, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+
+ ip::multicast::enable_loopback enable_loopback4;
+ sock_v6.get_option(enable_loopback4, ec);
+ ASIO_CHECK_MESSAGE(!ec, ec.value() << ", " << ec.message());
+ ASIO_CHECK(!enable_loopback4.value());
+ ASIO_CHECK(!static_cast<bool>(enable_loopback4));
+ ASIO_CHECK(!enable_loopback4);
+ }
+}
+
+} // namespace ip_multicast_runtime
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/multicast",
+ ASIO_COMPILE_TEST_CASE(ip_multicast_compile::test)
+ ASIO_TEST_CASE(ip_multicast_runtime::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/network_v4.cpp b/3rdparty/asio/src/tests/unit/ip/network_v4.cpp
new file mode 100644
index 00000000000..0b7a7a9c783
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/network_v4.cpp
@@ -0,0 +1,314 @@
+//
+// network_v4.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/network_v4.hpp"
+
+#include "../unit_test.hpp"
+#include <sstream>
+
+//------------------------------------------------------------------------------
+
+// ip_network_v4_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::network_v4 compile and link correctly. Runtime failures are ignored.
+
+namespace ip_network_v4_compile {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ asio::error_code ec;
+
+ // network_v4 constructors.
+
+ ip::network_v4 net1(ip::make_address_v4("192.168.1.0"), 32);
+ ip::network_v4 net2(ip::make_address_v4("192.168.1.0"),
+ ip::make_address_v4("255.255.255.0"));
+
+ // network_v4 functions.
+
+ ip::address_v4 addr1 = net1.address();
+ (void)addr1;
+
+ unsigned short prefix_len = net1.prefix_length();
+ (void)prefix_len;
+
+ ip::address_v4 addr2 = net1.netmask();
+ (void)addr2;
+
+ ip::address_v4 addr3 = net1.network();
+ (void)addr3;
+
+ ip::address_v4 addr4 = net1.broadcast();
+ (void)addr4;
+
+ ip::address_v4_range hosts = net1.hosts();
+ (void)hosts;
+
+ ip::network_v4 net3 = net1.canonical();
+ (void)net3;
+
+ bool b1 = net1.is_host();
+ (void)b1;
+
+ bool b2 = net1.is_subnet_of(net2);
+ (void)b2;
+
+ std::string s1 = net1.to_string();
+ (void)s1;
+
+ std::string s2 = net1.to_string(ec);
+ (void)s2;
+
+ // network_v4 comparisons.
+
+ bool b3 = (net1 == net2);
+ (void)b3;
+
+ bool b4 = (net1 != net2);
+ (void)b4;
+
+ // network_v4 creation functions.
+
+ net1 = ip::make_network_v4(ip::address_v4(), 24);
+ net1 = ip::make_network_v4(ip::address_v4(), ip::address_v4());
+ net1 = ip::make_network_v4("10.0.0.0/8");
+ net1 = ip::make_network_v4("10.0.0.0/8", ec);
+ net1 = ip::make_network_v4(s1);
+ net1 = ip::make_network_v4(s1, ec);
+#if defined(ASIO_HAS_STRING_VIEW)
+# if defined(ASIO_HAS_STD_STRING_VIEW)
+ std::string_view string_view_value("10.0.0.0/8");
+# elif defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+ std::experimental::string_view string_view_value("10.0.0.0/8");
+# endif // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+ net1 = ip::make_network_v4(string_view_value);
+ net1 = ip::make_network_v4(string_view_value, ec);
+#endif // defined(ASIO_HAS_STRING_VIEW)
+
+ // network_v4 I/O.
+
+ std::ostringstream os;
+ os << net1;
+
+#if !defined(BOOST_NO_STD_WSTREAMBUF)
+ std::wostringstream wos;
+ wos << net1;
+#endif // !defined(BOOST_NO_STD_WSTREAMBUF)
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_network_v4_compile
+
+//------------------------------------------------------------------------------
+
+// ip_network_v4_runtime test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that the various public member functions meet the
+// necessary postconditions.
+
+namespace ip_network_v4_runtime {
+
+void test()
+{
+ using asio::ip::address_v4;
+ using asio::ip::make_address_v4;
+ using asio::ip::network_v4;
+ using asio::ip::make_network_v4;
+
+ address_v4 addr = make_address_v4("1.2.3.4");
+
+ // calculate prefix length
+
+ network_v4 net1(addr, make_address_v4("255.255.255.0"));
+ ASIO_CHECK(net1.prefix_length() == 24);
+
+ network_v4 net2(addr, make_address_v4("255.255.255.192"));
+ ASIO_CHECK(net2.prefix_length() == 26);
+
+ network_v4 net3(addr, make_address_v4("128.0.0.0"));
+ ASIO_CHECK(net3.prefix_length() == 1);
+
+ std::string msg;
+ try
+ {
+ make_network_v4(addr, make_address_v4("255.255.255.1"));
+ }
+ catch(std::exception& ex)
+ {
+ msg = ex.what();
+ }
+ ASIO_CHECK(msg == std::string("non-contiguous netmask"));
+
+ msg.clear();
+ try
+ {
+ make_network_v4(addr, make_address_v4("0.255.255.0"));
+ }
+ catch(std::exception& ex)
+ {
+ msg = ex.what();
+ }
+ ASIO_CHECK(msg == std::string("non-contiguous netmask"));
+
+ // calculate netmask
+
+ network_v4 net4(addr, 23);
+ ASIO_CHECK(net4.netmask() == make_address_v4("255.255.254.0"));
+
+ network_v4 net5(addr, 12);
+ ASIO_CHECK(net5.netmask() == make_address_v4("255.240.0.0"));
+
+ network_v4 net6(addr, 24);
+ ASIO_CHECK(net6.netmask() == make_address_v4("255.255.255.0"));
+
+ network_v4 net7(addr, 16);
+ ASIO_CHECK(net7.netmask() == make_address_v4("255.255.0.0"));
+
+ network_v4 net8(addr, 8);
+ ASIO_CHECK(net8.netmask() == make_address_v4("255.0.0.0"));
+
+ network_v4 net9(addr, 32);
+ ASIO_CHECK(net9.netmask() == make_address_v4("255.255.255.255"));
+
+ network_v4 net10(addr, 1);
+ ASIO_CHECK(net10.netmask() == make_address_v4("128.0.0.0"));
+
+ network_v4 net11(addr, 0);
+ ASIO_CHECK(net11.netmask() == make_address_v4("0.0.0.0"));
+
+ msg.clear();
+ try
+ {
+ make_network_v4(addr, 33);
+ }
+ catch(std::out_of_range& ex)
+ {
+ msg = ex.what();
+ }
+ ASIO_CHECK(msg == std::string("prefix length too large"));
+
+ // construct address range from address and prefix length
+ ASIO_CHECK(network_v4(make_address_v4("192.168.77.100"), 32).network() == make_address_v4("192.168.77.100"));
+ ASIO_CHECK(network_v4(make_address_v4("192.168.77.100"), 24).network() == make_address_v4("192.168.77.0"));
+ ASIO_CHECK(network_v4(make_address_v4("192.168.77.128"), 25).network() == make_address_v4("192.168.77.128"));
+
+ // construct address range from string in CIDR notation
+ ASIO_CHECK(make_network_v4("192.168.77.100/32").network() == make_address_v4("192.168.77.100"));
+ ASIO_CHECK(make_network_v4("192.168.77.100/24").network() == make_address_v4("192.168.77.0"));
+ ASIO_CHECK(make_network_v4("192.168.77.128/25").network() == make_address_v4("192.168.77.128"));
+
+ // construct network from invalid string
+ asio::error_code ec;
+ make_network_v4("10.0.0.256/24", ec);
+ ASIO_CHECK(!!ec);
+ make_network_v4("10.0.0.0/33", ec);
+ ASIO_CHECK(!!ec);
+ make_network_v4("10.0.0.0/-1", ec);
+ ASIO_CHECK(!!ec);
+ make_network_v4("10.0.0.0/", ec);
+ ASIO_CHECK(!!ec);
+ make_network_v4("10.0.0.0", ec);
+ ASIO_CHECK(!!ec);
+
+ // prefix length
+ ASIO_CHECK(make_network_v4("193.99.144.80/24").prefix_length() == 24);
+ ASIO_CHECK(network_v4(make_address_v4("193.99.144.80"), 24).prefix_length() == 24);
+ ASIO_CHECK(network_v4(make_address_v4("192.168.77.0"), make_address_v4("255.255.255.0")).prefix_length() == 24);
+
+ // to string
+ std::string a("192.168.77.0/32");
+ ASIO_CHECK(make_network_v4(a.c_str()).to_string() == a);
+ ASIO_CHECK(network_v4(make_address_v4("192.168.77.10"), 24).to_string() == std::string("192.168.77.10/24"));
+
+ // return host part
+ ASIO_CHECK(make_network_v4("192.168.77.11/24").address() == make_address_v4("192.168.77.11"));
+
+ // return host in CIDR notation
+ ASIO_CHECK(make_network_v4("192.168.78.30/20").address().to_string() == "192.168.78.30");
+
+ // return network in CIDR notation
+ ASIO_CHECK(make_network_v4("192.168.78.30/20").canonical().to_string() == "192.168.64.0/20");
+
+ // is host
+ ASIO_CHECK(make_network_v4("192.168.77.0/32").is_host());
+ ASIO_CHECK(!make_network_v4("192.168.77.0/31").is_host());
+
+ // is real subnet of
+ ASIO_CHECK(make_network_v4("192.168.0.192/24").is_subnet_of(make_network_v4("192.168.0.0/16")));
+ ASIO_CHECK(make_network_v4("192.168.0.0/24").is_subnet_of(make_network_v4("192.168.192.168/16")));
+ ASIO_CHECK(make_network_v4("192.168.0.192/24").is_subnet_of(make_network_v4("192.168.192.168/16")));
+ ASIO_CHECK(make_network_v4("192.168.0.0/24").is_subnet_of(make_network_v4("192.168.0.0/16")));
+ ASIO_CHECK(make_network_v4("192.168.0.0/24").is_subnet_of(make_network_v4("192.168.0.0/23")));
+ ASIO_CHECK(make_network_v4("192.168.0.0/24").is_subnet_of(make_network_v4("192.168.0.0/0")));
+ ASIO_CHECK(make_network_v4("192.168.0.0/32").is_subnet_of(make_network_v4("192.168.0.0/24")));
+
+ ASIO_CHECK(!make_network_v4("192.168.0.0/32").is_subnet_of(make_network_v4("192.168.0.0/32")));
+ ASIO_CHECK(!make_network_v4("192.168.0.0/24").is_subnet_of(make_network_v4("192.168.1.0/24")));
+ ASIO_CHECK(!make_network_v4("192.168.0.0/16").is_subnet_of(make_network_v4("192.168.1.0/24")));
+
+ network_v4 r(make_network_v4("192.168.0.0/24"));
+ ASIO_CHECK(!r.is_subnet_of(r));
+
+ network_v4 net12(make_network_v4("192.168.0.2/24"));
+ network_v4 net13(make_network_v4("192.168.1.1/28"));
+ network_v4 net14(make_network_v4("192.168.1.21/28"));
+ // network
+ ASIO_CHECK(net12.network() == make_address_v4("192.168.0.0"));
+ ASIO_CHECK(net13.network() == make_address_v4("192.168.1.0"));
+ ASIO_CHECK(net14.network() == make_address_v4("192.168.1.16"));
+ // netmask
+ ASIO_CHECK(net12.netmask() == make_address_v4("255.255.255.0"));
+ ASIO_CHECK(net13.netmask() == make_address_v4("255.255.255.240"));
+ ASIO_CHECK(net14.netmask() == make_address_v4("255.255.255.240"));
+ // broadcast
+ ASIO_CHECK(net12.broadcast() == make_address_v4("192.168.0.255"));
+ ASIO_CHECK(net13.broadcast() == make_address_v4("192.168.1.15"));
+ ASIO_CHECK(net14.broadcast() == make_address_v4("192.168.1.31"));
+ // iterator
+ ASIO_CHECK(std::distance(net12.hosts().begin(),net12.hosts().end()) == 254);
+ ASIO_CHECK(*net12.hosts().begin() == make_address_v4("192.168.0.1"));
+ ASIO_CHECK(net12.hosts().end() != net12.hosts().find(make_address_v4("192.168.0.10")));
+ ASIO_CHECK(net12.hosts().end() == net12.hosts().find(make_address_v4("192.168.1.10")));
+ ASIO_CHECK(std::distance(net13.hosts().begin(),net13.hosts().end()) == 14);
+ ASIO_CHECK(*net13.hosts().begin() == make_address_v4("192.168.1.1"));
+ ASIO_CHECK(net13.hosts().end() != net13.hosts().find(make_address_v4("192.168.1.14")));
+ ASIO_CHECK(net13.hosts().end() == net13.hosts().find(make_address_v4("192.168.1.15")));
+ ASIO_CHECK(std::distance(net14.hosts().begin(),net14.hosts().end()) == 14);
+ ASIO_CHECK(*net14.hosts().begin() == make_address_v4("192.168.1.17"));
+ ASIO_CHECK(net14.hosts().end() != net14.hosts().find(make_address_v4("192.168.1.30")));
+ ASIO_CHECK(net14.hosts().end() == net14.hosts().find(make_address_v4("192.168.1.31")));
+}
+
+} // namespace ip_network_v4_runtime
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/network_v4",
+ ASIO_COMPILE_TEST_CASE(ip_network_v4_compile::test)
+ ASIO_TEST_CASE(ip_network_v4_runtime::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/network_v6.cpp b/3rdparty/asio/src/tests/unit/ip/network_v6.cpp
new file mode 100644
index 00000000000..d80b1d447b6
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/network_v6.cpp
@@ -0,0 +1,238 @@
+//
+// network_v6.cpp
+// ~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 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)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/network_v6.hpp"
+
+#include "../unit_test.hpp"
+#include <sstream>
+
+//------------------------------------------------------------------------------
+
+// ip_network_v6_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::network_v6 compile and link correctly. Runtime failures are ignored.
+
+namespace ip_network_v6_compile {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ asio::error_code ec;
+
+ // network_v6 constructors.
+
+ ip::network_v6 net1(ip::make_address_v6("2001:370::10:7344"), 64);
+ ip::network_v6 net2(ip::make_address_v6("2001:370::10:7345"), 96);
+
+ // network_v6 functions.
+
+ ip::address_v6 addr1 = net1.address();
+ (void)addr1;
+
+ unsigned short prefix_len = net1.prefix_length();
+ (void)prefix_len;
+
+ ip::address_v6 addr3 = net1.network();
+ (void)addr3;
+
+ ip::address_v6_range hosts = net1.hosts();
+ (void)hosts;
+
+ ip::network_v6 net3 = net1.canonical();
+ (void)net3;
+
+ bool b1 = net1.is_host();
+ (void)b1;
+
+ bool b2 = net1.is_subnet_of(net2);
+ (void)b2;
+
+ std::string s1 = net1.to_string();
+ (void)s1;
+
+ std::string s2 = net1.to_string(ec);
+ (void)s2;
+
+ // network_v6 comparisons.
+
+ bool b3 = (net1 == net2);
+ (void)b3;
+
+ bool b4 = (net1 != net2);
+ (void)b4;
+
+ // network_v6 creation functions.
+
+ net1 = ip::make_network_v6(ip::address_v6(), 24);
+ net1 = ip::make_network_v6("10.0.0.0/8");
+ net1 = ip::make_network_v6("10.0.0.0/8", ec);
+ net1 = ip::make_network_v6(s1);
+ net1 = ip::make_network_v6(s1, ec);
+#if defined(ASIO_HAS_STRING_VIEW)
+# if defined(ASIO_HAS_STD_STRING_VIEW)
+ std::string_view string_view_value("0::0/8");
+# elif defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+ std::experimental::string_view string_view_value("0::0/8");
+# endif // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW)
+ net1 = ip::make_network_v6(string_view_value);
+ net1 = ip::make_network_v6(string_view_value, ec);
+#endif // defined(ASIO_STD_STRING_VIEW)
+
+ // network_v6 I/O.
+
+ std::ostringstream os;
+ os << net1;
+
+#if !defined(BOOST_NO_STD_WSTREAMBUF)
+ std::wostringstream wos;
+ wos << net1;
+#endif // !defined(BOOST_NO_STD_WSTREAMBUF)
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_network_v6_compile
+
+//------------------------------------------------------------------------------
+
+// ip_network_v6_runtime test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that the various public member functions meet the
+// necessary postconditions.
+
+namespace ip_network_v6_runtime {
+
+void test()
+{
+ using asio::ip::address_v6;
+ using asio::ip::make_address_v6;
+ using asio::ip::network_v6;
+ using asio::ip::make_network_v6;
+
+ address_v6 addr = make_address_v6("2001:370::10:7344");
+
+ std::string msg;
+ try
+ {
+ make_network_v6(addr, 129);
+ }
+ catch(std::out_of_range& ex)
+ {
+ msg = ex.what();
+ }
+ ASIO_CHECK(msg == std::string("prefix length too large"));
+
+ // construct address range from address and prefix length
+ ASIO_CHECK(network_v6(make_address_v6("2001:370::10:7344"), 128).network() == make_address_v6("2001:370::10:7344"));
+ ASIO_CHECK(network_v6(make_address_v6("2001:370::10:7344"), 64).network() == make_address_v6("2001:370::"));
+ ASIO_CHECK(network_v6(make_address_v6("2001:370::10:7344"), 27).network() == make_address_v6("2001:360::"));
+
+ // construct address range from string in CIDR notation
+ ASIO_CHECK(make_network_v6("2001:370::10:7344/128").network() == make_address_v6("2001:370::10:7344"));
+ ASIO_CHECK(make_network_v6("2001:370::10:7344/64").network() == make_address_v6("2001:370::"));
+ ASIO_CHECK(make_network_v6("2001:370::10:7344/27").network() == make_address_v6("2001:360::"));
+
+ // construct network from invalid string
+ asio::error_code ec;
+ make_network_v6("a:b/24", ec);
+ ASIO_CHECK(!!ec);
+ make_network_v6("2001:370::10:7344/129", ec);
+ ASIO_CHECK(!!ec);
+ make_network_v6("2001:370::10:7344/-1", ec);
+ ASIO_CHECK(!!ec);
+ make_network_v6("2001:370::10:7344/", ec);
+ ASIO_CHECK(!!ec);
+ make_network_v6("2001:370::10:7344", ec);
+ ASIO_CHECK(!!ec);
+
+ // prefix length
+ ASIO_CHECK(make_network_v6("2001:370::10:7344/128").prefix_length() == 128);
+ ASIO_CHECK(network_v6(make_address_v6("2001:370::10:7344"), 27).prefix_length() == 27);
+
+ // to string
+ std::string a("2001:370::10:7344/64");
+ ASIO_CHECK(make_network_v6(a.c_str()).to_string() == a);
+ ASIO_CHECK(network_v6(make_address_v6("2001:370::10:7344"), 27).to_string() == std::string("2001:370::10:7344/27"));
+
+ // return host part
+ ASIO_CHECK(make_network_v6("2001:370::10:7344/64").address() == make_address_v6("2001:370::10:7344"));
+ ASIO_CHECK(make_network_v6("2001:370::10:7344/27").address().to_string() == "2001:370::10:7344");
+
+ // return network in CIDR notation
+ ASIO_CHECK(make_network_v6("2001:370::10:7344/27").canonical().to_string() == "2001:360::/27");
+
+ // is host
+ ASIO_CHECK(make_network_v6("2001:370::10:7344/128").is_host());
+ ASIO_CHECK(!make_network_v6("2001:370::10:7344/127").is_host());
+
+ // is real subnet of
+ ASIO_CHECK(make_network_v6("2001:370::10:3744/64").is_subnet_of(make_network_v6("2001:370::/16")));
+ ASIO_CHECK(make_network_v6("2001:370::/64").is_subnet_of(make_network_v6("2001:370::/16")));
+ ASIO_CHECK(make_network_v6("2001:0db8:85a3::/64").is_subnet_of(make_network_v6("2001:0d00::/24")));
+
+ ASIO_CHECK(!make_network_v6("2001:370::10:3744/128").is_subnet_of(make_network_v6("2001:370::10:3744/128")));
+ ASIO_CHECK(make_network_v6("2001:0db8:85a3::/64").is_subnet_of(make_network_v6("2001:0dc0::/24")));
+
+ network_v6 r(make_network_v6("2001:370::/64"));
+ ASIO_CHECK(!r.is_subnet_of(r));
+
+ network_v6 net12(make_network_v6("2001:370::10:7344/64"));
+ network_v6 net13(make_network_v6("2001:0db8::/127"));
+ network_v6 net14(make_network_v6("2001:0db8::/125"));
+ network_v6 net15(make_network_v6("2001:0db8::/119"));
+
+ // network
+ ASIO_CHECK(net12.network() == make_address_v6("2001:370::"));
+ ASIO_CHECK(net13.network() == make_address_v6("2001:0db8::"));
+ ASIO_CHECK(net14.network() == make_address_v6("2001:0db8::"));
+ ASIO_CHECK(net15.network() == make_address_v6("2001:0db8::"));
+
+ // iterator
+ //ASIO_CHECK(std::distance(net12.hosts().begin(),net12.hosts().end()) == 18446744073709552000);
+ ASIO_CHECK(std::distance(net13.hosts().begin(),net13.hosts().end()) == 2);
+ ASIO_CHECK(std::distance(net14.hosts().begin(),net14.hosts().end()) == 8);
+ ASIO_CHECK(std::distance(net15.hosts().begin(),net15.hosts().end()) == 512);
+ ASIO_CHECK(*net12.hosts().begin() == make_address_v6("2001:0370::"));
+ ASIO_CHECK(net12.hosts().end() != net12.hosts().find(make_address_v6("2001:0370::ffff:ffff:ffff:ffff")));
+ ASIO_CHECK(*net13.hosts().begin() == make_address_v6("2001:0db8::"));
+ ASIO_CHECK(net13.hosts().end() != net13.hosts().find(make_address_v6("2001:0db8::1")));
+ ASIO_CHECK(net13.hosts().end() == net13.hosts().find(make_address_v6("2001:0db8::2")));
+ ASIO_CHECK(*net14.hosts().begin() == make_address_v6("2001:0db8::"));
+ ASIO_CHECK(net14.hosts().end() != net14.hosts().find(make_address_v6("2001:0db8::7")));
+ ASIO_CHECK(net14.hosts().end() == net14.hosts().find(make_address_v6("2001:0db8::8")));
+ ASIO_CHECK(*net15.hosts().begin() == make_address_v6("2001:0db8::"));
+ ASIO_CHECK(net15.hosts().end() != net15.hosts().find(make_address_v6("2001:0db8::01ff")));
+ ASIO_CHECK(net15.hosts().end() == net15.hosts().find(make_address_v6("2001:0db8::0200")));
+}
+
+} // namespace ip_network_v6_runtime
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/network_v6",
+ ASIO_COMPILE_TEST_CASE(ip_network_v6_compile::test)
+ ASIO_TEST_CASE(ip_network_v6_runtime::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/resolver_query_base.cpp b/3rdparty/asio/src/tests/unit/ip/resolver_query_base.cpp
new file mode 100644
index 00000000000..b38f5091b53
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/resolver_query_base.cpp
@@ -0,0 +1,25 @@
+//
+// resolver_query_base.cpp
+// ~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/resolver_query_base.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "ip/resolver_query_base",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/tcp.cpp b/3rdparty/asio/src/tests/unit/ip/tcp.cpp
new file mode 100644
index 00000000000..2bbdc3a1071
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/tcp.cpp
@@ -0,0 +1,1336 @@
+//
+// tcp.cpp
+// ~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Enable cancel() support on Windows.
+#define ASIO_ENABLE_CANCELIO 1
+
+// Test that header file is self-contained.
+#include "asio/ip/tcp.hpp"
+
+#include <cstring>
+#include <functional>
+#include "asio/io_context.hpp"
+#include "asio/read.hpp"
+#include "asio/write.hpp"
+#include "../unit_test.hpp"
+#include "../archetypes/async_result.hpp"
+#include "../archetypes/gettable_socket_option.hpp"
+#include "../archetypes/io_control_command.hpp"
+#include "../archetypes/settable_socket_option.hpp"
+
+#if defined(ASIO_HAS_BOOST_ARRAY)
+# include <boost/array.hpp>
+#else // defined(ASIO_HAS_BOOST_ARRAY)
+# include <array>
+#endif // defined(ASIO_HAS_BOOST_ARRAY)
+
+//------------------------------------------------------------------------------
+
+// ip_tcp_compile test
+// ~~~~~~~~~~~~~~~~~~~
+// The following test checks that all nested classes, enums and constants in
+// ip::tcp compile and link correctly. Runtime failures are ignored.
+
+namespace ip_tcp_compile {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ io_context ioc;
+ ip::tcp::socket sock(ioc);
+
+ // no_delay class.
+
+ ip::tcp::no_delay no_delay1(true);
+ sock.set_option(no_delay1);
+ ip::tcp::no_delay no_delay2;
+ sock.get_option(no_delay2);
+ no_delay1 = true;
+ (void)static_cast<bool>(no_delay1);
+ (void)static_cast<bool>(!no_delay1);
+ (void)static_cast<bool>(no_delay1.value());
+
+ ip::tcp::endpoint ep;
+ (void)static_cast<std::size_t>(std::hash<ip::tcp::endpoint>()(ep));
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_tcp_compile
+
+//------------------------------------------------------------------------------
+
+// ip_tcp_runtime test
+// ~~~~~~~~~~~~~~~~~~~
+// The following test checks the runtime operation of the ip::tcp class.
+
+namespace ip_tcp_runtime {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ io_context ioc;
+ ip::tcp::socket sock(ioc, ip::tcp::v4());
+ asio::error_code ec;
+
+ // no_delay class.
+
+ ip::tcp::no_delay no_delay1(true);
+ ASIO_CHECK(no_delay1.value());
+ ASIO_CHECK(static_cast<bool>(no_delay1));
+ ASIO_CHECK(!!no_delay1);
+ sock.set_option(no_delay1, ec);
+ ASIO_CHECK(!ec);
+
+ ip::tcp::no_delay no_delay2;
+ sock.get_option(no_delay2, ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(no_delay2.value());
+ ASIO_CHECK(static_cast<bool>(no_delay2));
+ ASIO_CHECK(!!no_delay2);
+
+ ip::tcp::no_delay no_delay3(false);
+ ASIO_CHECK(!no_delay3.value());
+ ASIO_CHECK(!static_cast<bool>(no_delay3));
+ ASIO_CHECK(!no_delay3);
+ sock.set_option(no_delay3, ec);
+ ASIO_CHECK(!ec);
+
+ ip::tcp::no_delay no_delay4;
+ sock.get_option(no_delay4, ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(!no_delay4.value());
+ ASIO_CHECK(!static_cast<bool>(no_delay4));
+ ASIO_CHECK(!no_delay4);
+}
+
+} // namespace ip_tcp_runtime
+
+//------------------------------------------------------------------------------
+
+// ip_tcp_socket_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::tcp::socket compile and link correctly. Runtime failures are ignored.
+
+namespace ip_tcp_socket_compile {
+
+struct connect_handler
+{
+ connect_handler() {}
+ void operator()(const asio::error_code&) {}
+ connect_handler(connect_handler&&) {}
+private:
+ connect_handler(const connect_handler&);
+};
+
+struct wait_handler
+{
+ wait_handler() {}
+ void operator()(const asio::error_code&) {}
+ wait_handler(wait_handler&&) {}
+private:
+ wait_handler(const wait_handler&);
+};
+
+struct send_handler
+{
+ send_handler() {}
+ void operator()(const asio::error_code&, std::size_t) {}
+ send_handler(send_handler&&) {}
+private:
+ send_handler(const send_handler&);
+};
+
+struct receive_handler
+{
+ receive_handler() {}
+ void operator()(const asio::error_code&, std::size_t) {}
+ receive_handler(receive_handler&&) {}
+private:
+ receive_handler(const receive_handler&);
+};
+
+struct write_some_handler
+{
+ write_some_handler() {}
+ void operator()(const asio::error_code&, std::size_t) {}
+ write_some_handler(write_some_handler&&) {}
+private:
+ write_some_handler(const write_some_handler&);
+};
+
+struct read_some_handler
+{
+ read_some_handler() {}
+ void operator()(const asio::error_code&, std::size_t) {}
+ read_some_handler(read_some_handler&&) {}
+private:
+ read_some_handler(const read_some_handler&);
+};
+
+void test()
+{
+#if defined(ASIO_HAS_BOOST_ARRAY)
+ using boost::array;
+#else // defined(ASIO_HAS_BOOST_ARRAY)
+ using std::array;
+#endif // defined(ASIO_HAS_BOOST_ARRAY)
+
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ io_context ioc;
+ const io_context::executor_type ioc_ex = ioc.get_executor();
+ char mutable_char_buffer[128] = "";
+ const char const_char_buffer[128] = "";
+ array<asio::mutable_buffer, 2> mutable_buffers = {{
+ asio::buffer(mutable_char_buffer, 10),
+ asio::buffer(mutable_char_buffer + 10, 10) }};
+ array<asio::const_buffer, 2> const_buffers = {{
+ asio::buffer(const_char_buffer, 10),
+ asio::buffer(const_char_buffer + 10, 10) }};
+ socket_base::message_flags in_flags = 0;
+ archetypes::settable_socket_option<void> settable_socket_option1;
+ archetypes::settable_socket_option<int> settable_socket_option2;
+ archetypes::settable_socket_option<double> settable_socket_option3;
+ archetypes::gettable_socket_option<void> gettable_socket_option1;
+ archetypes::gettable_socket_option<int> gettable_socket_option2;
+ archetypes::gettable_socket_option<double> gettable_socket_option3;
+ archetypes::io_control_command io_control_command;
+ archetypes::immediate_handler immediate;
+ archetypes::lazy_handler lazy;
+ asio::error_code ec;
+
+ // basic_stream_socket constructors.
+
+ ip::tcp::socket socket1(ioc);
+ ip::tcp::socket socket2(ioc, ip::tcp::v4());
+ ip::tcp::socket socket3(ioc, ip::tcp::v6());
+ ip::tcp::socket socket4(ioc, ip::tcp::endpoint(ip::tcp::v4(), 0));
+ ip::tcp::socket socket5(ioc, ip::tcp::endpoint(ip::tcp::v6(), 0));
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ ip::tcp::socket::native_handle_type native_socket1
+ = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ ip::tcp::socket socket6(ioc, ip::tcp::v4(), native_socket1);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ ip::tcp::socket socket7(ioc_ex);
+ ip::tcp::socket socket8(ioc_ex, ip::tcp::v4());
+ ip::tcp::socket socket9(ioc_ex, ip::tcp::v6());
+ ip::tcp::socket socket10(ioc_ex, ip::tcp::endpoint(ip::tcp::v4(), 0));
+ ip::tcp::socket socket11(ioc_ex, ip::tcp::endpoint(ip::tcp::v6(), 0));
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ ip::tcp::socket::native_handle_type native_socket2
+ = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ ip::tcp::socket socket12(ioc_ex, ip::tcp::v4(), native_socket2);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ ip::tcp::socket socket13(std::move(socket5));
+
+ // basic_stream_socket operators.
+
+ socket1 = ip::tcp::socket(ioc);
+ socket1 = std::move(socket2);
+
+ // basic_io_object functions.
+
+ ip::tcp::socket::executor_type ex = socket1.get_executor();
+ (void)ex;
+
+ // basic_socket functions.
+
+ ip::tcp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
+ (void)lowest_layer;
+
+ const ip::tcp::socket& socket14 = socket1;
+ const ip::tcp::socket::lowest_layer_type& lowest_layer2
+ = socket14.lowest_layer();
+ (void)lowest_layer2;
+
+ socket1.open(ip::tcp::v4());
+ socket1.open(ip::tcp::v6());
+ socket1.open(ip::tcp::v4(), ec);
+ socket1.open(ip::tcp::v6(), ec);
+
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ ip::tcp::socket::native_handle_type native_socket3
+ = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ socket1.assign(ip::tcp::v4(), native_socket3);
+ ip::tcp::socket::native_handle_type native_socket4
+ = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ socket1.assign(ip::tcp::v4(), native_socket4, ec);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ bool is_open = socket1.is_open();
+ (void)is_open;
+
+ socket1.close();
+ socket1.close(ec);
+
+ socket1.release();
+ socket1.release(ec);
+
+ ip::tcp::socket::native_handle_type native_socket5
+ = socket1.native_handle();
+ (void)native_socket5;
+
+ socket1.cancel();
+ socket1.cancel(ec);
+
+ bool at_mark1 = socket1.at_mark();
+ (void)at_mark1;
+ bool at_mark2 = socket1.at_mark(ec);
+ (void)at_mark2;
+
+ std::size_t available1 = socket1.available();
+ (void)available1;
+ std::size_t available2 = socket1.available(ec);
+ (void)available2;
+
+ socket1.bind(ip::tcp::endpoint(ip::tcp::v4(), 0));
+ socket1.bind(ip::tcp::endpoint(ip::tcp::v6(), 0));
+ socket1.bind(ip::tcp::endpoint(ip::tcp::v4(), 0), ec);
+ socket1.bind(ip::tcp::endpoint(ip::tcp::v6(), 0), ec);
+
+ socket1.connect(ip::tcp::endpoint(ip::tcp::v4(), 0));
+ socket1.connect(ip::tcp::endpoint(ip::tcp::v6(), 0));
+ socket1.connect(ip::tcp::endpoint(ip::tcp::v4(), 0), ec);
+ socket1.connect(ip::tcp::endpoint(ip::tcp::v6(), 0), ec);
+
+ socket1.async_connect(ip::tcp::endpoint(ip::tcp::v4(), 0),
+ connect_handler());
+ socket1.async_connect(ip::tcp::endpoint(ip::tcp::v6(), 0),
+ connect_handler());
+ socket1.async_connect(ip::tcp::endpoint(ip::tcp::v4(), 0), immediate);
+ socket1.async_connect(ip::tcp::endpoint(ip::tcp::v6(), 0), immediate);
+ int i1 = socket1.async_connect(ip::tcp::endpoint(ip::tcp::v4(), 0), lazy);
+ (void)i1;
+ int i2 = socket1.async_connect(ip::tcp::endpoint(ip::tcp::v6(), 0), lazy);
+ (void)i2;
+
+ socket1.set_option(settable_socket_option1);
+ socket1.set_option(settable_socket_option1, ec);
+ socket1.set_option(settable_socket_option2);
+ socket1.set_option(settable_socket_option2, ec);
+ socket1.set_option(settable_socket_option3);
+ socket1.set_option(settable_socket_option3, ec);
+
+ socket1.get_option(gettable_socket_option1);
+ socket1.get_option(gettable_socket_option1, ec);
+ socket1.get_option(gettable_socket_option2);
+ socket1.get_option(gettable_socket_option2, ec);
+ socket1.get_option(gettable_socket_option3);
+ socket1.get_option(gettable_socket_option3, ec);
+
+ socket1.io_control(io_control_command);
+ socket1.io_control(io_control_command, ec);
+
+ bool non_blocking1 = socket1.non_blocking();
+ (void)non_blocking1;
+ socket1.non_blocking(true);
+ socket1.non_blocking(false, ec);
+
+ bool non_blocking2 = socket1.native_non_blocking();
+ (void)non_blocking2;
+ socket1.native_non_blocking(true);
+ socket1.native_non_blocking(false, ec);
+
+ ip::tcp::endpoint endpoint1 = socket1.local_endpoint();
+ (void)endpoint1;
+ ip::tcp::endpoint endpoint2 = socket1.local_endpoint(ec);
+ (void)endpoint2;
+
+ ip::tcp::endpoint endpoint3 = socket1.remote_endpoint();
+ (void)endpoint3;
+ ip::tcp::endpoint endpoint4 = socket1.remote_endpoint(ec);
+ (void)endpoint4;
+
+ socket1.shutdown(socket_base::shutdown_both);
+ socket1.shutdown(socket_base::shutdown_both, ec);
+
+ socket1.wait(socket_base::wait_read);
+ socket1.wait(socket_base::wait_write, ec);
+
+ socket1.async_wait(socket_base::wait_read, wait_handler());
+ socket1.async_wait(socket_base::wait_read, immediate);
+ int i3 = socket1.async_wait(socket_base::wait_write, lazy);
+ (void)i3;
+
+ // basic_stream_socket functions.
+
+ socket1.send(buffer(mutable_char_buffer));
+ socket1.send(buffer(const_char_buffer));
+ socket1.send(mutable_buffers);
+ socket1.send(const_buffers);
+ socket1.send(null_buffers());
+ socket1.send(buffer(mutable_char_buffer), in_flags);
+ socket1.send(buffer(const_char_buffer), in_flags);
+ socket1.send(mutable_buffers, in_flags);
+ socket1.send(const_buffers, in_flags);
+ socket1.send(null_buffers(), in_flags);
+ socket1.send(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.send(buffer(const_char_buffer), in_flags, ec);
+ socket1.send(mutable_buffers, in_flags, ec);
+ socket1.send(const_buffers, in_flags, ec);
+ socket1.send(null_buffers(), in_flags, ec);
+
+ socket1.async_send(buffer(mutable_char_buffer), send_handler());
+ socket1.async_send(buffer(const_char_buffer), send_handler());
+ socket1.async_send(mutable_buffers, send_handler());
+ socket1.async_send(const_buffers, send_handler());
+ socket1.async_send(null_buffers(), send_handler());
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler());
+ socket1.async_send(buffer(const_char_buffer), in_flags, send_handler());
+ socket1.async_send(mutable_buffers, in_flags, send_handler());
+ socket1.async_send(const_buffers, in_flags, send_handler());
+ socket1.async_send(null_buffers(), in_flags, send_handler());
+ socket1.async_send(buffer(mutable_char_buffer), immediate);
+ socket1.async_send(buffer(const_char_buffer), immediate);
+ socket1.async_send(mutable_buffers, immediate);
+ socket1.async_send(const_buffers, immediate);
+ socket1.async_send(null_buffers(), immediate);
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, immediate);
+ socket1.async_send(buffer(const_char_buffer), in_flags, immediate);
+ socket1.async_send(mutable_buffers, in_flags, immediate);
+ socket1.async_send(const_buffers, in_flags, immediate);
+ socket1.async_send(null_buffers(), in_flags, immediate);
+ int i4 = socket1.async_send(buffer(mutable_char_buffer), lazy);
+ (void)i4;
+ int i5 = socket1.async_send(buffer(const_char_buffer), lazy);
+ (void)i5;
+ int i6 = socket1.async_send(mutable_buffers, lazy);
+ (void)i6;
+ int i7 = socket1.async_send(const_buffers, lazy);
+ (void)i7;
+ int i8 = socket1.async_send(null_buffers(), lazy);
+ (void)i8;
+ int i9 = socket1.async_send(buffer(mutable_char_buffer), in_flags, lazy);
+ (void)i9;
+ int i10 = socket1.async_send(buffer(const_char_buffer), in_flags, lazy);
+ (void)i10;
+ int i11 = socket1.async_send(mutable_buffers, in_flags, lazy);
+ (void)i11;
+ int i12 = socket1.async_send(const_buffers, in_flags, lazy);
+ (void)i12;
+ int i13 = socket1.async_send(null_buffers(), in_flags, lazy);
+ (void)i13;
+
+ socket1.receive(buffer(mutable_char_buffer));
+ socket1.receive(mutable_buffers);
+ socket1.receive(null_buffers());
+ socket1.receive(buffer(mutable_char_buffer), in_flags);
+ socket1.receive(mutable_buffers, in_flags);
+ socket1.receive(null_buffers(), in_flags);
+ socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.receive(mutable_buffers, in_flags, ec);
+ socket1.receive(null_buffers(), in_flags, ec);
+
+ socket1.async_receive(buffer(mutable_char_buffer), receive_handler());
+ socket1.async_receive(mutable_buffers, receive_handler());
+ socket1.async_receive(null_buffers(), receive_handler());
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags,
+ receive_handler());
+ socket1.async_receive(mutable_buffers, in_flags, receive_handler());
+ socket1.async_receive(null_buffers(), in_flags, receive_handler());
+ socket1.async_receive(buffer(mutable_char_buffer), immediate);
+ socket1.async_receive(mutable_buffers, immediate);
+ socket1.async_receive(null_buffers(), immediate);
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags, immediate);
+ socket1.async_receive(mutable_buffers, in_flags, immediate);
+ socket1.async_receive(null_buffers(), in_flags, immediate);
+ int i14 = socket1.async_receive(buffer(mutable_char_buffer), lazy);
+ (void)i14;
+ int i15 = socket1.async_receive(mutable_buffers, lazy);
+ (void)i15;
+ int i16 = socket1.async_receive(null_buffers(), lazy);
+ (void)i16;
+ int i17 = socket1.async_receive(buffer(mutable_char_buffer), in_flags,
+ lazy);
+ (void)i17;
+ int i18 = socket1.async_receive(mutable_buffers, in_flags, lazy);
+ (void)i18;
+ int i19 = socket1.async_receive(null_buffers(), in_flags, lazy);
+ (void)i19;
+
+ socket1.write_some(buffer(mutable_char_buffer));
+ socket1.write_some(buffer(const_char_buffer));
+ socket1.write_some(mutable_buffers);
+ socket1.write_some(const_buffers);
+ socket1.write_some(null_buffers());
+ socket1.write_some(buffer(mutable_char_buffer), ec);
+ socket1.write_some(buffer(const_char_buffer), ec);
+ socket1.write_some(mutable_buffers, ec);
+ socket1.write_some(const_buffers, ec);
+ socket1.write_some(null_buffers(), ec);
+
+ socket1.async_write_some(buffer(mutable_char_buffer), write_some_handler());
+ socket1.async_write_some(buffer(const_char_buffer), write_some_handler());
+ socket1.async_write_some(mutable_buffers, write_some_handler());
+ socket1.async_write_some(const_buffers, write_some_handler());
+ socket1.async_write_some(null_buffers(), write_some_handler());
+ socket1.async_write_some(buffer(mutable_char_buffer), immediate);
+ socket1.async_write_some(buffer(const_char_buffer), immediate);
+ socket1.async_write_some(mutable_buffers, immediate);
+ socket1.async_write_some(const_buffers, immediate);
+ socket1.async_write_some(null_buffers(), immediate);
+ int i20 = socket1.async_write_some(buffer(mutable_char_buffer), lazy);
+ (void)i20;
+ int i21 = socket1.async_write_some(buffer(const_char_buffer), lazy);
+ (void)i21;
+ int i22 = socket1.async_write_some(mutable_buffers, lazy);
+ (void)i22;
+ int i23 = socket1.async_write_some(const_buffers, lazy);
+ (void)i23;
+ int i24 = socket1.async_write_some(null_buffers(), lazy);
+ (void)i24;
+
+ socket1.read_some(buffer(mutable_char_buffer));
+ socket1.read_some(mutable_buffers);
+ socket1.read_some(null_buffers());
+ socket1.read_some(buffer(mutable_char_buffer), ec);
+ socket1.read_some(mutable_buffers, ec);
+ socket1.read_some(null_buffers(), ec);
+
+ socket1.async_read_some(buffer(mutable_char_buffer), read_some_handler());
+ socket1.async_read_some(mutable_buffers, read_some_handler());
+ socket1.async_read_some(null_buffers(), read_some_handler());
+ socket1.async_read_some(buffer(mutable_char_buffer), immediate);
+ socket1.async_read_some(mutable_buffers, immediate);
+ socket1.async_read_some(null_buffers(), immediate);
+ int i25 = socket1.async_read_some(buffer(mutable_char_buffer), lazy);
+ (void)i25;
+ int i26 = socket1.async_read_some(mutable_buffers, lazy);
+ (void)i26;
+ int i27 = socket1.async_read_some(null_buffers(), lazy);
+ (void)i27;
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_tcp_socket_compile
+
+//------------------------------------------------------------------------------
+
+// ip_tcp_socket_runtime test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks the runtime operation of the ip::tcp::socket class.
+
+namespace ip_tcp_socket_runtime {
+
+static const char write_data[]
+ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+
+void handle_read_noop(const asio::error_code& err,
+ size_t bytes_transferred, bool* called)
+{
+ *called = true;
+ ASIO_CHECK(!err);
+ ASIO_CHECK(bytes_transferred == 0);
+}
+
+void handle_write_noop(const asio::error_code& err,
+ size_t bytes_transferred, bool* called)
+{
+ *called = true;
+ ASIO_CHECK(!err);
+ ASIO_CHECK(bytes_transferred == 0);
+}
+
+void handle_read(const asio::error_code& err,
+ size_t bytes_transferred, bool* called)
+{
+ *called = true;
+ ASIO_CHECK(!err);
+ ASIO_CHECK(bytes_transferred == sizeof(write_data));
+}
+
+void handle_write(const asio::error_code& err,
+ size_t bytes_transferred, bool* called)
+{
+ *called = true;
+ ASIO_CHECK(!err);
+ ASIO_CHECK(bytes_transferred == sizeof(write_data));
+}
+
+void handle_read_cancel(const asio::error_code& err,
+ size_t bytes_transferred, bool* called)
+{
+ *called = true;
+ ASIO_CHECK(err == asio::error::operation_aborted);
+ ASIO_CHECK(bytes_transferred == 0);
+}
+
+void handle_read_eof(const asio::error_code& err,
+ size_t bytes_transferred, bool* called)
+{
+ *called = true;
+ ASIO_CHECK(err == asio::error::eof);
+ ASIO_CHECK(bytes_transferred == 0);
+}
+
+void test()
+{
+ using namespace std; // For memcmp.
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ namespace bindns = std;
+ using bindns::placeholders::_1;
+ using bindns::placeholders::_2;
+
+ io_context ioc;
+
+ ip::tcp::acceptor acceptor(ioc, ip::tcp::endpoint(ip::tcp::v4(), 0));
+ ip::tcp::endpoint server_endpoint = acceptor.local_endpoint();
+ server_endpoint.address(ip::address_v4::loopback());
+
+ ip::tcp::socket client_side_socket(ioc);
+ ip::tcp::socket server_side_socket(ioc);
+
+ client_side_socket.connect(server_endpoint);
+ acceptor.accept(server_side_socket);
+
+ // No-op read.
+
+ bool read_noop_completed = false;
+ client_side_socket.async_read_some(
+ asio::mutable_buffer(0, 0),
+ bindns::bind(handle_read_noop,
+ _1, _2, &read_noop_completed));
+
+ ioc.run();
+ ASIO_CHECK(read_noop_completed);
+
+ // No-op write.
+
+ bool write_noop_completed = false;
+ client_side_socket.async_write_some(
+ asio::const_buffer(0, 0),
+ bindns::bind(handle_write_noop,
+ _1, _2, &write_noop_completed));
+
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(write_noop_completed);
+
+ // Read and write to transfer data.
+
+ char read_buffer[sizeof(write_data)];
+ bool read_completed = false;
+ asio::async_read(client_side_socket,
+ asio::buffer(read_buffer),
+ bindns::bind(handle_read,
+ _1, _2, &read_completed));
+
+ bool write_completed = false;
+ asio::async_write(server_side_socket,
+ asio::buffer(write_data),
+ bindns::bind(handle_write,
+ _1, _2, &write_completed));
+
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(read_completed);
+ ASIO_CHECK(write_completed);
+ ASIO_CHECK(memcmp(read_buffer, write_data, sizeof(write_data)) == 0);
+
+ // Cancelled read.
+
+ bool read_cancel_completed = false;
+ asio::async_read(server_side_socket,
+ asio::buffer(read_buffer),
+ bindns::bind(handle_read_cancel,
+ _1, _2, &read_cancel_completed));
+
+ ioc.restart();
+ ioc.poll();
+ ASIO_CHECK(!read_cancel_completed);
+
+ server_side_socket.cancel();
+
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(read_cancel_completed);
+
+ // A read when the peer closes socket should fail with eof.
+
+ bool read_eof_completed = false;
+ asio::async_read(client_side_socket,
+ asio::buffer(read_buffer),
+ bindns::bind(handle_read_eof,
+ _1, _2, &read_eof_completed));
+
+ server_side_socket.close();
+
+ ioc.restart();
+ ioc.run();
+ ASIO_CHECK(read_eof_completed);
+}
+
+} // namespace ip_tcp_socket_runtime
+
+//------------------------------------------------------------------------------
+
+// ip_tcp_acceptor_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::tcp::acceptor compile and link correctly. Runtime failures are ignored.
+
+namespace ip_tcp_acceptor_compile {
+
+struct wait_handler
+{
+ wait_handler() {}
+ void operator()(const asio::error_code&) {}
+ wait_handler(wait_handler&&) {}
+private:
+ wait_handler(const wait_handler&);
+};
+
+struct accept_handler
+{
+ accept_handler() {}
+ void operator()(const asio::error_code&) {}
+ accept_handler(accept_handler&&) {}
+private:
+ accept_handler(const accept_handler&);
+};
+
+struct move_accept_handler
+{
+ move_accept_handler() {}
+ void operator()(
+ const asio::error_code&, asio::ip::tcp::socket) {}
+ move_accept_handler(move_accept_handler&&) {}
+private:
+ move_accept_handler(const move_accept_handler&) {}
+};
+
+struct move_accept_ioc_handler
+{
+ move_accept_ioc_handler() {}
+ void operator()(const asio::error_code&,
+ asio::basic_stream_socket<asio::ip::tcp,
+ asio::io_context::executor_type>) {}
+ move_accept_ioc_handler(move_accept_handler&&) {}
+private:
+ move_accept_ioc_handler(const move_accept_handler&) {}
+};
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ io_context ioc;
+ const io_context::executor_type ioc_ex = ioc.get_executor();
+ ip::tcp::socket peer_socket1(ioc);
+ asio::basic_stream_socket<ip::tcp,
+ io_context::executor_type> peer_socket2(ioc);
+ ip::tcp::endpoint peer_endpoint;
+ archetypes::settable_socket_option<void> settable_socket_option1;
+ archetypes::settable_socket_option<int> settable_socket_option2;
+ archetypes::settable_socket_option<double> settable_socket_option3;
+ archetypes::gettable_socket_option<void> gettable_socket_option1;
+ archetypes::gettable_socket_option<int> gettable_socket_option2;
+ archetypes::gettable_socket_option<double> gettable_socket_option3;
+ archetypes::io_control_command io_control_command;
+ archetypes::immediate_handler immediate;
+ archetypes::lazy_handler lazy;
+ asio::error_code ec;
+
+ // basic_socket_acceptor constructors.
+
+ ip::tcp::acceptor acceptor1(ioc);
+ ip::tcp::acceptor acceptor2(ioc, ip::tcp::v4());
+ ip::tcp::acceptor acceptor3(ioc, ip::tcp::v6());
+ ip::tcp::acceptor acceptor4(ioc, ip::tcp::endpoint(ip::tcp::v4(), 0));
+ ip::tcp::acceptor acceptor5(ioc, ip::tcp::endpoint(ip::tcp::v6(), 0));
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ ip::tcp::acceptor::native_handle_type native_acceptor1
+ = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ ip::tcp::acceptor acceptor6(ioc, ip::tcp::v4(), native_acceptor1);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ ip::tcp::acceptor acceptor7(ioc_ex);
+ ip::tcp::acceptor acceptor8(ioc_ex, ip::tcp::v4());
+ ip::tcp::acceptor acceptor9(ioc_ex, ip::tcp::v6());
+ ip::tcp::acceptor acceptor10(ioc_ex, ip::tcp::endpoint(ip::tcp::v4(), 0));
+ ip::tcp::acceptor acceptor11(ioc_ex, ip::tcp::endpoint(ip::tcp::v6(), 0));
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ ip::tcp::acceptor::native_handle_type native_acceptor2
+ = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ ip::tcp::acceptor acceptor12(ioc_ex, ip::tcp::v4(), native_acceptor2);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ ip::tcp::acceptor acceptor13(std::move(acceptor5));
+
+ // basic_socket_acceptor operators.
+
+ acceptor1 = ip::tcp::acceptor(ioc);
+ acceptor1 = std::move(acceptor2);
+
+ // basic_io_object functions.
+
+ ip::tcp::acceptor::executor_type ex = acceptor1.get_executor();
+ (void)ex;
+
+ // basic_socket_acceptor functions.
+
+ acceptor1.open(ip::tcp::v4());
+ acceptor1.open(ip::tcp::v6());
+ acceptor1.open(ip::tcp::v4(), ec);
+ acceptor1.open(ip::tcp::v6(), ec);
+
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ ip::tcp::acceptor::native_handle_type native_acceptor3
+ = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ acceptor1.assign(ip::tcp::v4(), native_acceptor3);
+ ip::tcp::acceptor::native_handle_type native_acceptor4
+ = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ acceptor1.assign(ip::tcp::v4(), native_acceptor4, ec);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ bool is_open = acceptor1.is_open();
+ (void)is_open;
+
+ acceptor1.close();
+ acceptor1.close(ec);
+
+ acceptor1.release();
+ acceptor1.release(ec);
+
+ ip::tcp::acceptor::native_handle_type native_acceptor5
+ = acceptor1.native_handle();
+ (void)native_acceptor5;
+
+ acceptor1.cancel();
+ acceptor1.cancel(ec);
+
+ acceptor1.bind(ip::tcp::endpoint(ip::tcp::v4(), 0));
+ acceptor1.bind(ip::tcp::endpoint(ip::tcp::v6(), 0));
+ acceptor1.bind(ip::tcp::endpoint(ip::tcp::v4(), 0), ec);
+ acceptor1.bind(ip::tcp::endpoint(ip::tcp::v6(), 0), ec);
+
+ acceptor1.set_option(settable_socket_option1);
+ acceptor1.set_option(settable_socket_option1, ec);
+ acceptor1.set_option(settable_socket_option2);
+ acceptor1.set_option(settable_socket_option2, ec);
+ acceptor1.set_option(settable_socket_option3);
+ acceptor1.set_option(settable_socket_option3, ec);
+
+ acceptor1.get_option(gettable_socket_option1);
+ acceptor1.get_option(gettable_socket_option1, ec);
+ acceptor1.get_option(gettable_socket_option2);
+ acceptor1.get_option(gettable_socket_option2, ec);
+ acceptor1.get_option(gettable_socket_option3);
+ acceptor1.get_option(gettable_socket_option3, ec);
+
+ acceptor1.io_control(io_control_command);
+ acceptor1.io_control(io_control_command, ec);
+
+ bool non_blocking1 = acceptor1.non_blocking();
+ (void)non_blocking1;
+ acceptor1.non_blocking(true);
+ acceptor1.non_blocking(false, ec);
+
+ bool non_blocking2 = acceptor1.native_non_blocking();
+ (void)non_blocking2;
+ acceptor1.native_non_blocking(true);
+ acceptor1.native_non_blocking(false, ec);
+
+ ip::tcp::endpoint endpoint1 = acceptor1.local_endpoint();
+ (void)endpoint1;
+ ip::tcp::endpoint endpoint2 = acceptor1.local_endpoint(ec);
+ (void)endpoint2;
+
+ acceptor1.wait(socket_base::wait_read);
+ acceptor1.wait(socket_base::wait_write, ec);
+
+ acceptor1.async_wait(socket_base::wait_read, wait_handler());
+ acceptor1.async_wait(socket_base::wait_read, immediate);
+ int i1 = acceptor1.async_wait(socket_base::wait_write, lazy);
+ (void)i1;
+
+ acceptor1.accept(peer_socket1);
+ acceptor1.accept(peer_socket1, ec);
+ acceptor1.accept(peer_socket1, peer_endpoint);
+ acceptor1.accept(peer_socket1, peer_endpoint, ec);
+
+ acceptor1.accept(peer_socket2);
+ acceptor1.accept(peer_socket2, ec);
+ acceptor1.accept(peer_socket2, peer_endpoint);
+ acceptor1.accept(peer_socket2, peer_endpoint, ec);
+
+ peer_socket1 = acceptor1.accept();
+ peer_socket1 = acceptor1.accept(ioc);
+ peer_socket1 = acceptor1.accept(ioc_ex);
+ peer_socket1 = acceptor1.accept(peer_endpoint);
+ peer_socket1 = acceptor1.accept(ioc, peer_endpoint);
+ peer_socket1 = acceptor1.accept(ioc_ex, peer_endpoint);
+ (void)peer_socket1;
+
+ peer_socket2 = acceptor1.accept(ioc);
+ peer_socket2 = acceptor1.accept(ioc_ex);
+ peer_socket2 = acceptor1.accept(ioc, peer_endpoint);
+ peer_socket2 = acceptor1.accept(ioc_ex, peer_endpoint);
+ (void)peer_socket2;
+
+ acceptor1.async_accept(peer_socket1, accept_handler());
+ acceptor1.async_accept(peer_socket1, peer_endpoint, accept_handler());
+ acceptor1.async_accept(peer_socket1, immediate);
+ acceptor1.async_accept(peer_socket1, peer_endpoint, immediate);
+ int i2 = acceptor1.async_accept(peer_socket1, lazy);
+ (void)i2;
+ int i3 = acceptor1.async_accept(peer_socket1, peer_endpoint, lazy);
+ (void)i3;
+
+ acceptor1.async_accept(peer_socket2, accept_handler());
+ acceptor1.async_accept(peer_socket2, peer_endpoint, accept_handler());
+ acceptor1.async_accept(peer_socket2, immediate);
+ acceptor1.async_accept(peer_socket2, peer_endpoint, immediate);
+ int i4 = acceptor1.async_accept(peer_socket2, lazy);
+ (void)i4;
+ int i5 = acceptor1.async_accept(peer_socket2, peer_endpoint, lazy);
+ (void)i5;
+
+ acceptor1.async_accept(move_accept_handler());
+ acceptor1.async_accept(ioc, move_accept_handler());
+ acceptor1.async_accept(ioc_ex, move_accept_handler());
+ acceptor1.async_accept(ioc_ex, move_accept_ioc_handler());
+ acceptor1.async_accept(peer_endpoint, move_accept_handler());
+ acceptor1.async_accept(ioc, peer_endpoint, move_accept_handler());
+ acceptor1.async_accept(ioc_ex, peer_endpoint, move_accept_handler());
+ acceptor1.async_accept(ioc_ex, peer_endpoint, move_accept_ioc_handler());
+ acceptor1.async_accept(immediate);
+ acceptor1.async_accept(ioc, immediate);
+ acceptor1.async_accept(ioc_ex, immediate);
+ acceptor1.async_accept(peer_endpoint, immediate);
+ acceptor1.async_accept(ioc, peer_endpoint, immediate);
+ acceptor1.async_accept(ioc_ex, peer_endpoint, immediate);
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_tcp_acceptor_compile
+
+//------------------------------------------------------------------------------
+
+// ip_tcp_acceptor_runtime test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks the runtime operation of the ip::tcp::acceptor
+// class.
+
+namespace ip_tcp_acceptor_runtime {
+
+void handle_accept(const asio::error_code& err)
+{
+ ASIO_CHECK(!err);
+}
+
+void handle_connect(const asio::error_code& err)
+{
+ ASIO_CHECK(!err);
+}
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ io_context ioc;
+
+ ip::tcp::acceptor acceptor(ioc, ip::tcp::endpoint(ip::tcp::v4(), 0));
+ ip::tcp::endpoint server_endpoint = acceptor.local_endpoint();
+ server_endpoint.address(ip::address_v4::loopback());
+
+ ip::tcp::socket client_side_socket(ioc);
+ ip::tcp::socket server_side_socket(ioc);
+
+ client_side_socket.connect(server_endpoint);
+ acceptor.accept(server_side_socket);
+
+ client_side_socket.close();
+ server_side_socket.close();
+
+ client_side_socket.connect(server_endpoint);
+ ip::tcp::endpoint client_endpoint;
+ acceptor.accept(server_side_socket, client_endpoint);
+
+ ip::tcp::endpoint client_side_local_endpoint
+ = client_side_socket.local_endpoint();
+ ASIO_CHECK(client_side_local_endpoint.port() == client_endpoint.port());
+
+ ip::tcp::endpoint server_side_remote_endpoint
+ = server_side_socket.remote_endpoint();
+ ASIO_CHECK(server_side_remote_endpoint.port()
+ == client_endpoint.port());
+
+ client_side_socket.close();
+ server_side_socket.close();
+
+ acceptor.async_accept(server_side_socket, &handle_accept);
+ client_side_socket.async_connect(server_endpoint, &handle_connect);
+
+ ioc.run();
+
+ client_side_socket.close();
+ server_side_socket.close();
+
+ acceptor.async_accept(server_side_socket, client_endpoint, &handle_accept);
+ client_side_socket.async_connect(server_endpoint, &handle_connect);
+
+ ioc.restart();
+ ioc.run();
+
+ client_side_local_endpoint = client_side_socket.local_endpoint();
+ ASIO_CHECK(client_side_local_endpoint.port() == client_endpoint.port());
+
+ server_side_remote_endpoint = server_side_socket.remote_endpoint();
+ ASIO_CHECK(server_side_remote_endpoint.port()
+ == client_endpoint.port());
+}
+
+} // namespace ip_tcp_acceptor_runtime
+
+//------------------------------------------------------------------------------
+
+// ip_tcp_resolver_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::tcp::resolver compile and link correctly. Runtime failures are ignored.
+
+namespace ip_tcp_resolver_compile {
+
+struct resolve_handler
+{
+ resolve_handler() {}
+ void operator()(const asio::error_code&,
+ asio::ip::tcp::resolver::results_type) {}
+ resolve_handler(resolve_handler&&) {}
+private:
+ resolve_handler(const resolve_handler&);
+};
+
+#if !defined(ASIO_NO_DEPRECATED)
+struct legacy_resolve_handler
+{
+ legacy_resolve_handler() {}
+ void operator()(const asio::error_code&,
+ asio::ip::tcp::resolver::iterator) {}
+ legacy_resolve_handler(legacy_resolve_handler&&) {}
+private:
+ legacy_resolve_handler(const legacy_resolve_handler&);
+};
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ io_context ioc;
+ const io_context::executor_type ioc_ex = ioc.get_executor();
+ archetypes::lazy_handler lazy;
+ asio::error_code ec;
+#if !defined(ASIO_NO_DEPRECATED)
+ ip::tcp::resolver::query q(ip::tcp::v4(), "localhost", "0");
+#endif // !defined(ASIO_NO_DEPRECATED)
+ ip::tcp::endpoint e(ip::address_v4::loopback(), 0);
+
+ // basic_resolver constructors.
+
+ ip::tcp::resolver resolver(ioc);
+ ip::tcp::resolver resolver2(ioc_ex);
+
+ ip::tcp::resolver resolver3(std::move(resolver));
+
+ // basic_resolver operators.
+
+ resolver = ip::tcp::resolver(ioc);
+ resolver = std::move(resolver3);
+
+ // basic_io_object functions.
+
+ ip::tcp::resolver::executor_type ex = resolver.get_executor();
+ (void)ex;
+
+ // basic_resolver functions.
+
+ resolver.cancel();
+
+#if !defined(ASIO_NO_DEPRECATED)
+ ip::tcp::resolver::results_type results1 = resolver.resolve(q);
+ (void)results1;
+
+ ip::tcp::resolver::results_type results2 = resolver.resolve(q, ec);
+ (void)results2;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ ip::tcp::resolver::results_type results3 = resolver.resolve("", "");
+ (void)results3;
+
+ ip::tcp::resolver::results_type results4 = resolver.resolve("", "", ec);
+ (void)results4;
+
+ ip::tcp::resolver::results_type results5 =
+ resolver.resolve("", "", ip::tcp::resolver::flags());
+ (void)results5;
+
+ ip::tcp::resolver::results_type results6 =
+ resolver.resolve("", "", ip::tcp::resolver::flags(), ec);
+ (void)results6;
+
+ ip::tcp::resolver::results_type results7 =
+ resolver.resolve(ip::tcp::v4(), "", "");
+ (void)results7;
+
+ ip::tcp::resolver::results_type results8 =
+ resolver.resolve(ip::tcp::v4(), "", "", ec);
+ (void)results8;
+
+ ip::tcp::resolver::results_type results9 =
+ resolver.resolve(ip::tcp::v4(), "", "", ip::tcp::resolver::flags());
+ (void)results9;
+
+ ip::tcp::resolver::results_type results10 =
+ resolver.resolve(ip::tcp::v4(), "", "", ip::tcp::resolver::flags(), ec);
+ (void)results10;
+
+ ip::tcp::resolver::results_type results11 = resolver.resolve(e);
+ (void)results11;
+
+ ip::tcp::resolver::results_type results12 = resolver.resolve(e, ec);
+ (void)results12;
+
+#if !defined(ASIO_NO_DEPRECATED)
+ resolver.async_resolve(q, resolve_handler());
+ resolver.async_resolve(q, legacy_resolve_handler());
+ int i1 = resolver.async_resolve(q, lazy);
+ (void)i1;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ resolver.async_resolve("", "", resolve_handler());
+#if !defined(ASIO_NO_DEPRECATED)
+ resolver.async_resolve("", "", legacy_resolve_handler());
+#endif // !defined(ASIO_NO_DEPRECATED)
+ int i2 = resolver.async_resolve("", "", lazy);
+ (void)i2;
+
+ resolver.async_resolve("", "",
+ ip::tcp::resolver::flags(), resolve_handler());
+#if !defined(ASIO_NO_DEPRECATED)
+ resolver.async_resolve("", "",
+ ip::tcp::resolver::flags(), legacy_resolve_handler());
+#endif // !defined(ASIO_NO_DEPRECATED)
+ int i3 = resolver.async_resolve("", "",
+ ip::tcp::resolver::flags(), lazy);
+ (void)i3;
+
+ resolver.async_resolve(ip::tcp::v4(), "", "", resolve_handler());
+#if !defined(ASIO_NO_DEPRECATED)
+ resolver.async_resolve(ip::tcp::v4(), "", "", legacy_resolve_handler());
+#endif // !defined(ASIO_NO_DEPRECATED)
+ int i4 = resolver.async_resolve(ip::tcp::v4(), "", "", lazy);
+ (void)i4;
+
+ resolver.async_resolve(ip::tcp::v4(),
+ "", "", ip::tcp::resolver::flags(), resolve_handler());
+#if !defined(ASIO_NO_DEPRECATED)
+ resolver.async_resolve(ip::tcp::v4(),
+ "", "", ip::tcp::resolver::flags(), legacy_resolve_handler());
+#endif // !defined(ASIO_NO_DEPRECATED)
+ int i5 = resolver.async_resolve(ip::tcp::v4(),
+ "", "", ip::tcp::resolver::flags(), lazy);
+ (void)i5;
+
+ resolver.async_resolve(e, resolve_handler());
+#if !defined(ASIO_NO_DEPRECATED)
+ resolver.async_resolve(e, legacy_resolve_handler());
+#endif // !defined(ASIO_NO_DEPRECATED)
+ int i6 = resolver.async_resolve(e, lazy);
+ (void)i6;
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_tcp_resolver_compile
+
+//------------------------------------------------------------------------------
+
+// ip_tcp_resolver_entry_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::tcp::resolver::entry compile and link correctly. Runtime failures are
+// ignored.
+
+namespace ip_tcp_resolver_entry_compile {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+ const ip::tcp::endpoint endpoint;
+ const std::string host_name;
+ const std::string service_name;
+ const std::allocator<char> alloc;
+
+ try
+ {
+ // basic_resolver_entry constructors.
+
+ const ip::basic_resolver_entry<ip::tcp> entry1;
+ ip::basic_resolver_entry<ip::tcp> entry2(endpoint, host_name, service_name);
+ ip::basic_resolver_entry<ip::tcp> entry3(entry1);
+ ip::basic_resolver_entry<ip::tcp> entry4(std::move(entry2));
+
+ // basic_resolver_entry functions.
+
+ ip::tcp::endpoint e1 = entry1.endpoint();
+ (void)e1;
+
+ ip::tcp::endpoint e2 = entry1;
+ (void)e2;
+
+ std::string s1 = entry1.host_name();
+ (void)s1;
+
+ std::string s2 = entry1.host_name(alloc);
+ (void)s2;
+
+ std::string s3 = entry1.service_name();
+ (void)s3;
+
+ std::string s4 = entry1.service_name(alloc);
+ (void)s4;
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_tcp_resolver_entry_compile
+
+//------------------------------------------------------------------------------
+
+// ip_tcp_iostream_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public types and member functions on the
+// class ip::tcp::iostream compile and link correctly. Runtime failures are
+// ignored.
+
+namespace ip_tcp_iostream_compile {
+
+void test()
+{
+#if !defined(ASIO_NO_IOSTREAM)
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ asio::io_context ioc;
+ asio::ip::tcp::socket sock(ioc);
+
+ // basic_socket_iostream typedefs.
+
+ (void)static_cast<ip::tcp::iostream::protocol_type*>(0);
+ (void)static_cast<ip::tcp::iostream::endpoint_type*>(0);
+ (void)static_cast<ip::tcp::iostream::clock_type*>(0);
+ (void)static_cast<ip::tcp::iostream::time_point*>(0);
+ (void)static_cast<ip::tcp::iostream::duration*>(0);
+ (void)static_cast<ip::tcp::iostream::traits_type*>(0);
+
+ // basic_socket_iostream constructors.
+
+ ip::tcp::iostream ios1;
+
+ ip::tcp::iostream ios2(std::move(sock));
+
+ ip::tcp::iostream ios3("hostname", "service");
+
+ // basic_socket_iostream operators.
+
+ ios1 = ip::tcp::iostream();
+
+ ios2 = std::move(ios1);
+
+ // basic_socket_iostream members.
+
+ ios1.connect("hostname", "service");
+
+ ios1.close();
+
+ (void)static_cast<std::streambuf*>(ios1.rdbuf());
+
+ basic_socket<ip::tcp>& sref = ios1.socket();
+ (void)sref;
+
+ asio::error_code ec = ios1.error();
+ (void)ec;
+
+ ip::tcp::iostream::time_point tp = ios1.expiry();
+ (void)tp;
+
+ ios1.expires_at(tp);
+
+ ip::tcp::iostream::duration d = ip::tcp::iostream::duration();
+ ios1.expires_after(d);
+
+ // iostream operators.
+
+ int i = 0;
+ ios1 >> i;
+ ios1 << i;
+#endif // !defined(ASIO_NO_IOSTREAM)
+}
+
+} // namespace ip_tcp_iostream_compile
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/tcp",
+ ASIO_COMPILE_TEST_CASE(ip_tcp_compile::test)
+ ASIO_TEST_CASE(ip_tcp_runtime::test)
+ ASIO_COMPILE_TEST_CASE(ip_tcp_socket_compile::test)
+ ASIO_TEST_CASE(ip_tcp_socket_runtime::test)
+ ASIO_COMPILE_TEST_CASE(ip_tcp_acceptor_compile::test)
+ ASIO_TEST_CASE(ip_tcp_acceptor_runtime::test)
+ ASIO_COMPILE_TEST_CASE(ip_tcp_resolver_compile::test)
+ ASIO_COMPILE_TEST_CASE(ip_tcp_resolver_entry_compile::test)
+ ASIO_COMPILE_TEST_CASE(ip_tcp_resolver_entry_compile::test)
+ ASIO_COMPILE_TEST_CASE(ip_tcp_iostream_compile::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/udp.cpp b/3rdparty/asio/src/tests/unit/ip/udp.cpp
new file mode 100644
index 00000000000..ae67f9c9c73
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/udp.cpp
@@ -0,0 +1,692 @@
+//
+// udp.cpp
+// ~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/udp.hpp"
+
+#include <cstring>
+#include <functional>
+#include "asio/io_context.hpp"
+#include "../unit_test.hpp"
+#include "../archetypes/async_result.hpp"
+#include "../archetypes/gettable_socket_option.hpp"
+#include "../archetypes/io_control_command.hpp"
+#include "../archetypes/settable_socket_option.hpp"
+
+//------------------------------------------------------------------------------
+
+// ip_udp_socket_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::udp::socket compile and link correctly. Runtime failures are ignored.
+
+namespace ip_udp_socket_compile {
+
+struct connect_handler
+{
+ connect_handler() {}
+ void operator()(const asio::error_code&) {}
+ connect_handler(connect_handler&&) {}
+private:
+ connect_handler(const connect_handler&);
+};
+
+struct wait_handler
+{
+ wait_handler() {}
+ void operator()(const asio::error_code&) {}
+ wait_handler(wait_handler&&) {}
+private:
+ wait_handler(const wait_handler&);
+};
+
+struct send_handler
+{
+ send_handler() {}
+ void operator()(const asio::error_code&, std::size_t) {}
+ send_handler(send_handler&&) {}
+private:
+ send_handler(const send_handler&);
+};
+
+struct receive_handler
+{
+ receive_handler() {}
+ void operator()(const asio::error_code&, std::size_t) {}
+ receive_handler(receive_handler&&) {}
+private:
+ receive_handler(const receive_handler&);
+};
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ io_context ioc;
+ const io_context::executor_type ioc_ex = ioc.get_executor();
+ char mutable_char_buffer[128] = "";
+ const char const_char_buffer[128] = "";
+ socket_base::message_flags in_flags = 0;
+ archetypes::settable_socket_option<void> settable_socket_option1;
+ archetypes::settable_socket_option<int> settable_socket_option2;
+ archetypes::settable_socket_option<double> settable_socket_option3;
+ archetypes::gettable_socket_option<void> gettable_socket_option1;
+ archetypes::gettable_socket_option<int> gettable_socket_option2;
+ archetypes::gettable_socket_option<double> gettable_socket_option3;
+ archetypes::io_control_command io_control_command;
+ archetypes::immediate_handler immediate;
+ archetypes::lazy_handler lazy;
+ asio::error_code ec;
+
+ // basic_datagram_socket constructors.
+
+ ip::udp::socket socket1(ioc);
+ ip::udp::socket socket2(ioc, ip::udp::v4());
+ ip::udp::socket socket3(ioc, ip::udp::v6());
+ ip::udp::socket socket4(ioc, ip::udp::endpoint(ip::udp::v4(), 0));
+ ip::udp::socket socket5(ioc, ip::udp::endpoint(ip::udp::v6(), 0));
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ ip::udp::socket::native_handle_type native_socket1
+ = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ ip::udp::socket socket6(ioc, ip::udp::v4(), native_socket1);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ ip::udp::socket socket7(ioc_ex);
+ ip::udp::socket socket8(ioc_ex, ip::udp::v4());
+ ip::udp::socket socket9(ioc_ex, ip::udp::v6());
+ ip::udp::socket socket10(ioc_ex, ip::udp::endpoint(ip::udp::v4(), 0));
+ ip::udp::socket socket11(ioc_ex, ip::udp::endpoint(ip::udp::v6(), 0));
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ ip::udp::socket::native_handle_type native_socket2
+ = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ ip::udp::socket socket12(ioc_ex, ip::udp::v4(), native_socket2);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ ip::udp::socket socket13(std::move(socket6));
+
+ // basic_datagram_socket operators.
+
+ socket1 = ip::udp::socket(ioc);
+ socket1 = std::move(socket2);
+
+ // basic_io_object functions.
+
+ ip::udp::socket::executor_type ex = socket1.get_executor();
+ (void)ex;
+
+ // basic_socket functions.
+
+ ip::udp::socket::lowest_layer_type& lowest_layer = socket1.lowest_layer();
+ (void)lowest_layer;
+
+ const ip::udp::socket& socket14 = socket1;
+ const ip::udp::socket::lowest_layer_type& lowest_layer2
+ = socket14.lowest_layer();
+ (void)lowest_layer2;
+
+ socket1.open(ip::udp::v4());
+ socket1.open(ip::udp::v6());
+ socket1.open(ip::udp::v4(), ec);
+ socket1.open(ip::udp::v6(), ec);
+
+#if !defined(ASIO_WINDOWS_RUNTIME)
+ ip::udp::socket::native_handle_type native_socket3
+ = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ socket1.assign(ip::udp::v4(), native_socket3);
+ ip::udp::socket::native_handle_type native_socket4
+ = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+ socket1.assign(ip::udp::v4(), native_socket4, ec);
+#endif // !defined(ASIO_WINDOWS_RUNTIME)
+
+ bool is_open = socket1.is_open();
+ (void)is_open;
+
+ socket1.close();
+ socket1.close(ec);
+
+ socket1.release();
+ socket1.release(ec);
+
+ ip::udp::socket::native_handle_type native_socket5
+ = socket1.native_handle();
+ (void)native_socket5;
+
+ socket1.cancel();
+ socket1.cancel(ec);
+
+ bool at_mark1 = socket1.at_mark();
+ (void)at_mark1;
+ bool at_mark2 = socket1.at_mark(ec);
+ (void)at_mark2;
+
+ std::size_t available1 = socket1.available();
+ (void)available1;
+ std::size_t available2 = socket1.available(ec);
+ (void)available2;
+
+ socket1.bind(ip::udp::endpoint(ip::udp::v4(), 0));
+ socket1.bind(ip::udp::endpoint(ip::udp::v6(), 0));
+ socket1.bind(ip::udp::endpoint(ip::udp::v4(), 0), ec);
+ socket1.bind(ip::udp::endpoint(ip::udp::v6(), 0), ec);
+
+ socket1.connect(ip::udp::endpoint(ip::udp::v4(), 0));
+ socket1.connect(ip::udp::endpoint(ip::udp::v6(), 0));
+ socket1.connect(ip::udp::endpoint(ip::udp::v4(), 0), ec);
+ socket1.connect(ip::udp::endpoint(ip::udp::v6(), 0), ec);
+
+ socket1.async_connect(ip::udp::endpoint(ip::udp::v4(), 0),
+ connect_handler());
+ socket1.async_connect(ip::udp::endpoint(ip::udp::v6(), 0),
+ connect_handler());
+ socket1.async_connect(ip::udp::endpoint(ip::udp::v4(), 0), immediate);
+ socket1.async_connect(ip::udp::endpoint(ip::udp::v6(), 0), immediate);
+ int i1 = socket1.async_connect(ip::udp::endpoint(ip::udp::v4(), 0), lazy);
+ (void)i1;
+ int i2 = socket1.async_connect(ip::udp::endpoint(ip::udp::v6(), 0), lazy);
+ (void)i2;
+
+ socket1.set_option(settable_socket_option1);
+ socket1.set_option(settable_socket_option1, ec);
+ socket1.set_option(settable_socket_option2);
+ socket1.set_option(settable_socket_option2, ec);
+ socket1.set_option(settable_socket_option3);
+ socket1.set_option(settable_socket_option3, ec);
+
+ socket1.get_option(gettable_socket_option1);
+ socket1.get_option(gettable_socket_option1, ec);
+ socket1.get_option(gettable_socket_option2);
+ socket1.get_option(gettable_socket_option2, ec);
+ socket1.get_option(gettable_socket_option3);
+ socket1.get_option(gettable_socket_option3, ec);
+
+ socket1.io_control(io_control_command);
+ socket1.io_control(io_control_command, ec);
+
+ bool non_blocking1 = socket1.non_blocking();
+ (void)non_blocking1;
+ socket1.non_blocking(true);
+ socket1.non_blocking(false, ec);
+
+ bool non_blocking2 = socket1.native_non_blocking();
+ (void)non_blocking2;
+ socket1.native_non_blocking(true);
+ socket1.native_non_blocking(false, ec);
+
+ ip::udp::endpoint endpoint1 = socket1.local_endpoint();
+ (void)endpoint1;
+ ip::udp::endpoint endpoint2 = socket1.local_endpoint(ec);
+ (void)endpoint2;
+
+ ip::udp::endpoint endpoint3 = socket1.remote_endpoint();
+ (void)endpoint3;
+ ip::udp::endpoint endpoint4 = socket1.remote_endpoint(ec);
+ (void)endpoint4;
+
+ socket1.shutdown(socket_base::shutdown_both);
+ socket1.shutdown(socket_base::shutdown_both, ec);
+
+ socket1.wait(socket_base::wait_read);
+ socket1.wait(socket_base::wait_write, ec);
+
+ socket1.async_wait(socket_base::wait_read, wait_handler());
+ socket1.async_wait(socket_base::wait_read, immediate);
+ int i3 = socket1.async_wait(socket_base::wait_write, lazy);
+ (void)i3;
+
+ // basic_datagram_socket functions.
+
+ socket1.send(buffer(mutable_char_buffer));
+ socket1.send(buffer(const_char_buffer));
+ socket1.send(null_buffers());
+ socket1.send(buffer(mutable_char_buffer), in_flags);
+ socket1.send(buffer(const_char_buffer), in_flags);
+ socket1.send(null_buffers(), in_flags);
+ socket1.send(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.send(buffer(const_char_buffer), in_flags, ec);
+ socket1.send(null_buffers(), in_flags, ec);
+
+ socket1.async_send(buffer(mutable_char_buffer), send_handler());
+ socket1.async_send(buffer(const_char_buffer), send_handler());
+ socket1.async_send(null_buffers(), send_handler());
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, send_handler());
+ socket1.async_send(buffer(const_char_buffer), in_flags, send_handler());
+ socket1.async_send(null_buffers(), in_flags, send_handler());
+ socket1.async_send(buffer(mutable_char_buffer), immediate);
+ socket1.async_send(buffer(const_char_buffer), immediate);
+ socket1.async_send(null_buffers(), immediate);
+ socket1.async_send(buffer(mutable_char_buffer), in_flags, immediate);
+ socket1.async_send(buffer(const_char_buffer), in_flags, immediate);
+ socket1.async_send(null_buffers(), in_flags, immediate);
+ int i4 = socket1.async_send(buffer(mutable_char_buffer), lazy);
+ (void)i4;
+ int i5 = socket1.async_send(buffer(const_char_buffer), lazy);
+ (void)i5;
+ int i6 = socket1.async_send(null_buffers(), lazy);
+ (void)i6;
+ int i7 = socket1.async_send(buffer(mutable_char_buffer), in_flags, lazy);
+ (void)i7;
+ int i8 = socket1.async_send(buffer(const_char_buffer), in_flags, lazy);
+ (void)i8;
+ int i9 = socket1.async_send(null_buffers(), in_flags, lazy);
+ (void)i9;
+
+ socket1.send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0));
+ socket1.send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0));
+ socket1.send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0));
+ socket1.send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0));
+ socket1.send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0));
+ socket1.send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0));
+ socket1.send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags);
+ socket1.send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags);
+ socket1.send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags);
+ socket1.send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags);
+ socket1.send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags);
+ socket1.send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags);
+ socket1.send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, ec);
+ socket1.send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, ec);
+ socket1.send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, ec);
+ socket1.send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, ec);
+ socket1.send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, ec);
+ socket1.send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, ec);
+
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), send_handler());
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), send_handler());
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), send_handler());
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), send_handler());
+ socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0), send_handler());
+ socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0), send_handler());
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, send_handler());
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, send_handler());
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, send_handler());
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, send_handler());
+ socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, send_handler());
+ socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, send_handler());
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), immediate);
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), immediate);
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), immediate);
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), immediate);
+ socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0), immediate);
+ socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0), immediate);
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, immediate);
+ socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, immediate);
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, immediate);
+ socket1.async_send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, immediate);
+ socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, immediate);
+ socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, immediate);
+ int i10 = socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), lazy);
+ (void)i10;
+ int i11 = socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), lazy);
+ (void)i11;
+ int i12 = socket1.async_send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), lazy);
+ (void)i12;
+ int i13 = socket1.async_send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), lazy);
+ (void)i13;
+ int i14 = socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0), lazy);
+ (void)i14;
+ int i15 = socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0), lazy);
+ (void)i15;
+ int i16 = socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, lazy);
+ (void)i16;
+ int i17 = socket1.async_send_to(buffer(mutable_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, lazy);
+ (void)i17;
+ int i18 = socket1.async_send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, lazy);
+ (void)i18;
+ int i19 = socket1.async_send_to(buffer(const_char_buffer),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, lazy);
+ (void)i19;
+ int i20 = socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v4(), 0), in_flags, lazy);
+ (void)i20;
+ int i21 = socket1.async_send_to(null_buffers(),
+ ip::udp::endpoint(ip::udp::v6(), 0), in_flags, lazy);
+ (void)i21;
+
+ socket1.receive(buffer(mutable_char_buffer));
+ socket1.receive(null_buffers());
+ socket1.receive(buffer(mutable_char_buffer), in_flags);
+ socket1.receive(null_buffers(), in_flags);
+ socket1.receive(buffer(mutable_char_buffer), in_flags, ec);
+ socket1.receive(null_buffers(), in_flags, ec);
+
+ socket1.async_receive(buffer(mutable_char_buffer), receive_handler());
+ socket1.async_receive(null_buffers(), receive_handler());
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags,
+ receive_handler());
+ socket1.async_receive(null_buffers(), in_flags, receive_handler());
+ socket1.async_receive(buffer(mutable_char_buffer), immediate);
+ socket1.async_receive(null_buffers(), immediate);
+ socket1.async_receive(buffer(mutable_char_buffer), in_flags, immediate);
+ socket1.async_receive(null_buffers(), in_flags, immediate);
+ int i22 = socket1.async_receive(buffer(mutable_char_buffer), lazy);
+ (void)i22;
+ int i23 = socket1.async_receive(null_buffers(), lazy);
+ (void)i23;
+ int i24 = socket1.async_receive(buffer(mutable_char_buffer),
+ in_flags, lazy);
+ (void)i24;
+ int i25 = socket1.async_receive(null_buffers(), in_flags, lazy);
+ (void)i25;
+
+ ip::udp::endpoint endpoint;
+ socket1.receive_from(buffer(mutable_char_buffer), endpoint);
+ socket1.receive_from(null_buffers(), endpoint);
+ socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags);
+ socket1.receive_from(null_buffers(), endpoint, in_flags);
+ socket1.receive_from(buffer(mutable_char_buffer), endpoint, in_flags, ec);
+ socket1.receive_from(null_buffers(), endpoint, in_flags, ec);
+
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, receive_handler());
+ socket1.async_receive_from(null_buffers(),
+ endpoint, receive_handler());
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, in_flags, receive_handler());
+ socket1.async_receive_from(null_buffers(),
+ endpoint, in_flags, receive_handler());
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, immediate);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, immediate);
+ socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, in_flags, immediate);
+ socket1.async_receive_from(null_buffers(),
+ endpoint, in_flags, immediate);
+ int i26 = socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, lazy);
+ (void)i26;
+ int i27 = socket1.async_receive_from(null_buffers(),
+ endpoint, lazy);
+ (void)i27;
+ int i28 = socket1.async_receive_from(buffer(mutable_char_buffer),
+ endpoint, in_flags, lazy);
+ (void)i28;
+ int i29 = socket1.async_receive_from(null_buffers(),
+ endpoint, in_flags, lazy);
+ (void)i29;
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_udp_socket_compile
+
+//------------------------------------------------------------------------------
+
+// ip_udp_socket_runtime test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks the runtime operation of the ip::udp::socket class.
+
+namespace ip_udp_socket_runtime {
+
+void handle_send(size_t expected_bytes_sent,
+ const asio::error_code& err, size_t bytes_sent)
+{
+ ASIO_CHECK(!err);
+ ASIO_CHECK(expected_bytes_sent == bytes_sent);
+}
+
+void handle_recv(size_t expected_bytes_recvd,
+ const asio::error_code& err, size_t bytes_recvd)
+{
+ ASIO_CHECK(!err);
+ ASIO_CHECK(expected_bytes_recvd == bytes_recvd);
+}
+
+void test()
+{
+ using namespace std; // For memcmp and memset.
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ namespace bindns = std;
+ using bindns::placeholders::_1;
+ using bindns::placeholders::_2;
+
+ io_context ioc;
+
+ ip::udp::socket s1(ioc, ip::udp::endpoint(ip::udp::v4(), 0));
+ ip::udp::endpoint target_endpoint = s1.local_endpoint();
+ target_endpoint.address(ip::address_v4::loopback());
+
+ ip::udp::socket s2(ioc);
+ s2.open(ip::udp::v4());
+ s2.bind(ip::udp::endpoint(ip::udp::v4(), 0));
+ char send_msg[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ s2.send_to(buffer(send_msg, sizeof(send_msg)), target_endpoint);
+
+ char recv_msg[sizeof(send_msg)];
+ ip::udp::endpoint sender_endpoint;
+ size_t bytes_recvd = s1.receive_from(buffer(recv_msg, sizeof(recv_msg)),
+ sender_endpoint);
+
+ ASIO_CHECK(bytes_recvd == sizeof(send_msg));
+ ASIO_CHECK(memcmp(send_msg, recv_msg, sizeof(send_msg)) == 0);
+
+ memset(recv_msg, 0, sizeof(recv_msg));
+
+ target_endpoint = sender_endpoint;
+ s1.async_send_to(buffer(send_msg, sizeof(send_msg)), target_endpoint,
+ bindns::bind(handle_send, sizeof(send_msg), _1, _2));
+ s2.async_receive_from(buffer(recv_msg, sizeof(recv_msg)), sender_endpoint,
+ bindns::bind(handle_recv, sizeof(recv_msg), _1, _2));
+
+ ioc.run();
+
+ ASIO_CHECK(memcmp(send_msg, recv_msg, sizeof(send_msg)) == 0);
+}
+
+} // namespace ip_udp_socket_runtime
+
+//------------------------------------------------------------------------------
+
+// ip_udp_resolver_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// ip::udp::resolver compile and link correctly. Runtime failures are ignored.
+
+namespace ip_udp_resolver_compile {
+
+struct resolve_handler
+{
+ resolve_handler() {}
+ void operator()(const asio::error_code&,
+ asio::ip::udp::resolver::results_type) {}
+ resolve_handler(resolve_handler&&) {}
+private:
+ resolve_handler(const resolve_handler&);
+};
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ io_context ioc;
+ const io_context::executor_type ioc_ex = ioc.get_executor();
+ archetypes::lazy_handler lazy;
+ asio::error_code ec;
+#if !defined(ASIO_NO_DEPRECATED)
+ ip::udp::resolver::query q(ip::udp::v4(), "localhost", "0");
+#endif // !defined(ASIO_NO_DEPRECATED)
+ ip::udp::endpoint e(ip::address_v4::loopback(), 0);
+
+ // basic_resolver constructors.
+
+ ip::udp::resolver resolver(ioc);
+ ip::udp::resolver resolver2(ioc_ex);
+
+ ip::udp::resolver resolver3(std::move(resolver));
+
+ // basic_resolver operators.
+
+ resolver = ip::udp::resolver(ioc);
+ resolver = std::move(resolver3);
+
+ // basic_io_object functions.
+
+ ip::udp::resolver::executor_type ex = resolver.get_executor();
+ (void)ex;
+
+ // basic_resolver functions.
+
+ resolver.cancel();
+
+#if !defined(ASIO_NO_DEPRECATED)
+ ip::udp::resolver::results_type results1 = resolver.resolve(q);
+ (void)results1;
+
+ ip::udp::resolver::results_type results2 = resolver.resolve(q, ec);
+ (void)results2;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ ip::udp::resolver::results_type results3 = resolver.resolve("", "");
+ (void)results3;
+
+ ip::udp::resolver::results_type results4 = resolver.resolve("", "", ec);
+ (void)results4;
+
+ ip::udp::resolver::results_type results5 =
+ resolver.resolve("", "", ip::udp::resolver::flags());
+ (void)results5;
+
+ ip::udp::resolver::results_type results6 =
+ resolver.resolve("", "", ip::udp::resolver::flags(), ec);
+ (void)results6;
+
+ ip::udp::resolver::results_type results7 =
+ resolver.resolve(ip::udp::v4(), "", "");
+ (void)results7;
+
+ ip::udp::resolver::results_type results8 =
+ resolver.resolve(ip::udp::v4(), "", "", ec);
+ (void)results8;
+
+ ip::udp::resolver::results_type results9 =
+ resolver.resolve(ip::udp::v4(), "", "", ip::udp::resolver::flags());
+ (void)results9;
+
+ ip::udp::resolver::results_type results10 =
+ resolver.resolve(ip::udp::v4(), "", "", ip::udp::resolver::flags(), ec);
+ (void)results10;
+
+ ip::udp::resolver::results_type results11 = resolver.resolve(e);
+ (void)results11;
+
+ ip::udp::resolver::results_type results12 = resolver.resolve(e, ec);
+ (void)results12;
+
+#if !defined(ASIO_NO_DEPRECATED)
+ resolver.async_resolve(q, resolve_handler());
+ int i1 = resolver.async_resolve(q, lazy);
+ (void)i1;
+#endif // !defined(ASIO_NO_DEPRECATED)
+
+ resolver.async_resolve("", "", resolve_handler());
+ int i2 = resolver.async_resolve("", "", lazy);
+ (void)i2;
+
+ resolver.async_resolve("", "",
+ ip::udp::resolver::flags(), resolve_handler());
+ int i3 = resolver.async_resolve("", "",
+ ip::udp::resolver::flags(), lazy);
+ (void)i3;
+
+ resolver.async_resolve(ip::udp::v4(), "", "", resolve_handler());
+ int i4 = resolver.async_resolve(ip::udp::v4(), "", "", lazy);
+ (void)i4;
+
+ resolver.async_resolve(ip::udp::v4(),
+ "", "", ip::udp::resolver::flags(), resolve_handler());
+ int i5 = resolver.async_resolve(ip::udp::v4(),
+ "", "", ip::udp::resolver::flags(), lazy);
+ (void)i5;
+
+ resolver.async_resolve(e, resolve_handler());
+ int i6 = resolver.async_resolve(e, lazy);
+ (void)i6;
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_udp_resolver_compile
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/udp",
+ ASIO_COMPILE_TEST_CASE(ip_udp_socket_compile::test)
+ ASIO_TEST_CASE(ip_udp_socket_runtime::test)
+ ASIO_COMPILE_TEST_CASE(ip_udp_resolver_compile::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/unicast.cpp b/3rdparty/asio/src/tests/unit/ip/unicast.cpp
new file mode 100644
index 00000000000..db3497f6e1c
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/unicast.cpp
@@ -0,0 +1,171 @@
+//
+// unicast.cpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/unicast.hpp"
+
+#include "asio/io_context.hpp"
+#include "asio/ip/udp.hpp"
+#include "../unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+// ip_unicast_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all nested classes, enums and constants in
+// ip::unicast compile and link correctly. Runtime failures are ignored.
+
+namespace ip_unicast_compile {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ io_context ioc;
+ ip::udp::socket sock(ioc);
+
+ // hops class.
+
+ ip::unicast::hops hops1(1024);
+ sock.set_option(hops1);
+ ip::unicast::hops hops2;
+ sock.get_option(hops2);
+ hops1 = 1;
+ (void)static_cast<int>(hops1.value());
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_unicast_compile
+
+//------------------------------------------------------------------------------
+
+// ip_unicast_runtime test
+// ~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks the runtime operation of the socket options defined
+// in the ip::unicast namespace.
+
+namespace ip_unicast_runtime {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ io_context ioc;
+ asio::error_code ec;
+
+ ip::udp::endpoint ep_v4(ip::address_v4::loopback(), 0);
+ ip::udp::socket sock_v4(ioc);
+ sock_v4.open(ep_v4.protocol(), ec);
+ sock_v4.bind(ep_v4, ec);
+ bool have_v4 = !ec;
+
+ ip::udp::endpoint ep_v6(ip::address_v6::loopback(), 0);
+ ip::udp::socket sock_v6(ioc);
+ sock_v6.open(ep_v6.protocol(), ec);
+ sock_v6.bind(ep_v6, ec);
+ bool have_v6 = !ec;
+
+ ASIO_CHECK(have_v4 || have_v6);
+
+ // hops class.
+
+ if (have_v4)
+ {
+ ip::unicast::hops hops1(1);
+ ASIO_CHECK(hops1.value() == 1);
+ sock_v4.set_option(hops1, ec);
+#if defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ // Option is not supported under Windows CE.
+ ASIO_CHECK_MESSAGE(ec == asio::error::no_protocol_option,
+ ec.value() << ", " << ec.message());
+#else // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ ASIO_CHECK(!ec);
+#endif // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+
+ ip::unicast::hops hops2;
+ sock_v4.get_option(hops2, ec);
+#if defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ // Option is not supported under Windows CE.
+ ASIO_CHECK_MESSAGE(ec == asio::error::no_protocol_option,
+ ec.value() << ", " << ec.message());
+#else // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(hops2.value() == 1);
+#endif // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+
+ ip::unicast::hops hops3(255);
+ ASIO_CHECK(hops3.value() == 255);
+ sock_v4.set_option(hops3, ec);
+#if defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ // Option is not supported under Windows CE.
+ ASIO_CHECK_MESSAGE(ec == asio::error::no_protocol_option,
+ ec.value() << ", " << ec.message());
+#else // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ ASIO_CHECK(!ec);
+#endif // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+
+ ip::unicast::hops hops4;
+ sock_v4.get_option(hops4, ec);
+#if defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ // Option is not supported under Windows CE.
+ ASIO_CHECK_MESSAGE(ec == asio::error::no_protocol_option,
+ ec.value() << ", " << ec.message());
+#else // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(hops4.value() == 255);
+#endif // defined(ASIO_WINDOWS) && defined(UNDER_CE)
+ }
+
+ if (have_v6)
+ {
+ ip::unicast::hops hops1(1);
+ ASIO_CHECK(hops1.value() == 1);
+ sock_v6.set_option(hops1, ec);
+ ASIO_CHECK(!ec);
+
+ ip::unicast::hops hops2;
+ sock_v6.get_option(hops2, ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(hops2.value() == 1);
+
+ ip::unicast::hops hops3(255);
+ ASIO_CHECK(hops3.value() == 255);
+ sock_v6.set_option(hops3, ec);
+ ASIO_CHECK(!ec);
+
+ ip::unicast::hops hops4;
+ sock_v6.get_option(hops4, ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(hops4.value() == 255);
+ }
+}
+
+} // namespace ip_unicast_runtime
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/unicast",
+ ASIO_COMPILE_TEST_CASE(ip_unicast_compile::test)
+ ASIO_TEST_CASE(ip_unicast_runtime::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/ip/v6_only.cpp b/3rdparty/asio/src/tests/unit/ip/v6_only.cpp
new file mode 100644
index 00000000000..ba37fdb3954
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/ip/v6_only.cpp
@@ -0,0 +1,135 @@
+//
+// v6_only.cpp
+// ~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/ip/v6_only.hpp"
+
+#include "asio/io_context.hpp"
+#include "asio/ip/tcp.hpp"
+#include "asio/ip/udp.hpp"
+#include "../unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+// ip_v6_only_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that the ip::v6_only socket option compiles and
+// link correctly. Runtime failures are ignored.
+
+namespace ip_v6_only_compile {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ try
+ {
+ io_context ioc;
+ ip::udp::socket sock(ioc);
+
+ // v6_only class.
+
+ ip::v6_only v6_only1(true);
+ sock.set_option(v6_only1);
+ ip::v6_only v6_only2;
+ sock.get_option(v6_only2);
+ v6_only1 = true;
+ (void)static_cast<bool>(v6_only1);
+ (void)static_cast<bool>(!v6_only1);
+ (void)static_cast<bool>(v6_only1.value());
+ }
+ catch (std::exception&)
+ {
+ }
+}
+
+} // namespace ip_v6_only_compile
+
+//------------------------------------------------------------------------------
+
+// ip_v6_only_runtime test
+// ~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks the runtime operation of the ip::v6_only socket
+// option.
+
+namespace ip_v6_only_runtime {
+
+void test()
+{
+ using namespace asio;
+ namespace ip = asio::ip;
+
+ io_context ioc;
+ asio::error_code ec;
+
+ ip::tcp::endpoint ep_v6(ip::address_v6::loopback(), 0);
+ ip::tcp::acceptor acceptor_v6(ioc);
+ acceptor_v6.open(ep_v6.protocol(), ec);
+ acceptor_v6.bind(ep_v6, ec);
+ bool have_v6 = !ec;
+ acceptor_v6.close(ec);
+ acceptor_v6.open(ep_v6.protocol(), ec);
+
+ if (have_v6)
+ {
+ ip::v6_only v6_only1;
+ acceptor_v6.get_option(v6_only1, ec);
+ ASIO_CHECK(!ec);
+ bool have_dual_stack = !v6_only1.value();
+
+ if (have_dual_stack)
+ {
+ ip::v6_only v6_only2(false);
+ ASIO_CHECK(!v6_only2.value());
+ ASIO_CHECK(!static_cast<bool>(v6_only2));
+ ASIO_CHECK(!v6_only2);
+ acceptor_v6.set_option(v6_only2, ec);
+ ASIO_CHECK(!ec);
+
+ ip::v6_only v6_only3;
+ acceptor_v6.get_option(v6_only3, ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(!v6_only3.value());
+ ASIO_CHECK(!static_cast<bool>(v6_only3));
+ ASIO_CHECK(!v6_only3);
+
+ ip::v6_only v6_only4(true);
+ ASIO_CHECK(v6_only4.value());
+ ASIO_CHECK(static_cast<bool>(v6_only4));
+ ASIO_CHECK(!!v6_only4);
+ acceptor_v6.set_option(v6_only4, ec);
+ ASIO_CHECK(!ec);
+
+ ip::v6_only v6_only5;
+ acceptor_v6.get_option(v6_only5, ec);
+ ASIO_CHECK(!ec);
+ ASIO_CHECK(v6_only5.value());
+ ASIO_CHECK(static_cast<bool>(v6_only5));
+ ASIO_CHECK(!!v6_only5);
+ }
+ }
+}
+
+} // namespace ip_v6_only_runtime
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "ip/v6_only",
+ ASIO_COMPILE_TEST_CASE(ip_v6_only_compile::test)
+ ASIO_TEST_CASE(ip_v6_only_runtime::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/is_read_buffered.cpp b/3rdparty/asio/src/tests/unit/is_read_buffered.cpp
new file mode 100644
index 00000000000..031cd0fb34d
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/is_read_buffered.cpp
@@ -0,0 +1,129 @@
+//
+// is_read_buffered.cpp
+// ~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/is_read_buffered.hpp"
+
+#include "asio/buffered_read_stream.hpp"
+#include "asio/buffered_write_stream.hpp"
+#include "asio/io_context.hpp"
+#include "asio/ip/tcp.hpp"
+#include "unit_test.hpp"
+
+using namespace std; // For memcmp, memcpy and memset.
+
+class test_stream
+{
+public:
+ typedef asio::io_context io_context_type;
+
+ typedef test_stream lowest_layer_type;
+
+ typedef io_context_type::executor_type executor_type;
+
+ test_stream(asio::io_context& io_context)
+ : io_context_(io_context)
+ {
+ }
+
+ io_context_type& io_context()
+ {
+ return io_context_;
+ }
+
+ lowest_layer_type& lowest_layer()
+ {
+ return *this;
+ }
+
+ template <typename Const_Buffers>
+ size_t write(const Const_Buffers&)
+ {
+ return 0;
+ }
+
+ template <typename Const_Buffers>
+ size_t write(const Const_Buffers&, asio::error_code& ec)
+ {
+ ec = asio::error_code();
+ return 0;
+ }
+
+ template <typename Const_Buffers, typename Handler>
+ void async_write(const Const_Buffers&, Handler handler)
+ {
+ asio::error_code error;
+ asio::post(io_context_,
+ asio::detail::bind_handler(handler, error, 0));
+ }
+
+ template <typename Mutable_Buffers>
+ size_t read(const Mutable_Buffers&)
+ {
+ return 0;
+ }
+
+ template <typename Mutable_Buffers>
+ size_t read(const Mutable_Buffers&, asio::error_code& ec)
+ {
+ ec = asio::error_code();
+ return 0;
+ }
+
+ template <typename Mutable_Buffers, typename Handler>
+ void async_read(const Mutable_Buffers&, Handler handler)
+ {
+ asio::error_code error;
+ asio::post(io_context_,
+ asio::detail::bind_handler(handler, error, 0));
+ }
+
+private:
+ io_context_type& io_context_;
+};
+
+void is_read_buffered_test()
+{
+ ASIO_CHECK(!asio::is_read_buffered<
+ asio::ip::tcp::socket>::value);
+
+ ASIO_CHECK(!!asio::is_read_buffered<
+ asio::buffered_read_stream<
+ asio::ip::tcp::socket> >::value);
+
+ ASIO_CHECK(!asio::is_read_buffered<
+ asio::buffered_write_stream<
+ asio::ip::tcp::socket> >::value);
+
+ ASIO_CHECK(!!asio::is_read_buffered<
+ asio::buffered_stream<asio::ip::tcp::socket> >::value);
+
+ ASIO_CHECK(!asio::is_read_buffered<test_stream>::value);
+
+ ASIO_CHECK(!!asio::is_read_buffered<
+ asio::buffered_read_stream<test_stream> >::value);
+
+ ASIO_CHECK(!asio::is_read_buffered<
+ asio::buffered_write_stream<test_stream> >::value);
+
+ ASIO_CHECK(!!asio::is_read_buffered<
+ asio::buffered_stream<test_stream> >::value);
+}
+
+ASIO_TEST_SUITE
+(
+ "is_read_buffered",
+ ASIO_TEST_CASE(is_read_buffered_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/is_write_buffered.cpp b/3rdparty/asio/src/tests/unit/is_write_buffered.cpp
new file mode 100644
index 00000000000..df7a9c86d79
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/is_write_buffered.cpp
@@ -0,0 +1,129 @@
+//
+// is_write_buffered.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/is_write_buffered.hpp"
+
+#include "asio/buffered_read_stream.hpp"
+#include "asio/buffered_write_stream.hpp"
+#include "asio/io_context.hpp"
+#include "asio/ip/tcp.hpp"
+#include "unit_test.hpp"
+
+using namespace std; // For memcmp, memcpy and memset.
+
+class test_stream
+{
+public:
+ typedef asio::io_context io_context_type;
+
+ typedef test_stream lowest_layer_type;
+
+ typedef io_context_type::executor_type executor_type;
+
+ test_stream(asio::io_context& io_context)
+ : io_context_(io_context)
+ {
+ }
+
+ io_context_type& io_context()
+ {
+ return io_context_;
+ }
+
+ lowest_layer_type& lowest_layer()
+ {
+ return *this;
+ }
+
+ template <typename Const_Buffers>
+ size_t write(const Const_Buffers&)
+ {
+ return 0;
+ }
+
+ template <typename Const_Buffers>
+ size_t write(const Const_Buffers&, asio::error_code& ec)
+ {
+ ec = asio::error_code();
+ return 0;
+ }
+
+ template <typename Const_Buffers, typename Handler>
+ void async_write(const Const_Buffers&, Handler handler)
+ {
+ asio::error_code error;
+ asio::post(io_context_,
+ asio::detail::bind_handler(handler, error, 0));
+ }
+
+ template <typename Mutable_Buffers>
+ size_t read(const Mutable_Buffers&)
+ {
+ return 0;
+ }
+
+ template <typename Mutable_Buffers>
+ size_t read(const Mutable_Buffers&, asio::error_code& ec)
+ {
+ ec = asio::error_code();
+ return 0;
+ }
+
+ template <typename Mutable_Buffers, typename Handler>
+ void async_read(const Mutable_Buffers&, Handler handler)
+ {
+ asio::error_code error;
+ asio::post(io_context_,
+ asio::detail::bind_handler(handler, error, 0));
+ }
+
+private:
+ io_context_type& io_context_;
+};
+
+void is_write_buffered_test()
+{
+ ASIO_CHECK(!asio::is_write_buffered<
+ asio::ip::tcp::socket>::value);
+
+ ASIO_CHECK(!asio::is_write_buffered<
+ asio::buffered_read_stream<
+ asio::ip::tcp::socket> >::value);
+
+ ASIO_CHECK(!!asio::is_write_buffered<
+ asio::buffered_write_stream<
+ asio::ip::tcp::socket> >::value);
+
+ ASIO_CHECK(!!asio::is_write_buffered<
+ asio::buffered_stream<asio::ip::tcp::socket> >::value);
+
+ ASIO_CHECK(!asio::is_write_buffered<test_stream>::value);
+
+ ASIO_CHECK(!asio::is_write_buffered<
+ asio::buffered_read_stream<test_stream> >::value);
+
+ ASIO_CHECK(!!asio::is_write_buffered<
+ asio::buffered_write_stream<test_stream> >::value);
+
+ ASIO_CHECK(!!asio::is_write_buffered<
+ asio::buffered_stream<test_stream> >::value);
+}
+
+ASIO_TEST_SUITE
+(
+ "is_write_buffered",
+ ASIO_TEST_CASE(is_write_buffered_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/local/basic_endpoint.cpp b/3rdparty/asio/src/tests/unit/local/basic_endpoint.cpp
new file mode 100644
index 00000000000..855888e52c9
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/local/basic_endpoint.cpp
@@ -0,0 +1,25 @@
+//
+// basic_endpoint.cpp
+// ~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/local/basic_endpoint.hpp"
+
+#include "../unit_test.hpp"
+
+ASIO_TEST_SUITE
+(
+ "local/basic_endpoint",
+ ASIO_TEST_CASE(null_test)
+)
diff --git a/3rdparty/asio/src/tests/unit/local/connect_pair.cpp b/3rdparty/asio/src/tests/unit/local/connect_pair.cpp
new file mode 100644
index 00000000000..095a0d89696
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/local/connect_pair.cpp
@@ -0,0 +1,76 @@
+//
+// connect_pair.cpp
+// ~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/local/connect_pair.hpp"
+
+#include "asio/io_context.hpp"
+#include "asio/local/datagram_protocol.hpp"
+#include "asio/local/stream_protocol.hpp"
+#include "../unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+// local_connect_pair_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all host_name functions compile and link
+// correctly. Runtime failures are ignored.
+
+namespace local_connect_pair_compile {
+
+void test()
+{
+#if defined(ASIO_HAS_LOCAL_SOCKETS)
+ using namespace asio;
+ namespace local = asio::local;
+ typedef local::datagram_protocol dp;
+ typedef local::stream_protocol sp;
+
+ try
+ {
+ asio::io_context io_context;
+ asio::error_code ec1;
+
+ dp::socket s1(io_context);
+ dp::socket s2(io_context);
+ local::connect_pair(s1, s2);
+
+ dp::socket s3(io_context);
+ dp::socket s4(io_context);
+ local::connect_pair(s3, s4, ec1);
+
+ sp::socket s5(io_context);
+ sp::socket s6(io_context);
+ local::connect_pair(s5, s6);
+
+ sp::socket s7(io_context);
+ sp::socket s8(io_context);
+ local::connect_pair(s7, s8, ec1);
+ }
+ catch (std::exception&)
+ {
+ }
+#endif // defined(ASIO_HAS_LOCAL_SOCKETS)
+}
+
+} // namespace local_connect_pair_compile
+
+//------------------------------------------------------------------------------
+
+ASIO_TEST_SUITE
+(
+ "local/connect_pair",
+ ASIO_COMPILE_TEST_CASE(local_connect_pair_compile::test)
+)
diff --git a/3rdparty/asio/src/tests/unit/local/datagram_protocol.cpp b/3rdparty/asio/src/tests/unit/local/datagram_protocol.cpp
new file mode 100644
index 00000000000..23f677d6723
--- /dev/null
+++ b/3rdparty/asio/src/tests/unit/local/datagram_protocol.cpp
@@ -0,0 +1,242 @@
+//
+// datagram_protocol.cpp
+// ~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+// Disable autolinking for unit tests.
+#if !defined(BOOST_ALL_NO_LIB)
+#define BOOST_ALL_NO_LIB 1
+#endif // !defined(BOOST_ALL_NO_LIB)
+
+// Test that header file is self-contained.
+#include "asio/local/datagram_protocol.hpp"
+
+#include <cstring>
+#include "asio/io_context.hpp"
+#include "../unit_test.hpp"
+
+//------------------------------------------------------------------------------
+
+// local_datagram_protocol_socket_compile test
+// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// The following test checks that all public member functions on the class
+// local::datagram_socket::socket compile and link correctly. Runtime failures
+// are ignored.
+
+namespace local_datagram_protocol_socket_compile {
+